source: dev/BasicCompiler_Common/Intermediate_Step1.cpp@ 54

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

DeclareのLib、AliasにConst定義された文字列定数を指定できるようにした。

File size: 27.7 KB
Line 
1#include "../BasicCompiler_Common/common.h"
2
3void ChangeReturnCode(char *buffer){
4 //改行コードのCRLFをLFに変換
5 int i,i2;
6 for(i=0,i2=0;;i++,i2++){
7 if(buffer[i]=='\r'&&buffer[i+1]=='\n') i++;
8 buffer[i2]=buffer[i];
9 if(buffer[i]=='\0') break;
10 }
11}
12void DeleteComment(char *buffer){ //注釈「'」の取り除き
13 int i,i2,i3,IsStr;
14 char *temporary;
15 temporary=(char *)GlobalAlloc(GMEM_FIXED,lstrlen(buffer)+1);
16 for(i=0,i2=0,i3=0,IsStr=0;;i++,i2++){
17 if(buffer[i]=='\"') IsStr^=1;
18 if(buffer[i]=='\n'||buffer[i]=='\0'){
19 i2--;
20 while(temporary[i2]==' '||temporary[i2]=='\t') i2--;
21 i2++;
22
23 if(i3){
24 //複数行に渡る注釈文の中に改行が存在するとき
25 memset(temporary+i2,'\n',i3);
26 i2+=i3;
27 i3=0;
28 }
29 }
30 if(buffer[i]=='\''&&IsStr==0){
31 //注釈文
32 i2--;
33 while(temporary[i2]==' '||temporary[i2]=='\t') i2--;
34 i2++;
35 while(buffer[i]!='\n'&&buffer[i]!='\0') i++;
36 }
37 if(buffer[i]=='/'&&buffer[i+1]=='*'&&IsStr==0){
38 //注釈文(複数行)
39 i+=2;
40 i3=0;
41 while(!(buffer[i]=='*'&&buffer[i+1]=='/')){
42 if(buffer[i]=='\n') i3++;
43 if(buffer[i]=='\0') break;
44 i++;
45 }
46 if(buffer[i]){
47 i+=2;
48 }
49 i--;
50 i2--;
51 continue;
52 }
53 temporary[i2]=buffer[i];
54 if(buffer[i]=='\0') break;
55 }
56 lstrcpy(buffer,temporary);
57 GlobalFree(temporary);
58}
59int KillReturnCode_InParameter(char *buffer,int *pRnum,char cBeginPare,char cEndPare){
60 int i,i2,i3,IsStr;
61
62 //カッコ'('直下の改行
63 while(buffer[0]=='\n'){
64 SlideString(buffer+1,-1);
65 (*pRnum)++;
66 }
67
68 for(i=0,IsStr=0;;i++){
69 if(IsDBCSLeadByte(buffer[i])&&buffer[i+1]){
70 i++;
71 continue;
72 }
73
74 if(buffer[i]=='\"') IsStr^=1;
75
76 if(buffer[i]=='\0') break; //エラー
77 if(buffer[i]=='\n'){
78 i2=0;
79 i3=0;
80 while(buffer[i+i2]=='\n'){
81 i2++;
82 i3++;
83 while(buffer[i+i2]==' '||buffer[i+i2]=='\t') i2++;
84 }
85 while(buffer[i+i2]==' '||buffer[i+i2]=='\t') i2++;
86
87 if(buffer[i+i2]==cEndPare){
88 SlideString(buffer+i+i2,-i2);
89 (*pRnum)+=i3;
90 break;
91 }
92
93 //エラー
94 break;
95 }
96
97 if(buffer[i]==cBeginPare&&IsStr==0){
98 i++;
99 i2=KillReturnCode_InParameter(buffer+i,pRnum,cBeginPare,cEndPare);
100 i+=i2;
101 if(buffer[i]!=cEndPare) break;
102 continue;
103 }
104 if(buffer[i]==cEndPare&&IsStr==0) break;
105
106 if(buffer[i]==','&&buffer[i+1]=='\n'&&IsStr==0){
107 i++;
108 while(buffer[i]=='\n'){
109 SlideString(buffer+i+1,-1);
110 (*pRnum)++;
111 }
112 i--;
113 }
114 }
115 return i;
116}
117void KillReturnCode(char *buffer){
118 int i,i2;
119
120 //アンダーバーによる改行
121 for(i=0;;i++){
122 i2=0;
123 while(buffer[i]=='_'&&buffer[i+1]=='\n'){
124 i2++;
125 SlideString(buffer+i+2,-2);
126 while(buffer[i]=='\n'){
127 SlideString(buffer+i+1,-1);
128 i2++;
129 }
130 for(;;i++){
131 if(buffer[i]=='_'&&buffer[i+1]=='\n') break;
132 if(buffer[i]=='\n'||buffer[i]=='\0'){
133 SlideString(buffer+i,i2);
134 memset(buffer+i,'\n',i2);
135 break;
136 }
137 }
138 }
139 if(buffer[i]=='\0') break;
140 }
141
142 //カッコ内パラメータの改行
143 int IsStr,rnum;
144 for(i=0,IsStr=0,rnum=0;;i++){
145 if(IsDBCSLeadByte(buffer[i])&&buffer[i+1]){
146 i++;
147 continue;
148 }
149 if(buffer[i]=='\0') break;
150 if(buffer[i]=='\n'){
151 if(rnum){
152 SlideString(buffer+i+1,rnum);
153 memset(buffer+i+1,'\n',rnum);
154 rnum=0;
155 }
156 }
157 if(buffer[i]=='\"') IsStr^=1;
158 if(buffer[i]=='('&&IsStr==0){
159 i++;
160 i2=KillReturnCode_InParameter(buffer+i,&rnum,'(',')');
161 i+=i2;
162 if(buffer[i]!=')') break;
163 }
164 if(buffer[i]=='['&&IsStr==0){
165 i++;
166 i2=KillReturnCode_InParameter(buffer+i,&rnum,'[',']');
167 i+=i2;
168 if(buffer[i]!=']') break;
169 }
170 }
171}
172void CheckParenthesis(char *buffer){
173 int i,IsStr,PareNum,sw;
174 _int8 bracket[1024];
175
176 for(i=0,IsStr=0,PareNum=0,sw=0;;i++){
177 if(buffer[i]=='\"'){
178 IsStr^=1;
179 continue;
180 }
181
182 else if(buffer[i]=='('&&IsStr==0){
183 bracket[PareNum]=0;
184 PareNum++;
185 }
186 else if(buffer[i]=='['&&IsStr==0){
187 bracket[PareNum]=1;
188 PareNum++;
189 }
190
191 else if(buffer[i]==')'&&IsStr==0){
192 PareNum--;
193 if(bracket[PareNum]!=0||PareNum<0){
194 //"カッコ \'( )\'"
195 SetError(4,STRING_PARENTHESIS,i);
196 return;
197 }
198 }
199 else if(buffer[i]==']'&&IsStr==0){
200 PareNum--;
201 if(bracket[PareNum]!=1||PareNum<0){
202 //"カッコ \'( )\'"
203 SetError(4,STRING_PARENTHESIS,i);
204 return;
205 }
206 }
207
208 else if(buffer[i]=='\n'||buffer[i]=='\0'){
209
210 //"カッコ \'( )\'"
211 if(PareNum!=0) SetError(4,STRING_PARENTHESIS,i);
212
213 if(IsStr!=0) SetError(5,NULL,i);
214 if(buffer[i]=='\0') break;
215 PareNum=0;
216 IsStr=0;
217
218 sw=0;
219 }
220
221 else if((IsDBCSLeadByte(buffer[i])||buffer[i]==1)&&IsStr==0){
222 //不正な文字コード
223 if(sw==0){
224 //全角スペース
225 if(buffer[i]==(char)0x81&&buffer[i+1]==(char)0x40)
226 SetError(20,NULL,i);
227
228 //その他の全角文字
229 else SetError(8,NULL,i);
230 sw=1;
231 }
232 }
233 }
234}
235BOOL CheckParenthesis2(char *buffer){
236 int i,IsStr,PareNum,sw;
237 _int8 bracket[1024];
238
239 for(i=0,IsStr=0,PareNum=0,sw=0;;i++){
240 if(buffer[i]=='\"'){
241 IsStr^=1;
242 continue;
243 }
244
245 else if(buffer[i]=='('&&IsStr==0){
246 bracket[PareNum]=0;
247 PareNum++;
248 }
249 else if(buffer[i]=='['&&IsStr==0){
250 bracket[PareNum]=1;
251 PareNum++;
252 }
253
254 else if(buffer[i]==')'&&IsStr==0){
255 PareNum--;
256 if(bracket[PareNum]!=0||PareNum<0){
257 //"カッコ \'( )\'"
258 return 0;
259 }
260 }
261 else if(buffer[i]==']'&&IsStr==0){
262 PareNum--;
263 if(bracket[PareNum]!=1||PareNum<0){
264 //"カッコ \'( )\'"
265 return 0;
266 }
267 }
268
269 else if(buffer[i]=='\n'||buffer[i]=='\0'){
270
271 //"カッコ \'( )\'"
272 if(PareNum!=0){
273 return 0;
274 }
275
276 if(IsStr!=0){
277 return 0;
278 }
279 if(buffer[i]=='\0') break;
280 PareNum=0;
281 IsStr=0;
282
283 sw=0;
284 }
285
286 else if((IsDBCSLeadByte(buffer[i])||buffer[i]==1)&&IsStr==0){
287 //不正な文字コード
288 if(sw==0){
289 //全角スペース
290 if(buffer[i]==(char)0x81&&buffer[i+1]==(char)0x40){
291 return 0;
292 }
293
294 //その他の全角文字
295 else return 0;
296 sw=1;
297 }
298 }
299 }
300 return 1;
301}
302void DirectiveCheck(void){
303 extern char *basbuf;
304 extern char BasicCurDir[MAX_PATH];
305 int i,i2,i3;
306 char temporary[VN_SIZE];
307
308 extern BOOL bStrict;
309 bStrict=0;
310
311 for(i=0;;i++){
312 if(basbuf[i]=='\0') break;
313 if(((basbuf[i-2]==0&&basbuf[i-1]==-1)||basbuf[i-1]=='\n')&&
314 basbuf[i]=='#'){
315 for(i2=i+1,i3=0;;i2++,i3++){
316 if(!IsVariableChar(basbuf[i2])){
317 temporary[i3]=0;
318 break;
319 }
320 temporary[i3]=basbuf[i2];
321 }
322 if(lstrcmpi(temporary,"noprompt")==0){
323 //#noprompt
324 //旧機能なので、無視
325 for(;;i2++){
326 if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
327 }
328 SlideString(basbuf+i2,i-i2);
329 }
330 else if(lstrcmpi(temporary,"strict")==0){
331 //#strict
332 for(;;i2++){
333 if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
334 }
335 SlideString(basbuf+i2,i-i2);
336
337 //型チェックを厳密に行う
338 bStrict=1;
339 }
340 else if(lstrcmpi(temporary,"struct")==0){
341 //#struct code
342 //旧機能なので、無視
343 for(;;i2++){
344 if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
345 }
346 SlideString(basbuf+i2,i-i2);
347 }
348 else if(lstrcmpi(temporary,"resource")==0){
349 //#resource
350 while(basbuf[i2]==' '||basbuf[i2]=='\t') i2++;
351 if(basbuf[i2]!='\"'){
352 SetError(1,NULL,i2);
353 return;
354 }
355 for(i3=0,i2++;;i2++,i3++){
356 if(basbuf[i2]=='\"'){
357 temporary[i3]=0;
358 break;
359 }
360 temporary[i3]=basbuf[i2];
361 }
362 GetFullPath(temporary,BasicCurDir);
363
364 extern char ResourceFileName[MAX_PATH];
365 lstrcpy(ResourceFileName,temporary);
366
367 for(;;i2++){
368 if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
369 }
370 SlideString(basbuf+i2,i-i2);
371 }
372 }
373 }
374}
375void NextCommandFormat(char *buffer){
376 int i,i2,i3;
377 char temporary[255];
378
379 //Next命令語のフォーマット
380 for(i=0;;i++){
381 if(buffer[i]=='\n'||buffer[i]==':'||i==0){
382 if(buffer[i]=='\n'||buffer[i]==':') i++;
383 while(buffer[i]==' '||buffer[i]=='\t') i++;
384 while(buffer[i]>='0'&&buffer[i]<='9') i++;
385 while(buffer[i]==' '||buffer[i]=='\t') i++;
386 if((buffer[i]=='n'||buffer[i]=='N')&&(buffer[i+1]=='e'||buffer[i+1]=='E')&&(buffer[i+2]=='x'||buffer[i+2]=='X')&&(buffer[i+3]=='t'||buffer[i+3]=='T')&&
387 (buffer[i+4]==' '||buffer[i+4]=='\t')){
388 i2=i+5;
389 while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
390 if(buffer[i2]!='\n'){
391 lstrcpy(temporary,"NEXT");
392 for(i3=0;;i2++){
393 if(buffer[i2]=='\n'||buffer[i2]==':'||buffer[i2]=='\0') break;
394 if(buffer[i2]==','){
395 lstrcat(temporary,":NEXT");
396 i3=1;
397 }
398 }
399 if(i3){
400 i3=lstrlen(temporary);
401 SlideString(buffer+i2,i-i2+i3);
402 memcpy(buffer+i,temporary,i3);
403 }
404 }
405 }
406 }
407 if(buffer[i]=='\0') break;
408 }
409}
410void SetEscapeSequenceFormat(char *buffer){
411 /*「MOD」「AND」「OR」
412 その他制御文字をエスケープシーケンスを使用した記号へ変換 */
413 int i,i2,i3,i4,i5,i6,sw1,IsStr;
414 char *temporary,temp2[VN_SIZE];
415
416 temporary=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,lstrlen(buffer)*2);
417 for(i=0,i2=0,IsStr=0;;i++,i2++){
418 if(buffer[i]=='\"') IsStr^=1;
419 if(buffer[i]=='-'&&buffer[i+1]=='>'&&IsStr==0){
420 buffer[i]=1;
421 buffer[i+1]=ESC_PSMEM;
422 }
423 if(IsVariableChar(buffer[i])&&IsStr==0){
424 i3=i2;
425 for(;;i++,i2++){
426 if(!IsVariableChar(buffer[i])){
427 temporary[i2]=0;
428 break;
429 }
430 temporary[i2]=buffer[i];
431 }
432 if(lstrcmpi(temporary+i3,"End")==0) i6=1;
433 else if(lstrcmpi(temporary+i3,"Exit")==0) i6=2;
434 else if(lstrcmpi(temporary+i3,"Select")==0) i6=3;
435 else if(lstrcmpi(temporary+i3,"Case")==0) i6=4;
436 else if(lstrcmpi(temporary+i3,"Else")==0) i6=5;
437 else i6=0;
438 if(i6){
439 i4=i;
440 while(buffer[i4]==' '||buffer[i4]=='\t') i4++;
441 for(i5=0;;i4++,i5++){
442 if(!IsVariableChar(buffer[i4])){
443 temp2[i5]=0;
444 break;
445 }
446 temp2[i5]=buffer[i4];
447 }
448 sw1=0;
449 if(i6==3){
450 //Select~
451 if(lstrcmpi(temp2,"Case")==0) sw1=1;
452 }
453 else if(i6==4){
454 //Case~
455 if(lstrcmpi(temp2,"Else")==0) sw1=1;
456 }
457 else if(i6==5){
458 //Else If
459 if(lstrcmpi(temp2,"If")==0) sw1=1;
460 }
461 else if(i6==1){
462 //End~
463 switch(temp2[0]){
464 case 'c':
465 case 'C':
466 if(lstrcmpi(temp2,"Class")==0) sw1=1;
467 break;
468 case 'e':
469 case 'E':
470 if(lstrcmpi(temp2,"Enum")==0) sw1=1;
471 break;
472 case 'i':
473 case 'I':
474 if(lstrcmpi(temp2,"If")==0) sw1=1;
475 else if(lstrcmpi(temp2,"Interface")==0) sw1=1;
476 break;
477 case 'f':
478 case 'F':
479 if(lstrcmpi(temp2,"Function")==0) sw1=1;
480 break;
481 case 'm':
482 case 'M':
483 if(lstrcmpi(temp2,"Macro")==0) sw1=1;
484 break;
485 case 's':
486 case 'S':
487 if(lstrcmpi(temp2,"Sub")==0) sw1=1;
488 else if(lstrcmpi(temp2,"Select")==0) sw1=1;
489 break;
490 case 't':
491 case 'T':
492 if(lstrcmpi(temp2,"Type")==0) sw1=1;
493 break;
494 case 'w':
495 case 'W':
496 if(lstrcmpi(temp2,"With")==0) sw1=1;
497 break;
498 }
499 }
500 else if(i6==2){
501 //Exit~
502 if(
503 lstrcmpi(temp2,"For")==0||
504 lstrcmpi(temp2,"While")==0||
505 lstrcmpi(temp2,"Do")==0||
506 lstrcmpi(temp2,"Function")==0||
507 lstrcmpi(temp2,"Sub")==0||
508 lstrcmpi(temp2,"Macro")==0
509 ) sw1=1;
510 }
511
512 if(sw1){
513 i=i4;
514 memcpy(temporary+i2,temp2,i5);
515 i2+=i5;
516 temporary[i2]=0;
517 }
518 }
519 i--;
520 i2--;
521
522 switch(temporary[i3]){
523 case 'a':
524 case 'A':
525 if(lstrcmpi(temporary+i3,"And")==0){
526 i2=i3;
527 temporary[i2++]=1;
528 temporary[i2]=ESC_AND;
529 }
530 else if(lstrcmpi(temporary+i3,"Abstract")==0){
531 i2=i3;
532 temporary[i2++]=1;
533 temporary[i2]=ESC_ABSTRACT;
534 }
535 else if(lstrcmpi(temporary+i3,"As")==0){
536 i2=i3;
537 temporary[i2++]=1;
538 temporary[i2]=ESC_AS;
539 }
540 break;
541 case 'b':
542 case 'B':
543 if(lstrcmpi(temporary+i3,"ByVal")==0){
544 i2=i3;
545 temporary[i2++]=1;
546 temporary[i2]=ESC_BYVAL;
547 }
548 else if(lstrcmpi(temporary+i3,"ByRef")==0){
549 i2=i3;
550 temporary[i2++]=1;
551 temporary[i2]=ESC_BYREF;
552 }
553 break;
554 case 'c':
555 case 'C':
556 if(lstrcmpi(temporary+i3,"Catch")==0){
557 i2=i3;
558 temporary[i2++]=1;
559 temporary[i2]=ESC_CATCH;
560 }
561 else if(lstrcmpi(temporary+i3,"Continue")==0){
562 i2=i3;
563 temporary[i2++]=1;
564 temporary[i2]=ESC_CONTINUE;
565 }
566 else if(lstrcmpi(temporary+i3,"cdecl")==0){
567 i2=i3;
568 temporary[i2++]=1;
569 temporary[i2]=ESC_CDECL;
570 }
571 else if(lstrcmpi(temporary+i3,"Case")==0){
572 i2=i3;
573 temporary[i2++]=1;
574 temporary[i2]=ESC_CASE;
575 }
576 else if(lstrcmpi(temporary+i3,"CaseElse")==0){
577 i2=i3;
578 temporary[i2++]=1;
579 temporary[i2]=ESC_CASEELSE;
580 }
581 else if(lstrcmpi(temporary+i3,"Const")==0){
582 i2=i3;
583 temporary[i2++]=1;
584 temporary[i2]=ESC_CONST;
585 }
586 else if(lstrcmpi(temporary+i3,"Class")==0){
587 i2=i3;
588 temporary[i2++]=1;
589 temporary[i2]=ESC_CLASS;
590 }
591 break;
592 case 'd':
593 case 'D':
594 if(lstrcmpi(temporary+i3,"Declare")==0){
595 i2=i3;
596 int i9=i2;
597 temporary[i2]=1;
598 temporary[++i2]=ESC_DECLARE;
599 i++;
600 while(buffer[i]==' '||buffer[i]=='\t') i++;
601
602 // Sub/Function
603 for(i4=0;;i++,i4++){
604 if(!IsVariableChar(buffer[i])){
605 temp2[i4]=0;
606 break;
607 }
608 temp2[i4]=buffer[i];
609 }
610 if(lstrcmpi(temp2,"Sub")==0) temporary[++i2]=ESC_SUB;
611 else if(lstrcmpi(temp2,"Function")==0) temporary[++i2]=ESC_FUNCTION;
612 while(buffer[i]==' '||buffer[i]=='\t') i++;
613
614 // 関数名
615 for(i2++;;i++,i2++){
616 if(!IsVariableChar(buffer[i])){
617 i2--;
618 break;
619 }
620 temporary[i2]=buffer[i];
621 }
622 while(buffer[i]==' '||buffer[i]=='\t') i++;
623
624 for(i4=0;;i++,i4++){
625 if(!IsVariableChar(buffer[i])){
626 temp2[i4]=0;
627 break;
628 }
629 temp2[i4]=buffer[i];
630 }
631 if(lstrcmpi(temp2,"cdecl")==0){
632 temporary[++i2]=1;
633 temporary[++i2]=ESC_CDECL;
634
635 while(buffer[i]==' '||buffer[i]=='\t') i++;
636 for(i4=0;;i++,i4++){
637 if(!IsVariableChar(buffer[i])){
638 temp2[i4]=0;
639 break;
640 }
641 temp2[i4]=buffer[i];
642 }
643 }
644 if(lstrcmpi(temp2,"Lib")==0) temporary[++i2]=',';
645 while(buffer[i]==' '||buffer[i]=='\t') i++;
646
647 if(buffer[i]=='\"'){
648 temporary[++i2]=buffer[i];
649 for(i++,i2++;;i++,i2++){
650 temporary[i2]=buffer[i];
651 if(buffer[i]=='\"'){
652 i++;
653 break;
654 }
655 if(buffer[i]=='\0') break;
656 }
657 }
658 else{
659 for(i2++;;i++,i2++){
660 if(!IsVariableChar(buffer[i])){
661 i2--;
662 break;
663 }
664 temporary[i2]=buffer[i];
665 }
666 }
667 while(buffer[i]==' '||buffer[i]=='\t') i++;
668
669 temporary[++i2]=',';
670
671 if( memicmp( buffer + i, "Alias", 5 ) ==0 ){
672 i+=5;
673 for(i++,i2++;;i++,i2++){
674 temporary[i2]=buffer[i];
675 if(buffer[i]=='('){
676 i2--;
677 break;
678 }
679 if(buffer[i]=='\0') break;
680 }
681 }
682
683 temporary[++i2]=',';
684
685 i--;
686 }
687 else if(lstrcmpi(temporary+i3,"Def")==0){
688 i2=i3;
689 temporary[i2++]=1;
690 temporary[i2]=ESC_DEF;
691 }
692 break;
693 case 'e':
694 case 'E':
695 if(lstrcmpi(temporary+i3,"ElseIf")==0){
696 i2=i3;
697 temporary[i2++]=1;
698 temporary[i2]=ESC_ELSEIF;
699 }
700 else if(lstrcmpi(temporary+i3,"Else")==0){
701 i2=i3;
702 temporary[i2++]=1;
703 temporary[i2]=ESC_ELSE;
704 }
705 else if(lstrcmpi(temporary+i3,"Export")==0){
706 i2=i3;
707 temporary[i2++]=1;
708 temporary[i2]=ESC_EXPORT;
709 }
710 else if(lstrcmpi(temporary+i3,"Enum")==0){
711 i2=i3;
712 temporary[i2++]=1;
713 temporary[i2]=ESC_ENUM;
714 }
715
716 else if(temporary[i3+1]=='n'||temporary[i3+1]=='N'){
717 //終了記述
718 if(lstrcmpi(temporary+i3,"EndIf")==0){
719 i2=i3;
720 temporary[i2++]=1;
721 temporary[i2]=ESC_ENDIF;
722 }
723 else if(lstrcmpi(temporary+i3,"EndFunction")==0){
724 i2=i3;
725 temporary[i2++]=1;
726 temporary[i2]=ESC_ENDFUNCTION;
727 }
728 else if(lstrcmpi(temporary+i3,"EndSub")==0){
729 i2=i3;
730 temporary[i2++]=1;
731 temporary[i2]=ESC_ENDSUB;
732 }
733 else if(lstrcmpi(temporary+i3,"EndMacro")==0){
734 i2=i3;
735 temporary[i2++]=1;
736 temporary[i2]=ESC_ENDMACRO;
737 }
738 else if(lstrcmpi(temporary+i3,"EndClass")==0){
739 i2=i3;
740 temporary[i2++]=1;
741 temporary[i2]=ESC_ENDCLASS;
742 }
743 else if(lstrcmpi(temporary+i3,"EndInterface")==0){
744 i2=i3;
745 temporary[i2++]=1;
746 temporary[i2]=ESC_ENDINTERFACE;
747 }
748 else if(lstrcmpi(temporary+i3,"EndTry")==0){
749 i2=i3;
750 temporary[i2++]=1;
751 temporary[i2]=ESC_ENDTRY;
752 }
753 else if(lstrcmpi(temporary+i3,"EndType")==0){
754 i2=i3;
755 temporary[i2++]=1;
756 temporary[i2]=ESC_ENDTYPE;
757 }
758 else if(lstrcmpi(temporary+i3,"EndEnum")==0){
759 i2=i3;
760 temporary[i2++]=1;
761 temporary[i2]=ESC_ENDENUM;
762 }
763 else if(lstrcmpi(temporary+i3,"EndSelect")==0){
764 i2=i3;
765 temporary[i2++]=1;
766 temporary[i2]=ESC_ENDSELECT;
767 }
768 else if(lstrcmpi(temporary+i3,"EndWith")==0){
769 i2=i3;
770 temporary[i2++]=1;
771 temporary[i2]=ESC_ENDWITH;
772 }
773 }
774 else if(temporary[i3+1]=='x'||temporary[i3+1]=='X'){
775 if(lstrcmpi(temporary+i3,"ExitFor")==0){
776 i2=i3;
777 temporary[i2++]=1;
778 temporary[i2]=ESC_EXITFOR;
779 }
780 else if(lstrcmpi(temporary+i3,"ExitWhile")==0){
781 i2=i3;
782 temporary[i2++]=1;
783 temporary[i2]=ESC_EXITWHILE;
784 }
785 else if(lstrcmpi(temporary+i3,"ExitDo")==0){
786 i2=i3;
787 temporary[i2++]=1;
788 temporary[i2]=ESC_EXITDO;
789 }
790 else if(lstrcmpi(temporary+i3,"ExitFunction")==0){
791 i2=i3;
792 temporary[i2++]=1;
793 temporary[i2]=ESC_EXITFUNCTION;
794 }
795 else if(lstrcmpi(temporary+i3,"ExitSub")==0){
796 i2=i3;
797 temporary[i2++]=1;
798 temporary[i2]=ESC_EXITSUB;
799 }
800 else if(lstrcmpi(temporary+i3,"ExitMacro")==0){
801 i2=i3;
802 temporary[i2++]=1;
803 temporary[i2]=ESC_EXITMACRO;
804 }
805 }
806 break;
807 case 'f':
808 case 'F':
809 if(lstrcmpi(temporary+i3,"Finally")==0){
810 i2=i3;
811 temporary[i2++]=1;
812 temporary[i2]=ESC_FINALLY;
813 }
814 else if(lstrcmpi(temporary+i3,"Function")==0){
815 i2=i3;
816 temporary[i2++]=1;
817 temporary[i2]=ESC_FUNCTION;
818 }
819 break;
820 case 'i':
821 case 'I':
822 if(lstrcmpi(temporary+i3,"If")==0){
823 i2=i3;
824 temporary[i2++]=1;
825 temporary[i2]=ESC_IF;
826 }
827 else if(lstrcmpi(temporary+i3,"Inherits")==0){
828 i2=i3;
829 temporary[i2++]=1;
830 temporary[i2]=ESC_INHERITS;
831 }
832 else if(lstrcmpi(temporary+i3,"Interface")==0){
833 i2=i3;
834 temporary[i2++]=1;
835 temporary[i2]=ESC_INTERFACE;
836 }
837 break;
838 case 'm':
839 case 'M':
840 if(lstrcmpi(temporary+i3,"Mod")==0){
841 i2=i3;
842 temporary[i2++]=1;
843 temporary[i2]=ESC_MOD;
844 }
845 else if(lstrcmpi(temporary+i3,"Macro")==0){
846 i2=i3;
847 temporary[i2++]=1;
848 temporary[i2]=ESC_MACRO;
849 }
850 break;
851 case 'n':
852 case 'N':
853 if(lstrcmpi(temporary+i3,"Not")==0){
854 i2=i3;
855 temporary[i2++]=1;
856 temporary[i2]=ESC_NOT;
857 }
858 else if(lstrcmpi(temporary+i3,"New")==0){
859 i2=i3;
860 temporary[i2++]=1;
861 temporary[i2]=ESC_NEW;
862 }
863 break;
864 case 'o':
865 case 'O':
866 if(lstrcmpi(temporary+i3,"Or")==0){
867 i2=i3;
868 temporary[i2++]=1;
869 temporary[i2]=ESC_OR;
870 }
871 else if(lstrcmpi(temporary+i3,"Override")==0){
872 i2=i3;
873 temporary[i2++]=1;
874 temporary[i2]=ESC_OVERRIDE;
875 }
876 else if(lstrcmpi(temporary+i3,"Operator")==0){
877 i2=i3;
878 temporary[i2++]=1;
879 temporary[i2]=ESC_OPERATOR;
880 }
881 break;
882 case 's':
883 case 'S':
884 if(lstrcmpi(temporary+i3,"Sub")==0){
885 i2=i3;
886 temporary[i2++]=1;
887 temporary[i2]=ESC_SUB;
888 }
889 else if(lstrcmpi(temporary+i3,"SelectCase")==0){
890 i2=i3;
891 temporary[i2++]=1;
892 temporary[i2]=ESC_SELECTCASE;
893 }
894 else if(lstrcmpi(temporary+i3,"Static")==0){
895 i2=i3;
896 temporary[i2++]=1;
897 temporary[i2]=ESC_STATIC;
898 }
899 break;
900 case 't':
901 case 'T':
902 if(lstrcmpi(temporary+i3,"Then")==0){
903 i2=i3;
904 temporary[i2++]=1;
905 temporary[i2]=ESC_THEN;
906 }
907 else if(lstrcmpi(temporary+i3,"Throw")==0){
908 i2=i3;
909 temporary[i2++]=1;
910 temporary[i2]=ESC_THROW;
911 }
912 else if(lstrcmpi(temporary+i3,"Try")==0){
913 i2=i3;
914 temporary[i2++]=1;
915 temporary[i2]=ESC_TRY;
916 }
917 else if(lstrcmpi(temporary+i3,"Type")==0){
918 i2=i3;
919 temporary[i2++]=1;
920 temporary[i2]=ESC_TYPE;
921 }
922 else if(lstrcmpi(temporary+i3,"TypeDef")==0){
923 i2=i3;
924 temporary[i2++]=1;
925 temporary[i2]=ESC_TYPEDEF;
926 }
927 break;
928 case 'u':
929 case 'U':
930 if(lstrcmpi(temporary+i3,"Using")==0){
931 i2=i3;
932 temporary[i2++]=1;
933 temporary[i2]=ESC_USING;
934 }
935 break;
936 case 'v':
937 case 'V':
938 if(lstrcmpi(temporary+i3,"Virtual")==0){
939 i2=i3;
940 temporary[i2++]=1;
941 temporary[i2]=ESC_VIRTUAL;
942 }
943 break;
944 case 'w':
945 case 'W':
946 if(lstrcmpi(temporary+i3,"With")==0){
947 i2=i3;
948 temporary[i2++]=1;
949 temporary[i2]=ESC_WITH;
950 }
951 break;
952 case 'x':
953 case 'X':
954 if(lstrcmpi(temporary+i3,"Xor")==0){
955 i2=i3;
956 temporary[i2++]=1;
957 temporary[i2]=ESC_XOR;
958 }
959 break;
960 }
961
962 continue;
963 }
964 temporary[i2]=buffer[i];
965 if(buffer[i]=='\0') break;
966 }
967 lstrcpy(buffer,temporary);
968 HeapDefaultFree(temporary);
969}
970void DefCommandFormat(char *buffer){
971 int i,i2,PareNum;
972 char temporary[255];
973
974 //Def命令語からFunction命令語へ
975 for(i=0;;i++){
976 if(buffer[i]==1&&buffer[i+1]==ESC_DEF){
977 buffer[i+1]=ESC_FUNCTION;
978 i+=2;
979 while(buffer[i]==' '||buffer[i]=='\t') i++;
980 for(i2=0;;i++,i2++){
981 if(!IsVariableChar(buffer[i])){
982 temporary[i2]=0;
983 break;
984 }
985 temporary[i2]=buffer[i];
986 }
987 while(buffer[i]==' '||buffer[i]=='\t') i++;
988 if(buffer[i]!='('){
989 SetError(1,NULL,i);
990 return;
991 }
992 i++;
993 while(1){
994 while(buffer[i]==' '||buffer[i]=='\t') i++;
995 if(buffer[i]==')') break;
996 SlideString(buffer+i,2);
997 buffer[i]=1;
998 buffer[i+1]=ESC_BYVAL;
999 i+=2;
1000 PareNum=0;
1001 for(;;i++){
1002 if(buffer[i]=='(') PareNum++;
1003 if(buffer[i]==')'){
1004 PareNum--;
1005 if(PareNum<0) break;
1006 }
1007 if(buffer[i]==','&&PareNum==0) break;
1008 }
1009 if(buffer[i]==')') break;
1010 i++;
1011 }
1012 i++;
1013 while(buffer[i]==' '||buffer[i]=='\t') i++;
1014 if(buffer[i]!='='){
1015 SetError(1,NULL,i);
1016 break;
1017 }
1018 i2=lstrlen(temporary);
1019 SlideString(buffer+i,i2+1);
1020 buffer[i]=':';
1021 i++;
1022 memcpy(buffer+i,temporary,i2);
1023 i+=i2;
1024 while(!IsCommandDelimitation(buffer[i])) i++;
1025 SlideString(buffer+i,3);
1026 buffer[i]=':';
1027 buffer[i+1]=1;
1028 buffer[i+2]=ESC_ENDFUNCTION;
1029 }
1030 if(buffer[i]=='\0') break;
1031 }
1032}
1033
1034void ChangeOneIf(char *write,int &wp,char *read,int &rp){
1035 int IsStr,sw;
1036
1037 //ブロック形式でないときはThenの後に区切り文字を入れる
1038 for(IsStr=0,sw=0;;wp++,rp++){
1039 if(read[rp]=='\"') IsStr^=1;
1040
1041 write[wp]=read[rp];
1042
1043 if(IsCommandDelimitation(read[rp])&&IsStr==0) return;
1044 if(read[rp]==1&&read[rp+1]==ESC_THEN&&
1045 (read[rp+2]==' '||read[rp+2]=='\t')){
1046 write[wp+1]=read[rp+1];
1047 write[wp+2]=':';
1048 rp+=3;
1049 wp+=3;
1050 while(read[rp]==' '||read[rp]=='\t') rp++;
1051 if((read[rp]>='0'&&read[rp]<='9')||read[rp]=='*'){
1052 memcpy(write+wp,"Goto ",5);
1053 wp+=5;
1054 }
1055 break;
1056 }
1057 }
1058
1059 //Elseの後に区切り文字を入れる
1060 for(IsStr=0;;wp++,rp++){
1061 if(read[rp]=='\"') IsStr^=1;
1062
1063 write[wp]=read[rp];
1064
1065 if(read[rp]=='\n'||read[rp]=='\0') break;
1066 if(read[rp]==1&&read[rp+1]==ESC_IF){
1067 write[wp+1]=read[rp+1];
1068 wp+=2;
1069 rp+=2;
1070 ChangeOneIf(write,wp,read,rp);
1071 wp--;
1072 rp--;
1073 continue;
1074 }
1075 if(read[rp]==1&&read[rp+1]==ESC_ELSE){
1076 write[wp++]=':';
1077
1078 write[wp]=read[rp];
1079 write[wp+1]=read[rp+1];
1080 wp+=2;
1081 rp+=2;
1082
1083 write[wp++]=':';
1084
1085 while(read[rp]==' '||read[rp]=='\t') rp++;
1086 if((read[rp]>='0'&&read[rp]<='9')||read[rp]=='*'){
1087 memcpy(write+wp,"Goto ",5);
1088 wp+=5;
1089 }
1090 break;
1091 }
1092 }
1093
1094 //"End If" を付加
1095 for(;;rp++,wp++){
1096 if(read[rp]=='\n'||read[rp]=='\0') break;
1097
1098 if(read[rp]==1&&read[rp+1]==ESC_IF){
1099 write[wp+1]=read[rp+1];
1100 wp+=2;
1101 rp+=2;
1102 ChangeOneIf(write,wp,read,rp);
1103 wp--;
1104 rp--;
1105 continue;
1106 }
1107 if(read[rp]==1&&read[rp+1]==ESC_ELSE) break;
1108
1109 write[wp]=read[rp];
1110 }
1111 write[wp]=':';
1112 write[wp+1]=1;
1113 write[wp+2]=ESC_ENDIF;
1114 wp+=3;
1115}
1116void OutsideIfFormat(char *write,int &wp,char *read,int &rp){
1117 int ElseCount=1;
1118
1119 for(;;rp++,wp++){
1120 if(read[rp]==1){
1121 if(read[rp+1]==ESC_IF){
1122 write[wp++]=read[rp++];
1123 write[wp++]=read[rp++];
1124 OutsideIfFormat(write,wp,read,rp);
1125 wp--,rp--;
1126 continue;
1127 }
1128 if(read[rp+1]==ESC_ENDIF){
1129 for(;ElseCount>0;wp+=3,ElseCount--){
1130 write[wp]=1;
1131 write[wp+1]=ESC_ENDIF;
1132 write[wp+2]=':';
1133 }
1134 rp+=2;
1135 break;
1136 }
1137 if(read[rp+1]==ESC_ELSEIF){
1138 write[wp]=1;
1139 write[wp+1]=ESC_ELSE;
1140 write[wp+2]=':';
1141
1142 write[wp+3]=1;
1143 write[wp+4]=ESC_IF;
1144
1145 wp+=4;
1146 rp++;
1147
1148 ElseCount++;
1149 continue;
1150 }
1151 }
1152
1153 write[wp]=read[rp];
1154 if(read[rp]=='\0') break;
1155 }
1156}
1157void IfCommandFormat(char *buffer){
1158 int i,i2;
1159
1160 char *temporary;
1161 temporary=(char *)HeapAlloc(hHeap,0,lstrlen(buffer)*2+1024);
1162
1163 //1行Ifをブロック形式にする
1164 for(i=0,i2=0;;i++,i2++){
1165 if(buffer[i]==1&&buffer[i+1]==ESC_IF){
1166 temporary[i2++]=buffer[i++];
1167 temporary[i2++]=buffer[i++];
1168 ChangeOneIf(temporary,i2,buffer,i);
1169 i2--,i--;
1170 continue;
1171 }
1172
1173 temporary[i2]=buffer[i];
1174 if(buffer[i]=='\0') break;
1175 }
1176
1177 //ElseIfを入れ子構造に変更する
1178 for(i=0,i2=0;;i++,i2++){
1179 if(temporary[i]==1&&temporary[i+1]==ESC_IF){
1180 buffer[i2++]=temporary[i++];
1181 buffer[i2++]=temporary[i++];
1182 OutsideIfFormat(buffer,i2,temporary,i);
1183 i2--,i--;
1184 continue;
1185 }
1186
1187 buffer[i2]=temporary[i];
1188 if(temporary[i]=='\0') break;
1189 }
1190
1191 HeapDefaultFree(temporary);
1192}
1193void CheckPareCommand(void){
1194 extern char *basbuf;
1195 int i2,i3;
1196
1197 int FuncNum=0;
1198 int FuncType=0;
1199 int FuncPtr=-1;
1200 for(i2=0;;i2++){
1201 if(basbuf[i2]=='\0') break;
1202 if(IsCommandDelimitation(basbuf[i2])){
1203 if(basbuf[i2+1]==1){
1204 i2++;
1205 switch(basbuf[i2+1]){
1206 case ESC_FUNCTION:
1207 case ESC_SUB:
1208 case ESC_MACRO:
1209 if(FuncNum!=0){
1210 if(FuncType==ESC_FUNCTION)
1211 SetError(54,"End Function",FuncPtr);
1212 else if(FuncType==ESC_SUB)
1213 SetError(54,"End Sub",FuncPtr);
1214 else if(FuncType==ESC_MACRO)
1215 SetError(54,"End Macro",FuncPtr);
1216 return;
1217 }
1218 FuncType=basbuf[i2+1];
1219 FuncNum++;
1220 FuncPtr=i2;
1221 break;
1222 case ESC_ENDFUNCTION:
1223 case ESC_ENDSUB:
1224 case ESC_ENDMACRO:
1225 if(basbuf[i2+1]==ESC_ENDFUNCTION) i3=ESC_FUNCTION;
1226 else if(basbuf[i2+1]==ESC_ENDSUB) i3=ESC_SUB;
1227 else if(basbuf[i2+1]==ESC_ENDMACRO) i3=ESC_MACRO;
1228
1229 FuncNum--;
1230
1231 if(FuncNum!=0||i3!=FuncType){
1232 if(basbuf[i2+1]==ESC_ENDFUNCTION)
1233 SetError(12,"End Function",i2);
1234 else if(basbuf[i2+1]==ESC_ENDSUB)
1235 SetError(12,"End Sub",i2);
1236 else if(basbuf[i2+1]==ESC_ENDMACRO)
1237 SetError(12,"End Macro",i2);
1238 return;
1239 }
1240 break;
1241 }
1242 }
1243
1244
1245 }
1246 }
1247}
Note: See TracBrowser for help on using the repository browser.