OSDN Git Service

Add support for retaining time stamps on uploading files.
[ffftp/ffftp.git] / codecnv.c
index 006e843..a313d1a 100644 (file)
--- a/codecnv.c
+++ b/codecnv.c
@@ -1,6 +1,6 @@
-/*=============================================================================\r
+/*=============================================================================\r
 *\r
-*                                                      \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\81^\89ü\8ds\83R\81[\83h\95Ï\8a·\r
+*                                                      漢字コード変換/改行コード変換\r
 *\r
 ===============================================================================\r
 / Copyright (C) 1997-2007 Sota. All rights reserved.\r
@@ -31,7 +31,9 @@
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <string.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
+#include <winsock2.h>\r
 #include <mbstring.h>\r
 #include <windowsx.h>\r
 \r
 \r
 \r
 \r
-#define CONV_ASCII             0               /* ASCII\95\8e\9a\8f\88\97\9d\92\86 */\r
-#define CONV_KANJI             1               /* \8a¿\8e\9a\8f\88\97\9d\92\86 */\r
-#define CONV_KANA              2               /* \94¼\8ap\83J\83^\83J\83i\8f\88\97\9d\92\86 */\r
+#define CONV_ASCII             0               /* ASCII文字処理中 */\r
+#define CONV_KANJI             1               /* 漢字処理中 */\r
+#define CONV_KANA              2               /* 半角カタカナ処理中 */\r
 \r
 \r
-/*===== \83v\83\8d\83g\83^\83C\83v =====*/\r
+/*===== プロトタイプ =====*/\r
 \r
 static char *ConvEUCtoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put);\r
 static char *ConvJIStoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put);\r
@@ -61,7 +63,7 @@ static int ConvertIBMExtendedChar(int code);
 \r
 \r
 #if 0\r
-/*----- \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\82Ì\83e\83X\83g\83v\83\8d\83O\83\89\83\80 ------------------------------------*/\r
+/*----- 漢字コード変換のテストプログラム ------------------------------------*/\r
 \r
 void CodeCnvTest(void)\r
 {\r
@@ -174,7 +176,7 @@ void CodeCnvTest(void)
 \r
 \r
 #if 0\r
-/*----- \89ü\8ds\83R\81[\83h\95Ï\8a·\82Ì\83e\83X\83g\83v\83\8d\83O\83\89\83\80 ------------------------------------*/\r
+/*----- 改行コード変換のテストプログラム ------------------------------------*/\r
 \r
 void TermCodeCnvTest(void)\r
 {\r
@@ -242,13 +244,13 @@ void TermCodeCnvTest(void)
 \r
 \r
 \r
-/*----- \89ü\8ds\83R\81[\83h\95Ï\8a·\8fî\95ñ\82ð\8f\89\8aú\89» --------------------------------------------\r
+/*----- 改行コード変換情報を初期化 --------------------------------------------\r
 *\r
 *      Parameter\r
-*              TERMCODECONVINFO *cInfo : \89ü\8ds\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+*              TERMCODECONVINFO *cInfo : 改行コード変換情報\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void InitTermCodeConvInfo(TERMCODECONVINFO *cInfo)\r
@@ -258,16 +260,16 @@ void InitTermCodeConvInfo(TERMCODECONVINFO *cInfo)
 }\r
 \r
 \r
-/*----- \89ü\8ds\83R\81[\83h\95Ï\8a·\82Ì\8ec\82è\8fî\95ñ\82ð\8fo\97Í ----------------------------------------\r
+/*----- 改行コード変換の残り情報を出力 ----------------------------------------\r
 *\r
 *      Parameter\r
-*              TERMCODECONVINFO *cInfo : \89ü\8ds\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+*              TERMCODECONVINFO *cInfo : 改行コード変換情報\r
 *\r
 *      Return Value\r
-*              int \82­\82è\95Ô\82µ\83t\83\89\83O (=NO)\r
+*              int くり返しフラグ (=NO)\r
 *\r
 *      Note\r
-*              \89ü\8ds\83R\81[\83h\95Ï\8a·\82Ì\8dÅ\8cã\82É\8cÄ\82Ô\8e\96\r
+*              改行コード変換の最後に呼ぶ事\r
 *----------------------------------------------------------------------------*/\r
 \r
 int FlushRestTermCodeConvData(TERMCODECONVINFO *cInfo)\r
@@ -285,16 +287,16 @@ int FlushRestTermCodeConvData(TERMCODECONVINFO *cInfo)
 }\r
 \r
 \r
-/*----- \89ü\8ds\83R\81[\83h\82ðCRLF\82É\95Ï\8a· -------------------------------------------------\r
+/*----- 改行コードをCRLFに変換 -------------------------------------------------\r
 *\r
 *      Parameter\r
-*              TERMCODECONVINFO *cInfo : \89ü\8ds\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+*              TERMCODECONVINFO *cInfo : 改行コード変換情報\r
 *\r
 *      Return Value\r
-*              int \82­\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
+*              int くり返しフラグ (YES/NO)\r
 *\r
 *      Note\r
-*              \82­\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
+*              くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと\r
 *----------------------------------------------------------------------------*/\r
 \r
 int ConvTermCodeToCRLF(TERMCODECONVINFO *cInfo)\r
@@ -348,13 +350,13 @@ int ConvTermCodeToCRLF(TERMCODECONVINFO *cInfo)
 }\r
 \r
 \r
-/*----- \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\82ð\8f\89\8aú\89» --------------------------------------------\r
+/*----- 漢字コード変換情報を初期化 --------------------------------------------\r
 *\r
 *      Parameter\r
-*              CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+*              CODECONVINFO *cInfo : 漢字コード変換情報\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void InitCodeConvInfo(CODECONVINFO *cInfo)\r
@@ -366,26 +368,37 @@ void InitCodeConvInfo(CODECONVINFO *cInfo)
        cInfo->KanjiFst = 0;\r
        cInfo->KanaPrev = 0;\r
        cInfo->KanaProc = NULL;\r
+       // UTF-8対応\r
+       cInfo->EscUTF8Len = 0;\r
+       cInfo->EscFlush = NO;\r
+       cInfo->FlushProc = NULL;\r
        return;\r
 }\r
 \r
 \r
-/*----- \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\82Ì\8ec\82è\8fî\95ñ\82ð\8fo\97Í ----------------------------------------\r
+/*----- 漢字コード変換の残り情報を出力 ----------------------------------------\r
 *\r
 *      Parameter\r
-*              CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+*              CODECONVINFO *cInfo : 漢字コード変換情報\r
 *\r
 *      Return Value\r
-*              int \82­\82è\95Ô\82µ\83t\83\89\83O (=NO)\r
+*              int くり返しフラグ (=NO)\r
 *\r
 *      Note\r
-*              \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\82Ì\8dÅ\8cã\82É\8cÄ\82Ô\8e\96\r
+*              漢字コード変換の最後に呼ぶ事\r
 *----------------------------------------------------------------------------*/\r
 \r
 int FlushRestData(CODECONVINFO *cInfo)\r
 {\r
        char *Put;\r
 \r
+       // UTF-8対応\r
+       if(cInfo->FlushProc != NULL)\r
+       {\r
+               cInfo->EscFlush = YES;\r
+               return cInfo->FlushProc(cInfo);\r
+       }\r
+\r
        Put = cInfo->Buf;\r
 \r
        if(cInfo->KanaProc != NULL)\r
@@ -404,16 +417,16 @@ int FlushRestData(CODECONVINFO *cInfo)
 }\r
 \r
 \r
