source: dev/BasicCompiler_Common/Intermediate_Step1.cpp@ 99

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

Namespaceステートメントのエスケープシーケンス化を行った。
[IDE]バックアップに失敗したときにエラーメッセージを出さないようにした。

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