rtlcommon.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. #include "jiface.hpp"
  2. #include "jbuff.hpp"
  3. #include "jstring.hpp"
  4. #include "junicode.hpp"
  5. #include "rtlcommon.hpp"
  6. CContiguousRowBuffer::CContiguousRowBuffer(ISerialStream * _in) : in(_in)
  7. {
  8. clearBuffer();
  9. }
  10. void CContiguousRowBuffer::setStream(ISerialStream *_in)
  11. {
  12. in = _in;
  13. clearBuffer();
  14. }
  15. bool CContiguousRowBuffer::checkInputEos()
  16. {
  17. assertex(!available);
  18. peekBytesDirect(0);
  19. return in->eos();
  20. }
  21. const byte * CContiguousRowBuffer::peekBytes(size32_t maxSize)
  22. {
  23. if (maxSize < maxAvailable())
  24. peekBytesDirect(maxSize);
  25. return cur;
  26. }
  27. const byte * CContiguousRowBuffer::peekFirstByte()
  28. {
  29. if (maxAvailable() == 0)
  30. peekBytesDirect(0);
  31. return cur;
  32. }
  33. void CContiguousRowBuffer::peekBytesDirect(unsigned maxSize)
  34. {
  35. size_t toSkip = cur - buffer;
  36. if (toSkip)
  37. in->skip(toSkip);
  38. buffer = static_cast<const byte *>(in->peek(maxSize, available));
  39. cur = buffer;
  40. }
  41. //---------------------------------------------------------------------------------------------------------------------
  42. CThorContiguousRowBuffer::CThorContiguousRowBuffer(ISerialStream * _in) : CContiguousRowBuffer(_in)
  43. {
  44. readOffset = 0;
  45. }
  46. void CThorContiguousRowBuffer::doRead(size32_t len, void * ptr)
  47. {
  48. ensureAccessible(readOffset + len);
  49. memcpy(ptr, cur+readOffset, len);
  50. readOffset += len;
  51. }
  52. size32_t CThorContiguousRowBuffer::read(size32_t len, void * ptr)
  53. {
  54. doRead(len, ptr);
  55. return len;
  56. }
  57. size32_t CThorContiguousRowBuffer::readSize()
  58. {
  59. size32_t value;
  60. doRead(sizeof(value), &value);
  61. return value;
  62. }
  63. size32_t CThorContiguousRowBuffer::readPackedInt(void * ptr)
  64. {
  65. size32_t size = sizePackedInt();
  66. doRead(size, ptr);
  67. return size;
  68. }
  69. size32_t CThorContiguousRowBuffer::readUtf8(ARowBuilder & target, size32_t offset, size32_t fixedSize, size32_t len)
  70. {
  71. if (len == 0)
  72. return 0;
  73. size32_t size = sizeUtf8(len);
  74. byte * self = target.ensureCapacity(fixedSize + size, NULL);
  75. doRead(size, self+offset);
  76. return size;
  77. }
  78. size32_t CThorContiguousRowBuffer::readVStr(ARowBuilder & target, size32_t offset, size32_t fixedSize)
  79. {
  80. size32_t size = sizeVStr();
  81. byte * self = target.ensureCapacity(fixedSize + size, NULL);
  82. doRead(size, self+offset);
  83. return size;
  84. }
  85. size32_t CThorContiguousRowBuffer::readVUni(ARowBuilder & target, size32_t offset, size32_t fixedSize)
  86. {
  87. size32_t size = sizeVUni();
  88. byte * self = target.ensureCapacity(fixedSize + size, NULL);
  89. doRead(size, self+offset);
  90. return size;
  91. }
  92. size32_t CThorContiguousRowBuffer::sizePackedInt()
  93. {
  94. ensureAccessible(readOffset+1);
  95. return rtlGetPackedSizeFromFirst(cur[readOffset]);
  96. }
  97. size32_t CThorContiguousRowBuffer::sizeUtf8(size32_t len)
  98. {
  99. if (len == 0)
  100. return 0;
  101. //The len is the number of utf characters, size depends on which characters are included.
  102. size32_t nextOffset = readOffset;
  103. while (len)
  104. {
  105. ensureAccessible(nextOffset+1);
  106. size32_t maxOffset = maxAvailable();
  107. for (;nextOffset < maxOffset;)
  108. {
  109. nextOffset += readUtf8Size(cur+nextOffset); // This function only accesses the first byte
  110. if (--len == 0)
  111. break;
  112. }
  113. }
  114. return nextOffset - readOffset;
  115. }
  116. size32_t CThorContiguousRowBuffer::sizeVStr()
  117. {
  118. size32_t nextOffset = readOffset;
  119. for (;;)
  120. {
  121. ensureAccessible(nextOffset+1);
  122. size32_t maxOffset = maxAvailable();
  123. for (; nextOffset < maxOffset; nextOffset++)
  124. {
  125. if (cur[nextOffset] == 0)
  126. return (nextOffset + 1) - readOffset;
  127. }
  128. }
  129. }
  130. size32_t CThorContiguousRowBuffer::sizeVUni()
  131. {
  132. size32_t nextOffset = readOffset;
  133. const size32_t sizeOfUChar = 2;
  134. for (;;)
  135. {
  136. ensureAccessible(nextOffset+sizeOfUChar);
  137. size32_t maxOffset = maxAvailable();
  138. for (; nextOffset+1 < maxOffset; nextOffset += sizeOfUChar)
  139. {
  140. if (cur[nextOffset] == 0 && cur[nextOffset+1] == 0)
  141. return (nextOffset + sizeOfUChar) - readOffset;
  142. }
  143. }
  144. }
  145. void CThorContiguousRowBuffer::reportReadFail()
  146. {
  147. throwUnexpected();
  148. }
  149. const byte * CThorContiguousRowBuffer::peek(size32_t maxSize)
  150. {
  151. size32_t required = readOffset+maxSize;
  152. if (unlikely(required > maxAvailable()))
  153. peekBytesDirect(required);
  154. return cur + readOffset;
  155. }
  156. offset_t CThorContiguousRowBuffer::beginNested()
  157. {
  158. size32_t len = readSize();
  159. //Currently nested datasets are readahead by skipping the number of bytes in the datasets, rather than calling
  160. //beginNested(). If this function was ever called from readAhead() then it would need to call noteStartChild()
  161. //so that the self pointer is correct for the child rows
  162. return len+readOffset;
  163. }
  164. bool CThorContiguousRowBuffer::finishedNested(offset_t & endPos)
  165. {
  166. //See note above, if this was ever called from readAhead() then it would need to call noteFinishChild() and noteStartChild() if incomplete;
  167. return readOffset >= endPos;
  168. }
  169. void CThorContiguousRowBuffer::skip(size32_t size)
  170. {
  171. ensureAccessible(readOffset+size);
  172. readOffset += size;
  173. }
  174. void CThorContiguousRowBuffer::skipPackedInt()
  175. {
  176. size32_t size = sizePackedInt();
  177. ensureAccessible(readOffset+size);
  178. readOffset += size;
  179. }
  180. void CThorContiguousRowBuffer::skipUtf8(size32_t len)
  181. {
  182. size32_t size = sizeUtf8(len);
  183. ensureAccessible(readOffset+size);
  184. readOffset += size;
  185. }
  186. void CThorContiguousRowBuffer::skipVStr()
  187. {
  188. size32_t size = sizeVStr();
  189. ensureAccessible(readOffset+size);
  190. readOffset += size;
  191. }
  192. void CThorContiguousRowBuffer::skipVUni()
  193. {
  194. size32_t size = sizeVUni();
  195. ensureAccessible(readOffset+size);
  196. readOffset += size;
  197. }
  198. const byte * CThorContiguousRowBuffer::querySelf()
  199. {
  200. if (maxAvailable() == 0)
  201. peekBytesDirect(0);
  202. if (childStartOffsets.ordinality())
  203. return cur + childStartOffsets.tos();
  204. return cur;
  205. }
  206. void CThorContiguousRowBuffer::noteStartChild()
  207. {
  208. childStartOffsets.append(readOffset);
  209. }
  210. void CThorContiguousRowBuffer::noteFinishChild()
  211. {
  212. childStartOffsets.pop();
  213. }