coptions.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 2,108 行 · 第 1/5 页
C
2,108 行
{ "wo", 0, Set_WO },
{ "wx", 0, Set_WX },
{ "w=#", 0, SetWarningLevel },
#if _CPU == 386
{ "xgv", 0, Set_XGV },
#endif
{ "xbsa", 0, Set_XBSA },
#if _CPU == _AXP
{ "xd", 0, Set_XD },
#endif
{ "za99", 0, Set_ZA99 },
{ "zA", 0, SetStrictANSI },
{ "za", 0, Set_ZA },
#if _CPU == 8086 || _CPU == 386
{ "zc", 0, Set_ZC },
{ "zdf", 0, Set_ZDF },
{ "zdp", 0, Set_ZDP },
{ "zdl", 0, Set_ZDL },
{ "zff", 0, Set_ZFF },
{ "zfp", 0, Set_ZFP },
{ "zgf", 0, Set_ZGF },
{ "zgp", 0, Set_ZGP },
#endif
{ "ze", 0, Set_ZE },
#if _CPU == 8086 || _CPU == 386
{ "zfw", 0, Set_ZFW },
#endif
{ "zg", 0, Set_ZG },
{ "zi", 0, Set_ZI },
{ "zk0u", 0, Set_ZK0U },
{ "zk0", 0, Set_ZK0 },
{ "zk1", 0, Set_ZK1 },
{ "zk2", 0, Set_ZK2 },
{ "zk3", 0, Set_ZK3 },
{ "zkl", 0, Set_ZKL },
{ "zku=#", 0, Set_ZKU },
{ "zk", 0, Set_ZK },
{ "zld", 0, Set_ZLD },
{ "zlf", 0, Set_ZLF },
{ "zls", 0, Set_ZLS },
{ "zl", 0, Set_ZL },
{ "zm", 0, Set_ZM },
{ "zpw", 0, Set_ZPW },
{ "zp=#", 1, SetPackAmount },
#if _CPU == _AXP
{ "zps", 0, SetStructPack },
#endif
#if _CPU == 8086 || _CPU == 386
{ "zro", 0, Set_ZRO },
#endif
#if _CPU == 386
{ "zri", 0, Set_ZRI },
#endif
{ "zs", 0, Set_ZS },
{ "zt=#", 256, SetDataThreshHold },
#if _CPU == 8086 || _CPU == 386
{ "zu", 0, Set_ZU },
#endif
{ "zev", 0, Set_ZEV },
#if _CPU == 8086
{ "zW*", 0, SetCheapWindows },
{ "zw*", 0, SetWindows },
#endif
#if _CPU == 386
{ "zw", 0, SetWindows },
{ "zz", 0, Set_ZZ },
#endif
{ 0, 0, 0 },
};
static char *ProcessOption( struct option const *op_table, char *p, char *option_start )
{
int i;
int j;
char *opt;
char c;
for( i = 0; ; i++ ) {
opt = op_table[i].option;
if( opt == NULL ) break;
c = tolower( *p );
if( c == *opt ) {
OptValue = op_table[i].value;
j = 1;
for(;;) {
++opt;
if( *opt == '\0' || *opt == '*' ) {
if( *opt == '\0' ) {
if( p - option_start == 1 ) {
// make sure end of option
if( !OptionDelimiter( p[j] ) ) break;
}
}
OptScanPtr = p + j;
op_table[i].function();
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 ! defined( __UNIX__ )
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( void )
{
ProcessSubOption( Optimization_Options );
}
static void SetPreprocessOptions( void )
{
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 ! defined( __UNIX__ )
if( ch == '-' ) break;
if( ch == SwitchChar ) break;
#endif
*env++ = ch;
}
*env = '\0';
return( str );
}
static char *ReadIndirectFile( void )
{
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 ! defined( __UNIX__ )
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 ! defined( __UNIX__ )
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( void )
{
CodeClassName = NULL;
PCH_FileName = NULL;
TargetSwitches = 0;
TargSys = TS_OTHER;
#if _CPU == _AXP || _CPU == _PPC || _CPU == _SPARC || _CPU == _MIPS
TextSegName = ".text";
DataSegName = ".data";
GenCodeGroup = "";
DataPtrSize = TARGET_POINTER;
CodePtrSize = TARGET_POINTER;
GenSwitches = MEMORY_LOW_FAILS;
#if _CPU == _AXP
GenSwitches |= OBJ_COFF;
#else
GenSwitches |= OBJ_ELF;
#endif
#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( void )
{
#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';
WatcallInfo.cclass |= 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:
WatcallInfo.cclass |= 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 ) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?