#include "../BasicCompiler_Common/common.h" #ifdef _AMD64_ #include "../BasicCompiler64/opcode.h" #else #include "../BasicCompiler32/opcode.h" #endif //ラベルアドレス LABEL *pLabelNames; int MaxLabelNum; //Continueアドレス DWORD dwContinueAddress; //Caseスケジュール DWORD *pCaseSchedule; int CaseScheduleNum; int NowCaseSchedule; //プロシージャ抜け出しスケジュール(Exit Sub/Function) DWORD *pExitSubSchedule; int ExitSubScheduleNum; //Goto未知ラベル スケジュール GOTOLABELSCHEDULE *pGotoLabelSchedule; int GotoLabelScheduleNum; //グローバル変数初期バッファ BYTE *initGlobalBuf; //With情報 WITHINFO WithInfo; int obp,obp_AllocSize; int GlobalOpBufferSize; char *OpBuffer; void ReallocNativeCodeBuffer(){ if(obp_AllocSize=BufferSize){ //バッファ領域が足りなくなった場合はバッファを増量する BufferSize+=128; Command=(char *)HeapReAlloc(hHeap,0,Command,BufferSize); } if(basbuf[cp]=='\"'){ Command[i2]=basbuf[cp]; for(cp++,i2++;;cp++,i2++){ if(i2>=BufferSize){ //バッファ領域が足りなくなった場合はバッファを増量する BufferSize+=128; Command=(char *)HeapReAlloc(hHeap,0,Command,BufferSize); } Command[i2]=basbuf[cp]; if(basbuf[cp]=='\"') break; } continue; } if(IsCommandDelimitation(basbuf[cp])){ Command[i2]=0; if(Command[0]==1&&Command[1]==ESC_SUB){ i2=cp; while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDSUB)){ if(basbuf[cp]=='\0'){ SetError(22,"Sub",i2); break; } cp++; } if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break; cp+=2; i2=-1; continue; } if(Command[0]==1&&Command[1]==ESC_FUNCTION){ i2=cp; while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDFUNCTION)){ if(basbuf[cp]=='\0'){ SetError(22,"Function",i2); break; } cp++; } if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break; cp+=2; i2=-1; continue; } if(Command[0]==1&&Command[1]==ESC_MACRO){ i2=cp; while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDMACRO)){ if(basbuf[cp]=='\0'){ SetError(22,"Macro",i2); break; } cp++; } if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break; cp+=2; i2=-1; continue; } if(Command[0]==1&&Command[1]==ESC_TYPE){ i2=cp; while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDTYPE)){ if(basbuf[cp]=='\0'){ SetError(22,"Type",i2); break; } cp++; } if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break; cp+=2; i2=-1; continue; } if(Command[0]==1&&Command[1]==ESC_CLASS){ i2=cp; while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDCLASS)){ if(basbuf[cp]=='\0'){ SetError(22,"Class",i2); break; } cp++; } if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break; cp+=2; i2=-1; continue; } if(Command[0]==1&&Command[1]==ESC_INTERFACE){ i2=cp; while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDINTERFACE)){ if(basbuf[cp]=='\0'){ SetError(22,"Interface",i2); break; } cp++; } if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break; cp+=2; i2=-1; continue; } //DLLのグローバルデータに必要なコマンドだけ if(MAKEWORD(Command[1],Command[0])==COM_DIM) OpcodeDim(Command+2,0); // ネイティブコードバッファの再確保 ReallocNativeCodeBuffer(); if(basbuf[cp]=='\0') break; i2=-1; continue; } Command[i2]=basbuf[cp]; } HeapDefaultFree(Command); } DWORD CompileBuffer(char Return_Sequence,WORD Return_Command){ extern char *basbuf; extern HANDLE hHeap; int i,i2,i3,i4,BufferSize,ScopeStart; char *Command,temporary[VN_SIZE],*temp2,temp3[32]; DWORD dwRetCode; ScopeStart=cp; dwRetCode=0; BufferSize=128; Command=(char *)HeapAlloc(hHeap,0,BufferSize); for(cp++,i2=0;;cp++,i2++){ if(i2>=BufferSize){ //バッファ領域が足りなくなった場合はバッファを増量する BufferSize+=128; Command=(char *)HeapReAlloc(hHeap,0,Command,BufferSize); } if(basbuf[cp]=='\"'){ Command[i2]=basbuf[cp]; for(cp++,i2++;;cp++,i2++){ if(i2>=BufferSize){ //バッファ領域が足りなくなった場合はバッファを増量する BufferSize+=128; Command=(char *)HeapReAlloc(hHeap,0,Command,BufferSize); } Command[i2]=basbuf[cp]; if(basbuf[cp]=='\"') break; } continue; } if(IsCommandDelimitation(basbuf[cp])){ Command[i2]=0; if(Command[0]==1&&Command[1]==ESC_LINENUM){ for(i=2,i2=0;;i++,i2++){ if(Command[i]==','){ temporary[i2]=0; break; } temporary[i2]=Command[i]; } i3=atoi(temporary); i4=i+1; //Goto先ラベル pLabelNames=(LABEL *)HeapReAlloc(hHeap,0,pLabelNames,(MaxLabelNum+1)*sizeof(LABEL)); pLabelNames[MaxLabelNum].pName=0; pLabelNames[MaxLabelNum].line=i3; pLabelNames[MaxLabelNum].address=obp; MaxLabelNum++; //書き込みスケジュール for(i=0;i