deffile.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 1,067 行 · 第 1/3 页
C
1,067 行
SET_ERROR;
} else {
exportsGotResident = 1;
mergeNow = 1;
}
state = STATE_EXPORTS;
break;
case STATE_COMMA:
if( !exportsGotEntryName ) {
SET_ERROR;
}
state = STATE_EXPORTS;
break;
default:
break;
}
break;
case STATE_LIBRARY: /* LIBRARY [library][BASE=address] */
state = next_token(STATE_LIBRARY, &mergeNow, NULL, TRUE, FALSE );
if( mergeNow ) break;
switch( state ) {
case STATE_STRING:
strip_quotes( curToken );
if( info->internalDllName != NULL ) FreeMem( info->internalDllName );
info->internalDllName = DupStrMem( curToken );
state = STATE_LIBRARY;
break;
case STATE_BASE:
state = next_token(STATE_LIBRARY, NULL, NULL, FALSE, FALSE );
switch( state ) {
case STATE_EQUAL:
state = next_token(STATE_LIBRARY, NULL, NULL, FALSE, FALSE );
switch( state ) {
case STATE_STRING:
if( info->baseAddr != NULL ) FreeMem( info->baseAddr );
info->baseAddr = DupStrMem( curToken );
break;
default:
break;
}
default:
break;
}
state = STATE_LIBRARY;
break;
default:
break;
}
break;
case STATE_NAME: /* NAME [application][BASE=address] */
state = next_token(STATE_NAME, &mergeNow, NULL, TRUE, FALSE );
if( mergeNow ) break;
switch( state ) {
case STATE_STRING:
strip_quotes( curToken );
if( info->name != NULL ) FreeMem( info->name );
info->name = DupStrMem( curToken );
state = STATE_NAME;
break;
case STATE_BASE:
state = next_token(STATE_NAME, NULL, NULL, FALSE, FALSE );
switch( state ) {
case STATE_EQUAL:
state = next_token(STATE_NAME, NULL, NULL, FALSE, FALSE );
switch( state ) {
case STATE_STRING:
if( info->baseAddr != NULL ) FreeMem( info->baseAddr );
info->baseAddr = DupStrMem( curToken );
break;
default:
break;
}
default:
break;
}
state = STATE_NAME;
break;
default:
break;
}
break;
case STATE_SECTIONS: /* SECTIONS definitions */
UnsupportedOptsMessage( "SECTIONS" );
state=STATE_STRING;
mergeNow2 = 0;
mergeNow = 0;
for( ; ; ) {
state=next_token( STATE_STRING, &mergeNow, NULL, FALSE, FALSE );
if ( (state<STATE_AT) && mergeNow2 ) break;
mergeNow2 = mergeNow;
mergeNow = 0;
}
mergeNow = 0;
break;
case STATE_STACKSIZE: /* STACKSIZE reserve[,commit] */
state = next_token(STATE_STACKSIZE, &mergeNow, NULL, FALSE, FALSE );
if( mergeNow && !stackGotReserve ) SET_ERROR;
switch( state ) {
case STATE_STRING:
if( stackGotCommit ) {
SET_ERROR;
} else if (stackGotReserve){
stackCommit = DupStrMem( curToken );
stackGotCommit = 1;
state = STATE_CLEAR;
break;
} else {
stackReserve = DupStrMem( curToken );
stackGotReserve = 1;
mergeType = STATE_STACKSIZE;
}
state = STATE_STACKSIZE;
break;
case STATE_COMMA:
state = next_token(STATE_STACKSIZE, NULL, NULL, FALSE, FALSE );
switch( state ) {
case STATE_STRING:
stackCommit = DupStrMem( curToken );
stackGotCommit = 1;
state = STATE_CLEAR;
break;
default:
SET_ERROR;
break;
}
break;
case STATE_EOF:
break;
default:
if( !stackGotReserve ) SET_ERROR;
break;
}
break;
case STATE_STUB: /* STUB "newfilename" */
if (stubGotFile) {
FreeMem(info->stub);
info->stub=NULL;
}
state = next_token(STATE_STUB, NULL, NULL, TRUE, FALSE );
switch( state ) {
case STATE_STRING:
stubGotFile = TRUE;
str = string_convert( curToken );
info->stub = DupStrMem(str);
state = STATE_CLEAR;
break;
default:
SET_ERROR;
break;
}
break;
case STATE_HEAPSIZE: /* HEAPSIZE reserve[,commit] */
state = next_token( STATE_HEAPSIZE, &mergeNow, NULL, FALSE, FALSE );
if( mergeNow && !heapGotReserve ) SET_ERROR;
switch( state ) {
case STATE_STRING:
if( heapGotCommit ) {
SET_ERROR;
} else if (heapGotReserve){
heapCommit = DupStrMem( curToken );
heapGotCommit = 1;
state = STATE_CLEAR;
break;
} else {
heapReserve = DupStrMem( curToken );
heapGotReserve = 1;
mergeType = STATE_HEAPSIZE;
}
state = STATE_HEAPSIZE;
break;
case STATE_COMMA:
state = next_token( STATE_HEAPSIZE, NULL, NULL, FALSE, FALSE );
switch( state ) {
case STATE_STRING:
heapCommit = DupStrMem( curToken );
heapGotCommit = 1;
state = STATE_CLEAR;
break;
default:
SET_ERROR;
break;
}
break;
case STATE_EOF:
break;
default:
if( !heapGotReserve ) SET_ERROR;
break;
}
break;
case STATE_VERSION: /* VERSION major[.minor] */
state = next_token(STATE_VERSION, &mergeNow, NULL, FALSE, FALSE );
if( mergeNow && !versionGotMajor ) SET_ERROR;
switch( state ) {
case STATE_STRING:
if( versionGotMajor ) {
SET_ERROR;
} else {
versionMajor = DupStrMem( curToken );
versionGotMajor = 1;
mergeType = STATE_VERSION;
}
state = STATE_VERSION;
break;
case STATE_PERIOD:
if( !versionGotMajor ) {
SET_ERROR;
} else {
state = next_token(STATE_VERSION, NULL, NULL, FALSE, FALSE );
switch( state ) {
case STATE_STRING:
versionMinor = DupStrMem( curToken );
versionGotMinor = 1;
state = STATE_CLEAR;
break;
default:
SET_ERROR;
break;
}
}
break;
case STATE_EOF:
break;
default:
SET_ERROR;
break;
}
break;
case STATE_PROTMODE:
/*** ignore this token ***/
UnsupportedOptsMessage( "PROTMODE" );
state = STATE_CLEAR;
break;
case STATE_CODE:
/*** ignore this token and the rest of the line ***/
UnsupportedOptsMessage( "CODE" );
next_token(STATE_CODE, NULL, &foundNewLine, FALSE, FALSE );
while( !foundNewLine ) {
next_token(STATE_CODE, NULL, &foundNewLine, FALSE, FALSE );
}
state = STATE_CLEAR;
break;
case STATE_EXETYPE:
/*** ignore this token and the rest of the line ***/
UnsupportedOptsMessage( "EXETYPE" );
next_token( STATE_EXETYPE, NULL, &foundNewLine, FALSE, FALSE );
while( !foundNewLine ) {
next_token( STATE_EXETYPE, NULL, &foundNewLine, FALSE, FALSE );
}
state = STATE_CLEAR;
break;
case STATE_DATA:
/*** ignore this token and the rest of the line ***/
UnsupportedOptsMessage( "DATA" );
next_token( STATE_DATA, NULL, &foundNewLine, FALSE, FALSE );
while( !foundNewLine ) {
next_token( STATE_DATA, NULL, &foundNewLine, FALSE, FALSE );
}
state = STATE_CLEAR;
break;
case STATE_EOF:
alive = FALSE;
break;
default:
SET_ERROR;
}
/*** Merge stuff together if necessary ***/
if( (mergeNow==TRUE) || (state==STATE_CLEAR || state==STATE_EOF) ) {
switch( mergeType ) {
case STATE_EXPORTS:
len = strlen( exportsEntryName );
if( exportsGotOrdinal ) {
len++; /* for '.' */
len += strlen( exportsOrdinal );
if( exportsGotResident ) {
len += 9; /* for ' RESIDENT' */
}
}
if( exportsGotInternalName ) {
len++; /* for '=' */
len += strlen( exportsInternalName );
}
if( exportsGotPrivate ) {
len += 8; /* for ' PRIVATE' */
}
len++; /* for null byte */
str = AllocMem( len );
strcpy( str, exportsEntryName );
if( exportsGotOrdinal ) {
strcat( str, "." );
strcat( str, exportsOrdinal );
}
if( exportsGotInternalName ) {
strcat( str, "=" );
strcat( str, exportsInternalName );
}
if( exportsGotPrivate ) {
strcat( str, " PRIVATE" );
}
if( exportsGotResident && exportsGotOrdinal ) {
strcat( str, " RESIDENT" );
}
add_string( &info->exports, str );
FreeMem( str );
FreeMem( exportsEntryName );
if( exportsGotOrdinal ) {
FreeMem( exportsOrdinal );
}
if( exportsGotInternalName ) {
FreeMem( exportsInternalName );
}
break;
case STATE_STACKSIZE:
state = STATE_CLEAR;
len = strlen( stackReserve );
if( stackGotCommit ) {
len++; /* for ',' */
len += strlen( stackCommit );
}
len++; /* for null byte */
str = AllocMem( len );
strcpy( str, stackReserve );
if( stackGotCommit ) {
strcat( str, "," );
strcat( str, stackCommit );
}
info->stacksize = DupStrMem( str );
FreeMem( stackReserve );
if( stackGotCommit ) {
FreeMem( stackCommit );
}
break;
case STATE_HEAPSIZE:
state = STATE_CLEAR;
len = strlen( heapReserve );
if( heapGotCommit ) {
len++; /* for ',' */
len += strlen( heapCommit );
}
len++; /* for null byte */
str = AllocMem( len );
strcpy( str, heapReserve );
if( heapGotCommit ) {
strcat( str, "," );
strcat( str, heapCommit );
}
info->heapsize = DupStrMem( str );
FreeMem( heapReserve );
if( heapGotCommit ) {
FreeMem( heapCommit );
}
break;
case STATE_VERSION:
state = STATE_CLEAR;
len = strlen( versionMajor );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?