⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 coptions.c

📁 Open Watcom 的 C 编译器源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
                    return( OptScanPtr );
                }
                if( *opt == '#' ) {             // collect a number
                    if( p[j] >= '0' && p[j] <= '9' ) {
                        OptValue = 0;
                        for(;;) {
                            c = p[j];
                            if( c < '0' || c > '9' ) break;
                            OptValue = OptValue * 10 + c - '0';
                            ++j;
                        }
                    }
                } else if( *opt == '$' ) {      // collect an identifer
                    OptParm = &p[j];
                    for(;;) {
                        c = p[j];
                        if( c == '\0' ) break;
                        if( c == '-' ) break;
                        if( c == ' ' ) break;
                        if( c == SwitchChar ) break;
                        ++j;
                    }
                } else if( *opt == '@' ) {      // collect a filename
                    OptParm = &p[j];
                    c = p[j];
                    if( c == '"' ){ // "filename"
                        for(;;){
                            c = p[++j];
                            if( c == '"' ){
                                ++j;
                                break;
                            }
                            if( c == '\0' )break;
                            if( c == '\\' ){
                                ++j;
                            }
                        }
                    }else{
                        for(;;) {
                            c = p[j];
                            if( c == '\0' ) break;
                            if( c == ' ' ) break;
                            if( c == '\t' ) break;
                            #if (_OS != _QNX) && (_OS != _LINUX)
                                if( c == SwitchChar ) break;
                            #endif
                            ++j;
                        }
                    }
                } else if( *opt == '=' ) {      // collect an optional '='
                    if( p[j] == '=' || p[j] == '#' ) ++j;
                } else {
                    c = tolower( p[j] );
                    if( *opt != c ) {
                        if( *opt < 'A' || *opt > 'Z' ) break;
                        if( *opt != p[j] ) break;
                    }
                    ++j;
                }
            }
        }
    }
    if( op_table == Optimization_Options ) {
        p = BadCmdLine( ERR_INVALID_OPTIMIZATION, p );
    } else {
        p = BadCmdLine( ERR_INVALID_OPTION, option_start );
    }
    return( p );
}

static void ProcessSubOption( struct option const *op_table )
{
    char        *option_start;

    option_start = OptScanPtr - 2;
    for(;;) {
        OptScanPtr = ProcessOption( op_table, OptScanPtr, option_start );
        if( OptionDelimiter( *OptScanPtr ) ) break;
    }
}

static void SetOptimization()
{
    ProcessSubOption( Optimization_Options );
}

static void SetPreprocessOptions()
{
    CompFlags.cpp_output_requested = 1;
    if( !OptionDelimiter( *OptScanPtr ) ) {
        ProcessSubOption( Preprocess_Options );
    }
}

static char *CollectEnvOrFileName( char *str )
{
    char        *env;
    char        ch;

    while( *str == ' ' || *str == '\t' ) ++str;
    env = TokenBuf;
    for( ;; ) {
        ch = *str;
        if( ch == '\0' ) break;
        ++str;
        if( ch == ' ' ) break;
        if( ch == '\t' ) break;
        #if (_OS != _QNX) && (_OS != _LINUX)
            if( ch == '-' ) break;
            if( ch == SwitchChar ) break;
        #endif
        *env++ = ch;
    }
    *env = '\0';
    return( str );
}

static char *ReadIndirectFile()
{
    char        *env;
    char        *str;
    int         handle;
    int         len;
    char        ch;

    env = NULL;
    handle = open( TokenBuf, O_RDONLY | O_BINARY );
    if( handle != -1 ) {
        len = filelength( handle );
        env = CMemAlloc( len + 1 );
        read( handle, env, len );
        env[len] = '\0';
        close( handle );
        // zip through characters changing \r, \n etc into ' '
        str = env;
        while( *str ) {
            ch = *str;
            if( ch == '\r' || ch == '\n' ) {
                *str = ' ';
            }
            #if (_OS != _QNX) && (_OS != _LINUX)
                if( ch == 0x1A ) {      // if end of file
                    *str = '\0';        // - mark end of str
                    break;
                }
            #endif
            ++str;
        }
    }
    return( env );
}

#define MAX_NESTING 32

