Ignore:
Timestamp:
Apr 4, 2007, 2:03:09 AM (18 years ago)
Author:
dai_9181
Message:

実行時型情報の生成に対応。
関数の戻り値の型に抽象クラスを指定できるようにした。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/src/Source.cpp

    r88 r89  
    44#include <windows.h>
    55
     6
     7const string BasicSource::generateDirectiveName = "#generate";
    68
    79
     
    409411
    410412void BasicSource::ChangeReturnLineChar(){
     413    int i,i2;
     414
    411415#ifdef _DEBUG
    412416    //改行コードの整合性チェック
    413     for( int i=0; ; i++ ){
     417    for( i=0; ; i++ ){
    414418        if( buffer[i] == '\0' ){
    415419            break;
     
    433437
    434438    //改行コードのCRLFをLFに変換
    435     int i,i2;
    436439    for(i=0,i2=0;;i++,i2++){
    437440        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i++;
     
    551554        if(i>LastFileByte[layer]){
    552555            HeapDefaultFree(LayerDir[layer]);
     556            LayerDir[layer]=0;
    553557            layer--;
    554558        }
     
    842846}
    843847
    844 bool BasicSource::Generate( const string &genName, const char *buffer ){
    845     return true;
     848bool BasicSource::Generate( const string &genName, const char *genBuffer ){
     849    const int genBufferLength = lstrlen( genBuffer );
     850
     851#ifdef _DEBUG
     852    // 挿入ソースに改行コードが含まれていないかを検査する
     853    for( int i=0; genBuffer[i] ; i++ ){
     854        if( genBuffer[i] == '\n' ){
     855            SetError();
     856            break;
     857        }
     858    }
     859#endif
     860
     861    bool isFound = false;
     862
     863    for( int i=0; ; i++ ){
     864        if( i == 0 || buffer[i] == '\n' ){
     865            if( buffer[i] == '\n' ){
     866                i++;
     867            }
     868            while( IsBlank( buffer[i] ) ){
     869                i++;
     870            }
     871
     872            int startIndex = i;
     873
     874            if( memicmp( buffer + i, generateDirectiveName.c_str(), generateDirectiveName.size() ) == 0 ){
     875                i += (int)generateDirectiveName.size();
     876                while( IsBlank( buffer[i] ) ){
     877                    i++;
     878                }
     879
     880                char temporary[VN_SIZE];
     881                for( int i2=0; ; i++, i2++ ){
     882                    if( buffer[i] == '\n' ){
     883                        temporary[i2] = 0;
     884                        break;
     885                    }
     886                    temporary[i2] = buffer[i];
     887                }
     888                if( genName == temporary ){
     889                    // 一致
     890
     891                    int endIndex = i;
     892
     893                    int lengthOffset = genBufferLength - ( endIndex - startIndex );
     894
     895                    Realloc( length + lengthOffset );
     896                    SlideString( buffer + endIndex, lengthOffset );
     897                    memcpy( buffer + startIndex, genBuffer, genBufferLength );
     898
     899                    isFound = true;
     900
     901                    break;
     902                }
     903            }
     904        }
     905    }
     906
     907    return isFound;
    846908}
    847909
Note: See TracChangeset for help on using the changeset viewer.