main.cpp
Upload User: szqxhk
Upload Date: 2010-02-15
Package Size: 54k
Code Size: 3k
Development Platform:

Visual C++

  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <memory.h>
  4. #include "lz77.h"
  5. //////////////////////////////////////////////////////////////////
  6. // out file format:
  7. // 0;flag2;buffer;0;flag2;buffer;...flag1;flag2;bufferlast
  8. // flag1 - 2 bytes, source buffer block length
  9. // if block size is 65536, be zero
  10. // flag2 - 2 bytes, compressed buffer length
  11. // if can not compress, be same with flag1
  12. //////////////////////////////////////////////////////////////////
  13. void main(int argc, char* argv[])
  14. {
  15. if (argc != 4)
  16. {
  17. puts("Usage: ");
  18. printf("    Compress : %s c sourcefile destfilen", argv[0]);
  19. printf("  Decompress : %s d sourcefile destfilen", argv[0]);
  20. return;
  21. }
  22. BYTE soubuf[65536];
  23. BYTE destbuf[65536 + 16];
  24. FILE* in;
  25. FILE* out;
  26. in = fopen(argv[2], "rb");
  27. if (in == NULL)
  28. {
  29. puts("Can't open source file");
  30. return;
  31. }
  32. out = fopen(argv[3], "wb");
  33. if (out == NULL)
  34. {
  35. puts("Can't open dest file");
  36. fclose(in);
  37. return;
  38. }
  39. fseek(in, 0, SEEK_END);
  40. long soulen = ftell(in);
  41. fseek(in, 0, SEEK_SET);
  42. CCompressLZ77 cc;
  43. WORD flag1, flag2;
  44. if (argv[1][0] == 'c') // compress
  45. {
  46. int last = soulen, act;
  47. while ( last > 0 )
  48. {
  49. act = min(65536, last);
  50. fread(soubuf, act, 1, in);
  51. last -= act;
  52. if (act == 65536) // out 65536 bytes
  53. flag1 = 0;
  54. else // out last blocks
  55. flag1 = act;
  56. fwrite(&flag1, sizeof(WORD), 1, out);
  57. int destlen = cc.Compress((BYTE*)soubuf, act, (BYTE*)destbuf);
  58. if (destlen == 0) // can't compress the block
  59. {
  60. flag2 = flag1;
  61. fwrite(&flag2, sizeof(WORD), 1, out);
  62. fwrite(soubuf, act, 1, out);
  63. }
  64. else
  65. {
  66. flag2 = (WORD)destlen;
  67. fwrite(&flag2, sizeof(WORD), 1, out);
  68. fwrite(destbuf, destlen, 1, out);
  69. }
  70. }
  71. }
  72. else if (argv[1][0] == 'd') // decompress
  73. {
  74. int last = soulen, act;
  75. while (last > 0)
  76. {
  77. fread(&flag1, sizeof(WORD), 1, in);
  78. fread(&flag2, sizeof(WORD), 1, in);
  79. last -= 2 * sizeof(WORD);
  80. if (flag1 == 0)
  81. act = 65536;
  82. else
  83. act = flag1;
  84. last-= flag2 ? (flag2) : act;
  85. if (flag2 == flag1)
  86. {
  87. fread(soubuf, act, 1, in);
  88. }
  89. else
  90. {
  91. fread(destbuf, flag2, 1, in);
  92. if (!cc.Decompress((BYTE*)soubuf, act, (BYTE*)destbuf))
  93. {
  94. puts("Decompress error");
  95. fclose(in);
  96. fclose(out);
  97. return;
  98. }
  99. }
  100. fwrite((BYTE*)soubuf, act, 1, out);
  101. }
  102. }
  103. else
  104. {
  105. puts("Usage: ");
  106. printf("    Compress : %s c sourcefile destfilen", argv[0]);
  107. printf("  Decompress : %s d sourcefile destfilen", argv[0]);
  108. }
  109. fclose(in);
  110. fclose(out);
  111. }