-/*----- EUC\8a¿\8e\9a\83R\81[\83h\82ðSHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------------\r
+/*----- EUC漢字コードをSHIFT-JIS漢字コードに変換 ------------------------------\r
 *\r
 *      Parameter\r
-*              CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+*              CODECONVINFO *cInfo : 漢字コード変換情報\r
 *\r
 *      Return Value\r
-*              int \82­\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
+*              int くり返しフラグ (YES/NO)\r
 *\r
 *      Note\r
-*              \82­\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
+*              くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと\r
 *----------------------------------------------------------------------------*/\r
 \r
 int ConvEUCtoSJIS(CODECONVINFO *cInfo)\r
@@ -445,7 +458,7 @@ int ConvEUCtoSJIS(CODECONVINFO *cInfo)
                                cInfo->KanjiFst = *Str++;\r
                        else\r
                        {\r
-                               if((uchar)cInfo->KanjiFst == (uchar)0x8E)       /* \94¼\8ap\83J\83^\83J\83i */\r
+                               if((uchar)cInfo->KanjiFst == (uchar)0x8E)       /* 半角カタカナ */\r
                                {\r
                                        Put = ConvEUCtoSJISkanaProc(cInfo, *Str++, Put);\r
                                }\r
@@ -480,15 +493,15 @@ int ConvEUCtoSJIS(CODECONVINFO *cInfo)
 }\r
 \r
 \r
-/*----- EUC-->SHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a·\82Ì\94¼\8ap\83J\83^\83J\83i\82Ì\8f\88\97\9d -------------------\r
+/*----- EUC-->SHIFT-JIS漢字コードに変換の半角カタカナの処理 -------------------\r
 *\r
 *      Parameter\r
-*              CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
-*              char Dt : \95\8e\9a\r
-*              char *Put : \83f\81[\83^\83Z\83b\83g\88Ê\92u\r
+*              CODECONVINFO *cInfo : 漢字コード変換情報\r
+*              char Dt : 文字\r
+*              char *Put : データセット位置\r
 *\r
 *      Return Value\r
-*              char *\8e\9f\82Ì\83f\81[\83^\83Z\83b\83g\88Ê\92u\r
+*              char *次のデータセット位置\r
 *----------------------------------------------------------------------------*/\r
 \r
 static char *ConvEUCtoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)\r
@@ -523,21 +536,21 @@ static char *ConvEUCtoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)
 }\r
 \r
 \r
-/*----- JIS\8a¿\8e\9a\83R\81[\83h\82ðSHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------------\r
+/*----- JIS漢字コードをSHIFT-JIS漢字コードに変換 ------------------------------\r
 *\r
 *      Parameter\r
-*              CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+*              CODECONVINFO *cInfo : 漢字コード変換情報\r
 *\r
 *      Return Value\r
-*              int \82­\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
+*              int くり返しフラグ (YES/NO)\r
 *\r
 *      Note\r
-*              \82­\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
+*              くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと\r
 *\r
-*              \83G\83X\83P\81[\83v\83R\81[\83h\82Í\81A\8e\9f\82Ì\82à\82Ì\82É\91Î\89\9e\82µ\82Ä\82¢\82é\r
-*                      \8a¿\8e\9a\8aJ\8en                <ESC>$B         <ESC>$@\r
-*                      \94¼\8ap\83J\83i\8aJ\8en    <ESC>(I\r
-*                      \8a¿\8e\9a\8fI\97¹                <ESC>(B         <ESC>(J         <ESC>(H\r
+*              エスケープコードは、次のものに対応している\r
+*                      漢字開始            <ESC>$B         <ESC>$@\r
+*                      半角カナ開始      <ESC>(I\r
+*                      漢字終了            <ESC>(B         <ESC>(J         <ESC>(H\r
 *----------------------------------------------------------------------------*/\r
 \r
 int ConvJIStoSJIS(CODECONVINFO *cInfo)\r
@@ -674,15 +687,15 @@ int ConvJIStoSJIS(CODECONVINFO *cInfo)
 }\r
 \r
 \r
-/*----- JIS-->SHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a·\82Ì\94¼\8ap\83J\83^\83J\83i\82Ì\8f\88\97\9d -------------------\r
+/*----- JIS-->SHIFT-JIS漢字コードに変換の半角カタカナの処理 -------------------\r
 *\r
 *      Parameter\r
-*              CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
-*              char Dt : \95\8e\9a\r
-*              char *Put : \83f\81[\83^\83Z\83b\83g\88Ê\92u\r
+*              CODECONVINFO *cInfo : 漢字コード変換情報\r
+*              char Dt : 文字\r
+*              char *Put : データセット位置\r
 *\r
 *      Return Value\r
-*              char *\8e\9f\82Ì\83f\81[\83^\83Z\83b\83g\88Ê\92u\r
+*              char *次のデータセット位置\r
 *----------------------------------------------------------------------------*/\r
 \r
 static char *ConvJIStoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)\r
@@ -717,18 +730,18 @@ static char *ConvJIStoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)
 }\r
 \r
 \r
-/*----- Samba-HEX/Samba-CAP\8a¿\8e\9a\83R\81[\83h\82ðSHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· --------------\r
+/*----- Samba-HEX/Samba-CAP漢字コードをSHIFT-JIS漢字コードに変換 --------------\r
 *\r
 *      Parameter\r
-*              CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+*              CODECONVINFO *cInfo : 漢字コード変換情報\r
 *\r
 *      Return Value\r
-*              int \82­\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
+*              int くり返しフラグ (YES/NO)\r
 *\r
 *      Note\r
-*              \82­\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
-*              \95ª\8a\84\82³\82ê\82½\93ü\97Í\95\8e\9a\97ñ\82Ì\95Ï\8a·\82Í\83T\83|\81[\83g\82µ\82Ä\82¢\82È\82¢\r
-*              \94¼\8ap\83J\83^\83J\83i\82Ì\95Ï\8a·\90Ý\92è\82É\82Í\91Î\89\9e\82µ\82Ä\82¢\82È\82¢\r
+*              くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと\r
+*              分割された入力文字列の変換はサポートしていない\r
+*              半角カタカナの変換設定には対応していない\r
 *----------------------------------------------------------------------------*/\r
 \r
 int ConvSMBtoSJIS(CODECONVINFO *cInfo)\r
@@ -773,16 +786,16 @@ int ConvSMBtoSJIS(CODECONVINFO *cInfo)
 }\r
 \r
 \r
-/*----- SHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82ðEUC\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------------\r
+/*----- SHIFT-JIS漢字コードをEUC漢字コードに変換 ------------------------------\r
 *\r
 *      Parameter\r
-*              CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+*              CODECONVINFO *cInfo : 漢字コード変換情報\r
 *\r
 *      Return Value\r
-*              int \82­\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
+*              int くり返しフラグ (YES/NO)\r
 *\r
 *      Note\r
-*              \82­\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
+*              くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと\r
 *----------------------------------------------------------------------------*/\r
 \r
 int ConvSJIStoEUC(CODECONVINFO *cInfo)\r
@@ -851,15 +864,15 @@ int ConvSJIStoEUC(CODECONVINFO *cInfo)
 }\r
 \r
 \r
