OSDN Git Service

Fix bugs of simultaneous connection.
[ffftp/ffftp.git] / misc.c
diff --git a/misc.c b/misc.c
index 9cce7dd..67ccd91 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -1,6 +1,6 @@
-/*=============================================================================\r
+/*=============================================================================\r
 *\r
-*                                                      \82»\82Ì\91¼\82Ì\94Ä\97p\83T\83u\83\8b\81[\83`\83\93\r
+*                                                      その他の汎用サブルーチン\r
 *\r
 ===============================================================================\r
 / Copyright (C) 1997-2007 Sota. All rights reserved.\r
@@ -33,7 +33,9 @@
 #include <stdarg.h>\r
 #include <string.h>\r
 #include <mbstring.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
+#include <winsock2.h>\r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 #include <shlobj.h>\r
 #include <htmlhelp.h>\r
 #include "helpid.h"\r
 \r
+// UTF-8対応\r
+#undef __MBSWRAPPER_H__\r
+#include "mbswrapper.h"\r
 \r
 \r
-/*===== \93ü\97Í\83_\83C\83A\83\8d\83O\83f\81[\83^\82Ì\83X\83g\83\89\83N\83`\83\83 =====*/\r
+\r
+/*===== 入力ダイアログデータのストラクチャ =====*/\r
 \r
 typedef struct {\r
-       char Title[80];                 /* \83_\83C\83A\83\8d\83O\82Ì\83^\83C\83g\83\8b */\r
-       char Str[FMAX_PATH+1];  /* \83f\83t\83H\83\8b\83g\95\8e\9a\97ñ\81^\93ü\97Í\82³\82ê\82½\95\8e\9a\97ñ(Output) */\r
-       int MaxLen;                             /* \95\8e\9a\97ñ\82Ì\8dÅ\92· */\r
-       int Anonymous;                  /* Anonymous\83t\83\89\83O(Output) */\r
+       char Title[80];                 /* ダイアログのタイトル */\r
+       char Str[FMAX_PATH+1];  /* デフォルト文字列/入力された文字列(Output) */\r
+       int MaxLen;                             /* æ\96\87å­\97å\88\97ã\81®æ\9c\80é\95· */\r
+       int Anonymous;                  /* Anonymousフラグ(Output) */\r
 } DIALOGDATA;\r
 \r
-/*===== \83v\83\8d\83g\83^\83C\83v =====*/\r
+/*===== プロトタイプ =====*/\r
 \r
-static BOOL CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+// 64ビット対応\r
+//static BOOL CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+static INT_PTR CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
 \r
-/*===== \8aO\95\94\8eQ\8fÆ =====*/\r
+/*===== 外部参照 =====*/\r
 \r
 extern HWND hHelpWin;\r
 \r
-/*===== \83\8d\81[\83J\83\8b\82È\83\8f\81[\83N =====*/\r
+/*===== ローカルなワーク =====*/\r
 \r
-static DIALOGDATA *DialogData;         /* \93ü\97Í\83_\83C\83A\83\8d\83O\83f\81[\83^ */\r
+static DIALOGDATA *DialogData;         /* 入力ダイアログデータ */\r
 static int HelpPage;\r
 \r
 \r
 \r
-/*----- \93ü\97Í\83_\83C\83A\83\8d\83O\82ð\95\\8e¦ --------------------------------------------------\r
+/*----- 入力ダイアログを表示 --------------------------------------------------\r
 *\r
 *      Parameter\r
-*              int Res : \83_\83C\83A\83\8d\83O\83{\83b\83N\83X\82ÌID\r
-*              HWND hWnd : \90e\83E\83C\83\93\83h\83E\82Ì\83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
-*              char *Title : \83E\83C\83\93\83h\83E\83^\83C\83g\83\8b (NULL=\90Ý\92è\82µ\82È\82¢)\r
-*              char *Buf : \83G\83f\83B\83b\83g\83{\83b\83N\83X\82Ì\8f\89\8aú\95\8e\9a\97ñ\81^\93ü\97Í\95\8e\9a\97ñ\82ð\95Ô\82·\83o\83b\83t\83@\r
-*              int Max : \83o\83b\83t\83@\82Ì\83T\83C\83Y (FMAX_PATH+1\88È\89º\82Å\82 \82é\82±\82Æ)\r
-*              int *Flg : \83t\83\89\83O\82Ì\8f\89\8aú\92l\81^\83t\83\89\83O\82ð\95Ô\82·\83\8f\81[\83N\r
-*              int Help : \83w\83\8b\83v\82Ì\83R\83\93\83e\83L\83X\83g\94Ô\8d\86\r
+*              int Res : ダイアログボックスのID\r
+*              HWND hWnd : 親ウインドウのウインドウハンドル\r
+*              char *Title : ウインドウタイトル (NULL=設定しない)\r
+*              char *Buf : エディットボックスの初期文字列/入力文字列を返すバッファ\r
+*              int Max : バッファのサイズ (FMAX_PATH+1以下であること)\r
+*              int *Flg : フラグの初期値/フラグを返すワーク\r
+*              int Help : ヘルプのコンテキスト番号\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X (YES/NO=\8eæ\82è\8fÁ\82µ)\r
+*              int ステータス (YES/NO=取り消し)\r
 *\r
 *      Note\r
-*              \83_\83C\83A\83\8d\83O\82Í\82P\8cÂ\82ÌEditBox\82Æ\82P\8cÂ\82ÌButton\82ð\8e\9d\82Â\82à\82Ì\82ð\8eg\82¤\r
+*              ダイアログは1個のEditBoxと1個のButtonを持つものを使う\r
 *----------------------------------------------------------------------------*/\r
 \r
 int InputDialogBox(int Res, HWND hWnd, char *Title, char *Buf, int Max, int *Flg, int Help)\r
@@ -116,19 +124,21 @@ int InputDialogBox(int Res, HWND hWnd, char *Title, char *Buf, int Max, int *Flg
 }\r
 \r
 \r
-/*----- \93ü\97Í\83_\83C\83A\83\8d\83O\82Ì\83R\81[\83\8b\83o\83b\83N ------------------------------------------\r
+/*----- 入力ダイアログのコールバック ------------------------------------------\r
 *\r
 *      Parameter\r
-*              HWND hDlg : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
-*              UINT message : \83\81\83b\83Z\81[\83W\94Ô\8d\86\r
-*              WPARAM wParam : \83\81\83b\83Z\81[\83W\82Ì WPARAM \88ø\90\94\r
-*              LPARAM lParam : \83\81\83b\83Z\81[\83W\82Ì LPARAM \88ø\90\94\r
+*              HWND hDlg : ウインドウハンドル\r
+*              UINT message : メッセージ番号\r
+*              WPARAM wParam : メッセージの WPARAM 引数\r
+*              LPARAM lParam : メッセージの LPARAM 引数\r
 *\r
 *      Return Value\r
 *              BOOL TRUE/FALSE\r
 *----------------------------------------------------------------------------*/\r
 \r
-static BOOL CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+// 64ビット対応\r
+//static BOOL CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+static INT_PTR CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
 {\r
        char Tmp[FMAX_PATH+1];\r
 \r
@@ -170,19 +180,21 @@ static BOOL CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam
 }\r
 \r
 \r
