source: dev/BasicCompiler_Common/Intermediate_Step2.cpp@ 75

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

TYPEINFO→Typeへのリファクタリングを実施。64bitはほぼ完了。32bitが全般的に未完成。

File size: 16.3 KB
Line 
1#include "../BasicCompiler_Common/common.h"
2
3CONSTINFO *GetNewConstHash(char *name){
4 extern int cp;
5 CONSTINFO *pci;
6
7 int key;
8 key=hash_default(name);
9
10 extern CONSTINFO **ppConstHash;
11 if(ppConstHash[key]){
12 pci=ppConstHash[key];
13 while(1){
14 if(lstrcmp(pci->name,name)==0){
15 //重複エラー
16 SetError(15,name,cp);
17 return 0;
18 }
19
20 if(pci->pNextData==0){
21 pci->pNextData=(CONSTINFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(CONSTINFO));
22 break;
23 }
24 pci=pci->pNextData;
25 }
26 pci=pci->pNextData;
27 }
28 else{
29 ppConstHash[key]=(CONSTINFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(CONSTINFO));
30 pci=ppConstHash[key];
31 }
32
33 return pci;
34}
35
36// マクロ定数を追加するための関数
37void AddConstData(char *Command){
38 extern HANDLE hHeap;
39 extern int cp;
40 int i,i2;
41 char temporary[VN_SIZE];
42
43 for(i=0;;i++){
44 if(Command[i]=='\0'){
45 SetError(10,"Const",cp);
46 return;
47 }
48 if(Command[i]=='=' || Command[i] == 1 && Command[i+1] == ESC_AS ){
49 //定数定義は新しいクラスモジュール(CDBConst)へ移行
50 // ※この関数はマクロ定数のみを扱う
51 return;
52 }
53 if(Command[i]=='('){
54 temporary[i]=0;
55 break;
56 }
57 temporary[i]=Command[i];
58 }
59
60
61 /////////////////////////////////
62 // 格納位置を計算してpciにセット
63 /////////////////////////////////
64
65 CONSTINFO *pci;
66 pci=GetNewConstHash(temporary);
67 if(!pci) return;
68
69
70
71 ////////////////////
72 // 定数情報を取得
73 ////////////////////
74
75 //定数名
76 pci->name=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
77 lstrcpy(pci->name,temporary);
78
79 if(Command[i]=='('){
80 pci->ppParm=(char **)HeapAlloc(hHeap,0,1);
81 pci->ParmNum=0;
82 for(i++,i2=0;;i++,i2++){
83 if(Command[i]=='\0'){
84 SetError(1,NULL,cp);
85 return;
86 }
87 if(Command[i]==','||Command[i]==')'){
88 temporary[i2]=0;
89 pci->ppParm=(char **)HeapReAlloc(hHeap,0,pci->ppParm,(pci->ParmNum+1)*sizeof(char *));
90 pci->ppParm[pci->ParmNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
91 lstrcpy(pci->ppParm[pci->ParmNum],temporary);
92 pci->ParmNum++;
93 if(Command[i]==')'){
94 i++;
95 if(Command[i]!='='){
96 SetError(1,NULL,cp);
97 return;
98 }
99 break;
100 }
101
102 i2=-1;
103 continue;
104 }
105 temporary[i2]=Command[i];
106 }
107 }
108 else pci->ParmNum=0;
109
110 //データ
111 lstrcpy(temporary,Command+i+1);
112 if(pci->ParmNum){
113 pci->StrValue=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
114 lstrcpy(pci->StrValue,temporary);
115 }
116 else if(temporary[0]=='\"'){
117 //文字列定数
118 RemoveStringQuotes(temporary);
119 i2=lstrlen(temporary);
120
121 pci->StrValue=(char *)HeapAlloc(hHeap,0,i2+1);
122 memcpy(pci->StrValue,temporary,i2);
123 pci->StrValue[i2]=0;
124
125 pci->DblValue=(double)i2;
126
127 pci->type=DEF_STRING;
128 pci->lpIndex=-1;
129 }
130 else if((temporary[0]=='e'||temporary[0]=='E')&&
131 (temporary[1]=='x'||temporary[1]=='X')&&
132 temporary[2]=='\"'){
133 //文字列定数
134 RemoveStringQuotes(temporary+2);
135 i2=FormatString_EscapeSequence(temporary+2);
136 pci->StrValue=(char *)HeapAlloc(hHeap,0,i2+1);
137 memcpy(pci->StrValue,temporary+2,i2);
138 pci->StrValue[i2]=0;
139
140 pci->DblValue=(double)i2;
141
142 pci->type=DEF_STRING;
143 pci->lpIndex=-1;
144 }
145 else{
146 //数値定数
147 _int64 i64data;
148 Type resultType;
149 StaticCalculation(true, temporary,0,&i64data,resultType);
150 pci->type=resultType.GetBasicType();
151 if(IsRealNumberType(pci->type)){
152 //実数型
153 memcpy(&pci->DblValue,&i64data,sizeof(double));
154 }
155 else if(Is64Type(pci->type)){
156 //64ビット型
157 pci->i64Value=i64data;
158 }
159 else if(IsWholeNumberType(pci->type)){
160 //その他整数型
161 pci->DblValue=(double)i64data;
162 }
163
164 pci->StrValue=0;
165 }
166}
167void AddConstEnum(char *buffer){
168 extern int cp;
169 int i=0,i2;
170
171 if(!(buffer[i]==1&&buffer[i+1]==ESC_ENUM)) return;
172 i+=2;
173
174 //列挙体の名前を取得
175 char temporary[VN_SIZE];
176 for(i2=0;;i++,i2++){
177 if(IsCommandDelimitation(buffer[i])){
178 temporary[i2]=0;
179 break;
180 }
181 if(!IsVariableChar(buffer[i])){
182 SetError(1,NULL,i);
183 break;
184 }
185 temporary[i2]=buffer[i];
186 }
187
188 //新しい型情報を追加
189 pobj_DBTypeDef->add(temporary,"Long");
190
191 if(buffer[i]=='\0'){
192 SetError(22,"Enum",cp);
193 return;
194 }
195
196 int NextValue=0;
197 while(1){
198 i++;
199
200 if(buffer[i]==1&&buffer[i+1]==ESC_ENDENUM) break;
201
202 for(i2=0;;i2++,i++){
203 if(IsCommandDelimitation(buffer[i])){
204 temporary[i2]=0;
205 break;
206 }
207 if(buffer[i]=='='){
208 temporary[i2]=0;
209 break;
210 }
211 temporary[i2]=buffer[i];
212 }
213 if(temporary[0]=='\0'){
214 if(buffer[i]=='\0'){
215 SetError(22,"Enum",cp);
216 break;
217 }
218 continue;
219 }
220
221 if(buffer[i]!='='){
222 NextValue++;
223 }
224 else{
225 char temp2[VN_SIZE];
226 for(i++,i2=0;;i2++,i++){
227 if(IsCommandDelimitation(buffer[i])){
228 temp2[i2]=0;
229 break;
230 }
231 temp2[i2]=buffer[i];
232 }
233
234 _int64 i64data;
235 StaticCalculation(true, temp2,DEF_LONG,&i64data,Type());
236 NextValue=(int)i64data;
237 }
238
239 //定数を追加
240 CDBConst::obj.AddConst(temporary, NextValue);
241 }
242}
243bool GetConstInfo(void){
244 ////////////////////////////////////////////
245 // Const命令の情報を取得
246 ////////////////////////////////////////////
247
248 int i,i2;
249 char temporary[1024];
250
251 //定数に関する情報
252 extern CONSTINFO **ppConstHash;
253 ppConstHash=(CONSTINFO **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(CONSTINFO *));
254
255 extern char *basbuf;
256 for(i=0;;i++){
257 if( basbuf[i] == '\0' ) break;
258 if( basbuf[i] == 1 ){
259 if(basbuf[i]==1&&basbuf[i+1]==ESC_CONST){
260 i+=2;
261
262 extern int cp;
263 cp=i; //エラー用
264
265
266 if(basbuf[i]==1&&basbuf[i+1]==ESC_ENUM){
267 AddConstEnum(basbuf+i);
268 continue;
269 }
270
271 for(i2=0;;i++,i2++){
272 if(basbuf[i]=='\"'){
273 temporary[i2]=basbuf[i];
274 for(i++,i2++;;i++,i2++){
275 temporary[i2]=basbuf[i];
276 if(basbuf[i]=='\"') break;
277 }
278 continue;
279 }
280 if(IsCommandDelimitation(basbuf[i])){
281 temporary[i2]=0;
282 break;
283 }
284 temporary[i2]=basbuf[i];
285 }
286 CDBConst::obj.Add(temporary);
287 if(basbuf[i]=='\0') break;
288 }
289 else{
290 int result = JumpStatement( basbuf, i );
291 if( result == -1 ){
292 //エラー
293 return false;
294 }
295 else if( result == 1 ){
296 //ジャンプした場合
297 i--;
298 }
299 }
300 }
301 }
302 return true;
303}
304
305char ConstructorDestructorSchedule[MAX_PATH];
306void MakeConstructorAndDestructor(char *buffer,int nowLine,char *ClassName){
307 int i,i2;
308 char temporary[MAX_PATH],*pTemp;
309 BOOL bConstructor,bDestructor;
310
311 ConstructorDestructorSchedule[0]=0;
312 bConstructor=0;
313 bDestructor=0;
314
315 for(i=nowLine;;i++){
316 if(buffer[i]=='\0') break;
317 if(buffer[i]==1&&buffer[i+1]==ESC_ENDCLASS){
318 if((!bConstructor)||(!bDestructor)){
319 pTemp=ConstructorDestructorSchedule;
320
321 lstrcpy(pTemp,"Public:");
322
323 if(!bConstructor){
324 //コンストラクタが無いときは生成する
325 sprintf(pTemp+lstrlen(pTemp),"%c%c%s():%c%c:",
326 1,ESC_SUB,
327 ClassName,
328 1,ESC_ENDSUB);
329 }
330
331 if(!bDestructor){
332 //デストラクタが無いときは生成する
333 sprintf(pTemp+lstrlen(pTemp),"%c%c~%s():%c%c:",
334 1,ESC_SUB,
335 ClassName,
336 1,ESC_ENDSUB);
337 }
338 }
339 break;
340 }
341
342 if(buffer[i]==1&&(buffer[i+1]==ESC_SUB||buffer[i+1]==ESC_FUNCTION)){
343 i+=2;
344 while(IsBlank(buffer[i])) i++;
345 if(buffer[i]=='~'){
346 //デストラクタ
347 bDestructor=1;
348 }
349 else{
350 //コンストラクタかどうかをチェック
351 for(i2=0;;i++,i2++){
352 if(!IsVariableChar(buffer[i])){
353 temporary[i2]=0;
354 break;
355 }
356 temporary[i2]=buffer[i];
357 }
358 if(lstrcmp(temporary,ClassName)==0) bConstructor=1;
359 }
360 }
361 }
362}
363void ChangeCommand(char *buffer,int nowLine,char *Command){
364 int i,i2,IsStr;
365 unsigned _int16 ComNum;
366 char com[8192],pam[8192];
367
368 static int nCountOfNonGlobalScope = 0;
369
370 if(Command[0]==1){
371 switch(Command[1]){
372 case ESC_SELECTCASE:
373 case ESC_CASE:
374 KillStringSpaces(Command+2);
375 break;
376 case ESC_WITH:
377 KillStringSpaces(Command+2);
378 break;
379 case ESC_TYPEDEF:
380 KillStringSpaces(Command+2);
381 AddTypeDefData(Command+2);
382 break;
383 case ESC_DECLARE:
384 KillStringSpaces(Command+2);
385 break;
386 case ESC_IF:
387 KillStringSpaces(Command+2);
388 break;
389
390 case ESC_CLASS:
391 KillStringSpaces(Command+2);
392
393 //コンストラクタ、デストラクタを暗黙的に生成
394 MakeConstructorAndDestructor(buffer,nowLine,Command+2);
395 break;
396 case ESC_INTERFACE:
397 KillStringSpaces(Command+2);
398 break;
399 case ESC_ENDCLASS:
400 if(ConstructorDestructorSchedule[0]){
401 //生成されたコンストラクタ、デストラクタを挿入
402 sprintf(Command,"%s%c%c",ConstructorDestructorSchedule,1,ESC_ENDCLASS);
403 }
404 break;
405
406 case ESC_TYPE:
407 KillStringSpaces(Command+2);
408 break;
409
410 case ESC_CONST:
411 KillStringSpaces(Command+2);
412 if( Command[2] == 1 && Command[3] == ESC_ENUM ){
413 nCountOfNonGlobalScope++;
414 }
415 break;
416
417 case ESC_ENUM:
418 nCountOfNonGlobalScope++;
419 KillStringSpaces(Command+2);
420 break;
421
422 case ESC_ENDENUM:
423 nCountOfNonGlobalScope--;
424 break;
425
426 case ESC_INHERITS:
427 case ESC_VIRTUAL:
428 case ESC_OVERRIDE:
429 case ESC_ABSTRACT:
430 case ESC_SUB:
431 case ESC_FUNCTION:
432 case ESC_MACRO:
433 case ESC_STATIC:
434 KillStringSpaces(Command+2);
435 break;
436 }
437 return;
438 }
439
440 bool isPare = false;
441 for(i=0;;i++){
442 if(Command[i]==' '||Command[i]=='\t'||Command[i]=='('||Command[i]=='\"'||Command[i]=='@'||Command[i]=='-'){
443 com[i]=0;
444 while(Command[i]==' '||Command[i]=='\t') i++;
445 if( Command[i] == '(' ) isPare = true;
446 break;
447 }
448 if(Command[i]=='='){
449 KillStringSpaces(Command);
450 return;
451 }
452 com[i]=Command[i];
453 if(Command[i]=='\0') break;
454 }
455
456 //マクロによるコマンド
457 i2=1;
458 if( nCountOfNonGlobalScope == 0 ){
459 //グローバル
460 if(lstrcmpi(com,"Open")==0) ComOpen(Command+i,pam,nowLine);
461 else if(lstrcmpi(com,"Close")==0) ComClose(Command+i,pam);
462 else if(lstrcmpi(com,"Field")==0||
463 lstrcmpi(com,"Get")==0||
464 lstrcmpi(com,"Put")==0) ComField(Command+i,pam);
465 else if(lstrcmpi(com,"Line")==0) ComLine(Command+i,pam,nowLine);
466 else if(lstrcmpi(com,"Circle")==0) ComCircle(Command+i,pam,nowLine);
467 else if(lstrcmpi(com,"PSet")==0) ComPSet(Command+i,pam,nowLine);
468 else if(lstrcmpi(com,"Paint")==0) ComPaint(Command+i,pam,nowLine);
469
470 else if(
471 lstrcmpi(com,"EXEC")==0||
472 lstrcmpi(com,"INPUT")==0||
473 lstrcmpi(com,"PRINT")==0||
474 lstrcmpi(com,"RANDOMIZE")==0||
475 ( lstrcmpi(com,"WRITE")==0 && isPare == false )||
476 lstrcmpi(com,"MSGBOX")==0||
477 lstrcmpi(com,"WINDOW")==0||
478 lstrcmpi(com,"DELWND")==0||
479 lstrcmpi(com,"INSMENU")==0||
480 lstrcmpi(com,"CHDIR")==0||
481 lstrcmpi(com,"MKDIR")==0||
482 lstrcmpi(com,"KILL")==0||
483 lstrcmpi(com,"CLS")==0||
484 lstrcmpi(com,"COLOR")==0||
485 lstrcmpi(com,"LOCATE")==0
486 ){
487 KillSpaces(Command+i,pam);
488
489 //大文字に変換
490 CharUpper(com);
491
492 sprintf(Command,"%s(%s)",com,pam);
493 return;
494 }
495
496 else i2=0;
497 }
498 else i2=0;
499 if(i2){
500 //大文字に変換
501 CharUpper(com);
502
503 sprintf(Command,"%s(%s)",com,pam);
504 return;
505 }
506
507
508
509 //コンパイラに搭載されるコマンド
510 if(lstrcmpi(com,"Do")==0){
511 KillSpaces(Command+i,pam);
512 ComNum=COM_DO;
513 }
514 else if(lstrcmpi(com,"goto")==0){
515 KillSpaces(Command+i,pam);
516 ComNum=COM_GOTO;
517 }
518 else if(lstrcmpi(com,"gosub")==0){
519 KillSpaces(Command+i,pam);
520 ComNum=COM_GOSUB;
521 }
522 else if(lstrcmpi(com,"Loop")==0){
523 if((Command[i]=='w'||Command[i]=='W')&&(Command[i+1]=='h'||Command[i+1]=='H')&&(Command[i+2]=='i'||Command[i+2]=='I')&&(Command[i+3]=='l'||Command[i+3]=='L')&&(Command[i+4]=='e'||Command[i+4]=='E')){
524 lstrcpy(pam,"0,");
525 KillSpaces(Command+i+5,pam+2);
526 }
527 else if((Command[i]=='u'||Command[i]=='U')&&(Command[i+1]=='n'||Command[i+1]=='N')&&(Command[i+2]=='t'||Command[i+2]=='T')&&(Command[i+3]=='i'||Command[i+3]=='I')&&(Command[i+4]=='l'||Command[i+4]=='L')){
528 lstrcpy(pam,"1,");
529 KillSpaces(Command+i+5,pam+2);
530 }
531 else pam[0]=0;
532 ComNum=COM_LOOP;
533 }
534 else if(lstrcmpi(com,"For")==0){
535 for(i2=0,IsStr=0;;i++,i2++){
536 while(Command[i]==' '||Command[i]=='\t') i++;
537 if(Command[i]=='\"') IsStr^=1;
538 if((Command[i-1]==' '||Command[i-1]=='\t')&&(Command[i]=='t'||Command[i]=='T')&&(Command[i+1]=='o'||Command[i+1]=='O')&&(Command[i+2]==' '||Command[i+2]=='\t')&&IsStr==0){
539 pam[i2]=',';
540 break;
541 }
542 pam[i2]=Command[i];
543 if(Command[i]=='\0') break;
544 }
545 if(Command[i]){
546 for(i+=3,i2++,IsStr=0;;i++,i2++){
547 while(Command[i]==' '||Command[i]=='\t') i++;
548 if((Command[i-1]==' '||Command[i-1]=='\t')&&(Command[i]=='s'||Command[i]=='S')&&(Command[i+1]=='t'||Command[i+1]=='T')&&(Command[i+2]=='e'||Command[i+2]=='E')&&(Command[i+3]=='p'||Command[i+3]=='P')&&(Command[i+4]==' '||Command[i+4]=='\t')){
549 pam[i2]=',';
550 i+=4;
551 continue;
552 }
553 pam[i2]=Command[i];
554 if(Command[i]=='\0') break;
555 }
556 }
557 ComNum=COM_FOR;
558 }
559 else if(lstrcmpi(com,"Next")==0){
560 KillSpaces(Command+i,pam);
561 ComNum=COM_NEXT;
562 }
563 else if(lstrcmpi(com,"Return")==0){
564 KillSpaces(Command+i,pam);
565 ComNum=COM_RETURN;
566 }
567 else if(lstrcmpi(com,"While")==0){
568 KillSpaces(Command+i,pam);
569 ComNum=COM_WHILE;
570 }
571 else if(lstrcmpi(com,"Wend")==0){
572 pam[0]=0;
573 ComNum=COM_WEND;
574 }
575
576 //変数、データ操作
577 else if(lstrcmpi(com,"dim")==0){
578 KillSpaces(Command+i,pam);
579 ComNum=COM_DIM;
580 }
581 else if(lstrcmpi(com,"Delete")==0){
582 KillSpaces(Command+i,pam);
583 ComNum=COM_DELETE;
584 }
585 else if( lstrcmpi( com, "_System_SweepingDelete" ) == 0 ){
586 KillSpaces(Command+i,pam);
587 ComNum=COM_SWEEPINGDELETE;
588 }
589
590 //その他
591 else if(lstrcmpi(com,"Debug")==0){
592 pam[0]=0;
593 ComNum=COM_DEBUG;
594 }
595 else if(lstrcmpi(com,"let")==0){
596 KillSpaces(Command+i,pam);
597 ComNum=COM_LET;
598 }
599 else if(lstrcmpi(com,"rem")==0){
600 Command[0]=0;
601 return;
602 }
603
604 //ポインタ
605 else if(lstrcmpi(com,"SetDouble")==0){
606 KillSpaces(Command+i,pam);
607 ComNum=COM_SETDOUBLE;
608 }
609 else if(lstrcmpi(com,"SetSingle")==0){
610 KillSpaces(Command+i,pam);
611 ComNum=COM_SETSINGLE;
612 }
613 else if(lstrcmpi(com,"SetQWord")==0){
614 KillSpaces(Command+i,pam);
615 ComNum=COM_SETQWORD;
616 }
617 else if(lstrcmpi(com,"SetDWord")==0){
618 KillSpaces(Command+i,pam);
619 ComNum=COM_SETDWORD;
620 }
621 else if(lstrcmpi(com,"SetWord")==0){
622 KillSpaces(Command+i,pam);
623 ComNum=COM_SETWORD;
624 }
625 else if(lstrcmpi(com,"SetByte")==0){
626 KillSpaces(Command+i,pam);
627 ComNum=COM_SETBYTE;
628 }
629
630 else{
631 //その他のコマンド(一般コード)
632 lstrcpy(com,Command);
633 KillSpaces(com,Command);
634 return;
635 }
636
637 i=lstrlen(pam);
638 while(pam[i-1]==' '||pam[i-1]=='\t') i--;
639 pam[i]=0;
640 if(pam[0]) sprintf(Command,"%c%c%s",HIBYTE(ComNum),LOBYTE(ComNum),pam);
641 else sprintf(Command,"%c%c",HIBYTE(ComNum),LOBYTE(ComNum));
642
643 return;
644}
645
646void ChangeCommandToCode(char *buffer){
647 extern HANDLE hHeap;
648 int i,i2,i3,IsStr,CommandBufferSize;
649 char *temporary,*tempBase,temp2[VN_SIZE],*lpCommand;
650
651 tempBase=(char *)HeapAlloc(hHeap,0,(lstrlen(buffer)+1)*2+8192);
652 temporary=tempBase+1;
653 temporary[0]=0;
654 i=0;
655 i3=0;
656
657 CommandBufferSize=512;
658 lpCommand=(char *)HeapAlloc(hHeap,0,CommandBufferSize);
659
660 while(1){
661 i2=0;
662 while(buffer[i]==' '||buffer[i]=='\t') i++;
663 while(buffer[i]>='0'&&buffer[i]<='9'){
664 temp2[i2]=buffer[i];
665 i++;
666 i2++;
667 }
668 temp2[i2]=0;
669 while(buffer[i]==' '||buffer[i]=='\t') i++;
670 for(i2=0,IsStr=0;;i++,i2++){
671 if(i2>=CommandBufferSize){ //バッファ領域が足りなくなった場合はバッファを増量する
672 CommandBufferSize+=512;
673 lpCommand=(char *)HeapReAlloc(hHeap,0,lpCommand,CommandBufferSize);
674 }
675 if(buffer[i]=='\"') IsStr^=1;
676 if(buffer[i]=='\n'||(buffer[i]==':'&&IsStr==0)||buffer[i]=='\0'){
677 lpCommand[i2]=0;
678
679 if(temp2[0]){
680 //行番号ラベル
681 sprintf(temporary+i3,"%c%c%s,",1,ESC_LINENUM,temp2);
682 i3+=lstrlen(temporary+i3);
683
684 temp2[0]=0;
685 }
686
687 //命令コードへ変換
688 if(i2){
689 //エラー用
690 extern int cp;
691 cp=i;
692
693 ChangeCommand(buffer,i,lpCommand);
694
695 lstrcpy(temporary+i3,lpCommand);
696 i3+=lstrlen(temporary+i3);
697 }
698
699 if(!(lpCommand[0]=='\0'&&buffer[i]==':')){
700 temporary[i3++]=buffer[i];
701 temporary[i3]=0;
702 }
703
704 if(buffer[i]=='\n'){
705 i++;
706 break;
707 }
708 else if(buffer[i]==':'){
709 while(buffer[i+1]==' '||buffer[i+1]=='\t') i++;
710 }
711 if(buffer[i]=='\0') break;
712 i2=-1;
713 continue;
714 }
715 lpCommand[i2]=buffer[i];
716 }
717 if(buffer[i]=='\0') break;
718 }
719 HeapDefaultFree(lpCommand);
720 lstrcpy(buffer,temporary);
721
722 HeapDefaultFree(tempBase);
723}
Note: See TracBrowser for help on using the repository browser.