gzip.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:3k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: gzip.c 271 2005-08-09 08:31:35Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #include "common.h"
  24. #undef ZLIB_DLL
  25. #include "gzip.h"
  26. #define ASCII_FLAG 0x01
  27. #define HEAD_CRC 0x02
  28. #define EXTRA_FIELD 0x04
  29. #define ORIG_NAME 0x08
  30. #define COMMENT 0x10
  31. #define RESERVED 0xE0
  32. void GZDone(gzreader* p)
  33. {
  34. inflateEnd(&p->Inflate);
  35. BufferClear(&p->Buffer);
  36. }
  37. static bool_t GZLoad(gzreader* p)
  38. {
  39. BufferStream(&p->Buffer,p->Stream);
  40. p->Inflate.next_in = p->Buffer.Data + p->Buffer.ReadPos;
  41. p->Inflate.avail_in = p->Buffer.WritePos - p->Buffer.ReadPos;
  42. return p->Inflate.avail_in > 0;
  43. }
  44. static int GZGetByte(gzreader* p)
  45. {
  46. if (!p->Inflate.avail_in && !GZLoad(p))
  47. return -1;
  48. p->Buffer.ReadPos++;
  49. p->Inflate.avail_in--;
  50. return *(p->Inflate.next_in++);
  51. }
  52. bool_t GZInit(gzreader* p,stream* Stream)
  53. {
  54. int Method,Flags,i;
  55. memset(p,0,sizeof(gzreader));
  56. p->Stream = Stream;
  57. BufferAlloc(&p->Buffer,4096,1);
  58. if (GZGetByte(p) != 0x1F || GZGetByte(p) != 0x8B)
  59. {
  60. BufferClear(&p->Buffer);
  61. return 0;
  62. }
  63. Method = GZGetByte(p);
  64. Flags = GZGetByte(p);
  65.     if (Method != Z_DEFLATED || (Flags & RESERVED) != 0)
  66. {
  67. BufferClear(&p->Buffer);
  68. return 0;
  69. }
  70.     for (i=0;i<6;++i)
  71. GZGetByte(p);
  72.     if (Flags & EXTRA_FIELD) 
  73. {
  74.         i = GZGetByte(p);
  75.         i += GZGetByte(p) << 8;
  76. while (i-- && GZGetByte(p)!=-1);
  77.     }
  78.     if (Flags & ORIG_NAME)
  79. while ((i = GZGetByte(p)) != -1 && i != 0);
  80.     if (Flags & COMMENT)
  81. while ((i = GZGetByte(p)) != -1 && i != 0);
  82.     if (Flags & HEAD_CRC)
  83. {
  84. GZGetByte(p);
  85. GZGetByte(p);
  86. }
  87.     return inflateInit2(&p->Inflate, -MAX_WBITS) == Z_OK;
  88. }
  89. int GZRead(gzreader* p,void* Data,int Length)
  90. {
  91.     p->Inflate.next_out = (Bytef*)Data;
  92.     p->Inflate.avail_out = Length;
  93.     while (p->Inflate.avail_out>0)
  94. {
  95. int i = inflate(&p->Inflate, Z_NO_FLUSH);
  96. p->Buffer.ReadPos = p->Buffer.WritePos - p->Inflate.avail_in;
  97. if (i==Z_STREAM_END)
  98. {
  99. Length -= p->Inflate.avail_out;
  100. break;
  101. }
  102. if (i<0)
  103. return -1;
  104. GZLoad(p);
  105. }
  106. return Length;
  107. }