Subversion Repositories autosfx

Rev

Blame | Last modification | View Log | RSS feed

  1. #ifndef UnzInfH
  2. #define UnzInfH
  3. /*
  4.  
  5. Copyright (c) 1990-2007 Info-ZIP.  All rights reserved.
  6.  
  7. See the accompanying file LICENSE, version 2007-Mar-4 or later
  8. (the contents of which are also included in zip.h) for terms of use.
  9. If, for some reason, all these files are missing, the Info-ZIP license
  10. also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html
  11.  
  12. parts Copyright (C) 1997 Mike White, Eric W. Engler
  13.  ************************************************************************
  14. Copyright (C) 2009, 2010  by Russell J. Peters, Roger Aelbrecht
  15.  
  16. This file is part of TZipMaster Version 1.9.
  17.  
  18. TZipMaster is free software: you can redistribute it and/or modify
  19. it under the terms of the GNU Lesser General Public License as published by
  20. the Free Software Foundation, either version 3 of the License, or
  21. (at your option) any later version.
  22.  
  23. TZipMaster is distributed in the hope that it will be useful,
  24. but WITHOUT ANY WARRANTY; without even the implied warranty of
  25. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  26. GNU Lesser General Public License for more details.
  27.  
  28. You should have received a copy of the GNU Lesser General Public License
  29. along with TZipMaster.  If not, see <http://www.gnu.org/licenses/>.
  30.  
  31. contact: problems@delphizip.org (include ZipMaster in the subject).
  32. updates: http://www.delphizip.org
  33. DelphiZip maillist subscribe at http://www.freelists.org/list/delphizip
  34.  *********************************************************************** */
  35. #include "dzoper.h"
  36. #include "unzsup.h"
  37. #include "crypt.h"
  38.  
  39. #define INBUFSIZ  0x8000L // larger buffers for real OSes
  40.  
  41. // #ifndef WSIZE                   /* default is 32K */
  42. #    define UWSIZE   65536L       // 64K for Inflate64
  43. #  define wsize UWSIZE           /* wsize is a constant */
  44.  
  45. #define OUTBUFSIZ   0x8000      // EWE: 32K (for unshrink.c)
  46. typedef int shrint;
  47.  
  48. extern const ush mask_bits[];
  49.  
  50. /* Huffman code lookup table entry--this entry is four bytes for machines
  51.  * that have 16-bit pointers (e.g. PC's in the small or medium model).
  52.  * Valid extra bits are 0..13.  e == 15 is EOB (end of block), e == 16
  53.  * means that v is a literal, 16 < e < 32 means that v is a pointer to
  54.  * the next table, which codes e - 16 bits, and lastly e == 99 indicates
  55.  * an unused code.  If a code with e == 99 is looked up, this implies an
  56.  * error in the data. */
  57.  
  58. #pragma pack(push, 4)
  59.  
  60. struct huft
  61. {
  62.         uch e; /* number of extra bits or operation */
  63.         uch b;
  64.         /* number of bits in this code or subcode */
  65.         union
  66.         {
  67.                 ush n; /* literal, length base, or distance base */
  68.                 struct huft *t; /* pointer to next level of table */
  69.         }
  70.  
  71.         v;
  72. };
  73. #pragma pack(pop)
  74.  
  75. #pragma pack(push, 1)
  76. typedef struct local_file_header
  77. { /* LOCAL */
  78.         uch version_needed_to_extract[2];
  79.         ush general_purpose_bit_flag;
  80.         ush compression_method;
  81.         ush last_mod_file_time;
  82.         ush last_mod_file_date;
  83.         ulg crc32;
  84.         ZInt64 csize;
  85.         ZInt64 ucsize;
  86.         ush filename_length;
  87.         ush extra_field_length;
  88. }local_file_hdr;
  89. #pragma pack(pop)
  90.  
  91. #define CRCVAL_INITIAL  0L
  92.  
  93. class UnzInf : public UnzSup
  94. {
  95. private:
  96.         UnzInf(void);
  97.         UnzInf(const UnzInf&);
  98.         UnzInf& operator = (const UnzInf&);
  99.  
  100. protected:
  101.         int fP_flag; /* -P: give password on command line (ARGH!) */
  102.         int fnopwd; /* crypt static */
  103.         const char *fkey; /* crypt static: decryption password or NULL */
  104.         DZStrA fpwdarg;
  105.         uch Slide[UWSIZE]; /* explode(), inflate(), unreduce() */
  106.  
  107.         unsigned fhufts; /* track memory usage */
  108.  
  109.         struct huft *ffixed_tl; /* inflate static */
  110.         struct huft *ffixed_td; /* inflate static */
  111.         int ffixed_bl; /* inflate static */
  112.         int ffixed_bd; /* inflate static */
  113.         struct huft *ffixed_tl64; /* inflate static */
  114.         struct huft *ffixed_td64; /* inflate static */
  115.         unsigned ffixed_bl64, ffixed_bd64; /* inflate static */
  116.         struct huft *ffixed_tl32; /* inflate static */
  117.         struct huft *ffixed_td32; /* inflate static */
  118.         unsigned ffixed_bl32, ffixed_bd32; /* inflate static */
  119.         const ush *fcplens; /* inflate static */
  120.         const uch *fcplext; /* inflate static */
  121.         const uch *fcpdext; /* inflate static */
  122.         unsigned fwp; /* inflate static: current position in slide */
  123.         ulg fbb; /* inflate static: bit buffer */
  124.         unsigned fbk; /* inflate static: bits in bit buffer */
  125.         local_file_hdr flrec; /* used in unzip.c, extract.c */
  126.         int fPwdReqCount;
  127.         int fnewzip;
  128.  
  129.         /* used in extract.c, crypt.c, zipinfo.c */
  130. public:
  131.         UnzInf(const DllCommands *C);
  132.         ~UnzInf(void);
  133.         int inflate(bool defl64);
  134.         int inflate_free(void);
  135.         int explode(void);
  136.  
  137. protected:
  138.         int decrypt(ulg crc);
  139.  
  140. private:
  141.         int inflate_codes(struct huft *tl, struct huft *td, int bl, int bd);
  142.         int huft_build(unsigned *b, unsigned n, unsigned s, const ush * d,
  143.                 const uch * e, struct huft **t, int *m);
  144.         int inflate_stored(void);
  145.         int inflate_fixed(void);
  146.         int inflate_dynamic(void);
  147.         int inflate_block(int *e);
  148.         int get_tree(unsigned * l, unsigned n);
  149.         int explode_lit8(struct huft * tb, struct huft * tl, struct huft * td,
  150.                 int bb, int bl, int bd);
  151.         int explode_lit4(struct huft * tb, struct huft * tl, struct huft * td,
  152.                 int bb, int bl, int bd);
  153.         int explode_nolit8(struct huft * tl, struct huft * td, int bl, int bd);
  154.         int explode_nolit4(struct huft * tl, struct huft * td, int bl, int bd);
  155.         int testkey(const char *h, const char *key, ulg crc);
  156. };
  157.  
  158. int huft_free(struct huft * t);
  159. #endif
  160.