coptions.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 2,108 行 · 第 1/5 页

C
2,108
字号
        }
    #else
        env_var = FEGetEnv( INC_VAR );
    #endif
    if( env_var != NULL ) {
        while( *env_var == ' ' )  ++env_var;        /* 23-jun-93 */
        AddIncList( env_var );
    }
    CMemFree( SwData.sys_name );
}


static int OptionDelimiter( char c )
{
    if( c == ' ' || c == '-' || c == '\0' || c == '\t' || c == SwitchChar ) {
        return( 1 );
    }
    return( 0 );
}

static void EnsureEndOfSwitch( void )
{
    char        c;

    if( !OptionDelimiter( *OptScanPtr ) ) {
        for(;;) {                       // find start of switch
            c = *OptScanPtr;
            if( c == '-' || c == SwitchChar ) break;
            --OptScanPtr;
        }
        OptScanPtr = BadCmdLine( ERR_INVALID_OPTION, OptScanPtr );
    }
}

#if _CPU == _AXP
static void SetStructPack( void )   { CompFlags.align_structs_on_qwords = 1; }
#endif

static void SetPackAmount( void )   { PackAmount = OptValue; }
static void Set_DbgFmt( void )      { SwData.dbg_fmt = OptValue; }

#if _CPU == 8086 || _CPU == 386
static void SetCPU( void )          { SwData.cpu = OptValue; }
#endif
#if _CPU == 386
static void SetCPU_xR( void )   { SwData.cpu = OptValue; CompFlags.register_conventions = 1; }
static void SetCPU_xS( void )   { SwData.cpu = OptValue; CompFlags.register_conventions = 0; }
#endif
#if _CPU == 8086 || _CPU == 386
static void SetFPU( void )          { SwData.fpu = OptValue; }
static void Set_FPR( void )         { Stack87 = 4; }
static void Set_FPI87( void )       { SwData.fpt = SW_FPT_INLINE; }
static void Set_Emu( void )         { SwData.fpt = SW_FPT_EMU; }
static void Set_FPC( void )         { SwData.fpt = SW_FPT_CALLS; }
static void Set_FPD( void )         { TargetSwitches |= P5_DIVIDE_CHECK; }

static void SetMemoryModel( void )  { SwData.mem = OptValue; }
#endif

static void Set_BD( void )          { CompFlags.bd_switch_used = 1; GenSwitches |= DLL_RESIDENT_CODE; }
static void Set_BC( void )          { CompFlags.bc_switch_used = 1; }
static void Set_BG( void )          { CompFlags.bg_switch_used = 1; }
static void Set_BM( void )          { CompFlags.bm_switch_used = 1; }

#if _CPU != 8086
static void Set_BR( void )          { CompFlags.br_switch_used = 1; }
#endif

static void Set_BW( void )          { CompFlags.bw_switch_used = 1; }
static void Set_BT( void )          { SetTargName( OptParm,  OptScanPtr - OptParm ); }

static void SetExtendedDefines( void )
{
    CompFlags.extended_defines = 1;
    EnsureEndOfSwitch();
}
static void SetBrowserInfo( void )  { CompFlags.emit_browser_info = 1; }

#if _CPU == _AXP
static void Set_AS( void )
{
    TargetSwitches |= ALIGNED_SHORT;
}
#endif

static void Set_AA( void )          { CompFlags.auto_agg_inits = 1; }
static void Set_AI( void )          { CompFlags.no_check_inits = 1; }
static void Set_AQ( void )          { CompFlags.no_check_qualifiers = 1; }
static void Set_D0( void )
{
    GenSwitches &= ~(NUMBERS | DBG_TYPES | DBG_LOCALS | NO_OPTIMIZATION);
    CompFlags.debug_info_some = 0;
    CompFlags.no_debug_type_names = 0;
    EnsureEndOfSwitch();
}
static void Set_D1( void )
{
    GenSwitches |= NUMBERS;
    if( *OptScanPtr == '+' ) {
        ++OptScanPtr;
        CompFlags.debug_info_some = 1;
        GenSwitches |= DBG_TYPES | DBG_LOCALS;
    }
    EnsureEndOfSwitch();
}
static void Set_D2( void )
{
    GenSwitches |= NUMBERS | DBG_TYPES | DBG_LOCALS | NO_OPTIMIZATION;
    CompFlags.inline_functions = 0;
    if( *OptScanPtr == '~' ) {
        ++OptScanPtr;
        CompFlags.no_debug_type_names = 1;
    }
    EnsureEndOfSwitch();
}
static void Set_D3( void )
{
    CompFlags.dump_types_with_names = 1;
    Set_D2();
}
static void Set_D9( void )          { CompFlags.use_full_codegen_od = 1; }
static void DefineMacro( void )     { OptScanPtr = Define_UserMacro( OptScanPtr ); }

