00001 #include <citrus/config.h>
00002
00003 #include <citrus/UnitExpr.H>
00004 #include <citrus/UnitInfo.H>
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 UnitExpr::UnitExpr( const UnitExpr& src )
00015 {
00016 #ifdef DBG_UECOPY
00017 fprintf( stderr, "--Copying [" ) ; src.print( stderr ) ; fprintf( stderr, "]\n" ) ;
00018 #endif // DBG_UECOPY
00019
00020 p_copy( src ) ;
00021
00022 #ifdef DBG_UECOPY
00023 fprintf( stderr, " =[" ) ; print(stderr) ; fprintf( stderr, "]\n" ) ;
00024 #endif // DBG_UECOPY
00025 }
00026
00027 UnitExpr::UnitExpr( UnitUnitInfo* u, UnitExpr* lf, UnitExpr* rt )
00028 {
00029 m_lf = lf ;
00030 m_rt = rt ;
00031 m_i = u ;
00032 }
00033
00034 UnitExpr::UnitExpr( UnitOperInfo* o, UnitExpr* lf, UnitExpr* rt )
00035 {
00036 m_lf = lf ;
00037 m_rt = rt ;
00038 m_i = o ;
00039 }
00040
00041 UnitExpr::~UnitExpr()
00042 {
00043
00044 if ( m_lf )
00045 delete m_lf ;
00046
00047 #ifdef DBG_UEDESTRUCT
00048 fprintf( stderr, "(kill 0x%x", this ) ; m_i->print(stderr) ; fprintf( stderr, ")" ) ;
00049 fflush(stderr) ;
00050 #endif // DBG_UEDESTRUCT
00051
00052 delete m_i ;
00053
00054 if ( m_rt )
00055 delete m_rt ;
00056 }
00057
00058 UnitExpr& UnitExpr::operator = ( const UnitExpr& ue )
00059 {
00060 if ( &ue == this )
00061 return *this ;
00062
00063 #ifdef DBG_UECOPY
00064 fprintf( stderr, "Copying [" ) ; ue.print( stderr ) ; fprintf( stderr, "]\n" ) ;
00065 #endif // DBG_UECOPY
00066
00067 if ( m_i )
00068 delete m_i ;
00069 if ( m_lf )
00070 delete m_lf ;
00071 if ( m_rt )
00072 delete m_rt ;
00073
00074 p_copy( ue ) ;
00075
00076 #ifdef DBG_UECOPY
00077 fprintf( stderr, " =[" ) ; print(stderr) ; fprintf( stderr, "]\n" ) ;
00078 #endif // DBG_UECOPY
00079
00080 return *this ;
00081 }
00082
00083 void UnitExpr::p_copy( const UnitExpr& src )
00084 {
00085 if ( src.m_i )
00086 m_i = src.m_i->copy() ;
00087
00088 if ( src.m_lf )
00089 m_lf = new UnitExpr( *src.m_lf ) ;
00090 else
00091 m_lf = 0 ;
00092
00093 if ( src.m_rt )
00094 m_rt = new UnitExpr( *src.m_rt ) ;
00095 else
00096 m_rt = 0 ;
00097 }
00098
00099 void UnitExpr::print(FILE* f) const
00100 {
00101 if (m_lf) {
00102 fprintf(f, "(") ; m_lf->print(f) ; fprintf(f, ")") ;
00103 }
00104 m_i->print( f ) ;
00105 if (m_rt) {
00106 fprintf(f, "(") ; m_rt->print(f) ; fprintf(f, ")") ;
00107 }
00108 }