#include "../BasicCompiler_Common/common.h" CDBTypeDef *pobj_DBTypeDef; CTypeDef::CTypeDef(const char *name,char *base){ lpszName=(char *)malloc(lstrlen(name)+1); lstrcpy(lpszName,name); lpszBaseName=(char *)malloc(lstrlen(base)+1); lstrcpy(lpszBaseName,base); } CTypeDef::~CTypeDef(){ free(lpszName); free(lpszBaseName); } CDBTypeDef::CDBTypeDef(){ ppobj_TypeDef=(CTypeDef **)malloc(1); iNum=0; } CDBTypeDef::~CDBTypeDef(){ init(); free(ppobj_TypeDef); } void CDBTypeDef::init(){ int i; for(i=0;ilpszBaseName)==0){ //循環エラー extern int cp; SetError(124,NULL,cp); //不明な型として、Long型を指定しておく ppobj_TypeDef[i]->lpszBaseName=(char *)realloc(ppobj_TypeDef[i]->lpszBaseName,5); lstrcpy(ppobj_TypeDef[i]->lpszBaseName,"Long"); break; } lstrcpy(temporary,ppobj_TypeDef[i]->lpszBaseName); } } int CDBTypeDef::check(const char *name){ int i; for(i=0;ilpszName,name)==0){ return i; } } return -1; } void AddTypeDefData(char *Command){ extern int cp; int i; char temporary[VN_SIZE],*pTemp; for(i=0;;i++){ if(Command[i]=='='||Command[i]=='\0'){ temporary[i]=0; break; } temporary[i]=Command[i]; } if(Command[i]!='='){ SetError(10,"TypeDef",cp); return; } pTemp=Command+i+1; //識別文字のエラーチェック(新しい型) i=0; for(;;i++){ if(temporary[i]=='\0') break; if(!IsVariableChar(temporary[i])){ SetError(10,"TypeDef",cp); return; } } //識別文字のエラーチェック(コピー元の型) if(pTemp[0]=='*'&&pTemp[1]==1&&(pTemp[2]==ESC_FUNCTION||pTemp[2]==ESC_SUB)){ //関数ポインタ if(pTemp[3]!='('){ SetError(10,"TypeDef",cp); return; } } else{ i=0; while(pTemp[i]=='*') i++; for(;;i++){ if(pTemp[i]=='\0') break; if(!IsVariableChar(pTemp[i])){ SetError(10,"TypeDef",cp); return; } } } //識別子が重複している場合はエラーにする if(lstrcmp(temporary,pTemp)==0){ SetError(1,NULL,cp); return; } ////////////////////////// // TypeDef情報を追加 ////////////////////////// pobj_DBTypeDef->add(temporary,pTemp); }