Advertisement
Guest User

Untitled

a guest
Oct 16th, 2018
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 13.94 KB | None | 0 0
  1.  
  2. /**
  3.  * NowStream.h
  4.  */
  5.  
  6. #ifndef NOW_STREAM_H
  7. #define NOW_STREAM_H
  8.  
  9. #include <winpr/crt.h>
  10. #include <winpr/endian.h>
  11.  
  12. #include <Wayk/Now.h>
  13.  
  14. #ifdef __cplusplus
  15. extern "C" {
  16. #endif
  17.  
  18. struct now_stream
  19. {
  20.     uint8_t* buffer;
  21.     uint8_t* pointer;
  22.     size_t length;
  23.     size_t capacity;
  24.     bool owner;
  25. };
  26. typedef struct now_stream NowStream;
  27.  
  28. #define now_stream_read_n8(_t, _s, _v, _p) do { _v = \
  29.     (_t)(*_s->pointer); \
  30.     _s->pointer += _p; } while (0)
  31.  
  32. #define now_stream_read_n16_le(_t, _s, _v, _p) do { _v = \
  33.     (_t)(*_s->pointer) + \
  34.     (((_t)(*(_s->pointer + 1))) << 8); \
  35.     if (_p) _s->pointer += 2; } while (0)
  36.  
  37. #define now_stream_read_n16_be(_t, _s, _v, _p) do { _v = \
  38.     (((_t)(*_s->pointer)) << 8) + \
  39.     (_t)(*(_s->pointer + 1)); \
  40.     if (_p) _s->pointer += 2; } while (0)
  41.  
  42. #define now_stream_read_n32_le(_t, _s, _v, _p) do { _v = \
  43.     (_t)(*_s->pointer) + \
  44.     (((_t)(*(_s->pointer + 1))) << 8) + \
  45.     (((_t)(*(_s->pointer + 2))) << 16) + \
  46.     (((_t)(*(_s->pointer + 3))) << 24); \
  47.     if (_p) _s->pointer += 4; } while (0)
  48.  
  49. #define now_stream_read_n32_be(_t, _s, _v, _p) do { _v = \
  50.     (((_t)(*(_s->pointer))) << 24) + \
  51.     (((_t)(*(_s->pointer + 1))) << 16) + \
  52.     (((_t)(*(_s->pointer + 2))) << 8) + \
  53.     (((_t)(*(_s->pointer + 3)))); \
  54.     if (_p) _s->pointer += 4; } while (0)
  55.  
  56. #define now_stream_read_n64_le(_t, _s, _v, _p) do { _v = \
  57.     (_t)(*_s->pointer) + \
  58.     (((_t)(*(_s->pointer + 1))) << 8) + \
  59.     (((_t)(*(_s->pointer + 2))) << 16) + \
  60.     (((_t)(*(_s->pointer + 3))) << 24) + \
  61.     (((_t)(*(_s->pointer + 4))) << 32) + \
  62.     (((_t)(*(_s->pointer + 5))) << 40) + \
  63.     (((_t)(*(_s->pointer + 6))) << 48) + \
  64.     (((_t)(*(_s->pointer + 7))) << 56); \
  65.     if (_p) _s->pointer += 8; } while (0)
  66.  
  67. #define now_stream_read_n64_be(_t, _s, _v, _p) do { _v = \
  68.     (((_t)(*(_s->pointer))) << 56) + \
  69.     (((_t)(*(_s->pointer + 1))) << 48) + \
  70.     (((_t)(*(_s->pointer + 2))) << 40) + \
  71.     (((_t)(*(_s->pointer + 3))) << 32) + \
  72.     (((_t)(*(_s->pointer + 4))) << 24) + \
  73.     (((_t)(*(_s->pointer + 5))) << 16) + \
  74.     (((_t)(*(_s->pointer + 6))) << 8) + \
  75.     (((_t)(*(_s->pointer + 7)))); \
  76.     if (_p) _s->pointer += 8; } while (0)
  77.  
  78.  
  79. #define NowStream_Read_UINT8(_s, _v) now_stream_read_n8(UINT8, _s, _v, 1)
  80. #define NowStream_Read_INT8(_s, _v) now_stream_read_n8(INT8, _s, _v, 1)
  81.  
  82. #define NowStream_Read_UINT16(_s, _v) now_stream_read_n16_le(UINT16, _s, _v, 1)
  83. #define NowStream_Read_INT16(_s, _v) now_stream_read_n16_le(INT16, _s, _v, 1)
  84.  
  85. #define NowStream_Read_UINT16_BE(_s, _v) now_stream_read_n16_be(UINT16, _s, _v, 1)
  86. #define NowStream_Read_INT16_BE(_s, _v) now_stream_read_n16_be(INT16, _s, _v, 1)
  87.  
  88. #define NowStream_Read_UINT32(_s, _v) now_stream_read_n32_le(UINT32, _s, _v, 1)
  89. #define NowStream_Read_INT32(_s, _v) now_stream_read_n32_le(INT32, _s, _v, 1)
  90.  
  91. #define NowStream_Read_UINT32_BE(_s, _v) now_stream_read_n32_be(UINT32, _s, _v, 1)
  92. #define NowStream_Read_INT32_BE(_s, _v) now_stream_read_n32_be(INT32, _s, _v, 1)
  93.  
  94. #define NowStream_Read_UINT64(_s, _v) now_stream_read_n64_le(UINT64, _s, _v, 1)
  95. #define NowStream_Read_INT64(_s, _v) now_stream_read_n64_le(INT64, _s, _v, 1)
  96.  
  97. #define NowStream_Read_UINT64_BE(_s, _v) now_stream_read_n64_be(UINT64, _s, _v, 1)
  98. #define NowStream_Read_INT64_BE(_s, _v) now_stream_read_n64_be(INT64, _s, _v, 1)
  99.  
  100. #define NowStream_Read(_s, _b, _n) do { \
  101.     memcpy(_b, (_s->pointer), (_n)); \
  102.     _s->pointer += (_n); \
  103.     } while (0)
  104.  
  105.  
  106. #define NowStream_Peek_UINT8(_s, _v) now_stream_read_n8(UINT8, _s, _v, 0)
  107. #define NowStream_Peek_INT8(_s, _v) now_stream_read_n8(INT8, _s, _v, 0)
  108.  
  109. #define NowStream_Peek_UINT16(_s, _v) now_stream_read_n16_le(UINT16, _s, _v, 0)
  110. #define NowStream_Peek_INT16(_s, _v) now_stream_read_n16_le(INT16, _s, _v, 0)
  111.  
  112. #define NowStream_Peek_UINT16_BE(_s, _v) now_stream_read_n16_be(UINT16, _s, _v, 0)
  113. #define NowStream_Peek_INT16_BE(_s, _v) now_stream_read_n16_be(INT16, _s, _v, 0)
  114.  
  115. #define NowStream_Peek_UINT32(_s, _v) now_stream_read_n32_le(UINT32, _s, _v, 0)
  116. #define NowStream_Peek_INT32(_s, _v) now_stream_read_n32_le(INT32, _s, _v, 0)
  117.  
  118. #define NowStream_Peek_UINT32_BE(_s, _v) now_stream_read_n32_be(UINT32, _s, _v, 0)
  119. #define NowStream_Peek_INT32_BE(_s, _v) now_stream_read_n32_be(INT32, _s, _v, 0)
  120.  
  121. #define NowStream_Peek_UINT64(_s, _v) now_stream_read_n64_le(UINT64, _s, _v, 0)
  122. #define NowStream_Peek_INT64(_s, _v) now_stream_read_n64_le(INT64, _s, _v, 0)
  123.  
  124. #define NowStream_Peek_UINT64_BE(_s, _v) now_stream_read_n64_be(UINT64, _s, _v, 0)
  125. #define NowStream_Peek_INT64_BE(_s, _v) now_stream_read_n64_be(INT64, _s, _v, 0)
  126.  
  127. #define NowStream_Peek(_s, _b, _n) do { \
  128.     memcpy(_b, (_s->pointer), (_n)); \
  129.     } while (0)
  130.  
  131.  
  132. #define NowStream_Write_UINT8(_s, _v) do { \
  133.     *_s->pointer++ = (UINT8)(_v); } while (0)
  134. #define NowStream_Write_INT8 NowStream_Write_UINT8
  135.  
  136. #define NowStream_Write_UINT16(_s, _v) do { \
  137.     *_s->pointer++ = (_v) & 0xFF; \
  138.     *_s->pointer++ = ((_v) >> 8) & 0xFF; } while (0)
  139. #define NowStream_Write_INT16 NowStream_Write_UINT16
  140.  
  141. #define NowStream_Write_UINT16_BE(_s, _v) do { \
  142.     *_s->pointer++ = ((_v) >> 8) & 0xFF; \
  143.     *_s->pointer++ = (_v) & 0xFF; } while (0)
  144. #define NowStream_Write_INT16_BE NowStream_Write_UINT16_BE
  145.  
  146. #define NowStream_Write_UINT32(_s, _v) do { \
  147.     *_s->pointer++ = (_v) & 0xFF; \
  148.     *_s->pointer++ = ((_v) >> 8) & 0xFF; \
  149.     *_s->pointer++ = ((_v) >> 16) & 0xFF; \
  150.     *_s->pointer++ = ((_v) >> 24) & 0xFF; } while (0)
  151. #define NowStream_Write_INT32 NowStream_Write_UINT32
  152.  
  153. #define NowStream_Write_UINT32_BE(_s, _v) do { \
  154.         NowStream_Write_UINT16_BE(_s, ((_v) >> 16 & 0xFFFF)); \
  155.         NowStream_Write_UINT16_BE(_s, ((_v) & 0xFFFF)); \
  156.     } while (0)
  157. #define NowStream_Write_INT32_BE NowStream_Write_UINT32_BE
  158.  
  159. #define NowStream_Write_UINT64(_s, _v) do { \
  160.     *_s->pointer++ = (UINT64)(_v) & 0xFF; \
  161.     *_s->pointer++ = ((UINT64)(_v) >> 8) & 0xFF; \
  162.     *_s->pointer++ = ((UINT64)(_v) >> 16) & 0xFF; \
  163.     *_s->pointer++ = ((UINT64)(_v) >> 24) & 0xFF; \
  164.     *_s->pointer++ = ((UINT64)(_v) >> 32) & 0xFF; \
  165.     *_s->pointer++ = ((UINT64)(_v) >> 40) & 0xFF; \
  166.     *_s->pointer++ = ((UINT64)(_v) >> 48) & 0xFF; \
  167.     *_s->pointer++ = ((UINT64)(_v) >> 56) & 0xFF; } while (0)
  168. #define NowStream_Write_INT64 NowStream_Write_UINT64
  169.  
  170. #define NowStream_Write_UINT64_BE(_s, _v) do { \
  171.     *_s->pointer++ = ((UINT64)(_v) >> 56) & 0xFF; \
  172.     *_s->pointer++ = ((UINT64)(_v) >> 48) & 0xFF; \
  173.     *_s->pointer++ = ((UINT64)(_v) >> 40) & 0xFF; \
  174.     *_s->pointer++ = ((UINT64)(_v) >> 32) & 0xFF; \
  175.     *_s->pointer++ = ((UINT64)(_v) >> 24) & 0xFF; \
  176.     *_s->pointer++ = ((UINT64)(_v) >> 16) & 0xFF; \
  177.     *_s->pointer++ = ((UINT64)(_v) >> 8) & 0xFF; \
  178.     *_s->pointer++ = (UINT64)(_v) & 0xFF; } while (0)
  179. #define NowStream_Write_INT64_BE NowStream_Write_UINT64_BE
  180.    
  181. #define NowStream_Write(_s, _b, _n) do { \
  182.     memcpy(_s->pointer, (_b), (_n)); \
  183.     _s->pointer += (_n); \
  184.     } while (0)
  185.  
  186.  
  187. #define NowStream_Seek(_s,_offset)      _s->pointer += (_offset)
  188. #define NowStream_Rewind(_s,_offset)        _s->pointer -= (_offset)
  189.  
  190. #define NowStream_Seek_UINT8(_s)        NowStream_Seek(_s, 1)
  191. #define NowStream_Seek_UINT16(_s)       NowStream_Seek(_s, 2)
  192. #define NowStream_Seek_UINT32(_s)       NowStream_Seek(_s, 4)
  193. #define NowStream_Seek_UINT64(_s)       NowStream_Seek(_s, 8)
  194.  
  195. #define NowStream_Rewind_UINT8(_s)      NowStream_Rewind(_s, 1)
  196. #define NowStream_Rewind_UINT16(_s)     NowStream_Rewind(_s, 2)
  197. #define NowStream_Rewind_UINT32(_s)     NowStream_Rewind(_s, 4)
  198. #define NowStream_Rewind_UINT64(_s)     NowStream_Rewind(_s, 8)
  199.  
  200. #define NowStream_Zero(_s, _n) do { \
  201.     memset(_s->pointer, 0, (_n)); \
  202.     _s->pointer += (_n); \
  203.     } while (0)
  204.  
  205. #define NowStream_Fill(_s, _v, _n) do { \
  206.     memset(_s->pointer, _v, (_n)); \
  207.     _s->pointer += (_n); \
  208.     } while (0)
  209.  
  210. #define NowStream_Copy(_dst, _src, _n) do { \
  211.     memcpy(_dst->pointer, _src->pointer, _n); \
  212.     _dst->pointer += _n; \
  213.     _src->pointer += _n; \
  214.     } while (0)
  215.  
  216. #define NowStream_Buffer(_s)            _s->buffer
  217. #define NowStream_GetBuffer(_s, _b)     _b = _s->buffer
  218. #define NowStream_SetBuffer(_s, _b)     _s->buffer = _b
  219.  
  220. #define NowStream_Pointer(_s)           _s->pointer
  221. #define NowStream_GetPointer(_s, _p)        _p = _s->pointer
  222. #define NowStream_SetPointer(_s, _p)        _s->pointer = _p
  223.  
  224. #define NowStream_Length(_s)            _s->length
  225. #define NowStream_GetLength(_s, _l)     _l = _s->length
  226. #define NowStream_SetLength(_s, _l)     _s->length = _l
  227.  
  228. #define NowStream_Capacity(_s)          _s->capacity
  229. #define NowStream_GetCapacity(_s, _c)       _c = _s->capacity
  230. #define NowStream_SetCapacity(_s, _c)       _s->capacity = _c
  231.  
  232. #define NowStream_GetPosition(_s)       (_s->pointer - _s->buffer)
  233. #define NowStream_SetPosition(_s, _p)       _s->pointer = _s->buffer + (_p)
  234.  
  235. #define NowStream_SealLength(_s)        _s->length = (_s->pointer - _s->buffer)
  236. #define NowStream_GetRemainingLength(_s)    (_s->length - (_s->pointer - _s->buffer))
  237. #define NowStream_GetRemainingCapacity(_s)  (_s->capacity - (_s->pointer - _s->buffer))
  238.  
  239. #define NowStream_Clear(_s)         memset(_s->buffer, 0, _s->capacity)
  240.  
  241. static INLINE bool NowStream_SafeSeek(NowStream* s, size_t size)
  242. {
  243.     if (NowStream_GetRemainingLength(s) < size)
  244.         return false;
  245.  
  246.     NowStream_Seek(s, size);
  247.     return true;
  248. }
  249.  
  250. WAYK_EXPORT bool NowStream_EnsureCapacity(NowStream* s, size_t size);
  251. WAYK_EXPORT bool NowStream_EnsureRemainingCapacity(NowStream* s, size_t size);
  252.  
  253. WAYK_EXPORT bool NowStream_CheckSafeRead(NowStream* s, size_t size);
  254. WAYK_EXPORT bool NowStream_CheckSafeWrite(NowStream* s, size_t size);
  255.  
  256. WAYK_EXPORT int NowStream_Format(NowStream* s, const char* format, ...);
  257.  
  258. /**
  259.  * Search for |pattern| from the current position in the stream. If pattern is found, |offset|
  260.  * contains the offset from the current position where the |pattern| begins.
  261.  */
  262. bool NowStream_Find(NowStream* s, const uint8_t* pattern, size_t pattern_length, size_t* offset);
  263.  
  264. WAYK_EXPORT NowStream* NowStream_Init(NowStream* s, uint8_t* buffer, size_t size, bool owner);
  265. WAYK_EXPORT void NowStream_Uninit(NowStream* s);
  266.  
  267. WAYK_EXPORT NowStream* NowStream_New(uint8_t* buffer, size_t size, bool owner);
  268. WAYK_EXPORT void NowStream_Free(NowStream* s);
  269.  
  270. #ifdef __cplusplus
  271. }
  272. #endif
  273.  
  274. #endif /* NOW_STREAM_H */
  275.  
  276. /**
  277.  * NowStream.c
  278.  */
  279.  
  280. #ifdef HAVE_CONFIG_H
  281. #include "config.h"
  282. #endif
  283.  
  284. #include <string.h>
  285.  
  286. #include <Wayk/NowStream.h>
  287.  
  288. bool NowStream_Find(NowStream* s, const uint8_t* pattern, size_t pattern_length, size_t* offset)
  289. {
  290.     NowStream* _s = NULL;
  291.     bool result = false;
  292.  
  293.     if (NowStream_GetRemainingLength(s) < pattern_length)
  294.         return false;
  295.  
  296.     _s = NowStream_New(s->pointer, NowStream_GetRemainingLength(s), false);
  297.  
  298.     while (NowStream_CheckSafeRead(_s, pattern_length))
  299.     {
  300.         if (memcmp(_s->pointer, pattern, pattern_length) == 0)
  301.         {
  302.             result = true;
  303.             *offset = _s->pointer - s->pointer;
  304.             goto exit;
  305.         }
  306.  
  307.         NowStream_Seek(_s, 1);
  308.     }
  309.  
  310. exit:
  311.     NowStream_Free(_s);
  312.  
  313.     return result;
  314. }
  315.  
  316. bool NowStream_EnsureCapacity(NowStream* s, size_t size)
  317. {
  318.     if (!s->capacity)
  319.         return false;
  320.  
  321.     if (s->capacity < size)
  322.     {
  323.         uint8_t* new_buf;
  324.         size_t position;
  325.         size_t old_capacity;
  326.         size_t new_capacity;
  327.  
  328.         old_capacity = s->capacity;
  329.         new_capacity = old_capacity;
  330.  
  331.         do
  332.         {
  333.             new_capacity *= 2;
  334.         }
  335.         while (new_capacity < size);
  336.  
  337.         position = NowStream_GetPosition(s);
  338.  
  339.         if (s->owner)
  340.         {
  341.             new_buf = (uint8_t*) realloc(s->buffer, new_capacity);
  342.  
  343.             if (!new_buf)
  344.                 return false;
  345.         }
  346.         else
  347.         {
  348.             new_buf = (uint8_t*) malloc(new_capacity);
  349.  
  350.             if (!new_buf)
  351.                 return false;
  352.  
  353.             CopyMemory(new_buf, s->buffer, old_capacity);
  354.  
  355.             s->owner = true;
  356.         }
  357.  
  358.         s->buffer = new_buf;
  359.         s->capacity = new_capacity;
  360.         s->length = new_capacity;
  361.         ZeroMemory(&s->buffer[old_capacity], s->capacity - old_capacity);
  362.  
  363.         NowStream_SetPosition(s, position);
  364.     }
  365.  
  366.     return true;
  367. }
  368.  
  369. bool NowStream_EnsureRemainingCapacity(NowStream* s, size_t size)
  370. {
  371.     if ((NowStream_GetPosition(s) + size) > NowStream_Capacity(s))
  372.         return NowStream_EnsureCapacity(s, NowStream_Capacity(s) + size);
  373.  
  374.     return true;
  375. }
  376.  
  377. bool NowStream_CheckSafeRead(NowStream* s, size_t size)
  378. {
  379.     size_t offset;
  380.  
  381.     if (s->buffer > s->pointer)
  382.         return false;
  383.  
  384.     offset = s->pointer - s->buffer;
  385.  
  386.     if (s->length < offset)
  387.         return false;
  388.  
  389.     int remaining_length = s->length - (s->pointer - s->buffer);
  390.  
  391.     if (remaining_length < size)
  392.         return false;
  393.  
  394.     return true;
  395. }
  396.  
  397. bool NowStream_CheckSafeWrite(NowStream* s, size_t size)
  398. {
  399.     if ((NowStream_GetPosition(s) + size) > NowStream_Capacity(s))
  400.     {
  401.         return NowStream_EnsureCapacity(s, NowStream_Capacity(s) + size);
  402.     }
  403.  
  404.     return true;
  405. }
  406.  
  407. int NowStream_Format(NowStream* s, const char* format, ...)
  408. {
  409.     int status;
  410.     size_t size;
  411.     va_list args;
  412.  
  413.     /* vsnprintf: http://www.cplusplus.com/reference/cstdio/vsnprintf/ */
  414.  
  415.     va_start(args, format);
  416.     size = s->capacity - NowStream_GetPosition(s);
  417.     status = vsnprintf((char*) s->pointer, size, format, args);
  418.     va_end(args);
  419.  
  420.     if (status < 0)
  421.         return -1;
  422.  
  423.     if (status < size)
  424.     {
  425.         NowStream_Seek(s, (size_t) status);
  426.     }
  427.     else
  428.     {
  429.         if (!NowStream_CheckSafeWrite(s, status + 1))
  430.             return -1;
  431.  
  432.         va_start(args, format);
  433.         size = s->capacity - NowStream_GetPosition(s);
  434.         status = vsnprintf((char*) s->pointer, size, format, args);
  435.         va_end(args);
  436.  
  437.         if ((status < 0) || (status >= size))
  438.             return -1;
  439.  
  440.         NowStream_Seek(s, (size_t) status);
  441.     }
  442.  
  443.     return status;
  444. }
  445.  
  446. NowStream* NowStream_Init(NowStream* s, uint8_t* buffer, size_t size, bool owner)
  447. {
  448.     if (!s)
  449.         return NULL;
  450.  
  451.     s->owner = owner;
  452.  
  453.     if (buffer)
  454.     {
  455.         s->buffer = buffer;
  456.     }
  457.     else
  458.     {
  459.         s->buffer = (uint8_t*) malloc(size);
  460.         s->owner = true;
  461.     }
  462.  
  463.     if (!s->buffer)
  464.         return NULL;
  465.  
  466.     s->pointer = s->buffer;
  467.     s->capacity = size;
  468.     s->length = size;
  469.  
  470.     return s;
  471. }
  472.  
  473. void NowStream_Uninit(NowStream* s)
  474. {
  475.     if (!s)
  476.         return;
  477.  
  478.     if (s->owner)
  479.     {
  480.         free(s->buffer);
  481.         s->buffer = NULL;
  482.     }
  483.  
  484.     s->owner = false;
  485.     s->pointer = NULL;
  486.     s->capacity = 0;
  487.     s->length = 0;
  488. }
  489.  
  490. NowStream* NowStream_New(uint8_t* buffer, size_t size, bool owner)
  491. {
  492.     NowStream* s;
  493.  
  494.     s = malloc(sizeof(NowStream));
  495.  
  496.     if (!s)
  497.         return NULL;
  498.  
  499.     if (!NowStream_Init(s, buffer, size, owner))
  500.     {
  501.         free(s);
  502.         return NULL;
  503.     }
  504.  
  505.     return s;
  506. }
  507.  
  508. void NowStream_Free(NowStream* s)
  509. {
  510.     if (!s)
  511.         return;
  512.  
  513.     NowStream_Uninit(s);
  514.  
  515.     free(s);
  516. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement