Changeset 31 in dev for BasicCompiler_Common/preprocessor.cpp
- Timestamp:
- Jan 13, 2007, 4:26:50 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler_Common/preprocessor.cpp
r15 r31 8 8 9 9 10 11 ////////////////////////////////////// 12 // #requireの管理 13 ////////////////////////////////////// 14 class CRequireFiles{ 15 char **ppFilePath; 16 int count; 17 public: 18 CRequireFiles(){ 19 ppFilePath = (char **)malloc( 1 ); 20 count = 0; 21 } 22 ~CRequireFiles(){ 23 for( int i = 0; i < count; i++ ){ 24 free( ppFilePath[i] ); 25 } 26 free( ppFilePath ); 27 } 28 bool IsIncluded( const char *FilePath ){ 29 for( int i = 0; i < count; i++ ){ 30 if( lstrcmpi( ppFilePath[i], FilePath ) == 0 ){ 31 return true; 32 } 33 } 34 return false; 35 } 36 void Add( const char *FilePath ){ 37 //既に読み込まれているとき 38 if( IsIncluded( FilePath ) ) return; 39 40 //追加 41 ppFilePath = (char **)realloc(ppFilePath, ( count + 1 ) * sizeof(char *) ); 42 ppFilePath[count] = (char *)malloc( lstrlen(FilePath) + 1 ); 43 lstrcpy( ppFilePath[count], FilePath ); 44 count++; 45 } 46 }; 47 CRequireFiles *pRequireFiles; 48 49 50 ////////////////////////////////////// 51 // #define間するクラス 52 ////////////////////////////////////// 10 53 class CDefine{ 11 54 int num; … … 317 360 int i,i2,i3,sw1,FileSize,LineNum,FileLayer[255],layer,LastFileByte[255]; 318 361 char *buffer,temporary[MAX_PATH],temp2[MAX_PATH+255],*LayerDir[255]; 319 DWORD AccBytes;320 HANDLE hFile;321 362 322 363 IncludeFileInfo.ppFileNames=(char **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(char *)); … … 350 391 } 351 392 if(buffer[i-1]=='\n'&&buffer[i]=='#'){ 352 if(memcmp(buffer+i+1,"include",7)==0){ 353 i2=i+8; 354 while(buffer[i2]==' '||buffer[i2]=='\t') i2++; 355 356 if(buffer[i2]=='\"') sw1=0; 357 else if(buffer[i2]=='<') sw1=1; 358 i2++; 359 360 for(i3=0;;i2++,i3++){ 361 if((buffer[i2]=='\"'&&sw1==0)||(buffer[i2]=='>'&&sw1==1)||buffer[i2]=='\n'||buffer[i2]=='\0'){ 362 temporary[i3]=0; 363 break; 364 } 365 temporary[i3]=buffer[i2]; 366 } 367 while(buffer[i2]!='\n'&&buffer[i2]!='\0') i2++; 368 369 if(sw1){ 370 sprintf(temp2,"%s%s",szIncludeDir,temporary); 371 lstrcpy(temporary,temp2); 372 } 373 else GetFullPath(temporary,LayerDir[layer]); 393 bool isRequire = false; 394 if(memcmp( buffer + i + 1, "include", 7 ) == 0 395 || memcmp( buffer + i + 1, "require", 7 ) == 0){ 396 397 //#requireの場合 398 if( buffer[i + 1] == 'r' ) isRequire = true; 399 400 i2=i+8; 401 while(buffer[i2]==' '||buffer[i2]=='\t') i2++; 402 403 if(buffer[i2]=='\"') sw1=0; 404 else if(buffer[i2]=='<') sw1=1; 405 i2++; 406 407 for(i3=0;;i2++,i3++){ 408 if((buffer[i2]=='\"'&&sw1==0)||(buffer[i2]=='>'&&sw1==1)||buffer[i2]=='\n'||buffer[i2]=='\0'){ 409 temporary[i3]=0; 410 break; 411 } 412 temporary[i3]=buffer[i2]; 413 } 414 while(buffer[i2]!='\n'&&buffer[i2]!='\0') i2++; 415 416 if(sw1){ 417 sprintf(temp2,"%s%s",szIncludeDir,temporary); 418 lstrcpy(temporary,temp2); 419 } 420 else GetFullPath(temporary,LayerDir[layer]); 374 421 } 375 422 else if(memcmp(buffer+i+1,"prompt",6)==0){ … … 406 453 IncludeFileInfo.FilesNum++; 407 454 408 //インクルードファイルを読み込む 409 hFile=CreateFile(temporary,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 410 if(hFile==INVALID_HANDLE_VALUE){ 411 sprintf(temp2,"インクルードファイル \"%s\" をオープンできません",temporary); 412 extern char *basbuf; 413 basbuf=base+2; 414 SetError(-1,temp2,i); 415 break; 416 } 417 FileSize=GetFileSize(hFile,NULL); 418 419 //読み込み 455 //#requireの場合では、既に読み込まれているファイルは読み込まないようにする 456 bool isFake = false; 457 if( isRequire ){ 458 if( pRequireFiles->IsIncluded( temporary ) ){ 459 //既に読み込まれているとき 460 isFake = true; 461 } 462 } 463 420 464 char *temp3; 421 temp3=(char *)HeapAlloc(hHeap,0,FileSize+1); 422 ReadFile(hFile,temp3,FileSize,&AccBytes,NULL); 423 temp3[AccBytes]=0; 424 425 //CRLFをLFに変換 426 ChangeReturnCode(temp3); 427 428 //コメント削除 429 DeleteComment(temp3); 430 431 //#ifdefディレクティブ 432 DirectiveIfdef(temp3); 433 434 FileSize=lstrlen(temp3); 465 if( isFake ){ 466 //既に読み込まれているときは空データを生成 467 temp3 = (char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);; 468 FileSize = 0; 469 } 470 else{ 471 //取り込まれたファイルを収集する 472 pRequireFiles->Add( temporary ); 473 474 //インクルードファイルを読み込む 475 DWORD AccBytes; 476 HANDLE hFile=CreateFile(temporary,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 477 if(hFile==INVALID_HANDLE_VALUE){ 478 sprintf(temp2,"インクルードファイル \"%s\" をオープンできません",temporary); 479 extern char *basbuf; 480 basbuf=base+2; 481 SetError(-1,temp2,i); 482 break; 483 } 484 FileSize=GetFileSize(hFile,NULL); 485 486 //読み込み 487 temp3=(char *)HeapAlloc(hHeap,0,FileSize+1); 488 ReadFile(hFile,temp3,FileSize,&AccBytes,NULL); 489 temp3[AccBytes]=0; 490 CloseHandle(hFile); 491 492 //CRLFをLFに変換 493 ChangeReturnCode(temp3); 494 495 //コメント削除 496 DeleteComment(temp3); 497 498 //#ifdefディレクティブ 499 DirectiveIfdef(temp3); 500 501 FileSize=lstrlen(temp3); 502 } 435 503 436 504 i3=lstrlen(buffer)+FileSize; … … 441 509 442 510 //クローズ 443 CloseHandle(hFile);444 511 HeapDefaultFree(temp3); 445 512 … … 505 572 506 573 //インクルードファイルを読み込む 574 pRequireFiles = new CRequireFiles(); 507 575 base=IncludeFiles(base); 576 delete pRequireFiles; 508 577 509 578 //#define情報を破棄
Note:
See TracChangeset
for help on using the changeset viewer.