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
RevLine 
[4]1#include "common.h"
[7]2#include OPCODE_H_PATH //opcode.h
[4]3
4
[7]5//シングルトンオブジェクト
6CDBConst CDBConst::obj;
[4]7
[7]8
[4]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
[7]18char *CConstBase::GetName(){
19 return Name;
20}
[4]21
22
[7]23
24CConst::CConst(char *Name, int Type, _int64 i64data):CConstBase(Name)
[4]25{
[7]26 this->Type = Type;
27 this->i64data = i64data;
28
29 //連結リストを初期化
30 pNext = 0;
[4]31}
[7]32CConst::CConst(char *Name, int value):CConstBase(Name)
33{
34 Type = DEF_LONG;
35 i64data = value;
36
37 //連結リストを初期化
38 pNext = 0;
39}
[4]40CConst::~CConst(){
[7]41 //連結先のオブジェクトを破棄
42 if(pNext){
43 delete pNext;
44 pNext = 0;
45 }
[4]46}
47
[7]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
[5]62CConstMacro::CConstMacro(char *Name, char *Expression):CConstBase(Name)
63{
64}
65CConstMacro::~CConstMacro(){
66}
[4]67
68
[5]69
[7]70
71
[4]72CDBConst::CDBConst(){
[7]73 memset(this,0,sizeof(CDBConst));
[4]74
[7]75 ppHash = (CConst **)calloc(MAX_HASH*sizeof(CConst *),1);
76 Init();
[4]77}
78CDBConst::~CDBConst(){
[7]79 Free();
80
81 free(ppHash);
82}
83
84//解放
85void CDBConst::Free(){
[4]86 int i;
[7]87 for(i=0; i<MAX_HASH; i++){
88 if(ppHash[i]){
89 delete ppHash[i];
90 ppHash[i] = 0;
91 }
[4]92 }
[7]93}
[4]94
[7]95//初期化
96void CDBConst::Init(){
97 Free();
[4]98}
99
[7]100void AddConstData(char *Command);
[4]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
[7]118 //重複チェック
119 if(GetType(Name)){
120 SetError(15,Name,cp);
121 return;
122 }
123
[4]124 if(buffer[i] == '('){
125 //定数マクロ
126
127 //未完成
[7]128 AddConstData(buffer);
[4]129 }
130 else{
131 //一般の定数
132 char *Expression = buffer + i + 1;
133
134 AddConst(Name,Expression);
135 }
136}
137
[7]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}
[4]154void CDBConst::AddConst(char *Name, char *Expression){
[7]155 LONG_PTR lpIndex;
156 _int64 i64data;
157 int Type = StaticCalculation(false, Expression, 0, &i64data, &lpIndex);
[4]158
[7]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 }
[4]171}
[7]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.