-/*----- SHIFT-JIS-->EUC\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a·\82Ì\94¼\8ap\83J\83^\83J\83i\82Ì\8f\88\97\9d -------------------\r
+/*----- SHIFT-JIS-->EUC漢字コードに変換の半角カタカナの処理 -------------------\r
 *\r
 *      Parameter\r
-*              CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
-*              char Dt : \95\8e\9a\r
-*              char *Put : \83f\81[\83^\83Z\83b\83g\88Ê\92u\r
+*              CODECONVINFO *cInfo : 漢字コード変換情報\r
+*              char Dt : 文字\r
+*              char *Put : データセット位置\r
 *\r
 *      Return Value\r
-*              char *\8e\9f\82Ì\83f\81[\83^\83Z\83b\83g\88Ê\92u\r
+*              char *次のデータセット位置\r
 *----------------------------------------------------------------------------*/\r
 \r
 static char *ConvSJIStoEUCkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)\r
@@ -897,21 +910,21 @@ static char *ConvSJIStoEUCkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)
 }\r
 \r
 \r
-/*----- SHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82ðJIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------------\r
+/*----- SHIFT-JIS漢字コードをJIS漢字コードに変換 ------------------------------\r
 *\r
 *      Parameter\r
-*              CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+*              CODECONVINFO *cInfo : 漢字コード変換情報\r
 *\r
 *      Return Value\r
-*              int \82­\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
+*              int くり返しフラグ (YES/NO)\r
 *\r
 *      Note\r
-*              \82­\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
+*              くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと\r
 *\r
-*              \83G\83X\83P\81[\83v\83R\81[\83h\82Í\81A\8e\9f\82Ì\82à\82Ì\82ð\8eg\97p\82·\82é\r
-*                      \8a¿\8e\9a\8aJ\8en                <ESC>$B\r
-*                      \94¼\8ap\83J\83i\8aJ\8en    <ESC>(I\r
-*                      \8a¿\8e\9a\8fI\97¹                <ESC>(B\r
+*              エスケープコードは、次のものを使用する\r
+*                      漢字開始            <ESC>$B\r
+*                      半角カナ開始      <ESC>(I\r
+*                      漢字終了            <ESC>(B\r
 *----------------------------------------------------------------------------*/\r
 \r
 int ConvSJIStoJIS(CODECONVINFO *cInfo)\r
@@ -1003,15 +1016,15 @@ int ConvSJIStoJIS(CODECONVINFO *cInfo)
 }\r
 \r
 \r
-/*----- SHIFT-JIS-->JIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a·\82Ì\94¼\8ap\83J\83^\83J\83i\82Ì\8f\88\97\9d -------------------\r
+/*----- SHIFT-JIS-->JIS漢字コードに変換の半角カタカナの処理 -------------------\r
 *\r
 *      Parameter\r
-*              CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
-*              char Dt : \95\8e\9a\r
-*              char *Put : \83f\81[\83^\83Z\83b\83g\88Ê\92u\r
+*              CODECONVINFO *cInfo : 漢字コード変換情報\r
+*              char Dt : 文字\r
+*              char *Put : データセット位置\r
 *\r
 *      Return Value\r
-*              char *\8e\9f\82Ì\83f\81[\83^\83Z\83b\83g\88Ê\92u\r
+*              char *次のデータセット位置\r
 *----------------------------------------------------------------------------*/\r
 \r
 static char *ConvSJIStoJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)\r
@@ -1061,18 +1074,18 @@ static char *ConvSJIStoJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put)
 }\r
 \r
 \r
-/*----- SHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82ðSamba-HEX\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------\r
+/*----- SHIFT-JIS漢字コードをSamba-HEX漢字コードに変換 ------------------------\r
 *\r
 *      Parameter\r
-*              CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+*              CODECONVINFO *cInfo : 漢字コード変換情報\r
 *\r
 *      Return Value\r
-*              int \82­\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
+*              int くり返しフラグ (YES/NO)\r
 *\r
 *      Note\r
-*              \82­\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
-*              \95ª\8a\84\82³\82ê\82½\93ü\97Í\95\8e\9a\97ñ\82Ì\95Ï\8a·\82Í\83T\83|\81[\83g\82µ\82Ä\82¢\82È\82¢\r
-*              \94¼\8ap\83J\83^\83J\83i\82Ì\95Ï\8a·\90Ý\92è\82É\82Í\91Î\89\9e\82µ\82Ä\82¢\82È\82¢\r
+*              くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと\r
+*              分割された入力文字列の変換はサポートしていない\r
+*              半角カタカナの変換設定には対応していない\r
 *----------------------------------------------------------------------------*/\r
 \r
 int ConvSJIStoSMB_HEX(CODECONVINFO *cInfo)\r
@@ -1120,17 +1133,17 @@ int ConvSJIStoSMB_HEX(CODECONVINFO *cInfo)
 }\r
 \r
 \r
-/*----- SHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82ðSamba-CAP\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------\r
+/*----- SHIFT-JIS漢字コードをSamba-CAP漢字コードに変換 ------------------------\r
 *\r
 *      Parameter\r
-*              CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+*              CODECONVINFO *cInfo : 漢字コード変換情報\r
 *\r
 *      Return Value\r
-*              int \82­\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
+*              int くり返しフラグ (YES/NO)\r
 *\r
 *      Note\r
-*              \82­\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
-*              \95ª\8a\84\82³\82ê\82½\93ü\97Í\95\8e\9a\97ñ\82Ì\95Ï\8a·\82Í\83T\83|\81[\83g\82µ\82Ä\82¢\82È\82¢\r
+*              くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと\r
+*              分割された入力文字列の変換はサポートしていない\r
 *----------------------------------------------------------------------------*/\r
 \r
 int ConvSJIStoSMB_CAP(CODECONVINFO *cInfo)\r
@@ -1169,13 +1182,13 @@ int ConvSJIStoSMB_CAP(CODECONVINFO *cInfo)
 }\r
 \r
 \r
-/*----- \82P\83o\83C\83g\83J\83^\83J\83i\82ðJIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ---------------------------------\r
+/*----- 1バイトカタカナをJIS漢字コードに変換 ---------------------------------\r
 *\r
 *      Parameter\r
-*              char Ch : \82P\83o\83C\83g\83J\83^\83J\83i\83R\81[\83h\r
+*              char Ch : 1バイトカタカナコード\r
 *\r
 *      Return Value\r
-*              int JIS\8a¿\8e\9a\83R\81[\83h\r
+*              int JIS漢字コード\r
 *----------------------------------------------------------------------------*/\r
 \r
 static int HanKataToZen(char Ch)\r
@@ -1195,14 +1208,14 @@ static int HanKataToZen(char Ch)
 }\r
 \r
 \r
-/*----- \91÷\89¹\81^\94¼\91÷\89¹\82É\82È\82é\95\8e\9a\82©\83`\83F\83b\83N --------------------------------------\r
+/*----- 濁音/半濁音になる文字かチェック --------------------------------------\r
 *\r
 *      Parameter\r
-*              char Ch : \82P\83o\83C\83g\83J\83^\83J\83i\83R\81[\83h\r
-*              char Daku : \91÷\93_\81^\94¼\91÷\93_\r
+*              char Ch : 1バイトカタカナコード\r
+*              char Daku : 濁点/半濁点\r
 *\r
 *      Return Value\r
-*              int \95\8e\9a\83R\81[\83h\82É\89Á\82¦\82é\92l (0=\91÷\89¹\81^\94¼\91÷\89¹\82É\82È\82ç\82È\82¢)\r
+*              int 文字コードに加える値 (0=濁音/半濁音にならない)\r
 *----------------------------------------------------------------------------*/\r
 \r
 static int AskDakuon(char Ch, char Daku)\r
