1 # ifndef UTIL_ENDIAN_H 2 # define UTIL_ENDIAN_H 3 4 # include <stdio.h> 5 6 /************************************************************************/ 7 /* */ 8 /* Pieces of 'endian' subroutines that are used internally in the code */ 9 /* */ 10 /* b0 is the most significant byte, b1/b3 the least significant. */ 11 /* */ 12 /************************************************************************/ 13 14 # define NEGBYTES32(b3,b2,b1,b0,l) \ 15 l= -( l+ 1 ); \ 16 b3= 255- ( l % 256 ); l /= 256; \ 17 b2= 255- ( l % 256 ); l /= 256; \ 18 b1= 255- ( l % 256 ); l /= 256; \ 19 b0= 255- ( l ); 20 21 # define POSBYTES32(b3,b2,b1,b0,l) \ 22 b3= l % 256; l /= 256; \ 23 b2= l % 256; l /= 256; \ 24 b1= l % 256; l /= 256; \ 25 b0= l; 26 27 # define NEGBYTES16(b1,b0,l) \ 28 l= -( l+ 1 ); \ 29 b1= 255- ( l % 256 ); l /= 256; \ 30 b0= 255- ( l ); 31 32 # define POSBYTES16(b1,b0,l) \ 33 b1= l % 256; l /= 256; \ 34 b0= l; 35 36 # define NEGVALUE32(b0,b1,b2,b3,l,t) \ 37 l = ( (t)b0- 255 )* 256* 256* 256; \ 38 l += ( (t)b1- 255 )* 256* 256; \ 39 l += ( (t)b2- 255 )* 256; \ 40 l += ( (t)b3- 255 ); \ 41 l--; 42 43 # define POSVALUE32(b0,b1,b2,b3,l,t) \ 44 l = ( (t)b0 )* 256* 256* 256; \ 45 l += ( (t)b1 )* 256* 256; \ 46 l += ( (t)b2 )* 256; \ 47 l += ( (t)b3 ); 48 49 # define NEGVALUE16(b0,b1,l,t) \ 50 l = ( (t)b0- 255 )* 256; \ 51 l += ( (t)b1- 255 ); \ 52 l--; 53 54 # define POSVALUE16(b0,b1,l,t) \ 55 l = ( (t)b0 )* 256; \ 56 l += ( (t)b1 ); 57 58 /************************************************************************/ 59 /* */ 60 /* Routine declarations. */ 61 /* */ 62 /************************************************************************/ 63 64 extern int utilGetLeInt16(FILE *); 65 extern long utilGetLeInt32(FILE *); 66 extern unsigned int utilGetLeUint16(FILE *); 67 extern unsigned long utilGetLeUint32(FILE *); 68 extern double utilGetLeDouble64(FILE *); 69 extern float utilGetLeFloat32(FILE *); 70 71 extern int utilGetBeInt16(FILE *); 72 extern long utilGetBeInt32(FILE *); 73 extern unsigned int utilGetBeUint16(FILE *); 74 extern unsigned long utilGetBeUint32(FILE *); 75 extern double utilGetBeDouble64(FILE *); 76 extern float utilGetBeFloat32(FILE *); 77 78 extern void utilPutLeInt16(int, FILE *); 79 extern void utilPutLeInt32(long, FILE *); 80 extern void utilPutLeUint16(unsigned int, FILE *); 81 extern void utilPutLeUint32(unsigned long, FILE *); 82 83 extern void utilPutBeInt16(int, FILE *); 84 extern void utilPutBeInt32(long, FILE *); 85 extern void utilPutBeUint16(unsigned int, FILE *); 86 extern void utilPutBeUint32(unsigned long, FILE *); 87 88 long utilEndianExtractLeInt32( const unsigned char * s ); 89 int utilEndianExtractLeInt16( const unsigned char * s ); 90 long utilEndianExtractBeInt32( const unsigned char * s ); 91 int utilEndianExtractBeInt16( const unsigned char * s ); 92 93 unsigned long utilEndianExtractLeUint32( const unsigned char * s ); 94 unsigned int utilEndianExtractLeUint16( const unsigned char * s ); 95 unsigned long utilEndianExtractBeUint32( const unsigned char * s ); 96 unsigned int utilEndianExtractBeUint16( const unsigned char * s ); 97 98 extern void utilEndianStoreBeInt32( long l, unsigned char * b ); 99 extern void utilEndianStoreLeInt32( long l, unsigned char * b ); 100 extern void utilEndianStoreBeInt16( int i, unsigned char * b ); 101 extern void utilEndianStoreLeInt16( int i, unsigned char * b ); 102 103 extern void utilEndianStoreBeUint32( unsigned long l, unsigned char * b ); 104 extern void utilEndianStoreLeUint32( unsigned long l, unsigned char * b ); 105 extern void utilEndianStoreBeUint16( unsigned int i, unsigned char * b ); 106 extern void utilEndianStoreLeUint16( unsigned int i, unsigned char * b ); 107 108 # endif /* UTIL_ENDIAN_H */ 109