static uint_16 getU16( uint_16 *src ) { if( byte_swap ) { #ifdef __BIG_ENDIAN__ return( GET_LE_16( *src ) ); #else return( GET_BE_16( *src ) ); #endif } else { return( *src ); } }
void OMFLibWalk( libfile io, char *name, void (*rtn)( arch_header *arch, libfile io ) ) /*************************************************************************************/ { long pagelen; long offset; arch_header arch; char buff[ MAX_IMPORT_STRING ]; int len; unsigned_16 rec_len; unsigned_8 type; if( LibRead( io, &type, 1 ) != 1 ) return; // nyi - FALSE? if( LibRead( io, &rec_len, 2 ) != 2 ) return; offset = GET_LE_16( rec_len ); pagelen = offset + 3; if( Options.page_size == 0 ) { Options.page_size = pagelen; } LibSeek( io, offset, SEEK_CUR ); NewArchHeader( &arch, name ); offset = LibTell( io ); while( LibRead( io, &type, 1 ) == 1 && ( type == CMD_THEADR ) ) { LibSeek( io, 2, SEEK_CUR ); if( LibRead( io, &type, 1 ) != 1 ) break; len = type; if( LibRead( io, buff, len ) != len ) break; buff[ len ] = '\0'; arch.name = buff; LibSeek( io, offset, SEEK_SET ); rtn( &arch, io ); offset = LibTell( io ); offset = ( offset + pagelen - 1 ) & ~( pagelen - 1 ); LibSeek( io, offset, SEEK_SET ); } }