source: dev/BasicCompiler32/Compile_Statement.cpp@ 51

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

ppobj_Member及びppobj_StaticMemberを廃止し、vectorに統一した(methods及びstaticMethods)。

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