objchg.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 612 行 · 第 1/2 页
C
612 行
static int ChangePUBDEF( byte rec_type, FILE *fo, unsigned_16 newlen )
/********************************************************************/
{
byte hdr[ 3 ];
char *data;
char *p;
char *tmp;
int idx1;
int idx2;
long lng1;
byte cksum;
hdr[ 0 ] = rec_type;
hdr[ 1 ] = newlen;
hdr[ 2 ] = newlen >> 8;
if( fwrite( hdr, 1, 3, fo ) != 3 )
return( 0 );
cksum = hdr[ 0 ];
cksum += hdr[ 1 ];
cksum += hdr[ 2 ];
data = malloc( newlen );
p = data;
idx1 = GetIndex();
p = PutIndex( p, idx1 );
idx2 = GetIndex();
p = PutIndex( p, idx2 );
if( ( idx1 | idx2 ) == 0 )
p = PutUInt( p, GetUInt() );
while( ! EndRec() ) {
GetName();
tmp = RecPtr;
lng1 = GetOffset();
*tmp = 0;
if( SymbolExists( pubdef_tab, NamePtr ) != NULL ) {
p = change_name( p, NamePtr );
} else {
*(p++) = NameLen;
memcpy( p, NamePtr, NameLen );
p += NameLen;
}
p = PutOffset( p, lng1 );
p = PutIndex( p, GetIndex() );
}
*(p++) = 0 - create_chksum( data, newlen, cksum );
if( fwrite( data, 1, newlen, fo ) != newlen ) {
free( data );
return( 0 );
}
free( data );
return( 1 );
}
static int ProcFile( FILE *fp, FILE *fo )
/**************************************/
{
byte hdr[ 3 ];
unsigned_16 page_len;
unsigned_32 offset;
fpos_t pos;
int isChanged;
int renameIt;
unsigned_16 newlen;
int symbol_name_change_len;
if( symbol_name_change == NULL ) {
symbol_name_change_len = 0;
} else {
symbol_name_change_len = strlen( symbol_name_change ) - 1;
}
renameIt = 1;
page_len = 0;
RecBuff = NULL;
RecMaxLen = 0;
for( ; renameIt; ) {
isChanged = 0;
fgetpos( fp, &pos );
offset = ftell( fp );
if( fread( hdr, 1, 3, fp ) != 3 ) {
if( ferror( fp ) )
renameIt = 0;
break;
}
RecLen = hdr[ 1 ] | ( hdr[ 2 ] << 8 );
ResizeBuff( RecLen );
RecPtr = RecBuff;
if( fread( RecBuff, RecLen, 1, fp ) == 0 ) {
renameIt = 0;
break;
}
newlen = RecLen;
RecLen--;
isMS386 = hdr[ 0 ] & 1;
switch( hdr[ 0 ] & ~1 ) {
case CMD_LNAMES:
while( ! EndRec() ) {
char *n;
byte b;
GetName();
b = *RecPtr;
*RecPtr = 0;
n = SymbolExists( extdef_tab, NamePtr );
if( n != NULL ) {
newlen += strlen( n ) - NameLen;
isChanged = 1;
}
*RecPtr = b;
}
fsetpos( fp, &pos );
fread( hdr, 1, 3, fp );
fread( RecBuff, RecLen + 1, 1, fp );
RecPtr = RecBuff;
break;
case CMD_EXTDEF:
while( ! EndRec() ) {
GetName();
*RecPtr = 0;
if( SymbolExists( pubdef_tab, NamePtr ) != NULL ) {
newlen += symbol_name_change_len;
isChanged = 1;
}
GetIndex();
}
fsetpos( fp, &pos );
fread( hdr, 1, 3, fp );
fread( RecBuff, RecLen + 1, 1, fp );
RecPtr = RecBuff;
break;
case CMD_PUBDEF:
if( ( GetIndex() | GetIndex() ) == 0 )
GetUInt();
while( ! EndRec() ) {
GetName();
*RecPtr = 0;
if( SymbolExists( pubdef_tab, NamePtr ) != NULL ) {
newlen += symbol_name_change_len;
isChanged = 1;
}
GetOffset();
GetIndex();
}
fsetpos( fp, &pos );
fread( hdr, 1, 3, fp );
fread( RecBuff, RecLen + 1, 1, fp );
RecPtr = RecBuff;
break;
case LIB_HEADER_REC:
free( RecBuff );
fclose( fo );
fclose( fp );
return( 0 );
default:
break;
}
if( isChanged ) {
switch( hdr[ 0 ] & ~1 ) {
case CMD_LNAMES:
if( ! ChangeLNAMES( hdr[ 0 ], fo, newlen ) )
renameIt = 0;
break;
case CMD_EXTDEF:
if( ! ChangeEXTDEF( hdr[ 0 ], fo, newlen ) )
renameIt = 0;
break;
case CMD_PUBDEF:
if( ! ChangePUBDEF( hdr[ 0 ], fo, newlen ) )
renameIt = 0;
break;
default:
break;
}
} else {
if( fwrite( hdr, 1, 3, fo ) != 3 ) {
renameIt = 0;
}
if( fwrite( RecBuff, 1, RecLen + 1, fo ) != RecLen + 1 ) {
renameIt = 0;
}
}
}
free( RecBuff );
fclose( fo );
fclose( fp );
return( renameIt );
}
static int process_symbol_file( char *filename )
/**********************************************/
{
FILE *fp;
char line[ MAX_LINE_LEN ];
char *p;
if( filename != NULL ) {
fp = fopen( filename, "rt" );
while( fgets( line, MAX_LINE_LEN , fp ) != NULL ) {
p = line + strlen( line );
while( p >= line ) {
if( ( *p == '\0' )
|| ( *p == ' ' )
|| ( *p == '\n' ) ) {
*p = '\0';
p--;
} else {
break;
}
}
AddSymbol( pubdef_tab, line, NULL );
}
fclose( fp );
}
return( 0 );
}
static int process_lnames( char *cmd )
/************************************/
{
char *p1;
char *p2;
p1 = strtok( cmd, "=" );
p2 = strtok( NULL, "" );
AddSymbol( extdef_tab, p1, p2 );
return( 0 );
}
static int process_module( char *filename )
/*****************************************/
{
FILE *fp;
FILE *fo;
int isChanged;
fp = fopen( filename, "rb" );
if( fp == NULL ) {
printf( "Cannot open input file: %s.\n", filename );
return( -1 );
}
fo = fopen( "tmp.tmp", "wb" );
if( fo == NULL ) {
printf( "Cannot open input file: tmp.tmp.\n" );
fclose( fp );
return( -1 );
}
isChanged = ProcFile( fp, fo );
if( isChanged ) {
remove( filename );
rename( "tmp.tmp", filename );
}
return( 0 );
}
int main( int argc, char *argv[] )
/********************************/
{
int i;
char *fn;
extdef_tab = SymbolInit();
pubdef_tab = SymbolInit();
for( i = 1; i < argc; ++i ) {
if( argv[i][0] == '-' ) {
switch( tolower( argv[i][1] ) ) {
case 'l':
if( argv[i][2] == '=' ) {
process_lnames( argv[i] + 3 );
} else {
usage();
}
break;
case 's':
if( argv[i][2] == '=' ) {
process_symbol_file( argv[i] + 3 );
} else {
usage();
}
break;
case 'm':
if( argv[i][2] == '=' ) {
symbol_name_change = argv[i] + 3;
} else {
usage();
}
break;
default:
usage();
}
} else {
break;
}
}
if( i == argc )
usage();
for( ; i < argc; ++i ) {
fn = DoWildCard( argv[i] );
while( fn != NULL ) {
process_module( fn );
fn = DoWildCard( NULL );
}
DoWildCardClose();
}
SymbolFini( pubdef_tab );
SymbolFini( extdef_tab );
return( 0 );
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?