📄 coptions.c
字号:
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 + -