00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _ASTERISK_UNALIGNED_H
00024 #define _ASTERISK_UNALIGNED_H
00025
00026 #if defined(__cplusplus) || defined(c_plusplus)
00027 extern "C" {
00028 #endif
00029
00030 #ifdef __GNUC__
00031
00032 static inline unsigned int get_unaligned_uint32(void *p)
00033 {
00034 struct { unsigned int d; } __attribute__((packed)) *pp = (void *)p;
00035
00036 return pp->d;
00037 }
00038 static inline unsigned short get_unaligned_uint16(void *p)
00039 {
00040 struct { unsigned short d; } __attribute__((packed)) *pp = (void *)p;
00041
00042 return pp->d;
00043 }
00044
00045 static inline void put_unaligned_uint32(void *p, unsigned int datum)
00046 {
00047 struct { unsigned int d; } __attribute__((packed)) *pp = (void *)p;
00048
00049 pp->d = datum;
00050 }
00051
00052 static inline void put_unaligned_uint16(void *p, unsigned short datum)
00053 {
00054 struct { unsigned short d; } __attribute__((packed)) *pp = (void *)p;
00055
00056 pp->d = datum;
00057 }
00058 #elif defined(SOLARIS) && defined(__sparc__)
00059 static inline unsigned int get_unaligned_uint32(void *p)
00060 {
00061 unsigned char *cp = p;
00062
00063 return (cp[0] << 24) | (cp[1] << 16) | (cp[2] << 8) | cp[3];
00064 }
00065
00066 static inline unsigned short get_unaligned_uint16(void *p)
00067 {
00068 unsigned char *cp = p;
00069
00070 return (cp[0] << 8) | cp[1] ;
00071 }
00072
00073 static inline void put_unaligned_uint32(void *p, unsigned int datum)
00074 {
00075 unsigned char *cp = p;
00076
00077 cp[0] = datum >> 24;
00078 cp[1] = datum >> 16;
00079 cp[2] = datum >> 8;
00080 cp[3] = datum;
00081 }
00082
00083 static inline void put_unaligned_uint16(void *p, unsigned int datum)
00084 {
00085 unsigned char *cp = p;
00086
00087 cp[0] = datum >> 8;
00088 cp[1] = datum;
00089 }
00090 #else
00091 #define get_unaligned_uint32(p) (*((unsigned int *)(p)))
00092 #define get_unaligned_uint16(p) (*((unsigned short *)(p)))
00093 #define put_unaligned_uint32(p,d) do { unsigned int *__P = (p); *__P = d; } while(0)
00094 #define put_unaligned_uint16(p,d) do { unsigned short *__P = (p); *__P = d; } while(0)
00095 #endif
00096
00097 #if defined(__cplusplus) || defined(c_plusplus)
00098 }
00099 #endif
00100
00101
00102 #endif