/* ** mwlib.h - POSIX 1003.2 "ar" command ** ** $Id$ ** ** This isn't a pure POSIX 1003.2 ar; it only manipulates Metrowerks ** Library files, not general-purpose POSIX 1003.2 format archives. ** ** Dec. 14, 1997 Chris Herborth (chrish@qnx.com) ** ** This code is donated to the PUBLIC DOMAIN. You can use, abuse, modify, ** redistribute, steal, or otherwise manipulate this code. No restrictions ** at all. If you laugh at this code, you can't use it. ** ** This "ar" was implemented using IEEE Std 1003.2-1992 as the basis for ** the interface, and Metrowerk's published docs detailing their library ** format. Look inside for clues about how reality differs from MW's ** documentation on BeOS... */ #include #include /* ---------------------------------------------------------------------- ** Constants ** */ #define MWLIB_MAGIC_WORD 'MWOB' #define MWLIB_MAGIC_PROC 'PPC ' /* ---------------------------------------------------------------------- ** Structures ** ** This is based on the "Metrowerks CodeWarrior Library Reference ** Specification", which isn't 100% accurate for BeOS. */ typedef struct MWLibHeader { uint32 magicword; uint32 magicproc; uint32 magicflags; uint32 version; uint32 code_size; uint32 data_size; uint32 num_objects; } MWLibHeader; typedef struct MWLibFile { time_t m_time; uint32 off_filename; uint32 off_fullpath; uint32 off_object; uint32 object_size; } MWLibFile; typedef struct MWLib { MWLibHeader header; MWLibFile *files; char **names; char **data; } MWLib; /* This bears no resemblance to what's in the Metrowerks docs. ** ** Note that this is incomplete; this is all the info I needed for ** ar though. */ typedef struct MWObject { uint32 magic_word; /* 'MWOB' */ uint32 arch; /* 'PPC '; this isn't in the docs */ uint32 version; uint32 flags; uint32 code_size; uint32 data_size; } MWObject; /* ---------------------------------------------------------------------- ** Function prototypes ** ** load_MW_lib() - load a Metrowerks library ** ** Returns: ** B_OK - all is well ** B_FILE_NOT_FOUND - can't open the given file ** B_IO_ERROR - can't read from the given file ** B_BAD_VALUE - invalid magic word in the file ** B_MISMATCHED_VALUES - invalid processor value (ie, not a PowerPC lib), ** or the magicflags member is not 0, or the file ** version number isn't 1. ** B_NO_MEMORY - unable to allocate memory while loading the lib ** ** write_MW_lib() - write a Metrowerks library ** ** Returns: ** B_OK - all is well ** ** write_MW_lib() - write a Metrowerks library file ** ** Returns: ** B_OK - all is well; doesn't necessarily mean the file was written ** properly, just that you didn't lose any data ** B_NO_MEMORY - unable to allocate offset buffers ** B_ERROR - problem with backup file (can't rename existing file) ** ** Note: ** If you use this in a long-lived program, it leaks memory; the MWLib ** contents are never free()'d. */ status_t load_MW_lib( MWLib *lib, const char *filename ); status_t write_MW_lib( MWLib *lib, const char *filename ); void setfiletype( const char *filename, const char *type );