-/*----- \81m\8eÀ\8ds\81n\82Æ\81m\8eæ\8fÁ\81n\82¾\82¯\82Ì\83_\83C\83A\83\8d\83O\82Ì\8b¤\92Ê\83R\81[\83\8b\83o\83b\83N\8aÖ\90\94 --------------\r
+/*----- [実行]と[取消]だけのダイアログの共通コールバック関数 --------------\r
 *\r
 *      Parameter\r
-*              HWND hDlg : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
-*              UINT message : \83\81\83b\83Z\81[\83W\94Ô\8d\86\r
-*              WPARAM wParam : \83\81\83b\83Z\81[\83W\82Ì WPARAM \88ø\90\94\r
-*              LPARAM lParam : \83\81\83b\83Z\81[\83W\82Ì LPARAM \88ø\90\94\r
+*              HWND hDlg : ウインドウハンドル\r
+*              UINT message : メッセージ番号\r
+*              WPARAM wParam : メッセージの WPARAM 引数\r
+*              LPARAM lParam : メッセージの LPARAM 引数\r
 *\r
 *      Return Value\r
 *              BOOL TRUE/FALSE\r
 *----------------------------------------------------------------------------*/\r
 \r
-BOOL CALLBACK ExeEscDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+// 64ビット対応\r
+//BOOL CALLBACK ExeEscDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+INT_PTR CALLBACK ExeEscDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
 {\r
        switch (message)\r
        {\r
@@ -206,19 +218,21 @@ BOOL CALLBACK ExeEscDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lP
 }\r
 \r
 \r
-/*----- \81m\8eÀ\8ds\81n\82Æ\81m\8eæ\8fÁ\81n\82¾\82¯\82Ì\83_\83C\83A\83\8d\83O\82Ì\8b¤\92Ê\83R\81[\83\8b\83o\83b\83N\8aÖ\90\94(\83e\83L\83X\83g\95\\8e¦\82Â\82«)\r
+/*----- [実行]と[取消]だけのダイアログの共通コールバック関数(テキスト表示つき)\r
 *\r
 *      Parameter\r
-*              HWND hDlg : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
-*              UINT message : \83\81\83b\83Z\81[\83W\94Ô\8d\86\r
-*              WPARAM wParam : \83\81\83b\83Z\81[\83W\82Ì WPARAM \88ø\90\94\r
-*              LPARAM lParam : \83\81\83b\83Z\81[\83W\82Ì LPARAM \88ø\90\94\r
+*              HWND hDlg : ウインドウハンドル\r
+*              UINT message : メッセージ番号\r
+*              WPARAM wParam : メッセージの WPARAM 引数\r
+*              LPARAM lParam : メッセージの LPARAM 引数\r
 *\r
 *      Return Value\r
 *              BOOL TRUE/FALSE\r
 *----------------------------------------------------------------------------*/\r
 \r
-BOOL CALLBACK ExeEscTextDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+// 64ビット対応\r
+//BOOL CALLBACK ExeEscTextDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+INT_PTR CALLBACK ExeEscTextDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
 {\r
        switch (message)\r
        {\r
@@ -243,16 +257,16 @@ BOOL CALLBACK ExeEscTextDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARA
 }\r
 \r
 \r
-/*----- \95\8e\9a\97ñ\82Ì\8dÅ\8cã\82É "\" \82ð\95t\82¯\82é -------------------------------------------\r
+/*----- 文字列の最後に "\" を付ける -------------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Str : \95\8e\9a\97ñ\r
+*              char *Str : 文字列\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Note\r
-*              \83I\83\8a\83W\83i\83\8b\82Ì\95\8e\9a\97ñ char *Str \82ª\95Ï\8dX\82³\82ê\82Ü\82·\81B\r
+*              オリジナルの文字列 char *Str が変更されます。\r
 *----------------------------------------------------------------------------*/\r
 \r
 void SetYenTail(char *Str)\r
@@ -264,16 +278,16 @@ void SetYenTail(char *Str)
 }\r
 \r
 \r
-/*----- \95\8e\9a\97ñ\82Ì\8dÅ\8cã\82Ì "\" \82ð\8eæ\82è\8f\9c\82­ -----------------------------------------\r
+/*----- 文字列の最後の "\" を取り除く -----------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Str : \95\8e\9a\97ñ\r
+*              char *Str : 文字列\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Note\r
-*              \83I\83\8a\83W\83i\83\8b\82Ì\95\8e\9a\97ñ char *Str \82ª\95Ï\8dX\82³\82ê\82Ü\82·\81B\r
+*              オリジナルの文字列 char *Str が変更されます。\r
 *----------------------------------------------------------------------------*/\r
 \r
 void RemoveYenTail(char *Str)\r
@@ -290,20 +304,27 @@ void RemoveYenTail(char *Str)
 }\r
 \r
 \r
-/*----- \95\8e\9a\97ñ\82Ì\8dÅ\8cã\82É "/" \82ð\95t\82¯\82é -------------------------------------------\r
+/*----- 文字列の最後に "/" を付ける -------------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Str : \95\8e\9a\97ñ\r
+*              char *Str : 文字列\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Note\r
-*              \83I\83\8a\83W\83i\83\8b\82Ì\95\8e\9a\97ñ char *Str \82ª\95Ï\8dX\82³\82ê\82Ü\82·\81B\r
+*              オリジナルの文字列 char *Str が変更されます。\r
 *----------------------------------------------------------------------------*/\r
 \r
 void SetSlashTail(char *Str)\r
 {\r
+#if defined(HAVE_TANDEM)\r
+    /* Tandem では / の代わりに . を追加 */\r
+       if(AskHostType() == HTYPE_TANDEM) {\r
+               if(_mbscmp(_mbsninc(Str, _mbslen(Str) - 1), ".") != 0)\r
+                       strcat(Str, ".");\r
+       } else\r
+#endif\r
        if(_mbscmp(_mbsninc(Str, _mbslen(Str) - 1), "/") != 0)\r
                strcat(Str, "/");\r
 \r
@@ -311,16 +332,16 @@ void SetSlashTail(char *Str)
 }\r
 \r
 \r
-/*----- \95\8e\9a\97ñ\82©\82ç\89ü\8ds\83R\81[\83h\82ð\8eæ\82è\8f\9c\82­ ----------------------------------------\r
+/*----- 文字列から改行コードを取り除く ----------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Str : \95\8e\9a\97ñ\r
+*              char *Str : 文字列\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Note\r
-*              \83I\83\8a\83W\83i\83\8b\82Ì\95\8e\9a\97ñ char *Str \82ª\95Ï\8dX\82³\82ê\82Ü\82·\81B\r
+*              オリジナルの文字列 char *Str が変更されます。\r
 *----------------------------------------------------------------------------*/\r
 \r
 void RemoveReturnCode(char *Str)\r
@@ -335,36 +356,42 @@ void RemoveReturnCode(char *Str)
 }\r
 \r
 \r
-/*----- \95\8e\9a\97ñ\93à\82Ì\93Á\92è\82Ì\95\8e\9a\82ð\91S\82Ä\92u\82«\8a·\82¦\82é ----------------------------------\r
+/*----- 文字列内の特定の文字を全て置き換える ----------------------------------\r
 *\r
 *      Parameter\r
-*              char *Str : \95\8e\9a\97ñ\r
-*              char Src : \8c\9f\8dõ\95\8e\9a\r
-*              char Dst : \92u\8a·\95\8e\9a\r
+*              char *Str : 文字列\r
+*              char Src : 検索文字\r
+*              char Dst : 置換文字\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void ReplaceAll(char *Str, char Src, char Dst)\r
 {\r
        char *Pos;\r
 \r
+/* Tandem ではノード名の変換を行わない */\r
+/* 最初の1文字が \ でもそのままにする */\r
+#if defined(HAVE_TANDEM)\r
+       if (AskRealHostType() == HTYPE_TANDEM && strlen(Str) > 0)\r
+               Str++;\r
+#endif\r
        while((Pos = _mbschr(Str, Src)) != NULL)\r
                *Pos = Dst;\r
        return;\r
 }\r
 \r
 \r
