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