source: dev/BasicCompiler_Common/Const.cpp@ 7

Last change on this file since 7 was 7, checked in by dai_9181, 17 years ago

Constステートメントで定数変数を宣言できるように改良。

File size: 3.5 KB
Line 
1#include "common.h"
2#include OPCODE_H_PATH //opcode.h
3
4
5//シングルトンオブジェクト
6CDBConst CDBConst::obj;
7
8
9CConstBase::CConstBase(char *Name){
10 this->Name = (char *)malloc(lstrlen(Name)+1);
11 lstrcpy(this->Name, Name);
12}
13CConstBase::~CConstBase(){
14 free(Name);
15 Name=0;
16}
17
18char *CConstBase::GetName(){
19 return Name;
20}
21
22
23
24CConst::CConst(char *Name, int Type, _int64 i64data):CConstBase(Name)
25{
26 this->Type = Type;
27 this->i64data = i64data;
28
29 //連結リストを初期化
30 pNext = 0;
31}
32CConst::CConst(char *Name, int value):CConstBase(Name)
33{
34 Type = DEF_LONG;
35 i64data = value;
36
37 //連結リストを初期化
38 pNext = 0;
39}
40CConst::~CConst(){
41 //連結先のオブジェクトを破棄
42 if(pNext){
43 delete pNext;
44 pNext = 0;
45 }
46}
47
48int CConst::GetType(){
49 return Type;
50}
51_int64 CConst::GetWholeData(){
52 return i64data;
53}
54double CConst::GetDoubleData(){
55 double dbl;
56 memcpy(&dbl,&i64data,sizeof(_int64));
57 return dbl;
58}
59
60
61
62CConstMacro::CConstMacro(char *Name, char *Expression):CConstBase(Name)
63{
64}
65CConstMacro::~CConstMacro(){
66}
67
68
69
70
71
72CDBConst::CDBConst(){
73 memset(this,0,sizeof(CDBConst));
74
75 ppHash = (CConst **)calloc(MAX_HASH*sizeof(CConst *),1);
76 Init();
77}
78CDBConst::~CDBConst(){
79 Free();
80
81 free(ppHash);
82}
83
84//解放
85void CDBConst::Free(){
86 int i;
87 for(i=0; i<MAX_HASH; i++){
88 if(ppHash[i]){
89 delete ppHash[i];
90 ppHash[i] = 0;
91 }
92 }
93}
94
95//初期化
96void CDBConst::Init(){
97 Free();
98}
99
100void AddConstData(char *Command);
101void CDBConst::Add(char *buffer){
102 int i;
103
104 //名前を取得
105 char Name[VN_SIZE];
106 for(i=0;;i++){
107 if(buffer[i]=='\0'){
108 SetError(10,"Const",cp);
109 return;
110 }
111 if(buffer[i]=='='||buffer[i]=='('){
112 Name[i]=0;
113 break;
114 }
115 Name[i]=buffer[i];
116 }
117
118 //重複チェック
119 if(GetType(Name)){
120 SetError(15,Name,cp);
121 return;
122 }
123
124 if(buffer[i] == '('){
125 //定数マクロ
126
127 //未完成
128 AddConstData(buffer);
129 }
130 else{
131 //一般の定数
132 char *Expression = buffer + i + 1;
133
134 AddConst(Name,Expression);
135 }
136}
137
138void CDBConst::AddConst(char *Name, CConst *newconst){
139 int key = hash_default(Name);
140
141 //ハッシュリストに追加
142 if(ppHash[key]){
143 CConst *pConst = ppHash[key];
144 while(pConst->pNext){
145 pConst = pConst->pNext;
146 }
147
148 pConst->pNext = newconst;
149 }
150 else{
151 ppHash[key] = newconst;
152 }
153}
154void CDBConst::AddConst(char *Name, char *Expression){
155 LONG_PTR lpIndex;
156 _int64 i64data;
157 int Type = StaticCalculation(false, Expression, 0, &i64data, &lpIndex);
158
159 if(Type){
160 //リテラル値の場合
161 //登録を行う
162
163 CConst *newconst = new CConst(Name, Type, i64data);
164
165 AddConst(Name, newconst);
166 }
167 else{
168 //変数の場合
169 //何もしない(実行領域コンパイル時にdim宣言として扱う)
170 }
171}
172void CDBConst::AddConst(char *Name, int value){
173 CConst *newconst = new CConst(Name, value);
174
175 AddConst(Name, newconst);
176}
177
178CConst *CDBConst::GetObjectPtr(char *Name){
179 //ハッシュ値を取得
180 int key;
181 key=hash_default(Name);
182
183 //格納位置を取得
184 CConst *pConst;
185 pConst=ppHash[key];
186 while(pConst){
187 if(lstrcmp(pConst->GetName(),Name)==0) break;
188
189 pConst=pConst->pNext;
190 }
191
192 return pConst;
193}
194
195
196int CDBConst::GetType(char *Name){
197 CConst *pConst = GetObjectPtr(Name);
198
199 if(!pConst) return 0;
200
201 return pConst->GetType();
202}
203_int64 CDBConst::GetWholeData(char *Name){
204 CConst *pConst = GetObjectPtr(Name);
205
206 if(!pConst) return 0;
207
208 return pConst->GetWholeData();
209}
210double CDBConst::GetDoubleData(char *Name){
211 CConst *pConst = GetObjectPtr(Name);
212
213 if(!pConst) return 0;
214
215 return pConst->GetDoubleData();
216}
Note: See TracBrowser for help on using the repository browser.