owcc.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 1,135 行 · 第 1/3 页
C
1,135 行
/*****************************************/
{
char *p;
int wcc_option;
int c;
int i;
Flags.map_wanted = 0;
Flags.two_case = 1;
Flags.tiny_model = 0;
Flags.be_quiet = 1;
Flags.no_link = 0;
Flags.do_link = 0;
Flags.do_cvpack = 0;
Flags.link_for_dos = 0;
Flags.link_for_os2 = 0;
Flags.windows = 0;
Flags.is32bit = 1;
Flags.math_8087 = 1;
Flags.keep_exename = 0;
Flags.want_errfile = 0;
Flags.strip_all = 0;
DebugFlag = 1;
StackSize = NULL;
strcpy( Conventions, "r" );
preprocess_only = 0;
cpp_want_lines = 1; /* NB: wcc and wcl default to 0 here */
cpp_keep_comments = 0;
cpp_encrypt_names = 0;
cpp_linewrap = NULL;
AltOptChar = '-'; /* Suppress '/' as option herald */
while( (c = GetOpt( &argc, argv,
"b:Cc::D:Ef:g::"
"HI:i::k:L:l:M::m:"
"O::o:P::QSs::U:vW::wx:yz::",
EnglishHelp )) != -1 ) {
char *Word = "";
int i;
int found_mapping = FALSE;
for( i = 0; i < sizeof( mappings ) / sizeof( mappings[0] ); i++ ) {
option_mapping *m = mappings + i;
char *tail = strchr( m->LongName, ':' );
if( c != m->LongName[0] )
continue;
if( OptArg == NULL ) {
if( m->LongName[1] == '\0' ) {
strcat( CC_Opts, " -" );
strcat( CC_Opts, m->WatcomName );
found_mapping = TRUE;
break;
}
/* non-existant argument can't match other cases */
continue;
}
if( tail ) {
if( !strncmp( OptArg, m->LongName + 1,
tail - m->LongName - 1 ) ) {
strcat( CC_Opts, " -" );
strcat( CC_Opts, m->WatcomName );
strcat( CC_Opts, OptArg + ( tail - m->LongName - 1) );
found_mapping = TRUE;
break;
}
} else if( !strcmp( OptArg, m->LongName + 1 ) ) {
strcat( CC_Opts, " -" );
strcat( CC_Opts, m->WatcomName );
found_mapping = TRUE;
break;
}
}
if( found_mapping )
continue;
if( OptArg ) {
Word = malloc( strlen( OptArg ) + 6 );
strcpy( Word, OptArg );
}
wcc_option = 1;
switch( c ) {
case 'f':
if( !strcmp( Word, "syntax-only" ) ) {
c = 'z';
strcpy( Word, "s" );
Flags.no_link = 1;
break;
}
if( !strncmp( Word, "cpp-wrap=", 9 ) ) {
if( cpp_linewrap )
free( cpp_linewrap );
Word[7] = 'w';
cpp_linewrap = strdup( Word + 7 );
wcc_option = 0;
break;
}
if( !strcmp( Word, "mangle-cpp" ) ) {
cpp_encrypt_names = 1;
wcc_option = 0;
break;
}
switch( Word[0] ) {
case 'd': /* name of linker directive file */
Link_Name = "__owcc__.lnk";
if( Word[1] == '=' || Word[1] == '#' ) {
MakeName( Word, ".lnk" ); /* add extension */
Link_Name = strfdup( Word + 2 );
}
wcc_option = 0;
break;
case 'm': /* name of map file */
Flags.map_wanted = TRUE;
if( Word[1] == '=' || Word[1] == '#' ) {
Map_Name = strfdup( Word + 2 );
}
wcc_option = 0;
break;
case 'o': /* name of object file */
/* parse off argument, so we get right filename
in linker command file */
p = &Word[1];
if( Word[1] == '=' || Word[1] == '#' ) {
++p;
}
free( Obj_Name );
Obj_Name = strfdup( p ); /* 08-mar-90 */
break;
case 'r': /* name of error report file */
Flags.want_errfile = TRUE;
break;
}
/* avoid passing on unknown options */
wcc_option = 0;
break;
case 'k': /* stack size option */
if( Word[0] != '\0' ) {
StackSize = strdup( Word );
}
wcc_option = 0;
break;
/* compiler options that affect the linker */
case 'c': /* compile only */
Flags.no_link = TRUE;
wcc_option = 0;
break;
case 'x': /* change source language */
if( strcmp( Word, "c" ) == 0 ) {
Flags.force_c = TRUE;
} else if( strcmp( Word, "c++" ) == 0 ) {
Flags.force_c_plus = TRUE;
} else {
Flags.no_link = TRUE;
}
wcc_option = 0;
break;
case 'm':
if( ( !strncmp( "cmodel=", Word, 7 ) )
&& ( Word[8] == '\0' ) ) {
if( Word[7] == 't' ) { /* tiny model */
Word[0] = 's'; /* change to small */
Flags.tiny_model = TRUE;
} else {
Word[0] = Word[7];
}
Word[1] = '\0';
break;
}
if( !strncmp("regparm=", Word, 8 ) ) {
if( !strcmp( Word + 8, "0" ) )
Conventions[0] = 's';
else
Conventions[0] = 'r';
wcc_option = 0;
break;
}
if( !strncmp("tune=i", Word, 6 ) ) {
switch( Word[6] ) {
case '0':
case '1':
case '2':
CPU_Class = Word[6];
Conventions[0] = '\0';
break;
case '3':
case '4':
case '5':
case '6':
CPU_Class = Word[6];
break;
default:
/* Unknown CPU type --- disable generation of this
* option */
CPU_Class = '\0';
}
wcc_option = 0;
break;
}
wcc_option = 0; /* dont' pass on unknown options */
break;
case 'z': /* 12-jan-89 */
switch( tolower( Word[0] ) ) {
case 's':
Flags.no_link = TRUE;
break;
case 'q':
Flags.be_quiet = TRUE;
break;
case 'w':
Flags.windows = TRUE;
}
break;
case 'E':
preprocess_only = 1;
wcc_option = 0;
break;
case 'P':
cpp_want_lines = 0;
wcc_option = 0;
break;
case 'C':
cpp_keep_comments = 1;
wcc_option = 0;
break;
case 'o':
O_Name = strfdup( OptArg );
wcc_option = 0;
break;
case 'g':
if( !OptArg )
Word = "2";
else if( !isdigit( OptArg[0] ) ) {
c = 'h';
if( strcmp( Word, "w" ) == 0 ) {
DebugFlag = 3;
} else if( strcmp( Word, "c" ) == 0 ) { /* 02-mar-91 */
Flags.do_cvpack = 1;
DebugFlag = 4;
} else if( strcmp( Word, "d" ) == 0 ) {
DebugFlag = 5;
}
break;
}
c = 'd';
parse_d:
if( DebugFlag == 0 ) { /* not set by -h yet */
if( strcmp( Word, "1" ) == 0 ) {
DebugFlag = 1;
} else if( strcmp( Word, "1+" ) == 0 ) { /* 02-mar-91 */
DebugFlag = 2;
} else if( strcmp( Word, "2" ) == 0 ) {
DebugFlag = 2;
} else if( strcmp( Word, "2i" ) == 0 ) {
DebugFlag = 2;
} else if( strcmp( Word, "2s" ) == 0 ) {
DebugFlag = 2;
} else if( strcmp( Word, "3" ) == 0 ) {
DebugFlag = 2;
} else if( strcmp( Word, "3i" ) == 0 ) {
DebugFlag = 2;
} else if( strcmp( Word, "3s" ) == 0 ) {
DebugFlag = 2;
}
}
break;
case 'S':
Flags.do_disas = TRUE;
Flags.no_link = TRUE;
if( DebugFlag == 0 ) {
c = 'd';
Word = "1";
goto parse_d;
}
wcc_option = 0;
break;
case 's':
if( OptArg ) {
/* leave -shared to mapping table */
wcc_option = 0;
break;
}
Flags.strip_all = 1;
DebugFlag = 0;
wcc_option = 0;
break;
case 'v':
Flags.be_quiet = 0;
wcc_option = 0;
break;
case 'W':
if( OptArg && strncmp( OptArg, "l,", 2 ) == 0 ) {
AddDirective( OptArg + 2 );
wcc_option = 0;
}
/* other cases handled by table */
break;
case 'I':
xlate_fname( Word );
break;
case 'b':
Flags.link_for_sys = TRUE;
SystemName = strdup( Word );
/* if Word found in specs.owc, add options from there: */
if( ConsultSpecsFile( Word ) ) {
/* all set */
wcc_option = 0;
} else {
/* not found --- default to bt=<system> */
strcpy( Word, "t=" );
strcat( Word, SystemName );
}
break;
case 'l':
strcat( Libs, Libs[0] != '\0' ? ",lib" : " lib" );
strcat( Libs, OptArg );
strcat( Libs, ".a" );
wcc_option = 0;
break;
case 'L':
xlate_fname( Word );
fputs( "libpath ", Fp );
Fputnl( Word, Fp );
wcc_option = 0;
break;
case 'i': /* -include <file> --> -fi=<file> */
if( !OptArg ) {
wcc_option = 0;
break;
}
if( !strcmp( OptArg, "nclude" ) ) {
c = 'f';
Word = realloc( Word, strlen( argv[OptInd] ) + 6 );
if( OptInd >= argc - 1 ) {
PrintMsg( "Argument of -include missing\n", OptArg );
return( 1 );
}
strcpy( Word, "i=" );
strfcat( Word, argv[OptInd] );
argv[OptInd++][0] = NULLCHAR;
break;
}
/* avoid passing un unknown options */
wcc_option = 0;
break;
case 'M': /* autodepend information for Unix makes */
if( !OptArg ) {
wcc_option = 0;
break;
}
c = 'a';
if( !strcmp( OptArg, "D" ) ||
!strcmp( OptArg, "MD" ) ) {
/* NB: only -MMD really matches OW's behaviour, but
* for now, let's accept -MD to mean the same */
/* translate to -adt=.o */
strcpy( Word, "dt=.o" );
} else if( !strcmp( OptArg, "F" ) ) {
Word = realloc( Word, strlen( argv[OptInd] ) + 6 );
if( OptInd >= argc - 1 ) {
PrintMsg( "Argument of -MF missing\n", OptArg );
return( 1 );
}
strcpy( Word, "d=" );
strfcat( Word, argv[OptInd] );
argv[OptInd++][0] = NULLCHAR;
} else if( !strcmp( OptArg, "T") ) {
Word = realloc( Word, strlen( argv[OptInd] ) + 6 );
if( OptInd >= argc - 1 ) {
PrintMsg( "Argument of -M%s missing\n", OptArg );
return( 1 );
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?