InputStream.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /* Copyright (C) Teemu Suutari */
  2. #include "InputStream.hpp"
  3. // for exceptions
  4. #include "Decompressor.hpp"
  5. #include "common/OverflowCheck.hpp"
  6. namespace ancient::internal
  7. {
  8. ForwardInputStream::ForwardInputStream(const Buffer &buffer,size_t startOffset,size_t endOffset,bool allowOverrun) :
  9. _bufPtr(buffer.data()),
  10. _currentOffset(startOffset),
  11. _endOffset(endOffset),
  12. _allowOverrun(allowOverrun)
  13. {
  14. if (_currentOffset>_endOffset || _currentOffset>buffer.size() || _endOffset>buffer.size()) throw Decompressor::DecompressionError();
  15. }
  16. ForwardInputStream::~ForwardInputStream()
  17. {
  18. // nothing needed
  19. }
  20. uint8_t ForwardInputStream::readByte()
  21. {
  22. if (_currentOffset>=_endOffset)
  23. {
  24. if (_allowOverrun)
  25. {
  26. _currentOffset++;
  27. return 0;
  28. }
  29. throw Decompressor::DecompressionError();
  30. }
  31. uint8_t ret=_bufPtr[_currentOffset++];
  32. if (_linkedInputStream) _linkedInputStream->setOffset(_currentOffset);
  33. return ret;
  34. }
  35. const uint8_t *ForwardInputStream::consume(size_t bytes,uint8_t *buffer)
  36. {
  37. if (OverflowCheck::sum(_currentOffset,bytes)>_endOffset)
  38. {
  39. if (_allowOverrun && buffer)
  40. {
  41. for (size_t i=0;i<bytes;i++)
  42. {
  43. buffer[i]=(_currentOffset<_endOffset)?_bufPtr[_currentOffset]:0;
  44. _currentOffset++;
  45. }
  46. return buffer;
  47. }
  48. throw Decompressor::DecompressionError();
  49. }
  50. const uint8_t *ret=&_bufPtr[_currentOffset];
  51. _currentOffset+=bytes;
  52. if (_linkedInputStream) _linkedInputStream->setOffset(_currentOffset);
  53. return ret;
  54. }
  55. BackwardInputStream::BackwardInputStream(const Buffer &buffer,size_t startOffset,size_t endOffset,bool allowOverrun) :
  56. _bufPtr(buffer.data()),
  57. _currentOffset(endOffset),
  58. _endOffset(startOffset),
  59. _allowOverrun(allowOverrun)
  60. {
  61. if (_currentOffset<_endOffset || _currentOffset>buffer.size() || _endOffset>buffer.size()) throw Decompressor::DecompressionError();
  62. }
  63. BackwardInputStream::~BackwardInputStream()
  64. {
  65. // nothing needed
  66. }
  67. uint8_t BackwardInputStream::readByte()
  68. {
  69. if (_currentOffset<=_endOffset)
  70. {
  71. if (_allowOverrun)
  72. {
  73. --_currentOffset;
  74. return 0;
  75. }
  76. throw Decompressor::DecompressionError();
  77. }
  78. uint8_t ret=_bufPtr[--_currentOffset];
  79. if (_linkedInputStream) _linkedInputStream->setOffset(_currentOffset);
  80. return ret;
  81. }
  82. const uint8_t *BackwardInputStream::consume(size_t bytes,uint8_t *buffer)
  83. {
  84. if (_currentOffset<OverflowCheck::sum(_endOffset,bytes))
  85. {
  86. if (_allowOverrun && buffer)
  87. {
  88. for (size_t i=bytes;i;i--)
  89. {
  90. buffer[i-1]=(_currentOffset>_endOffset)?_bufPtr[_currentOffset-1]:0;
  91. --_currentOffset;
  92. }
  93. return buffer;
  94. }
  95. throw Decompressor::DecompressionError();
  96. }
  97. _currentOffset-=bytes;
  98. if (_linkedInputStream) _linkedInputStream->setOffset(_currentOffset);
  99. return &_bufPtr[_currentOffset];
  100. }
  101. }