Leaked source code of windows server 2003
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.

226 lines
4.7 KiB

  1. // =================================================================================
  2. // Internet Character Set Conversion: Input from IS-2022-JP
  3. // =================================================================================
  4. #include "pch.hxx"
  5. #include "JisIn.h"
  6. #include "FEChrCnv.h"
  7. int JIS_to_ShiftJIS (CONV_CONTEXT *pcontext, UCHAR *pJIS, int JIS_len, UCHAR *pSJIS, int SJIS_len)
  8. {
  9. long lConvertedSize;
  10. if (!SJIS_len) {
  11. // Wanted the converted size
  12. if (!pcontext->pIncc0)
  13. pcontext->pIncc0 = new CInccJisIn;
  14. if (FAILED(((CInccJisIn*)pcontext->pIncc0)->GetStringSizeA(pJIS, JIS_len, &lConvertedSize)))
  15. return -1;
  16. } else {
  17. if (!pcontext->pIncc)
  18. pcontext->pIncc = new CInccJisIn;
  19. if (FAILED(((CInccJisIn*)pcontext->pIncc)->ConvertStringA(pJIS, JIS_len, pSJIS, SJIS_len, &lConvertedSize)))
  20. return -1;
  21. }
  22. if (!pJIS) {
  23. // Let's clean up our context here.
  24. if (pcontext->pIncc0) {
  25. delete pcontext->pIncc0;
  26. pcontext->pIncc0 = NULL;
  27. }
  28. if (pcontext->pIncc) {
  29. delete pcontext->pIncc;
  30. pcontext->pIncc = NULL;
  31. }
  32. return 0;
  33. }
  34. return (int)lConvertedSize;
  35. }
  36. CInccJisIn::CInccJisIn()
  37. {
  38. pfnNextProc = ConvMain;
  39. fKanaMode = FALSE;
  40. fKanjiMode = FALSE;
  41. }
  42. HRESULT CInccJisIn::ConvertByte(BYTE by)
  43. {
  44. return (this->*pfnNextProc)(FALSE, by, lNextParam);
  45. }
  46. HRESULT CInccJisIn::CleanUp()
  47. {
  48. return (this->*pfnNextProc)(TRUE, 0, lNextParam);
  49. }
  50. HRESULT CInccJisIn::ConvMain(BOOL fCleanUp, BYTE by, long lParam)
  51. {
  52. HRESULT hr = S_OK;
  53. if (!fCleanUp) {
  54. switch (by) {
  55. case SO:
  56. fKanaMode = TRUE;
  57. break;
  58. case SI:
  59. fKanaMode = FALSE;
  60. break;
  61. default:
  62. if (fKanaMode) {
  63. hr = Output(by | 0x80);
  64. } else {
  65. if (by == ESC) {
  66. pfnNextProc = ConvEsc;
  67. } else {
  68. if (fKanjiMode) {
  69. if (by == '*') {
  70. pfnNextProc = ConvStar;
  71. } else {
  72. pfnNextProc = ConvKanji;
  73. lNextParam = (long)by;
  74. }
  75. } else {
  76. hr = Output(by);
  77. }
  78. }
  79. }
  80. break;
  81. }
  82. }
  83. return hr;
  84. }
  85. HRESULT CInccJisIn::ConvEsc(BOOL fCleanUp, BYTE by, long lParam)
  86. {
  87. if (!fCleanUp) {
  88. switch (by) {
  89. case KANJI_IN_1ST_CHAR:
  90. pfnNextProc = ConvKanjiIn2;
  91. return ResultFromScode(S_OK);
  92. case KANJI_OUT_1ST_CHAR:
  93. pfnNextProc = ConvKanjiOut2;
  94. return ResultFromScode(S_OK);
  95. default:
  96. pfnNextProc = ConvMain;
  97. (void)Output(ESC);
  98. return ConvertByte(by);
  99. }
  100. } else {
  101. pfnNextProc = ConvMain;
  102. return Output(ESC);
  103. }
  104. }
  105. HRESULT CInccJisIn::ConvKanjiIn2(BOOL fCleanUp, BYTE by, long lParam)
  106. {
  107. pfnNextProc = ConvMain;
  108. if (!fCleanUp) {
  109. switch (by) {
  110. case KANJI_IN_2ND_CHAR1:
  111. case KANJI_IN_2ND_CHAR2:
  112. fKanjiMode = TRUE;
  113. return ResultFromScode(S_OK);
  114. case KANJI_IN_2ND_CHAR3:
  115. pfnNextProc = ConvKanjiIn3;
  116. return ResultFromScode(S_OK);
  117. default:
  118. (void)Output(ESC);
  119. (void)ConvertByte(KANJI_IN_1ST_CHAR);
  120. return ConvertByte(by);
  121. }
  122. } else {
  123. (void)Output(ESC);
  124. (void)ConvertByte(KANJI_IN_1ST_CHAR);
  125. return CleanUp();
  126. }
  127. }
  128. HRESULT CInccJisIn::ConvKanjiIn3(BOOL fCleanUp, BYTE by, long lParam)
  129. {
  130. pfnNextProc = ConvMain;
  131. if (!fCleanUp) {
  132. if (by == KANJI_IN_3RD_CHAR) {
  133. fKanjiMode = TRUE;
  134. return ResultFromScode(S_OK);
  135. } else {
  136. (void)Output(ESC);
  137. (void)ConvertByte(KANJI_IN_1ST_CHAR);
  138. (void)ConvertByte(KANJI_IN_2ND_CHAR3);
  139. return ConvertByte(by);
  140. }
  141. } else {
  142. (void)Output(ESC);
  143. (void)ConvertByte(KANJI_IN_1ST_CHAR);
  144. (void)ConvertByte(KANJI_IN_2ND_CHAR3);
  145. return CleanUp();
  146. }
  147. }
  148. HRESULT CInccJisIn::ConvKanjiOut2(BOOL fCleanUp, BYTE by, long lParam)
  149. {
  150. pfnNextProc = ConvMain;
  151. if (!fCleanUp) {
  152. switch (by) {
  153. case KANJI_OUT_2ND_CHAR1:
  154. case KANJI_OUT_2ND_CHAR2:
  155. fKanjiMode = FALSE;
  156. return ResultFromScode(S_OK);
  157. default:
  158. (void)Output(ESC);
  159. (void)ConvertByte(KANJI_OUT_1ST_CHAR);
  160. return ConvertByte(by);
  161. }
  162. } else {
  163. (void)Output(ESC);
  164. (void)ConvertByte(KANJI_OUT_1ST_CHAR);
  165. return CleanUp();
  166. }
  167. }
  168. HRESULT CInccJisIn::ConvStar(BOOL fCleanUp, BYTE by, long lParam)
  169. {
  170. pfnNextProc = ConvMain;
  171. if (!fCleanUp) {
  172. return Output(by | 0x80);
  173. } else {
  174. return Output('*');
  175. }
  176. }
  177. HRESULT CInccJisIn::ConvKanji(BOOL fCleanUp, BYTE byJisTrail, long lParam)
  178. {
  179. pfnNextProc = ConvMain;
  180. if (!fCleanUp) {
  181. BYTE bySJisLead;
  182. BYTE bySJisTrail;
  183. bySJisLead = ((BYTE)lParam - 0x21 >> 1) + 0x81;
  184. if (bySJisLead > 0x9f)
  185. bySJisLead += 0x40;
  186. bySJisTrail = byJisTrail + ((BYTE)lParam & 1 ? 0x1f : 0x7d);
  187. if (bySJisTrail >= 0x7f)
  188. bySJisTrail++;
  189. (void)Output(bySJisLead);
  190. return Output(bySJisTrail);
  191. } else {
  192. return Output((BYTE)lParam);
  193. }
  194. }