Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

279 lines
7.0 KiB

4 years ago
  1. #include "stdafx.h"
  2. #pragma hdrstop
  3. #include "ctable.h"
  4. // acLeadingZeroes gives the low order zeroes before the first
  5. // one bit in a byte value.
  6. extern char bCharTypes[];
  7. BYTE acLeadingZeroes[256] =
  8. {
  9. 8, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  10. 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  11. 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  12. 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  13. 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  14. 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  15. 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  16. 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  17. 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  18. 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  19. 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  20. 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  21. 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  22. 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  23. 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  24. 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
  25. };
  26. // Count of one leading one bits in lower half byte, going right to left.
  27. BYTE acOneBits[16] =
  28. {
  29. 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4
  30. };
  31. CCompressTable *CCompressTable::NewCompressTable(HGLOBAL hImage, LONG cbImage, HGLOBAL hIndex, LONG cbIndex)
  32. {
  33. CCompressTable *pct = new CCompressTable();
  34. JBITHDR jIHdr;
  35. int iWeightCount;
  36. int base;
  37. LPSTR lpIndex = (LPSTR) GlobalLock(hIndex);
  38. int ii;
  39. char *hlpImage;
  40. LPSTR lpImage;
  41. BOOL bSkip = (cbImage > (64L * 1024L)) ? TRUE : FALSE;
  42. int cb;
  43. ASSERT(pct);
  44. pct->m_hImage = hImage;
  45. hlpImage = (char *) GlobalLock(hImage);
  46. lpImage = (LPSTR) hlpImage;
  47. jIHdr = *((JBITHDR *) lpIndex);
  48. ASSERT(jIHdr.Magic == 'J');
  49. base = (int) jIHdr.cBits;
  50. iWeightCount = (int) jIHdr.cCount;
  51. lpIndex += sizeof(jIHdr);
  52. //
  53. // This must be less than 64K.
  54. //
  55. pct->m_hWeight = GlobalAlloc(GMEM_FIXED, sizeof(WEIGHT) * iWeightCount);
  56. PWEIGHTS pWeights = (PWEIGHTS) GlobalLock(pct->m_hWeight);
  57. CJCode JCode(base, iWeightCount, (LPSTR) lpIndex);
  58. for (ii = 0; ii < iWeightCount; ii++)
  59. {
  60. cb = JCode.GetNextDelta();
  61. pWeights[ii].cb = cb;
  62. pWeights[ii].pb = (LPSTR) lpImage;
  63. if (bCharTypes[*(pWeights[ii].pb)] & SYMBOL_CHAR)
  64. pWeights[ii].bSymbol = TRUE;
  65. else
  66. pWeights[ii].bSymbol = FALSE;
  67. lpImage += cb;
  68. if ((lpImage - ((LPSTR) hlpImage)) > (63L * 1024L))
  69. {
  70. if (bSkip)
  71. {
  72. cb = ((LPSTR) hlpImage) - (LPSTR) (63L * 1024L);
  73. hlpImage += (63L * 1024L);
  74. lpImage = (LPSTR) hlpImage + cb;
  75. }
  76. }
  77. }
  78. pct->m_pWeights = pWeights;
  79. return(pct);
  80. }
  81. INT CCompressTable::DeCompressString(LPSTR pbComp, LPSTR pbDecomp, int cbComp)
  82. {
  83. LPSTR pbLimit = pbComp + cbComp;
  84. LPSTR pbStartDecomp = pbDecomp;
  85. BYTE bCode;
  86. BOOL bPrevTokenSymbol = FALSE;
  87. BOOL bNextTokenSymbol = FALSE;
  88. int iIndex;
  89. int cb;
  90. while(pbComp < pbLimit)
  91. {
  92. bCode = *pbComp++;
  93. switch( acOneBits[0x0f & bCode])
  94. {
  95. case NDX_LOW_CLASS:
  96. bCode >>= 1;
  97. iIndex = ((int) bCode) & 0x00ff;
  98. ASSERT(iIndex > -1);
  99. bNextTokenSymbol = m_pWeights[iIndex].bSymbol;
  100. if (bNextTokenSymbol && bPrevTokenSymbol)
  101. {
  102. *pbDecomp++ = ' ';
  103. }
  104. memcpy( pbDecomp, m_pWeights[iIndex].pb, m_pWeights[iIndex].cb);
  105. pbDecomp += m_pWeights[iIndex].cb;
  106. break;
  107. case NDX_MEDIUM_CLASS:
  108. bCode >>= 2;
  109. iIndex = ((int) bCode) & 0x00ff;
  110. iIndex <<= 8;
  111. bCode = *pbComp++;
  112. iIndex |= bCode;
  113. iIndex += 128;
  114. ASSERT(iIndex > -1);
  115. bNextTokenSymbol = m_pWeights[iIndex].bSymbol;
  116. if (bNextTokenSymbol && bPrevTokenSymbol)
  117. {
  118. *pbDecomp++ = ' ';
  119. }
  120. memcpy( pbDecomp, m_pWeights[iIndex].pb, m_pWeights[iIndex].cb);
  121. pbDecomp += m_pWeights[iIndex].cb;
  122. break;
  123. case LITERAL_CLASS:
  124. bNextTokenSymbol = FALSE;
  125. bCode >>= 3;
  126. cb = (((int) bCode) & 0x00ff) + 1;
  127. memcpy( pbDecomp, pbComp, cb);
  128. pbDecomp += cb;
  129. pbComp += cb;
  130. break;
  131. case SPACES_CLASS:
  132. bNextTokenSymbol = FALSE;
  133. bCode >>= 4;
  134. cb = (((int) bCode) & 0x00ff) + 1;
  135. ASSERT(cb > 0);
  136. while (cb--)
  137. {
  138. *pbDecomp++ = ' ';
  139. }
  140. break;
  141. case NULL_CLASS:
  142. bNextTokenSymbol = FALSE;
  143. bCode >>= 4;
  144. cb = (((int) bCode) & 0x00ff) + 1;
  145. ASSERT(cb > 0);
  146. while (cb--)
  147. {
  148. *pbDecomp++ = 0x00;
  149. }
  150. break;
  151. }
  152. bPrevTokenSymbol = bNextTokenSymbol;
  153. }
  154. return( pbDecomp - pbStartDecomp);
  155. }
  156. CCompressTable::~CCompressTable()
  157. {
  158. GlobalUnlock(m_hWeight);
  159. GlobalFree(m_hWeight);
  160. GlobalUnlock(m_hImage);
  161. GlobalFree(m_hImage);
  162. }
  163. CJCode::CJCode( int base, int cCount, LPSTR pv)
  164. {
  165. m_base = base;
  166. m_cCount = cCount;
  167. m_pData = (DWORD FAR *) pv;
  168. m_cCurrent = 0;
  169. m_pDataCurrent = m_pData;
  170. m_iLeft = BITS_AVAIL;
  171. m_fBasisMask = ((DWORD)(~0)) >> (32 - m_base);
  172. }
  173. int CJCode::GetBits()
  174. {
  175. BYTE byte;
  176. int iBits;
  177. byte = (BYTE) (~(0x000000ff & *m_pDataCurrent));
  178. iBits = acLeadingZeroes[byte];
  179. if (iBits == 8)
  180. {
  181. *m_pDataCurrent >>= iBits;
  182. m_iLeft -= 8;
  183. return(iBits + GetBits());
  184. }
  185. if (iBits < m_iLeft)
  186. {
  187. *m_pDataCurrent >>= iBits + 1;
  188. m_iLeft -= iBits + 1;
  189. return(iBits);
  190. }
  191. ASSERT(!(iBits > m_iLeft));
  192. m_iLeft = BITS_AVAIL;
  193. m_pDataCurrent++;
  194. return(iBits + GetBits());
  195. }
  196. int CJCode::GetNextDelta()
  197. {
  198. DWORD dwCode = 0;
  199. int iBits;
  200. int iDelta;
  201. DWORD dwTmp;
  202. iDelta = 0;
  203. iBits = GetBits();
  204. dwCode = *m_pDataCurrent & m_fBasisMask;
  205. if (m_iLeft >= m_base)
  206. {
  207. *m_pDataCurrent >>= m_base;
  208. m_iLeft -= m_base;
  209. }
  210. else
  211. {
  212. m_pDataCurrent++;
  213. dwTmp = *m_pDataCurrent & (((DWORD) ~0) >> (32 - m_base + m_iLeft));
  214. dwTmp <<= m_iLeft;
  215. dwCode |= dwTmp;
  216. *m_pDataCurrent >>= m_base - m_iLeft;
  217. m_iLeft = BITS_AVAIL - m_base + m_iLeft;
  218. }
  219. iDelta = iBits << m_base;
  220. iDelta |= dwCode;
  221. return(iDelta + 1);
  222. }