libextractor

GNU libextractor
Log | Files | Refs | Submodules | README | LICENSE

le_architecture.h (3377B)


      1 /*
      2      This file is part of libextractor.
      3      Copyright (C) 2002, 2003, 2004, 2009, 2012 Vidyut Samanta and Christian Grothoff
      4 
      5      libextractor is free software; you can redistribute it and/or modify
      6      it under the terms of the GNU General Public License as published
      7      by the Free Software Foundation; either version 3, or (at your
      8      option) any later version.
      9 
     10      libextractor is distributed in the hope that it will be useful, but
     11      WITHOUT ANY WARRANTY; without even the implied warranty of
     12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13      General Public License for more details.
     14 
     15      You should have received a copy of the GNU General Public License
     16      along with libextractor; see the file COPYING.  If not, write to the
     17      Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     18      Boston, MA 02110-1301, USA.
     19  */
     20 /**
     21  * @file common/le_architecture.h
     22  * @brief support routines and defines to deal with architecture-specific issues
     23  */
     24 #ifndef LE_ARCHITECTURE_H
     25 #define LE_ARCHITECTURE_H
     26 
     27 #if WINDOWS
     28 #include <sys/param.h>          /* #define BYTE_ORDER */
     29 #endif
     30 
     31 /* This is copied directly from GNUnet headers */
     32 
     33 #ifndef __BYTE_ORDER
     34 #ifdef _BYTE_ORDER
     35 #define __BYTE_ORDER _BYTE_ORDER
     36 #else
     37 #ifdef BYTE_ORDER
     38 #define __BYTE_ORDER BYTE_ORDER
     39 #endif
     40 #endif
     41 #endif
     42 #ifndef __BIG_ENDIAN
     43 #ifdef _BIG_ENDIAN
     44 #define __BIG_ENDIAN _BIG_ENDIAN
     45 #else
     46 #ifdef BIG_ENDIAN
     47 #define __BIG_ENDIAN BIG_ENDIAN
     48 #endif
     49 #endif
     50 #endif
     51 #ifndef __LITTLE_ENDIAN
     52 #ifdef _LITTLE_ENDIAN
     53 #define __LITTLE_ENDIAN _LITTLE_ENDIAN
     54 #else
     55 #ifdef LITTLE_ENDIAN
     56 #define __LITTLE_ENDIAN LITTLE_ENDIAN
     57 #endif
     58 #endif
     59 #endif
     60 
     61 /**
     62  * Endian operations
     63  */
     64 
     65 #if __BYTE_ORDER == __LITTLE_ENDIAN
     66 #define LE_htobe16(x) __bswap_16 (x)
     67 #define LE_htole16(x) (x)
     68 #define LE_be16toh(x) __bswap_16 (x)
     69 #define LE_le16toh(x) (x)
     70 
     71 #define LE_htobe32(x) __bswap_32 (x)
     72 #define LE_htole32(x) (x)
     73 #define LE_be32toh(x) __bswap_32 (x)
     74 #define LE_le32toh(x) (x)
     75 
     76 #define LE_htobe64(x) __bswap_64 (x)
     77 #define LE_htole64(x) (x)
     78 #define LE_be64toh(x) __bswap_64 (x)
     79 #define LE_le64toh(x) (x)
     80 #endif
     81 #if __BYTE_ORDER == __BIG_ENDIAN
     82 #define LE_htobe16(x) (x)
     83 #define LE_htole16(x) __bswap_16 (x)
     84 #define LE_be16toh(x) (x)
     85 #define LE_le16toh(x) __bswap_16 (x)
     86 
     87 #define LE_htobe32(x) (x)
     88 #define LE_htole32(x) __bswap_32 (x)
     89 #define LE_be32toh(x) (x)
     90 #define LE_le32toh(x) __bswap_32 (x)
     91 
     92 #define LE_htobe64(x) (x)
     93 #define LE_htole64(x) __bswap_64 (x)
     94 #define LE_be64toh(x) (x)
     95 #define LE_le64toh(x) __bswap_64 (x)
     96 #endif
     97 
     98 
     99 /**
    100  * gcc-ism to get packed structs.
    101  */
    102 #define LE_PACKED __attribute__((packed))
    103 
    104 
    105 #if MINGW
    106 #if __GNUC__ > 3
    107 /**
    108  * gcc 4.x-ism to pack structures even on W32 (to be used before structs)
    109  */
    110 #define LE_NETWORK_STRUCT_BEGIN \
    111   _Pragma ("pack(push)") \
    112   _Pragma ("pack(1)")
    113 
    114 /**
    115  * gcc 4.x-ism to pack structures even on W32 (to be used after structs)
    116  */
    117 #define LE_NETWORK_STRUCT_END _Pragma ("pack(pop)")
    118 #else
    119 #error gcc 4.x or higher required on W32 systems
    120 #endif
    121 #else
    122 /**
    123  * Good luck, LE_PACKED should suffice, but this won't work on W32
    124  */
    125 #define LE_NETWORK_STRUCT_BEGIN
    126 
    127 /**
    128  * Good luck, LE_PACKED should suffice, but this won't work on W32
    129  */
    130 #define LE_NETWORK_STRUCT_END
    131 #endif
    132 
    133 
    134 #endif