[4] | 1 | #include "common.h"
|
---|
[7] | 2 | #include OPCODE_H_PATH //opcode.h
|
---|
[4] | 3 |
|
---|
| 4 |
|
---|
[7] | 5 | //シングルトンオブジェクト
|
---|
| 6 | CDBConst CDBConst::obj;
|
---|
[4] | 7 |
|
---|
[7] | 8 |
|
---|
[4] | 9 | CConstBase::CConstBase(char *Name){
|
---|
| 10 | this->Name = (char *)malloc(lstrlen(Name)+1);
|
---|
| 11 | lstrcpy(this->Name, Name);
|
---|
| 12 | }
|
---|
| 13 | CConstBase::~CConstBase(){
|
---|
| 14 | free(Name);
|
---|
| 15 | Name=0;
|
---|
| 16 | }
|
---|
| 17 |
|
---|
[7] | 18 | char *CConstBase::GetName(){
|
---|
| 19 | return Name;
|
---|
| 20 | }
|
---|
[4] | 21 |
|
---|
| 22 |
|
---|
[7] | 23 |
|
---|
| 24 | CConst::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] | 32 | CConst::CConst(char *Name, int value):CConstBase(Name)
|
---|
| 33 | {
|
---|
| 34 | Type = DEF_LONG;
|
---|
| 35 | i64data = value;
|
---|
| 36 |
|
---|
| 37 | //連結リストを初期化
|
---|
| 38 | pNext = 0;
|
---|
| 39 | }
|
---|
[4] | 40 | CConst::~CConst(){
|
---|
[7] | 41 | //連結先のオブジェクトを破棄
|
---|
| 42 | if(pNext){
|
---|
| 43 | delete pNext;
|
---|
| 44 | pNext = 0;
|
---|
| 45 | }
|
---|
[4] | 46 | }
|
---|
| 47 |
|
---|
[7] | 48 | int CConst::GetType(){
|
---|
| 49 | return Type;
|
---|
| 50 | }
|
---|
| 51 | _int64 CConst::GetWholeData(){
|
---|
| 52 | return i64data;
|
---|
| 53 | }
|
---|
| 54 | double CConst::GetDoubleData(){
|
---|
| 55 | double dbl;
|
---|
| 56 | memcpy(&dbl,&i64data,sizeof(_int64));
|
---|
| 57 | return dbl;
|
---|
| 58 | }
|
---|
| 59 |
|
---|
| 60 |
|
---|
| 61 |
|
---|
[5] | 62 | CConstMacro::CConstMacro(char *Name, char *Expression):CConstBase(Name)
|
---|
| 63 | {
|
---|
| 64 | }
|
---|
| 65 | CConstMacro::~CConstMacro(){
|
---|
| 66 | }
|
---|
[4] | 67 |
|
---|
| 68 |
|
---|
[5] | 69 |
|
---|
[7] | 70 |
|
---|
| 71 |
|
---|
[4] | 72 | CDBConst::CDBConst(){
|
---|
[7] | 73 | memset(this,0,sizeof(CDBConst));
|
---|
[4] | 74 |
|
---|
[7] | 75 | ppHash = (CConst **)calloc(MAX_HASH*sizeof(CConst *),1);
|
---|
| 76 | Init();
|
---|
[4] | 77 | }
|
---|
| 78 | CDBConst::~CDBConst(){
|
---|
[7] | 79 | Free();
|
---|
| 80 |
|
---|
| 81 | free(ppHash);
|
---|
| 82 | }
|
---|
| 83 |
|
---|
| 84 | //解放
|
---|
| 85 | void 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 | //初期化
|
---|
| 96 | void CDBConst::Init(){
|
---|
| 97 | Free();
|
---|
[4] | 98 | }
|
---|
| 99 |
|
---|
[7] | 100 | void AddConstData(char *Command);
|
---|
[4] | 101 | void 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] | 138 | void 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] | 154 | void 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] | 172 | void CDBConst::AddConst(char *Name, int value){
|
---|
| 173 | CConst *newconst = new CConst(Name, value);
|
---|
| 174 |
|
---|
| 175 | AddConst(Name, newconst);
|
---|
| 176 | }
|
---|
| 177 |
|
---|
| 178 | CConst *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 |
|
---|
| 196 | int 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 | }
|
---|
| 210 | double CDBConst::GetDoubleData(char *Name){
|
---|
| 211 | CConst *pConst = GetObjectPtr(Name);
|
---|
| 212 |
|
---|
| 213 | if(!pConst) return 0;
|
---|
| 214 |
|
---|
| 215 | return pConst->GetDoubleData();
|
---|
| 216 | }
|
---|