source: dev/trunk/ab5.0/abdev/ab_common/src/Lexical/Const.cpp@ 828

Last change on this file since 828 was 828, checked in by イグトランス (egtra), 12 years ago

egtraブランチの内容をマージ。

File size: 2.9 KB
RevLine 
[206]1#include "stdafx.h"
2
[7]3double CConst::GetDoubleData(){
4 double dbl;
5 memcpy(&dbl,&i64data,sizeof(_int64));
6 return dbl;
7}
8
[640]9bool CConst::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
[206]10{
[640]11 type.Resolve( resolver, resolveErrors );
[637]12 return true;
13}
[4]14
[637]15void Consts::Add( const Symbol &symbol, _int64 i64data, const Type &type )
16{
17 CConst *newconst = new CConst( symbol, type, i64data );
18
[206]19 //ハッシュリストに追加
20 Put( newconst );
[4]21}
[637]22void Consts::Add(const Symbol &symbol, int value){
23 CConst *newconst = new CConst( symbol, value);
[7]24
[206]25 //ハッシュリストに追加
26 Put( newconst );
[7]27}
28
[579]29CConst *Consts::GetObjectPtr( const Symbol &symbol )
30{
[828]31 auto c = GetHashArrayElement(symbol.GetName());
32 auto it = std::find_if(c.begin(), c.end(),
33 [&](CConst* t) {return t->IsEqualSymbol(symbol);});
34 return it != c.end()
35 ? *it
36 : nullptr;
[7]37}
38
39
[579]40int Consts::GetBasicType( const Symbol &symbol ){
41 CConst *pConst = GetObjectPtr( symbol );
[7]42
43 if(!pConst) return 0;
44
[103]45 return pConst->GetType().GetBasicType();
[7]46}
[579]47_int64 Consts::GetWholeData( const Symbol &symbol ){
48 CConst *pConst = GetObjectPtr( symbol );
[7]49
50 if(!pConst) return 0;
51
52 return pConst->GetWholeData();
53}
[579]54double Consts::GetDoubleData( const Symbol &symbol ){
55 CConst *pConst = GetObjectPtr( symbol );
[7]56
57 if(!pConst) return 0;
58
59 return pConst->GetDoubleData();
60}
[600]61bool Consts::IsStringPtr( const Symbol &symbol, bool isUnicode ){
[579]62 CConst *pConst = GetObjectPtr( symbol );
[103]63
64 if(!pConst) return false;
65
66 const Type &type = pConst->GetType();
67
[600]68 int charType = isUnicode
69 ? MAKE_PTR_TYPE(DEF_WORD,1)
70 : MAKE_PTR_TYPE(DEF_SBYTE,1);
71
72 return ( type.GetBasicType() == charType && type.GetIndex() == LITERAL_STRING );
[103]73}
[206]74
[640]75bool ConstMacro::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
[637]76{
[639]77 // 依存関係を解決すべきメンバは無い
[637]78 return true;
79}
80
[206]81// マクロ定数を追加するための関数
[637]82bool ConstMacros::Add( const Symbol &symbol, const char *parameterStr )
[206]83{
84 std::vector<std::string> parameters;
85
86 int i = 0;
87 if(parameterStr[i]!='(')
88 {
[579]89 return false;
[206]90 }
91
92 char temporary[VN_SIZE];
93 int i2;
94 for(i++,i2=0;;i++,i2++){
[579]95 if(parameterStr[i]=='\0')
96 {
97 return false;
[206]98 }
99 if(parameterStr[i]==','||parameterStr[i]==')'){
100 temporary[i2]=0;
101
102 parameters.push_back( temporary );
103
104 if(parameterStr[i]==')'){
105 i++;
[579]106 if(parameterStr[i]!='=')
107 {
108 return false;
[206]109 }
110 break;
111 }
112
113 i2=-1;
114 continue;
115 }
116 temporary[i2]=parameterStr[i];
117 }
118
119 //データ
[700]120 strcpy(temporary,parameterStr+i+1);
[206]121
[637]122 this->Put( new ConstMacro( symbol, parameters, temporary ) );
[579]123
124 return true;
[206]125}
[579]126ConstMacro *ConstMacros::Find( const Symbol &symbol )
127{
[828]128 auto c = GetHashArrayElement(symbol.GetName());
129 auto it = std::find_if(c.begin(), c.end(),
130 [&](ConstMacro* t) {return t->IsEqualSymbol(symbol);});
131 return it != c.end()
132 ? *it
133 : nullptr;
[206]134}
Note: See TracBrowser for help on using the repository browser.