Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /****************************  library.h   ********************************
  2. * Author:        Agner Fog
  3. * Date created:  2006-07-15
  4. * Last modified: 2013-08-22
  5. * Project:       objconv
  6. * Module:        library.h
  7. * Description:
  8. * Header file defining classes for reading and writing UNIX and OMF style
  9. * libraries.
  10. *
  11. * Copyright 2007-2013 GNU General Public License http://www.gnu.org/licenses
  12. *****************************************************************************/
  13.  
  14. #ifndef LIBRARY_H
  15. #define LIBRARY_H
  16.  
  17.  
  18. // Make big-endian numbers for library
  19. uint32 EndianChange(uint32);           // Convert little-endian to big-endian number, or vice versa
  20.  
  21.  
  22. // Define UNIX library member header
  23. struct SUNIXLibraryHeader {
  24.     char Name[16];                      // Member name
  25.     char Date[12];                      // Member date, seconds, decimal ASCII
  26.     char UserID[6];                     // Member User ID, decimal ASCII
  27.     char GroupID[6];                    // Member Group ID, decimal ASCII
  28.     char FileMode[8];                   // Member file mode, octal
  29.     char FileSize[10];                  // Member file size, decimal ASCII
  30.     char HeaderEnd[2];                  // "`\n"
  31. };
  32.  
  33.  
  34. // Class for extracting members from library or building a library
  35. class CLibrary : public CFileBuffer {
  36. public:
  37.     CLibrary();                         // Constructor
  38.     void Go();                          // Do whatever the command line says
  39.     void Dump();                        // Print contents of library
  40.     //static char *TruncateMemberName(char const*);// Remove path and truncate object file name to 15 characters
  41.     static char * ShortenMemberName(char const *name); // Truncate library member name to 15 characters and make unique. The original long name is not overwritten
  42.     static char * StripMemberName(char *);         // Remove path from library member name. Original long name is overwritten
  43.     const char  * GetModuleName(uint32 Index);     // Get name of module from index or page index
  44. protected:
  45.     // Properties for UNIX input libraries only
  46.     uint32 LongNames;                   // Offset to long names member
  47.     uint32 LongNamesSize;               // Size of long names member
  48.     uint32 AlignBy;                     // Member alignment
  49.  
  50.     // Properties for OMF input libraries only
  51.     uint32 PageSize;                    // Alignment of members
  52.     uint32 DictionaryOffset;            // Offset to hash table
  53.     uint32 DictionarySize;              // Dictionary size, in 512 bytes blocks
  54.  
  55.     // Methods and properties for reading library:
  56.     void DumpUNIX();                    // Print contents of UNIX style library
  57.     void DumpOMF();                     // Print contents of OMF style library
  58.     void CheckOMFHash(CMemoryBuffer &stringbuf, CSList<SStringEntry> &index);// Check if OMF library hash table has correct entries for all symbol names
  59.     void StartExtracting();             // Initialize before ExtractMember()
  60.     char * ExtractMember(CFileBuffer*); // Extract next library member from input library
  61.     char * ExtractMemberUNIX(CFileBuffer*); // Extract member of UNIX style library
  62.     char * ExtractMemberOMF(CFileBuffer*);  // Extract member of OMF style library
  63.     uint32 NextHeader(uint32 Offset);   // Loop through library headers
  64.     CConverter MemberBuffer;            // Buffer containing single library member
  65.     uint32 CurrentOffset;               // Offset to current member
  66.     uint32 CurrentNumber;               // Number of current member
  67.     int  MemberFileType;                // File type of members
  68.     // Methods and properties for modifying or writing library
  69.     void FixNames();                    // Calls StripMemberNamesUNIX or RebuildOMF
  70.     void StripMemberNamesUNIX();        // Remove path from member names
  71.     void RebuildOMF();                  // Rebuild OMF style library to make member names short
  72.     void InsertMember(CFileBuffer*);    // Add next library member to output library
  73.     void InsertMemberUNIX(CFileBuffer*);// Add member to UNIX library
  74.     void InsertMemberOMF(CFileBuffer*); // Add member to OMF library
  75.     void MakeBinaryFile();              // Combine string index and members into binary file
  76.     void MakeBinaryFileUNIX();          // Make UNIX library
  77.     void MakeBinaryFileOMF();           // Make OMF library
  78.     void SortStringTable();             // Sort the string table
  79.     void MakeSymbolTableUnix();         // Make symbol table for COFF, ELF or MACHO library
  80.     CFileBuffer OutFile;                // Buffer for building output file
  81.     CSList<SStringEntry> StringEntries; // String table using SStringEntry
  82.     CMemoryBuffer LongNamesBuffer;      // Buffer for building the "//" longnames member
  83.     CMemoryBuffer StringBuffer;         // Buffer containing strings
  84.     CMemoryBuffer DataBuffer;           // Buffer containing raw members
  85.     CSList<uint32> Indexes;             // Buffer containing indexes into DataBuffer
  86.     int RepressWarnings;                // Repress warnings when rebuilding library
  87. };
  88.  
  89.  
  90. // Definitions for OMF library hash table:
  91.  
  92. #define OMFNumBuckets   37             // Number of buckets per block
  93.  
  94. #define OMFBlockSize    512            // Size of each block
  95.  
  96. // Structure of hash table block
  97. union SOMFHashBlock {
  98.     struct {
  99.         uint8 Buckets[OMFNumBuckets];    // Indicators for each bucket
  100.         uint8 FreeSpace;                 // Pointer to free space
  101.         uint8 Data[OMFBlockSize-OMFNumBuckets-1]; // Contains strings and module indices
  102.     } b;
  103.     uint8 Strings[OMFBlockSize];        // Start of each string = length
  104. };
  105.  
  106.  
  107. // Hash table handler
  108. class COMFHashTable {
  109. public:
  110.     void Init(SOMFHashBlock * blocks, uint32 NumBlocks); // Initialize
  111.     void MakeHash(int8 * name);         // Compute hash
  112.     int  FindString(uint32 & ModulePage, uint32 & Conflicts); // Search for string. Get number of occurrences, module, number of conflicting strings
  113.     int  InsertString(uint16 & ModulePage); // Insert string in hash table. Return 0 if success
  114.     void MakeHashTable(CSList<SStringEntry> & StringEntries, CMemoryBuffer & StringBuffer, CMemoryBuffer & HashTable, CLibrary * Library); // Make hash table
  115. protected:
  116.     uint8 * String;                     // String to search for or insert
  117.     uint32 StringLength;                // Length of string
  118.     SOMFHashBlock * blocks;             // Pointer to blocks
  119.     uint32 NumBlocks;                   // Number of blocks
  120.     uint16 StartBlock;                  // Start block for search
  121.     uint16 StartBucket;                 // Start bucket for search
  122.     uint16 BlockD;                      // Block step size in search
  123.     uint16 BucketD;                     // Bucket step size in search
  124. };
  125.  
  126. #endif // #ifndef LIBRARY_H
  127.