source: dev/BasicCompiler32/Compile_Statement.cpp@ 73

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

Parameterクラスを適用。32bit側は動くようになったので、64bitのほうを調整する。

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_STRUCT){
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_V(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_V(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_V(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_V(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_V(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_V(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_SBYTE||
993 type1==DEF_BYTE||
994 type1==DEF_BOOLEAN||
995 type1==DEF_CHAR) CaseTypeSize=sizeof(long);
996 else{
997 CaseTypeSize=GetTypeSize(type1,lpIndex);
998 if(type1==DEF_OBJECT) CaseTypeSize=PTR_SIZE;
999 }
1000
1001 for(i=cp,sw=0;;i++){
1002 if(basbuf[i]=='\0'){
1003 HeapDefaultFree(pCaseSchedule);
1004 pCaseSchedule=temp_pCaseSchedule;
1005 CaseScheduleNum=temp_CaseScheduleNum;
1006 NowCaseSchedule=temp_NowCaseSchedule;
1007 CaseTypeSize=temp_CaseTypeSize;
1008 SetError(22,"Select",cp);
1009 return;
1010 }
1011 if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE){
1012 for(i2=0;;i++){
1013 if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE) i2++;
1014 if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT){
1015 i2--;
1016 if(i2==0) break;
1017 }
1018 }
1019 continue;
1020 }
1021 if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT){
1022 if(sw==0){
1023 //add esp,CaseTypeSize
1024 op_add_esp(CaseTypeSize);
1025 }
1026 break;
1027 }
1028 if(basbuf[i]==1&&basbuf[i+1]==ESC_CASE){
1029 NowCaseCp=i;
1030
1031 i++;
1032 while(1){
1033 for(i++,i2=0;;i++,i2++){
1034 if(basbuf[i]=='\"'){
1035 i3=GetStringInQuotation(temporary+i2,basbuf+i);
1036 i+=i3-1;
1037 i2+=i3-1;
1038 continue;
1039 }
1040 if(basbuf[i]=='('){
1041 i3=GetStringInPare(temporary+i2,basbuf+i);
1042 i+=i3-1;
1043 i2+=i3-1;
1044 continue;
1045 }
1046 if(basbuf[i]=='['){
1047 i3=GetStringInBracket(temporary+i2,basbuf+i);
1048 i+=i3-1;
1049 i2+=i3-1;
1050 continue;
1051 }
1052
1053 if(IsCommandDelimitation(basbuf[i])){
1054 temporary[i2]=0;
1055 break;
1056 }
1057 if(basbuf[i]==','){
1058 temporary[i2]=0;
1059 break;
1060 }
1061
1062 temporary[i2]=basbuf[i];
1063 }
1064
1065 //エラー用
1066 i2=cp;
1067 cp=NowCaseCp;
1068
1069 LONG_PTR lpIndex2;
1070 type2=NumOpe(temporary,type1,lpIndex,&lpIndex2);
1071
1072 cp=i2;
1073
1074 if(type1==DEF_OBJECT){
1075 CClass *pobj_c;
1076 pobj_c=(CClass *)lpIndex;
1077
1078 std::vector<SubInfo *> subs;
1079 pobj_c->EnumMethod( CALC_EQUAL, subs );
1080 if( subs.size() == 0 ){
1081 return;
1082 }
1083
1084 PARAMETER_INFO *ppi = (PARAMETER_INFO *)HeapAlloc(hHeap,0,sizeof(PARAMETER_INFO)*3);
1085 int iParmNum=0;
1086 ppi[iParmNum].bArray=0;
1087 ppi[iParmNum].bByVal=0;
1088 ppi[iParmNum].name=0;
1089 ppi[iParmNum].type=type2;
1090 ppi[iParmNum].u.index=lpIndex2;
1091 ppi[iParmNum].SubScripts[0]=-1;
1092 iParmNum++;
1093
1094 //オーバーロードを解決
1095 SubInfo *psi;
1096 psi=OverloadSolution("==",subs,ppi,iParmNum,NULL);
1097 HeapDefaultFree(ppi);
1098
1099 if(!psi){
1100 //エラー
1101 return;
1102 }
1103
1104
1105 //pop edx
1106 op_pop(REG_EDX);
1107
1108 //mov ecx,dword ptr[esp]
1109 op_mov_RM(sizeof(long),REG_ECX,REG_ESP,0,MOD_BASE);
1110
1111 //push edx
1112 op_push(REG_EDX);
1113
1114 //push ecx
1115 op_push(REG_ECX);
1116
1117 //call operator_proc ※ ==演算子
1118 op_call(psi);
1119
1120 //test eax,eax
1121 op_test(REG_EAX,REG_EAX);
1122
1123 //jne ...
1124 OpBuffer[obp++]=(char)0x0F;
1125 OpBuffer[obp++]=(char)0x85;
1126 AddCaseSchedule();
1127 obp+=sizeof(long);
1128 }
1129 else if(type1==DEF_DOUBLE){
1130 ChangeTypeToDouble(type2);
1131
1132 //fld qword ptr[esp]
1133 op_fld_ptr_esp(DEF_DOUBLE);
1134
1135 //add esp,CaseTypeSize
1136 op_add_esp(CaseTypeSize);
1137
1138 //fld qword ptr[esp]
1139 op_fld_ptr_esp(DEF_DOUBLE);
1140
1141 //fcompp
1142 OpBuffer[obp++]=(char)0xDE;
1143 OpBuffer[obp++]=(char)0xD9;
1144
1145 //fnstsw ax
1146 OpBuffer[obp++]=(char)0xDF;
1147 OpBuffer[obp++]=(char)0xE0;
1148
1149 //test ah,40
1150 OpBuffer[obp++]=(char)0xF6;
1151 OpBuffer[obp++]=(char)0xC4;
1152 OpBuffer[obp++]=(char)0x40;
1153
1154 //jne ...
1155 OpBuffer[obp++]=(char)0x0F;
1156 OpBuffer[obp++]=(char)0x85;
1157 AddCaseSchedule();
1158 obp+=sizeof(long);
1159 }
1160 else if(type1==DEF_SINGLE){
1161 ChangeTypeToSingle(type2);
1162
1163 //fld dword ptr[esp]
1164 op_fld_ptr_esp(DEF_SINGLE);
1165
1166 //add esp,CaseTypeSize
1167 op_add_esp(CaseTypeSize);
1168
1169 //fld dword ptr[esp]
1170 op_fld_ptr_esp(DEF_SINGLE);
1171
1172 //fcompp
1173 OpBuffer[obp++]=(char)0xDE;
1174 OpBuffer[obp++]=(char)0xD9;
1175
1176 //fnstsw ax
1177 OpBuffer[obp++]=(char)0xDF;
1178 OpBuffer[obp++]=(char)0xE0;
1179
1180 //test ah,40
1181 OpBuffer[obp++]=(char)0xF6;
1182 OpBuffer[obp++]=(char)0xC4;
1183 OpBuffer[obp++]=(char)0x40;
1184
1185 //jne ...
1186 OpBuffer[obp++]=(char)0x0F;
1187 OpBuffer[obp++]=(char)0x85;
1188 AddCaseSchedule();
1189 obp+=sizeof(long);
1190 }
1191 else{
1192 //その他整数型
1193
1194 //pop ebx
1195 op_pop(REG_EBX);
1196
1197 //mov eax,dword ptr[esp]
1198 OpBuffer[obp++]=(char)0x8B;
1199 OpBuffer[obp++]=(char)0x04;
1200 OpBuffer[obp++]=(char)0x24;
1201
1202 //cmp eax,ebx
1203 OpBuffer[obp++]=(char)0x3B;
1204 OpBuffer[obp++]=(char)0xC3;
1205
1206 //je ...
1207 OpBuffer[obp++]=(char)0x0F;
1208 OpBuffer[obp++]=(char)0x84;
1209 AddCaseSchedule();
1210 obp+=sizeof(long);
1211 }
1212
1213 if(basbuf[i]!=',') break;
1214 }
1215 }
1216 if(basbuf[i]==1&&basbuf[i+1]==ESC_CASEELSE){
1217 sw=1;
1218
1219 //jmp ...
1220 OpBuffer[obp++]=(char)0xE9;
1221 AddCaseSchedule();
1222 obp+=sizeof(long);
1223 }
1224 }
1225
1226 //レキシカルスコープをレベルアップ
1227 obj_LexScopes.Start( obp, SCOPE_TYPE_SELECT );
1228
1229 //Select Case内をコンパイル
1230 CompileBuffer(ESC_ENDSELECT,0);
1231
1232 //jmp EndSelect
1233 OpBuffer[obp++]=(char)0xE9;
1234 AddCaseSchedule();
1235 obp+=sizeof(long);
1236
1237 //最終スケジュール
1238 for(i=NowCaseSchedule;i<CaseScheduleNum;i++){
1239 *(long *)(OpBuffer+pCaseSchedule[i])=obp-(pCaseSchedule[i]+sizeof(long));
1240 }
1241 HeapDefaultFree(pCaseSchedule);
1242
1243 //レキシカルスコープをレベルダウン
1244 obj_LexScopes.End();
1245
1246 pCaseSchedule=temp_pCaseSchedule;
1247 CaseScheduleNum=temp_CaseScheduleNum;
1248 NowCaseSchedule=temp_NowCaseSchedule;
1249 CaseTypeSize=temp_CaseTypeSize;
1250}
1251void OpcodeCase(char *Parameter){
1252 extern DWORD *pCaseSchedule;
1253 extern int NowCaseSchedule;
1254 extern int CaseTypeSize;
1255 int i;
1256
1257 if(!pCaseSchedule){
1258 SetError(30,"Case",cp);
1259 return;
1260 }
1261
1262 //jmp EndSelect
1263 OpBuffer[obp++]=(char)0xE9;
1264 AddCaseSchedule();
1265 obp+=sizeof(long);
1266
1267 i=0;
1268 while(1){
1269 //Caseスケジュール
1270 *(long *)(OpBuffer+pCaseSchedule[NowCaseSchedule])=obp-(pCaseSchedule[NowCaseSchedule]+sizeof(long));
1271 NowCaseSchedule++;
1272
1273 i=JumpOneParameter(Parameter,i);
1274 if(Parameter[i]=='\0') break;
1275 }
1276
1277 //add esp,CaseTypeSize
1278 op_add_esp(CaseTypeSize);
1279}
1280
1281void OpcodeGosub(char *Parameter){
1282 extern HANDLE hHeap;
1283 extern GOTOLABELSCHEDULE *pGotoLabelSchedule;
1284 extern int GotoLabelScheduleNum;
1285 int i,LineNum;
1286
1287 if(Parameter[0]=='*'){
1288 i=GetLabelAddress(Parameter+1,0);
1289
1290 //call ...
1291 OpBuffer[obp++]=(char)0xE8;
1292 if(i==-1){
1293 pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapReAlloc(hHeap,0,pGotoLabelSchedule,(GotoLabelScheduleNum+1)*sizeof(GOTOLABELSCHEDULE));
1294 pGotoLabelSchedule[GotoLabelScheduleNum].pName=(char *)HeapAlloc(hHeap,0,lstrlen(Parameter+1)+1);
1295 lstrcpy(pGotoLabelSchedule[GotoLabelScheduleNum].pName,Parameter+1);
1296 pGotoLabelSchedule[GotoLabelScheduleNum].pos=obp;
1297 pGotoLabelSchedule[GotoLabelScheduleNum].now_cp=cp;
1298 GotoLabelScheduleNum++;
1299 }
1300 *((long *)(OpBuffer+obp))=i-(obp+sizeof(long));
1301 obp+=sizeof(long);
1302 }
1303 else{
1304 LineNum=atoi(Parameter);
1305 i=GetLabelAddress(0,LineNum);
1306
1307 //call ...
1308 OpBuffer[obp++]=(char)0xE8;
1309 if(i==-1){
1310 pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapReAlloc(hHeap,0,pGotoLabelSchedule,(GotoLabelScheduleNum+1)*sizeof(GOTOLABELSCHEDULE));
1311 pGotoLabelSchedule[GotoLabelScheduleNum].pName=0;
1312 pGotoLabelSchedule[GotoLabelScheduleNum].line=LineNum;
1313 pGotoLabelSchedule[GotoLabelScheduleNum].pos=obp;
1314 pGotoLabelSchedule[GotoLabelScheduleNum].now_cp=cp;
1315 GotoLabelScheduleNum++;
1316 }
1317 *((long *)(OpBuffer+obp))=i-(obp+sizeof(long));
1318 obp+=sizeof(long);
1319 }
1320}
1321void OpcodeReturn(char *Parameter){
1322 extern BOOL bCompilingGlobal;
1323 if(bCompilingGlobal){
1324 //Gosub~Returnとして扱う
1325
1326 //ret
1327 OpBuffer[obp++]=(char)0xC3;
1328 }
1329 else{
1330 //戻り値をセット
1331 if(Parameter[0]){
1332 extern SubInfo *pCompilingSubInfo;
1333 char *temp;
1334 if(pCompilingSubInfo->name[0]==1&&pCompilingSubInfo->name[1]==ESC_OPERATOR)
1335 temp="_System_ReturnValue";
1336 else temp=pCompilingSubInfo->name;
1337
1338 /*
1339 TODO: 消す
1340 if( pCompilingSubInfo->isReturnRef ){
1341 //参照型
1342 SetRefVariable( temp, Parameter );
1343 }
1344 else{
1345 //値型*/
1346 char temporary[VN_SIZE];
1347 sprintf(temporary,"%s=%s",temp,Parameter);
1348 OpcodeCalc(temporary);
1349 //}
1350 }
1351
1352 //プロシージャを抜け出す(C言語のreturnと同様の処理を行う)
1353 OpcodeExitSub();
1354 }
1355}
1356
1357void Opcode_Input(const char *Parameter){
1358 extern int cp;
1359 int i2,i3,i4,i5,type;
1360 BOOL bFile;
1361 char temporary[VN_SIZE],temp2[VN_SIZE],buffer[VN_SIZE];
1362
1363 if(Parameter[0]=='#'){
1364 bFile=1;
1365 for(i2=0,i3=1;;i2++,i3++){
1366 buffer[i2]=Parameter[i3];
1367 if(Parameter[i3]==','||Parameter[i3]=='\0') break;
1368 }
1369 buffer[i2+1]=0;
1370 i2=i3+1;
1371 }
1372 else{
1373 bFile=0;
1374 i2=0;
1375 buffer[0]=0;
1376
1377 //表示用文字列パラメータをセット
1378 if(Parameter[0]=='\"'){
1379 buffer[0]='\"';
1380 for(i2=1;;i2++){
1381 if(Parameter[i2]=='\"'){
1382 buffer[i2]=0;
1383 break;
1384 }
1385 buffer[i2]=Parameter[i2];
1386 }
1387 if(Parameter[i2+1]==';') lstrcpy(buffer+i2,"? \"");
1388 else if(Parameter[i2+1]==',') lstrcpy(buffer+i2,"\"");
1389 else SetError(10,"Input",cp);
1390 i2+=2;
1391 }
1392 else if((Parameter[0]=='e'||Parameter[0]=='E')&&
1393 (Parameter[1]=='x'||Parameter[1]=='X')&&
1394 Parameter[2]=='\"'){
1395 memcpy(buffer,Parameter,3);
1396 for(i2=3;;i2++){
1397 if(Parameter[i2]=='\"'){
1398 buffer[i2]=0;
1399 break;
1400 }
1401 buffer[i2]=Parameter[i2];
1402 }
1403 if(Parameter[i2+1]==';') lstrcpy(buffer+i2,"? \"");
1404 else if(Parameter[i2+1]==',') lstrcpy(buffer+i2,"\"");
1405 else SetError(10,"Input",cp);
1406 i2+=2;
1407 }
1408 else{
1409 lstrcpy(buffer,"\"? \"");
1410 i2=0;
1411 }
1412 }
1413
1414 //変数ポインタ、変数のタイプをセット
1415 i4=0;
1416 while(1){
1417 for(i3=0;;i2++,i3++){
1418 if(Parameter[i2]=='('){
1419 i5=GetStringInPare(temporary+i3,Parameter+i2);
1420 i2+=i5-1;
1421 i3+=i5-1;
1422 }
1423 if(Parameter[i2]=='['){
1424 i5=GetStringInBracket(temporary+i3,Parameter+i2);
1425 i2+=i5-1;
1426 i3+=i5-1;
1427 }
1428 if(Parameter[i2]==','){
1429 temporary[i3]=0;
1430 i2++;
1431 break;
1432 }
1433 temporary[i3]=Parameter[i2];
1434 if(Parameter[i2]=='\0') break;
1435 }
1436 if(temporary[0]=='\0'){
1437 SetError(10,"Input",cp);
1438 return;
1439 }
1440
1441 LONG_PTR lpIndex;
1442 type = GetVarType(temporary,&lpIndex,1);
1443
1444 sprintf(temp2,"_System_InputDataPtr[%d]=VarPtr(%s)",i4,temporary);
1445 OpcodeCalc(temp2);
1446
1447 if(type==DEF_LONG) type=DEF_DWORD;
1448 else if(type==DEF_INTEGER) type=DEF_WORD;
1449 else if(type==DEF_OBJECT){
1450 CClass *pobj_Class=(CClass *)lpIndex;
1451 if(lstrcmp(pobj_Class->name,"String")==0) type=DEF_STRING;
1452 }
1453 sprintf(temp2,"_System_InputDataType[%d]=%d",i4,type);
1454 OpcodeCalc(temp2);
1455
1456 i4++;
1457 if(Parameter[i2]=='\0') break;
1458 }
1459 sprintf(temp2,"_System_InputDataPtr[%d]=0",i4);
1460 OpcodeCalc(temp2);
1461
1462 SubInfo *psi;
1463 if(bFile) psi=GetSubHash("INPUT_FromFile");
1464 else psi=GetSubHash("INPUT_FromPrompt");
1465 if(!psi){
1466 SetError(3,"Input",cp);
1467 return;
1468 }
1469 Opcode_CallProc(buffer,psi,0,"",0);
1470}
1471void Opcode_PrintUsing(const char *Parameter,char *buffer,BOOL bFile){
1472 extern int cp;
1473 int i2,i3,i4,i5;
1474 char temporary[VN_SIZE],temp2[8192];
1475 BOOL bReturnLine;
1476
1477 char parms[8192];
1478 lstrcpy( parms, Parameter );
1479
1480 i2=lstrlen(parms);
1481 if(parms[i2-1]==';'){
1482 bReturnLine=0;
1483 parms[i2-1]=0;
1484 }
1485 else bReturnLine=1;
1486
1487 i3=lstrlen(buffer);
1488 for(i2=0;;i2++,i3++){
1489 if(parms[i2]==';'){
1490 buffer[i3]=0;
1491 break;
1492 }
1493 buffer[i3]=parms[i2];
1494 if(parms[i2]=='\0') break;
1495 }
1496 if(parms[i2]==';') i2++;
1497
1498 if(bReturnLine) lstrcat(buffer,"+Ex\"\\r\\n\"");
1499
1500 //データポインタ、データのタイプをセット
1501 i4=0;
1502 while(1){
1503 for(i3=0;;i2++,i3++){
1504 if(parms[i2]=='\"'){
1505 temporary[i3]=parms[i2];
1506 for(i2++,i3++;;i2++,i3++){
1507 temporary[i3]=parms[i2];
1508 if(parms[i2]=='\"') break;
1509 }
1510 continue;
1511 }
1512 if(parms[i2]=='('){
1513 i5=GetStringInPare(temporary+i3,parms+i2);
1514 i2+=i5-1;
1515 i3+=i5-1;
1516 continue;
1517 }
1518 if(parms[i2]=='['){
1519 i5=GetStringInBracket(temporary+i3,parms+i2);
1520 i2+=i5-1;
1521 i3+=i5-1;
1522 continue;
1523 }
1524 if(parms[i2]==','){
1525 temporary[i3]=0;
1526 i2++;
1527 break;
1528 }
1529 temporary[i3]=parms[i2];
1530 if(parms[i2]=='\0') break;
1531 }
1532 if(temporary[0]=='\0'){
1533 SetError(10,"Print",cp);
1534 return;
1535 }
1536
1537 int iResult;
1538 iResult=IsStrCalculation(temporary);
1539
1540 if(iResult==1){
1541 //文字列
1542 sprintf(temp2,"_System_UsingStrData[%d]=%s",i4,temporary);
1543 OpcodeCalc(temp2);
1544
1545 sprintf(temp2,"_System_UsingDataType[%d]=%d",i4,DEF_STRING);
1546 OpcodeCalc(temp2);
1547 }
1548 else if(iResult==0){
1549 //数値
1550 sprintf(temp2,"_System_UsingDblData[%d]=%s",i4,temporary);
1551 OpcodeCalc(temp2);
1552
1553 sprintf(temp2,"_System_UsingDataType[%d]=%d",i4,DEF_DOUBLE);
1554 OpcodeCalc(temp2);
1555 }
1556 //else if(iResult==-1) エラー
1557
1558 i4++;
1559 if(parms[i2]=='\0') break;
1560 }
1561 sprintf(temp2,"_System_UsingDataType[%d]=-1",i4);
1562 OpcodeCalc(temp2);
1563
1564 SubInfo *psi;
1565 if(bFile) psi=GetSubHash("PRINTUSING_ToFile");
1566 else psi=GetSubHash("PRINTUSING_ToPrompt");
1567 if(!psi){
1568 SetError(3,"Print",cp);
1569 return;
1570 }
1571 Opcode_CallProc(buffer,psi,0,"",0);
1572}
1573void Opcode_Print(const char *Parameter,BOOL bWrite){
1574 int i2,i3,i4,sw;
1575 char temporary[VN_SIZE],buffer[VN_SIZE];
1576 BOOL bFile;
1577
1578 if(Parameter[0]=='#'){
1579 bFile=1;
1580 for(i2=0,i3=1;;i2++,i3++){
1581 buffer[i2]=Parameter[i3];
1582 if(Parameter[i3]==','||Parameter[i3]=='\0') break;
1583 }
1584 buffer[i2+1]=0;
1585 if(Parameter[i3]==',') i3++;
1586 i2=i3;
1587 }
1588 else{
1589 bFile=0;
1590 i2=0;
1591 buffer[0]=0;
1592 }
1593 if(Parameter[i2]==1&&Parameter[i2+1]==ESC_USING){
1594 Opcode_PrintUsing(Parameter+i2+2,buffer,bFile);
1595 return;
1596 }
1597
1598 lstrcat(buffer,"_System_DummyStr+");
1599
1600 sw=1;
1601 while(1){
1602 for(i3=0;;i2++,i3++){
1603 if(Parameter[i2]=='\"'){
1604 temporary[i3]=Parameter[i2];
1605 for(i2++,i3++;;i2++,i3++){
1606 temporary[i3]=Parameter[i2];
1607 if(Parameter[i2]=='\"') break;
1608 }
1609 continue;
1610 }
1611 if(Parameter[i2]=='('){
1612 i4=GetStringInPare(temporary+i3,Parameter+i2);
1613 i2+=i4-1;
1614 i3+=i4-1;
1615 continue;
1616 }
1617 if(Parameter[i2]=='['){
1618 i4=GetStringInBracket(temporary+i3,Parameter+i2);
1619 i2+=i4-1;
1620 i3+=i4-1;
1621 continue;
1622 }
1623 if(Parameter[i2]==','||Parameter[i2]==';'){
1624 temporary[i3]=0;
1625 break;
1626 }
1627 temporary[i3]=Parameter[i2];
1628 if(Parameter[i2]=='\0') break;
1629 }
1630
1631 if(temporary[0]=='\0') lstrcat(buffer,"\"\"");
1632 else{
1633 int iResult;
1634 iResult=IsStrCalculation(temporary);
1635 if(iResult==-1){
1636 //エラー
1637 lstrcat(buffer,"\"\"");
1638 }
1639 else if(iResult){
1640 //文字列
1641 lstrcat(buffer,temporary);
1642 }
1643 else{
1644 //数値
1645 sprintf(buffer+lstrlen(buffer),"Str$(%s)",temporary);
1646 }
1647 }
1648
1649 if(Parameter[i2]==','){
1650 if(bWrite) lstrcat(buffer,"+\",\"+");
1651 else lstrcat(buffer,"+\"\t\"+");
1652 }
1653 else if(Parameter[i2]==';'){
1654 if(Parameter[i2+1]=='\0'){
1655 sw=0;
1656 break;
1657 }
1658 if(bWrite) lstrcat(buffer,"+\",\"+");
1659 else lstrcat(buffer,"+\" \"+");
1660 }
1661 else if(Parameter[i2]=='\0') break;
1662
1663 i2++;
1664 }
1665
1666 if(sw) lstrcat(buffer,"+Ex\"\\r\\n\"");
1667
1668 SubInfo *psi;
1669 if(bFile) psi=GetSubHash("PRINT_ToFile");
1670 else psi=GetSubHash("PRINT_ToPrompt");
1671 if(!psi){
1672 SetError(3,"Print",cp);
1673 return;
1674 }
1675 Opcode_CallProc(buffer,psi,0,"",0);
1676}
1677
1678
1679
1680
1681////////////
1682// ポインタ
1683
1684void OpcodeCallPtr(char *Parameter){
1685 extern HANDLE hHeap;
1686 int i,i2,i3,num,types[255];
1687 BOOL bCdecl;
1688 char szFuncPtr[VN_SIZE],temporary[VN_SIZE],*Parms[255];
1689
1690 //関数ポインタを取得
1691 i=GetOneParameter(Parameter,0,szFuncPtr);
1692
1693 if(lstrcmpi(szFuncPtr,"cdecl")==0){
1694 //cdeclが指定された場合は、第2パラメータを関数ポインタとして扱う
1695 bCdecl=1;
1696
1697 i=GetOneParameter(Parameter,i,szFuncPtr);
1698 }
1699 else bCdecl=0;
1700
1701 if(Parameter[0]=='\0'){
1702 SetError(10,"CallPtr",cp);
1703 }
1704
1705 num=0;
1706 while(Parameter[i]){
1707 i=GetOneParameter(Parameter,i,temporary);
1708
1709 types[num]=DEF_LONG;
1710
1711 for(i2=0;;i2++){
1712 if(temporary[i2]=='\0') break;
1713 if(temporary[i2]==1&&temporary[i2+1]==ESC_AS){
1714 LONG_PTR lp;
1715 types[num]=GetTypeFixed(temporary+i2+2,&lp);
1716
1717 if(types[num]==DEF_OBJECT){
1718 SetError(11,temporary+i2+2,cp);
1719 }
1720
1721 temporary[i2]=0;
1722 break;
1723 }
1724 }
1725
1726 Parms[num]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
1727 lstrcpy(Parms[num],temporary);
1728
1729 num++;
1730 }
1731
1732 int ParmSize=0;
1733
1734 for(i=num-1;i>=0;i--){
1735 //スタックへプッシュ
1736 i3=NumOpe(Parms[i],0,0,0);
1737
1738 switch(types[i]){
1739 case DEF_INT64:
1740 case DEF_QWORD:
1741 ChangeTypeToInt64(i3);
1742 break;
1743 case DEF_SINGLE:
1744 ChangeTypeToSingle(i3);
1745 break;
1746 case DEF_DOUBLE:
1747 ChangeTypeToDouble(i3);
1748 break;
1749
1750 default:
1751 ChangeTypeToLong(i3);
1752 break;
1753 }
1754
1755 ParmSize+=GetTypeSize(types[i],0);
1756
1757 HeapDefaultFree(Parms[i]);
1758 }
1759
1760 i3=NumOpe(szFuncPtr,0,0,0);
1761 ChangeTypeToLong(i3);
1762
1763 //pop eax
1764 op_pop(REG_EAX);
1765
1766 //call eax
1767 OpBuffer[obp++]=(char)0xFF;
1768 OpBuffer[obp++]=(char)0xD0;
1769
1770 if(bCdecl){
1771 //スタックを戻す
1772
1773 //add esp,ParmSize
1774 op_add_esp(ParmSize);
1775 }
1776}
1777
1778void OpcodeSetPtrData(char *Parameter,int type){
1779 int i,i2;
1780 char temporary[VN_SIZE];
1781
1782 if(Parameter[0]=='('){
1783 i=JumpStringInPare(Parameter,1);
1784 if(Parameter[i+1]=='\0'){
1785 for(i=0;;i++){
1786 Parameter[i]=Parameter[i+1];
1787 if(Parameter[i]=='\0') break;
1788 }
1789 Parameter[i-1]=0;
1790 }
1791 }
1792
1793 //第1パラメータを取得
1794 i=GetOneParameter(Parameter,0,temporary);
1795 if(!Parameter[i]){
1796 SetError(1,NULL,cp);
1797 return;
1798 }
1799
1800 i2=NumOpe(temporary,0,0,0);
1801 ChangeTypeToLong(i2);
1802
1803 //第2パラメータを取得
1804 i=GetOneParameter(Parameter,i,temporary);
1805 if(Parameter[i]){
1806 SetError(1,NULL,cp);
1807 return;
1808 }
1809
1810 i2=NumOpe(temporary,0,0,0);
1811 if(type==DEF_DOUBLE){
1812 ChangeTypeToDouble_ToFpuReg(i2);
1813
1814 //pop eax
1815 op_pop(REG_EAX);
1816
1817 //fstp qword ptr[eax]
1818 OpBuffer[obp++]=(char)0xDD;
1819 OpBuffer[obp++]=(char)0x18;
1820 }
1821 else if(type==DEF_SINGLE){
1822 ChangeTypeToSingle(i2);
1823
1824 //pop ebx
1825 op_pop(REG_EBX);
1826
1827 //pop eax
1828 op_pop(REG_EAX);
1829
1830 //mov dword ptr[eax],ebx
1831 OpBuffer[obp++]=(char)0x89;
1832 OpBuffer[obp++]=(char)0x18;
1833 }
1834 else if(type==DEF_QWORD){
1835 ChangeTypeToInt64(i2);
1836
1837 //pop ecx
1838 op_pop(REG_ECX);
1839
1840 //pop ebx
1841 op_pop(REG_EBX);
1842
1843 //pop eax
1844 op_pop(REG_EAX);
1845
1846 //mov dword ptr[eax],ecx
1847 OpBuffer[obp++]=(char)0x89;
1848 OpBuffer[obp++]=(char)0x08;
1849
1850 //mov dword ptr[eax+sizeof(long)],ebx
1851 OpBuffer[obp++]=(char)0x89;
1852 OpBuffer[obp++]=(char)0x58;
1853 OpBuffer[obp++]=(char)0x04;
1854 }
1855 else if(type==DEF_DWORD){
1856 ChangeTypeToLong(i2);
1857
1858 //pop ebx
1859 op_pop(REG_EBX);
1860
1861 //pop eax
1862 op_pop(REG_EAX);
1863
1864 //mov dword ptr[eax],ebx
1865 OpBuffer[obp++]=(char)0x89;
1866 OpBuffer[obp++]=(char)0x18;
1867 }
1868 else if(type==DEF_WORD){
1869 ChangeTypeToLong(i2);
1870
1871 //pop ebx
1872 op_pop(REG_EBX);
1873
1874 //pop eax
1875 op_pop(REG_EAX);
1876
1877 //mov word ptr[eax],bx
1878 OpBuffer[obp++]=(char)0x66;
1879 OpBuffer[obp++]=(char)0x89;
1880 OpBuffer[obp++]=(char)0x18;
1881 }
1882 else if(type==DEF_BYTE){
1883 ChangeTypeToLong(i2);
1884
1885 //pop ebx
1886 op_pop(REG_EBX);
1887
1888 //pop eax
1889 op_pop(REG_EAX);
1890
1891 //mov byte ptr[eax],bl
1892 OpBuffer[obp++]=(char)0x88;
1893 OpBuffer[obp++]=(char)0x18;
1894 }
1895}
Note: See TracBrowser for help on using the repository browser.