LZW15.C
上传用户:bjghjy
上传日期:2007-01-07
资源大小:379k
文件大小:7k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <malloc.h>
  5. #include "lzw.h"
  6. #define         BITS            15
  7. #define         MAX_CODE        ((1L<<BITS) -1 )        //32767
  8. #define         TABLE_SIZE      35023L                  //137*256=35072
  9. #define         TABLE_BANKS     ((TABLE_SIZE >> 8) +1)  //137
  10. #define         END_OF_STREAM   256
  11. #define         BUMP_CODE       257
  12. #define         FLUSH_CODE      258
  13. #define         FIRST_CODE      259
  14. #define         UNUSED          -1
  15. unsigned int find_child_node(int parent_code,int child_character);
  16. unsigned int decode_string(unsigned int offset,unsigned int code);
  17. void  InitializeStorage(void);
  18. void  InitializeDictionary(void);
  19. void  ExitLzw(void);
  20. //char *CompressionName ="lzw 15 bit Encode";
  21. //char *Usage         ="in-file out-filenn";
  22. //this package inlude file:bitio.c/lzw15.c/lzw.h
  23. typedef struct tag_dictionary
  24. {
  25. int code_value;
  26. int parent_code;
  27. char character;
  28. }dictionary;
  29. dictionary *dict[TABLE_BANKS];
  30. #define DICT(i) dict[i >> 8][i&0xff]
  31. //char decode_stack[TABLE_SIZE];
  32. char *decode_stack=NULL;
  33. unsigned int next_code;
  34. int current_code_bits;
  35. unsigned int next_bump_code;
  36. void ExitLzw()
  37. {
  38. int i;
  39. for(i=0;i<TABLE_BANKS;i++)
  40. _ffree(dict[i]);
  41. }
  42. void InitializeDictionary()
  43. {
  44. unsigned int i;
  45. for(i=0;i<TABLE_SIZE;i++)
  46. DICT(i).code_value = UNUSED;
  47. next_code =FIRST_CODE;
  48. //putc('F',stdout);
  49. current_code_bits =9;
  50. next_bump_code =511;
  51. }
  52. void InitializeStorage()
  53. {
  54. int i;
  55. for(i=0;i<TABLE_BANKS;i++)
  56. {
  57. //dict[i] =(struct dictionary *)
  58. //      calloc(256,sizeof(struct dictionary));
  59. dict[i] =(dictionary *)
  60. _fmalloc(256*sizeof(dictionary));
  61. if(dict[i] == NULL)
  62. fatal_error("Error allocating dictionary space");
  63. }
  64. }
  65. void CompressFile(char * infile,char *outfile)
  66. {
  67. int character;
  68. int string_code;
  69. unsigned int index;
  70.      
  71.     BIT_FILE * output;
  72.     FILE * input;
  73.     
  74. input = fopen(infile,"rb");
  75.     if(input==NULL)
  76.     {
  77. fatal_error("Can not open input file");
  78. return;
  79.     }
  80. output =OpenOutputBitFile(outfile);
  81.     if(output ==NULL)
  82.     {
  83. fatal_error("Can not open output file");
  84. fclose(input);
  85. return;    
  86.     }
  87. InitializeStorage();
  88. InitializeDictionary();
  89. if((string_code = getc(input)) == EOF)
  90. string_code = END_OF_STREAM;
  91. while((character = getc(input))!=EOF)
  92. {
  93. index =find_child_node(string_code,character);
  94. if(DICT(index).code_value !=-1)
  95. string_code =DICT(index).code_value;
  96. else
  97. {
  98. DICT(index).code_value =next_code++;
  99. DICT(index).parent_code=string_code;
  100. DICT(index).character=(char)character;
  101. OutputBits(output,(unsigned long)string_code,current_code_bits);
  102. string_code =character;
  103. if(next_code>MAX_CODE)
  104. {
  105. OutputBits(output,(unsigned long)FLUSH_CODE,current_code_bits);
  106. InitializeDictionary();
  107. }
  108. else if(next_code>next_bump_code)
  109. {
  110. OutputBits(output,(unsigned long)BUMP_CODE,current_code_bits);
  111. current_code_bits++;
  112. next_bump_code<<=1;
  113. next_bump_code|=1;
  114. //putc('B',stdout);
  115. }
  116. }
  117. }
  118. OutputBits(output,(unsigned int)string_code,current_code_bits);
  119. OutputBits(output,(unsigned int)END_OF_STREAM,current_code_bits);
  120. ExitLzw();
  121. CloseOutputBitFile(output);
  122. fclose(input);  
  123. }
  124. void CompressMemFile(char *ptr,long len,char *outfile)
  125. {
  126. int character;
  127. int string_code;
  128. unsigned int index;
  129. BIT_FILE *output;
  130. output =OpenOutputBitFile(outfile);
  131.     if(output ==NULL)
  132.     {
  133. fatal_error("Can not open output file");
  134. return;    
  135.     }
  136. InitializeStorage();
  137. InitializeDictionary();
  138. if(len==0)
  139. string_code =EOF;
  140. else
  141. {
  142. string_code =*ptr++;
  143. len--;
  144. }
  145. if(string_code == EOF)
  146. string_code = END_OF_STREAM;
  147. for(;;)
  148. {
  149. if(len==0L)
  150. {
  151. character =EOF;
  152. break;
  153. }
  154. else
  155. {
  156. character =*ptr++;
  157. len--;
  158. }
  159. index =find_child_node(string_code,character);
  160. if(DICT(index).code_value !=-1)
  161. string_code =DICT(index).code_value;
  162. else
  163. {
  164. DICT(index).code_value =next_code++;
  165. DICT(index).parent_code=string_code;
  166. DICT(index).character=(char)character;
  167. OutputBits(output,(unsigned long)string_code,current_code_bits);
  168. string_code =character;
  169. if(next_code>MAX_CODE)
  170. {
  171. OutputBits(output,(unsigned long)FLUSH_CODE,current_code_bits);
  172. InitializeDictionary();
  173. }
  174. else if(next_code>next_bump_code)
  175. {
  176. OutputBits(output,(unsigned long)BUMP_CODE,current_code_bits);
  177. current_code_bits++;
  178. next_bump_code<<=1;
  179. next_bump_code|=1;
  180. //putc('B',stdout);
  181. }
  182. }
  183. }
  184. OutputBits(output,(unsigned int)string_code,current_code_bits);
  185. OutputBits(output,(unsigned int)END_OF_STREAM,current_code_bits);
  186. ExitLzw();
  187. CloseOutputBitFile(output);
  188. }
  189. void ExpandFile(char *infile,char *outfile)
  190. {
  191. unsigned int new_code;
  192. unsigned int old_code;
  193. int character;
  194. unsigned int count;
  195.     FILE * output;
  196.     BIT_FILE * input;
  197.     
  198.     decode_stack =(char *)_fmalloc((size_t)TABLE_SIZE);
  199.     if(decode_stack ==NULL)
  200.      fatal_error("can not get decode_stack space");
  201.     
  202. output = fopen(outfile,"wb");
  203.     if(output==NULL)
  204.     {
  205. fatal_error("Can not open output file");
  206. return;
  207.     }
  208. input =OpenInputBitFile(infile);
  209.     if(input ==NULL)
  210.     {
  211. fatal_error("Can not open input file");
  212. fclose(output);
  213. _ffree(decode_stack);
  214. return;    
  215.     }
  216. InitializeStorage();
  217. for(;;)
  218. {
  219. InitializeDictionary();
  220. old_code =(unsigned int)InputBits(input,current_code_bits);
  221. if(old_code == END_OF_STREAM)
  222. {
  223. CloseInputBitFile(input);
  224. fclose(output); 
  225. ExitLzw();              
  226. _ffree(decode_stack);
  227. return;
  228. }       
  229. character =old_code;
  230. putc(old_code,output);
  231. for(;;)
  232. {
  233. new_code =(unsigned int) InputBits(input,current_code_bits);
  234. if(new_code == END_OF_STREAM)
  235. {
  236. CloseInputBitFile(input);
  237. fclose(output);                 
  238. ExitLzw();                      
  239. _ffree(decode_stack);
  240. return;
  241. }       
  242. if(new_code == FLUSH_CODE)
  243. break;
  244. if(new_code == BUMP_CODE)
  245. {
  246. current_code_bits++;
  247. //putc('B',stdout);
  248. continue;
  249. }
  250. if(new_code >= next_code)
  251. {
  252. decode_stack[0] =(char )character;
  253. count =decode_string(1,old_code);
  254. }
  255. else
  256. count =decode_string(0,new_code);
  257. character =decode_stack[count -1];
  258. while(count>0)
  259. putc(decode_stack[--count],output);
  260. DICT(next_code).parent_code =old_code;
  261. DICT(next_code).character =(char)character;
  262. next_code++;
  263. old_code = new_code;
  264. }
  265. }
  266. }
  267. unsigned int find_child_node(int parent_code ,int child_character)
  268. {
  269. unsigned int index;
  270. unsigned int offset;
  271.     
  272. index =(child_character <<(BITS-8)) ^parent_code;
  273. if(index ==0)
  274. offset =1;
  275. else
  276. offset =(unsigned int)(TABLE_SIZE -(long)index);
  277. for(;;)
  278. {
  279. if(DICT(index).code_value ==UNUSED)
  280. return(index);
  281. if(DICT(index).parent_code ==parent_code &&
  282. DICT(index).character ==(char)child_character)
  283. return(index);
  284. if((long)index >=(long)offset)
  285. index =(unsigned int)((long)index -(long)offset);
  286. else
  287. index=index +(unsigned int)(TABLE_SIZE-(long)offset);
  288. }
  289. }
  290. unsigned int decode_string(unsigned int count,unsigned int code)
  291. {
  292. while(code>255)
  293. {
  294. decode_stack[count++] =DICT(code).character;
  295. code =DICT(code).parent_code;
  296. }
  297. decode_stack[count++] =(char)code;
  298. return(count);
  299. }