Ignore:
Timestamp:
Jan 13, 2007, 4:26:50 AM (18 years ago)
Author:
dai_9181
Message:

_System_LocalThis(見えないThisポインタパラメータ)を通常のパラメータ保有領域ではなく、リアルパラメータ保有領域に移動した。
メソッドとグローバル関数のオーバーロードに対応(DLL関数オーバーロードには未対応)。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/preprocessor.cpp

    r15 r31  
    88
    99
     10
     11//////////////////////////////////////
     12// #requireの管理
     13//////////////////////////////////////
     14class CRequireFiles{
     15    char **ppFilePath;
     16    int count;
     17public:
     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};
     47CRequireFiles *pRequireFiles;
     48
     49
     50//////////////////////////////////////
     51// #define間するクラス
     52//////////////////////////////////////
    1053class CDefine{
    1154    int num;
     
    317360    int i,i2,i3,sw1,FileSize,LineNum,FileLayer[255],layer,LastFileByte[255];
    318361    char *buffer,temporary[MAX_PATH],temp2[MAX_PATH+255],*LayerDir[255];
    319     DWORD AccBytes;
    320     HANDLE hFile;
    321362
    322363    IncludeFileInfo.ppFileNames=(char **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(char *));
     
    350391        }
    351392        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]);
    374421            }
    375422            else if(memcmp(buffer+i+1,"prompt",6)==0){
     
    406453            IncludeFileInfo.FilesNum++;
    407454
    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
    420464            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            }
    435503
    436504            i3=lstrlen(buffer)+FileSize;
     
    441509
    442510            //クローズ
    443             CloseHandle(hFile);
    444511            HeapDefaultFree(temp3);
    445512
     
    505572
    506573    //インクルードファイルを読み込む
     574    pRequireFiles = new CRequireFiles();
    507575    base=IncludeFiles(base);
     576    delete pRequireFiles;
    508577
    509578    //#define情報を破棄
Note: See TracChangeset for help on using the changeset viewer.