@@ -1239,15 +1252,15 @@ static int AskDakuon(char Ch, char Daku)
 \r
 \r
 \r
-/*----- \95\8e\9a\97ñ\82Ì\8a¿\8e\9a\83R\81[\83h\82ð\92²\82×\81AShift-JIS\82É\95Ï\8a· -----------------------------\r
+/*----- 文字列の漢字コードを調べ、Shift-JISに変換 -----------------------------\r
 *\r
 *      Parameter\r
-*              char *Text : \95\8e\9a\97ñ\r
-*              int Pref : SJIS/EUC\82Ì\97D\90æ\8ew\92è\r
-\81\96                     KANJI_SJIS / KANJI_EUC / KANJI_NOCNV=SJIS/EUC\82Ì\83`\83F\83b\83N\82Í\82µ\82È\82¢\r
+*              char *Text : 文字列\r
+*              int Pref : SJIS/EUCの優先指定\r
+*                    KANJI_SJIS / KANJI_EUC / KANJI_NOCNV=SJIS/EUCのチェックはしない\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void ConvAutoToSJIS(char *Text, int Pref)\r
@@ -1289,16 +1302,16 @@ void ConvAutoToSJIS(char *Text, int Pref)
 }\r
 \r
 \r
-/*----- \8eg\82í\82ê\82Ä\82¢\82é\8a¿\8e\9a\83R\81[\83h\82ð\92²\82×\82é ----------------------------------------\r
+/*----- 使われている漢字コードを調べる ----------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Text : \95\8e\9a\97ñ\r
-*              int Size : \95\8e\9a\97ñ\82Ì\92·\82³\r
-*              int Pref : SJIS/EUC\82Ì\97D\90æ\8ew\92è\r
-\81\96                     KANJI_SJIS / KANJI_EUC / KANJI_NOCNV=SJIS/EUC\82Ì\83`\83F\83b\83N\82Í\82µ\82È\82¢\r
+*              char *Text : 文字列\r
+*              int Size : 文字列の長さ\r
+*              int Pref : SJIS/EUCの優先指定\r
+*                    KANJI_SJIS / KANJI_EUC / KANJI_NOCNV=SJIS/EUCのチェックはしない\r
 *\r
 *      Return Value\r
-*              int \8a¿\8e\9a\83R\81[\83h (KANJI_xxx)\r
+*              int 漢字コード (KANJI_xxx)\r
 *----------------------------------------------------------------------------*/\r
 \r
 int CheckKanjiCode(char *Text, int Size, int Pref)\r
@@ -1315,7 +1328,7 @@ int CheckKanjiCode(char *Text, int Size, int Pref)
                Ret = -1;\r
                Btm = Text + Size;\r
 \r
-               /* JIS\8a¿\8e\9a\83R\81[\83h\82Ì\83`\83F\83b\83N */\r
+               /* JIS漢字コードのチェック */\r
                Pos = Text;\r
                while((Pos = memchr(Pos, 0x1b, Btm-Pos-2)) != NULL)\r
                {\r
@@ -1329,7 +1342,7 @@ int CheckKanjiCode(char *Text, int Size, int Pref)
                        }\r
                }\r
 \r
-               /* EUC\82ÆSHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82Ì\83`\83F\83b\83N */\r
+               /* EUCとSHIFT-JIS漢字コードのチェック */\r
                if(Ret == -1)\r
                {\r
                        if(Pref != KANJI_NOCNV)\r
@@ -1363,17 +1376,17 @@ int CheckKanjiCode(char *Text, int Size, int Pref)
 }\r
 \r
 \r
-/*----- SHIFT-JIS\83R\81[\83h\82Ì\89Â\94\\90«\82ª\82 \82é\82©\83`\83F\83b\83N --------------------------------\r
+/*----- SHIFT-JISコードの可能性があるかチェック --------------------------------\r
 *\r
 *      Parameter\r
-*              uchar *Pos : \95\8e\9a\97ñ\r
-*              uchar *Btm : \95\8e\9a\97ñ\82Ì\96\96\94ö\r
+*              uchar *Pos : 文字列\r
+*              uchar *Btm : 文字列の末尾\r
 *\r
 *      Return Value\r
-*              int \93¾\93_\r
+*              int 得点\r
 *\r
 *      Note\r
-*              High    81-FF (A0-DF\82Í\94¼\8ap)     (EB\88È\8d~\82Í\82Ù\82Æ\82ñ\82Ç\96³\82¢)\r
+*              High    81-FF (A0-DFは半角)  (EB以降はほとんど無い)\r
 *              Low             40-FC\r
 *----------------------------------------------------------------------------*/\r
 \r
@@ -1388,36 +1401,36 @@ static int CheckOnSJIS(uchar *Pos, uchar *Btm)
        {\r
                if(FstOnTwo == YES)\r
                {\r
-                       if((*Pos < 0x40) || (*Pos > 0xFC))      /* 2\83o\83C\83g\96Ú\82Í 0x40\81`0xFC */\r
+                       if((*Pos < 0x40) || (*Pos > 0xFC))      /* 2バイト目は 0x40~0xFC */\r
                                Point = 0;\r
                        FstOnTwo = NO;\r
                }\r
                else if(*Pos >= 0x81)\r
                {\r
-                       if((*Pos < 0xA0) || (*Pos > 0xDF))      /* \94¼\8ap\83J\83i\82Å\82È\82¯\82ê\82Π*/\r
+                       if((*Pos < 0xA0) || (*Pos > 0xDF))      /* 半角カナでなければ */\r
                        {\r
-                               if(*Pos >= 0xEB)                /* 1\83o\83C\83g\96Ú\82Í0xEB\88È\8d~\82Í\82Ù\82Æ\82ñ\82Ç\96³\82¢ */\r
+                               if(*Pos >= 0xEB)                /* 1バイト目は0xEB以降はほとんど無い */\r
                                        Point -= 50;\r
                                FstOnTwo = YES;\r
                        }\r
                }\r
                Pos++;\r
        }\r
-       if(FstOnTwo == YES)             /* \82P\83o\83C\83g\96Ú\82Å\8fI\82í\82Á\82Ä\82¢\82é\82Ì\82Í\82¨\82©\82µ\82¢  */\r
+       if(FstOnTwo == YES)             /* 1バイト目で終わっているのはおかしい  */\r
                Point = 0;\r
 \r
        return(Point);\r
 }\r
 \r
 \r
-/*----- EUC\83R\81[\83h\82Ì\89Â\94\\90«\82ª\82 \82é\82©\83`\83F\83b\83N -------------------------------------\r
+/*----- EUCコードの可能性があるかチェック -------------------------------------\r
 *\r
 *      Parameter\r
-*              uchar *Pos : \95\8e\9a\97ñ\r
-*              uchar *Btm : \95\8e\9a\97ñ\82Ì\96\96\94ö\r
+*              uchar *Pos : 文字列\r
+*              uchar *Btm : 文字列の末尾\r
 *\r
 *      Return Value\r
-*              int \93¾\93_\r
+*              int 得点\r
 *\r
 *      Note\r
 *              High    A1-FE , 8E\r
@@ -1435,227 +1448,413 @@ static int CheckOnEUC(uchar *Pos, uchar *Btm)
        {\r
                if(FstOnTwo == 1)\r
                {\r
-                       if((*Pos < 0xA1) || (*Pos > 0xFE))      /* 2\83o\83C\83g\96Ú\82Í 0xA1\81`0xFE */\r
+                       if((*Pos < 0xA1) || (*Pos > 0xFE))      /* 2バイト目は 0xA1~0xFE */\r
                                Point = 0;\r
                        FstOnTwo = 0;\r
                }\r
