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
35 //#include <winsock.h>
\r
36 #include <winsock2.h>
\r
37 #include <mbstring.h>
\r
38 #include <windowsx.h>
\r
41 #include "resource.h"
\r
45 #define CONV_ASCII 0 /* ASCII文字処理中 */
\r
46 #define CONV_KANJI 1 /* 漢字処理中 */
\r
47 #define CONV_KANA 2 /* 半角カタカナ処理中 */
\r
50 /*===== プロトタイプ =====*/
\r
52 static char *ConvEUCtoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put);
\r
53 static char *ConvJIStoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put);
\r
54 static char *ConvSJIStoEUCkanaProc(CODECONVINFO *cInfo, char Dt, char *Put);
\r
55 static char *ConvSJIStoJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put);
\r
56 static int HanKataToZen(char Ch);
\r
57 static int AskDakuon(char Ch, char Daku);
\r
59 static int CheckOnSJIS(uchar *Pos, uchar *Btm);
\r
60 static int CheckOnEUC(uchar *Pos, uchar *Btm);
\r
61 static int ConvertIBMExtendedChar(int code);
\r
66 /*----- 漢字コード変換のテストプログラム ------------------------------------*/
\r
68 void CodeCnvTest(void)
\r
71 #define BUFBUF2 BUFBUF+3
\r
81 // DoPrintf("---START ZEN");
\r
83 Strm1 = fopen("in.txt", "rb");
\r
84 Strm2 = fopen("out_zen.txt", "wb");
\r
86 InitCodeConvInfo(&cInfo);
\r
87 cInfo.KanaCnv = YES;
\r
90 while((Byte = fread(Buf, 1, BUFBUF, Strm1)) != 0)
\r
93 cInfo.StrLen = Byte;
\r
95 cInfo.BufSize = BUFBUF2;
\r
97 // DoPrintf("READ %d", Byte);
\r
101 // Continue = ConvEUCtoSJIS(&cInfo);
\r
102 // Continue = ConvJIStoSJIS(&cInfo);
\r
103 // Continue = ConvSJIStoEUC(&cInfo);
\r
104 // Continue = ConvSJIStoJIS(&cInfo);
\r
105 Continue = ConvSMBtoSJIS(&cInfo);
\r
106 // Continue = ConvSJIStoSMB_HEX(&cInfo);
\r
107 // Continue = ConvSJIStoSMB_CAP(&cInfo);
\r
109 fwrite(Buf2, cInfo.OutLen, 1, Strm2);
\r
110 // DoPrintf("WRITE %d", cInfo.OutLen);
\r
113 while(Continue == YES);
\r
117 cInfo.BufSize = BUFBUF2;
\r
118 FlushRestData(&cInfo);
\r
119 fwrite(Buf2, cInfo.OutLen, 1, Strm2);
\r
120 // DoPrintf("WRITE %d", cInfo.OutLen);
\r
127 // DoPrintf("---START HAN");
\r
129 Strm1 = fopen("in.txt", "rb");
\r
130 Strm2 = fopen("out_han.txt", "wb");
\r
132 InitCodeConvInfo(&cInfo);
\r
133 cInfo.KanaCnv = NO;
\r
136 while((Byte = fread(Buf, 1, BUFBUF, Strm1)) != 0)
\r
139 cInfo.StrLen = Byte;
\r
141 cInfo.BufSize = BUFBUF2;
\r
143 // DoPrintf("READ %d", Byte);
\r
147 // Continue = ConvEUCtoSJIS(&cInfo);
\r
148 // Continue = ConvJIStoSJIS(&cInfo);
\r
149 // Continue = ConvSJIStoEUC(&cInfo);
\r
150 // Continue = ConvSJIStoJIS(&cInfo);
\r
151 Continue = ConvSMBtoSJIS(&cInfo);
\r
152 // Continue = ConvSJIStoSMB_HEX(&cInfo);
\r
153 // Continue = ConvSJIStoSMB_CAP(&cInfo);
\r
154 fwrite(Buf2, cInfo.OutLen, 1, Strm2);
\r
155 // DoPrintf("WRITE %d", cInfo.OutLen);
\r
158 while(Continue == YES);
\r
162 cInfo.BufSize = BUFBUF2;
\r
163 FlushRestData(&cInfo);
\r
164 fwrite(Buf2, cInfo.OutLen, 1, Strm2);
\r
165 // DoPrintf("WRITE %d", cInfo.OutLen);
\r
170 // DoPrintf("---END");
\r
179 /*----- 改行コード変換のテストプログラム ------------------------------------*/
\r
181 void TermCodeCnvTest(void)
\r
184 #define BUFBUF2 BUFBUF
\r
186 TERMCODECONVINFO cInfo;
\r
188 char Buf2[BUFBUF2];
\r
194 // DoPrintf("---START");
\r
196 Strm1 = fopen("in.txt", "rb");
\r
197 Strm2 = fopen("out.txt", "wb");
\r
199 InitTermCodeConvInfo(&cInfo);
\r
201 while((Byte = fread(Buf, 1, BUFBUF, Strm1)) != 0)
\r
204 cInfo.StrLen = Byte;
\r
206 cInfo.BufSize = BUFBUF2;
\r
208 // DoPrintf("READ %d", Byte);
\r
212 Continue = ConvTermCodeToCRLF(&cInfo);
\r
214 fwrite(Buf2, cInfo.OutLen, 1, Strm2);
\r
215 // DoPrintf("WRITE %d", cInfo.OutLen);
\r
218 while(Continue == YES);
\r
222 cInfo.BufSize = BUFBUF2;
\r
223 FlushRestTermCodeConvData(&cInfo);
\r
224 fwrite(Buf2, cInfo.OutLen, 1, Strm2);
\r
225 // DoPrintf("WRITE %d", cInfo.OutLen);
\r
230 // DoPrintf("---END");
\r
247 /*----- 改行コード変換情報を初期化 --------------------------------------------
\r
250 * TERMCODECONVINFO *cInfo : 改行コード変換情報
\r
254 *----------------------------------------------------------------------------*/
\r
256 void InitTermCodeConvInfo(TERMCODECONVINFO *cInfo)
\r
263 /*----- 改行コード変換の残り情報を出力 ----------------------------------------
\r
266 * TERMCODECONVINFO *cInfo : 改行コード変換情報
\r
269 * int くり返しフラグ (=NO)
\r
273 *----------------------------------------------------------------------------*/
\r
275 int FlushRestTermCodeConvData(TERMCODECONVINFO *cInfo)
\r
281 if(cInfo->Term == 0x0D)
\r
284 cInfo->OutLen = Put - cInfo->Buf;
\r
290 /*----- 改行コードをCRLFに変換 -------------------------------------------------
\r
293 * TERMCODECONVINFO *cInfo : 改行コード変換情報
\r
296 * int くり返しフラグ (YES/NO)
\r
299 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
300 *----------------------------------------------------------------------------*/
\r
302 int ConvTermCodeToCRLF(TERMCODECONVINFO *cInfo)
\r
312 Limit = cInfo->Buf + cInfo->BufSize - 1;
\r
314 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
324 if(cInfo->Term == 0x0D)
\r
327 cInfo->Term = *Str++;
\r
333 if(cInfo->Term != 0x0D)
\r
338 if(cInfo->Term == 0x0D)
\r
347 cInfo->OutLen = Put - cInfo->Buf;
\r
353 /*----- 漢字コード変換情報を初期化 --------------------------------------------
\r
356 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
360 *----------------------------------------------------------------------------*/
\r
362 void InitCodeConvInfo(CODECONVINFO *cInfo)
\r
364 cInfo->KanaCnv = YES;
\r
366 cInfo->EscProc = 0;
\r
367 cInfo->KanjiMode = CONV_ASCII;
\r
368 cInfo->KanjiFst = 0;
\r
369 cInfo->KanaPrev = 0;
\r
370 cInfo->KanaProc = NULL;
\r
372 cInfo->EscUTF8Len = 0;
\r
377 /*----- 漢字コード変換の残り情報を出力 ----------------------------------------
\r
380 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
383 * int くり返しフラグ (=NO)
\r
387 *----------------------------------------------------------------------------*/
\r
389 int FlushRestData(CODECONVINFO *cInfo)
\r
395 if(cInfo->KanaProc != NULL)
\r
396 Put = (cInfo->KanaProc)(cInfo, 0, Put);
\r
398 if(cInfo->KanjiFst != 0)
\r
399 *Put++ = cInfo->KanjiFst;
\r
400 if(cInfo->EscProc >= 1)
\r
401 *Put++ = cInfo->EscCode[0];
\r
402 if(cInfo->EscProc == 2)
\r
403 *Put++ = cInfo->EscCode[1];
\r
405 memcpy(Put, cInfo->EscUTF8, sizeof(char) * cInfo->EscUTF8Len);
\r
406 Put += cInfo->EscUTF8Len;
\r
408 cInfo->OutLen = Put - cInfo->Buf;
\r
414 /*----- EUC漢字コードをSHIFT-JIS漢字コードに変換 ------------------------------
\r
417 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
420 * int くり返しフラグ (YES/NO)
\r
423 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
424 *----------------------------------------------------------------------------*/
\r
426 int ConvEUCtoSJIS(CODECONVINFO *cInfo)
\r
434 cInfo->KanaProc = &ConvEUCtoSJISkanaProc;
\r
439 Limit = cInfo->Buf + cInfo->BufSize - 2;
\r
441 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
449 if((*Str & 0x80) != 0)
\r
451 if(cInfo->KanjiFst == 0)
\r
452 cInfo->KanjiFst = *Str++;
\r
455 if((uchar)cInfo->KanjiFst == (uchar)0x8E) /* 半角カタカナ */
\r
457 Put = ConvEUCtoSJISkanaProc(cInfo, *Str++, Put);
\r
461 Put = ConvEUCtoSJISkanaProc(cInfo, 0, Put);
\r
463 Kcode = _mbcjistojms(((cInfo->KanjiFst & 0x7F) * 0x100) + (*Str++ & 0x7F));
\r
464 *Put++ = HIGH8(Kcode);
\r
465 *Put++ = LOW8(Kcode);
\r
467 cInfo->KanjiFst = 0;
\r
472 Put = ConvEUCtoSJISkanaProc(cInfo, 0, Put);
\r
474 if(cInfo->KanjiFst != 0)
\r
476 *Put++ = cInfo->KanjiFst;
\r
477 cInfo->KanjiFst = 0;
\r
484 cInfo->OutLen = Put - cInfo->Buf;
\r
490 /*----- EUC-->SHIFT-JIS漢字コードに変換の半角カタカナの処理 -------------------
\r
493 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
495 * char *Put : データセット位置
\r
499 *----------------------------------------------------------------------------*/
\r
501 static char *ConvEUCtoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)
\r
506 if(cInfo->KanaCnv == NO)
\r
513 if(cInfo->KanaPrev != 0)
\r
515 Daku = AskDakuon(cInfo->KanaPrev, Dt);
\r
517 Kcode = _mbcjistojms(HanKataToZen(cInfo->KanaPrev)) + Daku;
\r
518 *Put++ = HIGH8(Kcode);
\r
519 *Put++ = LOW8(Kcode);
\r
522 cInfo->KanaPrev = Dt;
\r
524 cInfo->KanaPrev = 0;
\r
527 cInfo->KanaPrev = Dt;
\r
533 /*----- JIS漢字コードをSHIFT-JIS漢字コードに変換 ------------------------------
\r
536 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
539 * int くり返しフラグ (YES/NO)
\r
542 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
544 * エスケープコードは、次のものに対応している
\r
545 * 漢字開始 <ESC>$B <ESC>$@
\r
547 * 漢字終了 <ESC>(B <ESC>(J <ESC>(H
\r
548 *----------------------------------------------------------------------------*/
\r
550 int ConvJIStoSJIS(CODECONVINFO *cInfo)
\r
558 cInfo->KanaProc = &ConvJIStoSJISkanaProc;
\r
563 Limit = cInfo->Buf + cInfo->BufSize - 3;
\r
565 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
573 if(cInfo->EscProc == 0)
\r
577 if(cInfo->KanjiFst != 0)
\r
579 *Put++ = cInfo->KanjiFst;
\r
580 cInfo->KanjiFst = 0;
\r
582 Put = ConvJIStoSJISkanaProc(cInfo, 0, Put);
\r
584 cInfo->EscCode[cInfo->EscProc] = *Str++;
\r
589 if(cInfo->KanjiMode == CONV_KANA)
\r
591 if(cInfo->KanjiFst != 0)
\r
593 *Put++ = cInfo->KanjiFst;
\r
594 cInfo->KanjiFst = 0;
\r
597 if((*Str >= 0x21) && (*Str <= 0x5F))
\r
599 Put = ConvJIStoSJISkanaProc(cInfo, *Str++, Put);
\r
603 Put = ConvJIStoSJISkanaProc(cInfo, 0, Put);
\r
607 else if(cInfo->KanjiMode == CONV_KANJI)
\r
609 Put = ConvJIStoSJISkanaProc(cInfo, 0, Put);
\r
610 if((*Str >= 0x21) && (*Str <= 0x7E))
\r
612 if(cInfo->KanjiFst == 0)
\r
613 cInfo->KanjiFst = *Str++;
\r
616 Kcode = _mbcjistojms((cInfo->KanjiFst * 0x100) + *Str++);
\r
617 *Put++ = HIGH8(Kcode);
\r
618 *Put++ = LOW8(Kcode);
\r
619 cInfo->KanjiFst = 0;
\r
624 if(cInfo->KanjiFst == 0)
\r
628 *Put++ = cInfo->KanjiFst;
\r
630 cInfo->KanjiFst = 0;
\r
636 Put = ConvJIStoSJISkanaProc(cInfo, 0, Put);
\r
641 else if(cInfo->EscProc == 1)
\r
643 if((*Str == '$') || (*Str == '('))
\r
645 cInfo->EscCode[cInfo->EscProc] = *Str++;
\r
650 *Put++ = cInfo->EscCode[0];
\r
652 cInfo->EscProc = 0;
\r
655 else if(cInfo->EscProc == 2)
\r
657 if((cInfo->EscCode[1] == '$') && ((*Str == 'B') || (*Str == '@')))
\r
658 cInfo->KanjiMode = CONV_KANJI;
\r
659 else if((cInfo->EscCode[1] == '(') && (*Str == 'I'))
\r
660 cInfo->KanjiMode = CONV_KANA;
\r
661 else if((cInfo->EscCode[1] == '(') && ((*Str == 'B') || (*Str == 'J') || (*Str == 'H')))
\r
662 cInfo->KanjiMode = CONV_ASCII;
\r
665 *Put++ = cInfo->EscCode[0];
\r
666 *Put++ = cInfo->EscCode[1];
\r
667 if((cInfo->KanjiMode == CONV_KANJI) && ((*Str >= 0x21) && (*Str <= 0x7E)))
\r
668 cInfo->KanjiFst = *Str;
\r
673 cInfo->EscProc = 0;
\r
678 cInfo->OutLen = Put - cInfo->Buf;
\r
684 /*----- JIS-->SHIFT-JIS漢字コードに変換の半角カタカナの処理 -------------------
\r
687 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
689 * char *Put : データセット位置
\r
693 *----------------------------------------------------------------------------*/
\r
695 static char *ConvJIStoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)
\r
700 Dt = (uchar)Dt + (uchar)0x80;
\r
701 if(cInfo->KanaCnv == NO)
\r
703 if((uchar)Dt != (uchar)0x80)
\r
708 if(cInfo->KanaPrev != 0)
\r
710 Daku = AskDakuon(cInfo->KanaPrev, Dt);
\r
711 Kcode = _mbcjistojms(HanKataToZen(cInfo->KanaPrev)) + Daku;
\r
712 *Put++ = HIGH8(Kcode);
\r
713 *Put++ = LOW8(Kcode);
\r
715 if((Daku == 0) && ((uchar)Dt != (uchar)0x80))
\r
716 cInfo->KanaPrev = Dt;
\r
718 cInfo->KanaPrev = 0;
\r
720 else if((uchar)Dt != (uchar)0x80)
\r
721 cInfo->KanaPrev = Dt;
\r
727 /*----- Samba-HEX/Samba-CAP漢字コードをSHIFT-JIS漢字コードに変換 --------------
\r
730 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
733 * int くり返しフラグ (YES/NO)
\r
736 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
737 * 分割された入力文字列の変換はサポートしていない
\r
738 * 半角カタカナの変換設定には対応していない
\r
739 *----------------------------------------------------------------------------*/
\r
741 int ConvSMBtoSJIS(CODECONVINFO *cInfo)
\r
751 Limit = cInfo->Buf + cInfo->BufSize - 2;
\r
753 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
761 if((*Str == SAMBA_HEX_TAG) && (cInfo->StrLen >= 3))
\r
763 if(isxdigit(*(Str+1)) && isxdigit(*(Str+2)))
\r
765 *Put++ = N2INT(hex2bin(*(Str+1)), hex2bin(*(Str+2)));
\r
767 cInfo->StrLen -= 2;
\r
777 cInfo->OutLen = Put - cInfo->Buf;
\r
783 /*----- SHIFT-JIS漢字コードをEUC漢字コードに変換 ------------------------------
\r
786 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
789 * int くり返しフラグ (YES/NO)
\r
792 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
793 *----------------------------------------------------------------------------*/
\r
795 int ConvSJIStoEUC(CODECONVINFO *cInfo)
\r
803 cInfo->KanaProc = &ConvSJIStoEUCkanaProc;
\r
808 Limit = cInfo->Buf + cInfo->BufSize - 2;
\r
810 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
818 if(cInfo->KanjiFst == 0)
\r
820 if((((uchar)*Str >= (uchar)0x81) && ((uchar)*Str <= (uchar)0x9F)) ||
\r
821 ((uchar)*Str >= (uchar)0xE0))
\r
823 Put = ConvSJIStoEUCkanaProc(cInfo, 0, Put);
\r
824 cInfo->KanjiFst = *Str++;
\r
826 else if(((uchar)*Str >= (uchar)0xA0) && ((uchar)*Str <= (uchar)0xDF))
\r
828 Put = ConvSJIStoEUCkanaProc(cInfo, *Str++, Put);
\r
832 Put = ConvSJIStoEUCkanaProc(cInfo, 0, Put);
\r
838 if((uchar)*Str >= (uchar)0x40)
\r
840 Kcode = ConvertIBMExtendedChar(((uchar)cInfo->KanjiFst * 0x100) + (uchar)*Str++);
\r
841 Kcode = _mbcjmstojis(Kcode);
\r
842 *Put++ = HIGH8(Kcode) | 0x80;
\r
843 *Put++ = LOW8(Kcode) | 0x80;
\r
847 *Put++ = cInfo->KanjiFst;
\r
850 cInfo->KanjiFst = 0;
\r
855 cInfo->OutLen = Put - cInfo->Buf;
\r
861 /*----- SHIFT-JIS-->EUC漢字コードに変換の半角カタカナの処理 -------------------
\r
864 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
866 * char *Put : データセット位置
\r
870 *----------------------------------------------------------------------------*/
\r
872 static char *ConvSJIStoEUCkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)
\r
877 if(cInfo->KanaCnv == NO)
\r
881 Kcode = 0x8E00 + (uchar)Dt;
\r
882 *Put++ = HIGH8(Kcode) | 0x80;
\r
883 *Put++ = LOW8(Kcode) | 0x80;
\r
888 if(cInfo->KanaPrev != 0)
\r
890 Daku = AskDakuon(cInfo->KanaPrev, Dt);
\r
891 Kcode = HanKataToZen(cInfo->KanaPrev) + Daku;
\r
892 *Put++ = HIGH8(Kcode) | 0x80;
\r
893 *Put++ = LOW8(Kcode) | 0x80;
\r
896 cInfo->KanaPrev = Dt;
\r
898 cInfo->KanaPrev = 0;
\r
901 cInfo->KanaPrev = Dt;
\r
907 /*----- SHIFT-JIS漢字コードをJIS漢字コードに変換 ------------------------------
\r
910 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
913 * int くり返しフラグ (YES/NO)
\r
916 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
918 * エスケープコードは、次のものを使用する
\r
922 *----------------------------------------------------------------------------*/
\r
924 int ConvSJIStoJIS(CODECONVINFO *cInfo)
\r
932 cInfo->KanaProc = &ConvSJIStoJISkanaProc;
\r
937 Limit = cInfo->Buf + cInfo->BufSize - 5;
\r
939 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
947 if(cInfo->KanjiFst == 0)
\r
949 if((((uchar)*Str >= (uchar)0x81) && ((uchar)*Str <= (uchar)0x9F)) ||
\r
950 ((uchar)*Str >= (uchar)0xE0))
\r
952 Put = ConvSJIStoJISkanaProc(cInfo, 0, Put);
\r
953 cInfo->KanjiFst = *Str++;
\r
955 else if(((uchar)*Str >= (uchar)0xA0) && ((uchar)*Str <= (uchar)0xDF))
\r
957 Put = ConvSJIStoJISkanaProc(cInfo, *Str++, Put);
\r
961 Put = ConvSJIStoJISkanaProc(cInfo, 0, Put);
\r
962 if(cInfo->KanjiMode != CONV_ASCII)
\r
967 cInfo->KanjiMode = CONV_ASCII;
\r
974 Put = ConvSJIStoJISkanaProc(cInfo, 0, Put);
\r
975 if((uchar)*Str >= (uchar)0x40)
\r
977 if(cInfo->KanjiMode != CONV_KANJI)
\r
982 cInfo->KanjiMode = CONV_KANJI;
\r
985 Kcode = ConvertIBMExtendedChar(((uchar)cInfo->KanjiFst * 0x100) + (uchar)*Str++);
\r
986 Kcode = _mbcjmstojis(Kcode);
\r
987 *Put++ = HIGH8(Kcode);
\r
988 *Put++ = LOW8(Kcode);
\r
992 if(cInfo->KanjiMode != CONV_ASCII)
\r
997 cInfo->KanjiMode = CONV_ASCII;
\r
999 *Put++ = cInfo->KanjiFst;
\r
1002 cInfo->KanjiFst = 0;
\r
1007 cInfo->OutLen = Put - cInfo->Buf;
\r
1013 /*----- SHIFT-JIS-->JIS漢字コードに変換の半角カタカナの処理 -------------------
\r
1016 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
1018 * char *Put : データセット位置
\r
1021 * char *次のデータセット位置
\r
1022 *----------------------------------------------------------------------------*/
\r
1024 static char *ConvSJIStoJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)
\r
1029 if(cInfo->KanaCnv == NO)
\r
1033 if(cInfo->KanjiMode != CONV_KANA)
\r
1038 cInfo->KanjiMode = CONV_KANA;
\r
1040 *Put++ = (uchar)Dt - (uchar)0x80;
\r
1045 if(cInfo->KanaPrev != 0)
\r
1047 if(cInfo->KanjiMode != CONV_KANJI)
\r
1052 cInfo->KanjiMode = CONV_KANJI;
\r
1054 Daku = AskDakuon(cInfo->KanaPrev, Dt);
\r
1055 Kcode = HanKataToZen(cInfo->KanaPrev) + Daku;
\r
1056 *Put++ = HIGH8(Kcode);
\r
1057 *Put++ = LOW8(Kcode);
\r
1060 cInfo->KanaPrev = Dt;
\r
1062 cInfo->KanaPrev = 0;
\r
1065 cInfo->KanaPrev = Dt;
\r
1071 /*----- SHIFT-JIS漢字コードをSamba-HEX漢字コードに変換 ------------------------
\r
1074 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
1077 * int くり返しフラグ (YES/NO)
\r
1080 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
1081 * 分割された入力文字列の変換はサポートしていない
\r
1082 * 半角カタカナの変換設定には対応していない
\r
1083 *----------------------------------------------------------------------------*/
\r
1085 int ConvSJIStoSMB_HEX(CODECONVINFO *cInfo)
\r
1095 Limit = cInfo->Buf + cInfo->BufSize - 6;
\r
1097 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
1105 if((cInfo->StrLen >= 2) &&
\r
1106 ((((uchar)*Str >= (uchar)0x81) && ((uchar)*Str <= (uchar)0x9F)) ||
\r
1107 ((uchar)*Str >= (uchar)0xE0)))
\r
1109 sprintf(Put, "%c%02x%c%02x", SAMBA_HEX_TAG, (uchar)*Str, SAMBA_HEX_TAG, (uchar)*(Str+1));
\r
1114 else if((uchar)*Str >= (uchar)0x80)
\r
1116 sprintf(Put, "%c%02x", SAMBA_HEX_TAG, (uchar)*Str++);
\r
1124 cInfo->OutLen = Put - cInfo->Buf;
\r
1130 /*----- SHIFT-JIS漢字コードをSamba-CAP漢字コードに変換 ------------------------
\r
1133 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
1136 * int くり返しフラグ (YES/NO)
\r
1139 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
1140 * 分割された入力文字列の変換はサポートしていない
\r
1141 *----------------------------------------------------------------------------*/
\r
1143 int ConvSJIStoSMB_CAP(CODECONVINFO *cInfo)
\r
1153 Limit = cInfo->Buf + cInfo->BufSize - 6;
\r
1155 for(; cInfo->StrLen > 0; cInfo->StrLen--)
\r
1163 if((uchar)*Str >= (uchar)0x80)
\r
1165 sprintf(Put, "%c%02x", SAMBA_HEX_TAG, (uchar)*Str++);
\r
1173 cInfo->OutLen = Put - cInfo->Buf;
\r
1179 /*----- 1バイトカタカナをJIS漢字コードに変換 ---------------------------------
\r
1182 * char Ch : 1バイトカタカナコード
\r
1186 *----------------------------------------------------------------------------*/
\r
1188 static int HanKataToZen(char Ch)
\r
1190 static const int Katakana[] = {
\r
1191 0x2121, 0x2123, 0x2156, 0x2157, 0x2122, 0x2126, 0x2572, 0x2521,
\r
1192 0x2523, 0x2525, 0x2527, 0x2529, 0x2563, 0x2565, 0x2567, 0x2543,
\r
1193 0x213C, 0x2522, 0x2524, 0x2526, 0x2528, 0x252A, 0x252B, 0x252D,
\r
1194 0x252F, 0x2531, 0x2533, 0x2535, 0x2537, 0x2539, 0x253B, 0x253D,
\r
1195 0x253F, 0x2541, 0x2544, 0x2546, 0x2548, 0x254A, 0x254B, 0x254C,
\r
1196 0x254D, 0x254E, 0x254F, 0x2552, 0x2555, 0x2558, 0x255B, 0x255E,
\r
1197 0x255F, 0x2560, 0x2561, 0x2562, 0x2564, 0x2566, 0x2568, 0x2569,
\r
1198 0x256A, 0x256B, 0x256C, 0x256D, 0x256F, 0x2573, 0x212B, 0x212C
\r
1201 return(Katakana[(uchar)Ch - (uchar)0xA0]);
\r
1205 /*----- 濁音/半濁音になる文字かチェック --------------------------------------
\r
1208 * char Ch : 1バイトカタカナコード
\r
1209 * char Daku : 濁点/半濁点
\r
1212 * int 文字コードに加える値 (0=濁音/半濁音にならない)
\r
1213 *----------------------------------------------------------------------------*/
\r
1215 static int AskDakuon(char Ch, char Daku)
\r
1220 if((uchar)Daku == (uchar)0xDE)
\r
1222 if((((uchar)Ch >= (uchar)0xB6) && ((uchar)Ch <= (uchar)0xC4)) ||
\r
1223 (((uchar)Ch >= (uchar)0xCA) && ((uchar)Ch <= (uchar)0xCE)))
\r
1228 else if((uchar)Daku == (uchar)0xDF)
\r
1230 if(((uchar)Ch >= (uchar)0xCA) && ((uchar)Ch <= (uchar)0xCE))
\r
1249 /*----- 文字列の漢字コードを調べ、Shift-JISに変換 -----------------------------
\r
1252 * char *Text : 文字列
\r
1253 * int Pref : SJIS/EUCの優先指定
\r
1254 * KANJI_SJIS / KANJI_EUC / KANJI_NOCNV=SJIS/EUCのチェックはしない
\r
1258 *----------------------------------------------------------------------------*/
\r
1260 void ConvAutoToSJIS(char *Text, int Pref)
\r
1264 CODECONVINFO cInfo;
\r
1266 Code = CheckKanjiCode(Text, strlen(Text), Pref);
\r
1267 if(Code != KANJI_SJIS)
\r
1269 Buf = malloc(strlen(Text)+1);
\r
1272 InitCodeConvInfo(&cInfo);
\r
1273 cInfo.KanaCnv = NO;
\r
1275 cInfo.StrLen = strlen(Text);
\r
1277 cInfo.BufSize = strlen(Text);
\r
1282 ConvJIStoSJIS(&cInfo);
\r
1286 ConvEUCtoSJIS(&cInfo);
\r
1290 *(Buf + cInfo.OutLen) = NUL;
\r
1291 strcpy(Text, Buf);
\r
1299 /*----- 使われている漢字コードを調べる ----------------------------------------
\r
1302 * char *Text : 文字列
\r
1303 * int Size : 文字列の長さ
\r
1304 * int Pref : SJIS/EUCの優先指定
\r
1305 * KANJI_SJIS / KANJI_EUC / KANJI_NOCNV=SJIS/EUCのチェックはしない
\r
1308 * int 漢字コード (KANJI_xxx)
\r
1309 *----------------------------------------------------------------------------*/
\r
1311 int CheckKanjiCode(char *Text, int Size, int Pref)
\r
1323 Btm = Text + Size;
\r
1325 /* JIS漢字コードのチェック */
\r
1327 while((Pos = memchr(Pos, 0x1b, Btm-Pos-2)) != NULL)
\r
1330 if((memcmp(Pos, "$B", 2) == 0) || /* <ESC>$B */
\r
1331 (memcmp(Pos, "$@", 2) == 0) || /* <ESC>$@ */
\r
1332 (memcmp(Pos, "(I", 2) == 0)) /* <ESC>(I */
\r
1339 /* EUCとSHIFT-JIS漢字コードのチェック */
\r
1342 if(Pref != KANJI_NOCNV)
\r
1348 PointSJIS = CheckOnSJIS(Pos, Btm);
\r
1349 PointEUC = CheckOnEUC(Pos, Btm);
\r
1350 if(PointSJIS > PointEUC)
\r
1355 if(PointSJIS < PointEUC)
\r
1360 if((Pos = memchr(Pos, '\n', Btm-Pos)) == NULL)
\r
1373 /*----- SHIFT-JISコードの可能性があるかチェック --------------------------------
\r
1376 * uchar *Pos : 文字列
\r
1377 * uchar *Btm : 文字列の末尾
\r
1383 * High 81-FF (A0-DFは半角) (EB以降はほとんど無い)
\r
1385 *----------------------------------------------------------------------------*/
\r
1387 static int CheckOnSJIS(uchar *Pos, uchar *Btm)
\r
1394 while((Point > 0) && (Pos < Btm) && (*Pos != '\n'))
\r
1396 if(FstOnTwo == YES)
\r
1398 if((*Pos < 0x40) || (*Pos > 0xFC)) /* 2バイト目は 0x40~0xFC */
\r
1402 else if(*Pos >= 0x81)
\r
1404 if((*Pos < 0xA0) || (*Pos > 0xDF)) /* 半角カナでなければ */
\r
1406 if(*Pos >= 0xEB) /* 1バイト目は0xEB以降はほとんど無い */
\r
1413 if(FstOnTwo == YES) /* 1バイト目で終わっているのはおかしい */
\r
1420 /*----- EUCコードの可能性があるかチェック -------------------------------------
\r
1423 * uchar *Pos : 文字列
\r
1424 * uchar *Btm : 文字列の末尾
\r
1432 *----------------------------------------------------------------------------*/
\r
1434 static int CheckOnEUC(uchar *Pos, uchar *Btm)
\r
1441 while((Point > 0) && (Pos < Btm) && (*Pos != '\n'))
\r
1445 if((*Pos < 0xA1) || (*Pos > 0xFE)) /* 2バイト目は 0xA1~0xFE */
\r
1449 else if(FstOnTwo == 2) /* 半角カナ */
\r
1451 if((*Pos < 0xA0) || (*Pos > 0xDF)) /* 2バイト目は 0xA0~0xDF */
\r
1457 if(*Pos == 0x8E) /* 0x8E??は半角カナ */
\r
1459 else if((*Pos >= 0xA1) && (*Pos <= 0xFE))
\r
1464 if(FstOnTwo != 0) /* 1バイト目で終わっているのはおかしい */
\r
1472 /*----- UTF-8漢字コードをSHIFT-JIS漢字コードに変換 ------------------------------
\r
1475 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
1478 * int くり返しフラグ (YES/NO)
\r
1481 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
1482 *----------------------------------------------------------------------------*/
\r
1484 int ConvUTF8NtoSJIS(CODECONVINFO *cInfo)
\r
1488 // char temp_string[2048];
\r
1489 int string_length;
\r
1492 // 終端のNULLを含むバグを修正
\r
1501 // 生成される中間コードのサイズを調べる
\r
1502 // string_length = MultiByteToWideChar(
\r
1503 // CP_UTF8, // 変換先文字コード
\r
1504 // 0, // フラグ(0:なし)
\r
1505 // cInfo->Str, // 変換元文字列
\r
1506 // -1, // 変換元文字列バイト数(-1:自動)
\r
1507 // NULL, // 変換した文字列の格納先
\r
1510 // 前回の変換不能な残りの文字列を入力の先頭に結合
\r
1511 SrcLength = cInfo->StrLen + cInfo->EscUTF8Len;
\r
1512 if(!(pSrc = (char*)malloc(sizeof(char) * (SrcLength + 1))))
\r
1514 *(cInfo->Buf) = '\0';
\r
1515 cInfo->BufSize = 0;
\r
1518 memcpy(pSrc, cInfo->EscUTF8, sizeof(char) * cInfo->EscUTF8Len);
\r
1519 memcpy(pSrc + cInfo->EscUTF8Len, cInfo->Str, sizeof(char) * cInfo->StrLen);
\r
1520 *(pSrc + SrcLength) = '\0';
\r
1521 // UTF-8の場合、不完全な文字は常に変換されない
\r
1522 UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pSrc, SrcLength, NULL, 0);
\r
1524 // サイズ0 or バッファサイズより大きい場合は
\r
1525 // cInfo->Bufの最初に'\0'を入れて、
\r
1526 // cInfo->BufSizeに0を入れて返す。
\r
1527 // if( string_length == 0 ||
\r
1528 // string_length >= 1024 ){
\r
1529 // *(cInfo->Buf) = '\0';
\r
1530 // cInfo->BufSize = 0;
\r
1531 // return(Continue);
\r
1533 if(!(pUTF16 = (wchar_t*)malloc(sizeof(wchar_t) * UTF16Length)))
\r
1536 *(cInfo->Buf) = '\0';
\r
1537 cInfo->BufSize = 0;
\r
1541 // 中間コード(unicode)に変換
\r
1542 // MultiByteToWideChar(
\r
1543 // CP_UTF8, // 変換先文字コード
\r
1544 // 0, // フラグ(0:なし)
\r
1545 // cInfo->Str, // 変換元文字列
\r
1546 // -1, // 変換元文字列バイト数(-1:自動)
\r
1547 // (unsigned short *)temp_string, // 変換した文字列の格納先
\r
1550 MultiByteToWideChar(CP_UTF8, 0, pSrc, SrcLength, pUTF16, UTF16Length);
\r
1552 // 生成されるUTF-8コードのサイズを調べる
\r
1553 // string_length = WideCharToMultiByte(
\r
1554 // CP_ACP, // 変換先文字コード
\r
1555 // 0, // フラグ(0:なし)
\r
1556 // (unsigned short *)temp_string, // 変換元文字列
\r
1557 // -1, // 変換元文字列バイト数(-1:自動)
\r
1558 // NULL, // 変換した文字列の格納先
\r
1562 string_length = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);
\r
1564 // サイズ0 or 出力バッファサイズより大きい場合は、
\r
1565 // cInfo->Bufの最初に'\0'を入れて、
\r
1566 // cInfo->BufSizeに0を入れて返す。
\r
1567 // if( string_length == 0 ||
\r
1568 // string_length >= cInfo->BufSize ){
\r
1569 // *(cInfo->Buf) = '\0';
\r
1570 // cInfo->BufSize = 0;
\r
1571 // return(Continue);
\r
1575 // cInfo->OutLen = string_length;
\r
1578 // WideCharToMultiByte(
\r
1579 // CP_ACP, // 変換先文字コード
\r
1580 // 0, // フラグ(0:なし)
\r
1581 // (unsigned short *)temp_string, // 変換元文字列
\r
1582 // -1, // 変換元文字列バイト数(-1:自動)
\r
1583 // cInfo->Buf, // 変換した文字列の格納先(BOM:3bytes)
\r
1584 // cInfo->BufSize, // 格納先サイズ
\r
1587 cInfo->OutLen = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, cInfo->Buf, cInfo->BufSize, NULL, NULL);
\r
1588 // バッファに収まらないため変換文字数を半減
\r
1589 while(cInfo->OutLen == 0 && UTF16Length > 0)
\r
1591 UTF16Length = UTF16Length / 2;
\r
1592 cInfo->OutLen = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, cInfo->Buf, cInfo->BufSize, NULL, NULL);
\r
1594 // 変換された元の文字列での文字数を取得
\r
1595 Count = WideCharToMultiByte(CP_UTF8, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);
\r
1597 UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pSrc + Count, SrcLength - Count, NULL, 0);
\r
1598 cInfo->Str += Count - cInfo->EscUTF8Len;
\r
1599 cInfo->StrLen -= Count - cInfo->EscUTF8Len;
\r
1600 cInfo->EscUTF8Len = 0;
\r
1601 if(UTF16Length > 0)
\r
1605 // 変換不能なため次の入力の先頭に結合
\r
1606 memcpy(cInfo->EscUTF8, cInfo->Str, sizeof(char) * cInfo->StrLen);
\r
1607 cInfo->EscUTF8Len = cInfo->StrLen;
\r
1608 cInfo->Str += cInfo->StrLen;
\r
1609 cInfo->StrLen = 0;
\r
1619 /*----- SHIFT-JIS漢字コードをUTF-8漢字コードに変換 ------------------------------
\r
1622 * CODECONVINFO *cInfo : 漢字コード変換情報
\r
1625 * int くり返しフラグ (YES/NO)
\r
1628 * くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと
\r
1629 *----------------------------------------------------------------------------*/
\r
1630 int ConvSJIStoUTF8N(CODECONVINFO *cInfo)
\r
1634 // char temp_string[2048];
\r
1635 int string_length;
\r
1638 // 終端のNULLを含むバグを修正
\r
1647 // 生成される中間コードのサイズを調べる
\r
1648 // string_length = MultiByteToWideChar(
\r
1649 // CP_ACP, // 変換先文字コード
\r
1650 // 0, // フラグ(0:なし)
\r
1651 // cInfo->Str, // 変換元文字列
\r
1652 // -1, // 変換元文字列バイト数(-1:自動)
\r
1653 // NULL, // 変換した文字列の格納先
\r
1656 // 前回の変換不能な残りの文字列を入力の先頭に結合
\r
1657 SrcLength = cInfo->StrLen + cInfo->EscUTF8Len;
\r
1658 if(!(pSrc = (char*)malloc(sizeof(char) * (SrcLength + 1))))
\r
1660 *(cInfo->Buf) = '\0';
\r
1661 cInfo->BufSize = 0;
\r
1664 memcpy(pSrc, cInfo->EscUTF8, sizeof(char) * cInfo->EscUTF8Len);
\r
1665 memcpy(pSrc + cInfo->EscUTF8Len, cInfo->Str, sizeof(char) * cInfo->StrLen);
\r
1666 *(pSrc + SrcLength) = '\0';
\r
1667 // Shift_JISの場合、不完全な文字でも変換されることがあるため、末尾の不完全な部分を削る
\r
1669 while(Count < SrcLength)
\r
1671 if(((unsigned char)*(pSrc + Count) >= 0x81 && (unsigned char)*(pSrc + Count) <= 0x9f) || (unsigned char)*(pSrc + Count) >= 0xe0)
\r
1673 if((unsigned char)*(pSrc + Count + 1) >= 0x40)
\r
1677 if(Count + 2 > SrcLength)
\r
1685 SrcLength = Count;
\r
1686 UTF16Length = MultiByteToWideChar(CP_ACP, 0, pSrc, SrcLength, NULL, 0);
\r
1688 // サイズ0 or バッファサイズより大きい場合は、
\r
1689 // cInfo->Bufの最初に'\0'を入れて、
\r
1690 // cInfo->BufSizeに0を入れて返す。
\r
1691 // if( string_length == 0 ||
\r
1692 // string_length >= 1024 ){
\r
1693 // *(cInfo->Buf) = '\0';
\r
1694 // cInfo->BufSize = 0;
\r
1695 // return(Continue);
\r
1697 if(!(pUTF16 = (wchar_t*)malloc(sizeof(wchar_t) * UTF16Length)))
\r
1700 *(cInfo->Buf) = '\0';
\r
1701 cInfo->BufSize = 0;
\r
1705 // 中間コード(unicode)に変換
\r
1706 // MultiByteToWideChar(
\r
1707 // CP_ACP, // 変換先文字コード
\r
1708 // 0, // フラグ(0:なし)
\r
1709 // cInfo->Str, // 変換元文字列
\r
1710 // -1, // 変換元文字列バイト数(-1:自動)
\r
1711 // (unsigned short *)temp_string, // 変換した文字列の格納先
\r
1714 MultiByteToWideChar(CP_ACP, 0, pSrc, SrcLength, pUTF16, UTF16Length);
\r
1716 // 生成されるUTF-8コードのサイズを調べる
\r
1717 // string_length = WideCharToMultiByte(
\r
1718 // CP_UTF8, // 変換先文字コード
\r
1719 // 0, // フラグ(0:なし)
\r
1720 // (unsigned short *)temp_string, // 変換元文字列
\r
1721 // -1, // 変換元文字列バイト数(-1:自動)
\r
1722 // NULL, // 変換した文字列の格納先
\r
1726 string_length = WideCharToMultiByte(CP_UTF8, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);
\r
1728 // サイズ0 or 出力バッファサイズより大きい場合は、
\r
1729 // cInfo->Bufの最初に'\0'を入れて、
\r
1730 // cInfo->BufSizeに0を入れて返す。
\r
1731 // if( string_length == 0 ||
\r
1732 // string_length >= cInfo->BufSize ){
\r
1733 // *(cInfo->Buf) = '\0';
\r
1734 // cInfo->BufSize = 0;
\r
1735 // return(Continue);
\r
1739 // cInfo->OutLen = string_length;
\r
1742 // ↓付けちゃだめ コマンドにも追加されてしまう
\r
1743 // 出力文字列の先頭にBOM(byte order mark)をつける
\r
1744 *(cInfo->Buf) = (char)0xef;
\r
1745 *(cInfo->Buf+1) = (char)0xbb;
\r
1746 *(cInfo->Buf+2) = (char)0xbf;
\r
1750 // WideCharToMultiByte(
\r
1751 // CP_UTF8, // 変換先文字コード
\r
1752 // 0, // フラグ(0:なし)
\r
1753 // (unsigned short *)temp_string, // 変換元文字列
\r
1754 // -1, // 変換元文字列バイト数(-1:自動)
\r
1755 // cInfo->Buf, // 変換した文字列の格納先(BOM:3bytes)
\r
1756 // cInfo->BufSize, // 格納先サイズ
\r
1759 cInfo->OutLen = WideCharToMultiByte(CP_UTF8, 0, pUTF16, UTF16Length, cInfo->Buf, cInfo->BufSize, NULL, NULL);
\r
1760 // バッファに収まらないため変換文字数を半減
\r
1761 while(cInfo->OutLen == 0 && UTF16Length > 0)
\r
1763 UTF16Length = UTF16Length / 2;
\r
1764 cInfo->OutLen = WideCharToMultiByte(CP_UTF8, 0, pUTF16, UTF16Length, cInfo->Buf, cInfo->BufSize, NULL, NULL);
\r
1766 // 変換された元の文字列での文字数を取得
\r
1767 Count = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);
\r
1769 UTF16Length = MultiByteToWideChar(CP_ACP, 0, pSrc + Count, SrcLength - Count, NULL, 0);
\r
1770 cInfo->Str += Count - cInfo->EscUTF8Len;
\r
1771 cInfo->StrLen -= Count - cInfo->EscUTF8Len;
\r
1772 cInfo->EscUTF8Len = 0;
\r
1773 if(UTF16Length > 0)
\r
1777 // 変換不能なため次の入力の先頭に結合
\r
1778 memcpy(cInfo->EscUTF8, cInfo->Str, sizeof(char) * cInfo->StrLen);
\r
1779 cInfo->EscUTF8Len = cInfo->StrLen;
\r
1780 cInfo->Str += cInfo->StrLen;
\r
1781 cInfo->StrLen = 0;
\r
1793 /*----- IBM拡張漢字をNEC選定IBM拡張漢字等に変換 -------------------------------
\r
1800 *----------------------------------------------------------------------------*/
\r
1801 static int ConvertIBMExtendedChar(int code)
\r
1803 if((code >= 0xfa40) && (code <= 0xfa49)) code -= (0xfa40 - 0xeeef);
\r
1804 else if((code >= 0xfa4a) && (code <= 0xfa53)) code -= (0xfa4a - 0x8754);
\r
1805 else if((code >= 0xfa54) && (code <= 0xfa57)) code -= (0xfa54 - 0xeef9);
\r
1806 else if(code == 0xfa58) code = 0x878a;
\r
1807 else if(code == 0xfa59) code = 0x8782;
\r
1808 else if(code == 0xfa5a) code = 0x8784;
\r
1809 else if(code == 0xfa5b) code = 0x879a;
\r
1810 else if((code >= 0xfa5c) && (code <= 0xfa7e)) code -= (0xfa5c - 0xed40);
\r
1811 else if((code >= 0xfa80) && (code <= 0xfa9b)) code -= (0xfa80 - 0xed63);
\r
1812 else if((code >= 0xfa9c) && (code <= 0xfafc)) code -= (0xfa9c - 0xed80);
\r
1813 else if((code >= 0xfb40) && (code <= 0xfb5b)) code -= (0xfb40 - 0xede1);
\r
1814 else if((code >= 0xfb5c) && (code <= 0xfb7e)) code -= (0xfb5c - 0xee40);
\r
1815 else if((code >= 0xfb80) && (code <= 0xfb9b)) code -= (0xfb80 - 0xee63);
\r
1816 else if((code >= 0xfb9c) && (code <= 0xfbfc)) code -= (0xfb9c - 0xee80);
\r
1817 else if((code >= 0xfc40) && (code <= 0xfc4b)) code -= (0xfc40 - 0xeee1);
\r