コード例 #1
0
ファイル: preproc.c プロジェクト: MikeyG/open-watcom-v2
static void PP_CloseAllFiles( void )
{
    FILELIST    *tmp;

    while( PP_File != NULL ) {
        tmp = PP_File;
        PP_File = PP_File->prev_file;
        fclose( tmp->handle );
        PP_Free( tmp->filename );
        PP_Free( tmp );
    }
}
コード例 #2
0
ファイル: preproc.c プロジェクト: MikeyG/open-watcom-v2
static char *AddIncludePath( char *old_list, const char *path_list )
{
    size_t  len;
    size_t  old_len;
    char    *new_list;
    char    *p;

    new_list = old_list;
    if( path_list != NULL && *path_list != '\0' ) {
        len = strlen( path_list );
        if( old_list == NULL ) {
            p = new_list = PP_Malloc( len + 1 );
        } else {
            old_len = strlen( old_list );
            new_list = PP_Malloc( old_len + 1 + len + 1 );
            memcpy( new_list, old_list, old_len );
            PP_Free( old_list );
            p = new_list + old_len;
        }
        while( *path_list != '\0' ) {
            if( p != new_list )
                *p++ = PATH_LIST_SEP;
            path_list = GetPathElement( path_list, NULL, &p );
        }
        *p = '\0';
    }
    return( new_list );
}
コード例 #3
0
void PP_Include( char *ptr )
{
    char        *filename;
    char        delim;
    int         incl_type;

    while( *ptr == ' '  ||  *ptr == '\t' ) ++ptr;
    filename = ptr+1;
    if( *ptr == '<' ) {
        delim = '>';
        incl_type = PPINCLUDE_SYS;
    } else if( *ptr == '"' ) {
        delim = '"';
        incl_type = PPINCLUDE_USR;
    } else {
        PP_GenError( "Unrecognized INCLUDE directive" );
        return;
    }
    ++ptr;
    while( *ptr != delim  &&  *ptr != '\0' )
        ++ptr;
    *ptr = '\0';
    if( PP_OpenInclude( filename, incl_type ) == NULL ) {
        filename = doStrDup( filename );        // want to reuse buffer
        PPCharPtr = &PPLineBuf[1];
        sprintf( PPCharPtr, "%cerror Unable to open '%s'\n", PreProcChar, filename );
        PP_Free( filename );
    } else {
        PP_GenLine();
    }
}
コード例 #4
0
ファイル: preproc.c プロジェクト: MikeyG/open-watcom-v2
void PP_Fini( void )
{
    int         hash;
    MACRO_ENTRY *me;

    for( hash = 0; hash < HASH_SIZE; hash++ ) {
        for( ; (me = PPHashTable[hash]) != NULL; ) {
            PPHashTable[hash] = me->next;
            if( me->replacement_list != NULL )
                PP_Free( me->replacement_list );
            PP_Free( me );
        }
    }
    free_macro_buf();
    PP_CloseAllFiles();
    PP_Free( IncludePath2 );
}
コード例 #5
0
ファイル: preproc.c プロジェクト: MikeyG/open-watcom-v2
int PP_Char( void )
{
    MACRO_TOKEN *mtok;
    MACRO_ENTRY *me;
    ppt_token   token;

    if( *PPTokenPtr == '\0' ) {
        for( ; (mtok = PPTokenList) != NULL; ) {
            PPTokenList = mtok->next;
            PP_Free( mtok );
            mtok = PPTokenList;
            if( mtok == NULL )
                break;
            if( !IS_END_OF_MACRO( mtok ) ) {
                PPTokenPtr = mtok->data;
                return( *PPTokenPtr++ );
            }
            DeleteNestedMacro();
        }
        for( ;; ) {
            for( ;; ) {
                if( PP_ScanNextToken( &token ) == EOF )
                    return( EOF );
                if( token != PPT_COMMENT )
                    break;
                if( PPFlags & PPFLAG_KEEP_COMMENTS )
                    break;
                if( PPSavedChar == '\0' ) {
                    PPTokenPtr = PPNextTokenPtr;
                    return( '\n' );
                } else {
                    // replace comment with a space
                    PPTokenPtr = PPNextTokenPtr;
                    return( ' ' );
                }
            }
            if( token != PPT_ID )
                break;
            me = PP_MacroLookup( PPTokenPtr, strlen( PPTokenPtr ) );
            if( me == NULL )
                break;
            if( me->parmcount != PP_SPECIAL_MACRO && me->parmcount != 0 ) {
                if( PPSavedChar != '(' ) {
                    break;
                }
            }
            DoMacroExpansion( me );
            if( PPTokenList != NULL ) {
                PPTokenPtr = PPTokenList->data;
                break;
            }
        }
    }
    return( *PPTokenPtr++ );
}
コード例 #6
0
int PP_Char( void )
{
    MACRO_TOKEN *mtok;
    MACRO_ENTRY *me;
    char        token;

    if( *PPTokenPtr == '\0' ) {
        for( ;; ) {
            mtok = PPTokenList;
            if( mtok == NULL ) break;
            PPTokenList = mtok->next;
            PP_Free( mtok );
            mtok = PPTokenList;
            if( mtok == NULL ) break;
            if( mtok->token == PPT_NULL  &&  mtok->data[0] == 'Z' ) {
                DeleteNestedMacro();
                continue;
            }
            PPTokenPtr = mtok->data;
            return( *PPTokenPtr++ );
        }
        for( ;; ) {
            for( ;; ) {
                if( PP_ScanNextToken( &token ) == EOF )  return( EOF );
                if( token != PPT_COMMENT )  break;
                if( PPFlags & PPFLAG_KEEP_COMMENTS )  break;
                if( PPSavedChar == '\0' ) {
                    PPTokenPtr = PPCharPtr;
                    return( '\n' );
                } else {
                    // replace comment with a space
                    PPTokenPtr = PPCharPtr;
                    return( ' ' );
                }
            }
            if( token != PPT_ID )  break;
            me = PP_MacroLookup( PPTokenPtr );
            if( me == NULL )  break;
            if( me->parmcount != PP_SPECIAL_MACRO && me->parmcount != 0) {
                if( PPSavedChar != '(' ) {
                    break;
                }
            }
            DoMacroExpansion( me );
            if( PPTokenList != NULL ) {                 /* 08-feb-93 */
                PPTokenPtr = PPTokenList->data;
                break;
            }
        }
    }
    return( *PPTokenPtr++ );
}
コード例 #7
0
ファイル: preproc.c プロジェクト: MikeyG/open-watcom-v2
static char *resize_macro_buf( char *buf, size_t new_size )
{
    if( new_size > macro_buf_size ) {
        new_size = ( ( 255 + new_size ) / 256 ) * 256;
        macro_buf = PP_Malloc( new_size );
        if( buf != NULL ) {
            memcpy( macro_buf, buf, macro_buf_size );
            PP_Free( buf );
        }
        macro_buf_size = new_size;
    }
    return( macro_buf );
}
コード例 #8
0
ファイル: preproc.c プロジェクト: MikeyG/open-watcom-v2
static void PP_Endif( void )
{
    CPP_INFO    *cpp;

    if( NestLevel != 0 ) {
        --NestLevel;
        cpp = PPStack;
        PPStack = cpp->prev_cpp;
        PP_Free( cpp );
    }
    if( NestLevel < SkipLevel ) {
        SkipLevel = NestLevel;
    }
}
コード例 #9
0
void PP_RCInclude( char *ptr )
{
    char        *filename;
    int         quoted = 0;

    while( *ptr == ' '  ||  *ptr == '\t' ) ++ptr;
    if( *ptr == '\"' ) {
        ptr++;
        quoted = 1;
    }

    filename = ptr;
    ++ptr;
    if( quoted ) {
        while( *ptr != '\"' ) {
            ptr++;
        }
    } else {
        for( ;; ) {
            if( *ptr == ' ' ) break;
            if( *ptr == '\t' ) break;
            if( *ptr == '\r' ) break;
            if( *ptr == '\n' ) break;
            if( *ptr == '\0' ) break;
            if( *ptr == '\"' ) break;
            ++ptr;
        }
    }
    *ptr = '\0';
    if( PP_OpenInclude( filename, PPINCLUDE_USR ) == NULL ) {
        filename = doStrDup( filename );        // want to reuse buffer
        PPCharPtr = &PPLineBuf[1];
        sprintf( PPCharPtr, "%cerror Unable to open '%s'\n", PreProcChar, filename );
        PP_Free( filename );
    } else {
        PP_GenLine();
    }
}
コード例 #10
0
ファイル: preproc.c プロジェクト: MikeyG/open-watcom-v2
static size_t PP_ReadLine( char *line_generated )
{
    FILELIST            *this_file;
    size_t              len;
    unsigned char       c;

    if( PP_File == NULL ) {     // if end of main file
        return( 0 );            // - indicate EOF
    }
    PPLineNumber = PP_File->linenum;
    PPLineBuf[0] = '\0';
    PPNextTokenPtr = PPLineBuf + 1;
    *line_generated = 0;
    len = 1;
    for( ;; ) {
        for( ;; ) {
            for( ;; ) {
                c = *PPBufPtr;
                if( c == DOS_EOF_CHAR ) {               // 17-oct-94
                    c = '\n';
                    if( len != 1 )
                        break;
                    c = DOS_EOF_CHAR;
                } else {
                    ++PPBufPtr;
                    if( c != '\0' ) {
                        break;
                    }
                }
                if( c == DOS_EOF_CHAR || (PP_ReadBuf() == 0) ) {
                    // if the last line of a file does not end with a carriage
                    // return then still return what is on that line
                    if( len > 1 ) {
                        c = '\n';
                        break;
                    }
                    this_file = PP_File;
                    fclose( this_file->handle );
                    PP_File = this_file->prev_file;
                    PPBufPtr = this_file->prev_bufptr;
                    PP_Free( this_file->filename );
                    PP_Free( this_file );
                    if( PP_File == NULL ) {     // if end of main file
                        return( 0 );            // - indicate EOF
                    }
                    PP_GenLine();
                    *line_generated = 1;
                    len = strlen( PPNextTokenPtr );
                    return( len );
                }
            }
            PPLineBuf[len] = c;
            if( c == '\n' )
                break;
            ++len;
        }
        PP_File->linenum++;
        if( PPLineBuf[len - 1] == '\r' )
            --len;
        if( PPLineBuf[len - 1] != '\\' )
            break;
        --len;
    }
    PPLineBuf[len++] = '\n';
    PPLineBuf[len++] = '\0';
    PPNextTokenPtr = PPLineBuf + 1;
    return( len );
}
コード例 #11
0
ファイル: preproc.c プロジェクト: MikeyG/open-watcom-v2
static void free_macro_buf( void )
{
    PP_Free( macro_buf );
    macro_buf = NULL;
    macro_buf_size = 0;
}
コード例 #12
0
ファイル: preproc.c プロジェクト: MikeyG/open-watcom-v2
void PP_IncludePathFini( void )
{
    PP_Free( IncludePath1 );
}