/XADMaster.framework/Versions/A/Headers/CSInputBuffer.h

https://code.google.com/p/xee/ · C++ Header · 195 lines · 135 code · 55 blank · 5 comment · 8 complexity · 769bbf096c3a90f4f2e78c1c7cd68a3b MD5 · raw file

  1. #import <Foundation/Foundation.h>
  2. #import "CSHandle.h"
  3. typedef struct CSInputBuffer
  4. {
  5. CSHandle *parent;
  6. off_t startoffs;
  7. BOOL eof;
  8. uint8_t *buffer;
  9. unsigned int bufsize,bufbytes,currbyte;
  10. uint32_t bits;
  11. unsigned int numbits;
  12. } CSInputBuffer;
  13. // Allocation and management
  14. CSInputBuffer *CSInputBufferAlloc(CSHandle *parent,int size);
  15. CSInputBuffer *CSInputBufferAllocWithBuffer(const uint8_t *buffer,int length,off_t startoffs);
  16. CSInputBuffer *CSInputBufferAllocEmpty();
  17. void CSInputBufferFree(CSInputBuffer *self);
  18. void CSInputSetMemoryBuffer(CSInputBuffer *self,uint8_t *buffer,int length,off_t startoffs);
  19. // Buffer and file positioning
  20. void CSInputRestart(CSInputBuffer *self);
  21. void CSInputFlush(CSInputBuffer *self);
  22. void CSInputSynchronizeFileOffset(CSInputBuffer *self);
  23. void CSInputSeekToFileOffset(CSInputBuffer *self,off_t offset);
  24. void CSInputSeekToBufferOffset(CSInputBuffer *self,off_t offset);
  25. void CSInputSetStartOffset(CSInputBuffer *self,off_t offset);
  26. off_t CSInputBufferOffset(CSInputBuffer *self);
  27. off_t CSInputFileOffset(CSInputBuffer *self);
  28. off_t CSInputBufferBitOffset(CSInputBuffer *self);
  29. void _CSInputFillBuffer(CSInputBuffer *self);
  30. // Byte reading
  31. #define CSInputBufferLookAhead 4
  32. static inline void _CSInputBufferRaiseEOF(CSInputBuffer *self)
  33. {
  34. [self->parent _raiseEOF];
  35. }
  36. static inline int _CSInputBytesLeftInBuffer(CSInputBuffer *self)
  37. {
  38. return self->bufbytes-self->currbyte;
  39. }
  40. static inline void _CSInputCheckAndFillBuffer(CSInputBuffer *self)
  41. {
  42. if(!self->eof&&_CSInputBytesLeftInBuffer(self)<=CSInputBufferLookAhead) _CSInputFillBuffer(self);
  43. }
  44. static inline void CSInputSkipBytes(CSInputBuffer *self,int num)
  45. {
  46. self->currbyte+=num;
  47. }
  48. static inline int _CSInputPeekByteWithoutEOF(CSInputBuffer *self,int offs)
  49. {
  50. return self->buffer[self->currbyte+offs];
  51. }
  52. static inline int CSInputPeekByte(CSInputBuffer *self,int offs)
  53. {
  54. _CSInputCheckAndFillBuffer(self);
  55. if(offs>=_CSInputBytesLeftInBuffer(self)) _CSInputBufferRaiseEOF(self);
  56. return _CSInputPeekByteWithoutEOF(self,offs);
  57. }
  58. static inline int CSInputNextByte(CSInputBuffer *self)
  59. {
  60. int byte=CSInputPeekByte(self,0);
  61. CSInputSkipBytes(self,1);
  62. return byte;
  63. }
  64. static inline BOOL CSInputAtEOF(CSInputBuffer *self)
  65. {
  66. _CSInputCheckAndFillBuffer(self);
  67. return _CSInputBytesLeftInBuffer(self)<=0;
  68. }
  69. // Bitstream reading
  70. void _CSInputFillBits(CSInputBuffer *self);
  71. void _CSInputFillBitsLE(CSInputBuffer *self);
  72. unsigned int CSInputNextBit(CSInputBuffer *self);
  73. unsigned int CSInputNextBitLE(CSInputBuffer *self);
  74. unsigned int CSInputNextBitString(CSInputBuffer *self,int numbits);
  75. unsigned int CSInputNextBitStringLE(CSInputBuffer *self,int numbits);
  76. unsigned int CSInputNextLongBitString(CSInputBuffer *self,int numbits);
  77. unsigned int CSInputNextLongBitStringLE(CSInputBuffer *self,int numbits);
  78. void CSInputSkipBits(CSInputBuffer *self,int numbits);
  79. void CSInputSkipBitsLE(CSInputBuffer *self,int numbits);
  80. BOOL CSInputOnByteBoundary(CSInputBuffer *self);
  81. void CSInputSkipToByteBoundary(CSInputBuffer *self);
  82. void CSInputSkipTo16BitBoundary(CSInputBuffer *self);
  83. static inline unsigned int CSInputBitsLeftInBuffer(CSInputBuffer *self)
  84. {
  85. _CSInputCheckAndFillBuffer(self);
  86. return _CSInputBytesLeftInBuffer(self)*8+(self->numbits&7);
  87. }
  88. static inline void _CSInputCheckAndFillBits(CSInputBuffer *self,int numbits)
  89. {
  90. if(numbits>self->numbits) _CSInputFillBits(self);
  91. }
  92. static inline void _CSInputCheckAndFillBitsLE(CSInputBuffer *self,int numbits)
  93. {
  94. if(numbits>self->numbits) _CSInputFillBitsLE(self);
  95. }
  96. static inline unsigned int CSInputPeekBitString(CSInputBuffer *self,int numbits)
  97. {
  98. if(numbits==0) return 0;
  99. _CSInputCheckAndFillBits(self,numbits);
  100. return self->bits>>(32-numbits);
  101. }
  102. static inline unsigned int CSInputPeekBitStringLE(CSInputBuffer *self,int numbits)
  103. {
  104. if(numbits==0) return 0;
  105. _CSInputCheckAndFillBitsLE(self,numbits);
  106. return self->bits&((1<<numbits)-1);
  107. }
  108. static inline void CSInputSkipPeekedBits(CSInputBuffer *self,int numbits)
  109. {
  110. int numbytes=(numbits-(self->numbits&7)+7)>>3;
  111. CSInputSkipBytes(self,numbytes);
  112. if(_CSInputBytesLeftInBuffer(self)<0) _CSInputBufferRaiseEOF(self);
  113. self->bits<<=numbits;
  114. self->numbits-=numbits;
  115. }
  116. static inline void CSInputSkipPeekedBitsLE(CSInputBuffer *self,int numbits)
  117. {
  118. int numbytes=(numbits-(self->numbits&7)+7)>>3;
  119. CSInputSkipBytes(self,numbytes);
  120. if(_CSInputBytesLeftInBuffer(self)<0) _CSInputBufferRaiseEOF(self);
  121. self->bits>>=numbits;
  122. self->numbits-=numbits;
  123. }
  124. // Multibyte reading
  125. #define CSInputNextValueImpl(type,name,conv) \
  126. static inline type name(CSInputBuffer *self) \
  127. { \
  128. _CSInputCheckAndFillBuffer(self); \
  129. type val=conv(self->buffer+self->currbyte); \
  130. CSInputSkipBytes(self,sizeof(type)); \
  131. return val; \
  132. }
  133. CSInputNextValueImpl(int16_t,CSInputNextInt16LE,CSInt16LE)
  134. CSInputNextValueImpl(int32_t,CSInputNextInt32LE,CSInt32LE)
  135. CSInputNextValueImpl(uint16_t,CSInputNextUInt16LE,CSUInt16LE)
  136. CSInputNextValueImpl(uint32_t,CSInputNextUInt32LE,CSUInt32LE)
  137. CSInputNextValueImpl(int16_t,CSInputNextInt16BE,CSInt16BE)
  138. CSInputNextValueImpl(int32_t,CSInputNextInt32BE,CSInt32BE)
  139. CSInputNextValueImpl(uint16_t,CSInputNextUInt16BE,CSUInt16BE)
  140. CSInputNextValueImpl(uint32_t,CSInputNextUInt32BE,CSUInt32BE)