1 /*=============================================================================
\r
5 ===============================================================================
\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.
\r
8 / Redistribution and use in source and binary forms, with or without
\r
9 / modification, are permitted provided that the following conditions
\r
12 / 1. Redistributions of source code must retain the above copyright
\r
13 / notice, this list of conditions and the following disclaimer.
\r
14 / 2. Redistributions in binary form must reproduce the above copyright
\r
15 / notice, this list of conditions and the following disclaimer in the
\r
16 / documentation and/or other materials provided with the distribution.
\r
18 / THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
\r
19 / IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
\r
20 / OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
\r
21 / IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
\r
22 / INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
\r
23 / BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
\r
24 / USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
\r
25 / ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
\r
26 / (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
\r
27 / THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\r
28 /============================================================================*/
\r
34 #include <winsock.h>
\r
35 #include <mbstring.h>
\r
36 #include <windowsx.h>
\r
39 #include "resource.h"
\r
43 #define CONV_ASCII 0 /* ASCII文字処理中 */
\r
44 #define CONV_KANJI 1 /* 漢字処理中 */
\r
45 #define CONV_KANA 2 /* 半角カタカナ処理中 */
\r
48 /*===== プロトタイプ =====*/
\r
50 static char *ConvEUCtoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put);
\r
51 static char *ConvJIStoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put);
\r
52 static char *ConvSJIStoEUCkanaProc(CODECONVINFO *cInfo, char Dt, char *Put);
\r
53 static char *ConvSJIStoJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put);
\r
54 static int HanKataToZen(char Ch);
\r
55 static int AskDakuon(char Ch, char Daku);
\r
57 static int CheckOnSJIS(uchar *Pos, uchar *Btm);
\r
58 static int CheckOnEUC(uchar *Pos, uchar *Btm);
\r
59 static int ConvertIBMExtendedChar(int code);
\r
64 /*----- 漢字コード変換のテストプログラム ------------------------------------*/
\r
66 void CodeCnvTest(void)
\r
69 #define BUFBUF2 BUFBUF+3
\r
79 // DoPrintf("---START ZEN");
\r
81 Strm1 = fopen("in.txt", "rb");
\r
82 Strm2 = fopen("out_zen.txt", "wb");
\r
84 InitCodeConvInfo(&cInfo);
\r
85 cInfo.KanaCnv = YES;
\r
88 while((Byte = fread(Buf, 1, BUFBUF, Strm1)) != 0)
\r
91 cInfo.StrLen = Byte;
\r
93 cInfo.BufSize = BUFBUF2;
\r
95 // DoPrintf("READ %d", Byte);
\r
99 // Continue = ConvEUCtoSJIS(&cInfo);
\r
100 // Continue = ConvJIStoSJIS(&cInfo);
\r
101 // Continue = ConvSJIStoEUC(&cInfo);
\r
102 // Continue = ConvSJIStoJIS(&cInfo);
\r
103 Continue = ConvSMBtoSJIS(&cInfo);
\r
104 // Continue = ConvSJIStoSMB_HEX(&cInfo);
\r
105 // Continue = ConvSJIStoSMB_CAP(&cInfo);
\r
107 fwrite(Buf2, cInfo.OutLen, 1, Strm2);
\r
108 // DoPrintf("WRITE %d", cInfo.OutLen);
\r
111 while(Continue == YES);
\r
115 cInfo.BufSize = BUFBUF2;
\r
116 FlushRestData(&cInfo);
\r
117 fwrite(Buf2, cInfo.OutLen, 1, Strm2);
\r
118 // DoPrintf("WRITE %d", cInfo.OutLen);
\r
125 // DoPrintf("---START HAN");
\r
127 Strm1 = fopen("in.txt", "rb");
\r
128 Strm2 = fopen("out_han.txt", "wb");
\r
130 InitCodeConvInfo(&cInfo);
\r
131 cInfo.KanaCnv = NO;
\r
134 while((Byte = fread(Buf, 1, BUFBUF, Strm1)) != 0)
\r
137 cInfo.StrLen = Byte;
\r
139 cInfo.BufSize = BUFBUF2;
\r
141 // DoPrintf("READ %d", Byte);
\r
145 // Continue = ConvEUCtoSJIS(&cInfo);
\r
146 // Continue = ConvJIStoSJIS(&cInfo);
\r
147 // Continue = ConvSJIStoEUC(&cInfo);
\r
148 // Continue = ConvSJIStoJIS(&cInfo);
\r
149 Continue = ConvSMBtoSJIS(&cInfo);
\r
150 // Continue = ConvSJIStoSMB_HEX(&cInfo);
\r
151 // Continue = ConvSJIStoSMB_CAP(&cInfo);
\r
152 fwrite(Buf2, cInfo.OutLen, 1, Strm2);
\r
153 // DoPrintf("WRITE %d", cInfo.OutLen);
\r
156 while(Continue == YES);
\r
160 cInfo.BufSize = BUFBUF2;
\r
161 FlushRestData(&cInfo);
\r
162 fwrite(Buf2, cInfo.OutLen, 1, Strm2);
\r
163 // DoPrintf("WRITE %d", cInfo.OutLen);
\r
168 // DoPrintf("---END");
\r
177 /*----- 改行コード変換のテストプログラム ------------------------------------*/
\r
179 void TermCodeCnvTest(void)
\r
182 #define BUFBUF2 BUFBUF
\r
184 TERMCODECONVINFO cInfo;
\r
186 char Buf2[BUFBUF2];
\r
192 // DoPrintf("---START");
\r
194 Strm1 = fopen("in.txt", "rb");
\r
195 Strm2 = fopen("out.txt", "wb");
\r
197 InitTermCodeConvInfo(&cInfo);
\r
199 while((Byte = fread(Buf, 1, BUFBUF, Strm1)) != 0)
\r
202 cInfo.StrLen = Byte;
\r
204 cInfo.BufSize = BUFBUF2;
\r
206 // DoPrintf("READ %d", Byte);
\r
210 Continue = ConvTermCodeToCRLF(&cInfo);
\r
212 fwrite(Buf2, cInfo.OutLen, 1, Strm2);
\r
213 // DoPrintf("WRITE %d", cInfo.OutLen);
\r
216 while(Continue == YES);
\r
220 cInfo.BufSize = BUFBUF2;
\r
221 FlushRestTermCodeConvData(&cInfo);
\r
222 fwrite(Buf2, cInfo.OutLen, 1, Strm2);
\r
223 // DoPrintf("WRITE %d", cInfo.OutLen);
\r
228 // DoPrintf("---END");
\r
245 /*----- 改行コード変換情報を初期化 --------------------------------------------
\r
248 * TERMCODECONVINFO *cInfo : 改行コード変換情報
\r
252 *----------------------------------------------------------------------------*/
\r
254 void InitTermCodeConvInfo(TERMCODECONVINFO *cInfo)
\r
261 /*----- 改行コード変換の残り情報を出力 ----------------------------------------
\r
264 * TERMCODECONVINFO *cInfo : 改行コード変換情報
\r
267 * int くり返しフラグ (=NO)
\r
271 *----------------------------------------------------------------------------*/
\r
273 int FlushRestTermCodeConvData(TERMCODECONVINFO *cInfo)
\r
279 if(cInfo->Term == 0x0D)
\r
282 cInfo->OutLen = Put - cInfo->Buf;
\r
288 /*----- 改行コードをCRLFに変換 -------------------------------------------------
\r
291 * TERMCODECONVINFO *cInfo : 改行コード変換情報
\r
294 * int くり返しフラグ (YES/NO)
\r
297 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
298 *----------------------------------------------------------------------------*/
\r
300 int ConvTermCodeToCRLF(TERMCODECONVINFO *cInfo)
\r
310 Limit = cInfo->Buf + cInfo->BufSize - 1;
\r
312 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
322 if(cInfo->Term == 0x0D)
\r
325 cInfo->Term = *Str++;
\r
331 if(cInfo->Term != 0x0D)
\r
336 if(cInfo->Term == 0x0D)
\r
345 cInfo->OutLen = Put - cInfo->Buf;
\r
351 /*----- 漢字コード変換情報を初期化 --------------------------------------------
\r
354 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
358 *----------------------------------------------------------------------------*/
\r
360 void InitCodeConvInfo(CODECONVINFO *cInfo)
\r
362 cInfo->KanaCnv = YES;
\r
364 cInfo->EscProc = 0;
\r
365 cInfo->KanjiMode = CONV_ASCII;
\r
366 cInfo->KanjiFst = 0;
\r
367 cInfo->KanaPrev = 0;
\r
368 cInfo->KanaProc = NULL;
\r
370 cInfo->EscUTF8Len = 0;
\r
375 /*----- 漢字コード変換の残り情報を出力 ----------------------------------------
\r
378 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
381 * int くり返しフラグ (=NO)
\r
385 *----------------------------------------------------------------------------*/
\r
387 int FlushRestData(CODECONVINFO *cInfo)
\r
393 if(cInfo->KanaProc != NULL)
\r
394 Put = (cInfo->KanaProc)(cInfo, 0, Put);
\r
396 if(cInfo->KanjiFst != 0)
\r
397 *Put++ = cInfo->KanjiFst;
\r
398 if(cInfo->EscProc >= 1)
\r
399 *Put++ = cInfo->EscCode[0];
\r
400 if(cInfo->EscProc == 2)
\r
401 *Put++ = cInfo->EscCode[1];
\r
403 memcpy(Put, cInfo->EscUTF8, sizeof(char) * cInfo->EscUTF8Len);
\r
404 Put += cInfo->EscUTF8Len;
\r
406 cInfo->OutLen = Put - cInfo->Buf;
\r
412 /*----- EUC漢字コードをSHIFT-JIS漢字コードに変換 ------------------------------
\r
415 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
418 * int くり返しフラグ (YES/NO)
\r
421 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
422 *----------------------------------------------------------------------------*/
\r
424 int ConvEUCtoSJIS(CODECONVINFO *cInfo)
\r
432 cInfo->KanaProc = &ConvEUCtoSJISkanaProc;
\r
437 Limit = cInfo->Buf + cInfo->BufSize - 2;
\r
439 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
447 if((*Str & 0x80) != 0)
\r
449 if(cInfo->KanjiFst == 0)
\r
450 cInfo->KanjiFst = *Str++;
\r
453 if((uchar)cInfo->KanjiFst == (uchar)0x8E) /* 半角カタカナ */
\r
455 Put = ConvEUCtoSJISkanaProc(cInfo, *Str++, Put);
\r
459 Put = ConvEUCtoSJISkanaProc(cInfo, 0, Put);
\r
461 Kcode = _mbcjistojms(((cInfo->KanjiFst & 0x7F) * 0x100) + (*Str++ & 0x7F));
\r
462 *Put++ = HIGH8(Kcode);
\r
463 *Put++ = LOW8(Kcode);
\r
465 cInfo->KanjiFst = 0;
\r
470 Put = ConvEUCtoSJISkanaProc(cInfo, 0, Put);
\r
472 if(cInfo->KanjiFst != 0)
\r
474 *Put++ = cInfo->KanjiFst;
\r
475 cInfo->KanjiFst = 0;
\r
482 cInfo->OutLen = Put - cInfo->Buf;
\r
488 /*----- EUC-->SHIFT-JIS漢字コードに変換の半角カタカナの処理 -------------------
\r
491 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
493 * char *Put : データセット位置
\r
497 *----------------------------------------------------------------------------*/
\r
499 static char *ConvEUCtoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)
\r
504 if(cInfo->KanaCnv == NO)
\r
511 if(cInfo->KanaPrev != 0)
\r
513 Daku = AskDakuon(cInfo->KanaPrev, Dt);
\r
515 Kcode = _mbcjistojms(HanKataToZen(cInfo->KanaPrev)) + Daku;
\r
516 *Put++ = HIGH8(Kcode);
\r
517 *Put++ = LOW8(Kcode);
\r
520 cInfo->KanaPrev = Dt;
\r
522 cInfo->KanaPrev = 0;
\r
525 cInfo->KanaPrev = Dt;
\r
531 /*----- JIS漢字コードをSHIFT-JIS漢字コードに変換 ------------------------------
\r
534 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
537 * int くり返しフラグ (YES/NO)
\r
540 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
542 * エスケープコードは、次のものに対応している
\r
543 * 漢字開始 <ESC>$B <ESC>$@
\r
545 * 漢字終了 <ESC>(B <ESC>(J <ESC>(H
\r
546 *----------------------------------------------------------------------------*/
\r
548 int ConvJIStoSJIS(CODECONVINFO *cInfo)
\r
556 cInfo->KanaProc = &ConvJIStoSJISkanaProc;
\r
561 Limit = cInfo->Buf + cInfo->BufSize - 3;
\r
563 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
571 if(cInfo->EscProc == 0)
\r
575 if(cInfo->KanjiFst != 0)
\r
577 *Put++ = cInfo->KanjiFst;
\r
578 cInfo->KanjiFst = 0;
\r
580 Put = ConvJIStoSJISkanaProc(cInfo, 0, Put);
\r
582 cInfo->EscCode[cInfo->EscProc] = *Str++;
\r
587 if(cInfo->KanjiMode == CONV_KANA)
\r
589 if(cInfo->KanjiFst != 0)
\r
591 *Put++ = cInfo->KanjiFst;
\r
592 cInfo->KanjiFst = 0;
\r
595 if((*Str >= 0x21) && (*Str <= 0x5F))
\r
597 Put = ConvJIStoSJISkanaProc(cInfo, *Str++, Put);
\r
601 Put = ConvJIStoSJISkanaProc(cInfo, 0, Put);
\r
605 else if(cInfo->KanjiMode == CONV_KANJI)
\r
607 Put = ConvJIStoSJISkanaProc(cInfo, 0, Put);
\r
608 if((*Str >= 0x21) && (*Str <= 0x7E))
\r
610 if(cInfo->KanjiFst == 0)
\r
611 cInfo->KanjiFst = *Str++;
\r
614 Kcode = _mbcjistojms((cInfo->KanjiFst * 0x100) + *Str++);
\r
615 *Put++ = HIGH8(Kcode);
\r
616 *Put++ = LOW8(Kcode);
\r
617 cInfo->KanjiFst = 0;
\r
622 if(cInfo->KanjiFst == 0)
\r
626 *Put++ = cInfo->KanjiFst;
\r
628 cInfo->KanjiFst = 0;
\r
634 Put = ConvJIStoSJISkanaProc(cInfo, 0, Put);
\r
639 else if(cInfo->EscProc == 1)
\r
641 if((*Str == '$') || (*Str == '('))
\r
643 cInfo->EscCode[cInfo->EscProc] = *Str++;
\r
648 *Put++ = cInfo->EscCode[0];
\r
650 cInfo->EscProc = 0;
\r
653 else if(cInfo->EscProc == 2)
\r
655 if((cInfo->EscCode[1] == '$') && ((*Str == 'B') || (*Str == '@')))
\r
656 cInfo->KanjiMode = CONV_KANJI;
\r
657 else if((cInfo->EscCode[1] == '(') && (*Str == 'I'))
\r
658 cInfo->KanjiMode = CONV_KANA;
\r
659 else if((cInfo->EscCode[1] == '(') && ((*Str == 'B') || (*Str == 'J') || (*Str == 'H')))
\r
660 cInfo->KanjiMode = CONV_ASCII;
\r
663 *Put++ = cInfo->EscCode[0];
\r
664 *Put++ = cInfo->EscCode[1];
\r
665 if((cInfo->KanjiMode == CONV_KANJI) && ((*Str >= 0x21) && (*Str <= 0x7E)))
\r
666 cInfo->KanjiFst = *Str;
\r
671 cInfo->EscProc = 0;
\r
676 cInfo->OutLen = Put - cInfo->Buf;
\r
682 /*----- JIS-->SHIFT-JIS漢字コードに変換の半角カタカナの処理 -------------------
\r
685 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
687 * char *Put : データセット位置
\r
691 *----------------------------------------------------------------------------*/
\r
693 static char *ConvJIStoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)
\r
698 Dt = (uchar)Dt + (uchar)0x80;
\r
699 if(cInfo->KanaCnv == NO)
\r
701 if((uchar)Dt != (uchar)0x80)
\r
706 if(cInfo->KanaPrev != 0)
\r
708 Daku = AskDakuon(cInfo->KanaPrev, Dt);
\r
709 Kcode = _mbcjistojms(HanKataToZen(cInfo->KanaPrev)) + Daku;
\r
710 *Put++ = HIGH8(Kcode);
\r
711 *Put++ = LOW8(Kcode);
\r
713 if((Daku == 0) && ((uchar)Dt != (uchar)0x80))
\r
714 cInfo->KanaPrev = Dt;
\r
716 cInfo->KanaPrev = 0;
\r
718 else if((uchar)Dt != (uchar)0x80)
\r
719 cInfo->KanaPrev = Dt;
\r
725 /*----- Samba-HEX/Samba-CAP漢字コードをSHIFT-JIS漢字コードに変換 --------------
\r
728 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
731 * int くり返しフラグ (YES/NO)
\r
734 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
735 * 分割された入力文字列の変換はサポートしていない
\r
736 * 半角カタカナの変換設定には対応していない
\r
737 *----------------------------------------------------------------------------*/
\r
739 int ConvSMBtoSJIS(CODECONVINFO *cInfo)
\r
749 Limit = cInfo->Buf + cInfo->BufSize - 2;
\r
751 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
759 if((*Str == SAMBA_HEX_TAG) && (cInfo->StrLen >= 3))
\r
761 if(isxdigit(*(Str+1)) && isxdigit(*(Str+2)))
\r
763 *Put++ = N2INT(hex2bin(*(Str+1)), hex2bin(*(Str+2)));
\r
765 cInfo->StrLen -= 2;
\r
775 cInfo->OutLen = Put - cInfo->Buf;
\r
781 /*----- SHIFT-JIS漢字コードをEUC漢字コードに変換 ------------------------------
\r
784 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
787 * int くり返しフラグ (YES/NO)
\r
790 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
791 *----------------------------------------------------------------------------*/
\r
793 int ConvSJIStoEUC(CODECONVINFO *cInfo)
\r
801 cInfo->KanaProc = &ConvSJIStoEUCkanaProc;
\r
806 Limit = cInfo->Buf + cInfo->BufSize - 2;
\r
808 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
816 if(cInfo->KanjiFst == 0)
\r
818 if((((uchar)*Str >= (uchar)0x81) && ((uchar)*Str <= (uchar)0x9F)) ||
\r
819 ((uchar)*Str >= (uchar)0xE0))
\r
821 Put = ConvSJIStoEUCkanaProc(cInfo, 0, Put);
\r
822 cInfo->KanjiFst = *Str++;
\r
824 else if(((uchar)*Str >= (uchar)0xA0) && ((uchar)*Str <= (uchar)0xDF))
\r
826 Put = ConvSJIStoEUCkanaProc(cInfo, *Str++, Put);
\r
830 Put = ConvSJIStoEUCkanaProc(cInfo, 0, Put);
\r
836 if((uchar)*Str >= (uchar)0x40)
\r
838 Kcode = ConvertIBMExtendedChar(((uchar)cInfo->KanjiFst * 0x100) + (uchar)*Str++);
\r
839 Kcode = _mbcjmstojis(Kcode);
\r
840 *Put++ = HIGH8(Kcode) | 0x80;
\r
841 *Put++ = LOW8(Kcode) | 0x80;
\r
845 *Put++ = cInfo->KanjiFst;
\r
848 cInfo->KanjiFst = 0;
\r
853 cInfo->OutLen = Put - cInfo->Buf;
\r
859 /*----- SHIFT-JIS-->EUC漢字コードに変換の半角カタカナの処理 -------------------
\r
862 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
864 * char *Put : データセット位置
\r
868 *----------------------------------------------------------------------------*/
\r
870 static char *ConvSJIStoEUCkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)
\r
875 if(cInfo->KanaCnv == NO)
\r
879 Kcode = 0x8E00 + (uchar)Dt;
\r
880 *Put++ = HIGH8(Kcode) | 0x80;
\r
881 *Put++ = LOW8(Kcode) | 0x80;
\r
886 if(cInfo->KanaPrev != 0)
\r
888 Daku = AskDakuon(cInfo->KanaPrev, Dt);
\r
889 Kcode = HanKataToZen(cInfo->KanaPrev) + Daku;
\r
890 *Put++ = HIGH8(Kcode) | 0x80;
\r
891 *Put++ = LOW8(Kcode) | 0x80;
\r
894 cInfo->KanaPrev = Dt;
\r
896 cInfo->KanaPrev = 0;
\r
899 cInfo->KanaPrev = Dt;
\r
905 /*----- SHIFT-JIS漢字コードをJIS漢字コードに変換 ------------------------------
\r
908 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
911 * int くり返しフラグ (YES/NO)
\r
914 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
916 * エスケープコードは、次のものを使用する
\r
920 *----------------------------------------------------------------------------*/
\r
922 int ConvSJIStoJIS(CODECONVINFO *cInfo)
\r
930 cInfo->KanaProc = &ConvSJIStoJISkanaProc;
\r
935 Limit = cInfo->Buf + cInfo->BufSize - 5;
\r
937 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
945 if(cInfo->KanjiFst == 0)
\r
947 if((((uchar)*Str >= (uchar)0x81) && ((uchar)*Str <= (uchar)0x9F)) ||
\r
948 ((uchar)*Str >= (uchar)0xE0))
\r
950 Put = ConvSJIStoJISkanaProc(cInfo, 0, Put);
\r
951 cInfo->KanjiFst = *Str++;
\r
953 else if(((uchar)*Str >= (uchar)0xA0) && ((uchar)*Str <= (uchar)0xDF))
\r
955 Put = ConvSJIStoJISkanaProc(cInfo, *Str++, Put);
\r
959 Put = ConvSJIStoJISkanaProc(cInfo, 0, Put);
\r
960 if(cInfo->KanjiMode != CONV_ASCII)
\r
965 cInfo->KanjiMode = CONV_ASCII;
\r
972 Put = ConvSJIStoJISkanaProc(cInfo, 0, Put);
\r
973 if((uchar)*Str >= (uchar)0x40)
\r
975 if(cInfo->KanjiMode != CONV_KANJI)
\r
980 cInfo->KanjiMode = CONV_KANJI;
\r
983 Kcode = ConvertIBMExtendedChar(((uchar)cInfo->KanjiFst * 0x100) + (uchar)*Str++);
\r
984 Kcode = _mbcjmstojis(Kcode);
\r
985 *Put++ = HIGH8(Kcode);
\r
986 *Put++ = LOW8(Kcode);
\r
990 if(cInfo->KanjiMode != CONV_ASCII)
\r
995 cInfo->KanjiMode = CONV_ASCII;
\r
997 *Put++ = cInfo->KanjiFst;
\r
1000 cInfo->KanjiFst = 0;
\r
1005 cInfo->OutLen = Put - cInfo->Buf;
\r
1011 /*----- SHIFT-JIS-->JIS漢字コードに変換の半角カタカナの処理 -------------------
\r
1014 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
1016 * char *Put : データセット位置
\r
1019 * char *次のデータセット位置
\r
1020 *----------------------------------------------------------------------------*/
\r
1022 static char *ConvSJIStoJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)
\r
1027 if(cInfo->KanaCnv == NO)
\r
1031 if(cInfo->KanjiMode != CONV_KANA)
\r
1036 cInfo->KanjiMode = CONV_KANA;
\r
1038 *Put++ = (uchar)Dt - (uchar)0x80;
\r
1043 if(cInfo->KanaPrev != 0)
\r
1045 if(cInfo->KanjiMode != CONV_KANJI)
\r
1050 cInfo->KanjiMode = CONV_KANJI;
\r
1052 Daku = AskDakuon(cInfo->KanaPrev, Dt);
\r
1053 Kcode = HanKataToZen(cInfo->KanaPrev) + Daku;
\r
1054 *Put++ = HIGH8(Kcode);
\r
1055 *Put++ = LOW8(Kcode);
\r
1058 cInfo->KanaPrev = Dt;
\r
1060 cInfo->KanaPrev = 0;
\r
1063 cInfo->KanaPrev = Dt;
\r
1069 /*----- SHIFT-JIS漢字コードをSamba-HEX漢字コードに変換 ------------------------
\r
1072 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
1075 * int くり返しフラグ (YES/NO)
\r
1078 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
1079 * 分割された入力文字列の変換はサポートしていない
\r
1080 * 半角カタカナの変換設定には対応していない
\r
1081 *----------------------------------------------------------------------------*/
\r
1083 int ConvSJIStoSMB_HEX(CODECONVINFO *cInfo)
\r
1093 Limit = cInfo->Buf + cInfo->BufSize - 6;
\r
1095 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
1103 if((cInfo->StrLen >= 2) &&
\r
1104 ((((uchar)*Str >= (uchar)0x81) && ((uchar)*Str <= (uchar)0x9F)) ||
\r
1105 ((uchar)*Str >= (uchar)0xE0)))
\r
1107 sprintf(Put, "%c%02x%c%02x", SAMBA_HEX_TAG, (uchar)*Str, SAMBA_HEX_TAG, (uchar)*(Str+1));
\r
1112 else if((uchar)*Str >= (uchar)0x80)
\r
1114 sprintf(Put, "%c%02x", SAMBA_HEX_TAG, (uchar)*Str++);
\r
1122 cInfo->OutLen = Put - cInfo->Buf;
\r
1128 /*----- SHIFT-JIS漢字コードをSamba-CAP漢字コードに変換 ------------------------
\r
1131 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
1134 * int くり返しフラグ (YES/NO)
\r
1137 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
1138 * 分割された入力文字列の変換はサポートしていない
\r
1139 *----------------------------------------------------------------------------*/
\r
1141 int ConvSJIStoSMB_CAP(CODECONVINFO *cInfo)
\r
1151 Limit = cInfo->Buf + cInfo->BufSize - 6;
\r
1153 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
1161 if((uchar)*Str >= (uchar)0x80)
\r
1163 sprintf(Put, "%c%02x", SAMBA_HEX_TAG, (uchar)*Str++);
\r
1171 cInfo->OutLen = Put - cInfo->Buf;
\r
1177 /*----- 1バイトカタカナをJIS漢字コードに変換 ---------------------------------
\r
1180 * char Ch : 1バイトカタカナコード
\r
1184 *----------------------------------------------------------------------------*/
\r
1186 static int HanKataToZen(char Ch)
\r
1188 static const int Katakana[] = {
\r
1189 0x2121, 0x2123, 0x2156, 0x2157, 0x2122, 0x2126, 0x2572, 0x2521,
\r
1190 0x2523, 0x2525, 0x2527, 0x2529, 0x2563, 0x2565, 0x2567, 0x2543,
\r
1191 0x213C, 0x2522, 0x2524, 0x2526, 0x2528, 0x252A, 0x252B, 0x252D,
\r
1192 0x252F, 0x2531, 0x2533, 0x2535, 0x2537, 0x2539, 0x253B, 0x253D,
\r
1193 0x253F, 0x2541, 0x2544, 0x2546, 0x2548, 0x254A, 0x254B, 0x254C,
\r
1194 0x254D, 0x254E, 0x254F, 0x2552, 0x2555, 0x2558, 0x255B, 0x255E,
\r
1195 0x255F, 0x2560, 0x2561, 0x2562, 0x2564, 0x2566, 0x2568, 0x2569,
\r
1196 0x256A, 0x256B, 0x256C, 0x256D, 0x256F, 0x2573, 0x212B, 0x212C
\r
1199 return(Katakana[(uchar)Ch - (uchar)0xA0]);
\r
1203 /*----- 濁音/半濁音になる文字かチェック --------------------------------------
\r
1206 * char Ch : 1バイトカタカナコード
\r
1207 * char Daku : 濁点/半濁点
\r
1210 * int 文字コードに加える値 (0=濁音/半濁音にならない)
\r
1211 *----------------------------------------------------------------------------*/
\r
1213 static int AskDakuon(char Ch, char Daku)
\r
1218 if((uchar)Daku == (uchar)0xDE)
\r
1220 if((((uchar)Ch >= (uchar)0xB6) && ((uchar)Ch <= (uchar)0xC4)) ||
\r
1221 (((uchar)Ch >= (uchar)0xCA) && ((uchar)Ch <= (uchar)0xCE)))
\r
1226 else if((uchar)Daku == (uchar)0xDF)
\r
1228 if(((uchar)Ch >= (uchar)0xCA) && ((uchar)Ch <= (uchar)0xCE))
\r
1247 /*----- 文字列の漢字コードを調べ、Shift-JISに変換 -----------------------------
\r
1250 * char *Text : 文字列
\r
1251 * int Pref : SJIS/EUCの優先指定
\r
1252 * KANJI_SJIS / KANJI_EUC / KANJI_NOCNV=SJIS/EUCのチェックはしない
\r
1256 *----------------------------------------------------------------------------*/
\r
1258 void ConvAutoToSJIS(char *Text, int Pref)
\r
1262 CODECONVINFO cInfo;
\r
1264 Code = CheckKanjiCode(Text, strlen(Text), Pref);
\r
1265 if(Code != KANJI_SJIS)
\r
1267 Buf = malloc(strlen(Text)+1);
\r
1270 InitCodeConvInfo(&cInfo);
\r
1271 cInfo.KanaCnv = NO;
\r
1273 cInfo.StrLen = strlen(Text);
\r
1275 cInfo.BufSize = strlen(Text);
\r
1280 ConvJIStoSJIS(&cInfo);
\r
1284 ConvEUCtoSJIS(&cInfo);
\r
1288 *(Buf + cInfo.OutLen) = NUL;
\r
1289 strcpy(Text, Buf);
\r
1297 /*----- 使われている漢字コードを調べる ----------------------------------------
\r
1300 * char *Text : 文字列
\r
1301 * int Size : 文字列の長さ
\r
1302 * int Pref : SJIS/EUCの優先指定
\r
1303 * KANJI_SJIS / KANJI_EUC / KANJI_NOCNV=SJIS/EUCのチェックはしない
\r
1306 * int 漢字コード (KANJI_xxx)
\r
1307 *----------------------------------------------------------------------------*/
\r
1309 int CheckKanjiCode(char *Text, int Size, int Pref)
\r
1321 Btm = Text + Size;
\r
1323 /* JIS漢字コードのチェック */
\r
1325 while((Pos = memchr(Pos, 0x1b, Btm-Pos-2)) != NULL)
\r
1328 if((memcmp(Pos, "$B", 2) == 0) || /* <ESC>$B */
\r
1329 (memcmp(Pos, "$@", 2) == 0) || /* <ESC>$@ */
\r
1330 (memcmp(Pos, "(I", 2) == 0)) /* <ESC>(I */
\r
1337 /* EUCとSHIFT-JIS漢字コードのチェック */
\r
1340 if(Pref != KANJI_NOCNV)
\r
1346 PointSJIS = CheckOnSJIS(Pos, Btm);
\r
1347 PointEUC = CheckOnEUC(Pos, Btm);
\r
1348 if(PointSJIS > PointEUC)
\r
1353 if(PointSJIS < PointEUC)
\r
1358 if((Pos = memchr(Pos, '\n', Btm-Pos)) == NULL)
\r
1371 /*----- SHIFT-JISコードの可能性があるかチェック --------------------------------
\r
1374 * uchar *Pos : 文字列
\r
1375 * uchar *Btm : 文字列の末尾
\r
1381 * High 81-FF (A0-DFは半角) (EB以降はほとんど無い)
\r
1383 *----------------------------------------------------------------------------*/
\r
1385 static int CheckOnSJIS(uchar *Pos, uchar *Btm)
\r
1392 while((Point > 0) && (Pos < Btm) && (*Pos != '\n'))
\r
1394 if(FstOnTwo == YES)
\r
1396 if((*Pos < 0x40) || (*Pos > 0xFC)) /* 2バイト目は 0x40~0xFC */
\r
1400 else if(*Pos >= 0x81)
\r
1402 if((*Pos < 0xA0) || (*Pos > 0xDF)) /* 半角カナでなければ */
\r
1404 if(*Pos >= 0xEB) /* 1バイト目は0xEB以降はほとんど無い */
\r
1411 if(FstOnTwo == YES) /* 1バイト目で終わっているのはおかしい */
\r
1418 /*----- EUCコードの可能性があるかチェック -------------------------------------
\r
1421 * uchar *Pos : 文字列
\r
1422 * uchar *Btm : 文字列の末尾
\r
1430 *----------------------------------------------------------------------------*/
\r
1432 static int CheckOnEUC(uchar *Pos, uchar *Btm)
\r
1439 while((Point > 0) && (Pos < Btm) && (*Pos != '\n'))
\r
1443 if((*Pos < 0xA1) || (*Pos > 0xFE)) /* 2バイト目は 0xA1~0xFE */
\r
1447 else if(FstOnTwo == 2) /* 半角カナ */
\r
1449 if((*Pos < 0xA0) || (*Pos > 0xDF)) /* 2バイト目は 0xA0~0xDF */
\r
1455 if(*Pos == 0x8E) /* 0x8E??は半角カナ */
\r
1457 else if((*Pos >= 0xA1) && (*Pos <= 0xFE))
\r
1462 if(FstOnTwo != 0) /* 1バイト目で終わっているのはおかしい */
\r
1470 /*----- UTF-8漢字コードをSHIFT-JIS漢字コードに変換 ------------------------------
\r
1473 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
1476 * int くり返しフラグ (YES/NO)
\r
1479 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
1480 *----------------------------------------------------------------------------*/
\r
1482 int ConvUTF8NtoSJIS(CODECONVINFO *cInfo)
\r
1486 // char temp_string[2048];
\r
1487 int string_length;
\r
1490 // 終端のNULLを含むバグを修正
\r
1499 // 生成される中間コードのサイズを調べる
\r
1500 // string_length = MultiByteToWideChar(
\r
1501 // CP_UTF8, // 変換先文字コード
\r
1502 // 0, // フラグ(0:なし)
\r
1503 // cInfo->Str, // 変換元文字列
\r
1504 // -1, // 変換元文字列バイト数(-1:自動)
\r
1505 // NULL, // 変換した文字列の格納先
\r
1508 // 前回の変換不能な残りの文字列を入力の先頭に結合
\r
1509 SrcLength = cInfo->StrLen + cInfo->EscUTF8Len;
\r
1510 if(!(pSrc = (char*)malloc(sizeof(char) * (SrcLength + 1))))
\r
1512 *(cInfo->Buf) = '\0';
\r
1513 cInfo->BufSize = 0;
\r
1516 memcpy(pSrc, cInfo->EscUTF8, sizeof(char) * cInfo->EscUTF8Len);
\r
1517 memcpy(pSrc + cInfo->EscUTF8Len, cInfo->Str, sizeof(char) * cInfo->StrLen);
\r
1518 *(pSrc + SrcLength) = '\0';
\r
1519 // UTF-8の場合、不完全な文字は常に変換されない
\r
1520 UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pSrc, SrcLength, NULL, 0);
\r
1522 // サイズ0 or バッファサイズより大きい場合は
\r
1523 // cInfo->Bufの最初に'\0'を入れて、
\r
1524 // cInfo->BufSizeに0を入れて返す。
\r
1525 // if( string_length == 0 ||
\r
1526 // string_length >= 1024 ){
\r
1527 // *(cInfo->Buf) = '\0';
\r
1528 // cInfo->BufSize = 0;
\r
1529 // return(Continue);
\r
1531 if(!(pUTF16 = (wchar_t*)malloc(sizeof(wchar_t) * UTF16Length)))
\r
1534 *(cInfo->Buf) = '\0';
\r
1535 cInfo->BufSize = 0;
\r
1539 // 中間コード(unicode)に変換
\r
1540 // MultiByteToWideChar(
\r
1541 // CP_UTF8, // 変換先文字コード
\r
1542 // 0, // フラグ(0:なし)
\r
1543 // cInfo->Str, // 変換元文字列
\r
1544 // -1, // 変換元文字列バイト数(-1:自動)
\r
1545 // (unsigned short *)temp_string, // 変換した文字列の格納先
\r
1548 MultiByteToWideChar(CP_UTF8, 0, pSrc, SrcLength, pUTF16, UTF16Length);
\r
1550 // 生成されるUTF-8コードのサイズを調べる
\r
1551 // string_length = WideCharToMultiByte(
\r
1552 // CP_ACP, // 変換先文字コード
\r
1553 // 0, // フラグ(0:なし)
\r
1554 // (unsigned short *)temp_string, // 変換元文字列
\r
1555 // -1, // 変換元文字列バイト数(-1:自動)
\r
1556 // NULL, // 変換した文字列の格納先
\r
1560 string_length = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);
\r
1562 // サイズ0 or 出力バッファサイズより大きい場合は、
\r
1563 // cInfo->Bufの最初に'\0'を入れて、
\r
1564 // cInfo->BufSizeに0を入れて返す。
\r
1565 // if( string_length == 0 ||
\r
1566 // string_length >= cInfo->BufSize ){
\r
1567 // *(cInfo->Buf) = '\0';
\r
1568 // cInfo->BufSize = 0;
\r
1569 // return(Continue);
\r
1573 // cInfo->OutLen = string_length;
\r
1576 // WideCharToMultiByte(
\r
1577 // CP_ACP, // 変換先文字コード
\r
1578 // 0, // フラグ(0:なし)
\r
1579 // (unsigned short *)temp_string, // 変換元文字列
\r
1580 // -1, // 変換元文字列バイト数(-1:自動)
\r
1581 // cInfo->Buf, // 変換した文字列の格納先(BOM:3bytes)
\r
1582 // cInfo->BufSize, // 格納先サイズ
\r
1585 cInfo->OutLen = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, cInfo->Buf, cInfo->BufSize, NULL, NULL);
\r
1586 // バッファに収まらないため変換文字数を半減
\r
1587 while(cInfo->OutLen == 0 && UTF16Length > 0)
\r
1589 UTF16Length = UTF16Length / 2;
\r
1590 cInfo->OutLen = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, cInfo->Buf, cInfo->BufSize, NULL, NULL);
\r
1592 // 変換された元の文字列での文字数を取得
\r
1593 Count = WideCharToMultiByte(CP_UTF8, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);
\r
1595 UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pSrc + Count, SrcLength - Count, NULL, 0);
\r
1596 cInfo->Str += Count - cInfo->EscUTF8Len;
\r
1597 cInfo->StrLen -= Count - cInfo->EscUTF8Len;
\r
1598 cInfo->EscUTF8Len = 0;
\r
1599 if(UTF16Length > 0)
\r
1603 // 変換不能なため次の入力の先頭に結合
\r
1604 memcpy(cInfo->EscUTF8, cInfo->Str, sizeof(char) * cInfo->StrLen);
\r
1605 cInfo->EscUTF8Len = cInfo->StrLen;
\r
1606 cInfo->Str += cInfo->StrLen;
\r
1607 cInfo->StrLen = 0;
\r
1617 /*----- SHIFT-JIS漢字コードをUTF-8漢字コードに変換 ------------------------------
\r
1620 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
1623 * int くり返しフラグ (YES/NO)
\r
1626 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
1627 *----------------------------------------------------------------------------*/
\r
1628 int ConvSJIStoUTF8N(CODECONVINFO *cInfo)
\r
1632 // char temp_string[2048];
\r
1633 int string_length;
\r
1636 // 終端のNULLを含むバグを修正
\r
1645 // 生成される中間コードのサイズを調べる
\r
1646 // string_length = MultiByteToWideChar(
\r
1647 // CP_ACP, // 変換先文字コード
\r
1648 // 0, // フラグ(0:なし)
\r
1649 // cInfo->Str, // 変換元文字列
\r
1650 // -1, // 変換元文字列バイト数(-1:自動)
\r
1651 // NULL, // 変換した文字列の格納先
\r
1654 // 前回の変換不能な残りの文字列を入力の先頭に結合
\r
1655 SrcLength = cInfo->StrLen + cInfo->EscUTF8Len;
\r
1656 if(!(pSrc = (char*)malloc(sizeof(char) * (SrcLength + 1))))
\r
1658 *(cInfo->Buf) = '\0';
\r
1659 cInfo->BufSize = 0;
\r
1662 memcpy(pSrc, cInfo->EscUTF8, sizeof(char) * cInfo->EscUTF8Len);
\r
1663 memcpy(pSrc + cInfo->EscUTF8Len, cInfo->Str, sizeof(char) * cInfo->StrLen);
\r
1664 *(pSrc + SrcLength) = '\0';
\r
1665 // Shift_JISの場合、不完全な文字でも変換されることがあるため、末尾の不完全な部分を削る
\r
1667 while(Count < SrcLength)
\r
1669 if(((unsigned char)*(pSrc + Count) >= 0x81 && (unsigned char)*(pSrc + Count) <= 0x9f) || (unsigned char)*(pSrc + Count) >= 0xe0)
\r
1671 if((unsigned char)*(pSrc + Count + 1) >= 0x40)
\r
1675 if(Count + 2 > SrcLength)
\r
1683 SrcLength = Count;
\r
1684 UTF16Length = MultiByteToWideChar(CP_ACP, 0, pSrc, SrcLength, NULL, 0);
\r
1686 // サイズ0 or バッファサイズより大きい場合は、
\r
1687 // cInfo->Bufの最初に'\0'を入れて、
\r
1688 // cInfo->BufSizeに0を入れて返す。
\r
1689 // if( string_length == 0 ||
\r
1690 // string_length >= 1024 ){
\r
1691 // *(cInfo->Buf) = '\0';
\r
1692 // cInfo->BufSize = 0;
\r
1693 // return(Continue);
\r
1695 if(!(pUTF16 = (wchar_t*)malloc(sizeof(wchar_t) * UTF16Length)))
\r
1698 *(cInfo->Buf) = '\0';
\r
1699 cInfo->BufSize = 0;
\r
1703 // 中間コード(unicode)に変換
\r
1704 // MultiByteToWideChar(
\r
1705 // CP_ACP, // 変換先文字コード
\r
1706 // 0, // フラグ(0:なし)
\r
1707 // cInfo->Str, // 変換元文字列
\r
1708 // -1, // 変換元文字列バイト数(-1:自動)
\r
1709 // (unsigned short *)temp_string, // 変換した文字列の格納先
\r
1712 MultiByteToWideChar(CP_ACP, 0, pSrc, SrcLength, pUTF16, UTF16Length);
\r
1714 // 生成されるUTF-8コードのサイズを調べる
\r
1715 // string_length = WideCharToMultiByte(
\r
1716 // CP_UTF8, // 変換先文字コード
\r
1717 // 0, // フラグ(0:なし)
\r
1718 // (unsigned short *)temp_string, // 変換元文字列
\r
1719 // -1, // 変換元文字列バイト数(-1:自動)
\r
1720 // NULL, // 変換した文字列の格納先
\r
1724 string_length = WideCharToMultiByte(CP_UTF8, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);
\r
1726 // サイズ0 or 出力バッファサイズより大きい場合は、
\r
1727 // cInfo->Bufの最初に'\0'を入れて、
\r
1728 // cInfo->BufSizeに0を入れて返す。
\r
1729 // if( string_length == 0 ||
\r
1730 // string_length >= cInfo->BufSize ){
\r
1731 // *(cInfo->Buf) = '\0';
\r
1732 // cInfo->BufSize = 0;
\r
1733 // return(Continue);
\r
1737 // cInfo->OutLen = string_length;
\r
1740 // ↓付けちゃだめ コマンドにも追加されてしまう
\r
1741 // 出力文字列の先頭にBOM(byte order mark)をつける
\r
1742 *(cInfo->Buf) = (char)0xef;
\r
1743 *(cInfo->Buf+1) = (char)0xbb;
\r
1744 *(cInfo->Buf+2) = (char)0xbf;
\r
1748 // WideCharToMultiByte(
\r
1749 // CP_UTF8, // 変換先文字コード
\r
1750 // 0, // フラグ(0:なし)
\r
1751 // (unsigned short *)temp_string, // 変換元文字列
\r
1752 // -1, // 変換元文字列バイト数(-1:自動)
\r
1753 // cInfo->Buf, // 変換した文字列の格納先(BOM:3bytes)
\r
1754 // cInfo->BufSize, // 格納先サイズ
\r
1757 cInfo->OutLen = WideCharToMultiByte(CP_UTF8, 0, pUTF16, UTF16Length, cInfo->Buf, cInfo->BufSize, NULL, NULL);
\r
1758 // バッファに収まらないため変換文字数を半減
\r
1759 while(cInfo->OutLen == 0 && UTF16Length > 0)
\r
1761 UTF16Length = UTF16Length / 2;
\r
1762 cInfo->OutLen = WideCharToMultiByte(CP_UTF8, 0, pUTF16, UTF16Length, cInfo->Buf, cInfo->BufSize, NULL, NULL);
\r
1764 // 変換された元の文字列での文字数を取得
\r
1765 Count = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);
\r
1767 UTF16Length = MultiByteToWideChar(CP_ACP, 0, pSrc + Count, SrcLength - Count, NULL, 0);
\r
1768 cInfo->Str += Count - cInfo->EscUTF8Len;
\r
1769 cInfo->StrLen -= Count - cInfo->EscUTF8Len;
\r
1770 cInfo->EscUTF8Len = 0;
\r
1771 if(UTF16Length > 0)
\r
1775 // 変換不能なため次の入力の先頭に結合
\r
1776 memcpy(cInfo->EscUTF8, cInfo->Str, sizeof(char) * cInfo->StrLen);
\r
1777 cInfo->EscUTF8Len = cInfo->StrLen;
\r
1778 cInfo->Str += cInfo->StrLen;
\r
1779 cInfo->StrLen = 0;
\r
1791 /*----- IBM拡張漢字をNEC選定IBM拡張漢字等に変換 -------------------------------
\r
1798 *----------------------------------------------------------------------------*/
\r
1799 static int ConvertIBMExtendedChar(int code)
\r
1801 if((code >= 0xfa40) && (code <= 0xfa49)) code -= (0xfa40 - 0xeeef);
\r
1802 else if((code >= 0xfa4a) && (code <= 0xfa53)) code -= (0xfa4a - 0x8754);
\r
1803 else if((code >= 0xfa54) && (code <= 0xfa57)) code -= (0xfa54 - 0xeef9);
\r
1804 else if(code == 0xfa58) code = 0x878a;
\r
1805 else if(code == 0xfa59) code = 0x8782;
\r
1806 else if(code == 0xfa5a) code = 0x8784;
\r
1807 else if(code == 0xfa5b) code = 0x879a;
\r
1808 else if((code >= 0xfa5c) && (code <= 0xfa7e)) code -= (0xfa5c - 0xed40);
\r
1809 else if((code >= 0xfa80) && (code <= 0xfa9b)) code -= (0xfa80 - 0xed63);
\r
1810 else if((code >= 0xfa9c) && (code <= 0xfafc)) code -= (0xfa9c - 0xed80);
\r
1811 else if((code >= 0xfb40) && (code <= 0xfb5b)) code -= (0xfb40 - 0xede1);
\r
1812 else if((code >= 0xfb5c) && (code <= 0xfb7e)) code -= (0xfb5c - 0xee40);
\r
1813 else if((code >= 0xfb80) && (code <= 0xfb9b)) code -= (0xfb80 - 0xee63);
\r
1814 else if((code >= 0xfb9c) && (code <= 0xfbfc)) code -= (0xfb9c - 0xee80);
\r
1815 else if((code >= 0xfc40) && (code <= 0xfc4b)) code -= (0xfc40 - 0xeee1);
\r