-               else if(FstOnTwo == 2)          /* \94¼\8ap\83J\83i */\r
+               else if(FstOnTwo == 2)          /* 半角カナ */\r
                {\r
-                       if((*Pos < 0xA0) || (*Pos > 0xDF))      /* 2\83o\83C\83g\96Ú\82Í 0xA0\81`0xDF */\r
+                       if((*Pos < 0xA0) || (*Pos > 0xDF))      /* 2バイト目は 0xA0~0xDF */\r
                                Point = 0;\r
                        FstOnTwo = 0;\r
                }\r
                else\r
                {\r
-                       if(*Pos == 0x8E)                /* 0x8E??\82Í\94¼\8ap\83J\83i */\r
+                       if(*Pos == 0x8E)                /* 0x8E??は半角カナ */\r
                                FstOnTwo = 2;\r
                        else if((*Pos >= 0xA1) && (*Pos <= 0xFE))\r
                                FstOnTwo = 1;\r
                }\r
                Pos++;\r
        }\r
-       if(FstOnTwo != 0)               /* \82P\83o\83C\83g\96Ú\82Å\8fI\82í\82Á\82Ä\82¢\82é\82Ì\82Í\82¨\82©\82µ\82¢  */\r
+       if(FstOnTwo != 0)               /* 1バイト目で終わっているのはおかしい  */\r
                Point = 0;\r
 \r
        return(Point);\r
 }\r
 \r
 \r
-// UTF-8N\91Î\89\9e \82±\82±\82©\82ç\81«\r
-/*----- UTF-8N\8a¿\8e\9a\83R\81[\83h\82ðSHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------------\r
+// UTF-8対応 ここから↓\r
+/*----- UTF-8漢字コードをSHIFT-JIS漢字コードに変換 ------------------------------\r
 *\r
 *      Parameter\r
-*              CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+*              CODECONVINFO *cInfo : 漢字コード変換情報\r
 *\r
 *      Return Value\r
-*              int \82­\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
+*              int くり返しフラグ (YES/NO)\r
 *\r
 *      Note\r
-*              \82­\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
+*              くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと\r
 *----------------------------------------------------------------------------*/\r
 \r
+// UTF-8対応\r
+// UTF-8からShift_JISへの変換後のバイト列が確定可能な長さを変換後の長さで返す\r
+// バイナリ            UTF-8       戻り値 Shift_JIS\r
+// E3 81 82 E3 81 84   あい     -> 2      82 A0   あ+結合文字の先頭バイトの可能性(い゛等)\r
+// E3 81 82 E3 81      あ+E3 81 -> 0              結合文字の先頭バイトの可能性\r
+// E3 81 82 E3         あ+E3    -> 0              結合文字の先頭バイトの可能性\r
+// E3 81 82            あ       -> 0              結合文字の先頭バイトの可能性\r
+int ConvUTF8NtoSJIS_TruncateToDelimiter(char* pUTF8, int UTF8Length, int* pNewUTF8Length)\r
+{\r
+       int UTF16Length;\r
+       wchar_t* pUTF16;\r
+       int SJISLength;\r
+       int NewSJISLength;\r
+       int NewUTF16Length;\r
+       // UTF-8の場合、不完全な文字は常に変換されない\r
+       // バイナリ            UTF-8       バイナリ      UTF-16 LE\r
+       // E3 81 82 E3 81 84   あい     -> 42 30 44 30   あい\r
+       // E3 81 82 E3 81      あ+E3 81 -> 42 30         あ\r
+       // E3 81 82 E3         あ+E3    -> 42 30         あ\r
+       UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, NULL, 0);\r
+       if(!(pUTF16 = (wchar_t*)malloc(sizeof(wchar_t) * UTF16Length)))\r
+               return -1;\r
+       // Shift_JISへ変換した時に文字数が増減する位置がUnicode結合文字の区切り\r
+       UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, pUTF16, UTF16Length);\r
+       SJISLength = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);\r
+       NewSJISLength = SJISLength;\r
+       while(UTF8Length > 0 && NewSJISLength >= SJISLength)\r
+       {\r
+               UTF8Length--;\r
+               UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, pUTF16, UTF16Length);\r
+               SJISLength = NewSJISLength;\r
+               NewSJISLength = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);\r
+       }\r
+       free(pUTF16);\r
+       // UTF-16 LE変換した時に文字数が増減する位置がUTF-8の区切り\r
+       NewUTF16Length = UTF16Length;\r
+       while(UTF8Length > 0 && NewUTF16Length >= UTF16Length)\r
+       {\r
+               UTF8Length--;\r
+               UTF16Length = NewUTF16Length;\r
+               NewUTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, NULL, 0);\r
+       }\r
+       if(pNewUTF8Length)\r
+       {\r
+               if(UTF16Length > 0)\r
+                       UTF8Length++;\r
+               *pNewUTF8Length = UTF8Length;\r
+       }\r
+       return NewSJISLength;\r
+}\r
+\r
 int ConvUTF8NtoSJIS(CODECONVINFO *cInfo)\r
 {\r
        int Continue;\r
 \r
-       char temp_string[2048];\r
-       int string_length;\r
+//     char temp_string[2048];\r
+//     int string_length;\r
+\r
+       // 大きいサイズに対応\r
+       // 終端のNULLを含むバグを修正\r
+       int SrcLength;\r
+       char* pSrc;\r
+       wchar_t* pUTF16;\r
+       int UTF16Length;\r
 \r
        Continue = NO;\r
 \r
-       // \90\90¬\82³\82ê\82é\92\86\8aÔ\83R\81[\83h\82Ì\83T\83C\83Y\82ð\92²\82×\82é\r
-       string_length = MultiByteToWideChar(\r
-                                               CP_UTF8,                // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
-                                               0,                              // \83t\83\89\83O(0:\82È\82µ)\r
-                                               cInfo->Str,             // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
-                                               -1,                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
-                                               NULL,                   // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
-                                               0                               // \8ai\94[\90æ\83T\83C\83Y\r
-                                       );\r
-\r
-       // \83T\83C\83Y0 or \83o\83b\83t\83@\83T\83C\83Y\82æ\82è\91å\82«\82¢\8fê\8d\87\82Í\r
-       // cInfo->Buf\82Ì\8dÅ\8f\89\82É'\0'\82ð\93ü\82ê\82Ä\81A\r
-       // cInfo->BufSize\82É0\82ð\93ü\82ê\82Ä\95Ô\82·\81B\r
-       if( string_length == 0 ||\r
-               string_length >= 1024 ){\r
+       // 生成される中間コードのサイズを調べる\r
+//     string_length = MultiByteToWideChar(\r
+//                                             CP_UTF8,                // 変換先文字コード\r
+//                                             0,                              // フラグ(0:なし)\r
+//                                             cInfo->Str,             // 変換元文字列\r
+//                                             -1,                             // 変換元文字列バイト数(-1:自動)\r
+//                                             NULL,                   // 変換した文字列の格納先\r
+//                                             0                               // 格納先サイズ\r
+//                                     );\r
+       // 前回の変換不能な残りの文字列を入力の先頭に結合\r
+       SrcLength = cInfo->StrLen + cInfo->EscUTF8Len;\r
+       if(!(pSrc = (char*)malloc(sizeof(char) * (SrcLength + 1))))\r
+       {\r
                *(cInfo->Buf) = '\0';\r
                cInfo->BufSize = 0;\r
-               return(Continue);\r
+               return Continue;\r
        }\r
-\r
-       // \92\86\8aÔ\83R\81[\83h(unicode)\82É\95Ï\8a·\r
-       MultiByteToWideChar(\r
-               CP_UTF8,                                                // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
-               0,                                                              // \83t\83\89\83O(0:\82È\82µ)\r
-               cInfo->Str,                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
-               -1,                                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
-               (unsigned short *)temp_string,  // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
-               1024                                                    // \8ai\94[\90æ\83T\83C\83Y\r
-       );\r
-\r
-       // \90\90¬\82³\82ê\82éUTF-8\83R\81[\83h\82Ì\83T\83C\83Y\82ð\92²\82×\82é\r
-       string_length = WideCharToMultiByte(\r
-                                               CP_ACP,                 // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
-                                               0,                              // \83t\83\89\83O(0:\82È\82µ)\r
-                                               (unsigned short *)temp_string,  // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
-                                               -1,                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
-                                               NULL,                   // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
-                                               0,                              // \8ai\94[\90æ\83T\83C\83Y\r
-                                               NULL,NULL\r
-                                       );\r
-\r
-       // \83T\83C\83Y0 or \8fo\97Í\83o\83b\83t\83@\83T\83C\83Y\82æ\82è\91å\82«\82¢\8fê\8d\87\82Í\81A\r
-       // cInfo->Buf\82Ì\8dÅ\8f\89\82É'\0'\82ð\93ü\82ê\82Ä\81A\r
-       // cInfo->BufSize\82É0\82ð\93ü\82ê\82Ä\95Ô\82·\81B\r
-       if( string_length == 0 ||\r
-               string_length >= cInfo->BufSize ){\r
+       memcpy(pSrc, cInfo->EscUTF8, sizeof(char) * cInfo->EscUTF8Len);\r
+       memcpy(pSrc + cInfo->EscUTF8Len, cInfo->Str, sizeof(char) * cInfo->StrLen);\r
+       *(pSrc + SrcLength) = '\0';\r
+       if(cInfo->EscFlush == NO)\r
+       {\r
+               // バッファに収まらないため変換文字数を半減\r
+               while(SrcLength > 0 && ConvUTF8NtoSJIS_TruncateToDelimiter(pSrc, SrcLength, &SrcLength) > cInfo->BufSize)\r
+               {\r
+                       SrcLength = SrcLength / 2;\r
+               }\r
+       }\r
+       // UTF-8の場合、不完全な文字は常に変換されない\r
+       UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pSrc, SrcLength, NULL, 0);\r
+\r
+       // サイズ0 or バッファサイズより大きい場合は\r
+       // cInfo->Bufの最初に'\0'を入れて、\r
+       // cInfo->BufSizeに0を入れて返す。\r
+//     if( string_length == 0 ||\r
+//             string_length >= 1024 ){\r
+//             *(cInfo->Buf) = '\0';\r
+//             cInfo->BufSize = 0;\r
+//             return(Continue);\r
+//     }\r
+       if(!(pUTF16 = (wchar_t*)malloc(sizeof(wchar_t) * UTF16Length)))\r
+       {\r
+               free(pSrc);\r
                *(cInfo->Buf) = '\0';\r
                cInfo->BufSize = 0;\r
-               return(Continue);\r
+               return Continue;\r
        }\r
 \r
-       // \8fo\97Í\83T\83C\83Y\82ð\90Ý\92è\r
-       cInfo->OutLen = string_length;\r
+       // 中間コード(unicode)に変換\r
+//     MultiByteToWideChar(\r
+//             CP_UTF8,                                                // 変換先文字コード\r
+//             0,                                                              // フラグ(0:なし)\r
+//             cInfo->Str,                                             // 変換元文字列\r
+//             -1,                                                             // 変換元文字列バイト数(-1:自動)\r
+//             (unsigned short *)temp_string,  // 変換した文字列の格納先\r
+//             1024                                                    // 格納先サイズ\r
+//     );\r
+       MultiByteToWideChar(CP_UTF8, 0, pSrc, SrcLength, pUTF16, UTF16Length);\r
+\r
+       // 生成されるUTF-8コードのサイズを調べる\r
+//     string_length = WideCharToMultiByte(\r
+//                                             CP_ACP,                 // 変換先文字コード\r
+//                                             0,                              // フラグ(0:なし)\r
+//                                             (unsigned short *)temp_string,  // 変換元文字列\r
+//                                             -1,                             // 変換元文字列バイト数(-1:自動)\r
+//                                             NULL,                   // 変換した文字列の格納先\r
+//                                             0,                              // 格納先サイズ\r
+//                                             NULL,NULL\r
+//                                     );\r
+\r
+       // サイズ0 or 出力バッファサイズより大きい場合は、\r
+       // cInfo->Bufの最初に'\0'を入れて、\r
+       // cInfo->BufSizeに0を入れて返す。\r
+//     if( string_length == 0 ||\r
+//             string_length >= cInfo->BufSize ){\r
+//             *(cInfo->Buf) = '\0';\r
+//             cInfo->BufSize = 0;\r
+//             return(Continue);\r
+//     }\r
+\r
+       // 出力サイズを設定\r
+//     cInfo->OutLen = string_length;\r
+\r
+       // UTF-8コードに変換\r
+//     WideCharToMultiByte(\r
+//             CP_ACP,                                                 // 変換先文字コード\r
+//             0,                                                              // フラグ(0:なし)\r
+//             (unsigned short *)temp_string,  // 変換元文字列\r
+//             -1,                                                             // 変換元文字列バイト数(-1:自動)\r
+//             cInfo->Buf,                                             // 変換した文字列の格納先(BOM:3bytes)\r
+//             cInfo->BufSize,                                 // 格納先サイズ\r
+//             NULL,NULL\r
+//     );\r
+       cInfo->OutLen = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, cInfo->Buf, cInfo->BufSize, NULL, NULL);\r
+       cInfo->Str += SrcLength - cInfo->EscUTF8Len;\r
+       cInfo->StrLen -= SrcLength - cInfo->EscUTF8Len;\r
+       cInfo->EscUTF8Len = 0;\r
+       if(ConvUTF8NtoSJIS_TruncateToDelimiter(cInfo->Str, cInfo->StrLen, NULL) > 0)\r
+               Continue = YES;\r
+       else\r
+       {\r
+               // 変換不能なため次の入力の先頭に結合\r
+               memcpy(cInfo->EscUTF8, cInfo->Str, sizeof(char) * cInfo->StrLen);\r
+               cInfo->EscUTF8Len = cInfo->StrLen;\r
+               cInfo->Str += cInfo->StrLen;\r
+               cInfo->StrLen = 0;\r
+               cInfo->FlushProc = ConvUTF8NtoSJIS;\r
+               Continue = NO;\r
+       }\r
 \r
-       // UTF-8\83R\81[\83h\82É\95Ï\8a·\r
-       WideCharToMultiByte(\r
-               CP_ACP,                                                 // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
-               0,                                                              // \83t\83\89\83O(0:\82È\82µ)\r
-               (unsigned short *)temp_string,  // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
-               -1,                                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
-               cInfo->Buf,                                             // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ(BOM:3bytes)\r
-               cInfo->BufSize,                                 // \8ai\94[\90æ\83T\83C\83Y\r
-               NULL,NULL\r
-       );\r
+       free(pSrc);\r
+       free(pUTF16);\r
 \r
        return(Continue);\r
 }\r
 \r
-/*----- SHIFT-JIS\8a¿\8e\9a\83R\81[\83h\82ðUTF-8N\8a¿\8e\9a\83R\81[\83h\82É\95Ï\8a· ------------------------------\r
+/*----- SHIFT-JIS漢字コードをUTF-8漢字コードに変換 ------------------------------\r
 *\r
 *      Parameter\r
-*              CODECONVINFO *cInfo : \8a¿\8e\9a\83R\81[\83h\95Ï\8a·\8fî\95ñ\r
+*              CODECONVINFO *cInfo : 漢字コード変換情報\r
 *\r
 *      Return Value\r
-*              int \82­\82è\95Ô\82µ\83t\83\89\83O (YES/NO)\r
+*              int くり返しフラグ (YES/NO)\r
 *\r
 *      Note\r
-*              \82­\82è\95Ô\82µ\83t\83\89\83O\82ªYES\82Ì\8e\9e\82Í\81AcInfo\82Ì\93à\97e\82ð\95Ï\82¦\82¸\82É\82à\82¤\88ê\93x\8cÄ\82Ô\82±\82Æ\r
+*              くり返しフラグがYESの時は、cInfoの内容を変えずにもう一度呼ぶこと\r
 *----------------------------------------------------------------------------*/\r
 int ConvSJIStoUTF8N(CODECONVINFO *cInfo)\r
 {\r
        int Continue;\r
 \r
-       char temp_string[2048];\r
+//     char temp_string[2048];\r
        int string_length;\r
 \r
+       // 大きいサイズに対応\r
+       // 終端のNULLを含むバグを修正\r
+       int SrcLength;\r
+       char* pSrc;\r
+       wchar_t* pUTF16;\r
+       int UTF16Length;\r
+       int Count;\r
+\r
        Continue = NO;\r
 \r
-       // \90\90¬\82³\82ê\82é\92\86\8aÔ\83R\81[\83h\82Ì\83T\83C\83Y\82ð\92²\82×\82é\r
-       string_length = MultiByteToWideChar(\r
-                                               CP_ACP,                 // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
-                                               0,                              // \83t\83\89\83O(0:\82È\82µ)\r
-                                               cInfo->Str,             // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
-                                               -1,                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
-                                               NULL,                   // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
-                                               0                               // \8ai\94[\90æ\83T\83C\83Y\r
-                                       );\r
-\r
-       // \83T\83C\83Y0 or \83o\83b\83t\83@\83T\83C\83Y\82æ\82è\91å\82«\82¢\8fê\8d\87\82Í\81A\r
-       // cInfo->Buf\82Ì\8dÅ\8f\89\82É'\0'\82ð\93ü\82ê\82Ä\81A\r
-       // cInfo->BufSize\82É0\82ð\93ü\82ê\82Ä\95Ô\82·\81B\r
-       if( string_length == 0 ||\r
-               string_length >= 1024 ){\r
+       // 生成される中間コードのサイズを調べる\r
+//     string_length = MultiByteToWideChar(\r
+//                                             CP_ACP,                 // 変換先文字コード\r
+//                                             0,                              // フラグ(0:なし)\r
+//                                             cInfo->Str,             // 変換元文字列\r
+//                                             -1,                             // 変換元文字列バイト数(-1:自動)\r
+//                                             NULL,                   // 変換した文字列の格納先\r
+//                                             0                               // 格納先サイズ\r
+//                                     );\r
+       // 前回の変換不能な残りの文字列を入力の先頭に結合\r
+       SrcLength = cInfo->StrLen + cInfo->EscUTF8Len;\r
+       if(!(pSrc = (char*)malloc(sizeof(char) * (SrcLength + 1))))\r
+       {\r
                *(cInfo->Buf) = '\0';\r
                cInfo->BufSize = 0;\r
-               return(Continue);\r
+               return Continue;\r
        }\r
-\r
-       // \92\86\8aÔ\83R\81[\83h(unicode)\82É\95Ï\8a·\r
-       MultiByteToWideChar(\r
-               CP_ACP,                                                 // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
-               0,                                                              // \83t\83\89\83O(0:\82È\82µ)\r
-               cInfo->Str,                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
-               -1,                                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
-               (unsigned short *)temp_string,  // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
-               1024                                                    // \8ai\94[\90æ\83T\83C\83Y\r
-       );\r
-\r
-       // \90\90¬\82³\82ê\82éUTF-8\83R\81[\83h\82Ì\83T\83C\83Y\82ð\92²\82×\82é\r
-       string_length = WideCharToMultiByte(\r
-                                               CP_UTF8,                // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
-                                               0,                              // \83t\83\89\83O(0:\82È\82µ)\r
-                                               (unsigned short *)temp_string,  // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
-                                               -1,                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
-                                               NULL,                   // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ\r
-                                               0,                              // \8ai\94[\90æ\83T\83C\83Y\r
-                                               NULL,NULL\r
-                                       );\r
-\r
-       // \83T\83C\83Y0 or \8fo\97Í\83o\83b\83t\83@\83T\83C\83Y\82æ\82è\91å\82«\82¢\8fê\8d\87\82Í\81A\r
-       // cInfo->Buf\82Ì\8dÅ\8f\89\82É'\0'\82ð\93ü\82ê\82Ä\81A\r
-       // cInfo->BufSize\82É0\82ð\93ü\82ê\82Ä\95Ô\82·\81B\r
-       if( string_length == 0 ||\r
-               string_length >= cInfo->BufSize ){\r
+       memcpy(pSrc, cInfo->EscUTF8, sizeof(char) * cInfo->EscUTF8Len);\r
+       memcpy(pSrc + cInfo->EscUTF8Len, cInfo->Str, sizeof(char) * cInfo->StrLen);\r
+       *(pSrc + SrcLength) = '\0';\r
+       if(cInfo->EscFlush == NO)\r
+       {\r
+               // Shift_JISの場合、不完全な文字でも変換されることがあるため、末尾の不完全な部分を削る\r
+               Count = 0;\r
+               while(Count < SrcLength)\r
+               {\r
+                       if(((unsigned char)*(pSrc + Count) >= 0x81 && (unsigned char)*(pSrc + Count) <= 0x9f) || (unsigned char)*(pSrc + Count) >= 0xe0)\r
+                       {\r
+                               if((unsigned char)*(pSrc + Count + 1) >= 0x40)\r
+                                       Count += 2;\r
+                               else\r
+                               {\r
+                                       if(Count + 2 > SrcLength)\r
+                                               break;\r
+                                       Count += 1;\r
+                               }\r
+                       }\r
+                       else\r
+                               Count += 1;\r
+               }\r
+               SrcLength = Count;\r
+       }\r
+       UTF16Length = MultiByteToWideChar(CP_ACP, 0, pSrc, SrcLength, NULL, 0);\r
+\r
+       // サイズ0 or バッファサイズより大きい場合は、\r
+       // cInfo->Bufの最初に'\0'を入れて、\r
+       // cInfo->BufSizeに0を入れて返す。\r
+//     if( string_length == 0 ||\r
+//             string_length >= 1024 ){\r
+//             *(cInfo->Buf) = '\0';\r
+//             cInfo->BufSize = 0;\r
+//             return(Continue);\r
+//     }\r
+       if(!(pUTF16 = (wchar_t*)malloc(sizeof(wchar_t) * UTF16Length)))\r
+       {\r
+               free(pSrc);\r
                *(cInfo->Buf) = '\0';\r
                cInfo->BufSize = 0;\r
-               return(Continue);\r
+               return Continue;\r
        }\r
 \r
-       // \8fo\97Í\83T\83C\83Y\82ð\90Ý\92è\r
-       cInfo->OutLen = string_length;\r
+       // 中間コード(unicode)に変換\r
+//     MultiByteToWideChar(\r
+//             CP_ACP,                                                 // 変換先文字コード\r
+//             0,                                                              // フラグ(0:なし)\r
+//             cInfo->Str,                                             // 変換元文字列\r
+//             -1,                                                             // 変換元文字列バイト数(-1:自動)\r
+//             (unsigned short *)temp_string,  // 変換した文字列の格納先\r
+//             1024                                                    // 格納先サイズ\r
+//     );\r
+       MultiByteToWideChar(CP_ACP, 0, pSrc, SrcLength, pUTF16, UTF16Length);\r
+\r
+       // 生成されるUTF-8コードのサイズを調べる\r
+//     string_length = WideCharToMultiByte(\r
+//                                             CP_UTF8,                // 変換先文字コード\r
+//                                             0,                              // フラグ(0:なし)\r
+//                                             (unsigned short *)temp_string,  // 変換元文字列\r
+//                                             -1,                             // 変換元文字列バイト数(-1:自動)\r
+//                                             NULL,                   // 変換した文字列の格納先\r
+//                                             0,                              // 格納先サイズ\r
+//                                             NULL,NULL\r
+//                                     );\r
+       string_length = WideCharToMultiByte(CP_UTF8, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);\r
+\r
+       // サイズ0 or 出力バッファサイズより大きい場合は、\r
+       // cInfo->Bufの最初に'\0'を入れて、\r
+       // cInfo->BufSizeに0を入れて返す。\r
+//     if( string_length == 0 ||\r
+//             string_length >= cInfo->BufSize ){\r
+//             *(cInfo->Buf) = '\0';\r
+//             cInfo->BufSize = 0;\r
+//             return(Continue);\r
+//     }\r
+\r
+       // 出力サイズを設定\r
+//     cInfo->OutLen = string_length;\r
 \r
        /*\r
-       // \81«\95t\82¯\82¿\82á\82¾\82ß \83R\83}\83\93\83h\82É\82à\92Ç\89Á\82³\82ê\82Ä\82µ\82Ü\82¤\r
-       // \8fo\97Í\95\8e\9a\97ñ\82Ì\90æ\93ª\82ÉBOM(byte order mark)\82ð\82Â\82¯\82é\r
+       // ↓付けちゃだめ コマンドにも追加されてしまう\r
+       // 出力文字列の先頭にBOM(byte order mark)をつける\r
        *(cInfo->Buf) = (char)0xef;\r
        *(cInfo->Buf+1) = (char)0xbb;\r
        *(cInfo->Buf+2) = (char)0xbf;\r
        */\r
 \r
-       // UTF-8\83R\81[\83h\82É\95Ï\8a·\r
-       WideCharToMultiByte(\r
-               CP_UTF8,                                                // \95Ï\8a·\90æ\95\8e\9a\83R\81[\83h\r
-               0,                                                              // \83t\83\89\83O(0:\82È\82µ)\r
-               (unsigned short *)temp_string,  // \95Ï\8a·\8c³\95\8e\9a\97ñ\r
-               -1,                                                             // \95Ï\8a·\8c³\95\8e\9a\97ñ\83o\83C\83g\90\94(-1:\8e©\93®)\r
-               cInfo->Buf,                                     // \95Ï\8a·\82µ\82½\95\8e\9a\97ñ\82Ì\8ai\94[\90æ(BOM:3bytes)\r
-               cInfo->BufSize,                                 // \8ai\94[\90æ\83T\83C\83Y\r
-               NULL,NULL\r
-       );\r
+       // UTF-8コードに変換\r
+//     WideCharToMultiByte(\r
+//             CP_UTF8,                                                // 変換先文字コード\r
+//             0,                                                              // フラグ(0:なし)\r
+//             (unsigned short *)temp_string,  // 変換元文字列\r
+//             -1,                                                             // 変換元文字列バイト数(-1:自動)\r
+//             cInfo->Buf,                                     // 変換した文字列の格納先(BOM:3bytes)\r
+//             cInfo->BufSize,                                 // 格納先サイズ\r
+//             NULL,NULL\r
+//     );\r
+       cInfo->OutLen = WideCharToMultiByte(CP_UTF8, 0, pUTF16, UTF16Length, cInfo->Buf, cInfo->BufSize, NULL, NULL);\r
+       // バッファに収まらないため変換文字数を半減\r
+       while(cInfo->OutLen == 0 && UTF16Length > 0)\r
+       {\r
+               UTF16Length = UTF16Length / 2;\r
+               cInfo->OutLen = WideCharToMultiByte(CP_UTF8, 0, pUTF16, UTF16Length, cInfo->Buf, cInfo->BufSize, NULL, NULL);\r
+       }\r
+       // 変換された元の文字列での文字数を取得\r
+       Count = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);\r
+       // 変換可能な残りの文字数を取得\r
+       UTF16Length = MultiByteToWideChar(CP_ACP, 0, pSrc + Count, SrcLength - Count, NULL, 0);\r
+       cInfo->Str += Count - cInfo->EscUTF8Len;\r
+       cInfo->StrLen -= Count - cInfo->EscUTF8Len;\r
+       cInfo->EscUTF8Len = 0;\r
+       if(UTF16Length > 0)\r
+               Continue = YES;\r
+       else\r
+       {\r
+               // 変換不能なため次の入力の先頭に結合\r
+               memcpy(cInfo->EscUTF8, cInfo->Str, sizeof(char) * cInfo->StrLen);\r
+               cInfo->EscUTF8Len = cInfo->StrLen;\r
+               cInfo->Str += cInfo->StrLen;\r
+               cInfo->StrLen = 0;\r
+               cInfo->FlushProc = ConvSJIStoUTF8N;\r
+               Continue = NO;\r
+       }\r
+\r
+       free(pSrc);\r
+       free(pUTF16);\r
 \r
        return(Continue);\r
 }\r
-// UTF-8N\91Î\89\9e \82±\82±\82Ü\82Å\81ª\r
+// UTF-8対応 ここまで↑\r
 \r
 \r
-/*----- IBM\8ag\92£\8a¿\8e\9a\82ðNEC\91I\92èIBM\8ag\92£\8a¿\8e\9a\93\99\82É\95Ï\8a· -------------------------------\r
+/*----- IBM拡張漢字をNEC選定IBM拡張漢字等に変換 -------------------------------\r
 *\r
 *      Parameter\r
-*              code    \8a¿\8e\9a\83R\81[\83h\r
+*              code    漢字コード\r
 *\r
 *      Return Value\r
-*              int \8a¿\8e\9a\83R\81[\83h\r
+*              int 漢字コード\r
 *----------------------------------------------------------------------------*/\r
 static int ConvertIBMExtendedChar(int code)\r
 {\r