• R/O
  • SSH
  • HTTPS

ttssh2: Commit


Commit MetaInfo

Revision9436 (tree)
Time2021-09-20 00:15:13
Authorzmatsuo

Log Message

ttermpro コマンドライン Unicode化

Change Summary

Incremental Difference

--- trunk/TTProxy/TTProxy.h (revision 9435)
+++ trunk/TTProxy/TTProxy.h (revision 9436)
@@ -99,12 +99,12 @@
9999 write_options(fileName);
100100 }
101101
102- static void PASCAL TTXParseParam(PCHAR param, PTTSet ts, PCHAR DDETopic) {
103- int param_len=strlen(param);
104- char option[1024];
102+ static void PASCAL TTXParseParam(wchar_t *param, PTTSet ts, PCHAR DDETopic) {
103+ size_t param_len = wcslen(param);
104+ wchar_t option[1024];
105105 int opt_len = sizeof(option);
106106 int action;
107- PCHAR start, cur, next;
107+ wchar_t *start, *cur, *next;
108108
109109 memset(&option, '\0', opt_len);
110110
@@ -118,9 +118,11 @@
118118
119119 if ((option[0] == '-' || option[0] == '/')) {
120120 if ((option[1] == 'F' || option[1] == 'f') && option[2] == '=') {
121- const char *f = get_teraterm_dir_relative_name(option + 3);
121+ char *optA = ToCharW(option + 3);
122+ const char *f = get_teraterm_dir_relative_name(optA);
122123 wchar_t *fW = ToWcharA(f);
123124 read_options(fW);
125+ free(optA);
124126 free(fW);
125127 }
126128 }
@@ -127,11 +129,11 @@
127129
128130 switch (action) {
129131 case OPTION_CLEAR:
130- memset(cur, ' ', next-cur);
132+ wmemset(cur, ' ', next-cur);
131133 break;
132134 case OPTION_REPLACE:
133- memset(cur, ' ', next-cur);
134- memcpy(cur+1, option, strlen(option));
135+ wmemset(cur, ' ', next-cur);
136+ wmemcpy(cur+1, option, wcslen(option));
135137 break;
136138 }
137139
@@ -144,22 +146,26 @@
144146 action = OPTION_NONE;
145147
146148 if ((option[0] == '-' || option[0] == '/')) {
147- if (strlen(option + 1) >= 6 && option[6] == '=') {
149+ if (wcslen(option + 1) >= 6 && option[6] == '=') {
148150 option[6] = '\0';
149- if (_stricmp(option + 1, "proxy") == 0) {
150- ProxyWSockHook::parseURL(option + 7, TRUE);
151+ if (_wcsicmp(option + 1, L"proxy") == 0) {
152+ char *url = ToCharW(option + 7);
153+ ProxyWSockHook::parseURL(url, TRUE);
154+ free(url);
151155 action = OPTION_CLEAR;
152156 }else{
153157 option[6] = '=';
154158 }
155159 }
156- else if (_stricmp(option+1, "noproxy") == 0) {
160+ else if (_wcsicmp(option+1, L"noproxy") == 0) {
157161 // -noproxy は -proxy=none:// の別名
158162 ProxyWSockHook::parseURL("none://", TRUE);
159163 action = OPTION_CLEAR;
160164 }
161165 }else{
162- String realhost = ProxyWSockHook::parseURL(option, FALSE);
166+ char *url = ToCharW(option);
167+ String realhost = ProxyWSockHook::parseURL(url, FALSE);
168+ free(url);
163169 if (realhost != NULL) {
164170 getInstance().realhost = realhost;
165171 if (realhost.indexOf("://") == -1) {
@@ -175,11 +181,11 @@
175181
176182 switch (action) {
177183 case OPTION_CLEAR:
178- memset(cur, ' ', next-cur);
184+ wmemset(cur, ' ', next-cur);
179185 break;
180186 case OPTION_REPLACE:
181- memset(cur, ' ', next-cur);
182- memcpy(cur+1, option, strlen(option));
187+ wmemset(cur, ' ', next-cur);
188+ wmemcpy(cur+1, option, wcslen(option));
183189 break;
184190 }
185191
--- trunk/TTXSamples/TTXAdditionalTitle/TTXAdditionalTitle.c (revision 9435)
+++ trunk/TTXSamples/TTXAdditionalTitle/TTXAdditionalTitle.c (revision 9436)
@@ -287,15 +287,15 @@
287287 }
288288 }
289289
290-static void PASCAL TTXParseParam(PCHAR Param, PTTSet ts, PCHAR DDETopic) {
291- char buff[1024];
292- PCHAR next;
290+static void PASCAL TTXParseParam(wchar_t *Param, PTTSet ts, PCHAR DDETopic) {
291+ wchar_t buff[1024];
292+ wchar_t *next;
293293
294294 pvar->origParseParam(Param, ts, DDETopic);
295295
296296 next = Param;
297297 while (next = GetParam(buff, sizeof(buff), next)) {
298- if (_strnicmp(buff, "/W=", 3) == 0) {
298+ if (_wcsnicmp(buff, L"/W=", 3) == 0) {
299299 strncpy_s(pvar->orig_title, sizeof(pvar->orig_title), pvar->ts->Title, _TRUNCATE);
300300 SetTitleStr(pvar->orig_title, FALSE);
301301 break;
--- trunk/TTXSamples/TTXCommandLineOpt/TTXCommandLineOpt.c (revision 9435)
+++ trunk/TTXSamples/TTXCommandLineOpt/TTXCommandLineOpt.c (revision 9436)
@@ -4,6 +4,7 @@
44 #include "tt_res.h"
55 #include <stdlib.h>
66 #include <stdio.h>
7+#include <wchar.h>
78
89 #define ORDER 5800
910
@@ -23,10 +24,10 @@
2324 pvar->cv = cv;
2425 }
2526
26-BOOL ColorStr2ColorRef(COLORREF *color, PCHAR Str) {
27+static BOOL ColorStr2ColorRef(COLORREF *color, wchar_t *Str) {
2728 int TmpColor[3];
2829 int i, result;
29- PCHAR cur, next;
30+ wchar_t *cur, *next;
3031
3132 cur = Str;
3233
@@ -34,10 +35,10 @@
3435 if (!cur)
3536 return FALSE;
3637
37- if ((next = strchr(cur, ',')) != NULL)
38+ if ((next = wcsrchr(cur, L',')) != NULL)
3839 *next = 0;
3940
40- result = sscanf_s(cur, "%d", &TmpColor[i]);
41+ result = swscanf_s(cur, L"%d", &TmpColor[i]);
4142
4243 if (next)
4344 *next++ = ',';
@@ -52,9 +53,9 @@
5253 return TRUE;
5354 }
5455
55-static void PASCAL TTXParseParam(PCHAR Param, PTTSet ts, PCHAR DDETopic) {
56- char buff[1024];
57- PCHAR start, cur, next;
56+static void PASCAL TTXParseParam(wchar_t *Param, PTTSet ts, PCHAR DDETopic) {
57+ wchar_t buff[1024];
58+ wchar_t *start, *cur, *next;
5859 int x, y;
5960
6061 /* the first term shuld be executable filename of Tera Term */
@@ -62,20 +63,20 @@
6263
6364 cur = start;
6465 while (next = GetParam(buff, sizeof(buff), cur)) {
65- if (_strnicmp(buff, "/FG=", 4) == 0) {
66+ if (_wcsnicmp(buff, L"/FG=", 4) == 0) {
6667 ColorStr2ColorRef(&(ts->VTColor[0]), &buff[4]);
67- memset(cur, ' ', next - cur);
68+ wmemset(cur, ' ', next - cur);
6869 }
69- else if (_strnicmp(buff, "/BG=", 4) == 0) {
70+ else if (_wcsnicmp(buff, L"/BG=", 4) == 0) {
7071 ColorStr2ColorRef(&(ts->VTColor[1]), &buff[4]);
71- memset(cur, ' ', next - cur);
72+ wmemset(cur, ' ', next - cur);
7273 }
73- else if (_strnicmp(buff, "/SIZE=", 6) == 0) {
74- if (sscanf_s(buff+6, "%dx%d", &x, &y) == 2 || sscanf_s(buff+6, "%d,%d", &x, &y) == 2) {
75- ts->TerminalWidth = x;
76- ts->TerminalHeight = y;
74+ else if (_wcsnicmp(buff, L"/SIZE=", 6) == 0) {
75+ if (swscanf_s(buff+6, L"%dx%d", &x, &y) == 2 || swscanf_s(buff+6, L"%d,%d", &x, &y) == 2) {
76+ ts->TerminalWidth = x;
77+ ts->TerminalHeight = y;
7778 }
78- memset(cur, ' ', next - cur);
79+ wmemset(cur, ' ', next - cur);
7980 }
8081 cur = next;
8182 }
--- trunk/TTXSamples/TTXRecurringCommand/TTXRecurringCommand.c (revision 9435)
+++ trunk/TTXSamples/TTXRecurringCommand/TTXRecurringCommand.c (revision 9436)
@@ -396,19 +396,16 @@
396396 // /F= による設定ファイルの切り替えのみ対応。
397397 //
398398
399-static void PASCAL TTXParseParam(PCHAR Param, PTTSet ts, PCHAR DDETopic) {
400- char buff[1024];
401- PCHAR next;
399+static void PASCAL TTXParseParam(wchar_t *Param, PTTSet ts, PCHAR DDETopic) {
400+ wchar_t buff[1024];
401+ wchar_t *next;
402402 pvar->origParseParam(Param, ts, DDETopic);
403403
404404 next = Param;
405405 while (next = GetParam(buff, sizeof(buff), next)) {
406406 DequoteParam(buff, sizeof(buff), buff);
407- if (_strnicmp(buff, "/F=", 3) == 0) {
408- char *f = buff+3;
409- wchar_t *fW = ToWcharA(f);
410- ReadINI(fW, ts);
411- free(fW);
407+ if (_wcsnicmp(buff, L"/F=", 3) == 0) {
408+ ReadINI(buff+3, ts);
412409 }
413410 }
414411
--- trunk/TTXSamples/TTXShowCommandLine/TTXShowCommandLine.c (revision 9435)
+++ trunk/TTXSamples/TTXShowCommandLine/TTXShowCommandLine.c (revision 9436)
@@ -16,8 +16,8 @@
1616 static TInstVar *pvar;
1717 static TInstVar InstVar;
1818
19-static void PASCAL TTXParseParam(PCHAR Param, PTTSet ts, PCHAR DDETopic) {
20- MessageBox(NULL, Param, "TTXShowCommandLine", MB_OK|MB_ICONEXCLAMATION);
19+static void PASCAL TTXParseParam(wchar_t *Param, PTTSet ts, PCHAR DDETopic) {
20+ MessageBoxW(NULL, Param, L"TTXShowCommandLine", MB_OK|MB_ICONEXCLAMATION);
2121 pvar->origParseParam(Param, ts, DDETopic);
2222 }
2323
--- trunk/TTXSamples/TTXttyrec/TTXttyplay.c (revision 9435)
+++ trunk/TTXSamples/TTXttyrec/TTXttyplay.c (revision 9436)
@@ -402,17 +402,17 @@
402402 }
403403 }
404404
405-static void PASCAL TTXParseParam(PCHAR Param, PTTSet ts, PCHAR DDETopic) {
406- char buff[1024];
407- PCHAR next;
405+static void PASCAL TTXParseParam(wchar_t *Param, PTTSet ts, PCHAR DDETopic) {
406+ wchar_t buff[1024];
407+ wchar_t *next;
408408 pvar->origParseParam(Param, ts, DDETopic);
409409
410410 next = Param;
411411 while (next = GetParam(buff, sizeof(buff), next)) {
412- if (_strnicmp(buff, "/ttyplay-nowait", 16) == 0 || _strnicmp(buff, "/tpnw", 6) == 0) {
412+ if (_wcsnicmp(buff, L"/ttyplay-nowait", 16) == 0 || _wcsnicmp(buff, L"/tpnw", 6) == 0) {
413413 pvar->nowait = TRUE;
414414 }
415- else if (_strnicmp(buff, "/TTYPLAY", 9) == 0 || _strnicmp(buff, "/TP", 4) == 0) {
415+ else if (_wcsnicmp(buff, L"/TTYPLAY", 9) == 0 || _wcsnicmp(buff, L"/TP", 4) == 0) {
416416 pvar->enable = TRUE;
417417 }
418418 }
--- trunk/teraterm/teraterm/ttdde.c (revision 9435)
+++ trunk/teraterm/teraterm/ttdde.c (revision 9436)
@@ -48,6 +48,7 @@
4848
4949 #include "filesys.h"
5050 #include "sendmem.h"
51+#include "codeconv.h"
5152
5253 #define ServiceName "TERATERM"
5354 #define ItemName "DATA"
@@ -473,8 +474,11 @@
473474 char Temp[MaxStrLen + 2];
474475 strncpy_s(Temp, sizeof(Temp),"a ", _TRUNCATE); // dummy exe name
475476 strncat_s(Temp,sizeof(Temp),ParamFileName,_TRUNCATE);
476- if (LoadTTSET())
477- (*ParseParam)(Temp, &ts, NULL);
477+ if (LoadTTSET()) {
478+ wchar_t *commandline = ToWcharA(Temp);
479+ (*ParseParam)(commandline, &ts, NULL);
480+ free(commandline);
481+ }
478482 FreeTTSET();
479483 cv.NoMsg = 1; /* suppress error messages */
480484 PostMessage(HVTWin,WM_USER_COMMSTART,0,0);
--- trunk/teraterm/teraterm/vtwin.cpp (revision 9435)
+++ trunk/teraterm/teraterm/vtwin.cpp (revision 9436)
@@ -238,7 +238,6 @@
238238 WNDCLASSW wc;
239239 RECT rect;
240240 DWORD Style;
241- char *Param;
242241 int CmdShow;
243242 int fuLoad = LR_DEFAULTCOLOR;
244243 BOOL isFirstInstance;
@@ -277,9 +276,9 @@
277276 /* Parse command line parameters*/
278277 // 256バイト以上のコマンドラインパラメータ指定があると、BOF(Buffer Over Flow)で
279278 // 落ちるバグを修正。(2007.6.12 maya)
280- Param = GetCommandLine();
281279 if (LoadTTSET()) {
282- (*ParseParam)(Param, &ts, &(TopicName[0]));
280+ wchar_t *ParamW = GetCommandLineW();
281+ (*ParseParam)(ParamW, &ts, &(TopicName[0]));
283282 }
284283 FreeTTSET();
285284
@@ -3516,10 +3515,11 @@
35163515 ts.ProtocolFamily = GetHNRec.ProtocolFamily;
35173516 ts.ComPort = GetHNRec.ComPort;
35183517
3519- if ((GetHNRec.PortType==IdTCPIP) &&
3520- LoadTTSET()) {
3521- (*ParseParam)(Command, &ts, NULL);
3518+ if ((GetHNRec.PortType==IdTCPIP) && LoadTTSET()) {
3519+ wchar_t *commandW = ToWcharA(Command);
3520+ (*ParseParam)(commandW, &ts, NULL);
35223521 FreeTTSET();
3522+ free(commandW);
35233523 }
35243524 SetKeyMap();
35253525 if (ts.MacroFN[0]!=0) {
--- trunk/teraterm/ttpset/ttset.c (revision 9435)
+++ trunk/teraterm/ttpset/ttset.c (revision 9436)
@@ -175,11 +175,12 @@
175175 * TRUE: 変換成功
176176 * FALSE: 変換失敗
177177 */
178-static int SerialPortConfconvertStr2Id(enum serial_port_conf type, PCHAR str, WORD *id)
178+static int SerialPortConfconvertStr2Id(enum serial_port_conf type, const wchar_t *str, WORD *id)
179179 {
180180 id_str_pair_t *conf;
181181 int ret = FALSE;
182182 int i;
183+ char *strA;
183184
184185 switch (type) {
185186 case COM_DATABIT:
@@ -198,25 +199,26 @@
198199 conf = NULL;
199200 break;
200201 }
201- if (conf == NULL)
202- goto error;
202+ if (conf == NULL) {
203+ return FALSE;
204+ }
203205
206+ strA = ToCharW(str);
204207 for (i = 0 ; ; i++) {
205- if (conf[i].id == IDENDMARK)
206- goto error;
207- if (_stricmp(conf[i].str, str) == 0) {
208+ if (conf[i].id == IDENDMARK) {
209+ ret = FALSE;
210+ break;
211+ }
212+ if (_stricmp(conf[i].str, strA) == 0) {
208213 *id = conf[i].id;
214+ ret = TRUE;
209215 break;
210216 }
211217 }
212-
213- ret = TRUE;
214-
215-error:
216- return (ret);
218+ free(strA);
219+ return ret;
217220 }
218221
219-
220222 WORD str2id(PCHAR far * List, PCHAR str, WORD DefId)
221223 {
222224 WORD i;
@@ -247,31 +249,32 @@
247249 strncpy_s(str, destlen, List[i], _TRUNCATE);
248250 }
249251
250-int IconName2IconId(const char *name) {
252+static int IconName2IconId(const wchar_t *name)
253+{
251254 int id;
252255
253- if (_stricmp(name, "tterm") == 0) {
256+ if (_wcsicmp(name, L"tterm") == 0) {
254257 id = IDI_TTERM;
255258 }
256- else if (_stricmp(name, "vt") == 0) {
259+ else if (_wcsicmp(name, L"vt") == 0) {
257260 id = IDI_VT;
258261 }
259- else if (_stricmp(name, "tek") == 0) {
262+ else if (_wcsicmp(name, L"tek") == 0) {
260263 id = IDI_TEK;
261264 }
262- else if (_stricmp(name, "tterm_classic") == 0) {
265+ else if (_wcsicmp(name, L"tterm_classic") == 0) {
263266 id = IDI_TTERM_CLASSIC;
264267 }
265- else if (_stricmp(name, "vt_classic") == 0) {
268+ else if (_wcsicmp(name, L"vt_classic") == 0) {
266269 id = IDI_VT_CLASSIC;
267270 }
268- else if (_stricmp(name, "tterm_3d") == 0) {
271+ else if (_wcsicmp(name, L"tterm_3d") == 0) {
269272 id = IDI_TTERM_3D;
270273 }
271- else if (_stricmp(name, "vt_3d") == 0) {
274+ else if (_wcsicmp(name, L"vt_3d") == 0) {
272275 id = IDI_VT_3D;
273276 }
274- else if (_stricmp(name, "cygterm") == 0) {
277+ else if (_wcsicmp(name, L"cygterm") == 0) {
275278 id = IDI_CYGTERM;
276279 }
277280 else {
@@ -280,6 +283,15 @@
280283 return id;
281284 }
282285
286+static int IconName2IconIdA(const char *name)
287+{
288+ wchar_t *nameW = ToWcharA(name);
289+ int id = IconName2IconId(nameW);
290+ free(nameW);
291+ return id;
292+}
293+
294+
283295 void IconId2IconName(char *name, int len, int id) {
284296 char *icon;
285297 switch (id) {
@@ -719,6 +731,7 @@
719731 int i;
720732 HDC TmpDC;
721733 char Temp[MAX_PATH], Temp2[MAX_PATH], *p;
734+ wchar_t TempW[MAX_PATH];
722735
723736 ts->Minimize = 0;
724737 ts->HideWindow = 0;
@@ -1198,30 +1211,30 @@
11981211 ts->Baud = GetPrivateProfileInt(Section, "BaudRate", 9600, FName);
11991212
12001213 /* Parity */
1201- GetPrivateProfileString(Section, "Parity", "",
1202- Temp, sizeof(Temp), FName);
1203- if (!SerialPortConfconvertStr2Id(COM_PARITY, Temp, &ts->Parity)) {
1214+ GetPrivateProfileStringW(SectionW, L"Parity", L"",
1215+ TempW, _countof(TempW), FName);
1216+ if (!SerialPortConfconvertStr2Id(COM_PARITY, TempW, &ts->Parity)) {
12041217 ts->Parity = IdParityNone;
12051218 }
12061219
12071220 /* Data bit */
1208- GetPrivateProfileString(Section, "DataBit", "",
1209- Temp, sizeof(Temp), FName);
1210- if (!SerialPortConfconvertStr2Id(COM_DATABIT, Temp, &ts->DataBit)) {
1221+ GetPrivateProfileStringW(SectionW, L"DataBit", L"",
1222+ TempW, _countof(TempW), FName);
1223+ if (!SerialPortConfconvertStr2Id(COM_DATABIT, TempW, &ts->DataBit)) {
12111224 ts->DataBit = IdDataBit8;
12121225 }
12131226
12141227 /* Stop bit */
1215- GetPrivateProfileString(Section, "StopBit", "",
1216- Temp, sizeof(Temp), FName);
1217- if (!SerialPortConfconvertStr2Id(COM_STOPBIT, Temp, &ts->StopBit)) {
1228+ GetPrivateProfileStringW(SectionW, L"StopBit", L"",
1229+ TempW, _countof(TempW), FName);
1230+ if (!SerialPortConfconvertStr2Id(COM_STOPBIT, TempW, &ts->StopBit)) {
12181231 ts->StopBit = IdStopBit1;
12191232 }
12201233
12211234 /* Flow control */
1222- GetPrivateProfileString(Section, "FlowCtrl", "",
1223- Temp, sizeof(Temp), FName);
1224- if (!SerialPortConfconvertStr2Id(COM_FLOWCTRL, Temp, &ts->Flow)) {
1235+ GetPrivateProfileStringW(SectionW, L"FlowCtrl", L"",
1236+ TempW, _countof(TempW), FName);
1237+ if (!SerialPortConfconvertStr2Id(COM_FLOWCTRL, TempW, &ts->Flow)) {
12251238 ts->Flow = IdFlowNone;
12261239 }
12271240
@@ -1820,12 +1833,12 @@
18201833 // VT Window Icon
18211834 GetPrivateProfileString(Section, "VTIcon", "Default",
18221835 Temp, sizeof(Temp), FName);
1823- ts->VTIcon = IconName2IconId(Temp);
1836+ ts->VTIcon = IconName2IconIdA(Temp);
18241837
18251838 // Tek Window Icon
18261839 GetPrivateProfileString(Section, "TEKIcon", "Default",
18271840 Temp, sizeof(Temp), FName);
1828- ts->TEKIcon = IconName2IconId(Temp);
1841+ ts->TEKIcon = IconName2IconIdA(Temp);
18291842
18301843 // Unknown Unicode Character
18311844 ts->UnknownUnicodeCharaAsWide =
@@ -2254,7 +2267,7 @@
22542267 if (ts->UnicodeAmbiguousWidth < 1 || 2 < ts->UnicodeAmbiguousWidth) {
22552268 ts->UnicodeAmbiguousWidth = 1;
22562269 }
2257- ts->UnicodeEmojiOverride = GetOnOff(Section, "UnicodeEmojiOverride", FName, FALSE);
2270+ ts->UnicodeEmojiOverride = (BYTE)GetOnOff(Section, "UnicodeEmojiOverride", FName, FALSE);
22582271 ts->UnicodeEmojiWidth = GetPrivateProfileInt(Section, "UnicodeEmojiWidth", 1, FName);
22592272 if (ts->UnicodeEmojiWidth < 1 || 2 < ts->UnicodeEmojiWidth) {
22602273 ts->UnicodeEmojiWidth = 1;
@@ -3725,7 +3738,7 @@
37253738 }
37263739 #endif
37273740
3728-static int ParsePortName(char *buff)
3741+static int ParsePortName(const char *buff)
37293742 {
37303743 int port = parse_port_from_buf(buff);
37313744
@@ -3735,6 +3748,14 @@
37353748 return 0;
37363749 }
37373750
3751+static int ParsePortNameW(const wchar_t *buff)
3752+{
3753+ char *buffA = ToCharW(buff);
3754+ int port = ParsePortName(buffA);
3755+ free(buffA);
3756+ return port;
3757+}
3758+
37383759 static void ParseHostName(char *HostStr, WORD * port)
37393760 {
37403761 /*
@@ -3824,13 +3845,12 @@
38243845 }
38253846
38263847
3827-void PASCAL ParseParam(PCHAR Param, PTTSet ts, PCHAR DDETopic)
3848+void PASCAL ParseParam(wchar_t *Param, PTTSet ts, PCHAR DDETopic)
38283849 {
38293850 int i, pos, c;
38303851 //int param_top;
3831- char Temp[MaxStrLen]; // ttpmacroから呼ばれることを想定しMaxStrLenサイズとする
3832- char Temp2[MaxStrLen];
3833- char TempDir[MAXPATHLEN];
3852+ wchar_t Temp[MaxStrLen]; // ttpmacroから呼ばれることを想定しMaxStrLenサイズとする
3853+ wchar_t Temp2[MaxStrLen];
38343854 WORD ParamPort = 0;
38353855 WORD ParamCom = 0;
38363856 WORD ParamTCP = 0;
@@ -3839,7 +3859,7 @@
38393859 DWORD ParamBaud = BaudNone;
38403860 BOOL HostNameFlag = FALSE;
38413861 BOOL JustAfterHost = FALSE;
3842- PCHAR start, cur, next, p;
3862+ wchar_t *start, *cur, *next;
38433863
38443864 ts->HostName[0] = 0;
38453865 //ts->KeyCnfFN[0] = 0;
@@ -3855,21 +3875,20 @@
38553875 DDETopic[0] = 0;
38563876 i = 0;
38573877 /* the first term shuld be executable filename of Tera Term */
3858- start = GetParam(Temp, sizeof(Temp), Param);
3878+ start = GetParam(Temp, _countof(Temp), Param);
38593879
38603880 cur = start;
3861- while (next = GetParam(Temp, sizeof(Temp), cur)) {
3862- DequoteParam(Temp, sizeof(Temp), Temp);
3863- if (_strnicmp(Temp, "/F=", 3) == 0) { /* setup filename */
3864- strncpy_s(Temp2, sizeof(Temp2), &Temp[3], _TRUNCATE);
3865- if (strlen(Temp2) > 0) {
3866- ConvFName(ts->HomeDir, Temp2, sizeof(Temp2), ".INI", Temp,
3867- sizeof(Temp));
3868- if (_stricmp(ts->SetupFName, Temp) != 0) {
3869- strncpy_s(ts->SetupFName, sizeof(ts->SetupFName), Temp,
3870- _TRUNCATE);
3881+ while (next = GetParam(Temp, _countof(Temp), cur)) {
3882+ DequoteParam(Temp, _countof(Temp), Temp);
3883+ if (_wcsnicmp(Temp, L"/F=", 3) == 0) { /* setup filename */
3884+ wcsncpy_s(Temp2, _countof(Temp2), &Temp[3], _TRUNCATE);
3885+ if (Temp2[0] != 0) {
3886+ ConvFNameW(ts->HomeDirW, Temp2, _countof(Temp2), L".INI", Temp,
3887+ _countof(Temp));
3888+ if (_wcsicmp(ts->SetupFNameW, Temp) != 0) {
38713889 free(ts->SetupFNameW);
3872- ts->SetupFNameW = ToWcharA(ts->SetupFName);
3890+ ts->SetupFNameW = _wcsdup(Temp);
3891+ WideCharToACP_t(ts->SetupFNameW, ts->SetupFName, _countof(ts->SetupFName));
38733892 ReadIniFile(ts->SetupFNameW, ts);
38743893 }
38753894 }
@@ -3878,8 +3897,8 @@
38783897 }
38793898
38803899 cur = start;
3881- while (next = GetParam(Temp, sizeof(Temp), cur)) {
3882- DequoteParam(Temp, sizeof(Temp), Temp);
3900+ while (next = GetParam(Temp, _countof(Temp), cur)) {
3901+ DequoteParam(Temp, _countof(Temp), Temp);
38833902
38843903 if (HostNameFlag) {
38853904 JustAfterHost = TRUE;
@@ -3886,129 +3905,136 @@
38863905 HostNameFlag = FALSE;
38873906 }
38883907
3889- if (_strnicmp(Temp, "/AUTOWINCLOSE=", 14) == 0) { /* AutoWinClose=on|off */
3890- char *s = &Temp[14];
3891- if (_stricmp(s, "on") == 0)
3908+ if (_wcsnicmp(Temp, L"/AUTOWINCLOSE=", 14) == 0) { /* AutoWinClose=on|off */
3909+ wchar_t *s = &Temp[14];
3910+ if (_wcsicmp(s, L"on") == 0)
38923911 ts->AutoWinClose = 1;
38933912 else
38943913 ts->AutoWinClose = 0;
38953914 }
3896- else if (_strnicmp(Temp, "/SPEED=", 7) == 0) { /* Serial port speed */
3915+ else if (_wcsnicmp(Temp, L"/SPEED=", 7) == 0) { /* Serial port speed */
38973916 ParamPort = IdSerial;
3898- ParamBaud = atoi(&Temp[7]);
3917+ ParamBaud = _wtoi(&Temp[7]);
38993918 }
3900- else if (_strnicmp(Temp, "/BAUD=", 6) == 0) { /* for backward compatibility */
3919+ else if (_wcsnicmp(Temp, L"/BAUD=", 6) == 0) { /* for backward compatibility */
39013920 ParamPort = IdSerial;
3902- ParamBaud = atoi(&Temp[6]);
3921+ ParamBaud = _wtoi(&Temp[6]);
39033922 }
3904- else if (_stricmp(Temp, "/B") == 0) { /* telnet binary */
3923+ else if (_wcsicmp(Temp, L"/B") == 0) { /* telnet binary */
39053924 ParamPort = IdTCPIP;
39063925 ParamBin = 1;
39073926 }
3908- else if (_strnicmp(Temp, "/C=", 3) == 0) { /* COM port num */
3927+ else if (_wcsnicmp(Temp, L"/C=", 3) == 0) { /* COM port num */
39093928 ParamPort = IdSerial;
3910- ParamCom = atoi(&Temp[3]);
3929+ ParamCom = _wtoi(&Temp[3]);
39113930 if ((ParamCom < 1) || (ParamCom > ts->MaxComPort))
39123931 ParamCom = 0;
39133932 }
3914- else if (_strnicmp(Temp, "/CDATABIT=", 10) == 0) { /* COM data bit */
3933+ else if (_wcsnicmp(Temp, L"/CDATABIT=", 10) == 0) { /* COM data bit */
39153934 ParamPort = IdSerial;
39163935 SerialPortConfconvertStr2Id(COM_DATABIT, &Temp[10], &ts->DataBit);
39173936 }
3918- else if (_strnicmp(Temp, "/CPARITY=", 9) == 0) { /* COM Parity */
3937+ else if (_wcsnicmp(Temp, L"/CPARITY=", 9) == 0) { /* COM Parity */
39193938 ParamPort = IdSerial;
39203939 SerialPortConfconvertStr2Id(COM_PARITY, &Temp[9], &ts->Parity);
39213940 }
3922- else if (_strnicmp(Temp, "/CSTOPBIT=", 10) == 0) { /* COM Stop bit */
3941+ else if (_wcsnicmp(Temp, L"/CSTOPBIT=", 10) == 0) { /* COM Stop bit */
39233942 ParamPort = IdSerial;
39243943 SerialPortConfconvertStr2Id(COM_STOPBIT, &Temp[10], &ts->StopBit);
39253944 }
3926- else if (_strnicmp(Temp, "/CFLOWCTRL=", 11) == 0) { /* COM Flow control */
3945+ else if (_wcsnicmp(Temp, L"/CFLOWCTRL=", 11) == 0) { /* COM Flow control */
39273946 ParamPort = IdSerial;
39283947 SerialPortConfconvertStr2Id(COM_FLOWCTRL, &Temp[11], &ts->Flow);
39293948 }
3930- else if (_strnicmp(Temp, "/CDELAYPERCHAR=", 15) == 0) { /* COM Transmit delay per character (in msec) */
3949+ else if (_wcsnicmp(Temp, L"/CDELAYPERCHAR=", 15) == 0) { /* COM Transmit delay per character (in msec) */
39313950 WORD val = 0;
39323951
39333952 ParamPort = IdSerial;
3934- val = atoi(&Temp[15]);
3953+ val = _wtoi(&Temp[15]);
39353954 ts->DelayPerChar = val;
39363955 }
3937- else if (_strnicmp(Temp, "/CDELAYPERLINE=", 15) == 0) { /* COM Transmit delay per line (in msec) */
3956+ else if (_wcsnicmp(Temp, L"/CDELAYPERLINE=", 15) == 0) { /* COM Transmit delay per line (in msec) */
39383957 WORD val = 0;
39393958
39403959 ParamPort = IdSerial;
3941- val = atoi(&Temp[15]);
3960+ val = _wtoi(&Temp[15]);
39423961 ts->DelayPerLine = val;
39433962 }
3944- else if (_stricmp(Temp, "/WAITCOM") == 0) { /* wait COM arrival */
3963+ else if (_wcsicmp(Temp, L"/WAITCOM") == 0) { /* wait COM arrival */
39453964 ts->WaitCom = 1;
39463965 }
3947- else if (_strnicmp(Temp, "/D=", 3) == 0) {
3948- if (DDETopic != NULL)
3949- strncpy_s(DDETopic, 21, &Temp[3], _TRUNCATE); // 21 = sizeof(TopicName)
3966+ else if (_wcsnicmp(Temp, L"/D=", 3) == 0) {
3967+ if (DDETopic != NULL) {
3968+ char *DDETopicA = ToCharW(&Temp[3]);
3969+ strncpy_s(DDETopic, 21, DDETopicA, _TRUNCATE); // 21 = sizeof(TopicName)
3970+ free(DDETopicA);
3971+ }
39503972 }
39513973 // "New connection" ダイアログを表示しない (2008.11.14 maya)
3952- else if (_stricmp(Temp, "/DS") == 0) {
3974+ else if (_wcsicmp(Temp, L"/DS") == 0) {
39533975 ts->HostDialogOnStartup = FALSE;
39543976 }
39553977 // TCPLocalEcho/TCPCRSend を無効にする (maya 2007.4.25)
3956- else if (_stricmp(Temp, "/E") == 0) {
3978+ else if (_wcsicmp(Temp, L"/E") == 0) {
39573979 ts->DisableTCPEchoCR = TRUE;
39583980 }
39593981 // "New connection" ダイアログを表示する (2013.10.08 maya)
3960- else if (_stricmp(Temp, "/ES") == 0) {
3982+ else if (_wcsicmp(Temp, L"/ES") == 0) {
39613983 ts->HostDialogOnStartup = TRUE;
39623984 }
3963- else if (_strnicmp(Temp, "/FD=", 4) == 0) { /* file transfer directory */
3964- strncpy_s(Temp2, sizeof(Temp2), &Temp[4], _TRUNCATE);
3965- if (strlen(Temp2) > 0) {
3966- _getcwd(TempDir, sizeof(TempDir));
3967- if (_chdir(Temp2) == 0)
3968- strncpy_s(ts->FileDir, sizeof(ts->FileDir), Temp2,
3985+ else if (_wcsnicmp(Temp, L"/FD=", 4) == 0) { /* file transfer directory */
3986+ wcsncpy_s(Temp2, _countof(Temp2), &Temp[4], _TRUNCATE);
3987+ if (wcslen(Temp2) > 0) {
3988+ char TempDir[MAXPATHLEN];
3989+ _getcwd(TempDir, _countof(TempDir));
3990+ if (_wchdir(Temp2) == 0) {
3991+ char *FileDirA = ToCharW(Temp2);
3992+ strncpy_s(ts->FileDir, sizeof(ts->FileDir), FileDirA,
39693993 _TRUNCATE);
3994+ free(FileDirA);
3995+ }
39703996 _chdir(TempDir);
39713997 }
39723998 }
3973- else if (_stricmp(Temp, "/H") == 0) /* hide title bar */
3999+ else if (_wcsicmp(Temp, L"/H") == 0) /* hide title bar */
39744000 ts->HideTitle = 1;
3975- else if (_stricmp(Temp, "/I") == 0) /* iconize */
4001+ else if (_wcsicmp(Temp, L"/I") == 0) /* iconize */
39764002 ts->Minimize = 1;
3977- else if (_strnicmp(Temp, "/K=", 3) == 0) { /* Keyboard setup file */
3978- strncpy_s(Temp2, sizeof(Temp2), &Temp[3], _TRUNCATE);
3979- ConvFName(ts->HomeDir, Temp2, sizeof(Temp2), ".CNF",
3980- ts->KeyCnfFN, sizeof(ts->KeyCnfFN));
3981- ts->KeyCnfFNW = ToWcharA(ts->KeyCnfFN);
4003+ else if (_wcsnicmp(Temp, L"/K=", 3) == 0) { /* Keyboard setup file */
4004+ wcsncpy_s(Temp2, _countof(Temp2), &Temp[3], _TRUNCATE);
4005+ ConvFNameW(ts->HomeDirW, Temp2, _countof(Temp2), L".CNF", Temp, _countof(Temp));
4006+ ts->KeyCnfFNW = _wcsdup(Temp);
4007+ WideCharToACP_t(ts->KeyCnfFNW, ts->KeyCnfFN, _countof(ts->KeyCnfFN));
39824008 }
3983- else if ((_strnicmp(Temp, "/KR=", 4) == 0) ||
3984- (_strnicmp(Temp, "/KT=", 4) == 0)) { /* kanji code */
3985- if (_stricmp(&Temp[4], "UTF8m") == 0 ||
3986- _stricmp(&Temp[4], "UTF-8m") == 0)
4009+ else if ((_wcsnicmp(Temp, L"/KR=", 4) == 0) ||
4010+ (_wcsnicmp(Temp, L"/KT=", 4) == 0)) { /* kanji code */
4011+ if (_wcsicmp(&Temp[4], L"UTF8m") == 0 ||
4012+ _wcsicmp(&Temp[4], L"UTF-8m") == 0)
39874013 c = IdUTF8m;
3988- else if (_stricmp(&Temp[4], "UTF8") == 0 ||
3989- _stricmp(&Temp[4], "UTF-8") == 0)
4014+ else if (_wcsicmp(&Temp[4], L"UTF8") == 0 ||
4015+ _wcsicmp(&Temp[4], L"UTF-8") == 0)
39904016 c = IdUTF8;
3991- else if (_stricmp(&Temp[4], "SJIS") == 0 ||
3992- _stricmp(&Temp[4], "KS5601") == 0)
4017+ else if (_wcsicmp(&Temp[4], L"SJIS") == 0 ||
4018+ _wcsicmp(&Temp[4], L"KS5601") == 0)
39934019 c = IdSJIS;
3994- else if (_stricmp(&Temp[4], "EUC") == 0)
4020+ else if (_wcsicmp(&Temp[4], L"EUC") == 0)
39954021 c = IdEUC;
3996- else if (_stricmp(&Temp[4], "JIS") == 0)
4022+ else if (_wcsicmp(&Temp[4], L"JIS") == 0)
39974023 c = IdJIS;
39984024 else
39994025 c = -1;
40004026 if (c != -1) {
4001- if (_strnicmp(Temp, "/KR=", 4) == 0)
4027+ if (_wcsnicmp(Temp, L"/KR=", 4) == 0)
40024028 ts->KanjiCode = c;
40034029 else
40044030 ts->KanjiCodeSend = c;
40054031 }
40064032 }
4007- else if (_strnicmp(Temp, "/L=", 3) == 0) { /* log file */
4008- strncpy_s(ts->LogFN, sizeof(ts->LogFN), &Temp[3], _TRUNCATE);
4009- ts->LogFNW = ToWcharA(ts->LogFN);
4033+ else if (_wcsnicmp(Temp, L"/L=", 3) == 0) { /* log file */
4034+ ts->LogFNW = _wcsdup(&Temp[3]);
4035+ WideCharToACP_t(ts->LogFNW, ts->LogFN, _countof(ts->LogFN));
40104036 }
4011- else if (_strnicmp(Temp, "/LA=", 4) == 0) { /* language */
4037+ else if (_wcsnicmp(Temp, L"/LA=", 4) == 0) { /* language */
40124038 switch (Temp[4]) {
40134039 case 'E':
40144040 case 'e':
@@ -4027,112 +4053,115 @@
40274053 ts->Language = IdUtf8; break;
40284054 }
40294055 }
4030- else if (_strnicmp(Temp, "/MN=", 4) == 0) { /* multicastname */
4031- strncpy_s(ts->MulticastName, sizeof(ts->MulticastName), &Temp[4], _TRUNCATE);
4056+ else if (_wcsnicmp(Temp, L"/MN=", 4) == 0) { /* multicastname */
4057+ WideCharToACP_t(&Temp[4], ts->MulticastName, _countof(ts->MulticastName));
40324058 }
4033- else if (_strnicmp(Temp, "/M=", 3) == 0) { /* macro filename */
4059+ else if (_wcsnicmp(Temp, L"/M=", 3) == 0) { /* macro filename */
40344060 if ((Temp[3] == 0) || (Temp[3] == '*')) {
4035- strncpy_s(ts->MacroFN, sizeof(ts->MacroFN), "*",
4036- _TRUNCATE);
4061+ ts->MacroFNW = _wcsdup(L"*");
40374062 } else {
4038- strncpy_s(Temp2, sizeof(Temp2), &Temp[3], _TRUNCATE);
4039- ConvFName(ts->HomeDir, Temp2, sizeof(Temp2), ".TTL",
4040- ts->MacroFN, sizeof(ts->MacroFN));
4063+ wcsncpy_s(Temp2, _countof(Temp2), &Temp[3], _TRUNCATE);
4064+ ConvFNameW(ts->HomeDirW, Temp2, _countof(Temp2), L".TTL", Temp, _countof(Temp));
4065+ ts->MacroFNW = _wcsdup(Temp);
40414066 }
4067+ WideCharToACP_t(ts->MacroFNW, ts->MacroFN, _countof(ts->MacroFN));
40424068 /* Disable auto connect to serial when macro mode (2006.9.15 maya) */
4043- ts->MacroFNW = ToWcharA(ts->MacroFN);
40444069 ts->ComAutoConnect = FALSE;
40454070 }
4046- else if (_stricmp(Temp, "/M") == 0) { /* macro option without file name */
4047- strncpy_s(ts->MacroFN, sizeof(ts->MacroFN), "*", _TRUNCATE);
4048- ts->MacroFNW = ToWcharA(ts->MacroFN);
4071+ else if (_wcsicmp(Temp, L"/M") == 0) { /* macro option without file name */
4072+ ts->MacroFNW = _wcsdup(L"*");
4073+ WideCharToACP_t(ts->MacroFNW, ts->MacroFN, _countof(ts->MacroFN));
40494074 /* Disable auto connect to serial when macro mode (2006.9.15 maya) */
40504075 ts->ComAutoConnect = FALSE;
40514076 }
4052- else if (_stricmp(Temp, "/NOLOG") == 0) { /* disable auto logging */
4077+ else if (_wcsicmp(Temp, L"/NOLOG") == 0) { /* disable auto logging */
40534078 ts->LogFN[0] = '\0';
40544079 ts->LogAutoStart = 0;
40554080 }
4056- else if (_strnicmp(Temp, "/OSC52=", 7) == 0) { /* Clipboard access */
4081+ else if (_wcsnicmp(Temp, L"/OSC52=", 7) == 0) { /* Clipboard access */
40574082 ts->CtrlFlag &= ~CSF_CBMASK;
4058- if (_stricmp(&Temp[7], "on") == 0 || _stricmp(&Temp[7], "readwrite") == 0)
4083+ if (_wcsicmp(&Temp[7], L"on") == 0 || _wcsicmp(&Temp[7], L"readwrite") == 0)
40594084 ts->CtrlFlag |= CSF_CBRW;
4060- else if (_stricmp(&Temp[7], "read") == 0)
4085+ else if (_wcsicmp(&Temp[7], L"read") == 0)
40614086 ts->CtrlFlag |= CSF_CBREAD;
4062- else if (_stricmp(&Temp[7], "write") == 0)
4087+ else if (_wcsicmp(&Temp[7], L"write") == 0)
40634088 ts->CtrlFlag |= CSF_CBWRITE;
4064- else if (_stricmp(&Temp[7], "off") == 0)
4089+ else if (_wcsicmp(&Temp[7], L"off") == 0)
40654090 ts->CtrlFlag |= CSF_CBNONE;
40664091 }
4067- else if (_strnicmp(Temp, "/P=", 3) == 0) { /* TCP port num */
4092+ else if (_wcsnicmp(Temp, L"/P=", 3) == 0) { /* TCP port num */
40684093 ParamPort = IdTCPIP;
4069- ParamTCP = ParsePortName(&Temp[3]);
4094+ ParamTCP = ParsePortNameW(&Temp[3]);
40704095 }
4071- else if (_stricmp(Temp, "/PIPE") == 0 ||
4072- _stricmp(Temp, "/NAMEDPIPE") == 0) { /* 名前付きパイプ */
4096+ else if (_wcsicmp(Temp, L"/PIPE") == 0 ||
4097+ _wcsicmp(Temp, L"/NAMEDPIPE") == 0) { /* 名前付きパイプ */
40734098 ParamPort = IdNamedPipe;
40744099 }
4075- else if (_strnicmp(Temp, "/R=", 3) == 0) { /* Replay filename */
4076- strncpy_s(Temp2, sizeof(Temp2), &Temp[3], _TRUNCATE);
4077- ConvFName(ts->HomeDir, Temp2, sizeof(Temp2), "", ts->HostName,
4078- sizeof(ts->HostName));
4100+ else if (_wcsnicmp(Temp, L"/R=", 3) == 0) { /* Replay filename */
4101+ wcsncpy_s(Temp2, _countof(Temp2), &Temp[3], _TRUNCATE);
4102+ ConvFNameW(ts->HomeDirW, Temp2, _countof(Temp2), L"", Temp, _countof(Temp));
4103+ WideCharToACP_t(Temp, ts->HostName, _countof(ts->HostName));
40794104 if (strlen(ts->HostName) > 0)
40804105 ParamPort = IdFile;
40814106 }
4082- else if (_stricmp(Temp, "/T=0") == 0) { /* telnet disable */
4107+ else if (_wcsicmp(Temp, L"/T=0") == 0) { /* telnet disable */
40834108 ParamPort = IdTCPIP;
40844109 ParamTel = 0;
40854110 }
4086- else if (_stricmp(Temp, "/T=1") == 0) { /* telnet enable */
4111+ else if (_wcsicmp(Temp, L"/T=1") == 0) { /* telnet enable */
40874112 ParamPort = IdTCPIP;
40884113 ParamTel = 1;
40894114 }
4090- else if (_strnicmp(Temp, "/TEKICON=", 9) == 0) { /* Tek window icon */
4115+ else if (_wcsnicmp(Temp, L"/TEKICON=", 9) == 0) { /* Tek window icon */
40914116 ts->TEKIcon = IconName2IconId(&Temp[9]);
40924117 }
4093- else if (_strnicmp(Temp, "/VTICON=", 8) == 0) { /* VT window icon */
4118+ else if (_wcsnicmp(Temp, L"/VTICON=", 8) == 0) { /* VT window icon */
40944119 ts->VTIcon = IconName2IconId(&Temp[8]);
40954120 }
4096- else if (_stricmp(Temp, "/V") == 0) { /* invisible */
4121+ else if (_wcsicmp(Temp, L"/V") == 0) { /* invisible */
40974122 ts->HideWindow = 1;
40984123 }
4099- else if (_strnicmp(Temp, "/W=", 3) == 0) { /* Window title */
4100- strncpy_s(ts->Title, sizeof(ts->Title), &Temp[3], _TRUNCATE);
4124+ else if (_wcsnicmp(Temp, L"/W=", 3) == 0) { /* Window title */
4125+ char* TitleA = ToCharW(&Temp[3]);
4126+ strncpy_s(ts->Title, sizeof(ts->Title), TitleA, _TRUNCATE);
4127+ free(TitleA);
41014128 }
4102- else if (_strnicmp(Temp, "/X=", 3) == 0) { /* Window pos (X) */
4103- if (sscanf(&Temp[3], "%d", &pos) == 1) {
4129+ else if (_wcsnicmp(Temp, L"/X=", 3) == 0) { /* Window pos (X) */
4130+ if (swscanf(&Temp[3], L"%d", &pos) == 1) {
41044131 ts->VTPos.x = pos;
41054132 if (ts->VTPos.y == CW_USEDEFAULT)
41064133 ts->VTPos.y = 0;
41074134 }
41084135 }
4109- else if (_strnicmp(Temp, "/Y=", 3) == 0) { /* Window pos (Y) */
4110- if (sscanf(&Temp[3], "%d", &pos) == 1) {
4136+ else if (_wcsnicmp(Temp, L"/Y=", 3) == 0) { /* Window pos (Y) */
4137+ if (swscanf(&Temp[3], L"%d", &pos) == 1) {
41114138 ts->VTPos.y = pos;
41124139 if (ts->VTPos.x == CW_USEDEFAULT)
41134140 ts->VTPos.x = 0;
41144141 }
41154142 }
4116- else if (_stricmp(Temp, "/4") == 0) /* Protocol Tera Term speaking */
4143+ else if (_wcsicmp(Temp, L"/4") == 0) /* Protocol Tera Term speaking */
41174144 ts->ProtocolFamily = AF_INET;
4118- else if (_stricmp(Temp, "/6") == 0)
4145+ else if (_wcsicmp(Temp, L"/6") == 0)
41194146 ts->ProtocolFamily = AF_INET6;
4120- else if (_stricmp(Temp, "/DUPLICATE") == 0) { // duplicate session (2004.12.7. yutaka)
4147+ else if (_wcsicmp(Temp, L"/DUPLICATE") == 0) { // duplicate session (2004.12.7. yutaka)
41214148 ts->DuplicateSession = 1;
41224149
41234150 }
4124- else if (_strnicmp(Temp, "/TIMEOUT=", 9) == 0) { // Connecting Timeout value (2007.1.11. yutaka)
4125- if (sscanf(&Temp[9], "%d", &pos) == 1) {
4151+ else if (_wcsnicmp(Temp, L"/TIMEOUT=", 9) == 0) { // Connecting Timeout value (2007.1.11. yutaka)
4152+ if (swscanf(&Temp[9], L"%d", &pos) == 1) {
41264153 if (pos >= 0)
41274154 ts->ConnectingTimeout = pos;
41284155 }
41294156
41304157 }
4131- else if ((Temp[0] != '/') && (strlen(Temp) > 0)) {
4132- if (JustAfterHost && ((c=ParsePortName(Temp)) > 0))
4158+ else if ((Temp[0] != '/') && (wcslen(Temp) > 0)) {
4159+ if (JustAfterHost && ((c=ParsePortNameW(Temp)) > 0))
41334160 ParamTCP = c;
41344161 else {
4135- strncpy_s(ts->HostName, sizeof(ts->HostName), Temp, _TRUNCATE); /* host name */
4162+ char *HostNameA = ToCharW(Temp);
4163+ strncpy_s(ts->HostName, sizeof(ts->HostName), HostNameA, _TRUNCATE); /* host name */
4164+ free(HostNameA);
41364165 if (ParamPort == IdNamedPipe) {
41374166 // 何もしない。
41384167
@@ -4187,14 +4216,15 @@
41874216 break;
41884217 case IdNamedPipe:
41894218 if (ts->HostName[0] != 0 && ts->HostName[0] != '\\') {
4190- if (p = strchr(ts->HostName, '\\')) {
4219+ char * p = strchr(ts->HostName, '\\');
4220+ if (p == NULL) {
41914221 *p++ = '\0';
4192- _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "\\\\%s\\pipe\\%s", ts->HostName, p);
4222+ _snwprintf_s(Temp, _countof(Temp), _TRUNCATE, L"\\\\%hs\\pipe\\%hs", ts->HostName, p);
41934223 }
41944224 else {
4195- _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "\\\\.\\pipe\\%s", ts->HostName);
4225+ _snwprintf_s(Temp, _countof(Temp), _TRUNCATE, L"\\\\.\\pipe\\%hs", ts->HostName);
41964226 }
4197- strncpy_s(ts->HostName, sizeof(ts->HostName), Temp, _TRUNCATE);
4227+ WideCharToACP_t(Temp, ts->HostName, _countof(ts->HostName));
41984228 }
41994229 ts->PortType = IdNamedPipe;
42004230 ts->ComPort = 0;
--- trunk/ttssh2/ttxssh/ttxssh.c (revision 9435)
+++ trunk/ttssh2/ttxssh/ttxssh.c (revision 9436)
@@ -57,6 +57,7 @@
5757 #include <commctrl.h>
5858 #include <commdlg.h>
5959 #include <winsock2.h>
60+#include <wchar.h>
6061
6162 #include <lmcons.h>
6263
@@ -88,6 +89,7 @@
8889 #include "codeconv.h"
8990 #include "inifile_com.h"
9091 #include "asprintf.h"
92+#include "win32helper.h"
9193
9294 #include "libputty.h"
9395
@@ -107,9 +109,6 @@
107109 #define GetPrivateProfileStringA(p1, p2, p3, p4, p5, p6) GetPrivateProfileStringAFileW(p1, p2, p3, p4, p5, p6)
108110 #define WritePrivateProfileStringA(p1, p2, p3, p4) WritePrivateProfileStringAFileW(p1, p2, p3, p4)
109111
110-#define MATCH_STR(s, o) strncmp((s), (o), NUM_ELEM(o) - 1)
111-#define MATCH_STR_I(s, o) _strnicmp((s), (o), NUM_ELEM(o) - 1)
112-
113112 /* This extension implements SSH, so we choose a load order in the
114113 "protocols" range. */
115114 #define ORDER 2500
@@ -1384,7 +1383,7 @@
13841383
13851384 // Percent-encodeされた文字列srcをデコードしてdstにコピーする。
13861385 // dstlenはdstのサイズ。これより結果が長い場合、その分は切り捨てられる。
1387-static void percent_decode(char *dst, int dstlen, char *src) {
1386+static void percent_decode(char *dst, int dstlen, const wchar_t *src) {
13881387 if (src == NULL || dst == NULL || dstlen < 1) {
13891388 return;
13901389 }
@@ -1396,7 +1395,7 @@
13961395 src++; dst++;
13971396 }
13981397 else {
1399- *dst++ = *src++;
1398+ *dst++ = (char)*src++;
14001399 }
14011400 dstlen--;
14021401 }
@@ -1404,8 +1403,9 @@
14041403 return;
14051404 }
14061405
1407-void add_forward_param(PTInstVar pvar, char *param)
1406+static void add_forward_param(PTInstVar pvar, const wchar_t *paramW)
14081407 {
1408+ char *param = ToCharW(paramW);
14091409 if (pvar->settings.DefaultForwarding[0] == 0) {
14101410 strncpy_s(pvar->settings.DefaultForwarding,
14111411 sizeof(pvar->settings.DefaultForwarding),
@@ -1418,15 +1418,17 @@
14181418 sizeof(pvar->settings.DefaultForwarding),
14191419 param, _TRUNCATE);
14201420 }
1421+ free(param);
14211422 }
14221423
1423-static void PASCAL TTXParseParam(PCHAR param, PTTSet ts, PCHAR DDETopic) {
1424- int param_len=strlen(param);
1424+static void PASCAL TTXParseParam(wchar_t *param, PTTSet ts, PCHAR DDETopic)
1425+{
1426+ int param_len = wcslen(param);
14251427 int opt_len = param_len+1;
1426- char *option = (char *)calloc(opt_len, sizeof(char));
1427- char *option2 = (char *)calloc(opt_len, sizeof(char));
1428+ wchar_t *option = (wchar_t *)calloc(opt_len, sizeof(wchar_t));
1429+ wchar_t *option2 = (wchar_t *)calloc(opt_len, sizeof(wchar_t));
14281430 int action;
1429- PCHAR start, cur, next;
1431+ wchar_t *start, *cur, *next;
14301432 size_t i;
14311433
14321434 if (pvar->hostdlg_activated) {
@@ -1442,29 +1444,22 @@
14421444 action = OPTION_NONE;
14431445
14441446 if ((option[0] == '-' || option[0] == '/')) {
1445- wchar_t* option2W;
1446- if (MATCH_STR(option + 1, "ssh") == 0) {
1447- if (MATCH_STR(option + 4, "-f=") == 0) {
1448- strncpy_s(option2, opt_len, option + 7, _TRUNCATE);
1449- option2W = ToWcharA(option2);
1450- read_ssh_options_from_user_file(pvar, option2W);
1451- free(option2W);
1447+ if (wcsncmp(option + 1, L"ssh", 3) == 0) {
1448+ if (wcsncmp(option + 4, L"-f=", 3) == 0) {
1449+ const wchar_t *file = option + 7;
1450+ read_ssh_options_from_user_file(pvar, file);
14521451 action = OPTION_CLEAR;
1453- } else if (MATCH_STR(option + 4, "-consume=") == 0) {
1454- strncpy_s(option2, opt_len, option + 13, _TRUNCATE);
1455- option2W = ToWcharA(option2);
1456- read_ssh_options_from_user_file(pvar, option2W);
1457- free(option2W);
1458- DeleteFile(option2);
1452+ } else if (wcsncmp(option + 4, L"-consume=", 9) == 0) {
1453+ const wchar_t* file = option + 13;
1454+ read_ssh_options_from_user_file(pvar, file);
1455+ DeleteFileW(file);
14591456 action = OPTION_CLEAR;
14601457 }
14611458
14621459 // ttermpro.exe の /F= 指定でも TTSSH の設定を読む (2006.10.11 maya)
1463- } else if (MATCH_STR_I(option + 1, "f=") == 0) {
1464- strncpy_s(option2, opt_len, option + 3, _TRUNCATE);
1465- option2W = ToWcharA(option2);
1466- read_ssh_options_from_user_file(pvar, option2W);
1467- free(option2W);
1460+ } else if (_wcsnicmp(option + 1, L"f=", 2) == 0) {
1461+ const wchar_t *file = option + 3;
1462+ read_ssh_options_from_user_file(pvar, file);
14681463 // Tera Term側でも解釈する必要があるので消さない
14691464 }
14701465 }
@@ -1471,11 +1466,11 @@
14711466
14721467 switch (action) {
14731468 case OPTION_CLEAR:
1474- memset(cur, ' ', next-cur);
1469+ wmemset(cur, ' ', next-cur);
14751470 break;
14761471 case OPTION_REPLACE:
1477- memset(cur, ' ', next-cur);
1478- memcpy(cur+1, option, strlen(option));
1472+ wmemset(cur, ' ', next-cur);
1473+ wmemcpy(cur+1, option, wcslen(option));
14791474 break;
14801475 }
14811476
@@ -1489,13 +1484,13 @@
14891484
14901485 if ((option[0] == '-' || option[0] == '/')) {
14911486 action = OPTION_CLEAR;
1492- if (MATCH_STR(option + 1, "ssh") == 0) {
1487+ if (wcsncmp(option + 1, L"ssh", 3) == 0) {
14931488 if (option[4] == 0) {
14941489 pvar->settings.Enabled = 1;
1495- } else if (MATCH_STR(option + 4, "-L") == 0 ||
1496- MATCH_STR(option + 4, "-R") == 0 ||
1497- MATCH_STR(option + 4, "-D") == 0) {
1498- char *p = option + 5;
1490+ } else if (wcsncmp(option + 4, L"-L", 3) == 0 ||
1491+ wcsncmp(option + 4, L"-R", 3) == 0 ||
1492+ wcsncmp(option + 4, L"-D", 3) == 0) {
1493+ wchar_t *p = option + 5;
14991494 option2[0] = *p;
15001495 i = 1;
15011496 while (*++p) {
@@ -1512,36 +1507,38 @@
15121507 option2[i] = 0;
15131508 add_forward_param(pvar, option2);
15141509 }
1515- } else if (MATCH_STR(option + 4, "-X") == 0) {
1516- add_forward_param(pvar, "X");
1510+ } else if (wcsncmp(option + 4, L"-X", 2) == 0) {
1511+ add_forward_param(pvar, L"X");
15171512 if (option+6 != 0) {
1513+ char *option6 = ToCharW(option + 6);
15181514 strncpy_s(pvar->settings.X11Display,
15191515 sizeof(pvar->settings.X11Display),
1520- option + 6, _TRUNCATE);
1516+ option6, _TRUNCATE);
1517+ free(option6);
15211518 }
1522- } else if (strcmp(option + 4, "-v") == 0) {
1519+ } else if (wcscmp(option + 4, L"-v") == 0) {
15231520 pvar->settings.LogLevel = LOG_LEVEL_VERBOSE;
1524- } else if (_stricmp(option + 4, "-autologin") == 0 ||
1525- _stricmp(option + 4, "-autologon") == 0) {
1521+ } else if (_wcsicmp(option + 4, L"-autologin") == 0 ||
1522+ _wcsicmp(option + 4, L"-autologon") == 0) {
15261523 pvar->settings.TryDefaultAuth = TRUE;
1527- } else if (MATCH_STR_I(option + 4, "-agentconfirm=") == 0) {
1528- if ((_stricmp(option+18, "off") == 0) ||
1529- (_stricmp(option+18, "no") == 0) ||
1530- (_stricmp(option+18, "false") == 0) ||
1531- (_stricmp(option+18, "0") == 0) ||
1532- (_stricmp(option+18, "n") == 0)) {
1524+ } else if (_wcsnicmp(option + 4, L"-agentconfirm=", 14) == 0) {
1525+ if ((_wcsicmp(option+18, L"off") == 0) ||
1526+ (_wcsicmp(option+18, L"no") == 0) ||
1527+ (_wcsicmp(option+18, L"false") == 0) ||
1528+ (_wcsicmp(option+18, L"0") == 0) ||
1529+ (_wcsicmp(option+18, L"n") == 0)) {
15331530 pvar->settings.ForwardAgentConfirm = 0;
15341531 }
15351532 else {
15361533 pvar->settings.ForwardAgentConfirm = 1;
15371534 }
1538- } else if (strcmp(option + 4, "-a") == 0) {
1535+ } else if (wcscmp(option + 4, L"-a") == 0) {
15391536 pvar->settings.ForwardAgent = FALSE;
1540- } else if (strcmp(option + 4, "-A") == 0) {
1537+ } else if (wcscmp(option + 4, L"-A") == 0) {
15411538 pvar->settings.ForwardAgent = TRUE;
15421539
1543- } else if (MATCH_STR(option + 4, "-C=") == 0) {
1544- pvar->settings.CompressionLevel = atoi(option+7);
1540+ } else if (wcsncmp(option + 4, L"-C=", 3) == 0) {
1541+ pvar->settings.CompressionLevel = _wtoi(option+7);
15451542 if (pvar->settings.CompressionLevel < 0) {
15461543 pvar->settings.CompressionLevel = 0;
15471544 }
@@ -1548,36 +1545,38 @@
15481545 else if (pvar->settings.CompressionLevel > 9) {
15491546 pvar->settings.CompressionLevel = 9;
15501547 }
1551- } else if (strcmp(option + 4, "-C") == 0) {
1548+ } else if (wcscmp(option + 4, L"-C") == 0) {
15521549 pvar->settings.CompressionLevel = 6;
1553- } else if (strcmp(option + 4, "-c") == 0) {
1550+ } else if (wcscmp(option + 4, L"-c") == 0) {
15541551 pvar->settings.CompressionLevel = 0;
1555- } else if (MATCH_STR_I(option + 4, "-icon=") == 0) {
1556- if ((_stricmp(option+10, "old") == 0) ||
1557- (_stricmp(option+10, "yellow") == 0) ||
1558- (_stricmp(option+10, "securett_yellow") == 0)) {
1552+ } else if (_wcsnicmp(option + 4, L"-icon=", 6) == 0) {
1553+ if ((_wcsicmp(option+10, L"old") == 0) ||
1554+ (_wcsicmp(option+10, L"yellow") == 0) ||
1555+ (_wcsicmp(option+10, L"securett_yellow") == 0)) {
15591556 pvar->settings.IconID = IDI_SECURETT_YELLOW;
15601557 }
1561- else if ((_stricmp(option+10, "green") == 0) ||
1562- (_stricmp(option+10, "securett_green") == 0)) {
1558+ else if ((_wcsicmp(option+10, L"green") == 0) ||
1559+ (_wcsicmp(option+10, L"securett_green") == 0)) {
15631560 pvar->settings.IconID = IDI_SECURETT_GREEN;
15641561 }
15651562 else {
15661563 pvar->settings.IconID = IDI_SECURETT;
15671564 }
1568- } else if (MATCH_STR(option + 4, "-subsystem=") == 0) {
1565+ } else if (wcsncmp(option + 4, L"-subsystem=", 11) == 0) {
1566+ char *option15 = ToCharW(option + 15);
15691567 pvar->use_subsystem = TRUE;
15701568 strncpy_s(pvar->subsystem_name,
15711569 sizeof(pvar->subsystem_name),
1572- option + 15, _TRUNCATE);
1573- } else if (strcmp(option + 4, "-N") == 0) {
1570+ option15, _TRUNCATE);
1571+ free(option15);
1572+ } else if (wcscmp(option + 4, L"-N") == 0) {
15741573 pvar->nosession = TRUE;
15751574
15761575 // /ssh1 と /ssh2 オプションの新規追加 (2006.9.16 maya)
1577- } else if (strcmp(option + 4, "1") == 0) {
1576+ } else if (wcscmp(option + 4, L"1") == 0) {
15781577 pvar->settings.Enabled = 1;
15791578 pvar->settings.ssh_protocol_version = 1;
1580- } else if (strcmp(option + 4, "2") == 0) {
1579+ } else if (wcscmp(option + 4, L"2") == 0) {
15811580 pvar->settings.Enabled = 1;
15821581 pvar->settings.ssh_protocol_version = 2;
15831582
@@ -1592,8 +1591,8 @@
15921591 }
15931592
15941593 // ttermpro.exe の /T= 指定の流用なので、大文字も許す (2006.10.19 maya)
1595- } else if (MATCH_STR_I(option + 1, "t=") == 0) {
1596- if (strcmp(option + 3, "2") == 0) {
1594+ } else if (_wcsnicmp(option + 1, L"t=", 2) == 0) {
1595+ if (wcscmp(option + 3, L"2") == 0) {
15971596 pvar->settings.Enabled = 1;
15981597 // /t=2はttssh側での拡張なので消す
15991598 } else {
@@ -1602,21 +1601,21 @@
16021601 }
16031602
16041603 // /1 および /2 オプションの新規追加 (2004.10.3 yutaka)
1605- } else if (strcmp(option + 1, "1") == 0) {
1604+ } else if (wcscmp(option + 1, L"1") == 0) {
16061605 // command line: /ssh /1 is SSH1 only
16071606 pvar->settings.ssh_protocol_version = 1;
16081607
1609- } else if (strcmp(option + 1, "2") == 0) {
1608+ } else if (wcscmp(option + 1, L"2") == 0) {
16101609 // command line: /ssh /2 is SSH2 & SSH1
16111610 pvar->settings.ssh_protocol_version = 2;
16121611
1613- } else if (strcmp(option + 1, "nossh") == 0) {
1612+ } else if (wcscmp(option + 1, L"nossh") == 0) {
16141613 // '/nossh' オプションの追加。
16151614 // TERATERM.INI でSSHが有効になっている場合、うまくCygtermが起動しないことが
16161615 // あることへの対処。(2004.10.11 yutaka)
16171616 pvar->settings.Enabled = 0;
16181617
1619- } else if (strcmp(option + 1, "telnet") == 0) {
1618+ } else if (wcscmp(option + 1, L"telnet") == 0) {
16201619 // '/telnet' が指定されているときには '/nossh' と同じく
16211620 // SSHを無効にする (2006.9.16 maya)
16221621 pvar->settings.Enabled = 0;
@@ -1623,7 +1622,7 @@
16231622 // Tera Term の Telnet フラグも付ける
16241623 pvar->ts->Telnet = 1;
16251624
1626- } else if (MATCH_STR(option + 1, "auth=") == 0) {
1625+ } else if (wcsncmp(option + 1, L"auth=", 5) == 0) {
16271626 // SSH2自動ログインオプションの追加
16281627 //
16291628 // SYNOPSIS: /ssh /auth=passowrd /user=ユーザ名 /passwd=パスワード
@@ -1635,23 +1634,23 @@
16351634 //
16361635 pvar->ssh2_autologin = 1; // for SSH2 (2004.11.30 yutaka)
16371636
1638- if (_stricmp(option + 6, "password") == 0) { // パスワード
1637+ if (_wcsicmp(option + 6, L"password") == 0) { // パスワード
16391638 //pvar->auth_state.cur_cred.method = SSH_AUTH_PASSWORD;
16401639 pvar->ssh2_authmethod = SSH_AUTH_PASSWORD;
16411640
1642- } else if (_stricmp(option + 6, "keyboard-interactive") == 0) { // keyboard-interactive認証
1641+ } else if (_wcsicmp(option + 6, L"keyboard-interactive") == 0) { // keyboard-interactive認証
16431642 //pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;
16441643 pvar->ssh2_authmethod = SSH_AUTH_TIS;
16451644
1646- } else if (_stricmp(option + 6, "challenge") == 0) { // keyboard-interactive認証
1645+ } else if (_wcsicmp(option + 6, L"challenge") == 0) { // keyboard-interactive認証
16471646 //pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;
16481647 pvar->ssh2_authmethod = SSH_AUTH_TIS;
16491648
1650- } else if (_stricmp(option + 6, "publickey") == 0) { // 公開鍵認証
1649+ } else if (_wcsicmp(option + 6, L"publickey") == 0) { // 公開鍵認証
16511650 //pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
16521651 pvar->ssh2_authmethod = SSH_AUTH_RSA;
16531652
1654- } else if (_stricmp(option + 6, "pageant") == 0) { // 公開鍵認証 by Pageant
1653+ } else if (_wcsicmp(option + 6, L"pageant") == 0) { // 公開鍵認証 by Pageant
16551654 //pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
16561655 pvar->ssh2_authmethod = SSH_AUTH_PAGEANT;
16571656
@@ -1659,20 +1658,20 @@
16591658 // TODO:
16601659 }
16611660
1662- } else if (MATCH_STR(option + 1, "user=") == 0) {
1663- _snprintf_s(pvar->ssh2_username, sizeof(pvar->ssh2_username), _TRUNCATE, "%s", option+6);
1661+ } else if (wcsncmp(option + 1, L"user=", 5) == 0) {
1662+ _snprintf_s(pvar->ssh2_username, sizeof(pvar->ssh2_username), _TRUNCATE, "%ls", option+6);
16641663
1665- } else if (MATCH_STR(option + 1, "passwd=") == 0) {
1666- _snprintf_s(pvar->ssh2_password, sizeof(pvar->ssh2_password), _TRUNCATE, "%s", option+8);
1664+ } else if (wcsncmp(option + 1, L"passwd=", 7) == 0) {
1665+ _snprintf_s(pvar->ssh2_password, sizeof(pvar->ssh2_password), _TRUNCATE, "%ls", option+8);
16671666
1668- } else if (MATCH_STR(option + 1, "keyfile=") == 0) {
1669- _snprintf_s(pvar->ssh2_keyfile, sizeof(pvar->ssh2_keyfile), _TRUNCATE, "%s", option+9);
1667+ } else if (wcsncmp(option + 1, L"keyfile=", 8) == 0) {
1668+ _snprintf_s(pvar->ssh2_keyfile, sizeof(pvar->ssh2_keyfile), _TRUNCATE, "%ls", option+9);
16701669
1671- } else if (strcmp(option + 1, "ask4passwd") == 0) {
1670+ } else if (wcscmp(option + 1, L"ask4passwd") == 0) {
16721671 // パスワードを聞く (2006.9.18 maya)
16731672 pvar->ask4passwd = 1;
16741673
1675- } else if (strcmp(option + 1, "nosecuritywarning") == 0) {
1674+ } else if (wcscmp(option + 1, L"nosecuritywarning") == 0) {
16761675 // known_hostsチェックをしない。当該オプションを使うと、セキュリティ性が低下する
16771676 // ため、隠しオプション扱いとする。
16781677 // (2009.10.4 yutaka)
@@ -1690,12 +1689,12 @@
16901689 }
16911690
16921691 }
1693- else if ((MATCH_STR_I(option, "ssh://") == 0) ||
1694- (MATCH_STR_I(option, "ssh1://") == 0) ||
1695- (MATCH_STR_I(option, "ssh2://") == 0) ||
1696- (MATCH_STR_I(option, "slogin://") == 0) ||
1697- (MATCH_STR_I(option, "slogin1://") == 0) ||
1698- (MATCH_STR_I(option, "slogin2://") == 0)) {
1692+ else if ((_wcsnicmp(option, L"ssh://", 6) == 0) ||
1693+ (_wcsnicmp(option, L"ssh1://", 7) == 0) ||
1694+ (_wcsnicmp(option, L"ssh2://", 7) == 0) ||
1695+ (_wcsnicmp(option, L"slogin://", 9) == 0) ||
1696+ (_wcsnicmp(option, L"slogin1://", 10) == 0) ||
1697+ (_wcsnicmp(option, L"slogin2://", 10) == 0)) {
16991698 //
17001699 // ssh://user@host/ 等のURL形式のサポート
17011700 // 基本的な書式は telnet:// URLに順ずる
@@ -1704,13 +1703,13 @@
17041703 // RFC3986: Uniform Resource Identifier (URI): Generic Syntax
17051704 // RFC4248: The telnet URI Scheme
17061705 //
1707- char *p, *p2, *p3;
1706+ wchar_t *p, *p2, *p3;
17081707 int optlen, hostlen;
17091708
1710- optlen = strlen(option);
1709+ optlen = wcslen(option);
17111710
17121711 // 最初の':'の前の文字が数字だった場合、それをsshプロトコルバージョンとみなす
1713- p = _mbschr(option, ':');
1712+ p = wcschr(option, ':');
17141713 switch (*(p-1)) {
17151714 case '1':
17161715 pvar->settings.ssh_protocol_version = 1;
@@ -1724,15 +1723,15 @@
17241723 p += 3;
17251724
17261725 // path part を切り捨てる
1727- if ((p2 = _mbschr(p, '/')) != NULL) {
1726+ if ((p2 = wcschr(p, '/')) != NULL) {
17281727 *p2 = 0;
17291728 }
17301729
17311730 // '@'があった場合、それより前はユーザ情報
1732- if ((p2 = _mbschr(p, '@')) != NULL) {
1731+ if ((p2 = wcschr(p, '@')) != NULL) {
17331732 *p2 = 0;
17341733 // ':'以降はパスワード
1735- if ((p3 = _mbschr(p, ':')) != NULL) {
1734+ if ((p3 = wcschr(p, ':')) != NULL) {
17361735 *p3 = 0;
17371736 percent_decode(pvar->ssh2_password, sizeof(pvar->ssh2_password), p3 + 1);
17381737 }
@@ -1743,25 +1742,25 @@
17431742
17441743 // host part を option の先頭に移動して、scheme part を潰す
17451744 // port指定が無かった時にport番号を足すための領域確保の意味もある
1746- hostlen = strlen(p);
1747- memmove_s(option, optlen, p, hostlen);
1745+ hostlen = wcslen(p);
1746+ wmemmove_s(option, optlen, p, hostlen);
17481747 option[hostlen] = 0;
17491748
17501749 // ポート指定が無い時は":22"を足す
17511750 if (option[0] == '[' && option[hostlen-1] == ']' || // IPv6 raw address without port
1752- option[0] != '[' && _mbschr(option, ':') == NULL) { // hostname or IPv4 raw address without port
1753- memcpy_s(option+hostlen, optlen-hostlen, ":22", 3);
1751+ option[0] != '[' && wcschr(option, ':') == NULL) { // hostname or IPv4 raw address without port
1752+ wmemcpy_s(option+hostlen, optlen-hostlen, L":22", 3);
17541753 hostlen += 3;
17551754 }
17561755
17571756 // ポート指定より後をすべてスペースで潰す
1758- memset(option+hostlen, ' ', optlen-hostlen);
1757+ wmemset(option+hostlen, ' ', optlen-hostlen);
17591758
17601759 pvar->settings.Enabled = 1;
17611760
17621761 action = OPTION_REPLACE;
17631762 }
1764- else if (_mbschr(option, '@') != NULL) {
1763+ else if (wcschr(option, '@') != NULL) {
17651764 //
17661765 // user@host 形式のサポート
17671766 // 取り合えずsshでのみサポートの為、ユーザ名はttssh内で潰す。
@@ -1769,16 +1768,19 @@
17691768 // 将来的にtelnet authentication optionをサポートした時は
17701769 // Tera Term本体で処理するようにする予定。
17711770 //
1772- char *p;
1773- p = _mbschr(option, '@');
1771+ char *optionA;
1772+ wchar_t *p;
1773+ p = wcschr(option, '@');
17741774 *p = 0;
17751775
1776- strncpy_s(pvar->ssh2_username, sizeof(pvar->ssh2_username), option, _TRUNCATE);
1776+ optionA = ToCharW(option);
1777+ strncpy_s(pvar->ssh2_username, sizeof(pvar->ssh2_username), optionA, _TRUNCATE);
1778+ free(optionA);
17771779
17781780 // ユーザ名部分をスペースで潰す。
17791781 // 後続のTTXやTera Term本体で解釈する時にはスペースを読み飛ばすので、
17801782 // ホスト名を先頭に詰める必要は無い。
1781- memset(option, ' ', p-option+1);
1783+ wmemset(option, ' ', p-option+1);
17821784
17831785 action = OPTION_REPLACE;
17841786 }
@@ -1786,11 +1788,11 @@
17861788
17871789 switch (action) {
17881790 case OPTION_CLEAR:
1789- memset(cur, ' ', next-cur);
1791+ wmemset(cur, ' ', next-cur);
17901792 break;
17911793 case OPTION_REPLACE:
1792- memset(cur, ' ', next-cur);
1793- memcpy(cur+1, option, strlen(option));
1794+ wmemset(cur, ' ', next-cur);
1795+ wmemcpy(cur+1, option, wcslen(option));
17941796 break;
17951797 }
17961798
Show on old repository browser