local void ProcOptions( char *str )
{
    unsigned    level;
    char        *save[MAX_NESTING];
    char        *buffers[MAX_NESTING];

    if( str != NULL ) {
        level = 0;
        buffers[0] = NULL;
        for(;;) {
            while( *str == ' ' || *str == '\t' ) ++str;     /* 16-mar-91 */
            if( *str == '@' && level < MAX_NESTING ) {
                save[level] = CollectEnvOrFileName( str + 1 );
                ++level;
                buffers[level] = NULL;
                str = FEGetEnv( TokenBuf );
                if( str == NULL ) {
                    str = ReadIndirectFile();
                    buffers[level] = str;
                }
                if( str != NULL )  continue;
                str = save[--level];
            }
            if( *str == '\0' ) {
                if( level == 0 ) break;
                if( buffers[level] != NULL ) {
                    CMemFree( buffers[level] );
                    buffers[level] = NULL;
                }
                str = save[--level];
                continue;
            }
            if( *str == '-'  ||  *str == SwitchChar ) {
                str = ProcessOption( CFE_Options, str + 1, str );
            } else {  /* collect  file name */
                char *beg, *p;
                int len;

                beg = str;
                if( *str == '"' ){
                    for(;;){
                        ++str;
                        if( *str == '"' ){
                            ++str;
                            break;
                        }
                        if( *str == '\0' ) break;
                        if( *str == '\\' ){
                            ++str;
                        }
                    }
                }else{
                    for(;;) {
                        if( *str == '\0' ) break;
                        if( *str == ' '  ) break;
                        if( *str == '\t'  ) break;              /* 16-mar-91 */
                        #if (_OS != _QNX) && (_OS != _LINUX)
                            if( *str == SwitchChar ) break;
                        #endif
                        ++str;
                    }
                }
                len = str-beg;
                p = (char *) CMemAlloc( len + 1 );
                memcpy( p, beg, len );
                p[ len ] = '\0';
                StripQuotes( p );
                if( WholeFName != NULL ) {
                    /* more than one file to compile ? */
                    CBanner();
                    CErr1( ERR_CAN_ONLY_COMPILE_ONE_FILE );
                    CMemFree( WholeFName );
                }
                WholeFName = p;
            }
        }
    }
}

static void InitCPUModInfo()
{
    CodeClassName = NULL;
    PCH_FileName  = NULL;
    TargetSwitches = 0;
    TargSys = TS_OTHER;
#if _MACHINE == _ALPHA | _MACHINE == _PPC | _MACHINE == _SPARC
    TextSegName   = ".text";
    DataSegName   = ".data";
    GenCodeGroup  = "";
    DataPtrSize   = TARGET_POINTER;
    CodePtrSize   = TARGET_POINTER;
    GenSwitches   = MEMORY_LOW_FAILS;
#elif _CPU == 386 || _CPU == 8086
    Stack87 = 8;
    TextSegName   = "";
    DataSegName   = "";
    GenCodeGroup  = "";
    CompFlags.register_conv_set = 0;
    CompFlags.register_conventions = 1;
    GenSwitches = MEMORY_LOW_FAILS;
#else
    #error InitCPUModInfo not configured for system
#endif
}