-/*----- \90\94\8e\9a\82à\82µ\82­\82Í\93Á\92è\82Ì\82P\95\8e\9a\82©\83`\83F\83b\83N ------------------------------------\r
+/*----- 数字もしくは特定の1文字かチェック ------------------------------------\r
 *\r
 *      Parameter\r
-*              int Ch : \83`\83F\83b\83N\82·\82é\95\8e\9a\r
-*              int Sym : \8bL\8d\86\r
+*              int Ch : チェックする文字\r
+*              int Sym : 記号\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X\r
-*                      0=\90\94\8e\9a\82Å\82à\93Á\92è\82Ì\8bL\8d\86\82Å\82à\82È\82¢\r
+*              int ステータス\r
+*                      0=数字でも特定の記号でもない\r
 *----------------------------------------------------------------------------*/\r
 \r
 int IsDigitSym(int Ch, int Sym)\r
@@ -380,14 +407,14 @@ int IsDigitSym(int Ch, int Sym)
 }\r
 \r
 \r
-/*----- \95\8e\9a\97ñ\82ª\91S\82Ä\93¯\82\95\8e\9a\82©\83`\83F\83b\83N ----------------------------------------\r
+/*----- 文字列が全て同じ文字かチェック ----------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Str : \95\8e\9a\97ñ\r
-*              int Ch : \95\8e\9a\r
+*              char *Str : 文字列\r
+*              int Ch : 文字\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X\r
+*              int ステータス\r
 *                      YES/NO\r
 *----------------------------------------------------------------------------*/\r
 \r
@@ -409,13 +436,13 @@ int StrAllSameChar(char *Str, char Ch)
 }\r
 \r
 \r
-/*----- \95\8e\9a\97ñ\82Ì\96\96\94ö\82Ì\83X\83y\81[\83X\82ð\8dí\8f\9c ------------------------------------------\r
+/*----- 文字列の末尾のスペースを削除 ------------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Str : \95\8e\9a\97ñ\r
+*              char *Str : 文字列\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void RemoveTailingSpaces(char *Str)\r
@@ -433,15 +460,15 @@ void RemoveTailingSpaces(char *Str)
 }\r
 \r
 \r
-/*----- \91å\95\8e\9a\81^\8f¬\95\8e\9a\82ð\8bæ\95Ê\82µ\82È\82¢strstr --------------------------------------\r
+/*----- 大文字/小文字を区別しないstrstr --------------------------------------\r
 *\r
 *      Parameter\r
-*              char *s1 : \95\8e\9a\97ñ\82P\r
-*              char *s2 : \95\8e\9a\97ñ\82Q\r
+*              char *s1 : 文字列1\r
+*              char *s2 : 文字列2\r
 *\r
 *      Return Value\r
-*              char *\95\8e\9a\97ñ\82P\92\86\82Å\95\8e\9a\97ñ\82Q\82ª\8c©\82Â\82©\82Á\82½\88Ê\92u\r
-*                      NULL=\8c©\82Â\82©\82ç\82È\82©\82Á\82½\r
+*              char *文字列1中で文字列2が見つかった位置\r
+*                      NULL=見つからなかった\r
 *----------------------------------------------------------------------------*/\r
 \r
 char *stristr(char *s1, char *s2)\r
@@ -463,14 +490,14 @@ char *stristr(char *s1, char *s2)
 }\r
 \r
 \r
-/*----- \95\8e\9a\97ñ\92\86\82Ì\83X\83y\81[\83X\82Å\8bæ\90Ø\82ç\82ê\82½\8e\9f\82Ì\83t\83B\81[\83\8b\83h\82ð\95Ô\82· --------------------\r
+/*----- 文字列中のスペースで区切られた次のフィールドを返す --------------------\r
 *\r
 *      Parameter\r
-*              char *Str : \95\8e\9a\97ñ\r
+*              char *Str : 文字列\r
 *\r
 *      Return Value\r
-*              char *\8e\9f\82Ì\83t\83B\81[\83\8b\83h\r
-*                      NULL=\8c©\82Â\82©\82ç\82È\82©\82Á\82½\r
+*              char *次のフィールド\r
+*                      NULL=見つからなかった\r
 *----------------------------------------------------------------------------*/\r
 \r
 char *GetNextField(char *Str)\r
@@ -491,16 +518,16 @@ char *GetNextField(char *Str)
 }\r
 \r
 \r
-/*----- \8c»\8dÝ\82Ì\83t\83B\81[\83\8b\83h\82Ì\95\8e\9a\97ñ\82ð\83R\83s\81[\82·\82é ----------------------------------\r
+/*----- 現在のフィールドの文字列をコピーする ----------------------------------\r
 *\r
 *      Parameter\r
-*              char *Str : \95\8e\9a\97ñ\r
-*              char *Buf : \83R\83s\81[\90æ\r
-*              int Max : \8dÅ\91å\95\8e\9a\90\94\r
+*              char *Str : 文字列\r
+*              char *Buf : コピー先\r
+*              int Max : 最大文字数\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X\r
-*                      SUCCESS/FAIL=\92·\82³\82ª\92·\82·\82¬\82é\r
+*              int ステータス\r
+*                      FFFTP_SUCCESS/FFFTP_FAIL=長さが長すぎる\r
 *----------------------------------------------------------------------------*/\r
 \r
 int GetOneField(char *Str, char *Buf, int Max)\r
@@ -508,13 +535,13 @@ int GetOneField(char *Str, char *Buf, int Max)
        int Sts;\r
        char *Pos;\r
 \r
-       Sts = FAIL;\r
+       Sts = FFFTP_FAIL;\r
        if((Pos = strchr(Str, ' ')) == NULL)\r
        {\r
                if((int)strlen(Str) <= Max)\r
                {\r
                        strcpy(Buf, Str);\r
-                       Sts = SUCCESS;\r
+                       Sts = FFFTP_SUCCESS;\r
                }\r
        }\r
        else\r
@@ -523,20 +550,20 @@ int GetOneField(char *Str, char *Buf, int Max)
                {\r
                        strncpy(Buf, Str, Pos - Str);\r
                        *(Buf + (Pos - Str)) = NUL;\r
-                       Sts = SUCCESS;\r
+                       Sts = FFFTP_SUCCESS;\r
                }\r
        }\r
        return(Sts);\r
 }\r
 \r
 \r
-/*----- \83J\83\93\83}\82ð\8eæ\82è\8f\9c\82­ ------------------------------------------------------\r
+/*----- カンマを取り除く ------------------------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Str : \95\8e\9a\97ñ\r
+*              char *Str : 文字列\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void RemoveComma(char *Str)\r
@@ -558,16 +585,16 @@ void RemoveComma(char *Str)
 }\r
 \r
 \r
-/*----- \83p\83X\96¼\82Ì\92\86\82Ì\83t\83@\83C\83\8b\96¼\82Ì\90æ\93ª\82ð\95Ô\82· ------------------------------------\r
+/*----- パス名の中のファイル名の先頭を返す ------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Path : \83p\83X\96¼\r
+*              char *Path : パス名\r
 *\r
 *      Return Value\r
-*              char *\83t\83@\83C\83\8b\96¼\82Ì\90æ\93ª\r
+*              char *ファイル名の先頭\r
 *\r
 *      Note\r
-*              \83f\83B\83\8c\83N\83g\83\8a\82Ì\8bæ\90Ø\82è\8bL\8d\86\82Í "\" \82Æ "/" \82Ì\97¼\95û\82ª\97L\8cø\r
+*              ディレクトリの区切り記号は "\" と "/" の両方が有効\r
 *----------------------------------------------------------------------------*/\r
 \r
 char *GetFileName(char *Path)\r
@@ -583,17 +610,22 @@ char *GetFileName(char *Path)
        if((Pos = _mbsrchr(Path, '/')) != NULL)\r
                Path = Pos + 1;\r
 \r
