source: dev/BasicCompiler32/Compile_Statement.cpp@ 50

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

オーバーロード解決用の関数保持リストを "SUBINFO " ではなく、"vector<SUBINFO *>" に変更した。

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