cf_stream.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include "../common/cf_stream.h"
  4. #include <assert.h>
  5. #define DEFAULT_PACKET_SIZE 1024
  6. #define BIN_STREAM_MAGIC 0x019ef8f09867cda6
  7. #define RESIZE(s) \
  8. if(strm->size < strm->used + (s)) \
  9. bin_stream_resize(strm, strm->used + (s))
  10. static int32_t big_endian = -1;
  11. int32_t bin_stream_init(void* ptr)
  12. {
  13. bin_stream_t* strm;
  14. if(big_endian == -1){
  15. union
  16. {
  17. uint16_t s16;
  18. uint8_t s8[2];
  19. }un;
  20. un.s16 = 0x0100;
  21. if(un.s8[0] == 0x01)
  22. big_endian = 1;
  23. else
  24. big_endian = 0;
  25. }
  26. strm = (bin_stream_t *)ptr;
  27. strm->size = sizeof(uint8_t) * DEFAULT_PACKET_SIZE;
  28. strm->data = (uint8_t *)malloc(strm->size);
  29. if(strm->data == NULL)
  30. return -1;
  31. strm->rptr = strm->data;
  32. strm->wptr = strm->data;
  33. strm->rsize = 0;
  34. strm->used = 0;
  35. strm->magic = 0;
  36. return 0;
  37. }
  38. void bin_stream_destroy(void* ptr)
  39. {
  40. if(ptr != NULL){
  41. bin_stream_t* strm = (bin_stream_t *)ptr;
  42. free(strm->data);
  43. strm->size = 0;
  44. strm->rptr = NULL;
  45. strm->rsize = 0;
  46. strm->wptr = NULL;
  47. strm->used = 0;
  48. }
  49. }
  50. void bin_stream_reset(void* ptr, int32_t flag)
  51. {
  52. bin_stream_t* strm = (bin_stream_t*)ptr;
  53. if(flag == 1)
  54. strm->magic = BIN_STREAM_MAGIC;
  55. else
  56. strm->magic = 0;
  57. bin_stream_rewind(strm, 1);
  58. bin_stream_reduce(strm);
  59. }
  60. int32_t bin_stream_check(void* ptr)
  61. {
  62. bin_stream_t* strm = (bin_stream_t*)ptr;
  63. if(strm->magic == BIN_STREAM_MAGIC)
  64. return 0;
  65. return -1;
  66. }
  67. void bin_stream_rewind(bin_stream_t* strm, int32_t reset)
  68. {
  69. if(reset == 1){
  70. strm->wptr = strm->data;
  71. strm->used = 0;
  72. }
  73. strm->rptr = strm->data;
  74. strm->rsize = 0;
  75. }
  76. int bin_stream_available_read(bin_stream_t* strm)
  77. {
  78. assert(strm->rsize <= strm->used);
  79. return strm->used - strm->rsize;
  80. }
  81. void bin_stream_resize(bin_stream_t* strm, size_t new_size)
  82. {
  83. size_t alloc_size;
  84. if(new_size <= strm->size)
  85. return ;
  86. alloc_size = strm->size;
  87. while(new_size > alloc_size)
  88. alloc_size = alloc_size * 2;
  89. strm->data = (uint8_t*)realloc(strm->data, alloc_size);
  90. strm->size = alloc_size;
  91. strm->wptr = (uint8_t *)strm->data + strm->used;
  92. strm->rptr = (uint8_t *)strm->data + strm->rsize;
  93. }
  94. void bin_stream_set_used_size(bin_stream_t* strm, size_t used)
  95. {
  96. strm->used = used;
  97. }
  98. void bin_stream_reduce(bin_stream_t* strm)
  99. {
  100. if (strm->size > DEFAULT_PACKET_SIZE * 2){
  101. strm->data = (uint8_t*)realloc(strm->data, DEFAULT_PACKET_SIZE);
  102. strm->rptr = strm->data;
  103. strm->wptr = strm->data;
  104. strm->size = DEFAULT_PACKET_SIZE;
  105. strm->rsize = 0;
  106. strm->used = 0;
  107. }
  108. }
  109. void bin_stream_move(bin_stream_t* strm)
  110. {
  111. if(strm->used == strm->rsize && strm->rsize > 0){
  112. strm->rptr = strm->data;
  113. strm->wptr = strm->data;
  114. strm->used = 0;
  115. strm->rsize = 0;
  116. }
  117. if(strm->used > strm->rsize && strm->rsize > (strm->size / 2) && strm->used + 256 >= strm->size){
  118. uint32_t size = strm->used - strm->rsize;
  119. memmove(strm->data, strm->rptr, size);
  120. strm->wptr = strm->data + size;
  121. strm->rptr = strm->data;
  122. strm->rsize = 0;
  123. strm->used = size;
  124. }
  125. }
  126. void mach_uint8_write(bin_stream_t* strm, uint8_t val)
  127. {
  128. RESIZE(1);
  129. *(strm->wptr ++) = val;
  130. strm->used ++;
  131. }
  132. void mach_uint8_read(bin_stream_t* strm, uint8_t* val)
  133. {
  134. if(strm->used < strm->rsize + 1){
  135. *val = 0;
  136. }
  137. else{
  138. *val = *(strm->rptr ++);
  139. strm->rsize ++;
  140. }
  141. }
  142. void mach_int8_write(bin_stream_t* strm, int8_t val)
  143. {
  144. RESIZE(1);
  145. *(strm->wptr ++) = (uint8_t)val;
  146. strm->used ++;
  147. }
  148. void mach_int8_read(bin_stream_t* strm, int8_t* val)
  149. {
  150. if(strm->used < strm->rsize + 1){
  151. *val = 0;
  152. }
  153. else{
  154. *val = (int8_t)(*(strm->rptr ++));
  155. strm->rsize ++;
  156. }
  157. }
  158. void mach_uint16_write(bin_stream_t* strm, uint16_t val)
  159. {
  160. RESIZE(2);
  161. mach_put_2(strm->wptr, val);
  162. strm->wptr += 2;
  163. strm->used += 2;
  164. }
  165. void mach_uint16_read(bin_stream_t* strm, uint16_t* val)
  166. {
  167. if(strm->used < strm->rsize + 2){
  168. *val = 0;
  169. }
  170. else{
  171. *val = (int16_t)mach_get_2(strm->rptr);
  172. strm->rptr += 2;
  173. strm->rsize += 2;
  174. }
  175. }
  176. void mach_int16_write(bin_stream_t* strm, int16_t val)
  177. {
  178. RESIZE(2);
  179. mach_put_2(strm->wptr, (uint16_t)val);
  180. strm->wptr += 2;
  181. strm->used += 2;
  182. }
  183. void mach_int16_read(bin_stream_t* strm, int16_t* val)
  184. {
  185. if(strm->used < strm->rsize + 2){
  186. *val = 0;
  187. }
  188. else{
  189. *val = (int16_t)mach_get_2(strm->rptr);
  190. strm->rptr += 2;
  191. strm->rsize += 2;
  192. }
  193. }
  194. void mach_uint32_write(bin_stream_t* strm, uint32_t val)
  195. {
  196. RESIZE(4);
  197. mach_put_4(strm->wptr, val);
  198. strm->wptr += 4;
  199. strm->used += 4;
  200. }
  201. void mach_uint32_read(bin_stream_t* strm, uint32_t* val)
  202. {
  203. if(strm->used < strm->rsize + 4){
  204. *val = 0;
  205. }
  206. else{
  207. *val = mach_get_4(strm->rptr);
  208. strm->rptr += 4;
  209. strm->rsize += 4;
  210. }
  211. }
  212. void mach_int32_write(bin_stream_t* strm, int32_t val)
  213. {
  214. RESIZE(4);
  215. mach_put_4(strm->wptr, (uint32_t)val);
  216. strm->wptr += 4;
  217. strm->used += 4;
  218. }
  219. void mach_int32_read(bin_stream_t* strm, int32_t* val)
  220. {
  221. if(strm->used < strm->rsize + 4){
  222. *val = 0;
  223. }
  224. else{
  225. *val = (int32_t)mach_get_4(strm->rptr);
  226. strm->rptr += 4;
  227. strm->rsize += 4;
  228. }
  229. }
  230. void mach_uint64_write(bin_stream_t* strm, uint64_t val)
  231. {
  232. RESIZE(8);
  233. mach_put_8(strm->wptr, val);
  234. strm->wptr += 8;
  235. strm->used += 8;
  236. }
  237. void mach_uint64_read(bin_stream_t* strm, uint64_t* val)
  238. {
  239. if(strm->used < strm->rsize + 8){
  240. *val = 0;
  241. }
  242. else{
  243. *val = mach_get_8(strm->rptr);
  244. strm->rptr += 8;
  245. strm->rsize += 8;
  246. }
  247. }
  248. void mach_int64_write(bin_stream_t* strm, int64_t val)
  249. {
  250. RESIZE(8);
  251. mach_put_8(strm->wptr, (uint64_t)val);
  252. strm->wptr += 8;
  253. strm->used += 8;
  254. }
  255. void mach_int64_read(bin_stream_t* strm, int64_t* val)
  256. {
  257. if(strm->used < strm->rsize + 8){
  258. *val = 0;
  259. }
  260. else{
  261. *val = mach_get_8(strm->rptr);
  262. strm->rptr += 8;
  263. strm->rsize += 8;
  264. }
  265. }
  266. void mach_data_write(bin_stream_t* strm, const uint8_t* str, size_t size)
  267. {
  268. RESIZE(size + 2);
  269. mach_uint16_write(strm, (uint16_t)size);
  270. memcpy(strm->wptr, str, size);
  271. strm->wptr += size;
  272. strm->used += size;
  273. }
  274. uint16_t mach_data_read(bin_stream_t* strm, uint8_t* str, size_t size)
  275. {
  276. uint16_t len;
  277. mach_uint16_read(strm, &len);
  278. if(len > size || strm->rsize + len > strm->used)
  279. return READ_DATA_ERROR;
  280. memcpy(str, strm->rptr, len);
  281. strm->rptr += len;
  282. strm->rsize += len;
  283. return len;
  284. }
  285. void mach_block_write(bin_stream_t* strm, const uint8_t* str, size_t size) {
  286. RESIZE(size);
  287. memcpy(strm->wptr, str, size);
  288. strm->wptr += size;
  289. strm->used += size;
  290. }
  291. uint16_t mach_block_read(bin_stream_t* strm, uint8_t* str, size_t size) {
  292. if(strm->rsize + size > strm->used)
  293. return READ_DATA_ERROR;
  294. memcpy(str, strm->rptr, size);
  295. strm->rptr += size;
  296. strm->rsize += size;
  297. return size;
  298. }
  299. void mach_put_2(uint8_t* ptr, uint16_t val)
  300. {
  301. if(big_endian){
  302. *((uint16_t*)ptr) = val;
  303. }
  304. else{
  305. ptr[0] = (uint8_t)(val >> 8);
  306. ptr[1] = (uint8_t)val;
  307. }
  308. }
  309. uint16_t mach_get_2(uint8_t* ptr)
  310. {
  311. if(big_endian)
  312. return *((uint16_t*)(ptr));
  313. else
  314. return ((uint16_t)(ptr[0]) << 8) + (uint32_t)(ptr[1]);
  315. }
  316. void mach_put_4(uint8_t* ptr, uint32_t val)
  317. {
  318. if(big_endian){
  319. *((uint32_t*)ptr) = val;
  320. }
  321. else{
  322. ptr[0] = (uint8_t)(val >> 24);
  323. ptr[1] = (uint8_t)(val >> 16);
  324. ptr[2] = (uint8_t)(val >> 8);
  325. ptr[3] = (uint8_t)val;
  326. }
  327. }
  328. uint32_t mach_get_4(uint8_t* ptr)
  329. {
  330. if(big_endian)
  331. return *((uint32_t*)(ptr));
  332. else
  333. return ((uint32_t)(ptr[0]) << 24) + ((uint32_t)(ptr[1]) << 16) + ((uint32_t)(ptr[2]) << 8) + (uint32_t)(ptr[3]);
  334. }
  335. void mach_put_8(uint8_t* ptr, uint64_t val)
  336. {
  337. if(big_endian)
  338. *((uint64_t*)ptr) = val;
  339. else{
  340. ptr[0] = (uint8_t)(val >> 56);
  341. ptr[1] = (uint8_t)(val >> 48);
  342. ptr[2] = (uint8_t)(val >> 40);
  343. ptr[3] = (uint8_t)(val >> 32);
  344. ptr[4] = (uint8_t)(val >> 24);
  345. ptr[5] = (uint8_t)(val >> 16);
  346. ptr[6] = (uint8_t)(val >> 8);
  347. ptr[7] = (uint8_t)val;
  348. }
  349. }
  350. uint64_t mach_get_8(uint8_t* ptr)
  351. {
  352. if(big_endian)
  353. return *((uint64_t*)(ptr));
  354. else
  355. return ((uint64_t)(ptr[0]) << 56) + ((uint64_t)(ptr[1]) << 48) + ((uint64_t)(ptr[2]) << 40) + ((uint64_t)(ptr[3]) << 32)
  356. + ((uint64_t)(ptr[4]) << 24) + ((uint64_t)(ptr[5]) << 16) + ((uint64_t)(ptr[6]) << 8) + (uint64_t)(ptr[7]);
  357. }