+#if defined(HAVE_TANDEM)\r
+       /* Tandem は . がデリミッタとなる */\r
+       if((AskHostType() == HTYPE_TANDEM) && ((Pos = _mbsrchr(Path, '.')) != NULL))\r
+               Path = Pos + 1;\r
+#endif\r
        return(Path);\r
 }\r
 \r
 \r
-/*----- \83c\81[\83\8b\82Ì\95\\8e¦\96¼\82ð\95Ô\82· --------------------------------------------------\r
+/*----- ツールの表示名を返す --------------------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Path : \83p\83X\96¼\r
+*              char *Path : パス名\r
 *\r
 *      Return Value\r
-*              char * : \95\\8e¦\96¼\r
+*              char * : 表示名\r
 *----------------------------------------------------------------------------*/\r
 \r
 char *GetToolName(char *Path)\r
@@ -610,13 +642,13 @@ char *GetToolName(char *Path)
 }\r
 \r
 \r
-/*----- \83p\83X\96¼\82Ì\92\86\82Ì\8ag\92£\8eq\82Ì\90æ\93ª\82ð\95Ô\82· ----------------------------------------\r
+/*----- パス名の中の拡張子の先頭を返す ----------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Path : \83p\83X\96¼\r
+*              char *Path : パス名\r
 *\r
 *      Return Value\r
-*              char *\8ag\92£\8eq\82Ì\90æ\93ª\r
+*              char *拡張子の先頭\r
 *----------------------------------------------------------------------------*/\r
 \r
 char *GetFileExt(char *Path)\r
@@ -637,17 +669,17 @@ char *GetFileExt(char *Path)
 }\r
 \r
 \r
-/*----- \83p\83X\96¼\82©\82ç\83t\83@\83C\83\8b\96¼\82ð\8eæ\82è\8f\9c\82­ ----------------------------------------\r
+/*----- パス名からファイル名を取り除く ----------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Path : \83p\83X\96¼\r
-*              char *Buf : \83t\83@\83C\83\8b\96¼\82ð\8f\9c\82¢\82½\83p\83X\96¼\82Ì\83R\83s\81[\90æ\r
+*              char *Path : パス名\r
+*              char *Buf : ファイル名を除いたパス名のコピー先\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Note\r
-*              \83f\83B\83\8c\83N\83g\83\8a\82Ì\8bæ\90Ø\82è\8bL\8d\86\82Í "\" \82Æ "/" \82Ì\97¼\95û\82ª\97L\8cø\r
+*              ディレクトリの区切り記号は "\" と "/" の両方が有効\r
 *----------------------------------------------------------------------------*/\r
 \r
 void RemoveFileName(char *Path, char *Buf)\r
@@ -668,19 +700,19 @@ void RemoveFileName(char *Path, char *Buf)
 }\r
 \r
 \r
-/*----- \8fã\88Ê\83f\83B\83\8c\83N\83g\83\8a\82Ì\83p\83X\96¼\82ð\8eæ\93¾ ----------------------------------------\r
+/*----- 上位ディレクトリのパス名を取得 ----------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Path : \83p\83X\96¼\r
+*              char *Path : パス名\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Note\r
-*              \83f\83B\83\8c\83N\83g\83\8a\82Ì\8bæ\90Ø\82è\8bL\8d\86\82Í "\" \82Æ "/" \82Ì\97¼\95û\82ª\97L\8cø\r
-*              \8dÅ\8f\89\82Ì "\"\82â"/"\82Í\8ec\82·\r
-*                      \97á\81j "/pub"   --> "/"\r
-*                      \97á\81j "C:\DOS" --> "C:\"\r
+*              ディレクトリの区切り記号は "\" と "/" の両方が有効\r
+*              最初の "\"や"/"は残す\r
+*                      例) "/pub"   --> "/"\r
+*                      例) "C:\DOS" --> "C:\"\r
 *----------------------------------------------------------------------------*/\r
 \r
 void GetUpperDir(char *Path)\r
@@ -702,19 +734,19 @@ void GetUpperDir(char *Path)
 }\r
 \r
 \r
-/*----- \8fã\88Ê\83f\83B\83\8c\83N\83g\83\8a\82Ì\83p\83X\96¼\82ð\8eæ\93¾ ----------------------------------------\r
+/*----- 上位ディレクトリのパス名を取得 ----------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Path : \83p\83X\96¼\r
+*              char *Path : パス名\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Note\r
-*              \83f\83B\83\8c\83N\83g\83\8a\82Ì\8bæ\90Ø\82è\8bL\8d\86\82Í "\" \82Æ "/" \82Ì\97¼\95û\82ª\97L\8cø\r
-*              \8dÅ\8f\89\82Ì "\"\82â"/"\82à\8fÁ\82·\r
-*                      \97á\81j "/pub"   --> ""\r
-*                      \97á\81j "C:\DOS" --> "C:"\r
+*              ディレクトリの区切り記号は "\" と "/" の両方が有効\r
+*              最初の "\"や"/"も消す\r
+*                      例) "/pub"   --> ""\r
+*                      例) "C:\DOS" --> "C:"\r
 *----------------------------------------------------------------------------*/\r
 \r
 void GetUpperDirEraseTopSlash(char *Path)\r
@@ -731,16 +763,16 @@ void GetUpperDirEraseTopSlash(char *Path)
 }\r
 \r
 \r
-/*----- \83f\83B\83\8c\83N\83g\83\8a\82Ì\8aK\91w\90\94\82ð\95Ô\82· --------------------------------------------\r
+/*----- ディレクトリの階層数を返す --------------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Path : \83p\83X\96¼\r
+*              char *Path : パス名\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Note\r
-*              \92P\82É '\' \82Æ '/'\82Ì\90\94\82ð\95Ô\82·\82¾\82¯\r
+*              単に '\' と '/'の数を返すだけ\r
 *----------------------------------------------------------------------------*/\r
 \r
 int AskDirLevel(char *Path)\r
@@ -759,14 +791,14 @@ int AskDirLevel(char *Path)
 }\r
 \r
 \r
-/*----- \83t\83@\83C\83\8b\83T\83C\83Y\82ð\95\8e\9a\97ñ\82É\95Ï\8a·\82·\82é --------------------------------------\r
+/*----- ファイルサイズを文字列に変換する --------------------------------------\r
 *\r
 *      Parameter\r
-*              double Size : \83t\83@\83C\83\8b\83T\83C\83Y\r
-*              char *Buf : \95\8e\9a\97ñ\82ð\95Ô\82·\83o\83b\83t\83@\r
+*              double Size : ファイルサイズ\r
+*              char *Buf : 文字列を返すバッファ\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void MakeSizeString(double Size, char *Buf)\r
@@ -788,14 +820,14 @@ void MakeSizeString(double Size, char *Buf)
 }\r
 \r
 \r
-/*----- StaticText\82Ì\97Ì\88æ\82É\8eû\82Ü\82é\82æ\82¤\82É\83p\83X\96¼\82ð\90®\8c`\82µ\82Ä\95\\8e¦ --------------------\r
+/*----- StaticTextの領域に収まるようにパス名を整形して表示 --------------------\r
 *\r
 *      Parameter\r
-*              HWND hWnd : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
-*              char *Str : \95\8e\9a\97ñ (\92·\82³\82ÍFMAX_PATH\88È\89º)\r
+*              HWND hWnd : ウインドウハンドル\r
+*              char *Str : 文字列 (長さはFMAX_PATH以下)\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void DispStaticText(HWND hWnd, char *Str)\r
@@ -844,19 +876,19 @@ void DispStaticText(HWND hWnd, char *Str)
 }\r
 \r
 \r
-/*----- \95\8e\9a\97ñ\83A\83\8c\83C\82Ì\92·\82³\82ð\8b\81\82ß\82é --------------------------------------------\r
+/*----- 文字列アレイの長さを求める --------------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Str : \95\8e\9a\97ñ\83A\83\8c\83C (\96\96\94ö\82ÍNUL\82Q\82Â)\r
+*              char *Str : 文字列アレイ (末尾はNUL2つ)\r
 *\r
 *      Return Value\r
-*              int \92·\82³\r
+*              int 長さ\r
 *\r
 *      Note\r
-*              \8fI\92[\82Ì2\82Â\82ÌNUL\82Ì\82¤\82¿\82Ì\8dÅ\8cã\82Ì\95¨\82Í\90\94\82¦\82È\82¢\r
+*              終端の2つのNULのうちの最後の物は数えない\r
 *                      StrMultiLen("") = 0\r
 *                      StrMultiLen("abc\0xyz\0") = 8\r
-*                      StrMultiLen("abc") = \8fI\92[\82ª\82Q\82Â\82ÌNUL\82Å\82È\82¢\82Ì\82Å\8b\81\82ß\82ç\82ê\82È\82¢\r
+*                      StrMultiLen("abc") = 終端が2つのNULでないので求められない\r
 *----------------------------------------------------------------------------*/\r
 \r
 int StrMultiLen(char *Str)\r
@@ -875,14 +907,14 @@ int StrMultiLen(char *Str)
 }\r
 \r
 \r
-/*----- RECT\82ð\83N\83\89\83C\83A\83\93\83g\8dÀ\95W\82©\82ç\83X\83N\83\8a\81[\83\93\8dÀ\95W\82É\95Ï\8a· ------------------------\r
+/*----- RECTをクライアント座標からスクリーン座標に変換 ------------------------\r
 *\r
 *      Parameter\r
-*              HWND hWnd : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
+*              HWND hWnd : ウインドウハンドル\r
 *              RECT *Rect : RECT\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void RectClientToScreen(HWND hWnd, RECT *Rect)\r
@@ -905,13 +937,13 @@ void RectClientToScreen(HWND hWnd, RECT *Rect)
 }\r
 \r
 \r
-/*----- 16\90i\95\8e\9a\82ð\83o\83C\83i\83\8a\82É\95Ï\8a· ----------------------------------------------\r
+/*----- 16進文字をバイナリに変換 ----------------------------------------------\r
 *\r
 *      Parameter\r
-*              char Ch : 16\90i\95\8e\9a\r
+*              char Ch : 16進文字\r
 *\r
 *      Return Value\r
-*              int \83o\83C\83i\83\8a\92l\r
+*              int バイナリ値\r
 *----------------------------------------------------------------------------*/\r
 \r
 int hex2bin(char Ch)\r
@@ -929,22 +961,22 @@ int hex2bin(char Ch)
 }\r
 \r
 \r
-/*----- \82t\82m\82b\95\8e\9a\97ñ\82ð\95ª\89ð\82·\82é ------------------------------------------------\r
+/*----- UNC文字列を分解する ------------------------------------------------\r
 *\r
 *      Parameter\r
-*              char *unc : UNC\95\8e\9a\97ñ\r
-*              char *Host : \83z\83X\83g\96¼\82ð\83R\83s\81[\82·\82é\83o\83b\83t\83@ (\83T\83C\83Y\82Í HOST_ADRS_LEN+1)\r
-*              char *Path : \83p\83X\96¼\82ð\83R\83s\81[\82·\82é\83o\83b\83t\83@ (\83T\83C\83Y\82Í FMAX_PATH+1)\r
-*              char *File : \83t\83@\83C\83\8b\96¼\82ð\83R\83s\81[\82·\82é\83o\83b\83t\83@ (\83T\83C\83Y\82Í FMAX_PATH+1)\r
-*              char *User : \83\86\81[\83U\96¼\82ð\83R\83s\81[\82·\82é\83o\83b\83t\83@ (\83T\83C\83Y\82Í USER_NAME_LEN+1)\r
-*              char *Pass : \83p\83X\83\8f\81[\83h\82ð\83R\83s\81[\82·\82é\83o\83b\83t\83@ (\83T\83C\83Y\82Í PASSWORD_LEN+1)\r
-*              int *Port : \83|\81[\83g\94Ô\8d\86\82ð\83R\83s\81[\82·\82é\83o\83b\83t\83@\r
+*              char *unc : UNC文字列\r
+*              char *Host : ホスト名をコピーするバッファ (サイズは HOST_ADRS_LEN+1)\r
+*              char *Path : パス名をコピーするバッファ (サイズは FMAX_PATH+1)\r
+*              char *File : ファイル名をコピーするバッファ (サイズは FMAX_PATH+1)\r
+*              char *User : ユーザ名をコピーするバッファ (サイズは USER_NAME_LEN+1)\r
+*              char *Pass : パスワードをコピーするバッファ (サイズは PASSWORD_LEN+1)\r
+*              int *Port : ポート番号をコピーするバッファ\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X\r
-*                      SUCCESS/FAIL\r
+*              int ステータス\r
+*                      FFFTP_SUCCESS/FFFTP_FAIL\r
 *\r
-*      "\"\82Í\91S\82Ä"/"\82É\92u\82«\8a·\82¦\82é\r
+*      "\"は全て"/"に置き換える\r
 *----------------------------------------------------------------------------*/\r
 \r
 int SplitUNCpath(char *unc, char *Host, char *Path, char *File, char *User, char *Pass, int *Port)\r
@@ -983,9 +1015,23 @@ int SplitUNCpath(char *unc, char *Host, char *Path, char *File, char *User, char
                        strncpy(User, Tmp, USER_NAME_LEN);\r
        }\r
 \r
+       // IPv6対応\r
+       if((Pos2 = _mbschr(Pos1, '[')) != NULL && Pos2 < _mbschr(Pos1, ':'))\r
+       {\r
+               Pos1 = Pos2 + 1;\r
+               if((Pos2 = _mbschr(Pos2, ']')) != NULL)\r
+               {\r
+                       memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
+                       Pos1 = Pos2 + 1;\r
+               }\r
+       }\r
+\r
        if((Pos2 = _mbschr(Pos1, ':')) != NULL)\r
        {\r
-               memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
+               // IPv6対応\r
+//             memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
+               if(strlen(Host) == 0)\r
+                       memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
                Pos2++;\r
                if(IsDigit(*Pos2))\r
                {\r
@@ -1002,32 +1048,38 @@ int SplitUNCpath(char *unc, char *Host, char *Path, char *File, char *User, char
        }\r
        else if((Pos2 = _mbschr(Pos1, '/')) != NULL)\r
        {\r
-               memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
+               // IPv6対応\r
+//             memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
+               if(strlen(Host) == 0)\r
+                       memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
                RemoveFileName(Pos2, Path);\r
                strncpy(File, GetFileName(Pos2), FMAX_PATH);\r
        }\r
        else\r
        {\r
-               strncpy(Host, Pos1, HOST_ADRS_LEN);\r
+               // IPv6対応\r
+//             strncpy(Host, Pos1, HOST_ADRS_LEN);\r
+               if(strlen(Host) == 0)\r
+                       strncpy(Host, Pos1, HOST_ADRS_LEN);\r
        }\r
 \r
-       Sts = FAIL;\r
+       Sts = FFFTP_FAIL;\r
        if(strlen(Host) > 0)\r
-               Sts = SUCCESS;\r
+               Sts = FFFTP_SUCCESS;\r
 \r
        return(Sts);\r
 }\r
 \r
 \r
-/*----- \93ú\95t\95\8e\9a\97ñ(JST)\82ðFILETIME(UTC)\82É\95Ï\8a· ----------------------------------\r
+/*----- 日付文字列(JST)をFILETIME(UTC)に変換 ----------------------------------\r
 *\r
 *      Parameter\r
-*              char *Time : \93ú\95t\95\8e\9a\97ñ ("yyyy/mm/dd hh:mm")\r
-*              FILETIME *Buf : \83t\83@\83C\83\8b\83^\83C\83\80\82ð\95Ô\82·\83\8f\81[\83N\r
+*              char *Time : 日付文字列 ("yyyy/mm/dd hh:mm")\r
+*              FILETIME *Buf : ファイルタイムを返すワーク\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X\r
-*                      YES/NO=\93ú\95t\8fî\95ñ\82ª\82È\82©\82Á\82½\r
+*              int ステータス\r
+*                      YES/NO=日付情報がなかった\r
 *----------------------------------------------------------------------------*/\r
 \r
 int TimeString2FileTime(char *Time, FILETIME *Buf)\r
@@ -1066,16 +1118,16 @@ int TimeString2FileTime(char *Time, FILETIME *Buf)
 }\r
 \r
 \r
-/*----- FILETIME(UTC)\82ð\93ú\95t\95\8e\9a\97ñ(JST)\82É\95Ï\8a· ----------------------------------\r
+/*----- FILETIME(UTC)を日付文字列(JST)に変換 ----------------------------------\r
 *\r
 *      Parameter\r
-*              FILETIME *Time : \83t\83@\83C\83\8b\83^\83C\83\80\r
-*              char *Buf : \93ú\95t\95\8e\9a\97ñ\82ð\95Ô\82·\83\8f\81[\83N\r
-*              int Mode : \83\82\81[\83h (DISPFORM_xxx)\r
-*              int InfoExist : \8fî\95ñ\82ª\82 \82é\82©\82Ç\82¤\82© (FINFO_xxx)\r
+*              FILETIME *Time : ファイルタイム\r
+*              char *Buf : 日付文字列を返すワーク\r
+*              int Mode : モード (DISPFORM_xxx)\r
+*              int InfoExist : 情報があるかどうか (FINFO_xxx)\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void FileTime2TimeString(FILETIME *Time, char *Buf, int Mode, int InfoExist)\r
@@ -1105,20 +1157,20 @@ void FileTime2TimeString(FILETIME *Time, char *Buf, int Mode, int InfoExist)
        else\r
        {\r
 //             if (!strftime((char *)str, 100, "%c",  (const struct tm *)thetime))\r
-//                     SetTaskMsg("strftime \82ª\8e¸\94s\82µ\82Ü\82µ\82½!\n");\r
+//                     SetTaskMsg("strftime が失敗しました!\n");\r
        }\r
        return;\r
 }\r
 \r
 \r
-/*----- \83t\83@\83C\83\8b\83^\83C\83\80\82ð\8ew\92è\83^\83C\83\80\83]\81[\83\93\82Ì\83\8d\81[\83J\83\8b\83^\83C\83\80\82©\82çGMT\82É\95Ï\8a· ---------\r
+/*----- ファイルタイムを指定タイムゾーンのローカルタイムからGMTに変換 ---------\r
 *\r
 *      Parameter\r
-*              FILETIME *Time : \83t\83@\83C\83\8b\83^\83C\83\80\r
-*              int TimeZone : \83^\83C\83\80\83]\81[\83\93\r
+*              FILETIME *Time : ファイルタイム\r
+*              int TimeZone : タイムゾーン\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void SpecificLocalFileTime2FileTime(FILETIME *Time, int TimeZone)\r
@@ -1137,13 +1189,13 @@ void SpecificLocalFileTime2FileTime(FILETIME *Time, int TimeZone)
 }\r
 \r
 \r
-/*----- \91®\90«\95\8e\9a\97ñ\82ð\92l\82É\95Ï\8a· --------------------------------------------------\r
+/*----- 属性文字列を値に変換 --------------------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Str : \91®\90«\95\8e\9a\97ñ ("rwxrwxrwx")\r
+*              char *Str : 属性文字列 ("rwxrwxrwx")\r
 *\r
 *      Return Value\r
-*              int \92l\r
+*              int \r
 *----------------------------------------------------------------------------*/\r
 \r
 int AttrString2Value(char *Str)\r
@@ -1180,14 +1232,14 @@ int AttrString2Value(char *Str)
 }\r
 \r
 \r
-/*----- \91®\90«\82Ì\92l\82ð\95\8e\9a\97ñ\82É\95Ï\8a· ------------------------------------------------\r
+/*----- 属性の値を文字列に変換 ------------------------------------------------\r
 *\r
 *      Parameter\r
-*              int Attr : \91®\90«\82Ì\92l\r
-*              char *Buf : \91®\90«\95\8e\9a\97ñ\82ð\83Z\83b\83g\82·\82é\83o\83b\83t\83@ ("rwxrwxrwx")\r
+*              int Attr : 属性の値\r
+*              char *Buf : 属性文字列をセットするバッファ ("rwxrwxrwx")\r
 *\r
 *      Return Value\r
-*              int \92l\r
+*              int \r
 *----------------------------------------------------------------------------*/\r
 \r
 void AttrValue2String(int Attr, char *Buf)\r
@@ -1219,13 +1271,13 @@ void AttrValue2String(int Attr, char *Buf)
 }\r
 \r
 \r
-/*----- INI\83t\83@\83C\83\8b\95\8e\9a\97ñ\82ð\90®\8c` -----------------------------------------------\r
+/*----- INIファイル文字列を整形 -----------------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Str : \95\8e\9a\97ñ\r
+*              char *Str : 文字列\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void FormatIniString(char *Str)\r
@@ -1253,20 +1305,20 @@ void FormatIniString(char *Str)
 }\r
 \r
 \r
-/*----- \83t\83@\83C\83\8b\91I\91ð ----------------------------------------------------------\r
+/*----- ファイル選択 ----------------------------------------------------------\r
 *\r
 *      Parameter\r
-*              HWND hWnd : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
-*              char *Fname : \83t\83@\83C\83\8b\96¼\82ð\95Ô\82·\83o\83b\83t\83@\r
-*              char *Title : \83^\83C\83g\83\8b\r
-*              char *Filters : \83t\83B\83\8b\83^\81[\95\8e\9a\97ñ\r
-*              char *Ext : \83f\83t\83H\83\8b\83g\8ag\92£\8eq\r
-*              int Flags : \92Ç\89Á\82·\82é\83t\83\89\83O\r
-*              int Save : \81u\8aJ\82­\81v\82©\81u\95Û\91\81v\82© (0=\8aJ\82­, 1=\95Û\91)\r
+*              HWND hWnd : ウインドウハンドル\r
+*              char *Fname : ファイル名を返すバッファ\r
+*              char *Title : タイトル\r
+*              char *Filters : フィルター文字列\r
+*              char *Ext : デフォルト拡張子\r
+*              int Flags : 追加するフラグ\r
+*              int Save : 「開く」か「保存」か (0=開く, 1=保存)\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X\r
-*                      TRUE/FALSE=\8eæ\8fÁ\r
+*              int ステータス\r
+*                      TRUE/FALSE=取消\r
 *----------------------------------------------------------------------------*/\r
 \r
 int SelectFile(HWND hWnd, char *Fname, char *Title, char *Filters, char *Ext, int Flags, int Save)\r
@@ -1314,16 +1366,16 @@ int SelectFile(HWND hWnd, char *Fname, char *Title, char *Filters, char *Ext, in
 }\r
 \r
 \r
-/*----- \83f\83B\83\8c\83N\83g\83\8a\82ð\91I\91ð ----------------------------------------------------\r
+/*----- ディレクトリを選択 ----------------------------------------------------\r
 *\r
 *      Parameter\r
-*              HWND hWnd : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
-*              char *Buf : \83f\83B\83\8c\83N\83g\83\8a\96¼\82ð\95Ô\82·\83o\83b\83t\83@\81i\8f\89\8aú\83f\83B\83\8c\83N\83g\83\8a\96¼\81j\r
-*              int MaxLen : \83o\83b\83t\83@\82Ì\83T\83C\83Y\r
+*              HWND hWnd : ウインドウハンドル\r
+*              char *Buf : ディレクトリ名を返すバッファ(初期ディレクトリ名)\r
+*              int MaxLen : バッファのサイズ\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X\r
-*                      TRUE/FALSE=\8eæ\8fÁ\r
+*              int ステータス\r
+*                      TRUE/FALSE=取消\r
 *----------------------------------------------------------------------------*/\r
 \r
 int SelectDir(HWND hWnd, char *Buf, int MaxLen)\r
@@ -1363,20 +1415,20 @@ int SelectDir(HWND hWnd, char *Buf, int MaxLen)
 }\r
 \r
 \r
-/*----- \92l\82É\8aÖ\98A\95t\82¯\82ç\82ê\82½\83\89\83W\83I\83{\83^\83\93\82ð\83`\83F\83b\83N\82·\82é --------------------------\r
+/*----- 値に関連付けられたラジオボタンをチェックする --------------------------\r
 *\r
 *      Parameter\r
-*              HWND hDlg : \83_\83C\83A\83\8d\83O\83{\83b\83N\83X\82Ì\83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
-*              int Value : \92l\r
-*              const RADIOBUTTON *Buttons : \83\89\83W\83I\83{\83^\83\93\82Æ\92l\82Ì\8aÖ\98A\95t\82¯\83e\81[\83u\83\8b\r
-*              int Num : \83{\83^\83\93\82Ì\90\94\r
+*              HWND hDlg : ダイアログボックスのウインドウハンドル\r
+*              int Value : \r
+*              const RADIOBUTTON *Buttons : ラジオボタンと値の関連付けテーブル\r
+*              int Num : ボタンの数\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *\r
 *      Note\r
-*              \92l\82É\8aÖ\98A\95t\82¯\82ç\82ê\82½\83{\83^\83\93\82ª\96³\82¢\8e\9e\82Í\81A\83e\81[\83u\83\8b\82Ì\8dÅ\8f\89\82É\93o\98^\82³\82ê\82Ä\82¢\82é\83{\83^\r
-*              \83\93\82ð\83`\83F\83b\83N\82·\82é\r
+*              値に関連付けられたボタンが無い時は、テーブルの最初に登録されているボタ\r
+*              ンをチェックする\r
 *----------------------------------------------------------------------------*/\r
 \r
 void SetRadioButtonByValue(HWND hDlg, int Value, const RADIOBUTTON *Buttons, int Num)\r
@@ -1390,8 +1442,8 @@ void SetRadioButtonByValue(HWND hDlg, int Value, const RADIOBUTTON *Buttons, int
                if(Value == Buttons->Value)\r
                {\r
                        SendDlgItemMessage(hDlg, Buttons->ButID, BM_SETCHECK, 1, 0);\r
-                       /* \83\89\83W\83I\83{\83^\83\93\82ð\95Ï\8dX\82µ\82½\8e\9e\82É\91¼\82Ì\8d\80\96Ú\82Ì\83n\83C\83h\82È\82Ç\82ð\8ds\82È\82¤\8e\96\82ª   */\r
-                       /* \82 \82é\82Ì\82Å\81A\82»\82Ì\82½\82ß\82É WM_COMMAND \82ð\91\97\82é                                               */\r
+                       /* ラジオボタンを変更した時に他の項目のハイドなどを行なう事が      */\r
+                       /* あるので、そのために WM_COMMAND を送る                                          */\r
                        SendMessage(hDlg, WM_COMMAND, MAKEWPARAM(Buttons->ButID, 0), 0);\r
                        break;\r
                }\r
@@ -1406,19 +1458,19 @@ void SetRadioButtonByValue(HWND hDlg, int Value, const RADIOBUTTON *Buttons, int
 }\r
 \r
 \r
-/*----- \83`\83F\83b\83N\82³\82ê\82Ä\82¢\82é\83{\83^\83\93\82É\8aÖ\98A\95t\82¯\82ç\82ê\82½\92l\82ð\95Ô\82· ----------------------\r
+/*----- チェックされているボタンに関連付けられた値を返す ----------------------\r
 *\r
 *      Parameter\r
-*              HWND hDlg : \83_\83C\83A\83\8d\83O\83{\83b\83N\83X\82Ì\83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
-*              const RADIOBUTTON *Buttons : \83\89\83W\83I\83{\83^\83\93\82Æ\92l\82Ì\8aÖ\98A\95t\82¯\83e\81[\83u\83\8b\r
-*              int Num : \83{\83^\83\93\82Ì\90\94\r
+*              HWND hDlg : ダイアログボックスのウインドウハンドル\r
+*              const RADIOBUTTON *Buttons : ラジオボタンと値の関連付けテーブル\r
+*              int Num : ボタンの数\r
 *\r
 *      Return Value\r
-*              int \92l\r
+*              int \r
 *\r
 *      Note\r
-*              \82Ç\82Ì\83{\83^\83\93\82à\83`\83F\83b\83N\82³\82ê\82Ä\82¢\82È\82¢\8e\9e\82Í\81A\83e\81[\83u\83\8b\82Ì\8dÅ\8f\89\82É\93o\98^\82³\82ê\82Ä\82¢\82é\83{\r
-*              \83^\83\93\82Ì\92l\82ð\95Ô\82·\r
+*              どのボタンもチェックされていない時は、テーブルの最初に登録されているボ\r
+*              タンの値を返す\r
 *----------------------------------------------------------------------------*/\r
 \r
 int AskRadioButtonValue(HWND hDlg, const RADIOBUTTON *Buttons, int Num)\r
@@ -1440,13 +1492,13 @@ int AskRadioButtonValue(HWND hDlg, const RADIOBUTTON *Buttons, int Num)
 }\r
 \r
 \r
-/*----- \82P\82U\90i\95\8e\9a\97ñ\82ð\90\94\92l\82É\95Ï\8a· ----------------------------------------------\r
+/*----- 16進文字列を数値に変換 ----------------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Str : \95\8e\9a\97ñ\r
+*              char *Str : 文字列\r
 *\r
 *      Return Value\r
-*              int \92l\r
+*              int \r
 *----------------------------------------------------------------------------*/\r
 \r
 int xtoi(char *Str)\r
@@ -1472,14 +1524,14 @@ int xtoi(char *Str)
 }\r
 \r
 \r
-/*----- \83t\83@\83C\83\8b\82ª\93Ç\82Ý\8eæ\82è\89Â\94\\82©\82Ç\82¤\82©\82ð\95Ô\82· ----------------------------------\r
+/*----- ファイルが読み取り可能かどうかを返す ----------------------------------\r
 *\r
 *      Parameter\r
-*              char *Fname : \83t\83@\83C\83\8b\96¼\r
+*              char *Fname : ファイル名\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X\r
-*                      SUCCESS/FAIL\r
+*              int ステータス\r
+*                      FFFTP_SUCCESS/FFFTP_FAIL\r
 *----------------------------------------------------------------------------*/\r
 \r
 int CheckFileReadable(char *Fname)\r
@@ -1488,7 +1540,7 @@ int CheckFileReadable(char *Fname)
        HANDLE iFileHandle;\r
        SECURITY_ATTRIBUTES Sec;\r
 \r
-       Sts = FAIL;\r
+       Sts = FFFTP_FAIL;\r
 \r
        Sec.nLength = sizeof(SECURITY_ATTRIBUTES);\r
        Sec.lpSecurityDescriptor = NULL;\r
@@ -1497,7 +1549,7 @@ int CheckFileReadable(char *Fname)
        if((iFileHandle = CreateFile(Fname, GENERIC_READ,\r
                FILE_SHARE_READ|FILE_SHARE_WRITE, &Sec, OPEN_EXISTING, 0, NULL)) != INVALID_HANDLE_VALUE)\r
        {\r
-               Sts = SUCCESS;\r
+               Sts = FFFTP_SUCCESS;\r
                CloseHandle(iFileHandle);\r
        }\r
        return(Sts);\r
@@ -1544,14 +1596,14 @@ void ExcEndianDWORD(DWORD *x)
 \r
 \r
 \r
-/*----- int\92l\82Ì\93ü\82ê\91Ö\82¦ -------------------------------------------------------\r
+/*----- int値の入れ替え -------------------------------------------------------\r
 *\r
 *      Parameter\r
-*              int *Num1 : \90\94\92l\82P\r
-*              int *Num2 : \90\94\92l\82Q\r
+*              int *Num1 : 数値1\r
+*              int *Num2 : 数値2\r
 *\r
 *      Return Value\r
-*              \82È\82µ\r
+*              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
 void SwapInt(int *Num1, int *Num2)\r
@@ -1565,13 +1617,13 @@ void SwapInt(int *Num1, int *Num2)
 }\r
 \r
 \r
-/*----- \8ew\92è\82³\82ê\82½\83t\83H\83\8b\83_\82ª\82 \82é\82©\82Ç\82¤\82©\83`\83F\83b\83N -------------------------------\r
+/*----- 指定されたフォルダがあるかどうかチェック -------------------------------\r
 *\r
 *      Parameter\r
-*              char *Path : \83p\83X\r
+*              char *Path : パス\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X (YES/NO)\r
+*              int ステータス (YES/NO)\r
 *----------------------------------------------------------------------------*/\r
 \r
 int IsFolderExist(char *Path)\r
@@ -1595,16 +1647,16 @@ int IsFolderExist(char *Path)
 }\r
 \r
 \r
-/*----- \83e\81[\83u\83\8b\82É\82µ\82½\82ª\82Á\82Ä\90\94\92l\82ð\93o\98^ -----------------------------------------\r
+/*----- テーブルにしたがって数値を登録 -----------------------------------------\r
 *\r
 *      Parameter\r
-*              int x : \90\94\92l\r
-*              int Dir : \95Ï\8a·\95û\8cü\r
-*              INTCONVTBL *Tbl : \83e\81[\83u\83\8b\r
-*              int Num : \83e\81[\83u\83\8b\82Ì\90\94\92l\82Ì\90\94\r
+*              int x : 数値\r
+*              int Dir : 変換方向\r
+*              INTCONVTBL *Tbl : テーブル\r
+*              int Num : テーブルの数値の数\r
 *\r
 *      Return Value\r
-*              int \90\94\92l\r
+*              int 数値\r
 *----------------------------------------------------------------------------*/\r
 \r
 int ConvertNum(int x, int Dir, const INTCONVTBL *Tbl, int Num)\r
@@ -1635,13 +1687,13 @@ int ConvertNum(int x, int Dir, const INTCONVTBL *Tbl, int Num)
 \r
 \r
 \r
-/*----- \83t\83@\83C\83\8b\82ð\83S\83~\94 \82É\8dí\8f\9c ------------------------------------------------\r
+/*----- ファイルをゴミ箱に削除 ------------------------------------------------\r
 *\r
 *      Parameter\r
-*              char *Path : \83t\83@\83C\83\8b\96¼\r
+*              char *Path : ファイル名\r
 *\r
 *      Return Value\r
-*              int \83X\83e\81[\83^\83X (0=\90³\8fí\8fI\97¹)\r
+*              int ステータス (0=正常終了)\r
 *----------------------------------------------------------------------------*/\r
 \r
 int MoveFileToTrashCan(char *Path)\r
@@ -1700,3 +1752,88 @@ char *MakeNumString(LONGLONG Num, char *Buf, BOOL Comma)
 }\r
 \r
 \r
+// 異なるファイルが表示されるバグ修正\r
+\r
+// ShellExecute等で使用されるファイル名を修正\r
+// UNCでない場合に末尾の半角スペースは無視されるため拡張子が補完されなくなるまで半角スペースを追加\r
+// 現在UNC対応の予定は無い\r
+char* MakeDistinguishableFileName(char* Out, char* In)\r
+{\r
+       char* Fname;\r
+       char Tmp[FMAX_PATH+1];\r
+       char Tmp2[FMAX_PATH+3];\r
+       HANDLE hFind;\r
+       WIN32_FIND_DATA Find;\r
+       if(strlen(GetFileExt(GetFileName(In))) > 0)\r
+               strcpy(Out, In);\r
+       else\r
+       {\r
+               Fname = GetFileName(In);\r
+               strcpy(Tmp, In);\r
+               strcpy(Tmp2, Tmp);\r
+               strcat(Tmp2, ".*");\r
+               while(strlen(Tmp) < FMAX_PATH && (hFind = FindFirstFile(Tmp2, &Find)) != INVALID_HANDLE_VALUE)\r
+               {\r
+                       do\r
+                       {\r
+                               if(strcmp(Find.cFileName, Fname) != 0)\r
+                                       break;\r
+                       }\r
+                       while(FindNextFile(hFind, &Find));\r
+                       FindClose(hFind);\r
+                       if(strcmp(Find.cFileName, Fname) != 0)\r
+                       {\r
+                               strcat(Tmp, " ");\r
+                               strcpy(Tmp2, Tmp);\r
+                               strcat(Tmp2, ".*");\r
+                       }\r
+                       else\r
+                               break;\r
+               }\r
+               strcpy(Out, Tmp);\r
+       }\r
+       return Out;\r
+}\r
+\r
+// 環境依存の不具合対策\r
+char* GetAppTempPath(char* Buf)\r
+{\r
+       char Temp[32];\r
+       GetTempPath(MAX_PATH, Buf);\r
+       SetYenTail(Buf);\r
+       sprintf(Temp, "ffftp%08x", GetCurrentProcessId());\r
+       strcat(Buf, Temp);\r
+       return Buf;\r
+}\r
+\r
+#if defined(HAVE_TANDEM)\r
+/*----- ファイルサイズからEXTENTサイズの計算を行う ----------------------------\r
+*\r
+*      Parameter\r
+*              LONGLONG Size : ファイルサイズ\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+void CalcExtentSize(TRANSPACKET *Pkt, LONGLONG Size)\r
+{\r
+       LONGLONG extent;\r
+\r
+       /* EXTENTS(4,28) MAXEXTENTS 978 */\r
+       if(Size < 56025088) {\r
+               Pkt->PriExt = DEF_PRIEXT;\r
+               Pkt->SecExt = DEF_SECEXT;\r
+               Pkt->MaxExt = DEF_MAXEXT;\r
+       } else {\r
+               /* 増加余地を残すため Used 75% 近辺になるように EXTENT サイズを調整) */\r
+               extent = (LONGLONG)(Size / ((DEF_MAXEXT * 0.75) * 2048LL));\r
+               /* 28未満にすると誤差でFile Fullになる可能性がある */\r
+               if(extent < 28)\r
+                       extent = 28;\r
+\r
+               Pkt->PriExt = (int)extent;\r
+               Pkt->SecExt = (int)extent;\r
+               Pkt->MaxExt = DEF_MAXEXT;\r
+       }\r
+}\r
+#endif\r