static void SetErrorLimit( void )   { ErrLimit = OptValue; }

#if _CPU == 8086 || _CPU == 386
static void SetDftCallConv( void )
{
    switch( OptValue ) {
    case 1:
        DftCallConv = &CdeclInfo;
        break;
    case 2:
        DftCallConv = &StdcallInfo;
        break;
    case 3:
        DftCallConv = &FastcallInfo;
        break;
    case 4:
        DftCallConv = &OptlinkInfo;
        break;
    case 5:
        DftCallConv = &PascalInfo;
        break;
    case 6:
        DftCallConv = &SyscallInfo;
        break;
    case 7:
        DftCallConv = &FortranInfo;
        break;
    case 8:
    default:
        DftCallConv = &WatcallInfo;
        break;
    }
}
static void Set_EC( void )          { CompFlags.ec_switch_used = 1; }
#endif

static void Set_EE( void )          { CompFlags.ee_switch_used = 1; }
static void Set_EF( void )          { CompFlags.ef_switch_used = 1; }
static void Set_EN( void )          { CompFlags.emit_names = 1; }
static void Set_EI( void )          { CompFlags.make_enums_an_int = 1;
                                      CompFlags.original_enum_setting = 1;}
static void Set_EM( void )          { CompFlags.make_enums_an_int = 0;
                                      CompFlags.original_enum_setting = 0;}

#if _CPU == 8086 || _CPU == 386
static void Set_ET( void )          { TargetSwitches |= P5_PROFILING; }
static void Set_ETP( void )         { TargetSwitches |= NEW_P5_PROFILING; }
static void Set_ESP( void )         { TargetSwitches |= STATEMENT_COUNTING; }
#endif

#if _CPU == 386
static void Set_EZ( void )          { TargetSwitches |= EZ_OMF; }
static void Set_OMF( void )         { TargetSwitches &= ~(OBJ_ELF | OBJ_COFF); }
#endif

#if /*_CPU == 386 || */_CPU == _AXP || _CPU == _PPC || _CPU == _MIPS
static void Set_ELF( void )         { GenSwitches &= ~OBJ_OWL;
                                      GenSwitches |= OBJ_ELF; }
static void Set_COFF( void )        { GenSwitches &= ~OBJ_OWL;
                                      GenSwitches |= OBJ_COFF; }
#endif
#if _CPU == _AXP || _CPU == _PPC || _CPU == _MIPS
static void Set_EndianLittle( void ){ GenSwitches &= ~OBJ_ENDIAN_BIG; }
static void Set_EndianBig( void )   { GenSwitches |= OBJ_ENDIAN_BIG; }
#endif

static void Set_EP( void )
{
    CompFlags.ep_switch_used = 1;
    ProEpiDataSize = OptValue;
}

void SetNoCurrInc( void )           { CompFlags.curdir_inc = 0;}

static void StripQuotes( char *fname )
{
    char    *s;
    char    *d;

    if( *fname == '"' ) {
        // string will shrink so we can reduce in place
        d = fname;
        for( s = d + 1; *s && *s != '"'; ++s ) {
            // collapse double backslashes, only then look for escaped quotes
            if( s[0] == '\\' && s[1] == '\\' ) {
                ++s;
            } else if( s[0] == '\\' && s[1] == '"' ) {
                ++s;
            }
            *d++ = *s;
        }
        *d = '\0';
    }
}

static char *CopyOfParm( void )
{
    char        *p;
    unsigned    len;

    len = OptScanPtr - OptParm;
    p = (char *) CMemAlloc( len + 1 );
    memcpy( p, OptParm, len );
    p[ len ] = '\0';
    return( p );
}

static char *GetAFileName( void )
{
    char    *fname;

    fname = CopyOfParm();
    StripQuotes( fname );
    return( fname );
}

static void Set_FH( void )
{
    if( OptParm == OptScanPtr ) {
        PCH_FileName = DEFAULT_PCH_NAME;
    } else {
        PCH_FileName = GetAFileName();
    }
}

static void Set_FHQ( void )
{
    CompFlags.no_pch_warnings = 1;
    Set_FH();
}

static void Set_FI( void )
{
    ForceInclude = GetAFileName();
}

static void Set_FLD( void )
{
    CompFlags.use_long_double = 1;
}

static void SetTrackInc( void )
{
    CompFlags.track_includes = 1;
}

static void Set_FO( void )
{
    CMemFree( ObjectFileName );
    ObjectFileName = GetAFileName();
    CompFlags.cpp_output_to_file = 1;   /* in case '-p' option */
}

static void Set_FR( void )
{
    CMemFree( ErrorFileName );
    ErrorFileName = GetAFileName();
    if( *ErrorFileName == '\0' ) {
        CMemFree( ErrorFileName );
        ErrorFileName = NULL;
    }
}

