static void ProcFile( FILE *fp ) /******************************/ { byte hdr[ 3 ]; unsigned_16 page_len; unsigned_32 offset; page_len = 0; RecBuff = NULL; RecMaxLen = 0; for(;;) { offset = ftell( fp ); if( fread( hdr, 1, 3, fp ) != 3 ) break; RecLen = hdr[ 1 ] | ( hdr[ 2 ] << 8 ); ResizeBuff( RecLen ); RecPtr = RecBuff; if( fread( RecBuff, RecLen, 1, fp ) == 0 ) break; RecLen--; isMS386 = hdr[ 0 ] & 1; switch( hdr[ 0 ] & ~1 ) { case CMD_MODEND: if( page_len != 0 ) { offset = ftell( fp ); offset = page_len - offset % page_len; if( offset != page_len ) { fseek( fp, offset, SEEK_CUR ); } } break; case CMD_PUBDEF: if( ( GetIndex() | GetIndex() ) == 0 ) GetUInt(); while( ! EndRec() ) { GetName(); *RecPtr = 0; printf( "%s\n", NamePtr ); GetOffset(); GetIndex(); } break; case LIB_HEADER_REC: if( isMS386 ) { fseek( fp, 0L, SEEK_END ); page_len = 0; } else { page_len = RecLen + 4; } break; default: break; } } free( RecBuff ); }
void ProcFile( FILE *fp, bool is_intel ) /**************************************/ { byte cksum; byte hdr[ 3 ]; unsigned_16 page_len; unsigned_32 offset; const char *recname; unsigned_32 total_padding; int raw_dump; int i; int first; IsPharLap = FALSE; IsMS386 = FALSE; IsIntel = is_intel; RecNum = 0; page_len = 0; RecBuff = NULL; RecMaxLen = 0; total_padding = 0; Lnames = NULL; Xnames = NULL; Segdefs = NULL; Grpdefs = NULL; first = 1; for(;;) { raw_dump = DumpRaw; offset = ftell( fp ); if( fread( hdr, 1, 3, fp ) != 3 ) break; cksum = hdr[ 0 ]; cksum += hdr[ 1 ]; cksum += hdr[ 2 ]; RecLen = hdr[ 1 ] | ( hdr[ 2 ] << 8 ); ResizeBuff( RecLen ); RecPtr = RecBuff; if( fread( RecBuff, RecLen, 1, fp ) == 0 ) { break; } cksum += checkSumBuff(); IsMS386 = hdr[ 0 ] & 1; if( IsMS386 ) { IsIntel = FALSE; } no_disp = ( rec_count == 0 ) ? FALSE : TRUE; for( i = 0; i < rec_count; i++ ) { if( rec_type[ i ] == ( hdr[ 0 ] & ~1 )) { no_disp = FALSE; break; } } recname = RecNumberToName( hdr[ 0 ] ); cksum = -( cksum - RecBuff[ RecLen - 1 ] ); Output( CRLF "%s%s(%2) recnum:%u, offset:%X, len:%x, chksum:%b(%2)" CRLF, recname, IsMS386 ? "386" : "", hdr[ 0 ], ++RecNum, offset, RecLen, RecBuff[ RecLen - 1 ], cksum ); RecLen--; if( setjmp( BailOutJmp ) == 0 ) { switch( hdr[ 0 ] & ~1 ) { case CMD_RHEADR: ProcRHeadr(); break; case CMD_ENDREC: ProcEndRec(); break; case CMD_THEADR: ProcTHeadr( first ); first = 0; break; case CMD_LHEADR: ProcLHeadr(); break; case CMD_COMENT: ProcComent(); break; case CMD_MODEND: ProcModEnd(); if( page_len != 0 ) { offset = ftell( fp ); offset = page_len - offset % page_len; if( offset != page_len ) { total_padding += offset; fseek( fp, offset, SEEK_CUR ); } } first = 1; break; case CMD_STATIC_EXTDEF: /* fall through */ case CMD_EXTDEF: ProcExtNames(); break; case CMD_STATIC_PUBDEF: /* fall through */ case CMD_PUBDEF: ProcPubDefs(); break; case CMD_LOCSYM: ProcLocSyms(); break; case CMD_LINNUM: ProcLinNums(); break; case CMD_LLNAME: /* fall through */ case CMD_LNAMES: ProcLNames( &Nameindex ); break; case CMD_SEGDEF: ProcSegDefs(); break; case CMD_GRPDEF: ProcGrpDef(); break; case CMD_FIXUP: ProcFixup(); break; case CMD_LEDATA: ProcLedata(); break; case CMD_LIDATA: ProcLidata(); break; case CMD_LIBNAM: ProcNames( &Libindex ); break; case CMD_STATIC_COMDEF: /* fall through */ case CMD_COMDEF: ProcComDef(); break; case CMD_BAKPAT: ProcBackPat(); break; case CMD_CEXTDF: ProcComExtDef(); break; case CMD_COMDAT: ProcComDat(); break; case CMD_LINSYM: ProcLineSym(); break; case CMD_ALIAS: ProcAlias(); break; case CMD_NBKPAT: ProcNameBackPat(); break; case CMD_VERNUM: ProcVerNum(); break; case CMD_VENDEXT: ProcVendExt(); break; case LIB_HEADER_REC: if( hdr[ 0 ] & 1 ) { /* LIB_TRAILER_REC */ ProcLibTrailer( fp ); fseek( fp, 0L, SEEK_END ); page_len = 0; } else { page_len = RecLen + 4; ProcLibHeader(); } break; default: if( !raw_dump ) { OutputData( 0L, 0L ); } break; } } else { /* something bailed out... */ if( raw_dump ) { Output( INDENT "Error at offset %x" CRLF, (unsigned_32)(pointer_int)RecOffset ); } else if( !EndRec() ) { Output( INDENT "Remainder of record follows:" CRLF ); OutputData( (unsigned_32)RecOffset(), 0L ); } else { Output( INDENT "End of record" CRLF ); } } if( raw_dump ) { RecPtr = RecBuff; Output( "====================RAW DUMP===============================================" CRLF ); OutputData( 0L, 0L ); Output( "====================RAW DUMP===============================================" CRLF ); } } if( total_padding > 0 ) { Output( CRLF "total padding=%X" CRLF, total_padding ); } if( TranslateIndex) { PrintNames(); } FreeGrpdefs(); FreeSegdefs(); FreeLnames(); FreeXnames(); free( RecBuff ); }
static void ProcFileModRef( FILE *fp ) /************************************/ { byte hdr[ 3 ]; unsigned_16 page_len; unsigned_32 offset; char *module_name; page_len = 0; RecBuff = NULL; RecMaxLen = 0; module_name = NULL; for(;;) { offset = ftell( fp ); if( fread( hdr, 1, 3, fp ) != 3 ) break; RecLen = hdr[ 1 ] | ( hdr[ 2 ] << 8 ); ResizeBuff( RecLen ); RecPtr = RecBuff; if( fread( RecBuff, RecLen, 1, fp ) == 0 ) break; RecLen--; isMS386 = hdr[ 0 ] & 1; switch( hdr[ 0 ] & ~1 ) { case CMD_THEADR: if( module_name != NULL ) free( module_name ); GetName(); *RecPtr = 0; module_name = malloc( strlen( (char *)NamePtr ) + 1 ); strcpy( module_name, (char *)NamePtr ); break; case CMD_MODEND: if( module_name != NULL ) free( module_name ); module_name = NULL; if( page_len != 0 ) { offset = ftell( fp ); offset = page_len - offset % page_len; if( offset != page_len ) { fseek( fp, offset, SEEK_CUR ); } } break; case CMD_PUBDEF: if( ( GetIndex() | GetIndex() ) == 0 ) GetUInt(); while( ! EndRec() ) { GetName(); *RecPtr = 0; if( SymbolExists( pubdef_tab, (char *)NamePtr ) != 0 ) { if( SymbolExists( extdef_tab, module_name ) == 0 ) { AddSymbol( extdef_tab, module_name, NULL ); printf( "%s\n", module_name ); } } GetOffset(); GetIndex(); } break; case LIB_HEADER_REC: if( isMS386 ) { fseek( fp, 0L, SEEK_END ); page_len = 0; } else { page_len = RecLen + 4; } break; default: break; } } free( RecBuff ); }