source: dev/trunk/abdev/BasicCompiler_Common/Subroutine.cpp@ 182

Last change on this file since 182 was 182, checked in by dai_9181, 17 years ago
File size: 18.7 KB
RevLine 
[182]1#include <jenga/include/smoothie/Smoothie.h>
2#include <jenga/include/smoothie/LexicalAnalysis.h>
3
4#include <ProcedureImpl.h>
5
[4]6#include "../BasicCompiler_Common/common.h"
7
8#ifdef _AMD64_
9#include "../BasicCompiler64/opcode.h"
10#else
[5]11#include "../BasicCompiler32/opcode.h"
[4]12#endif
13
14int GetCallProcName(char *buffer,char *name){
15 int i2,i3,IsStr=0;
16
17 for(i2=0;;i2++){
18 if(buffer[i2]=='\"') IsStr^=1;
19 if(IsDBCSLeadByte(buffer[i2])){
20 name[i2]=buffer[i2];
21 i2++;
22 name[i2]=buffer[i2];
23 continue;
24 }
25 if(buffer[i2]=='['&&IsStr==0){
26 i3=GetStringInBracket(name+i2,buffer+i2);
27 i2+=i3-1;
28 continue;
29 }
30 if(buffer[i2]=='('&&IsStr==0){
31 name[i2]=0;
32 break;
33 }
34 if(buffer[i2]=='='&&IsStr==0){
35 name[i2]=0;
36 break;
37 }
38
39 name[i2]=buffer[i2];
40 if(buffer[i2]=='\0') break;
41 }
42 return i2;
43}
44
45int GetProc(char *name,void **ppInfo){
46
47 //ユーザー定義関数
48 *ppInfo=(void *)GetSubHash(name);
49 if(*ppInfo) return PROC_DEFAULT;
50
51 //DLL関数
52 *ppInfo=(void *)GetDeclareHash(name);
53 if(*ppInfo) return PROC_DLL;
54
55 //コンパイラ埋め込み型
56 *ppInfo=(void *)(_int64)GetFunctionFromName(name);
57 if(*ppInfo) return PROC_BUILTIN;
58
59 //関数ポインタ
[75]60 Type type;
61 if( !GetVarType( name, type, false ) ){
62 return 0;
63 }
64 if( type.IsProcPtr() ){
65 return PROC_PTR;
66 }
[4]67
68 return 0;
69}
70
[46]71void SplitObjectName(const char *name,char *ObjectName,int *pRefType){
[4]72 int i4;
73 for(i4=lstrlen(name)-1;i4>=0;i4--){
74 if(name[i4]=='.'||(name[i4]==1&&name[i4+1]==ESC_PSMEM))
75 break;
76 }
77 if(i4==-1) ObjectName[0]=0;
78 else{
79 //参照タイプを判別
80 if(name[i4]=='.') *pRefType=DEF_OBJECT;
81 else *pRefType=DEF_PTR_OBJECT;
82
83 if(i4==0) GetWithName(ObjectName);
84 else{
85 memcpy(ObjectName,name,i4);
86 ObjectName[i4]=0;
87 }
88 }
89}
[97]90
[75]91bool CallProc( int kind, const void *pProc, const char *fullCallName, const char *lpszParms, Type &resultType, bool isCallOn ){
[50]92
[75]93 //GetSubHash内でエラー提示が行われた場合
94 if(pProc==(Procedure *)-1){
95 return false;
96 }
[50]97
[75]98 if(kind==PROC_DEFAULT){
[50]99 /////////////////////
100 // ユーザー定義関数
101 /////////////////////
102
[75]103 UserProc *pUserProc = (UserProc *)pProc;
[50]104
105 //オブジェクト名を取得
106 char ObjectName[VN_SIZE];
107 int RefType;
[75]108 SplitObjectName(fullCallName,ObjectName,&RefType);
[50]109
110
111 ////////////////////////
112 // オーバーロードを解決
113 ////////////////////////
114
[75]115 std::vector<UserProc *> subs;
116 GetOverloadSubHash(fullCallName,subs);
[50]117 if(subs.size()){
118 //オーバーロードを解決
[75]119 pUserProc=OverloadSolutionWithStrParam(fullCallName,subs,lpszParms,ObjectName);
[50]120
[75]121 if(!pUserProc){
122 return false;
123 }
[50]124 }
125
[75]126 resultType = pUserProc->ReturnType();
[50]127
[75]128 if( isCallOn ){
129 if( !Opcode_CallProc(lpszParms,pUserProc,0,ObjectName,RefType) ){
130 return false;
131 }
[50]132 }
133 }
[75]134 else if(kind==PROC_DLL){
[50]135 /////////////////////////
136 // DLL関数
137 /////////////////////////
[75]138 DllProc *pDllProc = (DllProc *)pProc;
[50]139
[75]140 resultType = pDllProc->ReturnType();
141
142 if( isCallOn ){
143 if( !Opcode_CallDllProc(lpszParms,pDllProc) ){
144 return false;
145 }
146 }
[50]147 }
[75]148 else if(kind==PROC_BUILTIN){
[50]149 /////////////////////////
150 // 組み込み関数
151 /////////////////////////
[75]152 int FuncId = (int)(_int64)pProc;
[50]153
[75]154 if( !Opcode_CallFunc( lpszParms, FuncId, resultType, isCallOn ) ){
155 return false;
[50]156 }
157 }
[75]158 else if(kind==PROC_PTR){
[50]159 /////////////////
160 // 関数ポインタ
161 /////////////////
162
[75]163 Type type;
164 GetVarType(fullCallName,type,false);
[50]165
[182]166 ProcPointer *pProcPtr = Smoothie::GetMeta().GetProcPointers()[type.GetIndex()];
[75]167 resultType = pProcPtr->ReturnType();
168
169 if( isCallOn ){
170 if( !Opcode_CallProcPtr(fullCallName,lpszParms,pProcPtr) ){
171 return false;
172 }
173 }
[50]174 }
[75]175 else{
176 return false;
177 }
[50]178
[75]179 return true;
[50]180}
[75]181bool CallPropertyMethod( const char *variable, const char *rightSide, Type &resultType){
[50]182 //プロパティ用のメソッドを呼び出す
183
184 //配列要素を取得
185 char VarName[VN_SIZE],ArrayElements[VN_SIZE];
186 GetArrayElement(variable,VarName,ArrayElements);
187
188 //オブジェクト名を取得
189 char ObjectName[VN_SIZE];
190 int RefType;
191 SplitObjectName(VarName,ObjectName,&RefType);
192
193 //オーバーロード用の関数リストを作成
[75]194 std::vector<UserProc *> subs;
[50]195 GetOverloadSubHash(VarName,subs);
196 if(subs.size()==0){
[75]197 return false;
[50]198 }
199
200 //パラメータを整備
201 char *Parameter;
[75]202 Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+lstrlen(rightSide)+32);
[50]203 lstrcpy(Parameter,ArrayElements);
[75]204 if(rightSide){
205 if(Parameter[0]&&rightSide[0]) lstrcat(Parameter,",");
206 lstrcat(Parameter,rightSide);
[50]207 }
208
209 //オーバーロードを解決
[75]210 UserProc *pUserProc;
211 pUserProc=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName);
[50]212
[75]213 if(pUserProc){
[50]214 //呼び出し
[75]215 Opcode_CallProc(Parameter,pUserProc,0,ObjectName,RefType);
[50]216
[75]217 resultType = pUserProc->ReturnType();
[50]218 }
219
220 HeapDefaultFree(Parameter);
221
[75]222 return true;
[50]223}
224
[75]225bool GetReturnTypeOfPropertyMethod( const char *variable, const char *rightSide, Type &resultType ){
[4]226 //プロパティ用のメソッドを呼び出す
227
228 //配列要素を取得
229 char VarName[VN_SIZE],ArrayElements[VN_SIZE];
230 GetArrayElement(variable,VarName,ArrayElements);
231
232 //オブジェクト名を取得
233 char ObjectName[VN_SIZE];
234 int RefType;
[28]235 SplitObjectName(VarName,ObjectName,&RefType);
[4]236
237 //オーバーロード用の関数リストを作成
[75]238 std::vector<UserProc *> subs;
[50]239 GetOverloadSubHash(VarName,subs);
240 if(subs.size()==0){
[4]241 return 0;
242 }
243
244 //パラメータを整備
245 char *Parameter;
[75]246 Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+lstrlen(rightSide)+32);
[4]247 lstrcpy(Parameter,ArrayElements);
[75]248 if(rightSide){
249 if(Parameter[0]&&rightSide[0]) lstrcat(Parameter,",");
250 lstrcat(Parameter,rightSide);
[4]251 }
252
253 //オーバーロードを解決
[75]254 UserProc *pUserProc;
255 pUserProc=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName);
[4]256
[75]257 if(pUserProc){
258 resultType = pUserProc->ReturnType();
[4]259 }
260
261 return 1;
262}
263
[38]264//インデクサ(getter)の戻り値を取得
[75]265bool GetReturnTypeOfIndexerGetterProc( const CClass &objClass, Type &resultType ){
[100]266 vector<UserProc *> subs;
[135]267 objClass.GetMethods().Enum( CALC_ARRAY_GET, subs );
[50]268 if( subs.size() == 0 ){
[38]269 return false;
270 }
271
[75]272 resultType = subs[0]->ReturnType();
[38]273
274 return true;
275}
276
277
[100]278void AddDeclareData(const NamespaceScopes &namespaceScopes, char *buffer,int nowLine){
[4]279 extern HANDLE hHeap;
[75]280 int i2;
[4]281
[75]282 int i=0;
[4]283
[75]284 //Sub/Function
285 Procedure::Kind kind = Procedure::Sub;
286 if(buffer[i]==ESC_SUB){
[4]287 }
[75]288 else if(buffer[i]==ESC_FUNCTION){
289 kind = Procedure::Function;
290 }
[4]291 else{
[75]292 SetError(1,NULL,nowLine);
[4]293 return;
294 }
295 i++;
296
297 //プロシージャ名
[75]298 char procName[VN_SIZE];
299 bool isCdecl = false;
[4]300 for(i2=0;;i++,i2++){
301 if(buffer[i]==1&&buffer[i+1]==ESC_CDECL){
[75]302 isCdecl = true;
[4]303
304 i+=2;
[75]305 procName[i2]=0;
[4]306 break;
307 }
308 if(buffer[i]==','){
[75]309 procName[i2]=0;
[4]310 break;
311 }
312 if(buffer[i]=='\0'){
[75]313 SetError(1,NULL,nowLine);
[4]314 return;
315 }
[75]316 procName[i2]=buffer[i];
[4]317 }
[75]318 i++;
[4]319
320 //ユーザー定義関数との重複チェック
[75]321 if(GetSubHash(procName)){
322 SetError(15,procName,nowLine);
[4]323 return;
324 }
325
326
327 //ライブラリ
[75]328 char dllFileName[MAX_PATH];
329 i = GetOneParameter( buffer, i, dllFileName );
330 Type resultType;
[54]331 _int64 i64data;
[75]332 if( !StaticCalculation( true, dllFileName, 0, &i64data, resultType ) ){
[4]333 return;
334 }
[75]335 if( resultType.GetBasicType() != typeOfPtrChar ){
336 SetError(1,NULL,nowLine);
337 return;
338 }
339 lstrcpy( dllFileName, (char *)i64data );
340 CharUpper(dllFileName);
341 if(!strstr(dllFileName,".")){
342 lstrcat(dllFileName,".DLL");
343 if(lstrlen(dllFileName)>=16){
344 SetError(7,NULL,nowLine);
345 return;
[4]346 }
347 }
348
[54]349 //エイリアス
[75]350 char alias[VN_SIZE];
351 i = GetOneParameter( buffer, i, alias );
352 if( alias[0] ){
353 if( !StaticCalculation( true, alias, 0, &i64data, resultType ) ){
[4]354 return;
355 }
[75]356 if( resultType.GetBasicType() != typeOfPtrChar ){
357 SetError(1,NULL,nowLine);
358 return;
359 }
360 lstrcpy( alias, (char *)i64data );
[4]361 }
362 else{
[54]363 //省略されたときは関数名
[75]364 lstrcpy( alias, procName );
[4]365 }
366
367
[75]368 // オブジェクトを生成
[182]369 DllProc *pDllProc = new DllProcImpl( namespaceScopes, procName, kind, isCdecl, dllFileName, alias );
[4]370
[75]371 // パラメータを解析
372 // ※第1パラメータにに指定するデータの例:"( s As String ) As String"
373 pDllProc->SetParamsAndReturnType( buffer + i, nowLine );
[4]374
[75]375 // パラメータのエラーチェック
[182]376 BOOST_FOREACH( const Parameter *pParam, pDllProc->Params() ){
[75]377 if( pParam->IsObject() ){
378 SetError(25,pParam->GetVarName(),nowLine);
[4]379 }
[75]380 if( !pParam->IsRef() ){
381 if( pParam->IsStruct() ){
382 SetError(28,pParam->GetVarName(),nowLine);
383 }
[4]384 }
[75]385 }
[4]386
[75]387 //戻り値のエラーチェック
388 if( pDllProc->IsFunction() ){
389 // Function定義
[4]390
[75]391 if( pDllProc->ReturnType().IsObject() ){
392 // DLL関数ではオブジェクトを戻り値にできない
393 SetError(40,pDllProc->GetName(),nowLine);
[4]394 }
[75]395 }
[4]396
397
[75]398 /////////////////////////////////
399 // 格納位置を計算してppDeclareHashにセット
400 /////////////////////////////////
[4]401
[75]402 //ハッシュ値を取得
403 int key;
404 key=hash_default(procName);
[4]405
[75]406 extern DllProc **ppDeclareHash;
407 if(ppDeclareHash[key]){
[113]408 DllProc *pTempProc = ppDeclareHash[key];
[75]409 while(1){
[113]410 if( pTempProc->IsEqualSymbol( pDllProc->GetNamespaceScopes(), pDllProc->GetName() ) ){
[75]411 //重複エラー
412 SetError(15,procName,nowLine);
413 return;
414 }
[4]415
[75]416 if(pTempProc->pNextData==0){
417 pTempProc->pNextData=pDllProc;
418 break;
419 }
420 pTempProc=pTempProc->pNextData;
[4]421 }
[75]422 pTempProc=pTempProc->pNextData;
[4]423 }
[75]424 else{
425 ppDeclareHash[key]=pDllProc;
[4]426 }
427}
428
[135]429GlobalProc *AddSubData( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, char *buffer,int nowLine,bool isVirtual,CClass *pobj_c, bool isStatic){
[75]430 int i2,i3;
431 char temporary[8192];
[4]432
[75]433 int i=1;
[4]434
[100]435 Procedure::Kind kind = Procedure::Sub;
[75]436 bool isMacro = false;
437 if(buffer[i]==ESC_FUNCTION) kind = Procedure::Function;
438 if(buffer[i]==ESC_MACRO){
439 isMacro = true;
[4]440 }
441
442 i++;
443
[75]444 bool isCdecl = false;
445 bool isExport = false;
[4]446 while(1){
[75]447 if(buffer[i]==1&&buffer[i+1]==ESC_CDECL&& isCdecl == false ){
448 isCdecl = true;
[4]449
450 i+=2;
451 }
[75]452 else if(buffer[i]==1&&buffer[i+1]==ESC_EXPORT&& isExport == false ){
453 isExport = true;
[4]454
455 i+=2;
456 }
457 else break;
458 }
459
460 i2=0;
461 if(buffer[i]==1&&buffer[i+1]==ESC_OPERATOR){
462 if(!pobj_c){
[75]463 SetError(126,NULL,nowLine);
[4]464 return 0;
465 }
466
467 //オペレータの場合
468 temporary[i2++]=buffer[i++];
469 temporary[i2++]=buffer[i++];
470
471 int iCalcId;
472 if(buffer[i]=='='&&buffer[i+1]=='='){
473 iCalcId=CALC_EQUAL;
474 i3=2;
475 }
476 else if(buffer[i]=='='){
477 iCalcId=CALC_SUBSITUATION;
478 i3=1;
479 }
480 else if(buffer[i]=='('){
481 iCalcId=CALC_AS;
482 i3=0;
483 }
484 else if(buffer[i]=='['&&buffer[i+1]==']'&&buffer[i+2]=='='){
485 iCalcId=CALC_ARRAY_SET;
486 i3=3;
487 }
488 else if(buffer[i]=='['&&buffer[i+1]==']'){
489 iCalcId=CALC_ARRAY_GET;
490 i3=2;
491 }
492 else{
493 iCalcId=GetCalcId(buffer+i,&i3);
494 i3++;
495 }
496 if(!iCalcId){
[75]497 SetError(1,NULL,nowLine);
[4]498 return 0;
499 }
500 temporary[i2++]=iCalcId;
501 temporary[i2]=0;
502
503 i+=i3;
504 }
505 else{
506 if(pobj_c){
507 //クラスメンバの場合、デストラクタには~が付くことを考慮
508 if(buffer[i]=='~'){
509 temporary[i2]='~';
510 i++;
511 i2++;
512 }
513 }
514
515 for(;;i++,i2++){
516 if(!IsVariableChar(buffer[i])){
517 temporary[i2]=0;
518 break;
519 }
520 temporary[i2]=buffer[i];
521 }
522 }
523
[75]524 if( isMacro ){
[4]525 //大文字に変換
526 CharUpper(temporary);
527
528 //マクロ関数の場合は名前リストに追加
529 extern char **ppMacroNames;
530 extern int MacroNum;
531 ppMacroNames=(char **)HeapReAlloc(hHeap,0,ppMacroNames,(MacroNum+1)*sizeof(char *));
532 ppMacroNames[MacroNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
533 lstrcpy(ppMacroNames[MacroNum],temporary);
534 MacroNum++;
535 }
536
[30]537 if(!pobj_c){
[4]538 //クラスメンバ以外の場合のみ
539 //重複チェック
540
541 if(GetDeclareHash(temporary)){
[75]542 SetError(15,temporary,nowLine);
[4]543 return 0;
544 }
545 }
546
547 extern int SubNum;
548 SubNum++;
549
[108]550 GlobalProc *pUserProc = new GlobalProc( namespaceScopes, importedNamespaces, temporary, kind, isMacro, isCdecl, isExport );
[75]551 pUserProc->SetParentClass( pobj_c );
[112]552 if( Smoothie::isFullCompile ){
553 // すべての関数・メソッドをコンパイルする
554 pUserProc->Using();
555 }
[4]556
557 //ID
[5]558 static int id_base=0;
[75]559 pUserProc->id = (id_base++);
[4]560
[75]561 if(isExport){
562 pUserProc->Using();
[4]563 }
564
[75]565 // パラメータを解析
566 // ※第1パラメータにに指定するデータの例:"( s As String ) As String"
567 pUserProc->SetParamsAndReturnType( buffer + i, nowLine, isStatic );
[4]568
[97]569 pUserProc->_paramStr = buffer + i;
[4]570
[97]571
[4]572 /////////////////////////////////
573 // ハッシュデータに追加
574 /////////////////////////////////
575
576 int key;
[75]577 key=hash_default(pUserProc->GetName().c_str());
[4]578
[100]579 extern GlobalProc **ppSubHash;
[4]580 if(ppSubHash[key]){
[100]581 GlobalProc *psi2;
[4]582 psi2=ppSubHash[key];
583 while(1){
[75]584 if(pobj_c==psi2->GetParentClassPtr()){
[4]585 //重複エラーチェックを行う
[101]586 if( pUserProc->IsEqualSymbol( *psi2 ) ){
[120]587 if( psi2->Params().Equals( pUserProc->Params() ) ){
[75]588 SetError(15,pUserProc->GetName().c_str(),nowLine);
[4]589 return 0;
590 }
591 }
592 }
593
594 if(psi2->pNextData==0) break;
595 psi2=psi2->pNextData;
596 }
[75]597 psi2->pNextData=pUserProc;
[4]598 }
599 else{
[75]600 ppSubHash[key]=pUserProc;
[4]601 }
602
[75]603 return pUserProc;
[4]604}
605
606void GetSubInfo(void){ //サブルーチン情報を取得
607 extern HANDLE hHeap;
608 extern char *basbuf;
609 int i,i2,i3;
610 char temporary[8192];
611
612 //Declare(DLL関数)情報を初期化
[75]613 extern DllProc **ppDeclareHash;
614 ppDeclareHash=(DllProc **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(DllProc *));
[4]615
616 //サブルーチン(ユーザー定義)情報を初期化
[100]617 extern GlobalProc **ppSubHash;
[4]618 extern int SubNum;
[100]619 ppSubHash=(GlobalProc **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(GlobalProc *));
[4]620 SubNum=0;
621
622 //マクロ関数の名前リストを初期化
623 extern char **ppMacroNames;
624 extern int MacroNum;
625 ppMacroNames=(char **)HeapAlloc(hHeap,0,1);
626 MacroNum=0;
627
[99]628 // 名前空間管理
[182]629 NamespaceScopes &namespaceScopes = Smoothie::Temp::liveingNamespaceScopes;
[101]630 namespaceScopes.clear();
[99]631
[108]632 // Importsされた名前空間の管理
[143]633 NamespaceScopesCollection &importedNamespaces = Smoothie::Temp::importedNamespaces;
[108]634 importedNamespaces.clear();
635
[4]636 i=-1;
637 while(1){
638 i++;
639
640 if(basbuf[i]==1&&(basbuf[i+1]==ESC_CLASS||basbuf[i+1]==ESC_INTERFACE)){
641 /* Class ~ End Class
642 Interface ~ End Interface
643 を飛び越す */
644 i3=GetEndXXXCommand(basbuf[i+1]);
645 for(i+=2,i2=0;;i++,i2++){
646 if(basbuf[i]=='\0') break;
647 if(basbuf[i]==1&&basbuf[i+1]==(char)i3){
648 i++;
649 break;
650 }
651 }
652 if(basbuf[i]=='\0') break;
653 continue;
654 }
655
[99]656 if( basbuf[i] == 1 && basbuf[i+1] == ESC_NAMESPACE ){
657 for(i+=2,i2=0;;i2++,i++){
658 if( IsCommandDelimitation( basbuf[i] ) ){
659 temporary[i2]=0;
660 break;
661 }
662 temporary[i2]=basbuf[i];
663 }
664 namespaceScopes.push_back( temporary );
665
666 continue;
667 }
668 else if( basbuf[i] == 1 && basbuf[i+1] == ESC_ENDNAMESPACE ){
669 if( namespaceScopes.size() <= 0 ){
670 SetError(12, "End Namespace", i );
671 }
672 else{
673 namespaceScopes.pop_back();
674 }
675
676 i += 2;
677 continue;
678 }
[108]679 else if( basbuf[i] == 1 && basbuf[i+1] == ESC_IMPORTS ){
680 for(i+=2,i2=0;;i2++,i++){
681 if( IsCommandDelimitation( basbuf[i] ) ){
682 temporary[i2]=0;
683 break;
684 }
685 temporary[i2]=basbuf[i];
686 }
[169]687 if( !importedNamespaces.Imports( temporary ) )
688 {
689 SetError(64,temporary,cp );
690 }
[99]691
[108]692 continue;
693 }
694 else if( basbuf[i] == 1 && basbuf[i+1] == ESC_CLEARNAMESPACEIMPORTED ){
695 importedNamespaces.clear();
696 continue;
697 }
698
[4]699 if(basbuf[i]==1&&basbuf[i+1]==ESC_DECLARE){
700 for(i+=2,i2=0;;i2++,i++){
701 if(basbuf[i]=='\n'){
702 temporary[i2]=0;
703 break;
704 }
705 temporary[i2]=basbuf[i];
706 if(basbuf[i]=='\0') break;
707 }
[100]708 AddDeclareData(namespaceScopes,temporary,i);
[4]709
710 continue;
711 }
712 if(basbuf[i]==1&&(basbuf[i+1]==ESC_SUB||basbuf[i+1]==ESC_FUNCTION||basbuf[i+1]==ESC_MACRO)){
[108]713 char statementChar = basbuf[i+1];
714
[4]715 for(i2=0;;i2++,i++){
716 if(IsCommandDelimitation(basbuf[i])){
717 temporary[i2]=0;
718 break;
719 }
720 temporary[i2]=basbuf[i];
721 if(basbuf[i]=='\0') break;
722 }
[108]723 AddSubData(namespaceScopes, importedNamespaces, temporary,i,0,0);
[4]724
[108]725 /* Sub ~ End Sub
726 Function ~ End Function
727 Macro ~ End Macro
728 を飛び越す */
729 char endStatementChar = GetEndXXXCommand( statementChar );
730 for(i2=0;;i++,i2++){
731 if( basbuf[i] == '\0' ) break;
732 if( basbuf[i] == 1 && basbuf[i+1] == endStatementChar ){
733 i++;
734 break;
735 }
736 }
737 if(basbuf[i]=='\0') break;
[4]738 continue;
739 }
740
741 //次の行
742 for(;;i++){
743 if(IsCommandDelimitation(basbuf[i])) break;
744 }
745 if(basbuf[i]=='\0') break;
746 }
747
748 ////////////
749 // 特殊関数
750 ////////////
[100]751 namespaceScopes.clear();
[108]752 importedNamespaces.clear();
[4]753
754 sprintf(temporary,"%c%c_allrem()",1,ESC_SUB);
[108]755 AddSubData( namespaceScopes, importedNamespaces, temporary,0,0,0);
[4]756
757 sprintf(temporary,"%c%c_aullrem()",1,ESC_SUB);
[108]758 AddSubData( namespaceScopes, importedNamespaces, temporary,0,0,0);
[4]759
760 sprintf(temporary,"%c%c_allmul()",1,ESC_SUB);
[108]761 AddSubData( namespaceScopes, importedNamespaces, temporary,0,0,0);
[4]762
763 sprintf(temporary,"%c%c_alldiv()",1,ESC_SUB);
[108]764 AddSubData( namespaceScopes, importedNamespaces, temporary,0,0,0);
[4]765
766 sprintf(temporary,"%c%c_aulldiv()",1,ESC_SUB);
[108]767 AddSubData( namespaceScopes, importedNamespaces, temporary,0,0,0);
[4]768
769 sprintf(temporary,"%c%c_allshl()",1,ESC_SUB);
[108]770 AddSubData( namespaceScopes, importedNamespaces, temporary,0,0,0);
[4]771
772 sprintf(temporary,"%c%c_allshr()",1,ESC_SUB);
[108]773 AddSubData( namespaceScopes, importedNamespaces, temporary,0,0,0);
[4]774
775 sprintf(temporary,"%c%c_aullshr()",1,ESC_SUB);
[108]776 AddSubData( namespaceScopes, importedNamespaces, temporary,0,0,0);
[4]777
778 sprintf(temporary,"%c%c_System_InitStaticLocalVariables()",1,ESC_SUB);
[108]779 AddSubData( namespaceScopes, importedNamespaces, temporary,0,0,0);
[4]780}
[100]781void Delete_si(GlobalProc *pUserProc){
[75]782 if(pUserProc->pNextData) Delete_si(pUserProc->pNextData);
783 delete pUserProc;
[4]784}
[100]785void DeleteSubInfo(GlobalProc **ppSubHash,char **ppMacroNames,int MacroNum){ //サブルーチン情報のメモリ解放
[4]786 int i;
787 for(i=0;i<MAX_HASH;i++){
788 if(!ppSubHash[i]) continue;
789
790 Delete_si(ppSubHash[i]);
791 }
792 HeapDefaultFree(ppSubHash);
793
794 //マクロの名前リスト
795 if(ppMacroNames){
796 for(i=0;i<MacroNum;i++){
797 HeapDefaultFree(ppMacroNames[i]);
798 }
799 HeapDefaultFree(ppMacroNames);
800 }
801}
[75]802void Delete_di(DllProc *pDllProc){
803 if(pDllProc->pNextData) Delete_di(pDllProc->pNextData);
[4]804
[75]805 delete pDllProc;
[4]806}
807void DeleteDeclareInfo(void){
808 //DLL情報を解放
[75]809 extern DllProc **ppDeclareHash;
[4]810 int i;
811 for(i=0;i<MAX_HASH;i++){
812 if(!ppDeclareHash[i]) continue;
813
814 Delete_di(ppDeclareHash[i]);
815 }
816 HeapDefaultFree(ppDeclareHash);
817}
818
[94]819bool IsNeedProcCompile(){
820 for(int i2=0;i2<MAX_HASH;i2++){
[100]821 extern GlobalProc **ppSubHash;
822 GlobalProc *pUserProc=ppSubHash[i2];
[94]823 while(pUserProc){
824 if( pUserProc->IsUsing() && pUserProc->IsCompiled() == false ){
825 return true;
826 }
827
828 pUserProc=pUserProc->pNextData;
829 }
830 }
831 return false;
832}
Note: See TracBrowser for help on using the repository browser.