local void Define_Memory_Model()
{
#if _CPU == 8086 || _CPU == 386
    char        model;
#endif

    DataPtrSize = TARGET_POINTER;
    CodePtrSize = TARGET_POINTER;
    #if _CPU == 8086 || _CPU == 386
    switch( TargetSwitches & (BIG_CODE|BIG_DATA) ) {
    case 0:                     /* -ms */
        model = 's';
        if( TargetSwitches & FLAT_MODEL ) {     /* 06-apr-89 */
            Define_Macro( "__FLAT__" );
        } else {
            Define_Macro( "M_I86SM" );
            Define_Macro( "__SMALL__" );
            CompFlags.strings_in_code_segment = 0;      /* 01-sep-89 */
        }
        TargetSwitches &= ~CONST_IN_CODE;
        break;
    case BIG_CODE:                      /* -mm */
        model = 'm';
        DefaultInfo.class |= FAR;
        CodePtrSize = TARGET_FAR_POINTER;
        Define_Macro( "M_I86MM" );
        Define_Macro( "__MEDIUM__" );
        CompFlags.strings_in_code_segment = 0;  /* 01-sep-89 */
        TargetSwitches &= ~CONST_IN_CODE;
        break;
    case BIG_DATA:                      /* -mc */
        model = 'c';
        Define_Macro( "M_I86CM" );
        Define_Macro( "__COMPACT__" );
        DataPtrSize = TARGET_FAR_POINTER;                       /* 04-may-90 */
        break;
    case BIG_CODE | BIG_DATA:
        DefaultInfo.class |= FAR;
        CodePtrSize = TARGET_FAR_POINTER;                       /* 04-may-90 */
        if( TargetSwitches & CHEAP_POINTER ) {
            model = 'l';
            Define_Macro( "M_I86LM" );      /* -ml */
            Define_Macro( "__LARGE__" );
        } else {
            model = 'h';
            Define_Macro( "M_I86HM" );      /* -mh */
            Define_Macro( "__HUGE__" );
        }
        DataPtrSize = TARGET_FAR_POINTER;                       /* 04-may-90 */
        break;
    }
    #endif
    #if _CPU == 8086
        strcpy( CLIB_Name, "1clib?" );                          /* 15-may-00 */
        if( CompFlags.bm_switch_used ) {
            strcpy( CLIB_Name, "1clibmt?" );
        }
        if( CompFlags.bd_switch_used ) {
            if( TargSys == TS_WINDOWS ||
                TargSys == TS_CHEAP_WINDOWS ) {
                strcpy( CLIB_Name, "1clib?" );
            } else {
                strcpy( CLIB_Name, "1clibdl?" );
            }
        }
        #ifdef __PCODE__
            PcodeLib_Name = "2p16fpi";                      /* 19-may-91 */
        #endif
        if( GET_FPU_EMU( ProcRevision ) ) {         /* 07-jan-90 */
            strcpy( MATHLIB_Name, "8math87?" );
            EmuLib_Name = "9emu87";                     /* 02-apr-90 */
        } else if( GET_FPU_LEVEL( ProcRevision ) == FPU_NONE ) {
            strcpy( MATHLIB_Name, "5math?" );
            EmuLib_Name = NULL;
            #ifdef __PCODE__
                PcodeLib_Name = "2p16fpc";                  /* 19-may-91 */
            #endif
        } else {
            strcpy( MATHLIB_Name, "8math87?" );
            EmuLib_Name = "9noemu87";                   /* 02-apr-90 */
        }
    #elif _CPU == 386
        model = 'r';                                    /* 07-nov-89 */
        if( ! CompFlags.register_conventions ) model = 's';
        if( CompFlags.br_switch_used ) {                /* 15-may-95 */
            strcpy( CLIB_Name, "1clb?dll" );
        } else {
            strcpy( CLIB_Name, "1clib3?" );     // There is only 1 CLIB now!
        }
        if( GET_FPU_EMU( ProcRevision ) ) {
            if( CompFlags.br_switch_used ) {            /* 19-jun-95 */
                strcpy( MATHLIB_Name, "8mt7?dll" );
            } else {
                strcpy( MATHLIB_Name, "8math387?" );
            }
            EmuLib_Name = "9emu387";
        } else if( GET_FPU_LEVEL( ProcRevision ) == FPU_NONE ) {
            if( CompFlags.br_switch_used ) {            /* 19-jun-95 */
                strcpy( MATHLIB_Name, "5mth?dll" );
            } else {
                strcpy( MATHLIB_Name, "5math3?" );
            }
            EmuLib_Name = NULL;
        } else {
            if( CompFlags.br_switch_used ) {            /* 19-jun-95 */
                strcpy( MATHLIB_Name, "8mt7?dll" );
            } else {
                strcpy( MATHLIB_Name, "8math387?" );
            }
            EmuLib_Name = "9noemu387";
        }
    #elif _MACHINE == _ALPHA || _MACHINE == _PPC || _MACHINE == _SPARC
        if( CompFlags.br_switch_used ) {                /* 15-may-95 */
            strcpy( CLIB_Name, "1clbdll" );
            strcpy( MATHLIB_Name, "8mthdll" );
        } else {
            strcpy( CLIB_Name, "1clib" );
            strcpy( MATHLIB_Name, "8math" );
        }
    #else
        #error Define_Memory_Model not configured
    #endif
    #if _CPU == 8086 || _CPU == 386
        *strchr( CLIB_Name, '?' ) = model;
        *strchr( MATHLIB_Name, '?' ) = model;
    #endif
}

void GenCOptions( char **cmdline )
{
    memset( &SwData,0, sizeof( SwData ) ); //re-useable
    EnableDisableMessage( 0, ERR_PARM_NOT_REFERENCED );
    /* 29-oct-03 Add precision warning but disabled by default */
    EnableDisableMessage( 0, ERR_LOSE_PRECISION );
    InitModInfo();
    InitCPUModInfo();
    #if _CPU == 386
        ProcOptions( FEGetEnv( "WCC386" ) );              /* 12-mar-90 */
    #elif _CPU == 8086
        ProcOptions( FEGetEnv( "WCC" ) );                 /* 12-mar-90 */
    #elif _MACHINE == _ALPHA
        ProcOptions( FEGetEnv( "WCCAXP" ) );
    #elif _MACHINE == _PPC
        ProcOptions( FEGetEnv( "WCCPPC" ) );
    #elif _MACHINE == _SPARC
        ProcOptions( FEGetEnv( "WCCSPC" ) );
    #else
        #error Compiler environment variable not configured
    #endif
    for( ;*cmdline != NULL; ++cmdline ) {
        ProcOptions( *cmdline );
    }
    if( CompFlags.cpp_output_requested )  CompFlags.cpp_output = 1;
    if( CompFlags.cpp_output )  CompFlags.quiet_mode = 1;       /* 29-sep-90 */
    CBanner();          /* print banner if -zq not specified */
    GblPackAmount = PackAmount;
    SetTargSystem();
    SetGenSwitches();
    SetCharacterEncoding();
    Define_Memory_Model();
    #ifdef __PCODE__                                                /* 04-f

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -