huffman.cpp
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:32k
源码类别:

其他游戏

开发平台:

Visual C++

  1. #include <windows.h>
  2. #include <stdlib.h>
  3. #include "mpq.h"
  4. #include "huffman.h"
  5. #include <string.h>
  6. unsigned char table1502A630[] = {
  7. /* Data for compression type 0x00 */
  8. 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  9. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  10. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  11. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  12. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  13. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  14. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  15. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  16. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  17. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  18. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  19. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  20. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  21. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  22. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  23. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
  24. 0x00, 0x00,
  25. /* Data for compression type 0x01 */
  26. 0x54, 0x16, 0x16, 0x0D, 0x0C, 0x08, 0x06, 0x05, 0x06, 0x05, 0x06, 0x03, 0x04, 0x04, 0x03, 0x05,
  27. 0x0E, 0x0B, 0x14, 0x13, 0x13, 0x09, 0x0B, 0x06, 0x05, 0x04, 0x03, 0x02, 0x03, 0x02, 0x02, 0x02,
  28. 0x0D, 0x07, 0x09, 0x06, 0x06, 0x04, 0x03, 0x02, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02,
  29. 0x09, 0x06, 0x04, 0x04, 0x04, 0x04, 0x03, 0x02, 0x03, 0x02, 0x02, 0x02, 0x02, 0x03, 0x02, 0x04,
  30. 0x08, 0x03, 0x04, 0x07, 0x09, 0x05, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x03, 0x02, 0x02,
  31. 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x02,
  32. 0x06, 0x0A, 0x08, 0x08, 0x06, 0x07, 0x04, 0x03, 0x04, 0x04, 0x02, 0x02, 0x04, 0x02, 0x03, 0x03,
  33. 0x04, 0x03, 0x07, 0x07, 0x09, 0x06, 0x04, 0x03, 0x03, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02,
  34. 0x0A, 0x02, 0x02, 0x03, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x06, 0x03, 0x05, 0x02, 0x03,
  35. 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x01, 0x01, 0x01,
  36. 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x04, 0x04, 0x04, 0x07, 0x09, 0x08, 0x0C, 0x02,
  37. 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x03,
  38. 0x04, 0x01, 0x02, 0x04, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01,
  39. 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  40. 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  41. 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x06, 0x4B,
  42. 0x00, 0x00,
  43. /* Data for compression type 0x02 */
  44. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x27, 0x00, 0x00, 0x23, 0x00, 0x00,
  45. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  46. 0xFF, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x06, 0x0E, 0x10, 0x04,
  47. 0x06, 0x08, 0x05, 0x04, 0x04, 0x03, 0x03, 0x02, 0x02, 0x03, 0x03, 0x01, 0x01, 0x02, 0x01, 0x01,
  48. 0x01, 0x04, 0x02, 0x04, 0x02, 0x02, 0x02, 0x01, 0x01, 0x04, 0x01, 0x01, 0x02, 0x03, 0x03, 0x02,
  49. 0x03, 0x01, 0x03, 0x06, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x01, 0x01,
  50. 0x01, 0x29, 0x07, 0x16, 0x12, 0x40, 0x0A, 0x0A, 0x11, 0x25, 0x01, 0x03, 0x17, 0x10, 0x26, 0x2A,
  51. 0x10, 0x01, 0x23, 0x23, 0x2F, 0x10, 0x06, 0x07, 0x02, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
  52. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  53. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  54. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  55. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  56. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  57. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  58. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  59. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  60. 0x00, 0x00,
  61. /* Data for compression type 0x03 */
  62. 0xFF, 0x0B, 0x07, 0x05, 0x0B, 0x02, 0x02, 0x02, 0x06, 0x02, 0x02, 0x01, 0x04, 0x02, 0x01, 0x03,
  63. 0x09, 0x01, 0x01, 0x01, 0x03, 0x04, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01,
  64. 0x05, 0x01, 0x01, 0x01, 0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  65. 0x02, 0x01, 0x01, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01,
  66. 0x0A, 0x04, 0x02, 0x01, 0x06, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x01,
  67. 0x05, 0x02, 0x03, 0x04, 0x03, 0x03, 0x03, 0x02, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x03, 0x03,
  68. 0x01, 0x03, 0x01, 0x01, 0x02, 0x05, 0x01, 0x01, 0x04, 0x03, 0x05, 0x01, 0x03, 0x01, 0x03, 0x03,
  69. 0x02, 0x01, 0x04, 0x03, 0x0A, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  70. 0x02, 0x02, 0x01, 0x0A, 0x02, 0x05, 0x01, 0x01, 0x02, 0x07, 0x02, 0x17, 0x01, 0x05, 0x01, 0x01,
  71. 0x0E, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  72. 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  73. 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  74. 0x06, 0x02, 0x01, 0x04, 0x05, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01,
  75. 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  76. 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01,
  77. 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x11,
  78. 0x00, 0x00,
  79. /* Data for compression type 0x04 */
  80. 0xFF, 0xFB, 0x98, 0x9A, 0x84, 0x85, 0x63, 0x64, 0x3E, 0x3E, 0x22, 0x22, 0x13, 0x13, 0x18, 0x17,
  81. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  82. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  83. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  84. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  85. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  86. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  87. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  88. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  89. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  90. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  91. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  92. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  93. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  94. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  95. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  96. 0x00, 0x00,
  97. /* Data for compression type 0x05 */
  98. 0xFF, 0xF1, 0x9D, 0x9E, 0x9A, 0x9B, 0x9A, 0x97, 0x93, 0x93, 0x8C, 0x8E, 0x86, 0x88, 0x80, 0x82,
  99. 0x7C, 0x7C, 0x72, 0x73, 0x69, 0x6B, 0x5F, 0x60, 0x55, 0x56, 0x4A, 0x4B, 0x40, 0x41, 0x37, 0x37,
  100. 0x2F, 0x2F, 0x27, 0x27, 0x21, 0x21, 0x1B, 0x1C, 0x17, 0x17, 0x13, 0x13, 0x10, 0x10, 0x0D, 0x0D,
  101. 0x0B, 0x0B, 0x09, 0x09, 0x08, 0x08, 0x07, 0x07, 0x06, 0x05, 0x05, 0x04, 0x04, 0x04, 0x19, 0x18,
  102. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  103. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  104. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  105. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  106. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  107. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  108. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  109. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  110. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  111. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  112. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  113. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  114. 0x00, 0x00,
  115. /* Data for compression type 0x06 */
  116. 0xC3, 0xCB, 0xF5, 0x41, 0xFF, 0x7B, 0xF7, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  117. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  118. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  119. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  120. 0xBF, 0xCC, 0xF2, 0x40, 0xFD, 0x7C, 0xF7, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  121. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  122. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  123. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  124. 0x7A, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  125. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  126. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  127. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  128. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  129. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  130. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  131. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  132. 0x00, 0x00,
  133. /* Data for compression type 0x07 */
  134. 0xC3, 0xD9, 0xEF, 0x3D, 0xF9, 0x7C, 0xE9, 0x1E, 0xFD, 0xAB, 0xF1, 0x2C, 0xFC, 0x5B, 0xFE, 0x17,
  135. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  136. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  137. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  138. 0xBD, 0xD9, 0xEC, 0x3D, 0xF5, 0x7D, 0xE8, 0x1D, 0xFB, 0xAE, 0xF0, 0x2C, 0xFB, 0x5C, 0xFF, 0x18,
  139. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  140. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  141. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  142. 0x70, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  143. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  144. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  145. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  146. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  147. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  148. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  149. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  150. 0x00, 0x00,
  151. /* Data for compression type 0x08 */
  152. 0xBA, 0xC5, 0xDA, 0x33, 0xE3, 0x6D, 0xD8, 0x18, 0xE5, 0x94, 0xDA, 0x23, 0xDF, 0x4A, 0xD1, 0x10,
  153. 0xEE, 0xAF, 0xE4, 0x2C, 0xEA, 0x5A, 0xDE, 0x15, 0xF4, 0x87, 0xE9, 0x21, 0xF6, 0x43, 0xFC, 0x12,
  154. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  155. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  156. 0xB0, 0xC7, 0xD8, 0x33, 0xE3, 0x6B, 0xD6, 0x18, 0xE7, 0x95, 0xD8, 0x23, 0xDB, 0x49, 0xD0, 0x11,
  157. 0xE9, 0xB2, 0xE2, 0x2B, 0xE8, 0x5C, 0xDD, 0x15, 0xF1, 0x87, 0xE7, 0x20, 0xF7, 0x44, 0xFF, 0x13,
  158. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  159. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  160. 0x5F, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  161. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  162. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  163. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  164. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  165. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  166. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  167. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  168. 0x00, 0x00
  169. };
  170. /* Gets previous Huffman tree item (?) */
  171. struct huffman_tree_item *libmpq_huff_get_prev_item(struct huffman_tree_item *hi, __int32 value) {
  172. if (PTR_INT(hi->prev) < 0) {
  173. return PTR_NOT(hi->prev);
  174. }
  175. if (value < 0) {
  176. value = __int32(hi - hi->next->prev);
  177. }
  178. return hi->prev + value;
  179. }
  180. /* 1500BC90 */
  181. static void libmpq_huff_remove_item(struct huffman_tree_item *hi) {
  182. struct huffman_tree_item *temp; /* EDX */
  183. if (hi->next != NULL) {
  184. temp = hi->prev;
  185. if (PTR_INT(temp) <= 0) {
  186. temp = PTR_NOT(temp);
  187. } else {
  188. temp += (hi - hi->next->prev);
  189. }
  190. temp->next          = hi->next;
  191. hi->next->prev      = hi->prev;
  192. hi->next = hi->prev = NULL;
  193. }
  194. }
  195. static void libmpq_huff_insert_item(struct huffman_tree_item **p_item, struct huffman_tree_item *item, unsigned long where, struct huffman_tree_item *item2) {
  196. struct huffman_tree_item *next = item->next; /* EDI - next to the first item */
  197. struct huffman_tree_item *prev = item->prev; /* ESI - prev to the first item */
  198. struct huffman_tree_item *prev2; /* Pointer to previous item */
  199. long next2; /* Pointer to the next item */
  200. /* The same code like in mpq_huff_remove_item(); */
  201. if (next != 0) { /* If the first item already has next one */
  202. if (PTR_INT(prev) < 0) {
  203. prev = PTR_NOT(prev);
  204. } else {
  205. prev += (item - next->prev);
  206. }
  207. /*
  208.  * 150083C1
  209.  * Remove the item from the tree
  210.  */
  211. prev->next = next;
  212. next->prev = prev;
  213. /* Invalidate 'prev' and 'next' pointer */
  214. item->next = 0;
  215. item->prev = 0;
  216. }
  217. if (item2 == NULL) { /* EDX - If the second item is not entered, */
  218. item2 = PTR_PTR(&p_item[1]); /* take the first tree item */
  219. }
  220. switch (where) {
  221. case SWITCH_ITEMS: /* Switch the two items */
  222. item->next  = item2->next; /* item2->next (Pointer to pointer to first) */
  223. item->prev  = item2->next->prev;
  224. item2->next->prev = item;
  225. item2->next = item; /* Set the first item */
  226. return;
  227. case INSERT_ITEM: /* Insert as the last item */
  228. item->next = item2; /* Set next item (or pointer to pointer to first item) */
  229. item->prev = item2->prev; /* Set prev item (or last item in the tree) */
  230. next2 = PTR_INT(p_item[0]); /* Usually NULL */
  231. prev2 = item2->prev; /* Prev item to the second (or last tree item) */
  232. if (PTR_INT(prev2) < 0) {
  233. prev2 = PTR_NOT(prev);
  234. prev2->next = item;
  235. item2->prev = item; /* Next after last item */
  236. return;
  237. }
  238. if (next2 < 0) {
  239. next2 = long(item2 - item2->next->prev);
  240. }
  241. prev2 += next2;
  242. prev2->next = item;
  243. item2->prev = item; /* Set the next/last item */
  244. return;
  245. default:
  246. return;
  247. }
  248. }
  249. /* Builds Huffman tree. Called with the first 8 bits loaded from input stream. */
  250. static void libmpq_huff_build_tree(struct huffman_tree *ht, unsigned int cmp_type) {
  251. unsigned long max_byte; /* [ESP+10] - The greatest character found in table */
  252. unsigned char *byte_array; /* [ESP+1C] - Pointer to unsigned char in table1502A630 */
  253. unsigned long i; /* egcs in linux doesn't like multiple for loops without an explicit i */
  254. unsigned int found; /* Thats needed to replace the goto stuff from original source :) */
  255. struct huffman_tree_item **p_item; /* [ESP+14] - Pointer to Huffman tree item pointer array */
  256. struct huffman_tree_item *child1;
  257. /* Loop while pointer has a negative value. */
  258. while (PTR_INT(ht->last) > 0) { /* ESI - Last entry */
  259. struct huffman_tree_item *temp; /* EAX */
  260.         
  261. if (ht->last->next != NULL) { /* ESI->next */
  262. libmpq_huff_remove_item(ht->last);
  263. }
  264. ht->item3058   = PTR_PTR(&ht->item3054);/* [EDI+4] */
  265. ht->last->prev = ht->item3058; /* EAX */
  266. temp           = libmpq_huff_get_prev_item(PTR_PTR(&ht->item3054), PTR_INT(&ht->item3050));
  267. temp->next     = ht->last;
  268. ht->item3054   = ht->last;
  269. }
  270. /* Clear all pointers in huffman tree item array. */
  271. memset(ht->items306C, 0, sizeof(ht->items306C));
  272. max_byte = 0; /* Greatest character found init to zero. */
  273. p_item = (struct huffman_tree_item **)&ht->items306C; /* Pointer to current entry in huffman tree item pointer array */
  274. /* Ensure we have low 8 bits only */
  275. cmp_type   &= 0xFF;
  276. byte_array  = table1502A630 + cmp_type * 258; /* EDI also */
  277. for (i = 0; i < 0x100; i++, p_item++) {
  278. struct huffman_tree_item *item = ht->item3058; /* Item to be created */
  279. struct huffman_tree_item *p_item3 = ht->item3058;
  280. unsigned char one_byte = byte_array[i];
  281. /* Skip all the bytes which are zero. */
  282. if (byte_array[i] == 0) {
  283. continue;
  284. }
  285. /* If not valid pointer, take the first available item in the array. */
  286. if (PTR_INT(item) <= 0) {
  287. item = &ht->items0008[ht->items++];
  288. }
  289. /* Insert this item as the top of the tree. */
  290. libmpq_huff_insert_item(&ht->item305C, item, SWITCH_ITEMS, NULL);
  291. item->parent    = NULL; /* Invalidate child and parent */
  292. item->child     = NULL;
  293. *p_item         = item; /* Store pointer into pointer array */
  294. item->dcmp_byte  = i; /* Store counter */
  295. item->byte_value = one_byte; /* Store byte value */
  296. if (one_byte >= max_byte) {
  297. max_byte = one_byte;
  298. continue;
  299. }
  300. /* Find the first item which has byte value greater than current one byte */
  301. found = 0;
  302. if (PTR_INT((p_item3 = ht->last)) > 0) {/* EDI - Pointer to the last item */
  303. /* 15006AF7 */
  304. if (p_item3 != NULL) {
  305. do { /* 15006AFB */
  306. if (p_item3->byte_value >= one_byte) {
  307. found = 1;
  308. break;
  309. }
  310. p_item3 = p_item3->prev;
  311. } while (PTR_INT(p_item3) > 0);
  312. }
  313. }
  314. if (found == 0) {
  315. p_item3 = NULL;
  316. }
  317. /* 15006B09 */
  318. if (item->next != NULL) {
  319. libmpq_huff_remove_item(item);
  320. }
  321. /* 15006B15 */
  322. if (p_item3 == NULL) {
  323. p_item3 = PTR_PTR(&ht->first);
  324. }
  325. /* 15006B1F */
  326. item->next = p_item3->next;
  327. item->prev = p_item3->next->prev;
  328. p_item3->next->prev = item;
  329. p_item3->next = item;
  330. }
  331. /* 15006B4A */
  332. for (; i < 0x102; i++) {
  333. struct huffman_tree_item **p_item2 = &ht->items306C[i]; /* EDI */
  334. /* 15006B59  */
  335. struct huffman_tree_item *item2 = ht->item3058; /* ESI */
  336. if (PTR_INT(item2) <= 0) {
  337. item2 = &ht->items0008[ht->items++];
  338. }
  339. libmpq_huff_insert_item(&ht->item305C, item2, INSERT_ITEM, NULL);
  340. /* 15006B89 */
  341. item2->dcmp_byte  = i;
  342. item2->byte_value = 1;
  343. item2->parent     = NULL;
  344. item2->child      = NULL;
  345. *p_item2++        = item2;
  346. }
  347. /* 15006BAA */
  348. if (PTR_INT((child1 = ht->last)) > 0) { /* EDI - last item (first child to item */
  349. struct huffman_tree_item *child2; /* EBP */
  350. struct huffman_tree_item *item; /* ESI */
  351. /* 15006BB8 */
  352. while (PTR_INT((child2 = child1->prev)) > 0) {
  353. if (PTR_INT((item = ht->item3058)) <= 0) {
  354. item = &ht->items0008[ht->items++];
  355. }
  356. /* 15006BE3 */
  357. libmpq_huff_insert_item(&ht->item305C, item, SWITCH_ITEMS, NULL);
  358. /* 15006BF3 */
  359. item->parent = NULL;
  360. item->child  = NULL;
  361. /*
  362.  * EDX = child2->byte_value + child1->byte_value;
  363.  * EAX = child1->byte_value;
  364.  * ECX = max_byte; The greatest character (0xFF usually)
  365.  */
  366. item->byte_value = child1->byte_value + child2->byte_value; /* 0x02 */
  367. item->child      = child1; /* Prev item in the */
  368. child1->parent   = item;
  369. child2->parent   = item;
  370. /* EAX = item->byte_value; */
  371. if (item->byte_value >= max_byte) {
  372. max_byte = item->byte_value;
  373. } else {
  374. struct huffman_tree_item *p_item2 = child2->prev; /* EDI */
  375. found = 0;
  376. if (PTR_INT(p_item2) > 0) {
  377. /* 15006C2D */
  378. do {
  379. if (p_item2->byte_value >= item->byte_value) {
  380. found = 1;
  381. break;
  382. }
  383. p_item2 = p_item2->prev;
  384. } while (PTR_INT(p_item2) > 0);
  385. }
  386. if (found == 0) {
  387. p_item2 = NULL;
  388. }
  389. if (item->next != 0) {
  390. struct huffman_tree_item *temp4 = libmpq_huff_get_prev_item(item, -1);
  391. temp4->next      = item->next; /* The first item changed */
  392. item->next->prev = item->prev; /* First->prev changed to negative value */
  393. item->next = NULL;
  394. item->prev = NULL;
  395. }
  396. /* 15006C62 */
  397. if (p_item2 == NULL) {
  398. p_item2 = PTR_PTR(&ht->first);
  399. }
  400. item->next = p_item2->next; /* Set item with 0x100 byte value */
  401. item->prev = p_item2->next->prev; /* Set item with 0x17 byte value */
  402. p_item2->next->prev = item; /* Changed prev of item with */
  403. p_item2->next = item;
  404. }
  405. /* 15006C7B */
  406. if (PTR_INT((child1 = child2->prev)) <= 0) {
  407. break;
  408. }
  409. }
  410. }
  411. /* 15006C88 */
  412. ht->offs0004 = 1;
  413. }
  414. /* Gets the whole byte from the input stream. */
  415. static unsigned long libmpq_huff_get_8bits(struct huffman_input_stream *is) {
  416. unsigned long one_byte;
  417. if (is->bits <= 8) {
  418. is->bit_buf |= *(unsigned short *)is->in_buf << is->bits;
  419. is->in_buf  += sizeof(unsigned short);
  420. is->bits    += 16;
  421. }
  422. one_byte      = (is->bit_buf & 0xFF);
  423. is->bit_buf >>= 8;
  424. is->bits     -= 8;
  425. return one_byte;
  426. }
  427. /* Gets 7 bits from the stream. */
  428. static unsigned long libmpq_huff_get_7bits(struct huffman_input_stream *is) {
  429. if (is->bits <= 7) {
  430. is->bit_buf |= *(unsigned short *)is->in_buf << is->bits;
  431. is->in_buf  += sizeof(unsigned short);
  432. is->bits    += 16;
  433. }
  434. /* Get 7 bits from input stream. */
  435. return (is->bit_buf & 0x7F);
  436. }
  437. /* Gets one bit from input stream. */
  438. unsigned long libmpq_huff_get_bit(struct huffman_input_stream *is) {
  439. unsigned long bit = (is->bit_buf & 1);
  440. is->bit_buf >>= 1;
  441. if (--is->bits == 0) {
  442. is->bit_buf  = *(unsigned long *)is->in_buf;
  443. is->in_buf  += sizeof(unsigned long);
  444. is->bits     = 32;
  445. }
  446. return bit;
  447. }
  448. static struct huffman_tree_item *libmpq_huff_call1500E740(struct huffman_tree *ht, unsigned int value) {
  449. struct huffman_tree_item *p_item1 = ht->item3058; /* EDX */
  450. struct huffman_tree_item *p_item2; /* EAX */
  451. struct huffman_tree_item *p_next;
  452. struct huffman_tree_item *p_prev;
  453. struct huffman_tree_item **pp_item;
  454. if (PTR_INT(p_item1) <= 0 || (p_item2 = p_item1) == NULL) {
  455. if((p_item2 = &ht->items0008[ht->items++]) != NULL) {
  456. p_item1 = p_item2;
  457. } else {
  458. p_item1 = ht->first;
  459. }
  460. } else {
  461. p_item1 = p_item2;
  462. }
  463. p_next = p_item1->next;
  464. if (p_next != NULL) {
  465. p_prev = p_item1->prev;
  466. if (PTR_INT(p_prev) <= 0) {
  467. p_prev = PTR_NOT(p_prev);
  468. } else {
  469. p_prev += (p_item1 - p_item1->next->prev);
  470. }
  471. p_prev->next = p_next;
  472. p_next->prev = p_prev;
  473. p_item1->next = NULL;
  474. p_item1->prev = NULL;
  475. }
  476. pp_item = &ht->first; /* ESI */
  477. if (value > 1) {
  478. /* ECX = ht->first->next; */
  479. p_item1->next = *pp_item;
  480. p_item1->prev = (*pp_item)->prev;
  481. (*pp_item)->prev = p_item2;
  482. *pp_item = p_item1;
  483. p_item2->parent = NULL;
  484. p_item2->child  = NULL;
  485. } else {
  486. p_item1->next = (struct huffman_tree_item *)pp_item;
  487. p_item1->prev = pp_item[1];
  488. /* EDI = ht->item305C; */
  489. p_prev = pp_item[1]; /* ECX */
  490. if (p_prev <= 0) {
  491. p_prev = PTR_NOT(p_prev);
  492. p_prev->next = p_item1;
  493. p_prev->prev = p_item2;
  494. p_item2->parent = NULL;
  495. p_item2->child  = NULL;
  496. } else {
  497. if (PTR_INT(ht->item305C) < 0) {
  498. p_prev += (struct huffman_tree_item *)pp_item - (*pp_item)->prev;
  499. } else {
  500. p_prev += PTR_INT(ht->item305C);
  501. }
  502. p_prev->next    = p_item1;
  503. pp_item[1]      = p_item2;
  504. p_item2->parent = NULL;
  505. p_item2->child  = NULL;
  506. }
  507. }
  508. return p_item2;
  509. }
  510. static void libmpq_huff_call1500E820(struct huffman_tree *ht, struct huffman_tree_item *p_item) {
  511. struct huffman_tree_item *p_item1; /* EDI */
  512. struct huffman_tree_item *p_item2 = NULL; /* EAX */
  513. struct huffman_tree_item *p_item3; /* EDX */
  514. struct huffman_tree_item *p_prev; /* EBX */
  515. for (; p_item != NULL; p_item = p_item->parent) {
  516. p_item->byte_value++;
  517. for (p_item1 = p_item; ; p_item1 = p_prev) {
  518. p_prev = p_item1->prev;
  519. if (PTR_INT(p_prev) <= 0) {
  520. p_prev = NULL;
  521. break;
  522. }
  523. if (p_prev->byte_value >= p_item->byte_value) {
  524. break;
  525. }
  526. }
  527. if (p_item1 == p_item) {
  528. continue;
  529. }
  530. if (p_item1->next != NULL) {
  531. p_item2 = libmpq_huff_get_prev_item(p_item1, -1);
  532. p_item2->next = p_item1->next;
  533. p_item1->next->prev = p_item1->prev;
  534. p_item1->next = NULL;
  535. p_item1->prev = NULL;
  536. }
  537. p_item2 = p_item->next;
  538. p_item1->next = p_item2;
  539. p_item1->prev = p_item2->prev;
  540. p_item2->prev = p_item1;
  541. p_item->next = p_item1;
  542. if ((p_item2 = p_item1) != NULL) {
  543. p_item2 = libmpq_huff_get_prev_item(p_item, -1);
  544. p_item2->next = p_item->next;
  545. p_item->next->prev = p_item->prev;
  546. p_item->next = NULL;
  547. p_item->prev = NULL;
  548. }
  549. if (p_prev == NULL) {
  550. p_prev = PTR_PTR(&ht->first);
  551. }
  552. p_item2       = p_prev->next;
  553. p_item->next  = p_item2;
  554. p_item->prev  = p_item2->prev;
  555. p_item2->prev = p_item;
  556. p_prev->next  = p_item;
  557. p_item3 = p_item1->parent->child;
  558. p_item2 = p_item->parent;
  559. if (p_item2->child == p_item) {
  560. p_item2->child = p_item1;
  561. }
  562. if (p_item3 == p_item1) {
  563. p_item1->parent->child = p_item;
  564. }
  565. p_item2 = p_item->parent;
  566. p_item->parent  = p_item1->parent;
  567. p_item1->parent = p_item2;
  568. ht->offs0004++;
  569. }
  570. }
  571. __int32 libmpq_huff_do_decompress(struct huffman_tree *ht, struct huffman_input_stream *is, unsigned char *out_buf, unsigned int out_length) {
  572. unsigned int n8bits; /* 8 bits loaded from input stream */
  573. unsigned int n7bits; /* 7 bits loaded from input stream */
  574. unsigned int found; /* Thats needed to replace the goto stuff from original source :) */
  575. unsigned int dcmp_byte = 0;
  576. unsigned long bit_count;
  577. struct huffman_decompress *qd;
  578. unsigned int has_qd; /* Can we use quick decompression? */
  579. struct huffman_tree_item *p_item1 = NULL;
  580. struct huffman_tree_item *p_item2 = NULL;
  581. unsigned char *out_pos = out_buf;
  582. /* Test the output length. Must not be non zero. */
  583. if (out_length == 0) {
  584. return 0;
  585. }
  586. /* Get the compression type from the input stream. */
  587. n8bits = libmpq_huff_get_8bits(is);
  588. /* Build the Huffman tree */
  589. libmpq_huff_build_tree(ht, n8bits);
  590. ht->cmp0 = (n8bits == 0) ? TRUE : FALSE;
  591. for(;;) {
  592. n7bits = libmpq_huff_get_7bits(is); /* Get 7 bits from input stream */
  593. /*
  594.  * Try to use quick decompression. Check huffman_decompress array for corresponding item.
  595.  * If found, use the result byte instead.
  596.  */
  597. qd = &ht->qd3474[n7bits];
  598. /* If there is a quick-pass possible (ebx) */
  599. has_qd = (qd->offs00 >= ht->offs0004) ? TRUE : FALSE;
  600. /* If we can use quick decompress, use it. */
  601. if (has_qd) {
  602. found = 0;
  603. if (qd->bits > 7) {
  604. is->bit_buf >>= 7;
  605. is->bits -= 7;
  606. p_item1 = qd->p_item;
  607. found = 1;
  608. }
  609. if (found == 0) {
  610. is->bit_buf >>= qd->bits;
  611. is->bits     -= qd->bits;
  612. dcmp_byte     = qd->dcmp_byte;
  613. }
  614. } else {
  615. found = 1;
  616. p_item1 = ht->first->next->prev;
  617. if (PTR_INT(p_item1) <= 0) {
  618. p_item1 = NULL;
  619. }
  620. }
  621. if (found == 1) {
  622. bit_count = 0;
  623. p_item2 = NULL;
  624. do {
  625. p_item1 = p_item1->child; /* Move down by one level */
  626. if (libmpq_huff_get_bit(is)) { /* If current bit is set, move to previous */
  627. p_item1 = p_item1->prev;
  628. }
  629. if (++bit_count == 7) { /* If we are at 7th bit, save current huffman tree item. */
  630. p_item2 = p_item1;
  631. }
  632. } while (p_item1->child != NULL); /* Walk until tree has no deeper level */
  633. if (has_qd == FALSE) {
  634. if (bit_count > 7) {
  635. qd->offs00 = ht->offs0004;
  636. qd->bits   = bit_count;
  637. qd->p_item = p_item2;
  638. } else {
  639. unsigned long index = n7bits & (0xFFFFFFFF >> (32 - bit_count));
  640. unsigned long add   = (1 << bit_count);
  641. for (qd = &ht->qd3474[index]; index <= 0x7F; index += add, qd += add) {
  642. qd->offs00    = ht->offs0004;
  643. qd->bits      = bit_count;
  644. qd->dcmp_byte = p_item1->dcmp_byte;
  645. }
  646. }
  647. }
  648. dcmp_byte = p_item1->dcmp_byte;
  649. }
  650. if (dcmp_byte == 0x101) { /* Huffman tree needs to be modified */
  651. n8bits  = libmpq_huff_get_8bits(is);
  652. p_item1 = (ht->last <= 0) ? NULL : ht->last;
  653. p_item2 = libmpq_huff_call1500E740(ht, 1);
  654. p_item2->parent     = p_item1;
  655. p_item2->dcmp_byte  = p_item1->dcmp_byte;
  656. p_item2->byte_value = p_item1->byte_value;
  657. ht->items306C[p_item2->dcmp_byte] = p_item2;
  658. p_item2 = libmpq_huff_call1500E740(ht, 1);
  659. p_item2->parent     = p_item1;
  660. p_item2->dcmp_byte  = n8bits;
  661. p_item2->byte_value = 0;
  662. ht->items306C[p_item2->dcmp_byte] = p_item2;
  663. p_item1->child = p_item2;
  664. libmpq_huff_call1500E820(ht, p_item2);
  665. if (ht->cmp0 == 0) {
  666. libmpq_huff_call1500E820(ht, ht->items306C[n8bits]);
  667. }
  668. dcmp_byte = n8bits;
  669. }
  670. if (dcmp_byte == 0x100) {
  671. break;
  672. }
  673. *out_pos++ = (unsigned char)dcmp_byte;
  674. if (--out_length == 0) {
  675. break;
  676. }
  677. if (ht->cmp0) {
  678. libmpq_huff_call1500E820(ht, ht->items306C[dcmp_byte]);
  679. }
  680. }
  681. return __int32(out_pos - out_buf);
  682. }
  683. int libmpq_huff_init_tree(struct huffman_tree *ht, struct huffman_tree_item *hi, unsigned int cmp) {
  684. int count;
  685. /* Clear links for all the items in the tree */
  686. for (hi = ht->items0008, count = 0x203; count != 0; hi++, count--) {
  687. hi->next = hi->prev = NULL;
  688. }
  689. ht->item3050 = NULL;
  690. ht->item3054 = PTR_PTR(&ht->item3054);
  691. ht->item3058 = PTR_NOT(ht->item3054);
  692. ht->item305C = NULL;
  693. ht->first    = PTR_PTR(&ht->first);
  694. ht->last     = PTR_NOT(ht->first);
  695. ht->offs0004 = 1;
  696. ht->items    = 0;
  697. /* Clear all huffman_decompress items. Do this only if preparing for decompression */
  698. if (cmp == LIBMPQ_HUFF_DECOMPRESS) {
  699. for (count = 0; count < sizeof(ht->qd3474) / sizeof(struct huffman_decompress); count++) {
  700. ht->qd3474[count].offs00 = 0;
  701. }
  702. }
  703. return 0;
  704. }