Ignore:
Timestamp:
Jul 19, 2008, 5:52:36 PM (16 years ago)
Author:
dai_9181
Message:

#require/#includeディレクティブにて、ワイルドカード指定を可能にした。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/ab_common/src/Lexical/Source.cpp

    r641 r696  
    2929        filepaths.clear();
    3030    }
    31     bool IsIncluded( const char *includeFilePath ){
     31    bool IsIncluded( const std::string &includeFilePath ){
    3232        // '/' → '\\'
    3333        char tempPath[MAX_PATH];
    34         lstrcpy( tempPath, includeFilePath );
     34        lstrcpy( tempPath, includeFilePath.c_str() );
    3535        for( int i=0; tempPath[i]; i++ ){
    3636            if( tempPath[i] == '/' ){
     
    4848        return false;
    4949    }
    50     void Add( const char *includeFilePath ){
     50    void Add( const std::string &includeFilePath ){
    5151        // '/' → '\\'
    5252        char tempPath[MAX_PATH];
    53         lstrcpy( tempPath, includeFilePath );
     53        lstrcpy( tempPath, includeFilePath.c_str() );
    5454        for( int i=0; tempPath[i]; i++ ){
    5555            if( tempPath[i] == '/' ){
     
    554554        if((buffer[i-1]=='\n'||i==0)&&buffer[i]=='#'){
    555555            bool isRequire = false;
     556
     557            int includeDirectiveLength;
     558
     559            char findStr[1024];
    556560            if(memcmp( buffer + i + 1, "include", 7 ) == 0
    557                 || memcmp( buffer + i + 1, "require", 7 ) == 0){
    558 
    559                     //#requireの場合
    560                     if( buffer[i + 1] == 'r' ) isRequire = true;
    561 
    562                     i2=i+8;
    563                     while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
    564 
    565                     if(buffer[i2]=='\"') sw1=0;
    566                     else if(buffer[i2]=='<') sw1=1;
    567                     i2++;
    568 
    569                     for(i3=0;;i2++,i3++){
    570                         if((buffer[i2]=='\"'&&sw1==0)||(buffer[i2]=='>'&&sw1==1)||buffer[i2]=='\n'||buffer[i2]=='\0'){
    571                             temporary[i3]=0;
    572                             break;
    573                         }
    574                         temporary[i3]=buffer[i2];
     561                || memcmp( buffer + i + 1, "require", 7 ) == 0)
     562            {
     563                //#requireの場合
     564                if( buffer[i + 1] == 'r' ) isRequire = true;
     565
     566                i2=i+8;
     567                while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
     568
     569                if(buffer[i2]=='\"') sw1=0;
     570                else if(buffer[i2]=='<') sw1=1;
     571                i2++;
     572
     573                for(i3=0;;i2++,i3++){
     574                    if((buffer[i2]=='\"'&&sw1==0)||(buffer[i2]=='>'&&sw1==1)||buffer[i2]=='\n'||buffer[i2]=='\0'){
     575                        temporary[i3]=0;
     576                        break;
    575577                    }
    576                     while(buffer[i2]!='\n'&&buffer[i2]!='\0') i2++;
    577 
    578                     if(sw1){
    579                         sprintf(temp2,"%s\\%s", includeDirPath.c_str(), temporary );
    580                         lstrcpy(temporary,temp2);
    581                     }
    582                     else{
    583                         Jenga::Common::Directory dir( LayerDir[layer] );
    584                         lstrcpy( temporary, dir.GetFullPath( temporary ).c_str() );
    585                     }
     578                    temporary[i3]=buffer[i2];
     579                }
     580                while(buffer[i2]!='\n'&&buffer[i2]!='\0') i2++;
     581
     582                includeDirectiveLength = i2 - i;
     583
     584                if(sw1){
     585                    sprintf(temp2,"%s\\%s", includeDirPath.c_str(), temporary );
     586                    lstrcpy(findStr,temp2);
     587                }
     588                else{
     589                    Jenga::Common::Directory dir( LayerDir[layer] );
     590                    lstrcpy( findStr, dir.GetFullPath( temporary ).c_str() );
     591                }
    586592            }
    587593            else if(memcmp(buffer+i+1,"prompt",6)==0){
    588                 i2=i+7;
    589                 sprintf(temporary,"%s\\basic\\prompt.sbp", includeDirPath.c_str() );
     594                includeDirectiveLength = 7;
     595                sprintf(findStr,"%s\\basic\\prompt.sbp", includeDirPath.c_str() );
    590596            }
    591597            else if(memcmp(buffer+i+1,"N88BASIC",8)==0){
    592                 i2=i+9;
    593                 sprintf(temporary,"%s\\basic\\prompt.sbp", includeDirPath.c_str() );
     598                includeDirectiveLength = 9;
     599                sprintf(findStr,"%s\\basic\\prompt.sbp", includeDirPath.c_str() );
    594600            }
    595601            else if(memcmp(buffer+i+1,"console",7)==0){
     
    598604                TypeOfSubSystem=IMAGE_SUBSYSTEM_WINDOWS_CUI;
    599605
    600                 i2=i+8;
    601                 sprintf(temporary,"%s\\basic\\dos_console.sbp", includeDirPath.c_str() );
     606                includeDirectiveLength = 8;
     607                sprintf(findStr,"%s\\basic\\dos_console.sbp", includeDirPath.c_str() );
    602608            }
    603609            else continue;
    604610
    605             if( !Jenga::Common::Path( temporary ).IsExistFile() )
     611            // インクルードファイルを列挙(ワイルドカード指定を想定)
     612            Jenga::Common::Strings resultOfFullPath;
     613            Jenga::Common::FileSystem::SearchFiles( resultOfFullPath, findStr );
     614
     615            if( resultOfFullPath.empty() )
    606616            {
    607                 this->cannotIncludePath = temporary;
     617                this->cannotIncludePath = findStr;
    608618                this->cannotIncludeSourcePos = i;
    609619                includedFilesRelation.AddLine( FileLayer[layer] );
     
    611621            }
    612622
    613             if( i == 0 && Jenga::Common::Path(temporary).GetFileName() == "basic" )
     623            for( int j=static_cast<int>(resultOfFullPath.size()-1); j>=0; j-- )
    614624            {
    615             }
    616             else
    617             {
    618                 //ディレクティブが消えるため、一行減ってしまうのを防ぐ(basic.sbpを除く)
    619                 Text::SlideString(buffer+i2,1);
    620                 buffer[i2]='\n';
    621                 for(i3=0;i3<=layer;i3++) LastFileByte[i3]++;
    622             }
    623 
    624             layer++;
    625             FileLayer[layer] = includedFilesRelation.AddFile( temporary );
    626 
    627             //#requireの場合では、既に読み込まれているファイルは読み込まないようにする
    628             bool isFake = false;
    629             if( isRequire ){
    630                 if( requireFiles.IsIncluded( temporary ) ){
    631                     //既に読み込まれているとき
    632                     isFake = true;
    633                 }
    634             }
    635 
    636             BasicSource source;
    637 
    638             if( isFake ){
    639                 //既に読み込まれているときは空データ
    640                 source.SetBuffer( "" );
    641             }
    642             else{
    643                 //取り込まれたファイルを収集する
    644                 requireFiles.Add( temporary );
    645 
    646                 //インクルードファイルを読み込む
    647                 if( !source.ReadFile_InIncludeDirective( temporary ) )
     625                const std::string &sourceFilePath = resultOfFullPath[j];
     626
     627                const int headIndex = i;
     628
     629                if( headIndex == 0 && Jenga::Common::Path( sourceFilePath ).GetFileName() == "basic" )
    648630                {
    649                     throw;
    650                 }
    651             }
    652 
    653             i3=lstrlen(buffer)+source.GetLength();
    654             Realloc( i3 );
    655             Text::SlideString(buffer+i2,source.GetLength()+(i-i2));
    656             memcpy(buffer+i,source.GetBuffer(),source.GetLength());
    657 
    658             //新しい参照ディレクトリをセット
    659             char temp4[MAX_PATH];
    660             _splitpath(temporary,temp2,temp4,0,0);
    661             lstrcat(temp2,temp4);
    662             LayerDir[layer]=(char *)malloc(lstrlen(temp2)+1);
    663             lstrcpy(LayerDir[layer],temp2);
    664 
    665             //ファイル範囲をスライド
    666             LastFileByte[layer]=i+source.GetLength()-1;
    667             for(i3=0;i3<layer;i3++) LastFileByte[i3]+=source.GetLength()+(i-i2);
    668 
     631                    // basic.sbpインクルード時は何もしない
     632                    // ワイルドカードで複数ファイルを指定した場合、2つ目以上のファイルの場合もこちら
     633                }
     634                else
     635                {
     636                    //ディレクティブが消えるため、一行減ってしまうのを防ぐ(basic.sbpを除く)
     637                    Text::SlideString( buffer + headIndex + includeDirectiveLength, 1 );
     638                    buffer[headIndex+includeDirectiveLength]='\n';
     639                    for(i3=0;i3<=layer;i3++) LastFileByte[i3]++;
     640                }
     641
     642                layer++;
     643                FileLayer[layer] = includedFilesRelation.AddFile( sourceFilePath );
     644
     645                //#requireの場合では、既に読み込まれているファイルは読み込まないようにする
     646                bool isFake = false;
     647                if( isRequire ){
     648                    if( requireFiles.IsIncluded( sourceFilePath ) ){
     649                        //既に読み込まれているとき
     650                        isFake = true;
     651                    }
     652                }
     653
     654                BasicSource source;
     655
     656                if( isFake ){
     657                    //既に読み込まれているときは空データ
     658                    source.SetBuffer( "" );
     659                }
     660                else{
     661                    //取り込まれたファイルを収集する
     662                    requireFiles.Add( sourceFilePath );
     663
     664                    //インクルードファイルを読み込む
     665                    if( !source.ReadFile_InIncludeDirective( sourceFilePath ) )
     666                    {
     667                        throw;
     668                    }
     669                }
     670
     671                Realloc( lstrlen(buffer) + source.GetLength() );
     672                Text::SlideString(
     673                    buffer + headIndex + includeDirectiveLength,
     674                    source.GetLength() - includeDirectiveLength
     675                );
     676                memcpy(
     677                    buffer + headIndex,
     678                    source.GetBuffer(),
     679                    source.GetLength()
     680                );
     681
     682                //新しい参照ディレクトリをセット
     683                char temp4[MAX_PATH];
     684                _splitpath(sourceFilePath.c_str(),temp2,temp4,0,0);
     685                lstrcat(temp2,temp4);
     686                LayerDir[layer]=(char *)malloc(lstrlen(temp2)+1);
     687                lstrcpy(LayerDir[layer],temp2);
     688
     689                //ファイル範囲をスライド
     690                LastFileByte[layer] = headIndex + source.GetLength() - 1;
     691                for(i3=0;i3<layer;i3++)
     692                {
     693                    LastFileByte[i3] += source.GetLength() - includeDirectiveLength;
     694                }
     695
     696                includeDirectiveLength = 0;
     697            }
    669698            i--;
    670699        }
Note: See TracChangeset for help on using the changeset viewer.