Subversion Repositories Kolibri OS

Rev

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

  1. /****************************  maindef.h   **********************************
  2. * Author:        Agner Fog
  3. * Date created:  2006-08-26
  4. * Last modified: 2018-10-08
  5. * Project:       objconv
  6. * Module:        maindef.h
  7. * Description:
  8. * Header file for type definitions and other main definitions.
  9. *
  10. * Copyright 2006-2018 GNU General Public License http://www.gnu.org/licenses
  11. *****************************************************************************/
  12. #ifndef MAINDEF_H
  13. #define MAINDEF_H
  14.  
  15. // Program version
  16. #define OBJCONV_VERSION         2.52
  17.  
  18.  
  19. // Integer type definitions with platform-independent sizes:
  20. #include <limits.h>
  21. #if defined(_I64_MAX)
  22. // Microsoft compilers use __int64 etc
  23. typedef char               int8;       // 8 bit  signed integer
  24. typedef unsigned char      uint8;      // 8 bit  unsigned integer
  25. typedef short int          int16;      // 16 bit signed integer
  26. typedef unsigned short int uint16;     // 16 bit unsigned integer
  27. typedef int                int32;      // 32 bit signed integer
  28. typedef unsigned int       uint32;     // 32 bit unsigned integer
  29. typedef __int64            int64;      // 64 bit signed integer
  30. typedef unsigned __int64   uint64;     // 64 bit unsigned integer
  31.  
  32. #elif defined(INT_MAX) && defined(LLONG_MAX) && INT_MAX==2147483647L && LLONG_MAX==9223372036854775807LL
  33. // Compiler has int = 32 bit and long long = 64 bit
  34. typedef char               int8;       // 8 bit  signed integer
  35. typedef unsigned char      uint8;      // 8 bit  unsigned integer
  36. typedef short int          int16;      // 16 bit signed integer
  37. typedef unsigned short int uint16;     // 16 bit unsigned integer
  38. typedef int                int32;      // 32 bit signed integer
  39. typedef unsigned int       uint32;     // 32 bit unsigned integer
  40. typedef long long          int64;      // 64 bit signed integer
  41. typedef unsigned long long uint64;     // 64 bit unsigned integer
  42.  
  43. #else
  44.   // Compilers supporting C99 or C++0x or C++1x have inttypes.h defining these integer types
  45.   // This is the preferred solution:
  46.   #include <inttypes.h>
  47.   //typedef int8_t         int8;       // Gnu compiler can't convert int8_t to char
  48.   typedef char             int8;       // 8 bit  signed integer
  49.   typedef uint8_t          uint8;      // 8 bit  unsigned integer
  50.   typedef int16_t          int16;      // 16 bit signed integer
  51.   typedef uint16_t         uint16;     // 16 bit unsigned integer
  52.   typedef int32_t          int32;      // 32 bit signed integer
  53.   typedef uint32_t         uint32;     // 32 bit unsigned integer
  54.   typedef int64_t          int64;      // 64 bit signed integer
  55.   typedef uint64_t         uint64;     // 64 bit unsigned integer
  56. #endif
  57.  
  58.  
  59. // Get high part of a 64-bit integer
  60. static inline uint32 HighDWord (uint64 x) {
  61.    return (uint32)(x >> 32);
  62. }
  63.  
  64. // Check if compiling for big-endian machine
  65. // (__BIG_ENDIAN__ may not be defined even on big endian systems, so this check is not
  66. // sufficient. A further check is done in CheckEndianness() in main.cpp)
  67. #if defined(__BIG_ENDIAN__) && (__BIG_ENDIAN__ != 4321)
  68.    #error This machine has big-endian memory organization. Objconv program will not work
  69. #endif
  70.  
  71. // Max file name length
  72. #define MAXFILENAMELENGTH        256
  73.  
  74.  
  75. // File types
  76. #define FILETYPE_COFF              1         // Windows COFF/PE file
  77. #define FILETYPE_OMF               2         // Windows OMF file
  78. #define FILETYPE_ELF               3         // Linux or BSD ELF file
  79. #define FILETYPE_MACHO_LE          4         // Mach-O file, little endian
  80. #define FILETYPE_MACHO_BE          5         // Mach-O file, big endian
  81. #define FILETYPE_DOS               6         // DOS file
  82. #define FILETYPE_WIN3X             7         // Windows 3.x file
  83. #define IMPORT_LIBRARY_MEMBER   0x10         // Member of import library, Windows
  84. #define FILETYPE_MAC_UNIVBIN    0x11         // Macintosh universal binary
  85. #define FILETYPE_MS_WPO         0x20         // Object file for whole program optimization, MS
  86. #define FILETYPE_INTEL_WPO      0x21         // Object file for whole program optimization, Intel
  87. #define FILETYPE_WIN_UNKNOWN    0x29         // Unknown subtype, Windows
  88. #define FILETYPE_ASM           0x100         // Disassembly output
  89. #define FILETYPE_LIBRARY      0x1000         // UNIX-style library/archive
  90. #define FILETYPE_OMFLIBRARY   0x2000         // OMF-style  library
  91.  
  92. // Library subtypes
  93. #define LIBTYPE_OMF             0x01         // OMF library
  94. #define LIBTYPE_SHORTNAMES      0x10         // Short member names only, compatible with all systems
  95. #define LIBTYPE_WINDOWS         0x11         // Long member names in "//" member, terminated by 0
  96. #define LIBTYPE_LINUX           0x12         // Long member names in "//" member, terminated by '/'+LF
  97. #define LIBTYPE_BSD_MAC         0x13         // Long member name after header. Length indicated by #1/<length>
  98.  
  99. // Define constants for symbol scope
  100. #define S_LOCAL     0                        // Local symbol. Accessed only internally
  101. #define S_PUBLIC    1                        // Public symbol. Visible from other modules
  102. #define S_EXTERNAL  2                        // External symbol. Defined in another module
  103.  
  104.  
  105. // Macro to calculate the size of an array
  106. #define TableSize(x) ((int)(sizeof(x)/sizeof(x[0])))
  107.  
  108.  
  109. // Structures and functions used for lookup tables:
  110.  
  111. // Structure of integers and char *, used for tables of text strings
  112. struct SIntTxt {
  113.    uint32 a;
  114.    const char * b;
  115. };
  116.  
  117. // Translate integer value to text string by looking up in table of SIntTxt.
  118. // Parameters: p = table, n = length of table, x = value to find in table
  119. static inline char const * LookupText(SIntTxt const * p, int n, uint32 x) {
  120.    for (int i=0; i<n; i++, p++) {
  121.       if (p->a == x) return p->b;
  122.    }
  123.    // Not found
  124.    static char utext[32];
  125.    sprintf(utext, "unknown(0x%X)", x);
  126.    return utext;
  127. }
  128.  
  129. // Macro to get length of text list and call LookupText
  130. #define Lookup(list,x)  LookupText(list, sizeof(list)/sizeof(list[0]), x)
  131.  
  132.  
  133. // Function to convert powers of 2 to index
  134. int FloorLog2(uint32 x);
  135.  
  136. // Convert 32 bit time stamp to string
  137. const char * timestring(uint32 t);
  138.  
  139. #endif // #ifndef MAINDEF_H
  140.