source: dev/BasicCompiler_Common/TypeDef.cpp@ 46

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

VarPtrの戻り値の型をVoidPtrではなく、ポインタレベルを増加した型にした。
関連関数のパラメータにconstを適用。

File size: 2.6 KB
Line 
1#include "../BasicCompiler_Common/common.h"
2
3
4CDBTypeDef *pobj_DBTypeDef;
5
6
7CTypeDef::CTypeDef(const char *name,char *base){
8 lpszName=(char *)malloc(lstrlen(name)+1);
9 lstrcpy(lpszName,name);
10 lpszBaseName=(char *)malloc(lstrlen(base)+1);
11 lstrcpy(lpszBaseName,base);
12}
13CTypeDef::~CTypeDef(){
14 free(lpszName);
15 free(lpszBaseName);
16}
17
18
19CDBTypeDef::CDBTypeDef(){
20 ppobj_TypeDef=(CTypeDef **)malloc(1);
21 iNum=0;
22}
23CDBTypeDef::~CDBTypeDef(){
24 init();
25 free(ppobj_TypeDef);
26}
27void CDBTypeDef::init(){
28 int i;
29 for(i=0;i<iNum;i++){
30 delete ppobj_TypeDef[i];
31 }
32 iNum=0;
33}
34void CDBTypeDef::add(const char *name,char *base){
35 ppobj_TypeDef=(CTypeDef **)realloc(ppobj_TypeDef,(iNum+1)*sizeof(CTypeDef *));
36 ppobj_TypeDef[iNum]=new CTypeDef(name,base);
37 iNum++;
38
39
40 ////////////////////////
41 // 循環参照をチェック
42 ////////////////////////
43
44 int i;
45 char temporary[1024];
46 lstrcpy(temporary,base);
47
48 while(1){
49 i=check(temporary);
50 if(i==-1) break;
51
52 if(lstrcmp(base,ppobj_TypeDef[i]->lpszBaseName)==0){
53 //循環エラー
54 extern int cp;
55 SetError(124,NULL,cp);
56
57 //不明な型として、Long型を指定しておく
58 ppobj_TypeDef[i]->lpszBaseName=(char *)realloc(ppobj_TypeDef[i]->lpszBaseName,5);
59 lstrcpy(ppobj_TypeDef[i]->lpszBaseName,"Long");
60
61 break;
62 }
63
64 lstrcpy(temporary,ppobj_TypeDef[i]->lpszBaseName);
65 }
66}
67int CDBTypeDef::check(const char *name){
68 int i;
69 for(i=0;i<iNum;i++){
70 if(lstrcmp(ppobj_TypeDef[i]->lpszName,name)==0){
71 return i;
72 }
73 }
74 return -1;
75}
76
77
78
79void AddTypeDefData(char *Command){
80 extern int cp;
81 int i;
82 char temporary[VN_SIZE],*pTemp;
83
84 for(i=0;;i++){
85 if(Command[i]=='='||Command[i]=='\0'){
86 temporary[i]=0;
87 break;
88 }
89 temporary[i]=Command[i];
90 }
91
92 if(Command[i]!='='){
93 SetError(10,"TypeDef",cp);
94 return;
95 }
96
97 pTemp=Command+i+1;
98
99 //識別文字のエラーチェック(新しい型)
100 i=0;
101 for(;;i++){
102 if(temporary[i]=='\0') break;
103 if(!IsVariableChar(temporary[i])){
104 SetError(10,"TypeDef",cp);
105 return;
106 }
107 }
108
109 //識別文字のエラーチェック(コピー元の型)
110 if(pTemp[0]=='*'&&pTemp[1]==1&&(pTemp[2]==ESC_FUNCTION||pTemp[2]==ESC_SUB)){
111 //関数ポインタ
112 if(pTemp[3]!='('){
113 SetError(10,"TypeDef",cp);
114 return;
115 }
116 }
117 else{
118 i=0;
119 while(pTemp[i]=='*') i++;
120 for(;;i++){
121 if(pTemp[i]=='\0') break;
122 if(!IsVariableChar(pTemp[i])){
123 SetError(10,"TypeDef",cp);
124 return;
125 }
126 }
127 }
128
129 //識別子が重複している場合はエラーにする
130 if(lstrcmp(temporary,pTemp)==0){
131 SetError(1,NULL,cp);
132 return;
133 }
134
135
136
137 //////////////////////////
138 // TypeDef情報を追加
139 //////////////////////////
140 pobj_DBTypeDef->add(temporary,pTemp);
141}
Note: See TracBrowser for help on using the repository browser.