Thu Mar 28 15:20:39 CET 2002 Paolo Molaro <lupus@ximian.com>
[mono.git] / mono / metadata / mono-endian.h
1 #ifndef _MONO_METADATA_ENDIAN_H_
2 #define _MONO_METADATA_ENDIAN_H_ 1
3
4 #include <glib.h>
5
6 typedef union {
7         guint32 ival;
8         float fval;
9 } mono_rfloat;
10
11 typedef union {
12         guint64 ival;
13         double fval;
14 } mono_rdouble;
15
16 #if NO_UNALIGNED_ACCESS
17
18 guint16 mono_read16 (const unsigned char *x);
19 guint32 mono_read32 (const unsigned char *x);
20 guint64 mono_read64 (const unsigned char *x);
21
22 #define read16(x) (mono_read16 ((x)))
23 #define read32(x) (mono_read32 ((x)))
24 #define read64(x) (mono_read64 ((x)))
25
26 #else
27
28 #define read16(x) GUINT16_FROM_LE (*((const guint16 *) (x)))
29 #define read32(x) GUINT32_FROM_LE (*((const guint32 *) (x)))
30 #define read64(x) GUINT64_FROM_LE (*((const guint64 *) (x)))
31
32 #endif
33
34 #define readr4(x,dest)  \
35         do {    \
36                 mono_rfloat mf; \
37                 mf.ival = read32 ((x)); \
38                 *(dest) = mf.fval;      \
39         } while (0)
40
41 #define readr8(x,dest)  \
42         do {    \
43                 mono_rdouble mf;        \
44                 mf.ival = read64 ((x)); \
45                 *(dest) = mf.fval;      \
46         } while (0)
47
48 #endif /* _MONO_METADATA_ENDIAN_H_ */