#if _CPU == 8086 || _CPU == 386
static void SetCodeClass( void )    { CodeClassName = CopyOfParm(); }
static void SetDataSegName( void )
{
    SwData.nd_used = 1;
    DataSegName = CopyOfParm();
    SegData = -1;
    if( *DataSegName == '\0' ) {
        CMemFree( DataSegName );
        DataSegName = NULL;
    }
}
static void SetTextSegName( void )  { TextSegName = CopyOfParm(); }
static void SetGroup( void )        { GenCodeGroup = CopyOfParm(); }
#endif
static void SetModuleName( void )   { ModuleName = CopyOfParm(); }

static void SetAPILogging( void )   { GenSwitches |= ECHO_API_CALLS; }

#ifndef NDEBUG
#ifdef ASM_OUTPUT
static void SetAsmListing( void )   { TargetSwitches |= ASM_OUTPUT; }
#endif
#ifdef OWL_LOGGING
static void SetOwlLogging( void )   { TargetSwitches |= OWL_LOGGING; }
#endif
#endif

static void SetInclude( void )
{
    char    *fname;

    fname = GetAFileName();
    AddIncList( fname );
    CMemFree( fname );
}

static void SetReadOnlyDir( void )
{
    char    *dirpath;

    dirpath = GetAFileName();
    SrcFileReadOnlyDir( dirpath );
    CMemFree( dirpath );
}

static void SetCharType( void )
{
    SetSignedChar();
    CompFlags.signed_char = 1;
}

#if _CPU == 8086 || _CPU == 386
static void Set_RE( void )          { CompFlags.rent = 1; }
static void Set_RI( void )          { CompFlags.returns_promoted = 1; }
static void Set_R( void )           { CompFlags.save_restore_segregs = 1; }
static void Set_SG( void )          { CompFlags.sg_switch_used = 1; }
static void Set_ST( void )          { CompFlags.st_switch_used = 1; }
#endif
#if _CPU == _AXP || _CPU == _MIPS
static void Set_SI( void )          { TargetSwitches |= STACK_INIT; }
#endif
static void Set_S( void )           { Toggles &= ~TOGGLE_CHECK_STACK; }

static void Set_TP( void )
{
    char    *togname;

    togname = CopyOfParm();
    SetToggleFlag( togname, TRUE );
    CMemFree( togname );
}

static void SetDataThreshHold( void ){ DataThreshold = OptValue; }

static void Set_U( void )
{
    char    *name;

    name = CopyOfParm();
    AddUndefName( name );
    CMemFree( name );
}
static void Set_V( void )           { CompFlags.generate_prototypes = 1; }

static void Set_WE( void )          { CompFlags.warnings_cause_bad_exit = 1; }
static void Set_WO( void )          { CompFlags.using_overlays = 1; }
static void Set_WX( void )          { WngLevel = 4; }
static void SetWarningLevel( void ) { WngLevel = OptValue; }
static void Set_WCD( void )         { EnableDisableMessage( 0, OptValue ); }
static void Set_WCE( void )         { EnableDisableMessage( 1, OptValue ); }

#if _CPU == 386
static void Set_XGV( void )         { TargetSwitches |= INDEXED_GLOBALS; }
#endif

static void Set_XBSA( void )
{
    CompFlags.unaligned_segs = 1;
}

#if _CPU == _AXP
static void Set_XD( void )          { TargetSwitches |= EXCEPT_FILTER_USED; }
#endif

static void Set_ZA99( void )
{
    CompFlags.c99_extensions = 1;
}

static void Set_ZA( void )
{
    CompFlags.extensions_enabled = 0;
    CompFlags.unique_functions = 1;
    TargetSwitches &= ~I_MATH_INLINE;
}

static void SetStrictANSI( void )
{
    CompFlags.strict_ANSI = 1;
    Set_ZA();
}

#if _CPU == 8086 || _CPU == 386
static void Set_ZC( void )
{
    CompFlags.strings_in_code_segment = 1;
    CompFlags.zc_switch_used = 1;       /* 04-jun-91 */
    TargetSwitches |= CONST_IN_CODE;
}
static void Set_ZDF( void )         { SwData.peg_ds_used = 1; SwData.peg_ds_on = 0; }
static void Set_ZDP( void )         { SwData.peg_ds_used = 1; SwData.peg_ds_on = 1; }
static void Set_ZDL( void )         { TargetSwitches |= LOAD_DS_DIRECTLY; }
static void Set_ZFF( void )         { SwData.peg_fs_used = 1; SwData.peg_fs_on = 0; }
static void Set_ZFP( void )         { SwData.peg_fs_used = 1; SwData.peg_fs_on = 1; }
static void Set_ZGF( void )         { SwData.peg_gs_used = 1; SwData.peg_gs_on = 0; }

⌨️ 快捷键说明

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