📄 wcl.c
字号:
if( Directive_List == NULL ) {
Directive_List = p;
} else {
p2 = Directive_List;
while( p2->next != NULL ) p2 = p2->next;
p2->next = p;
}
}
static int Parse( void )
/************************/
{
char opt;
char *end;
FILE *atfp;
char buffer[_MAX_PATH];
int len;
char *p;
int wcc_option;
Flags.map_wanted = 0;
Flags.two_case = 0;
Flags.tiny_model = 0;
Flags.be_quiet = 0;
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.math_8087 = 1;
DebugFlag = 0;
StackSize = NULL;
Conventions = 'r';
/* Cmd will always begin with at least one */
/* non-space character if we get this far */
for(;;) {
Cmd = SkipSpaces( Cmd );
if( *Cmd == NULLCHAR ) break;
opt = *Cmd;
if( opt == '-' || opt == Switch_Chars[1] ) {
Cmd++;
} else if( opt != '@' ) {
opt = ' ';
}
end = Cmd;
if( *Cmd == '"' ) {
for(;;) {
++end;
if( *end == '\0' ) break;
if( *end == '"' ) break;
}
} else {
for(;;) {
if( *end == '\0' ) break;
if( *end == ' ' ) break;
if( *end == '\t' ) break; /* 16-mar-91 */
#ifndef __UNIX__
if( *end == Switch_Chars[1] ) break;
#endif
if( opt == '-' || opt == Switch_Chars[1] ) {
/* if we are processing a switch, stop at a '-' */
if( *end == '-' ) break;
}
++end;
}
}
len = end - Cmd;
if( len != 0 ) {
if( opt == ' ' ) { /* if filename, add to list */
strncpy( Word, Cmd, len );
Word[ len ] = NULLCHAR;
end = ScanFName( end, len );
if( FileExtension( Word, ".lib" ) ) {
strcat( Libs, Libs[0] != '\0' ? "," : " " );
strcat( Libs, Word );
} else {
strcat( Files, Word );
strcat( Files, " " );
}
} else { /* otherwise, do option */
--len;
strncpy( Word, Cmd + 1, len );
Word[ len ] = NULLCHAR;
wcc_option = 1; /* assume its a wcc option */
switch( tolower( *Cmd ) ) {
case 'f': /* files option */
end = ScanFName( end, len );
switch( tolower( Word[0] ) ) {
case 'd': /* name of linker directive file */
Link_Name = "__WCL__.LNK";
if( Word[1] == '=' || Word[1] == '#' ) {
MakeName( Word, ".lnk" ); /* add extension */
Link_Name = strdup( Word + 2 );
}
wcc_option = 0;
break;
case 'e': /* name of exe file */
if( Word[1] == '=' || Word[1] == '#' ) {
strcpy( Exe_Name, Word + 2 );
}
wcc_option = 0;
break;
case 'i': /* name of forced include file */
break;
case 'm': /* name of map file */
Flags.map_wanted = TRUE;
if( Word[1] == '=' || Word[1] == '#' ) {
Map_Name = strdup( 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;
Obj_Name = strdup( p ); /* 08-mar-90 */
break;
#if defined(WCLI86) || defined(WCL386)
case 'p': /* floating-point option */
if( tolower( Word[1] ) == 'c' ) {
Flags.math_8087 = 0;
}
break;
#endif
default:
break;
}
break;
case 'k': /* stack size option */
if( Word[0] != '\0' ) {
StackSize = strdup( Word );
}
wcc_option = 0;
break;
case 'l': /* link target option */
switch( (Word[1] << 8) | tolower( Word[0] ) ) {
case 'p':
Flags.link_for_dos = 0;
Flags.link_for_os2 = TRUE;
break;
case 'r':
Flags.link_for_dos = TRUE;
Flags.link_for_os2 = 0;
break;
default: /* 10-jun-91 */
Flags.link_for_sys = TRUE;
p = &Word[0];
if( Word[0] == '=' || Word[0] == '#' ) ++p;
SystemName = strdup( p );
break;
}
wcc_option = 0;
break;
case 'x':
if( Word[0] == '\0' ) {
Flags.two_case = TRUE;
wcc_option = 0;
}
break;
case '@':
if( Word[0] != '\0' ) {
end = ScanFName( end, len );
MakeName( Word, ".lnk" );
if( ( atfp = fopen( Word, "r" ) ) == NULL ) {
PrintMsg( WclMsgs[UNABLE_TO_OPEN_DIRECTIVE_FILE], Word );
return( 1 );
}
while( fgets( buffer, sizeof(buffer), atfp ) != NULL ) {
if( strnicmp( buffer, "file ", 5 ) == 0 ) {
/* look for names separated by ','s */
p = strchr( buffer, '\n' );
if( p ) *p = NULLCHAR;
AddName( &buffer[5], Fp );
Flags.do_link = TRUE;
} else {
fputs( buffer, Fp );
}
}
fclose( atfp );
}
wcc_option = 0;
break;
/* compiler options that affect the linker */
#ifdef WCL386
case '3':
case '4':
case '5': /* 22-sep-92 */
Conventions = tolower( Word[0] );
break;
#endif
case '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 '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;
case 'i': /* include file path */
end = ScanFName( end, len );
break;
case 'c': /* compile only */
if( stricmp( Word, "c" ) == 0 ) {
Flags.force_c = TRUE;
} else if( stricmp( Word, "c++" ) == 0 ) {
Flags.force_c_plus = TRUE;
} else {
Flags.no_link = TRUE;
}
/* fall through */
case 'y':
wcc_option = 0;
break;
#if defined(WCLI86) || defined(WCL386)
case 'm': /* memory model */
if( Cmd[1] == 't' || Cmd[1] == 'T' ) { /* tiny model*/
Word[0] = 's'; /* change to small */
Flags.tiny_model = TRUE;
}
break;
#endif
case 'p':
Flags.no_link = TRUE;
break; /* this is a preprocessor option */
case 'z': /* 12-jan-89 */
switch( tolower( Cmd[1] ) ) {
case 's':
Flags.no_link = TRUE;
break;
case 'q':
Flags.be_quiet = TRUE;
break;
#ifdef WCLI86
case 'w':
Flags.windows = TRUE;
#endif
}
break;
case '"': /* 17-dec-91 */
wcc_option = 0;
if( *end == '"' ) ++end;
AddDirective( len );
break;
}
/* don't add linker-specific options */
/* to compiler command line: */
if( wcc_option ) {
len = strlen( CC_Opts );
CC_Opts[ len++ ] = ' ';
CC_Opts[ len++ ] = opt;
CC_Opts[ len++ ] = *Cmd; /* keep original case */
CC_Opts[ len ] = NULLCHAR;
strcat( CC_Opts, Word );
}
}
Cmd = end;
}
}
return( 0 );
}
static int useCPlusPlus( char *p )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -