diff options
Diffstat (limited to 'xrdp/parse.h')
-rw-r--r-- | xrdp/parse.h | 111 |
1 files changed, 102 insertions, 9 deletions
diff --git a/xrdp/parse.h b/xrdp/parse.h index 05d0e4b3..057ef002 100644 --- a/xrdp/parse.h +++ b/xrdp/parse.h @@ -20,7 +20,12 @@ /* modified for xrdp */ /* this is a super fast stream method, you bet */ -/* all little endian for now */ + +#if defined L_ENDIAN +#elif defined B_ENDIAN +#else +#error Unknown endianness. +#endif /* parser state */ struct stream @@ -38,17 +43,22 @@ struct stream char* next_packet; }; +/******************************************************************************/ #define s_check(s) (s->p <= s->end) +/******************************************************************************/ #define s_check_rem(s, n) (s->p + n <= s->end) +/******************************************************************************/ #define s_check_end(s) (s->p == s->end) +/******************************************************************************/ #define make_stream(s) \ { \ s = (struct stream*)g_malloc(sizeof(struct stream), 1); \ } \ +/******************************************************************************/ #define init_stream(s, v) \ { \ if (v > s->size) \ @@ -62,6 +72,7 @@ struct stream s->next_packet = 0; \ } +/******************************************************************************/ #define free_stream(s) \ { \ if (s != 0) \ @@ -69,40 +80,71 @@ struct stream g_free(s); \ } \ +/******************************************************************************/ #define s_push_layer(s, h, n) \ { \ s->h = s->p; \ s->p += n; \ } +/******************************************************************************/ #define s_pop_layer(s, h) \ { \ s->p = s->h; \ } +/******************************************************************************/ #define s_mark_end(s) \ { \ s->end = s->p; \ } +/******************************************************************************/ #define in_uint8(s, v) \ { \ v = *((unsigned char*)(s->p)); \ s->p++; \ } +/******************************************************************************/ +#if defined B_ENDIAN || defined NEED_ALIGN +#define in_sint16_le(s, v) \ +{ \ + v = (signed short) \ + ( \ + (*((unsigned char*)(s->p + 0)) << 0) | \ + (*((unsigned char*)(s->p + 1)) << 8) \ + ); \ + s->p += 2; \ +} +#else #define in_sint16_le(s, v) \ { \ v = *((signed short*)(s->p)); \ s->p += 2; \ } +#endif +/******************************************************************************/ +#if defined B_ENDIAN || defined NEED_ALIGN +#define in_uint16_le(s, v) \ +{ \ + v = (unsigned short) \ + ( \ + (*((unsigned char*)(s->p + 0)) << 0) | \ + (*((unsigned char*)(s->p + 1)) << 8) \ + ); \ + s->p += 2; \ +} +#else #define in_uint16_le(s, v) \ { \ v = *((unsigned short*)(s->p)); \ s->p += 2; \ } +#endif +/******************************************************************************/ #define in_uint16_be(s, v) \ { \ v = *((unsigned char*)(s->p)); \ @@ -112,12 +154,28 @@ struct stream s->p++; \ } +/******************************************************************************/ +#if defined B_ENDIAN || defined NEED_ALIGN +#define in_uint32_le(s, v) \ +{ \ + v = (unsigned long) \ + ( \ + (*((unsigned char*)(s->p + 0)) << 0) | \ + (*((unsigned char*)(s->p + 1)) << 8) | \ + (*((unsigned char*)(s->p + 2)) << 16) | \ + (*((unsigned char*)(s->p + 3)) << 24) \ + ); \ + s->p += 4; \ +} +#else #define in_uint32_le(s, v) \ { \ - v = *(unsigned long*)(s->p); \ + v = *((unsigned long*)(s->p)); \ s->p += 4; \ } +#endif +/******************************************************************************/ #define in_uint32_be(s, v) \ { \ v = *((unsigned char*)(s->p)); \ @@ -133,72 +191,107 @@ struct stream s->p++; \ } +/******************************************************************************/ #define out_uint8(s, v) \ { \ - *((unsigned char*)(s->p)) = (unsigned char)(v); \ + *(s->p) = (unsigned char)(v); \ s->p++; \ } +/******************************************************************************/ +#if defined B_ENDIAN || defined NEED_ALIGN +#define out_uint16_le(s, v) \ +{ \ + *(s->p) = (unsigned char)(v); \ + s->p++; \ + *(s->p) = (unsigned char)((v) >> 8); \ + s->p++; \ +} +#else #define out_uint16_le(s, v) \ { \ *((unsigned short*)(s->p)) = (unsigned short)(v); \ s->p += 2; \ } +#endif +/******************************************************************************/ #define out_uint16_be(s, v) \ { \ - *((unsigned char*)(s->p)) = (unsigned char)((v) >> 8); \ + *(s->p) = (unsigned char)((v) >> 8); \ s->p++; \ - *((unsigned char*)(s->p)) = (unsigned char)(v); \ + *(s->p) = (unsigned char)(v); \ s->p++; \ } +/******************************************************************************/ +#if defined B_ENDIAN || defined NEED_ALIGN +#define out_uint32_le(s, v) \ +{ \ + *(s->p) = (unsigned char)(v); \ + s->p++; \ + *(s->p) = (unsigned char)((v) >> 8); \ + s->p++; \ + *(s->p) = (unsigned char)((v) >> 16); \ + s->p++; \ + *(s->p) = (unsigned char)((v) >> 24); \ + s->p++; \ +} +#else #define out_uint32_le(s, v) \ { \ *((unsigned long*)(s->p)) = (v); \ s->p += 4; \ } +#endif +/******************************************************************************/ #define out_uint32_be(s, v) \ { \ - *((unsigned char*)(s->p)) = (unsigned char)((v) >> 24); \ + *(s->p) = (unsigned char)((v) >> 24); \ s->p++; \ - *((unsigned char*)(s->p)) = (unsigned char)((v) >> 16); \ + *(s->p) = (unsigned char)((v) >> 16); \ s->p++; \ - *((unsigned char*)(s->p)) = (unsigned char)((v) >> 8); \ + *(s->p) = (unsigned char)((v) >> 8); \ s->p++; \ - *((unsigned char*)(s->p)) = (unsigned char)(v); \ + *(s->p) = (unsigned char)(v); \ s->p++; \ } +/******************************************************************************/ #define in_uint8p(s, v, n) \ { \ v = s->p; \ s->p += n; \ } +/******************************************************************************/ #define in_uint8a(s, v, n) \ { \ g_memcpy(v, s->p, n); \ s->p += n; \ } +/******************************************************************************/ #define in_uint8s(s, n) \ { \ s->p += n; \ } +/******************************************************************************/ #define out_uint8p(s, v, n) \ { \ g_memcpy(s->p, v, n); \ s->p += n; \ } +/******************************************************************************/ #define out_uint8a(s, v, n) \ { \ out_uint8p(s, v, n); \ } +/******************************************************************************/ #define out_uint8s(s, n) \ { \ g_memset(s->p, 0, n); \ |