lib_buffer.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include "stdio.h"
  2. #include "string.h"
  3. #include "stdlib.h"
  4. #include "lib_buffer.h"
  5. #define validLen (Object->push_size - Object->pop_size) //缓冲区有效长度
  6. TBufffer TBuffer_Init(TBuffferOBJ *data, void *buffer, int buff_size)
  7. {
  8. TBufffer result = NULL;
  9. if (data != NULL && buffer != NULL && buff_size > 0)
  10. {
  11. data->pHead = buffer;
  12. data->size = buff_size;
  13. data->pTail = data->pHead + buff_size;
  14. data->pValid = data->pHead;
  15. data->pValidTail = data->pHead;
  16. data->push_size = 0;
  17. data->pop_size = 0;
  18. result = data;
  19. }
  20. return result;
  21. }
  22. void TBuffer_Fini(TBuffferOBJ *data)
  23. {
  24. if (data != NULL)
  25. {
  26. data->pValid = data->pValidTail = data->pHead;
  27. data->pop_size = data->push_size;
  28. }
  29. }
  30. int TBuffer_Push(TBufffer Object, const void *data, int size)
  31. {
  32. int result = 0;
  33. int _ValidLength = Object->push_size - Object->pop_size;
  34. int _Size = Object->size - _ValidLength; //实际可用 为0?
  35. if (data == NULL)
  36. result = -1;
  37. else if (size > 0 && _Size > 0) //保留原本不能丢弃
  38. {
  39. if (_Size < size)
  40. size = _Size;
  41. result = size;
  42. if (Object->pValidTail + size > Object->pTail)//写入之后超出缓冲区 分两段
  43. {
  44. int rest = Object->pTail - Object->pValidTail;
  45. memcpy(Object->pValidTail, data, rest);
  46. memcpy(Object->pHead, (char *)data + rest, size - rest);
  47. Object->pValidTail = Object->pHead + size - rest;
  48. }
  49. else
  50. {
  51. memcpy(Object->pValidTail, data, size);
  52. Object->pValidTail += size;
  53. if (Object->pValidTail == Object->pTail)
  54. Object->pValidTail = Object->pHead;
  55. }
  56. Object->push_size += result;
  57. }
  58. // printf(" push = %s\n", Object->pHead);
  59. return result;
  60. }
  61. int TBuffer_Peek(TBufffer Object, void *data, int size)//返回实际尺寸
  62. {
  63. int result = 0;
  64. if (data == NULL)
  65. result = -1;
  66. else if (size > 0 && Object->pop_size != Object->push_size)
  67. {
  68. int _ValidLength = Object->push_size - Object->pop_size;
  69. if (size > _ValidLength)//可能会push validLen变大 导致size变大越界
  70. size = _ValidLength;
  71. if (Object->pValid + size > Object->pTail)//需要分成两段copy
  72. {
  73. int rest = Object->pTail - Object->pValid;
  74. memcpy(data, Object->pValid, rest);
  75. memcpy((char*)data + rest, Object->pHead, size - rest);//第二段,绕到整个存储区的开头
  76. }
  77. else
  78. {
  79. memcpy(data, Object->pValid, size);
  80. }
  81. result = size;
  82. }
  83. return result;
  84. }
  85. int TBuffer_Pop(TBufffer Object, void *data, int size)
  86. {
  87. int result = 0;
  88. if (data == NULL)
  89. result = -1;
  90. else if (size > 0 && Object->pop_size != Object->push_size)
  91. {
  92. int _ValidLength = Object->push_size - Object->pop_size;
  93. if (size > _ValidLength)//可能会push validLen变大 导致size变大越界
  94. size = _ValidLength;
  95. if (Object->pValid + size > Object->pTail)//需要分成两段copy
  96. {
  97. int rest = Object->pTail - Object->pValid;
  98. memcpy(data, Object->pValid, rest);
  99. memcpy((char*)data + rest, Object->pHead, size - rest);//第二段,绕到整个存储区的开头
  100. Object->pValid = Object->pHead + size - rest;//更新已使用缓冲区的起始
  101. }
  102. else
  103. {
  104. memcpy(data, Object->pValid, size);
  105. Object->pValid = Object->pValid + size;
  106. if (Object->pValid == Object->pTail)
  107. Object->pValid = Object->pHead;
  108. }
  109. result = size;
  110. Object->pop_size += result;
  111. }
  112. // printf("pop = %s\n",(char*)data);
  113. return result;
  114. }