#include "stdafx.h" double CConst::GetDoubleData(){ double dbl; memcpy(&dbl,&i64data,sizeof(_int64)); return dbl; } bool CConst::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) { type.Resolve( resolver, resolveErrors ); return true; } void Consts::Add( const Symbol &symbol, _int64 i64data, const Type &type ) { CConst *newconst = new CConst( symbol, type, i64data ); //ハッシュリストに追加 Put( newconst ); } void Consts::Add(const Symbol &symbol, int value){ CConst *newconst = new CConst( symbol, value); //ハッシュリストに追加 Put( newconst ); } CConst *Consts::GetObjectPtr( const Symbol &symbol ) { CConst *pConst = GetHashArrayElement( symbol.GetName().c_str() ); while( pConst ) { if( pConst->IsEqualSymbol( symbol ) ) { break; } pConst = pConst->GetChainNext(); } return pConst; } int Consts::GetBasicType( const Symbol &symbol ){ CConst *pConst = GetObjectPtr( symbol ); if(!pConst) return 0; return pConst->GetType().GetBasicType(); } _int64 Consts::GetWholeData( const Symbol &symbol ){ CConst *pConst = GetObjectPtr( symbol ); if(!pConst) return 0; return pConst->GetWholeData(); } double Consts::GetDoubleData( const Symbol &symbol ){ CConst *pConst = GetObjectPtr( symbol ); if(!pConst) return 0; return pConst->GetDoubleData(); } bool Consts::IsStringPtr( const Symbol &symbol, bool isUnicode ){ CConst *pConst = GetObjectPtr( symbol ); if(!pConst) return false; const Type &type = pConst->GetType(); int charType = isUnicode ? MAKE_PTR_TYPE(DEF_WORD,1) : MAKE_PTR_TYPE(DEF_SBYTE,1); return ( type.GetBasicType() == charType && type.GetIndex() == LITERAL_STRING ); } bool ConstMacro::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) { // 依存関係を解決すべきメンバは無い return true; } // マクロ定数を追加するための関数 bool ConstMacros::Add( const Symbol &symbol, const char *parameterStr ) { std::vector parameters; int i = 0; if(parameterStr[i]!='(') { return false; } char temporary[VN_SIZE]; int i2; for(i++,i2=0;;i++,i2++){ if(parameterStr[i]=='\0') { return false; } if(parameterStr[i]==','||parameterStr[i]==')'){ temporary[i2]=0; parameters.push_back( temporary ); if(parameterStr[i]==')'){ i++; if(parameterStr[i]!='=') { return false; } break; } i2=-1; continue; } temporary[i2]=parameterStr[i]; } //データ strcpy(temporary,parameterStr+i+1); this->Put( new ConstMacro( symbol, parameters, temporary ) ); return true; } ConstMacro *ConstMacros::Find( const Symbol &symbol ) { ConstMacro *pConstMacro = GetHashArrayElement( symbol.GetName().c_str() ); while( pConstMacro ) { if( pConstMacro->IsEqualSymbol( symbol ) ) { break; } pConstMacro = pConstMacro->GetChainNext(); } return pConstMacro; }