source: dev/BasicCompiler32/Compile_Statement.cpp@ 34

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

スコープ処理を統一した。関数の途中でReturnしても、スコープにあるローカルオブジェクトを正確に破棄できるようにした。

File size: 39.7 KB
RevLine 
[3]1#include "../BasicCompiler_Common/common.h"
2#include "Opcode.h"
3
4void OpcodeOthers(char *Command){
5 int i,i2;
6 char buffer[8192];
7 SUBINFO *psi;
8
9 for(i=0;;i++){
10 if(Command[i]=='['){
11 i2=GetStringInBracket(buffer+i,Command+i);
12 i+=i2-1;
13 continue;
14 }
15 if(Command[i]==1&&Command[i+1]==ESC_PSMEM){
16 buffer[i]=Command[i];
17 i++;
18 buffer[i]=Command[i];
19 continue;
20 }
21 if(!IsVariableChar(Command[i])){
22 buffer[i]=0;
23 break;
24 }
25 buffer[i]=Command[i];
26 }
27
28 if(!(
29 IsVariableTopChar(buffer[0])||
30 buffer[0]=='.'||
31 (buffer[0]==1&&buffer[1]==ESC_PSMEM)
32 )){
33 SetError(1,NULL,cp);
34 return;
35 }
36
37
38 if(Command[i]=='\0'){
39 //////////////////////////////
40 // パラメータ無しのマクロ検索
41 //////////////////////////////
42
43 psi=GetSubHash(Command);
44
45 //GetSubHash内でエラー提示が行われた場合
46 if(psi==(SUBINFO *)-1) return;
47
48 if(psi==0){
49 char temporary[VN_SIZE];
50 lstrcpy(temporary,Command);
51
52 CharUpper(temporary);
53 psi=GetSubHash(temporary);
54
55 //GetSubHash内でエラー提示が行われた場合
56 if(psi==(SUBINFO *)-1) return;
57 }
58
59 if(psi){
60 if(psi->dwType!=SUBTYPE_MACRO) SetError(10,Command,cp);
61
[31]62 Opcode_CallProc("",psi,0,"",0);
[3]63
64 return;
65 }
66 }
67 else if(IsNumCalcMark(Command,i)){
68 //代入演算
69 OpcodeCalc(Command);
70 return;
71 }
72
73
74 int idProc;
75 void *pInfo;
76 idProc=GetProc(buffer,&pInfo);
77
78 int i4;
79 char temp2[VN_SIZE];
80 if(idProc){
81 if(Command[i]!='('){
82 SetError(10,buffer,cp);
83 return;
84 }
85 i4=GetStringInPare_RemovePare(temp2,Command+i+1);
86
87 //閉じカッコ")"に続く文字がNULLでないときはエラーにする
88 if(Command[i+1+i4+1]!='\0') SetError(42,NULL,cp);
89
90 ////////////////
91 // 呼び出し
92 ////////////////
93
94 LONG_PTR lp;
95 i2=CallProc(idProc,pInfo,buffer,temp2,&lp);
96
97
98 /////////////////////
99 // 戻り値の処理
100 /////////////////////
101
102 if(i2==DEF_DOUBLE||i2==DEF_SINGLE){
103 //fstp st(0)
104 OpBuffer[obp++]=(char)0xDD;
105 OpBuffer[obp++]=(char)0xD8;
106 }
107 if(i2==DEF_OBJECT){
108 CClass *pobj_Class;
109 pobj_Class=(CClass *)lp;
110 if(pobj_Class->DestructorMemberSubIndex!=-1){
111 //デストラクタの呼び出し
112
113 //push eax
114 op_push(REG_EAX);
115
116 //push eax
117 op_push(REG_EAX);
118
119 //call destructor
120 int i5;
121 i5=pobj_Class->DestructorMemberSubIndex;
122 op_call(pobj_Class->ppobj_Method[i5]->psi);
123 }
124 else{
125 //push eax
126 op_push(REG_EAX);
127 }
128
129 //call free
130 extern SUBINFO *pSub_free;
131 op_call(pSub_free);
132 }
133 return;
134 }
135
136
137 //////////////////////////
138 // その他は代入演算を行う
139 //////////////////////////
140 OpcodeCalc(Command);
141}
142
143void OpcodeIf(char *Parameter){
144 int i,i2,i3,i4,type;
145
146 for(i=0;;i++){
147 if(Parameter[i]=='\0'){
148 SetError(21,NULL,cp);
149 return;
150 }
151 if(Parameter[i]==1&&Parameter[i+1]==ESC_THEN){
152 Parameter[i]=0;
153 break;
154 }
155 }
156
157 type=NumOpe(Parameter,0,0,0);
158
159 if(type==-1){
160 //NumOpe内でエラー
161 i3=-1; //ダミー
162 }
163 else if(type==DEF_DOUBLE){
164 //fld qword ptr[esp]
165 op_fld_ptr_esp(DEF_DOUBLE);
166
167 //push 0
168 op_push_value(0);
169
170 //fild dword ptr[esp]
171 op_fld_ptr_esp(DEF_LONG);
172
173 //add esp,sizeof(double)+sizeof(long)
174 op_add_esp(sizeof(double)+sizeof(long));
175
176 //fcompp
177 OpBuffer[obp++]=(char)0xDE;
178 OpBuffer[obp++]=(char)0xD9;
179
180 //fnstsw ax
181 OpBuffer[obp++]=(char)0xDF;
182 OpBuffer[obp++]=(char)0xE0;
183
184 //test ah,40
185 OpBuffer[obp++]=(char)0xF6;
186 OpBuffer[obp++]=(char)0xC4;
187 OpBuffer[obp++]=(char)0x40;
188
189 //jne (endif、または else まで)
190 OpBuffer[obp++]=(char)0x0F;
191 OpBuffer[obp++]=(char)0x85;
192 obp+=sizeof(long);
193
194 //jneの番地
195 i3=obp;
196 }
197 else if(type==DEF_SINGLE){
198 //fld dword ptr[esp]
199 op_fld_ptr_esp(DEF_SINGLE);
200
201 //push 0
202 op_push_value(0);
203
204 //fild dword ptr[esp]
205 op_fld_ptr_esp(DEF_LONG);
206
207 //add esp,sizeof(float)+sizeof(long)
208 op_add_esp(sizeof(float)+sizeof(long));
209
210 //fcompp
211 OpBuffer[obp++]=(char)0xDE;
212 OpBuffer[obp++]=(char)0xD9;
213
214 //fnstsw ax
215 OpBuffer[obp++]=(char)0xDF;
216 OpBuffer[obp++]=(char)0xE0;
217
218 //test ah,40
219 OpBuffer[obp++]=(char)0xF6;
220 OpBuffer[obp++]=(char)0xC4;
221 OpBuffer[obp++]=(char)0x40;
222
223 //jne (endif、または else まで)
224 OpBuffer[obp++]=(char)0x0F;
225 OpBuffer[obp++]=(char)0x85;
226 obp+=sizeof(long);
227
228 //jneの番地
229 i3=obp;
230 }
231 else if(type==DEF_INT64||type==DEF_QWORD){
232 //64ビット型
233
234 //pop eax
235 op_pop(REG_EAX);
236
237 //pop ebx
238 op_pop(REG_EBX);
239
240 //cmp eax,0
241 OpBuffer[obp++]=(char)0x83;
242 OpBuffer[obp++]=(char)0xF8;
243 OpBuffer[obp++]=(char)0x00;
244
245 //jne
246 OpBuffer[obp++]=(char)0x0F;
247 OpBuffer[obp++]=(char)0x85;
248 obp+=sizeof(long);
249 i3=obp;
250
251
252 //cmp ebx,0
253 OpBuffer[obp++]=(char)0x83;
254 OpBuffer[obp++]=(char)0xFB;
255 OpBuffer[obp++]=(char)0x00;
256
257 //jne
258 OpBuffer[obp++]=(char)0x0F;
259 OpBuffer[obp++]=(char)0x85;
260 obp+=sizeof(long);
261 i4=obp;
262
263
264
265 //jmp (endif、または else までジャンプ)
266 OpBuffer[obp++]=(char)0xE9;
267 obp+=sizeof(long);
268
269 *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3;
270 *((long *)(OpBuffer+i4-sizeof(long)))=obp-i4;
271
272 //jmpの番地
273 i3=obp;
274 }
275 else{
276 //32ビット型
277
278 //pop eax
279 op_pop(REG_EAX);
280
281 //cmp eax,0
282 OpBuffer[obp++]=(char)0x83;
283 OpBuffer[obp++]=(char)0xF8;
284 OpBuffer[obp++]=(char)0x00;
285
286 //je (endif、または else まで条件ジャンプ)
287 OpBuffer[obp++]=(char)0x0F;
288 OpBuffer[obp++]=(char)0x84;
289 obp+=sizeof(long);
290
291 //jeの番地
292 i3=obp;
293 }
294
295
296 /////////////////////////
297 // If内をコード化
298 /////////////////////////
299
300 //レキシカルスコープをレベルアップ
[34]301 obj_LexScopes.Start( obp, SCOPE_TYPE_IF );
[3]302
303 i2=CompileBuffer(ESC_ENDIF,0);
304
305 //レキシカルスコープをレベルダウン
[34]306 obj_LexScopes.End();
[3]307
308
309 if(i3==-1) return;
310
311 extern char *basbuf;
312 if(i2==ESC_ELSE){
313 //jmp (endifまで)
314 OpBuffer[obp++]=(char)0xE9;
315 obp+=sizeof(long);
316
317 *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3; //ifからelseへのジャンプ先のオフセット値
318
319 i3=obp;
320
321
322 /////////////////////////
323 // Else内をコード化
324 /////////////////////////
325
326 //レキシカルスコープをレベルアップ
[34]327 obj_LexScopes.Start( obp, SCOPE_TYPE_IF );
[3]328
329 CompileBuffer(ESC_ENDIF,0);
330
331 //レキシカルスコープをレベルダウン
[34]332 obj_LexScopes.End();
[3]333
334
335 *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3; //jmpジャンプ先のオフセット値
336 }
337 else{
338 *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3; //jeジャンプ先のオフセット値
339 }
340}
341
342int GetLabelAddress(char *LabelName,int LineNum){
343 extern int MaxLabelNum;
344 extern LABEL *pLabelNames;
345 int i;
346
347 if(LabelName){
348 for(i=0;i<MaxLabelNum;i++){
349 if(pLabelNames[i].pName){
350 if(lstrcmp(LabelName,pLabelNames[i].pName)==0) return pLabelNames[i].address;
351 }
352 }
353 }
354 else{
355 for(i=0;i<MaxLabelNum;i++){
356 if(pLabelNames[i].pName==0){
357 if(LineNum==pLabelNames[i].line) return pLabelNames[i].address;
358 }
359 }
360 }
361 return -1;
362}
363void OpcodeGoto(char *Parameter){
364 extern HANDLE hHeap;
365 extern GOTOLABELSCHEDULE *pGotoLabelSchedule;
366 extern int GotoLabelScheduleNum;
367 int i,LineNum;
368
369 if(Parameter[0]=='*'){
370 i=GetLabelAddress(Parameter+1,0);
371
372 //jmp ...
373 OpBuffer[obp++]=(char)0xE9;
374 if(i==-1){
375 pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapReAlloc(hHeap,0,pGotoLabelSchedule,(GotoLabelScheduleNum+1)*sizeof(GOTOLABELSCHEDULE));
376 pGotoLabelSchedule[GotoLabelScheduleNum].pName=(char *)HeapAlloc(hHeap,0,lstrlen(Parameter+1)+1);
377 lstrcpy(pGotoLabelSchedule[GotoLabelScheduleNum].pName,Parameter+1);
378 pGotoLabelSchedule[GotoLabelScheduleNum].pos=obp;
379 pGotoLabelSchedule[GotoLabelScheduleNum].now_cp=cp;
380 GotoLabelScheduleNum++;
381 }
382 *((long *)(OpBuffer+obp))=i-(obp+sizeof(long));
383 obp+=sizeof(long);
384 }
385 else{
386 LineNum=atoi(Parameter);
387 i=GetLabelAddress(0,LineNum);
388
389 //jmp ...
390 OpBuffer[obp++]=(char)0xE9;
391 if(i==-1){
392 pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapReAlloc(hHeap,0,pGotoLabelSchedule,(GotoLabelScheduleNum+1)*sizeof(GOTOLABELSCHEDULE));
393 pGotoLabelSchedule[GotoLabelScheduleNum].pName=0;
394 pGotoLabelSchedule[GotoLabelScheduleNum].line=LineNum;
395 pGotoLabelSchedule[GotoLabelScheduleNum].pos=obp;
396 pGotoLabelSchedule[GotoLabelScheduleNum].now_cp=cp;
397 GotoLabelScheduleNum++;
398 }
399 *((long *)(OpBuffer+obp))=i-(obp+sizeof(long));
400 obp+=sizeof(long);
401 }
402}
403void OpcodeWhile(char *Parameter){
404 extern HANDLE hHeap;
405 int i2,i3,type;
406
407 //Continueアドレスのバックアップとセット
408 extern DWORD dwContinueAddress;
409 DWORD dwTempContinue;
410 dwTempContinue=dwContinueAddress;
411 dwContinueAddress=obp;
412
413 if(!Parameter[0]) SetError(10,"While",cp);
414 type=NumOpe(Parameter,0,0,0);
415
416 int je_schedule;
417 if(type==DEF_DOUBLE){
418 //fld qword ptr[esp]
419 op_fld_ptr_esp(DEF_DOUBLE);
420
421 //push 0
422 op_push_value(0);
423
424 //fild dword ptr[esp]
425 op_fld_ptr_esp(DEF_LONG);
426
427 //add esp,sizeof(double)+sizeof(long)
428 op_add_esp(sizeof(double)+sizeof(long));
429
430 //fcompp
431 OpBuffer[obp++]=(char)0xDE;
432 OpBuffer[obp++]=(char)0xD9;
433
434 //fnstsw ax
435 OpBuffer[obp++]=(char)0xDF;
436 OpBuffer[obp++]=(char)0xE0;
437
438 //test ah,40
439 OpBuffer[obp++]=(char)0xF6;
440 OpBuffer[obp++]=(char)0xC4;
441 OpBuffer[obp++]=(char)0x40;
442
443 //jne (Wend まで)
444 OpBuffer[obp++]=(char)0x0F;
445 OpBuffer[obp++]=(char)0x85;
446 obp+=sizeof(long);
447
448 //jeの番地
449 je_schedule=obp;
450 }
451 else if(type==DEF_SINGLE){
452 //fld dword ptr[esp]
453 op_fld_ptr_esp(DEF_SINGLE);
454
455 //push 0
456 op_push_value(0);
457
458 //fild dword ptr[esp]
459 op_fld_ptr_esp(DEF_LONG);
460
461 //add esp,sizeof(float)+sizeof(long)
462 op_add_esp(sizeof(float)+sizeof(long));
463
464 //fcompp
465 OpBuffer[obp++]=(char)0xDE;
466 OpBuffer[obp++]=(char)0xD9;
467
468 //fnstsw ax
469 OpBuffer[obp++]=(char)0xDF;
470 OpBuffer[obp++]=(char)0xE0;
471
472 //test ah,40
473 OpBuffer[obp++]=(char)0xF6;
474 OpBuffer[obp++]=(char)0xC4;
475 OpBuffer[obp++]=(char)0x40;
476
477 //jne (Wend まで)
478 OpBuffer[obp++]=(char)0x0F;
479 OpBuffer[obp++]=(char)0x85;
480 obp+=sizeof(long);
481
482 //jeの番地
483 je_schedule=obp;
484 }
485 else if(type==DEF_INT64||type==DEF_QWORD){
486 //64ビット型
487
488 //pop eax
489 op_pop(REG_EAX);
490
491 //pop ebx
492 op_pop(REG_EBX);
493
494 //cmp eax,0
495 OpBuffer[obp++]=(char)0x83;
496 OpBuffer[obp++]=(char)0xF8;
497 OpBuffer[obp++]=(char)0x00;
498
499 //jne
500 OpBuffer[obp++]=(char)0x0F;
501 OpBuffer[obp++]=(char)0x85;
502 obp+=sizeof(long);
503 i2=obp;
504
505
506 //cmp ebx,0
507 OpBuffer[obp++]=(char)0x83;
508 OpBuffer[obp++]=(char)0xFB;
509 OpBuffer[obp++]=(char)0x00;
510
511 //jne
512 OpBuffer[obp++]=(char)0x0F;
513 OpBuffer[obp++]=(char)0x85;
514 obp+=sizeof(long);
515 i3=obp;
516
517
518 //jmp (endif、または else までジャンプ)
519 OpBuffer[obp++]=(char)0xE9;
520 obp+=sizeof(long);
521
522 *((long *)(OpBuffer+i2-sizeof(long)))=obp-i2;
523 *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3;
524
525 //jmpの番地
526 je_schedule=obp;
527 }
528 else{
529 //その他整数型
530
531 //pop eax
532 op_pop(REG_EAX);
533
534 //cmp eax,0
535 OpBuffer[obp++]=(char)0x83;
536 OpBuffer[obp++]=(char)0xF8;
537 OpBuffer[obp++]=(char)0x00;
538
539 //je (Wend まで)
540 OpBuffer[obp++]=(char)0x0F;
541 OpBuffer[obp++]=(char)0x84;
542 obp+=sizeof(long);
543
544 //実行中の番地
545 je_schedule=obp;
546 }
547
548 //レキシカルスコープをレベルアップ
[34]549 obj_LexScopes.Start( obp, SCOPE_TYPE_WHILE );
[3]550
551 //While内をコンパイル
552 CompileBuffer(0,COM_WEND);
553
[34]554 obj_LexScopes.CallDestructorsOfScopeEnd();
[3]555
556 //jmp ...
557 OpBuffer[obp++]=(char)0xE9;
558 *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
559 obp+=sizeof(long);
560
561 //レキシカルスコープをレベルダウン
[34]562 obj_LexScopes.End();
[3]563
564 *((long *)(OpBuffer+je_schedule-sizeof(long)))=obp-je_schedule; //jeジャンプ先のオフセット値
565
566 //Continueアドレスを復元
567 dwContinueAddress=dwTempContinue;
568}
569
570char szNextVariable[VN_SIZE];
571void OpcodeFor(char *Parameter){
572 extern HANDLE hHeap;
573 int i,i2,i3;
574 char temporary[VN_SIZE],variable[VN_SIZE],JudgeNum[VN_SIZE],StepNum[VN_SIZE];
575
576 //第1パラメータを取得
577 i=GetOneParameter(Parameter,0,temporary);
578 if(!Parameter[i]){
579 SetError(12,"For",cp);
580 goto ErrorStep;
581 }
582
583 for(i2=0;;i2++){
584 if(temporary[i2]=='='){
585 variable[i2]=0;
586
587 //カウンタ初期化
588 OpcodeCalc(temporary);
589 break;
590 }
591 if(temporary[i2]=='\0'){
592 SetError(12,"For",cp);
593 goto ErrorStep;
594 }
595 variable[i2]=temporary[i2];
596 }
597
598 //jmp ...
599 OpBuffer[obp++]=(char)0xE9;
600 i2=obp;
601 obp+=sizeof(long);
602
603 //Continueアドレスのバックアップとセット
604 extern DWORD dwContinueAddress;
605 DWORD dwTempContinue;
606 dwTempContinue=dwContinueAddress;
607 dwContinueAddress=obp;
608
609 //第2パラメータを取得(to~)
610 i=GetOneParameter(Parameter,i,JudgeNum);
611
612 //第3パラメータを取得(step~)
613 if(Parameter[i]){
614 i=GetOneParameter(Parameter,i,StepNum);
615 if(Parameter[i]) SetError(12,"For",cp);
616 }
617 else lstrcpy(StepNum,"1");
618
619 //カウンタを増加させる
620 sprintf(temporary,"%s=(%s)+(%s)",variable,variable,StepNum);
621 OpcodeCalc(temporary);
622
623 *((long *)(OpBuffer+i2))=obp-(i2+sizeof(long));
624
625 //増加か減少かを区別する
626 sprintf(temporary,"(%s)>=0",StepNum);
627 NumOpe(temporary,0,0,0);
628
629 //pop eax
630 op_pop(REG_EAX);
631
632 //cmp eax,0
633 OpBuffer[obp++]=(char)0x83;
634 OpBuffer[obp++]=(char)0xF8;
635 OpBuffer[obp++]=(char)0x00;
636
637 //je [カウンタ減少の場合の判定]
638 OpBuffer[obp++]=(char)0x0F;
639 OpBuffer[obp++]=(char)0x84;
640 i2=obp;
641 obp+=sizeof(long);
642
643 //判定(カウンタ増加の場合)
644 sprintf(temporary,"%s<=(%s)",variable,JudgeNum);
645 NumOpe(temporary,0,0,0);
646
647 //pop eax
648 op_pop(REG_EAX);
649
650 //jmp [カウンタ減少の場合の判定を飛び越す]
651 OpBuffer[obp++]=(char)0xE9;
652 i3=obp;
653 obp+=sizeof(long);
654
655 *((long *)(OpBuffer+i2))=obp-(i2+sizeof(long)); //jeジャンプ先のオフセット値
656
657 //判定(カウンタ減少の場合)
658 sprintf(temporary,"%s>=(%s)",variable,JudgeNum);
659 NumOpe(temporary,0,0,0);
660
661 //pop eax
662 op_pop(REG_EAX);
663
664 *((long *)(OpBuffer+i3))=obp-(i3+sizeof(long)); //jmpジャンプ先のオフセット値
665
666 //cmp eax,0
667 OpBuffer[obp++]=(char)0x83;
668 OpBuffer[obp++]=(char)0xF8;
669 OpBuffer[obp++]=(char)0x00;
670
671ErrorStep:
672
673 //je ...
674 OpBuffer[obp++]=(char)0x0F;
675 OpBuffer[obp++]=(char)0x84;
676 int je_schedule=obp;
677 obp+=sizeof(long);
678
679 //レキシカルスコープをレベルアップ
[34]680 obj_LexScopes.Start( obp, SCOPE_TYPE_FOR );
[3]681
682 //For内をコンパイル
683 CompileBuffer(0,COM_NEXT);
684
[34]685 obj_LexScopes.CallDestructorsOfScopeEnd();
[3]686
687 if(szNextVariable[0]){
688 if(lstrcmp(szNextVariable,variable)!=0){
689 SetError(55,szNextVariable,cp);
690 }
691 }
692
693 //jmp ...
694 OpBuffer[obp++]=(char)0xE9;
695 *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
696 obp+=sizeof(long);
697
698 //レキシカルスコープをレベルダウン
[34]699 obj_LexScopes.End();
[3]700
701 *((long *)(OpBuffer+je_schedule))=obp-(je_schedule+sizeof(long)); //jeジャンプ先のオフセット値
702
703 //Continueアドレスを復元
704 dwContinueAddress=dwTempContinue;
705}
706
707void OpcodeDo(char *Parameter){
708 extern HANDLE hHeap;
709 int i,i2,i3,i4,type;
710
711 if(Parameter[0]) SetError(10,"Do",cp);
712
713 //Continueアドレスのバックアップとセット
714 extern DWORD dwContinueAddress;
715 DWORD dwTempContinue;
716 dwTempContinue=dwContinueAddress;
717 dwContinueAddress=obp;
718
719 //レキシカルスコープをレベルアップ
[34]720 obj_LexScopes.Start( obp, SCOPE_TYPE_DO );
[3]721
722 //Do内をコンパイル
723 CompileBuffer(0,COM_LOOP);
724
[34]725 obj_LexScopes.CallDestructorsOfScopeEnd();
[3]726
727 extern char *basbuf;
728 char temporary[VN_SIZE];
729 for(i=cp-1;;i--){
730 if(IsCommandDelimitation(basbuf[i])){
731 i+=3;
732 if(!(basbuf[i]=='0'||basbuf[i]=='1')){
733 //無条件ループ
734 break;
735 }
736 i3=i;
737
738 for(i+=2,i2=0;;i++,i2++){
739 if(IsCommandDelimitation(basbuf[i])){
740 temporary[i2]=0;
741 break;
742 }
743 temporary[i2]=basbuf[i];
744 }
745
746 type=NumOpe(temporary,0,0,0);
747
748 if(type==DEF_DOUBLE){
749 //fld qword ptr[esp]
750 op_fld_ptr_esp(DEF_DOUBLE);
751
752 //push 0
753 op_push_value(0);
754
755 //fild dword ptr[esp]
756 op_fld_ptr_esp(DEF_LONG);
757
758 //add esp,sizeof(double)+sizeof(long)
759 op_add_esp(sizeof(double)+sizeof(long));
760
761 //fcompp
762 OpBuffer[obp++]=(char)0xDE;
763 OpBuffer[obp++]=(char)0xD9;
764
765 //fnstsw ax
766 OpBuffer[obp++]=(char)0xDF;
767 OpBuffer[obp++]=(char)0xE0;
768
769 //test ah,40
770 OpBuffer[obp++]=(char)0xF6;
771 OpBuffer[obp++]=(char)0xC4;
772 OpBuffer[obp++]=(char)0x40;
773
774 if(basbuf[i3]=='0'){
775 //While
776
777 //jne 5(ループ終了)
778 OpBuffer[obp++]=(char)0x75;
779 OpBuffer[obp++]=(char)0x05;
780 }
781 else if(basbuf[i3]=='1'){
782 //Until
783
784 //je 5(ループ終了)
785 OpBuffer[obp++]=(char)0x74;
786 OpBuffer[obp++]=(char)0x05;
787 }
788 }
789 else if(type==DEF_SINGLE){
790 //fld dword ptr[esp]
791 op_fld_ptr_esp(DEF_SINGLE);
792
793 //push 0
794 op_push_value(0);
795
796 //fild dword ptr[esp]
797 op_fld_ptr_esp(DEF_LONG);
798
799 //add esp,sizeof(float)+sizeof(long)
800 op_add_esp(sizeof(float)+sizeof(long));
801
802 //fcompp
803 OpBuffer[obp++]=(char)0xDE;
804 OpBuffer[obp++]=(char)0xD9;
805
806 //fnstsw ax
807 OpBuffer[obp++]=(char)0xDF;
808 OpBuffer[obp++]=(char)0xE0;
809
810 //test ah,40
811 OpBuffer[obp++]=(char)0xF6;
812 OpBuffer[obp++]=(char)0xC4;
813 OpBuffer[obp++]=(char)0x40;
814
815 if(basbuf[i3]=='0'){
816 //While
817
818 //jne 5(ループ終了)
819 OpBuffer[obp++]=(char)0x75;
820 OpBuffer[obp++]=(char)0x05;
821 }
822 else if(basbuf[i3]=='1'){
823 //Until
824
825 //je 5(ループ終了)
826 OpBuffer[obp++]=(char)0x74;
827 OpBuffer[obp++]=(char)0x05;
828 }
829 }
830 else if(type==DEF_INT64||type==DEF_QWORD){
831 //64ビット型
832
833 //pop eax
834 op_pop(REG_EAX);
835
836 //pop ebx
837 op_pop(REG_EBX);
838
839 //cmp eax,0
840 OpBuffer[obp++]=(char)0x83;
841 OpBuffer[obp++]=(char)0xF8;
842 OpBuffer[obp++]=(char)0x00;
843
844 //jne
845 OpBuffer[obp++]=(char)0x0F;
846 OpBuffer[obp++]=(char)0x85;
847 obp+=sizeof(long);
848 i2=obp;
849
850
851 //cmp ebx,0
852 OpBuffer[obp++]=(char)0x83;
853 OpBuffer[obp++]=(char)0xFB;
854 OpBuffer[obp++]=(char)0x00;
855
856 //jne
857 OpBuffer[obp++]=(char)0x0F;
858 OpBuffer[obp++]=(char)0x85;
859 obp+=sizeof(long);
860 i4=obp;
861
862
863 if(basbuf[i3]=='0'){
864 //While
865
866 //jmp 5(ループ終了)
867 OpBuffer[obp++]=(char)0xEB;
868 OpBuffer[obp++]=(char)0x05;
869
870 *((long *)(OpBuffer+i2-sizeof(long)))=obp-i2;
871 *((long *)(OpBuffer+i4-sizeof(long)))=obp-i4;
872 }
873 else if(basbuf[i3]=='1'){
874 //Until
875
876 //jmp 2(ループを続ける)
877 OpBuffer[obp++]=(char)0xEB;
878 OpBuffer[obp++]=(char)0x02;
879
880 *((long *)(OpBuffer+i2-sizeof(long)))=obp-i2;
881 *((long *)(OpBuffer+i4-sizeof(long)))=obp-i4;
882
883 //jmp 5(ループ終了)
884 OpBuffer[obp++]=(char)0xEB;
885 OpBuffer[obp++]=(char)0x05;
886 }
887 }
888 else{
889 //pop eax
890 op_pop(REG_EAX);
891
892 //cmp eax,0
893 OpBuffer[obp++]=(char)0x83;
894 OpBuffer[obp++]=(char)0xF8;
895 OpBuffer[obp++]=(char)0x00;
896
897 if(basbuf[i3]=='0'){
898 //While
899
900 //je 5(ループ終了)
901 OpBuffer[obp++]=(char)0x74;
902 OpBuffer[obp++]=(char)0x05;
903 }
904 else if(basbuf[i3]=='1'){
905 //Until
906
907 //jne 5(ループ終了)
908 OpBuffer[obp++]=(char)0x75;
909 OpBuffer[obp++]=(char)0x05;
910 }
911 }
912 break;
913 }
914 }
915
916 //jmp ...
917 OpBuffer[obp++]=(char)0xE9;
918 *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
919 obp+=sizeof(long);
920
921 //jmp ...
922 OpBuffer[obp++]=(char)0xE9;
923 int je_schedule=obp;
924 obp+=sizeof(long);
925
926 //レキシカルスコープをレベルダウン
[34]927 obj_LexScopes.End();
[3]928
929 *((long *)(OpBuffer+je_schedule))=obp-(je_schedule+sizeof(long)); //jmpジャンプ先のオフセット値
930
931
932 //Continueアドレスを復元
933 dwContinueAddress=dwTempContinue;
934}
935void OpcodeContinue(void){
936 extern DWORD dwContinueAddress;
937
938 if(dwContinueAddress==-1){
939 SetError(12,"Continue",cp);
940 return;
941 }
942
943 //jmp ...(Continue addr)
944 OpBuffer[obp++]=(char)0xE9;
945
946 *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
947 obp+=sizeof(long);
948}
949
950void OpcodeExitSub(void){
951 extern DWORD *pExitSubSchedule;
952 extern int ExitSubScheduleNum;
953 extern HANDLE hHeap;
954
955 extern BOOL bCompilingGlobal;
956 if(bCompilingGlobal){
957 SetError(12,"Exit Sub/Function",cp);
958 return;
959 }
960
[34]961 //未解放のローカルオブジェクトのデストラクタを呼び出す
962 obj_LexScopes.CallDestructorsOfReturn();
963
[3]964 //jmp ...(End Sub/Function)
965 OpBuffer[obp++]=(char)0xE9;
966
967 pExitSubSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitSubSchedule,(ExitSubScheduleNum+1)*sizeof(DWORD));
968 pExitSubSchedule[ExitSubScheduleNum]=obp;
969 ExitSubScheduleNum++;
970
971 obp+=sizeof(long);
972}
973
974void AddCaseSchedule(void){
975 extern DWORD *pCaseSchedule;
976 extern int CaseScheduleNum;
977 extern HANDLE hHeap;
978
979 pCaseSchedule=(DWORD *)HeapReAlloc(hHeap,0,pCaseSchedule,(CaseScheduleNum+1)*sizeof(DWORD));
980 pCaseSchedule[CaseScheduleNum]=obp;
981 CaseScheduleNum++;
982}
983
984int CaseTypeSize;
985void OpcodeSelect(char *Parameter){
986 extern DWORD *pCaseSchedule;
987 extern int CaseScheduleNum;
988 extern int NowCaseSchedule;
989 extern int CaseTypeSize;
990 extern HANDLE hHeap;
991 extern char *basbuf;
992 int i,i2,i3,sw,type1,type2,NowCaseCp;
993 char temporary[VN_SIZE];
994
995 DWORD *temp_pCaseSchedule;
996 int temp_CaseScheduleNum;
997 int temp_NowCaseSchedule;
998 int temp_CaseTypeSize;
999
1000 temp_pCaseSchedule=pCaseSchedule;
1001 temp_CaseScheduleNum=CaseScheduleNum;
1002 temp_NowCaseSchedule=NowCaseSchedule;
1003 temp_CaseTypeSize=CaseTypeSize;
1004 pCaseSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
1005 CaseScheduleNum=0;
1006 NowCaseSchedule=0;
1007
1008 LONG_PTR lpIndex;
1009 type1=NumOpe(Parameter,0,0,&lpIndex);
1010 if(type1==DEF_INTEGER||
1011 type1==DEF_WORD||
1012 type1==DEF_CHAR||
1013 type1==DEF_BYTE) CaseTypeSize=sizeof(long);
1014 else{
1015 CaseTypeSize=GetTypeSize(type1,lpIndex);
1016 if(type1==DEF_OBJECT) CaseTypeSize=PTR_SIZE;
1017 }
1018
1019 for(i=cp,sw=0;;i++){
1020 if(basbuf[i]=='\0'){
1021 HeapDefaultFree(pCaseSchedule);
1022 pCaseSchedule=temp_pCaseSchedule;
1023 CaseScheduleNum=temp_CaseScheduleNum;
1024 NowCaseSchedule=temp_NowCaseSchedule;
1025 CaseTypeSize=temp_CaseTypeSize;
1026 SetError(22,"Select",cp);
1027 return;
1028 }
1029 if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE){
1030 for(i2=0;;i++){
1031 if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE) i2++;
1032 if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT){
1033 i2--;
1034 if(i2==0) break;
1035 }
1036 }
1037 continue;
1038 }
1039 if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT){
1040 if(sw==0){
1041 //add esp,CaseTypeSize
1042 op_add_esp(CaseTypeSize);
1043 }
1044 break;
1045 }
1046 if(basbuf[i]==1&&basbuf[i+1]==ESC_CASE){
1047 NowCaseCp=i;
1048
1049 i++;
1050 while(1){
1051 for(i++,i2=0;;i++,i2++){
1052 if(basbuf[i]=='\"'){
1053 i3=GetStringInQuotation(temporary+i2,basbuf+i);
1054 i+=i3-1;
1055 i2+=i3-1;
1056 continue;
1057 }
1058 if(basbuf[i]=='('){
1059 i3=GetStringInPare(temporary+i2,basbuf+i);
1060 i+=i3-1;
1061 i2+=i3-1;
1062 continue;
1063 }
1064 if(basbuf[i]=='['){
1065 i3=GetStringInBracket(temporary+i2,basbuf+i);
1066 i+=i3-1;
1067 i2+=i3-1;
1068 continue;
1069 }
1070
1071 if(IsCommandDelimitation(basbuf[i])){
1072 temporary[i2]=0;
1073 break;
1074 }
1075 if(basbuf[i]==','){
1076 temporary[i2]=0;
1077 break;
1078 }
1079
1080 temporary[i2]=basbuf[i];
1081 }
1082
1083 //エラー用
1084 i2=cp;
1085 cp=NowCaseCp;
1086
1087 LONG_PTR lpIndex2;
1088 type2=NumOpe(temporary,type1,lpIndex,&lpIndex2);
1089
1090 cp=i2;
1091
1092 if(type1==DEF_OBJECT){
1093 CClass *pobj_c;
1094 pobj_c=(CClass *)lpIndex;
1095
1096 SUBINFO **ppsi;
1097 int num;
1098 ppsi=pobj_c->GetOperatorSubInfo(CALC_EQUAL,num);
1099 if(num==0){
1100 HeapDefaultFree(ppsi);
1101
1102 return;
1103 }
1104
[31]1105 PARAMETER_INFO *ppi = (PARAMETER_INFO *)HeapAlloc(hHeap,0,sizeof(PARAMETER_INFO)*3);
[3]1106 int iParmNum=0;
1107 ppi[iParmNum].bArray=0;
1108 ppi[iParmNum].bByVal=0;
1109 ppi[iParmNum].name=0;
1110 ppi[iParmNum].type=type2;
1111 ppi[iParmNum].u.index=lpIndex2;
1112 ppi[iParmNum].SubScripts[0]=-1;
1113 iParmNum++;
1114
1115 //オーバーロードを解決
1116 SUBINFO *psi;
1117 psi=OverloadSolution("==",ppsi,num,ppi,iParmNum,NULL);
1118 HeapDefaultFree(ppsi);
1119 HeapDefaultFree(ppi);
1120
1121 if(!psi){
1122 //エラー
1123 return;
1124 }
1125
1126
1127 //pop edx
1128 op_pop(REG_EDX);
1129
1130 //mov ecx,dword ptr[esp]
1131 op_mov_RM(sizeof(long),REG_ECX,REG_ESP,0,MOD_BASE);
1132
1133 //push edx
1134 op_push(REG_EDX);
1135
1136 //push ecx
1137 op_push(REG_ECX);
1138
1139 //call operator_proc ※ ==演算子
1140 op_call(psi);
1141
1142 //test eax,eax
1143 op_test(REG_EAX,REG_EAX);
1144
1145 //jne ...
1146 OpBuffer[obp++]=(char)0x0F;
1147 OpBuffer[obp++]=(char)0x85;
1148 AddCaseSchedule();
1149 obp+=sizeof(long);
1150 }
1151 else if(type1==DEF_DOUBLE){
1152 ChangeTypeToDouble(type2);
1153
1154 //fld qword ptr[esp]
1155 op_fld_ptr_esp(DEF_DOUBLE);
1156
1157 //add esp,CaseTypeSize
1158 op_add_esp(CaseTypeSize);
1159
1160 //fld qword ptr[esp]
1161 op_fld_ptr_esp(DEF_DOUBLE);
1162
1163 //fcompp
1164 OpBuffer[obp++]=(char)0xDE;
1165 OpBuffer[obp++]=(char)0xD9;
1166
1167 //fnstsw ax
1168 OpBuffer[obp++]=(char)0xDF;
1169 OpBuffer[obp++]=(char)0xE0;
1170
1171 //test ah,40
1172 OpBuffer[obp++]=(char)0xF6;
1173 OpBuffer[obp++]=(char)0xC4;
1174 OpBuffer[obp++]=(char)0x40;
1175
1176 //jne ...
1177 OpBuffer[obp++]=(char)0x0F;
1178 OpBuffer[obp++]=(char)0x85;
1179 AddCaseSchedule();
1180 obp+=sizeof(long);
1181 }
1182 else if(type1==DEF_SINGLE){
1183 ChangeTypeToSingle(type2);
1184
1185 //fld dword ptr[esp]
1186 op_fld_ptr_esp(DEF_SINGLE);
1187
1188 //add esp,CaseTypeSize
1189 op_add_esp(CaseTypeSize);
1190
1191 //fld dword ptr[esp]
1192 op_fld_ptr_esp(DEF_SINGLE);
1193
1194 //fcompp
1195 OpBuffer[obp++]=(char)0xDE;
1196 OpBuffer[obp++]=(char)0xD9;
1197
1198 //fnstsw ax
1199 OpBuffer[obp++]=(char)0xDF;
1200 OpBuffer[obp++]=(char)0xE0;
1201
1202 //test ah,40
1203 OpBuffer[obp++]=(char)0xF6;
1204 OpBuffer[obp++]=(char)0xC4;
1205 OpBuffer[obp++]=(char)0x40;
1206
1207 //jne ...
1208 OpBuffer[obp++]=(char)0x0F;
1209 OpBuffer[obp++]=(char)0x85;
1210 AddCaseSchedule();
1211 obp+=sizeof(long);
1212 }
1213 else{
1214 //その他整数型
1215
1216 //pop ebx
1217 op_pop(REG_EBX);
1218
1219 //mov eax,dword ptr[esp]
1220 OpBuffer[obp++]=(char)0x8B;
1221 OpBuffer[obp++]=(char)0x04;
1222 OpBuffer[obp++]=(char)0x24;
1223
1224 //cmp eax,ebx
1225 OpBuffer[obp++]=(char)0x3B;
1226 OpBuffer[obp++]=(char)0xC3;
1227
1228 //je ...
1229 OpBuffer[obp++]=(char)0x0F;
1230 OpBuffer[obp++]=(char)0x84;
1231 AddCaseSchedule();
1232 obp+=sizeof(long);
1233 }
1234
1235 if(basbuf[i]!=',') break;
1236 }
1237 }
1238 if(basbuf[i]==1&&basbuf[i+1]==ESC_CASEELSE){
1239 sw=1;
1240
1241 //jmp ...
1242 OpBuffer[obp++]=(char)0xE9;
1243 AddCaseSchedule();
1244 obp+=sizeof(long);
1245 }
1246 }
1247
1248 //レキシカルスコープをレベルアップ
[34]1249 obj_LexScopes.Start( obp, SCOPE_TYPE_SELECT );
[3]1250
1251 //Select Case内をコンパイル
1252 CompileBuffer(ESC_ENDSELECT,0);
1253
1254 //jmp EndSelect
1255 OpBuffer[obp++]=(char)0xE9;
1256 AddCaseSchedule();
1257 obp+=sizeof(long);
1258
1259 //最終スケジュール
1260 for(i=NowCaseSchedule;i<CaseScheduleNum;i++){
1261 *(long *)(OpBuffer+pCaseSchedule[i])=obp-(pCaseSchedule[i]+sizeof(long));
1262 }
1263 HeapDefaultFree(pCaseSchedule);
1264
1265 //レキシカルスコープをレベルダウン
[34]1266 obj_LexScopes.End();
[3]1267
1268 pCaseSchedule=temp_pCaseSchedule;
1269 CaseScheduleNum=temp_CaseScheduleNum;
1270 NowCaseSchedule=temp_NowCaseSchedule;
1271 CaseTypeSize=temp_CaseTypeSize;
1272}
1273void OpcodeCase(char *Parameter){
1274 extern DWORD *pCaseSchedule;
1275 extern int NowCaseSchedule;
1276 extern int CaseTypeSize;
1277 int i;
1278
1279 if(!pCaseSchedule){
1280 SetError(30,"Case",cp);
1281 return;
1282 }
1283
1284 //jmp EndSelect
1285 OpBuffer[obp++]=(char)0xE9;
1286 AddCaseSchedule();
1287 obp+=sizeof(long);
1288
1289 i=0;
1290 while(1){
1291 //Caseスケジュール
1292 *(long *)(OpBuffer+pCaseSchedule[NowCaseSchedule])=obp-(pCaseSchedule[NowCaseSchedule]+sizeof(long));
1293 NowCaseSchedule++;
1294
1295 i=JumpOneParameter(Parameter,i);
1296 if(Parameter[i]=='\0') break;
1297 }
1298
1299 //add esp,CaseTypeSize
1300 op_add_esp(CaseTypeSize);
1301}
1302
1303void OpcodeGosub(char *Parameter){
1304 extern HANDLE hHeap;
1305 extern GOTOLABELSCHEDULE *pGotoLabelSchedule;
1306 extern int GotoLabelScheduleNum;
1307 int i,LineNum;
1308
1309 if(Parameter[0]=='*'){
1310 i=GetLabelAddress(Parameter+1,0);
1311
1312 //call ...
1313 OpBuffer[obp++]=(char)0xE8;
1314 if(i==-1){
1315 pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapReAlloc(hHeap,0,pGotoLabelSchedule,(GotoLabelScheduleNum+1)*sizeof(GOTOLABELSCHEDULE));
1316 pGotoLabelSchedule[GotoLabelScheduleNum].pName=(char *)HeapAlloc(hHeap,0,lstrlen(Parameter+1)+1);
1317 lstrcpy(pGotoLabelSchedule[GotoLabelScheduleNum].pName,Parameter+1);
1318 pGotoLabelSchedule[GotoLabelScheduleNum].pos=obp;
1319 pGotoLabelSchedule[GotoLabelScheduleNum].now_cp=cp;
1320 GotoLabelScheduleNum++;
1321 }
1322 *((long *)(OpBuffer+obp))=i-(obp+sizeof(long));
1323 obp+=sizeof(long);
1324 }
1325 else{
1326 LineNum=atoi(Parameter);
1327 i=GetLabelAddress(0,LineNum);
1328
1329 //call ...
1330 OpBuffer[obp++]=(char)0xE8;
1331 if(i==-1){
1332 pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapReAlloc(hHeap,0,pGotoLabelSchedule,(GotoLabelScheduleNum+1)*sizeof(GOTOLABELSCHEDULE));
1333 pGotoLabelSchedule[GotoLabelScheduleNum].pName=0;
1334 pGotoLabelSchedule[GotoLabelScheduleNum].line=LineNum;
1335 pGotoLabelSchedule[GotoLabelScheduleNum].pos=obp;
1336 pGotoLabelSchedule[GotoLabelScheduleNum].now_cp=cp;
1337 GotoLabelScheduleNum++;
1338 }
1339 *((long *)(OpBuffer+obp))=i-(obp+sizeof(long));
1340 obp+=sizeof(long);
1341 }
1342}
1343void OpcodeReturn(char *Parameter){
1344 extern BOOL bCompilingGlobal;
1345 if(bCompilingGlobal){
1346 //Gosub~Returnとして扱う
1347
1348 //ret
1349 OpBuffer[obp++]=(char)0xC3;
1350 }
1351 else{
1352 //戻り値をセット
1353 if(Parameter[0]){
1354 extern SUBINFO *pCompilingSubInfo;
1355 char *temp;
1356 if(pCompilingSubInfo->name[0]==1&&pCompilingSubInfo->name[1]==ESC_OPERATOR)
1357 temp="_System_ReturnValue";
1358 else temp=pCompilingSubInfo->name;
1359
1360 char temporary[VN_SIZE];
1361 sprintf(temporary,"%s=%s",temp,Parameter);
1362 OpcodeCalc(temporary);
1363 }
1364
1365 //プロシージャを抜け出す(C言語のreturnと同様の処理を行う)
1366 OpcodeExitSub();
1367 }
1368}
1369
1370void Opcode_Input(char *Parameter){
1371 extern int cp;
1372 int i2,i3,i4,i5,type;
1373 BOOL bFile;
1374 char temporary[VN_SIZE],temp2[VN_SIZE],buffer[VN_SIZE];
1375
1376 KillStringSpaces(Parameter);
1377
1378 if(Parameter[0]=='#'){
1379 bFile=1;
1380 for(i2=0,i3=1;;i2++,i3++){
1381 buffer[i2]=Parameter[i3];
1382 if(Parameter[i3]==','||Parameter[i3]=='\0') break;
1383 }
1384 buffer[i2+1]=0;
1385 i2=i3+1;
1386 }
1387 else{
1388 bFile=0;
1389 i2=0;
1390 buffer[0]=0;
1391
1392 //表示用文字列パラメータをセット
1393 if(Parameter[0]=='\"'){
1394 buffer[0]='\"';
1395 for(i2=1;;i2++){
1396 if(Parameter[i2]=='\"'){
1397 buffer[i2]=0;
1398 break;
1399 }
1400 buffer[i2]=Parameter[i2];
1401 }
1402 if(Parameter[i2+1]==';') lstrcpy(buffer+i2,"? \"");
1403 else if(Parameter[i2+1]==',') lstrcpy(buffer+i2,"\"");
1404 else SetError(10,"Input",cp);
1405 i2+=2;
1406 }
1407 else if((Parameter[0]=='e'||Parameter[0]=='E')&&
1408 (Parameter[1]=='x'||Parameter[1]=='X')&&
1409 Parameter[2]=='\"'){
1410 memcpy(buffer,Parameter,3);
1411 for(i2=3;;i2++){
1412 if(Parameter[i2]=='\"'){
1413 buffer[i2]=0;
1414 break;
1415 }
1416 buffer[i2]=Parameter[i2];
1417 }
1418 if(Parameter[i2+1]==';') lstrcpy(buffer+i2,"? \"");
1419 else if(Parameter[i2+1]==',') lstrcpy(buffer+i2,"\"");
1420 else SetError(10,"Input",cp);
1421 i2+=2;
1422 }
1423 else{
1424 lstrcpy(buffer,"\"? \"");
1425 i2=0;
1426 }
1427 }
1428
1429 //変数ポインタ、変数のタイプをセット
1430 i4=0;
1431 while(1){
1432 for(i3=0;;i2++,i3++){
1433 if(Parameter[i2]=='('){
1434 i5=GetStringInPare(temporary+i3,Parameter+i2);
1435 i2+=i5-1;
1436 i3+=i5-1;
1437 }
1438 if(Parameter[i2]=='['){
1439 i5=GetStringInBracket(temporary+i3,Parameter+i2);
1440 i2+=i5-1;
1441 i3+=i5-1;
1442 }
1443 if(Parameter[i2]==','){
1444 temporary[i3]=0;
1445 i2++;
1446 break;
1447 }
1448 temporary[i3]=Parameter[i2];
1449 if(Parameter[i2]=='\0') break;
1450 }
1451 if(temporary[0]=='\0'){
1452 SetError(10,"Input",cp);
1453 return;
1454 }
1455
1456 LONG_PTR lpIndex;
[11]1457 type = GetVarType(temporary,&lpIndex,1);
[3]1458
1459 sprintf(temp2,"_System_InputDataPtr[%d]=VarPtr(%s)",i4,temporary);
1460 OpcodeCalc(temp2);
1461
1462 if(type==DEF_LONG) type=DEF_DWORD;
1463 else if(type==DEF_INTEGER) type=DEF_WORD;
1464 else if(type==DEF_OBJECT){
1465 CClass *pobj_Class=(CClass *)lpIndex;
1466 if(lstrcmp(pobj_Class->name,"String")==0) type=DEF_STRING;
1467 }
1468 sprintf(temp2,"_System_InputDataType[%d]=%d",i4,type);
1469 OpcodeCalc(temp2);
1470
1471 i4++;
1472 if(Parameter[i2]=='\0') break;
1473 }
1474 sprintf(temp2,"_System_InputDataPtr[%d]=0",i4);
1475 OpcodeCalc(temp2);
1476
1477 SUBINFO *psi;
1478 if(bFile) psi=GetSubHash("INPUT_FromFile");
1479 else psi=GetSubHash("INPUT_FromPrompt");
1480 if(!psi){
1481 SetError(3,"Input",cp);
1482 return;
1483 }
[31]1484 Opcode_CallProc(buffer,psi,0,"",0);
[3]1485}
1486void Opcode_PrintUsing(char *Parameter,char *buffer,BOOL bFile){
1487 extern int cp;
1488 int i2,i3,i4,i5;
1489 char temporary[VN_SIZE],temp2[8192];
1490 BOOL bReturnLine;
1491
1492 i2=lstrlen(Parameter);
1493 if(Parameter[i2-1]==';'){
1494 bReturnLine=0;
1495 Parameter[i2-1]=0;
1496 }
1497 else bReturnLine=1;
1498
1499 i3=lstrlen(buffer);
1500 for(i2=0;;i2++,i3++){
1501 if(Parameter[i2]==';'){
1502 buffer[i3]=0;
1503 break;
1504 }
1505 buffer[i3]=Parameter[i2];
1506 if(Parameter[i2]=='\0') break;
1507 }
1508 if(Parameter[i2]==';') i2++;
1509
1510 if(bReturnLine) lstrcat(buffer,"+Ex\"\\r\\n\"");
1511
1512 //データポインタ、データのタイプをセット
1513 i4=0;
1514 while(1){
1515 for(i3=0;;i2++,i3++){
1516 if(Parameter[i2]=='\"'){
1517 temporary[i3]=Parameter[i2];
1518 for(i2++,i3++;;i2++,i3++){
1519 temporary[i3]=Parameter[i2];
1520 if(Parameter[i2]=='\"') break;
1521 }
1522 continue;
1523 }
1524 if(Parameter[i2]=='('){
1525 i5=GetStringInPare(temporary+i3,Parameter+i2);
1526 i2+=i5-1;
1527 i3+=i5-1;
1528 continue;
1529 }
1530 if(Parameter[i2]=='['){
1531 i5=GetStringInBracket(temporary+i3,Parameter+i2);
1532 i2+=i5-1;
1533 i3+=i5-1;
1534 continue;
1535 }
1536 if(Parameter[i2]==','){
1537 temporary[i3]=0;
1538 i2++;
1539 break;
1540 }
1541 temporary[i3]=Parameter[i2];
1542 if(Parameter[i2]=='\0') break;
1543 }
1544 if(temporary[0]=='\0'){
1545 SetError(10,"Print",cp);
1546 return;
1547 }
1548
1549 int iResult;
1550 iResult=IsStrCalculation(temporary);
1551
1552 if(iResult==1){
1553 //文字列
1554 sprintf(temp2,"_System_UsingStrData[%d]=%s",i4,temporary);
1555 OpcodeCalc(temp2);
1556
1557 sprintf(temp2,"_System_UsingDataType[%d]=%d",i4,DEF_STRING);
1558 OpcodeCalc(temp2);
1559 }
1560 else if(iResult==0){
1561 //数値
1562 sprintf(temp2,"_System_UsingDblData[%d]=%s",i4,temporary);
1563 OpcodeCalc(temp2);
1564
1565 sprintf(temp2,"_System_UsingDataType[%d]=%d",i4,DEF_DOUBLE);
1566 OpcodeCalc(temp2);
1567 }
1568 //else if(iResult==-1) エラー
1569
1570 i4++;
1571 if(Parameter[i2]=='\0') break;
1572 }
1573 sprintf(temp2,"_System_UsingDataType[%d]=-1",i4);
1574 OpcodeCalc(temp2);
1575
1576 SUBINFO *psi;
1577 if(bFile) psi=GetSubHash("PRINTUSING_ToFile");
1578 else psi=GetSubHash("PRINTUSING_ToPrompt");
1579 if(!psi){
1580 SetError(3,"Print",cp);
1581 return;
1582 }
[31]1583 Opcode_CallProc(buffer,psi,0,"",0);
[3]1584}
1585void Opcode_Print(char *Parameter,BOOL bWrite){
1586 int i2,i3,i4,sw;
1587 char temporary[VN_SIZE],buffer[VN_SIZE];
1588 BOOL bFile;
1589
1590 KillStringSpaces(Parameter);
1591
1592 if(Parameter[0]=='#'){
1593 bFile=1;
1594 for(i2=0,i3=1;;i2++,i3++){
1595 buffer[i2]=Parameter[i3];
1596 if(Parameter[i3]==','||Parameter[i3]=='\0') break;
1597 }
1598 buffer[i2+1]=0;
1599 if(Parameter[i3]==',') i3++;
1600 i2=i3;
1601 }
1602 else{
1603 bFile=0;
1604 i2=0;
1605 buffer[0]=0;
1606 }
1607 if(Parameter[i2]==1&&Parameter[i2+1]==ESC_USING){
1608 Opcode_PrintUsing(Parameter+i2+2,buffer,bFile);
1609 return;
1610 }
1611
1612 lstrcat(buffer,"_System_DummyStr+");
1613
1614 sw=1;
1615 while(1){
1616 for(i3=0;;i2++,i3++){
1617 if(Parameter[i2]=='\"'){
1618 temporary[i3]=Parameter[i2];
1619 for(i2++,i3++;;i2++,i3++){
1620 temporary[i3]=Parameter[i2];
1621 if(Parameter[i2]=='\"') break;
1622 }
1623 continue;
1624 }
1625 if(Parameter[i2]=='('){
1626 i4=GetStringInPare(temporary+i3,Parameter+i2);
1627 i2+=i4-1;
1628 i3+=i4-1;
1629 continue;
1630 }
1631 if(Parameter[i2]=='['){
1632 i4=GetStringInBracket(temporary+i3,Parameter+i2);
1633 i2+=i4-1;
1634 i3+=i4-1;
1635 continue;
1636 }
1637 if(Parameter[i2]==','||Parameter[i2]==';'){
1638 temporary[i3]=0;
1639 break;
1640 }
1641 temporary[i3]=Parameter[i2];
1642 if(Parameter[i2]=='\0') break;
1643 }
1644
1645 if(temporary[0]=='\0') lstrcat(buffer,"\"\"");
1646 else{
1647 int iResult;
1648 iResult=IsStrCalculation(temporary);
1649 if(iResult==-1){
1650 //エラー
1651 lstrcat(buffer,"\"\"");
1652 }
1653 else if(iResult){
1654 //文字列
1655 lstrcat(buffer,temporary);
1656 }
1657 else{
1658 //数値
1659 sprintf(buffer+lstrlen(buffer),"Str$(%s)",temporary);
1660 }
1661 }
1662
1663 if(Parameter[i2]==','){
1664 if(bWrite) lstrcat(buffer,"+\",\"+");
1665 else lstrcat(buffer,"+\"\t\"+");
1666 }
1667 else if(Parameter[i2]==';'){
1668 if(Parameter[i2+1]=='\0'){
1669 sw=0;
1670 break;
1671 }
1672 if(bWrite) lstrcat(buffer,"+\",\"+");
1673 else lstrcat(buffer,"+\" \"+");
1674 }
1675 else if(Parameter[i2]=='\0') break;
1676
1677 i2++;
1678 }
1679
1680 if(sw) lstrcat(buffer,"+Ex\"\\r\\n\"");
1681
1682 SUBINFO *psi;
1683 if(bFile) psi=GetSubHash("PRINT_ToFile");
1684 else psi=GetSubHash("PRINT_ToPrompt");
1685 if(!psi){
1686 SetError(3,"Print",cp);
1687 return;
1688 }
[31]1689 Opcode_CallProc(buffer,psi,0,"",0);
[3]1690}
1691
1692
1693
1694
1695////////////
1696// ポインタ
1697
1698void OpcodeCallPtr(char *Parameter){
1699 extern HANDLE hHeap;
1700 int i,i2,i3,num,types[255];
1701 BOOL bCdecl;
1702 char szFuncPtr[VN_SIZE],temporary[VN_SIZE],*Parms[255];
1703
1704 //関数ポインタを取得
1705 i=GetOneParameter(Parameter,0,szFuncPtr);
1706
1707 if(lstrcmpi(szFuncPtr,"cdecl")==0){
1708 //cdeclが指定された場合は、第2パラメータを関数ポインタとして扱う
1709 bCdecl=1;
1710
1711 i=GetOneParameter(Parameter,i,szFuncPtr);
1712 }
1713 else bCdecl=0;
1714
1715 if(Parameter[0]=='\0'){
1716 SetError(10,"CallPtr",cp);
1717 }
1718
1719 num=0;
1720 while(Parameter[i]){
1721 i=GetOneParameter(Parameter,i,temporary);
1722
1723 types[num]=DEF_LONG;
1724
1725 for(i2=0;;i2++){
1726 if(temporary[i2]=='\0') break;
1727 if(temporary[i2]==1&&temporary[i2+1]==ESC_AS){
1728 LONG_PTR lp;
1729 types[num]=GetTypeFixed(temporary+i2+2,&lp);
1730
1731 if(types[num]==DEF_OBJECT){
1732 SetError(11,temporary+i2+2,cp);
1733 }
1734
1735 temporary[i2]=0;
1736 break;
1737 }
1738 }
1739
1740 Parms[num]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
1741 lstrcpy(Parms[num],temporary);
1742
1743 num++;
1744 }
1745
1746 int ParmSize=0;
1747
1748 for(i=num-1;i>=0;i--){
1749 //スタックへプッシュ
1750 i3=NumOpe(Parms[i],0,0,0);
1751
1752 switch(types[i]){
1753 case DEF_INT64:
1754 case DEF_QWORD:
1755 ChangeTypeToInt64(i3);
1756 break;
1757 case DEF_SINGLE:
1758 ChangeTypeToSingle(i3);
1759 break;
1760 case DEF_DOUBLE:
1761 ChangeTypeToDouble(i3);
1762 break;
1763
1764 default:
1765 ChangeTypeToLong(i3);
1766 break;
1767 }
1768
1769 ParmSize+=GetTypeSize(types[i],0);
1770
1771 HeapDefaultFree(Parms[i]);
1772 }
1773
1774 i3=NumOpe(szFuncPtr,0,0,0);
1775 ChangeTypeToLong(i3);
1776
1777 //pop eax
1778 op_pop(REG_EAX);
1779
1780 //call eax
1781 OpBuffer[obp++]=(char)0xFF;
1782 OpBuffer[obp++]=(char)0xD0;
1783
1784 if(bCdecl){
1785 //スタックを戻す
1786
1787 //add esp,ParmSize
1788 op_add_esp(ParmSize);
1789 }
1790}
1791
1792void OpcodeSetPtrData(char *Parameter,int type){
1793 int i,i2;
1794 char temporary[VN_SIZE];
1795
1796 if(Parameter[0]=='('){
1797 i=JumpStringInPare(Parameter,1);
1798 if(Parameter[i+1]=='\0'){
1799 for(i=0;;i++){
1800 Parameter[i]=Parameter[i+1];
1801 if(Parameter[i]=='\0') break;
1802 }
1803 Parameter[i-1]=0;
1804 }
1805 }
1806
1807 //第1パラメータを取得
1808 i=GetOneParameter(Parameter,0,temporary);
1809 if(!Parameter[i]){
1810 SetError(1,NULL,cp);
1811 return;
1812 }
1813
1814 i2=NumOpe(temporary,0,0,0);
1815 ChangeTypeToLong(i2);
1816
1817 //第2パラメータを取得
1818 i=GetOneParameter(Parameter,i,temporary);
1819 if(Parameter[i]){
1820 SetError(1,NULL,cp);
1821 return;
1822 }
1823
1824 i2=NumOpe(temporary,0,0,0);
1825 if(type==DEF_DOUBLE){
1826 ChangeTypeToDouble_ToFpuReg(i2);
1827
1828 //pop eax
1829 op_pop(REG_EAX);
1830
1831 //fstp qword ptr[eax]
1832 OpBuffer[obp++]=(char)0xDD;
1833 OpBuffer[obp++]=(char)0x18;
1834 }
1835 else if(type==DEF_SINGLE){
1836 ChangeTypeToSingle(i2);
1837
1838 //pop ebx
1839 op_pop(REG_EBX);
1840
1841 //pop eax
1842 op_pop(REG_EAX);
1843
1844 //mov dword ptr[eax],ebx
1845 OpBuffer[obp++]=(char)0x89;
1846 OpBuffer[obp++]=(char)0x18;
1847 }
1848 else if(type==DEF_QWORD){
1849 ChangeTypeToInt64(i2);
1850
1851 //pop ecx
1852 op_pop(REG_ECX);
1853
1854 //pop ebx
1855 op_pop(REG_EBX);
1856
1857 //pop eax
1858 op_pop(REG_EAX);
1859
1860 //mov dword ptr[eax],ecx
1861 OpBuffer[obp++]=(char)0x89;
1862 OpBuffer[obp++]=(char)0x08;
1863
1864 //mov dword ptr[eax+sizeof(long)],ebx
1865 OpBuffer[obp++]=(char)0x89;
1866 OpBuffer[obp++]=(char)0x58;
1867 OpBuffer[obp++]=(char)0x04;
1868 }
1869 else if(type==DEF_DWORD){
1870 ChangeTypeToLong(i2);
1871
1872 //pop ebx
1873 op_pop(REG_EBX);
1874
1875 //pop eax
1876 op_pop(REG_EAX);
1877
1878 //mov dword ptr[eax],ebx
1879 OpBuffer[obp++]=(char)0x89;
1880 OpBuffer[obp++]=(char)0x18;
1881 }
1882 else if(type==DEF_WORD){
1883 ChangeTypeToLong(i2);
1884
1885 //pop ebx
1886 op_pop(REG_EBX);
1887
1888 //pop eax
1889 op_pop(REG_EAX);
1890
1891 //mov word ptr[eax],bx
1892 OpBuffer[obp++]=(char)0x66;
1893 OpBuffer[obp++]=(char)0x89;
1894 OpBuffer[obp++]=(char)0x18;
1895 }
1896 else if(type==DEF_BYTE){
1897 ChangeTypeToLong(i2);
1898
1899 //pop ebx
1900 op_pop(REG_EBX);
1901
1902 //pop eax
1903 op_pop(REG_EAX);
1904
1905 //mov byte ptr[eax],bl
1906 OpBuffer[obp++]=(char)0x88;
1907 OpBuffer[obp++]=(char)0x18;
1908 }
1909}
Note: See TracBrowser for help on using the repository browser.