source: dev/trunk/abdev/BasicCompiler_Common/Compile.cpp@ 193

Last change on this file since 193 was 193, checked in by dai_9181, 17 years ago
File size: 17.3 KB
Line 
1#include <jenga/include/smoothie/Smoothie.h>
2#include <jenga/include/smoothie/LexicalAnalysis.h>
3#include <jenga/include/smoothie/SmoothieException.h>
4
5#include <LexicalScopingImpl.h>
6#include <CodeGenerator.h>
7#include <Compiler.h>
8
9#include "../BasicCompiler_Common/common.h"
10
11#ifdef _AMD64_
12#include "../BasicCompiler64/opcode.h"
13#else
14#include "../BasicCompiler32/opcode.h"
15#endif
16
17#include <Exception.h>
18
19//ラベルアドレス
20LABEL *pLabelNames;
21int MaxLabelNum;
22
23//Continueアドレス
24DWORD dwContinueAddress;
25
26//Caseスケジュール
27DWORD *pCaseSchedule;
28int CaseScheduleNum;
29int NowCaseSchedule;
30
31//プロシージャ抜け出しスケジュール(Exit Sub/Function)
32DWORD *pExitSubSchedule;
33int ExitSubScheduleNum;
34
35//Goto未知ラベル スケジュール
36GOTOLABELSCHEDULE *pGotoLabelSchedule;
37int GotoLabelScheduleNum;
38
39//グローバル変数初期バッファ
40BYTE *initGlobalBuf;
41
42//With情報
43WITHINFO WithInfo;
44
45
46
47///////////////////////////////////////////////////
48// トークンを取得
49///////////////////////////////////////////////////
50void GetIdentifierToken( char *token, const char *source, int &pos ){
51 for( int i=0; ; i++, pos++ ){
52 if( ! IsVariableChar( source[pos] ) ){
53 token[i] = 0;
54 break;
55 }
56 token[i] = source[pos];
57 }
58}
59
60
61///////////////////////////////////////////////////
62// 対になっているステートメントを飛び越す
63// ※グローバル領域用
64///////////////////////////////////////////////////
65int JumpStatement(const char *source, int &pos){
66 if( source[pos] != 1 ) return 0;
67
68 if( ! IsCommandDelimitation( source[pos - 1] ) ){
69 //直前がコマンド区切りではない場合
70 return 0;
71 }
72
73 char cStatement = source[pos + 1];
74
75 char cEnd = GetEndXXXCommand( cStatement );
76 if( cEnd == 0 ) return 0;
77
78 pos += 2;
79 while( ! ( source[pos] == 1 && source[pos + 1] == cEnd ) ){
80
81 if( source[pos] == '\0' ){
82 char temporary[64];
83 GetDefaultNameFromES( cStatement, temporary );
84 SetError( 22, temporary, pos );
85 return -1;
86 }
87
88 pos++;
89 }
90 if( ! ( source[pos] == '\0' || source[pos + 2] == '\0' ) ){
91 pos += 2;
92 }
93
94 return 1;
95}
96
97
98void NextLine(void){
99 extern HANDLE hHeap;
100 extern int MaxLineInfoNum;
101 extern LINEINFO *pLineInfo;
102 if(MaxLineInfoNum){
103 if(pLineInfo[MaxLineInfoNum-1].TopObp==obp){
104 pLineInfo[MaxLineInfoNum-1].TopCp=cp;
105 return;
106 }
107 }
108 pLineInfo=(LINEINFO *)HeapReAlloc(hHeap,0,pLineInfo,(MaxLineInfoNum+1)*sizeof(LINEINFO));
109 pLineInfo[MaxLineInfoNum].TopCp=cp;
110 pLineInfo[MaxLineInfoNum].TopObp=obp;
111
112 extern BOOL bDebugSupportProc;
113 extern BOOL bSystemProc;
114 pLineInfo[MaxLineInfoNum].dwCodeType=0;
115 if(bDebugSupportProc)
116 pLineInfo[MaxLineInfoNum].dwCodeType|=CODETYPE_DEBUGPROC;
117 if(bSystemProc)
118 pLineInfo[MaxLineInfoNum].dwCodeType|=CODETYPE_SYSTEMPROC;
119
120 MaxLineInfoNum++;
121}
122
123void ChangeOpcode(char *Command){
124 extern HANDLE hHeap;
125 int i,i2;
126
127 if(Command[0]=='\0') return;
128 if(Command[0]=='*'&&IsVariableTopChar(Command[1])){
129 //Goto先ラベル
130 pLabelNames=(LABEL *)HeapReAlloc(hHeap,0,pLabelNames,(MaxLabelNum+1)*sizeof(LABEL));
131 pLabelNames[MaxLabelNum].pName=(char *)HeapAlloc(hHeap,0,lstrlen(Command+1)+1);
132 lstrcpy(pLabelNames[MaxLabelNum].pName,Command+1);
133 pLabelNames[MaxLabelNum].address=obp;
134 MaxLabelNum++;
135
136 //書き込みスケジュール
137 for(i=0;i<GotoLabelScheduleNum;i++){
138 if(lstrcmp(pGotoLabelSchedule[i].pName,Command+1)==0){
139 *((long *)(OpBuffer+pGotoLabelSchedule[i].pos))=obp-(pGotoLabelSchedule[i].pos+sizeof(long));
140
141 HeapDefaultFree(pGotoLabelSchedule[i].pName);
142
143 //詰める
144 GotoLabelScheduleNum--;
145 for(i2=i;i2<GotoLabelScheduleNum;i2++){
146 pGotoLabelSchedule[i2].pName=pGotoLabelSchedule[i2+1].pName;
147 pGotoLabelSchedule[i2].line=pGotoLabelSchedule[i2+1].line;
148 pGotoLabelSchedule[i2].pos=pGotoLabelSchedule[i2+1].pos;
149 }
150 i--;
151 continue;
152 }
153 }
154 return;
155 }
156 if(Command[0]==1){
157 switch(Command[1]){
158 case ESC_CONST:
159 OpcodeDim(Command+2, DIMFLAG_CONST);
160 break;
161
162 case ESC_TYPEDEF:
163 if( UserProc::IsLocalAreaCompiling() ){
164 // ローカル領域をコンパイルしているとき
165 SetError(65,"TypeDef",cp );
166 }
167
168 //既に収集済み
169 break;
170
171 case ESC_STATIC:
172 OpcodeDim(Command+2,DIMFLAG_STATIC);
173 break;
174
175 case ESC_IF:
176 OpcodeIf(Command+2);
177 break;
178 case ESC_EXITWHILE:
179 {
180 CScope *pScope = GetLexicalScopes().SearchScope( SCOPE_TYPE_WHILE );
181 if( !pScope ){
182 SetError(12,"Exit While",cp);
183 return;
184 }
185 pScope->Break();
186 }
187 break;
188 case ESC_EXITFOR:
189 {
190 CScope *pScope = GetLexicalScopes().SearchScope( SCOPE_TYPE_FOR );
191 if( !pScope ){
192 SetError(12,"Exit For",cp);
193 return;
194 }
195 pScope->Break();
196 }
197 break;
198 case ESC_EXITDO:
199 {
200 CScope *pScope = GetLexicalScopes().SearchScope( SCOPE_TYPE_DO );
201 if( !pScope ){
202 SetError(12,"Exit Do",cp);
203 return;
204 }
205 pScope->Break();
206 }
207 break;
208 case ESC_CONTINUE:
209 OpcodeContinue();
210 break;
211
212 case ESC_EXITSUB:
213 case ESC_EXITFUNCTION:
214 case ESC_EXITMACRO:
215 OpcodeExitSub();
216 break;
217
218 case ESC_SELECTCASE:
219 OpcodeSelect(Command+2);
220 break;
221 case ESC_CASE:
222 case ESC_CASEELSE:
223 OpcodeCase(Command+2);
224 break;
225
226 case ESC_WITH:
227 extern WITHINFO WithInfo;
228
229 WithInfo.ppName=(char **)HeapReAlloc(hHeap,0,WithInfo.ppName,(WithInfo.num+1)*sizeof(char **));
230 WithInfo.ppName[WithInfo.num]=(char *)HeapAlloc(hHeap,0,lstrlen(Command+2)+1);
231 lstrcpy(WithInfo.ppName[WithInfo.num],Command+2);
232
233 WithInfo.pWithCp=(int *)HeapReAlloc(hHeap,0,WithInfo.pWithCp,(WithInfo.num+1)*sizeof(int));
234 WithInfo.pWithCp[WithInfo.num]=cp;
235
236 WithInfo.num++;
237 break;
238 case ESC_ENDWITH:
239 if(WithInfo.num<=0){
240 SetError(12,"End With",cp);
241 return;
242 }
243 WithInfo.num--;
244 HeapDefaultFree(WithInfo.ppName[WithInfo.num]);
245 break;
246 case ESC_DECLARE:
247 if( UserProc::IsLocalAreaCompiling() ){
248 // ローカル領域をコンパイルしているとき
249 SetError(65,"Declare",cp );
250 }
251 break;
252
253 case ESC_NAMESPACE:
254 Smoothie::Temp::liveingNamespaceScopes.push_back( Command + 2 );
255 break;
256 case ESC_ENDNAMESPACE:
257 if( Smoothie::Temp::liveingNamespaceScopes.size() <= 0 ){
258 SetError(12,"End Namespace",cp);
259 }
260 Smoothie::Temp::liveingNamespaceScopes.pop_back();
261 break;
262 case ESC_IMPORTS:
263 compiler.ImportsNamespace( Command + 2 );
264 break;
265 case ESC_CLEARNAMESPACEIMPORTED:
266 compiler.GetImportedNamespaces().clear();
267 break;
268
269 //Tryによる例外処理
270 case ESC_TRY:
271 Exception::TryCommand();
272 break;
273 case ESC_CATCH:
274 Exception::CatchCommand();
275 break;
276 case ESC_FINALLY:
277 Exception::FinallyCommand();
278 break;
279 case ESC_ENDTRY:
280 Exception::EndTryCommand();
281 break;
282 case ESC_THROW:
283 Exception::ThrowCommand( Command + 2 );
284 break;
285
286 default:
287 char temporary[64];
288 GetDefaultNameFromES(Command[1],temporary);
289 SetError(30,temporary,cp);
290 break;
291 }
292 return;
293 }
294 switch(MAKEWORD(Command[1],Command[0])){
295 case COM_DIM:
296 OpcodeDim(Command+2,0);
297 break;
298 case COM_DELETE:
299 OpcodeDelete(Command+2, false);
300 break;
301 case COM_SWEEPINGDELETE:
302 OpcodeDelete(Command+2, true);
303 break;
304
305 case COM_GOTO:
306 OpcodeGoto(Command+2);
307 break;
308 case COM_WHILE:
309 OpcodeWhile(Command+2);
310 break;
311 case COM_FOR:
312 OpcodeFor(Command+2);
313 break;
314 case COM_DO:
315 OpcodeDo(Command+2);
316 break;
317
318 case COM_GOSUB:
319 OpcodeGosub(Command+2);
320 break;
321 case COM_RETURN:
322 OpcodeReturn(Command+2);
323 break;
324
325 case COM_SETDOUBLE:
326 OpcodeSetPtrData(Command+2,DEF_DOUBLE);
327 break;
328 case COM_SETSINGLE:
329 OpcodeSetPtrData(Command+2,DEF_SINGLE);
330 break;
331 case COM_SETQWORD:
332 OpcodeSetPtrData(Command+2,DEF_QWORD);
333 break;
334 case COM_SETDWORD:
335 OpcodeSetPtrData(Command+2,DEF_DWORD);
336 break;
337 case COM_SETWORD:
338 OpcodeSetPtrData(Command+2,DEF_WORD);
339 break;
340 case COM_SETBYTE:
341 OpcodeSetPtrData(Command+2,DEF_BYTE);
342 break;
343
344 case COM_DEBUG:
345 extern BOOL bDebugCompile;
346 //int 3
347 if(bDebugCompile) OpBuffer[obp++]=(char)0xCC;
348#if defined(_DEBUG)
349 else OpBuffer[obp++]=(char)0xCC;
350#endif
351 break;
352
353 case COM_LET:
354 OpcodeCalc(Command+2);
355 break;
356 default:
357 OpcodeOthers(Command);
358 break;
359 }
360}
361
362void GetGlobalDataForDll(void){
363 extern char *basbuf;
364 extern HANDLE hHeap;
365 int i2,BufferSize;
366 char *Command;
367 DWORD dwRetCode;
368
369 dwRetCode=0;
370 BufferSize=128;
371 Command=(char *)HeapAlloc(hHeap,0,BufferSize);
372 for(cp++,i2=0;;cp++,i2++){
373 if(i2>=BufferSize){
374 //バッファ領域が足りなくなった場合はバッファを増量する
375 BufferSize+=128;
376 Command=(char *)HeapReAlloc(hHeap,0,Command,BufferSize);
377 }
378 if(basbuf[cp]=='\"'){
379 Command[i2]=basbuf[cp];
380 for(cp++,i2++;;cp++,i2++){
381 if(i2>=BufferSize){
382 //バッファ領域が足りなくなった場合はバッファを増量する
383 BufferSize+=128;
384 Command=(char *)HeapReAlloc(hHeap,0,Command,BufferSize);
385 }
386 Command[i2]=basbuf[cp];
387 if(basbuf[cp]=='\"') break;
388 }
389 continue;
390 }
391 if(IsCommandDelimitation(basbuf[cp])){
392 Command[i2]=0;
393
394 if(Command[0]==1&&Command[1]==ESC_SUB){
395 i2=cp;
396 while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDSUB)){
397 if(basbuf[cp]=='\0'){
398 SetError(22,"Sub",i2);
399 break;
400 }
401 cp++;
402 }
403 if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
404 cp+=2;
405 i2=-1;
406 continue;
407 }
408 if(Command[0]==1&&Command[1]==ESC_FUNCTION){
409 i2=cp;
410 while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDFUNCTION)){
411 if(basbuf[cp]=='\0'){
412 SetError(22,"Function",i2);
413 break;
414 }
415 cp++;
416 }
417 if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
418 cp+=2;
419 i2=-1;
420 continue;
421 }
422 if(Command[0]==1&&Command[1]==ESC_MACRO){
423 i2=cp;
424 while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDMACRO)){
425 if(basbuf[cp]=='\0'){
426 SetError(22,"Macro",i2);
427 break;
428 }
429 cp++;
430 }
431 if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
432 cp+=2;
433 i2=-1;
434 continue;
435 }
436 if(Command[0]==1&&Command[1]==ESC_TYPE){
437 i2=cp;
438 while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDTYPE)){
439 if(basbuf[cp]=='\0'){
440 SetError(22,"Type",i2);
441 break;
442 }
443 cp++;
444 }
445 if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
446 cp+=2;
447 i2=-1;
448 continue;
449 }
450 if(Command[0]==1&&Command[1]==ESC_CLASS){
451 i2=cp;
452 while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDCLASS)){
453 if(basbuf[cp]=='\0'){
454 SetError(22,"Class",i2);
455 break;
456 }
457 cp++;
458 }
459 if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
460 cp+=2;
461 i2=-1;
462 continue;
463 }
464 if(Command[0]==1&&Command[1]==ESC_INTERFACE){
465 i2=cp;
466 while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDINTERFACE)){
467 if(basbuf[cp]=='\0'){
468 SetError(22,"Interface",i2);
469 break;
470 }
471 cp++;
472 }
473 if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
474 cp+=2;
475 i2=-1;
476 continue;
477 }
478
479 //DLLのグローバルデータに必要なコマンドだけ
480 if(MAKEWORD(Command[1],Command[0])==COM_DIM)
481 OpcodeDim(Command+2,0);
482
483 // ネイティブコードバッファの再確保
484 ReallocNativeCodeBuffer();
485
486 if(basbuf[cp]=='\0') break;
487 i2=-1;
488 continue;
489 }
490 Command[i2]=basbuf[cp];
491 }
492 HeapDefaultFree(Command);
493}
494DWORD CompileBuffer(char Return_Sequence,WORD Return_Command){
495 extern char *basbuf;
496 extern HANDLE hHeap;
497 int i,i2,i3,i4,BufferSize,ScopeStart;
498 char *Command,temporary[VN_SIZE],*temp2,temp3[32];
499 DWORD dwRetCode;
500
501 ScopeStart=cp;
502
503 dwRetCode=0;
504 BufferSize=128;
505 Command=(char *)HeapAlloc(hHeap,0,BufferSize);
506
507 for(cp++,i2=0;;cp++,i2++){
508 if(i2>=BufferSize){
509 //バッファ領域が足りなくなった場合はバッファを増量する
510 BufferSize+=128;
511 Command=(char *)HeapReAlloc(hHeap,0,Command,BufferSize);
512 }
513 if(basbuf[cp]=='\"'){
514 Command[i2]=basbuf[cp];
515 for(cp++,i2++;;cp++,i2++){
516 if(i2>=BufferSize){
517 //バッファ領域が足りなくなった場合はバッファを増量する
518 BufferSize+=128;
519 Command=(char *)HeapReAlloc(hHeap,0,Command,BufferSize);
520 }
521 Command[i2]=basbuf[cp];
522 if(basbuf[cp]=='\"') break;
523 }
524 continue;
525 }
526 if(IsCommandDelimitation(basbuf[cp])){
527 Command[i2]=0;
528
529 if(Command[0]==1&&Command[1]==ESC_LINENUM){
530 for(i=2,i2=0;;i++,i2++){
531 if(Command[i]==','){
532 temporary[i2]=0;
533 break;
534 }
535 temporary[i2]=Command[i];
536 }
537 i3=atoi(temporary);
538 i4=i+1;
539
540 //Goto先ラベル
541 pLabelNames=(LABEL *)HeapReAlloc(hHeap,0,pLabelNames,(MaxLabelNum+1)*sizeof(LABEL));
542 pLabelNames[MaxLabelNum].pName=0;
543 pLabelNames[MaxLabelNum].line=i3;
544 pLabelNames[MaxLabelNum].address=obp;
545 MaxLabelNum++;
546
547 //書き込みスケジュール
548 for(i=0;i<GotoLabelScheduleNum;i++){
549 if(pGotoLabelSchedule[i].pName==0&&
550 pGotoLabelSchedule[i].line==i3){
551 *((long *)(OpBuffer+pGotoLabelSchedule[i].pos))=obp-(pGotoLabelSchedule[i].pos+sizeof(long));
552
553 //詰める
554 GotoLabelScheduleNum--;
555 for(i2=i;i2<GotoLabelScheduleNum;i2++){
556 pGotoLabelSchedule[i2].pName=pGotoLabelSchedule[i2+1].pName;
557 pGotoLabelSchedule[i2].line=pGotoLabelSchedule[i2+1].line;
558 pGotoLabelSchedule[i2].pos=pGotoLabelSchedule[i2+1].pos;
559 }
560 i--;
561 }
562 }
563
564 temp2=(char *)HeapAlloc(hHeap,0,lstrlen(Command+i4)+1);
565 lstrcpy(temp2,Command+i4);
566 lstrcpy(Command,temp2);
567 HeapDefaultFree(temp2);
568 }
569
570 if(Command[0]==1&&
571 (((Command[1]==ESC_VIRTUAL||Command[1]==ESC_OVERRIDE)&&Command[2]==1&&(Command[3]==ESC_SUB||Command[3]==ESC_FUNCTION))||
572 Command[1]==ESC_SUB||
573 Command[1]==ESC_FUNCTION||
574 Command[1]==ESC_MACRO||
575 Command[1]==ESC_TYPE||
576 Command[1]==ESC_CLASS||
577 Command[1]==ESC_INTERFACE||
578 Command[1]==ESC_ENUM||
579 (Command[1]==ESC_CONST&&Command[2]==1&&Command[3]==ESC_ENUM)
580 )
581 ){
582 if(Command[1]==ESC_VIRTUAL||Command[1]==ESC_OVERRIDE||Command[1]==ESC_CONST){
583 GetDefaultNameFromES(Command[3],temporary);
584 }
585 else{
586 GetDefaultNameFromES(Command[1],temporary);
587 }
588 if(Return_Sequence){
589 SetError(12,temporary,cp);
590 break;
591 }
592
593 if(Command[1]==ESC_CONST) i3=GetEndXXXCommand(Command[3]);
594 else i3=GetEndXXXCommand(Command[1]);
595 for(i2=cp;;cp++){
596 if(basbuf[cp]==1){
597 if(basbuf[cp+1]==i3) break;
598 if(Command[1]==ESC_CLASS||Command[1]==ESC_INTERFACE){
599 //クラス、インターフェイスではSub、Functionの定義を可能にしておく
600 if(basbuf[cp+1]==ESC_MACRO||
601 basbuf[cp+1]==ESC_TYPE||
602 basbuf[cp+1]==ESC_CLASS||
603 basbuf[cp+1]==ESC_INTERFACE||
604 basbuf[cp+1]==ESC_ENUM){
605 GetDefaultNameFromES(basbuf[cp+1],temp3);
606 SetError(12,temp3,cp);
607 }
608 }
609 else{
610 if(basbuf[cp-1]!='*'&&(
611 basbuf[cp+1]==ESC_VIRTUAL||
612 basbuf[cp+1]==ESC_OVERRIDE||
613 basbuf[cp+1]==ESC_SUB||
614 basbuf[cp+1]==ESC_FUNCTION||
615 basbuf[cp+1]==ESC_MACRO||
616 basbuf[cp+1]==ESC_TYPE||
617 basbuf[cp+1]==ESC_CLASS||
618 basbuf[cp+1]==ESC_INTERFACE||
619 basbuf[cp+1]==ESC_ENUM)){
620 GetDefaultNameFromES(basbuf[cp+1],temp3);
621 SetError(12,temp3,cp);
622 }
623 }
624 }
625 if(basbuf[cp]=='\0'){
626 //error
627 //既にエラー発行済みのため、何もせずに抜ける
628 break;
629 }
630 }
631 if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
632 cp+=2;
633 i2=-1;
634 continue;
635 }
636
637 if(Command[0]==0x10||Command[0]==0x11){
638 //Wend、Next、Loopなど
639 if(Return_Command==MAKEWORD(Command[1],Command[0])){
640 if(Return_Command==COM_NEXT){
641 //Nextの場合は、パラメータ(省略化)の整合性を判断する必要がある(OpcodeFor関数を参照)
642 extern char szNextVariable[VN_SIZE];
643 if(Command[2]) lstrcpy(szNextVariable,Command+2);
644 else szNextVariable[0]=0;
645 }
646 break;
647 }
648 }
649
650 NextLine();
651
652 if(Command[0]==1){
653 if(Return_Sequence==ESC_ENDIF&&Command[1]==ESC_ELSE){
654 dwRetCode=ESC_ELSE;
655 break;
656 }
657
658 if(Command[1]==Return_Sequence){
659 dwRetCode=Command[1];
660 break;
661 }
662 }
663
664 try
665 {
666 ChangeOpcode(Command);
667 }
668 catch( const SmoothieException &smoothieException )
669 {
670 SetError(
671 smoothieException.GetErrorCode(),
672 smoothieException.GetKeyword(),
673 smoothieException.GetNowLine()
674 );
675 }
676
677#ifdef _DEBUG
678 epi_check();
679#endif
680
681 //コンパイルを中断するとき
682 extern BOOL bStopCompile;
683 if(bStopCompile) return 0;
684
685 ReallocNativeCodeBuffer();
686
687 if(basbuf[cp]=='\0'){
688 switch(Return_Command){
689 case COM_WEND:
690 SetError(4,"\"While\" - \"Wend\" ",ScopeStart);
691 break;
692 case COM_NEXT:
693 SetError(4,"\"For\" - \"Next\" ",ScopeStart);
694 break;
695 case COM_LOOP:
696 SetError(4,"\"Do\" - \"Loop\" ",ScopeStart);
697 break;
698 }
699 switch(Return_Sequence){
700 case ESC_ENDSUB:
701 SetError(4,"\"Sub\" - \"End Sub\" ",ScopeStart);
702 break;
703 case ESC_ENDFUNCTION:
704 SetError(4,"\"Function\" - \"End Function\" ",ScopeStart);
705 break;
706 case ESC_ENDMACRO:
707 SetError(4,"\"Macro\" - \"End Macro\" ",ScopeStart);
708 break;
709 case ESC_ENDIF:
710 SetError(22,"If",ScopeStart);
711 break;
712 }
713 break;
714 }
715 i2=-1;
716 continue;
717 }
718 Command[i2]=basbuf[cp];
719 }
720 HeapDefaultFree(Command);
721
722 return dwRetCode;
723}
Note: See TracBrowser for help on using the repository browser.