Advertisement
Guest User

Untitled

a guest
May 20th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.99 KB | None | 0 0
  1. typedef struct {
  2. u16 deflatedSize; // compressed size
  3. u16 inflatedSize; // uncompressed size
  4. z_stream zstream;
  5. char* inBuffer;
  6. char* outBuffer;
  7. char* outStart;
  8. u32 cursor;
  9. } SrGzipStream;
  10.  
  11.  
  12. SISTERRAY_API void srGzipStreamOpen(SrGzipStream* stream, const char* src, size_t srcSize, size_t dstSize) {
  13. memset(stream, 0, sizeof(*stream));
  14. stream->inBuffer = (char*)malloc(CHUNK);
  15. stream->outBuffer = (char*)malloc(CHUNK);
  16. stream->deflatedSize = srcSize;
  17. stream->inflatedSize = dstSize;
  18. stream->zstream.zalloc = Z_NULL;
  19. stream->zstream.zfree = Z_NULL;
  20. stream->zstream.opaque = Z_NULL;
  21. stream->zstream.avail_in = CHUNK;
  22. if (stream->zstream.avail_in > stream->deflatedSize)
  23. stream->zstream.avail_in = stream->deflatedSize;
  24. stream->zstream.next_in = (Bytef *)stream->inBuffer;
  25. stream->cursor = stream->zstream.avail_in;
  26. memcpy(stream->inBuffer, src, stream->zstream.avail_in); //read in the first section of the file for decompression according to avail-in
  27. stream->zstream.avail_out = CHUNK;
  28. stream->zstream.next_out = (Bytef *)stream->outBuffer;
  29. stream->outStart = stream->outBuffer;
  30. inflateInit2(&stream->zstream, 31);
  31. }
  32.  
  33.  
  34. SISTERRAY_API size_t srGzipDecompress(FILE* file, char* src, size_t srcSize, char* dst, size_t dstSize) {
  35. /*Initialize the stream object used for decompression*/
  36. SrGzipStream* stream = new SrGzipStream;
  37. srGzipStreamOpen(stream, src, srcSize, dstSize);
  38.  
  39. size_t readLength;
  40. size_t avail;
  41. size_t remain;
  42.  
  43. readLength = 0;
  44. remain = size;
  45.  
  46. if (size == 0)
  47. return 0;
  48.  
  49. for (;;) {
  50. /* If data is present in the output buffer, use it */
  51. if (stream->zstream.avail_out < CHUNK) {
  52. avail = CHUNK - stream->zstream.avail_out;
  53. if (remain < avail)
  54. avail = remain;
  55. memcpy(dst + readLength, stream->outStart, avail);
  56. readLength += avail;
  57. remain -= avail;
  58. stream->outStart += avail;
  59. stream->zstream.avail_out += avail;
  60.  
  61. if (remain == 0)
  62. break;
  63. }
  64.  
  65. /* Output buffer is empty, reset it */
  66. stream->outStart = stream->outBuffer;
  67. stream->zstream.next_out = (Bytef*)stream->outBuffer;
  68. stream->zstream.avail_out = CHUNK;
  69.  
  70. if (stream->zstream.avail_in == 0) {
  71. /* Input buffer is empty, refill it */
  72. avail = CHUNK;
  73. if (stream->cursor + avail > stream->deflatedSize)
  74. avail = stream->deflatedSize - stream->cursor;
  75.  
  76. /* If all buffers are empty, then we reached EOF */
  77. if (avail == 0)
  78. break;
  79.  
  80. avail = fread(stream->inBuffer, avail, 1, stream->file);
  81. stream->zstream.avail_in = avail;
  82. stream->zstream.next_in = (Bytef*)stream->inBuffer;
  83. stream->cursor += avail;
  84. }
  85.  
  86. inflate(&stream->zstream, Z_NO_FLUSH);
  87. }
  88. return readLength;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement