Ignore:
Timestamp:
Aug 25, 2008, 5:26:44 PM (16 years ago)
Author:
イグトランス (egtra)
Message:

改行コード変換などを高速化

File:
1 edited

Legend:

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

    r706 r735  
    66
    77class CDefine{
    8     std::vector<std::string> names;
     8    stdext::hash_set<std::string> names;
    99public:
    10     void Free();
     10//  void Free();
    1111    void Init( bool isDebug, bool isDll, bool isUnicode, int majorVer );
    1212
    13     BOOL add(char const *name);
    14     BOOL undef(char const *name);
    15     BOOL check(char const *name);
     13    bool add(char const *name);
     14    bool undef(char const *name);
     15    bool check(char const *name);
    1616    void preprocessor_ifdef(char *buffer,bool isNot);
    1717    void DirectiveIfdef(char *buffer);
     
    8484    add(temporary);
    8585}
    86 BOOL CDefine::add(char const *name)
     86bool CDefine::add(char const *name)
    8787{
    88     //重複チェック
    89     if(check(name)) return 0;
    90 
    91     //追加
    92     names.push_back( name );
    93 
    94     return 1;
    95 }
    96 BOOL CDefine::undef(char const *name){
    97     std::vector<std::string>::iterator i = names.begin();
    98     BOOST_FOREACH( const std::string &temp, names ){
    99         if( temp == name ){
    100             names.erase( i );
    101             return 1;
    102         }
    103         i++;
    104     }
    105 
    106     return 0;
    107 }
    108 BOOL CDefine::check(char const *name){
    109 
    110     //重複チェック
    111     BOOST_FOREACH( const std::string &temp, names ){
    112         if( temp == name ){
    113             return 1;
    114         }
    115     }
    116     return 0;
     88    return names.insert(name).second;
     89}
     90bool CDefine::undef(char const *name){
     91    return names.erase(name) > 0;
     92}
     93bool CDefine::check(char const *name){
     94    return names.find(name) != names.end();
    11795}
    11896
     
    167145
    168146    //#ifdefの行を消去
    169     Text::SlideString(buffer+i,-i);
    170     i=0;
     147    memset(buffer,' ',static_cast<size_t>(i));
    171148
    172149    BOOL bElse=0;
     
    304281                    temporary[i3]=buffer[i2];
    305282                }
    306 
    307283                add(temporary);
    308 
    309                 i2-=i;
    310 
    311284                //ディレクティブを消去
    312                 Text::SlideString(buffer+i+i2,-i2);
     285                memset(buffer+i,' ',static_cast<size_t>(i2-i));
     286                i=i2;
    313287            }
    314288            if(memicmp(buffer+i,"#undef",6)==0){
    315                 i2=i+7;
     289                i2=i+6;
    316290                while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
    317291
     
    323297                    temporary[i3]=buffer[i2];
    324298                }
    325 
    326299                undef(temporary);
    327 
    328                 i2-=i;
    329 
    330300                //ディレクティブを消去
    331                 Text::SlideString(buffer+i+i2,-i2);
     301                memset(buffer+i,' ',static_cast<size_t>(i2-i));
     302                i=i2;
    332303            }
    333304            else if(memicmp(buffer+i,"#ifdef",6)==0){
     
    367338
    368339    return true;
     340}
     341
     342//改行コードのCRLFをLFに変換
     343int ChangeReturnCodeImpl(char *buffer)
     344{
     345    int i;
     346    for(i=0;buffer[i]!='\0';i++){
     347        if(buffer[i]=='\r'&&buffer[i+1]=='\n'){
     348            buffer[i]=' ';
     349        }
     350    }
     351    return i;
    369352}
    370353
     
    418401#endif
    419402
    420     //改行コードのCRLFをLFに変換
    421     for(i=0,i2=0;;i++,i2++){
    422         if(buffer[i]=='\r'&&buffer[i+1]=='\n') i++;
    423         buffer[i2]=buffer[i];
    424         if(buffer[i]=='\0') break;
    425     }
     403    ChangeReturnCodeImpl(buffer);
    426404
    427405    length = i;
     
    471449        if(buffer[i]=='\0') break;
    472450    }
    473     strcpy(buffer,temporary);
     451    std::swap(buffer,temporary);
    474452    free(temporary);
    475453}
     
    683661    //カッコ'('直下の改行
    684662    while(buffer[0]=='\n'){
    685         Text::SlideString(buffer+1,-1);
     663        buffer[0]=' ';
    686664        (*pRnum)++;
    687665    }
Note: See TracChangeset for help on using the changeset viewer.