clzhcompress.cpp
上传用户:jinandeyu
上传日期:2007-01-05
资源大小:620k
文件大小:18k
源码类别:

远程控制编程

开发平台:

WINDOWS

  1. /*  Back Orifice 2000 - Remote Administration Suite
  2.     Copyright (C) 1999, Cult Of The Dead Cow
  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.     This program is distributed in the hope that it will be useful,
  8.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.     GNU General Public License for more details.
  11.     You should have received a copy of the GNU General Public License
  12.     along with this program; if not, write to the Free Software
  13.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  14. The author of this program may be contacted at dildog@l0pht.com. */
  15. #include<windows.h>
  16. #include<limits.h>
  17. #include<lzhcompress.h>
  18. void CLzhCompress::InitTree(void)  /* initialize trees */
  19. {
  20.     short  i;
  21.     for (i = N + 1; i <= N + 256; i++)
  22.         rson[i] = NIL;        /* root */
  23.     for (i = 0; i < N; i++)
  24.         dad[i] = NIL;         /* node */
  25. }
  26. void CLzhCompress::InsertNode(short r)  /* insert to tree */
  27. {
  28.     short  i, p, cmp;
  29.     unsigned char  *key;
  30.     unsigned c;
  31.     cmp = 1;
  32.     key = &text_buf[r];
  33.     p = N + 1 + key[0];
  34.     rson[r] = lson[r] = NIL;
  35.     match_length = 0;
  36.     for(;;) {
  37.         if (cmp >= 0) {
  38.             if (rson[p] != NIL)
  39.                 p = rson[p];
  40.             else {
  41.                 rson[p] = r;
  42.                 dad[r] = p;
  43.                 return;
  44.             }
  45.         } else {
  46.             if (lson[p] != NIL)
  47.                 p = lson[p];
  48.             else {
  49.                 lson[p] = r;
  50.                 dad[r] = p;
  51.                 return;
  52.             }
  53.         }
  54.         for (i = 1; i < F; i++)
  55.             if ((cmp = key[i] - text_buf[p + i]) != 0)
  56.                 break;
  57. if (i > THRESHOLD) {
  58. if (i > match_length) {
  59. match_position = ((r - p) & (N - 1)) - 1;
  60. if ((match_length = i) >= F)
  61. break;
  62. }
  63. if (i == match_length) {
  64. if ((c = ((r - p) & (N-1)) - 1) < (WORD)match_position) {
  65. match_position = c;
  66. }
  67. }
  68. }
  69.     }
  70.     dad[r] = dad[p];
  71.     lson[r] = lson[p];
  72.     rson[r] = rson[p];
  73.     dad[lson[p]] = r;
  74.     dad[rson[p]] = r;
  75.     if (rson[dad[p]] == p)
  76.         rson[dad[p]] = r;
  77.     else
  78.         lson[dad[p]] = r;
  79.     dad[p] = NIL; /* remove p */
  80. }
  81. void CLzhCompress::DeleteNode(short p)  /* remove from tree */
  82. {
  83.     short  q;
  84.     if (dad[p] == NIL)
  85.         return;         /* not registered */
  86.     if (rson[p] == NIL)
  87.         q = lson[p];
  88.     else {
  89. if (lson[p] == NIL)
  90. q = rson[p];
  91. else {
  92. q = lson[p];
  93. if (rson[q] != NIL) {
  94. do {
  95. q = rson[q];
  96. } while (rson[q] != NIL);
  97. rson[dad[q]] = lson[q];
  98. dad[lson[q]] = dad[q];
  99. lson[q] = lson[p];
  100. dad[lson[p]] = q;
  101. }
  102. rson[q] = rson[p];
  103. dad[rson[p]] = q;
  104. }
  105. }
  106. dad[q] = dad[p];
  107. if (rson[dad[p]] == p)
  108. rson[dad[p]] = q;
  109. else
  110. lson[dad[p]] = q;
  111. dad[p] = NIL;
  112. }
  113. /* Huffman coding */
  114. /* table for encoding and decoding the upper 6 bits of position */
  115. /* for encoding */
  116. BYTE p_len[64] = {
  117.     0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05,
  118. 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06,
  119. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  120. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  121. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  122. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  123. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  124. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08
  125. };
  126. BYTE p_code[64] = {
  127.     0x00, 0x20, 0x30, 0x40, 0x50, 0x58, 0x60, 0x68,
  128. 0x70, 0x78, 0x80, 0x88, 0x90, 0x94, 0x98, 0x9C,
  129. 0xA0, 0xA4, 0xA8, 0xAC, 0xB0, 0xB4, 0xB8, 0xBC,
  130. 0xC0, 0xC2, 0xC4, 0xC6, 0xC8, 0xCA, 0xCC, 0xCE,
  131. 0xD0, 0xD2, 0xD4, 0xD6, 0xD8, 0xDA, 0xDC, 0xDE,
  132. 0xE0, 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEC, 0xEE,
  133. 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
  134. 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
  135. };
  136. /* for decoding */
  137. BYTE d_code[256] = {
  138.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  139. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  140. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  141. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  142. 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  143. 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  144. 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
  145. 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
  146. 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
  147. 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
  148. 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
  149. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  150. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  151. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  152. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  153. 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
  154. 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
  155. 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
  156. 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D,
  157. 0x0E, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F,
  158. 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11,
  159. 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13,
  160. 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15,
  161. 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17,
  162. 0x18, 0x18, 0x19, 0x19, 0x1A, 0x1A, 0x1B, 0x1B,
  163. 0x1C, 0x1C, 0x1D, 0x1D, 0x1E, 0x1E, 0x1F, 0x1F,
  164. 0x20, 0x20, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23,
  165. 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27,
  166. 0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B,
  167. 0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F,
  168. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
  169. 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
  170. };
  171. BYTE d_len[256] = {
  172.     0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
  173. 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
  174. 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
  175. 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
  176. 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
  177. 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
  178. 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
  179. 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
  180. 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
  181. 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
  182. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  183. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  184. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  185. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  186. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  187. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  188. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  189. 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
  190. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  191. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  192. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  193. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  194. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  195. 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
  196. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  197. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  198. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  199. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  200. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  201. 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
  202. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  203. 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  204. };
  205. WORD CLzhCompress::GetBit(void)    /* get one bit */
  206. {
  207.     WORD i;
  208.     while (getlen <= 8) {
  209.         if ((i = fnc_getc())==0xFFFF) i = 0;
  210.         getbuf |= i << (8 - getlen);
  211.         getlen += 8;
  212.     }
  213.     i = getbuf;
  214.     getbuf <<= 1;
  215.     getlen--;
  216.     return ((i & 0x8000) >> 15);
  217. }
  218. WORD CLzhCompress::GetByte(void)   /* get one byte */
  219. {
  220.     WORD i;
  221.     while (getlen <= 8) {
  222.         if ((i = fnc_getc())==0xFFFF) i = 0;
  223.         getbuf |= i << (8 - getlen);
  224.         getlen += 8;
  225.     }
  226.     i = getbuf;
  227.     getbuf <<= 8;
  228.     getlen -= 8;
  229.     return ((i & 0xff00) >> 8);
  230. }
  231. void CLzhCompress::Putcode(short l, WORD c)     /* output c bits of code */
  232. {
  233.     putbuf |= c >> putlen;
  234.     if ((putlen += l) >= 8) {
  235.         if(fnc_putc(putbuf >> 8)==-1) return;
  236.         
  237.         if((putlen -= 8) >= 8) {
  238.             if(fnc_putc(putbuf)==-1) return;
  239.       
  240.             codesize += 2;
  241.             putlen -= 8;
  242.             putbuf = c << (l - putlen);
  243.         } else {
  244.             putbuf <<= 8;
  245.             codesize++;
  246.         }
  247.     }
  248. }
  249. /* initialization of tree */
  250. void CLzhCompress::StartHuff(void)
  251. {
  252.     short i, j;
  253.     for (i = 0; i < N_CHAR; i++) {
  254.         freq[i] = 1;
  255.         son[i] = i + T;
  256.         prnt[i + T] = i;
  257.     }
  258.     i = 0; j = N_CHAR;
  259.     while (j <= R) {
  260.         freq[j] = freq[i] + freq[i + 1];
  261.         son[j] = i;
  262.         prnt[i] = prnt[i + 1] = j;
  263.         i += 2; j++;
  264.     }
  265.     freq[T] = 0xffff;
  266.     prnt[R] = 0;
  267. }
  268. /* reconstruction of tree */
  269. void CLzhCompress::reconst(void)
  270. {
  271.     short i, j, k;
  272.     WORD f, l;
  273.     /* collect leaf nodes in the first half of the table */
  274.     /* and replace the freq by (freq + 1) / 2. */
  275.     j = 0;
  276.     for (i = 0; i < T; i++) {
  277.         if (son[i] >= T) {
  278.             freq[j] = (freq[i] + 1) / 2;
  279.             son[j] = son[i];
  280.             j++;
  281.         }
  282.     }
  283.     /* begin constructing tree by connecting sons */
  284.     for (i = 0, j = N_CHAR; j < T; i += 2, j++) {
  285.         k = i + 1;
  286.         f = freq[j] = freq[i] + freq[k];
  287.         for (k = j - 1; f < freq[k]; k--);
  288.         k++;
  289.         l = (j - k) * 2;
  290.         memmove(&freq[k + 1], &freq[k], l);
  291.         freq[k] = f;
  292.         memmove(&son[k + 1], &son[k], l);
  293.         son[k] = i;
  294.     }
  295.     /* connect prnt */
  296.     for (i = 0; i < T; i++) {
  297.         if ((k = son[i]) >= T) {
  298.             prnt[k] = i;
  299.         } else {
  300.             prnt[k] = prnt[k + 1] = i;
  301.         }
  302.     }
  303. }
  304. /* increment frequency of given code by one, and update tree */
  305. void CLzhCompress::update(short c)
  306. {
  307.     short i, j, k, l;
  308.     if (freq[R] == MAX_FREQ) {
  309.         reconst();
  310.     }
  311.     c = prnt[c + T];
  312.     do {
  313.         k = ++freq[c];
  314.         /* if the order is disturbed, exchange nodes */
  315.         if ((WORD)k > freq[l = c + 1]) {
  316.             while ((WORD)k > freq[++l]);
  317.             l--;
  318.             freq[c] = freq[l];
  319.             freq[l] = k;
  320.             i = son[c];
  321.             prnt[i] = l;
  322.             if (i < T) prnt[i + 1] = l;
  323.             j = son[l];
  324.             son[l] = i;
  325.             prnt[j] = c;
  326.             if (j < T) prnt[j + 1] = c;
  327.             son[c] = j;
  328.             c = l;
  329.         }
  330.     } while ((c = prnt[c]) != 0); /* repeat up to root */
  331. }
  332. void CLzhCompress::EncodeChar(WORD c)
  333. {
  334.     WORD i;
  335.     short j, k;
  336.     i = 0;
  337.     j = 0;
  338.     k = prnt[c + T];
  339.     /* travel from leaf to root */
  340.     do {
  341.         i >>= 1;
  342.         /* if node's address is odd-numbered, choose bigger brother node */
  343.         if (k & 1) i += 0x8000;
  344.         j++;
  345.     } while ((k = prnt[k]) != R);
  346.     Putcode(j, i);
  347.     code = i;
  348.     len = j;
  349.     update(c);
  350. }
  351. void CLzhCompress::EncodePosition(WORD c)
  352. {
  353.     WORD i;
  354.     /* output upper 6 bits by table lookup */
  355.     i = c >> 6;
  356.     Putcode(p_len[i], (WORD)p_code[i] << 8);
  357.     /* output lower 6 bits verbatim */
  358.     Putcode(6, (c & 0x3f) << 10);
  359. }
  360. void CLzhCompress::EncodeEnd(void)
  361. {
  362.     if (putlen) {
  363.         if (fnc_putc(putbuf >> 8) == -1) {
  364. return;
  365.         }
  366.         codesize++;
  367.     }
  368. }
  369. short CLzhCompress::DecodeChar(void)
  370. {
  371.     WORD c;
  372.     c = son[R];
  373.     /* travel from root to leaf, */
  374.     /* choosing the smaller child node (son[]) if the read bit is 0, */
  375.     /* the bigger (son[]+1} if 1 */
  376.     while (c < T) {
  377.         c += GetBit();
  378.         c = son[c];
  379.     }
  380.     c -= T;
  381.     update(c);
  382.     return (short)c;
  383. }
  384. short CLzhCompress::DecodePosition(void)
  385. {
  386.     WORD i, j, c;
  387.     /* recover upper 6 bits from table */
  388.     i = GetByte();
  389.     c = (WORD)d_code[i] << 6;
  390.     j = d_len[i];
  391.     /* read lower 6 bits verbatim */
  392.     j -= 2;
  393.     while (j--) {
  394.         i = (i << 1) + GetBit();
  395.     }
  396.     return (short)(c | (i & 0x3f));
  397. }
  398. /* compression */
  399. void CLzhCompress::Encode(void)  /* compression */
  400. {
  401.     short  i, c, len, r, s, last_match_length;
  402. codesize=0;
  403.     fnc_putc((BYTE)(textsize & 0xff));
  404.     fnc_putc((BYTE)((textsize & 0xff00) >> 8));
  405.     fnc_putc((BYTE)((textsize & 0xff0000L) >> 16));
  406.     fnc_putc((BYTE)((textsize & 0xff000000L) >> 24));
  407.     
  408. if (textsize == 0)
  409.         return;
  410.     textsize = 0;           /* rewind and re-read */
  411.     StartHuff();
  412.     InitTree();
  413.     s = 0;
  414.     r = N - F;
  415.     for (i = s; i < r; i++)
  416.         text_buf[i] = 0x20;
  417.     for (len = 0; len < F && ((c = fnc_getc()) != -1); len++)
  418.         text_buf[r + len] = (unsigned char)c;
  419.     textsize = len;
  420.     for (i = 1; i <= F; i++)
  421.         InsertNode(r - i);
  422.     InsertNode(r);
  423.     do {
  424.         if (match_length > len)
  425.             match_length = len;
  426.         if (match_length <= THRESHOLD) {
  427.             match_length = 1;
  428.             EncodeChar(text_buf[r]);
  429.         } else {
  430.             EncodeChar(255 - THRESHOLD + match_length);
  431.             EncodePosition(match_position);
  432.         }
  433.         last_match_length = match_length;
  434.         for (i = 0; i < last_match_length &&
  435. ((c = fnc_getc()) != -1); i++) {
  436.             DeleteNode(s);
  437.             text_buf[s] = (unsigned char)c;
  438.             if (s < F - 1)
  439.                 text_buf[s + N] = (unsigned char)c;
  440.             s = (s + 1) & (N - 1);
  441.             r = (r + 1) & (N - 1);
  442.             InsertNode(r);
  443.         }
  444.         while (i++ < last_match_length) {
  445.             DeleteNode(s);
  446.             s = (s + 1) & (N - 1);
  447.             r = (r + 1) & (N - 1);
  448.             if (--len) InsertNode(r);
  449.         }
  450.     } while (len > 0);
  451.     EncodeEnd();
  452. }
  453. void CLzhCompress::Decode(void)  /* recover */
  454. {
  455.     short  i, j, k, r, c;
  456.     unsigned long int  count;
  457.     codesize=0;
  458. textsize = (fnc_getc());
  459.     textsize |= (((unsigned long)fnc_getc()) << 8);
  460.     textsize |= (((unsigned long)fnc_getc()) << 16);
  461.     textsize |= (((unsigned long)fnc_getc()) << 24);
  462.     
  463. if (textsize == 0)
  464.         return;
  465.     StartHuff();
  466.     for (i = 0; i < N - F; i++)
  467.         text_buf[i] = 0x20;
  468.     r = N - F;
  469.     for (count = 0; count < textsize; ) {
  470.         c = DecodeChar();
  471.         if (c < 256) {
  472.             if(fnc_putc(c)==-1) {
  473.                 return;
  474.             }
  475.             text_buf[r++] = (unsigned char)c;
  476.             r &= (N - 1);
  477.             count++;
  478.         } else {
  479.             i = (r - DecodePosition() - 1) & (N - 1);
  480.             j = c - 255 + THRESHOLD;
  481.             for (k = 0; k < j; k++) {
  482.                 c = text_buf[(i + k) & (N - 1)];
  483.                 if(fnc_putc(c)==-1) {
  484.                     return;
  485.                 }
  486.                 text_buf[r++] = (unsigned char)c;
  487.                 r &= (N - 1);
  488.                 count++;
  489.             }
  490.         }
  491.         
  492.     }
  493. }
  494. int CLzhCompress::fnc_read_file(BYTE *pBuffer, int nLen)
  495. {
  496. DWORD dwBytes;
  497. dwBytes=0;
  498. ReadFile(hFileIn,pBuffer,nLen,&dwBytes,NULL);
  499. return dwBytes;
  500. }
  501. int CLzhCompress::fnc_write_file(BYTE *pBuffer, int nLen)
  502. {
  503. DWORD dwBytes;
  504. dwBytes=0;
  505. WriteFile(hFileOut,pBuffer,nLen,&dwBytes,NULL);
  506. return dwBytes;
  507. }
  508. int CLzhCompress::fnc_read_memory(BYTE *pBuffer, int nLen)
  509. {
  510. int nCount;
  511. nCount=nLen;
  512. if((nCount+nMemInOff)>nMemInSize)
  513. nCount=nMemInSize-nMemInOff;
  514. memcpy(pBuffer,pMemIn+nMemInOff,nCount);
  515. nMemInOff+=nCount;
  516. return nCount;
  517. }
  518. int CLzhCompress::fnc_write_memory(BYTE *pBuffer, int nLen)
  519. {
  520. int nCount;
  521. nCount=nLen;
  522. if((nCount+nMemOutOff)>nMemOutSize)
  523. nCount=nMemOutSize-nMemOutOff;
  524. memcpy(pMemOut+nMemOutOff,pBuffer,nCount);
  525. nMemOutOff+=nCount;
  526. return nCount;
  527. }
  528. int CLzhCompress::fnc_write(BYTE *ptr, int len)
  529. {
  530. if(freeze_type==0)
  531. return fnc_write_file(ptr,len);
  532. else if(freeze_type==1)
  533. return fnc_write_memory(ptr,len);
  534. return 0;
  535. }
  536. int CLzhCompress::fnc_read(BYTE *ptr, int len)
  537. {
  538. if(freeze_type==0)
  539. return fnc_read_file(ptr,len);
  540. else if(freeze_type==1)
  541. return fnc_read_memory(ptr,len);
  542. return 0;
  543. }
  544. int CLzhCompress::fnc_getc(void)
  545. {
  546. int val;
  547. val=0;
  548. if(fnc_read((BYTE *)&val,1)!=1) return -1;
  549. return val;
  550. }
  551. int CLzhCompress::fnc_putc(int val)
  552. {
  553. if(fnc_write((BYTE *)&val,1)!=1) return -1;
  554. return (int) 0;
  555. }
  556. int CLzhCompress::lzh_freeze_file(char *szInFile, char *szOutFile)
  557. {
  558. hFileIn=CreateFile(szInFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
  559. if(hFileIn==INVALID_HANDLE_VALUE) return -1;
  560. hFileOut=CreateFile(szOutFile,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
  561. if(hFileOut==INVALID_HANDLE_VALUE) {
  562. CloseHandle(hFileIn);
  563. return -1;
  564. }
  565. getbuf=0;
  566. getlen=0;
  567. putbuf=0;
  568. putlen=0;
  569. textsize=GetFileSize(hFileIn,NULL);
  570.     freeze_type=0;
  571. Encode();
  572. CloseHandle(hFileOut);
  573. CloseHandle(hFileIn);
  574. return 0;
  575. }
  576. int CLzhCompress::lzh_freeze_memory(void *pInBuffer, int nInBufLen, void *pOutBuf, int nOutBufLen)
  577. {
  578. pMemIn=(BYTE *)pInBuffer;
  579. nMemInSize=nInBufLen;
  580. pMemOut=(BYTE *)pOutBuf;
  581. nMemOutSize=nOutBufLen;
  582. nMemInOff=0;
  583. nMemOutOff=0;
  584. getbuf=0;
  585. getlen=0;
  586. putbuf=0;
  587. putlen=0;
  588. textsize=nInBufLen;
  589.     freeze_type=1;
  590. Encode();
  591. return 0;
  592. }
  593. int CLzhCompress::lzh_melt_file(char *szInFile, char *szOutFile)
  594. {
  595. hFileIn=CreateFile(szInFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
  596. if(hFileIn==INVALID_HANDLE_VALUE) return -1;
  597. hFileOut=CreateFile(szOutFile,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
  598. if(hFileOut==INVALID_HANDLE_VALUE) {
  599. CloseHandle(hFileIn);
  600. return -1;
  601. }
  602. getbuf=0;
  603. getlen=0;
  604. putbuf=0;
  605. putlen=0;
  606. freeze_type=0;
  607. Decode();
  608. CloseHandle(hFileOut);
  609. CloseHandle(hFileIn);
  610. return 0;
  611. }
  612. int CLzhCompress::lzh_melt_memory(void *pInBuffer, int nInBufLen, void *pOutBuf, int nOutBufLen)
  613. {
  614. pMemIn=(BYTE *)pInBuffer;
  615. nMemInSize=nInBufLen;
  616. pMemOut=(BYTE *)pOutBuf;
  617. nMemOutSize=nOutBufLen;
  618. nMemInOff=0;
  619. nMemOutOff=0;
  620. getbuf=0;
  621. getlen=0;
  622. putbuf=0;
  623. putlen=0;
  624. freeze_type=1;
  625. Decode();
  626. return 0;
  627. }