• R/O
  • SSH
  • HTTPS

ttssh2: Commit


Commit MetaInfo

Revision9429 (tree)
Time2021-09-20 00:13:51
Authorzmatsuo

Log Message

plugin iniファイルの読み書きをUnicode化

- teraterm/ttsetup.h 引数のファイル名をUnicode化

- PReadIniFile()
- PWriteIniFile()

- TTProxy/YCL/include/YCL/wstring.h 追加

- Unicode版 string.h
- ファイル名の保持はできる
- 他の関数はテストしていない

Change Summary

Incremental Difference

--- trunk/TTProxy/CMakeLists.txt (revision 9428)
+++ trunk/TTProxy/CMakeLists.txt (revision 9429)
@@ -89,6 +89,7 @@
8989 YCL/include/YCL/ValueCtrl.h
9090 YCL/include/YCL/Vector.h
9191 YCL/include/YCL/Window.h
92+ YCL/include/YCL/wstring.h
9293 )
9394
9495 source_group(
--- trunk/TTProxy/TTProxy.h (revision 9428)
+++ trunk/TTProxy/TTProxy.h (revision 9429)
@@ -1,6 +1,8 @@
11 #ifndef _YEBISOCKS_TTX_H_
22 #define _YEBISOCKS_TTX_H_
33
4+#include "codeconv.h"
5+
46 #include <YCL/DynamicLinkLibrary.h>
57 using namespace yebisuya;
68
@@ -58,12 +60,12 @@
5860 }
5961 ::PostMessage(getInstance().cv->HWin, WM_COMMAND, ID_ASYNCMESSAGEBOX, 0);
6062 }
61- static void read_options(const char* filename) {
63+ static void read_options(const wchar_t* filename) {
6264 IniFile inifile(filename, "TTProxy");
6365 ProxyWSockHook::load(inifile);
6466 getInstance().initialized = true;
6567 }
66- static void write_options(const char* filename) {
68+ static void write_options(const wchar_t* filename) {
6769 IniFile inifile(filename, "TTProxy");
6870 ProxyWSockHook::save(inifile);
6971 }
@@ -88,11 +90,11 @@
8890 return buffer.toString();
8991 }
9092
91- static void PASCAL TTXReadINIFile(PCHAR fileName, PTTSet ts) {
93+ static void PASCAL TTXReadINIFile(const wchar_t *fileName, PTTSet ts) {
9294 getInstance().ORIG_ReadIniFile(fileName, ts);
9395 read_options(fileName);
9496 }
95- static void PASCAL TTXWriteINIFile(PCHAR fileName, PTTSet ts) {
97+ static void PASCAL TTXWriteINIFile(const wchar_t *fileName, PTTSet ts) {
9698 getInstance().ORIG_WriteIniFile(fileName, ts);
9799 write_options(fileName);
98100 }
@@ -116,7 +118,10 @@
116118
117119 if ((option[0] == '-' || option[0] == '/')) {
118120 if ((option[1] == 'F' || option[1] == 'f') && option[2] == '=') {
119- read_options(get_teraterm_dir_relative_name(option + 3));
121+ const char *f = get_teraterm_dir_relative_name(option + 3);
122+ wchar_t *fW = ToWcharA(f);
123+ read_options(fW);
124+ free(fW);
120125 }
121126 }
122127
@@ -211,7 +216,7 @@
211216
212217 static void PASCAL TTXOpenTCP(TTXSockHooks* hooks) {
213218 if (!getInstance().initialized) {
214- read_options(getInstance().ts->SetupFName);
219+ read_options(getInstance().ts->SetupFNameW);
215220 }
216221 (FARPROC&) *hooks->Pconnect = ProxyWSockHook::hook_connect((FARPROC) *hooks->Pconnect);
217222 (FARPROC&) *hooks->PWSAAsyncGetHostByName = ProxyWSockHook::hook_WSAAsyncGetHostByName((FARPROC) *hooks->PWSAAsyncGetHostByName);
--- trunk/TTProxy/YCL/include/YCL/Dialog.h (revision 9428)
+++ trunk/TTProxy/YCL/include/YCL/Dialog.h (revision 9429)
@@ -96,10 +96,10 @@
9696 }
9797
9898
99- int open(int resourceId, HWND owner = NULL) {
99+ INT_PTR open(int resourceId, HWND owner = NULL) {
100100 return open(GetInstanceHandle(), resourceId, owner);
101101 }
102- int open(HINSTANCE instance, int resourceId, HWND owner = NULL) {
102+ INT_PTR open(HINSTANCE instance, int resourceId, HWND owner = NULL) {
103103 YCLVERIFY(prepareOpen(this) == NULL, "Another dialog has been opening yet.");
104104 #if 0
105105 return ::DialogBoxParam(instance, MAKEINTRESOURCE(resourceId), owner, DialogProc, NULL);
--- trunk/TTProxy/YCL/include/YCL/IniFile.h (revision 9428)
+++ trunk/TTProxy/YCL/include/YCL/IniFile.h (revision 9429)
@@ -16,7 +16,10 @@
1616 #include <YCL/Enumeration.h>
1717 #include <YCL/Vector.h>
1818 #include <YCL/Hashtable.h>
19+#include <YCL/wstring.h>
1920
21+#include "inifile_com.h"
22+
2023 namespace yebisuya {
2124
2225 class IniFile {
@@ -41,7 +44,7 @@
4144 Vector<String> list;
4245 mutable int index;
4346 public:
44- EnumKeyNames(const char* filename, const char* section):index(0) {
47+ EnumKeyNames(const wchar_t* filename, const char* section):index(0) {
4548 Hashtable<String, int> table;
4649 int section_len = strlen(section);
4750 char* buffer;
@@ -85,7 +88,7 @@
8588 char* buffer;
8689 mutable char* p;
8790 public:
88- EnumValueNames(const char* filename, const char* section) {
91+ EnumValueNames(const wchar_t* filename, const char* section) {
8992 size_t size = 256;
9093 while ((buffer = getValueNames(filename, section, size)) == NULL)
9194 size += 256;
@@ -138,28 +141,28 @@
138141 return ((IniFile*) ini)->deleteValue(name);
139142 }
140143 };
141- static char* getSectionNames(const char* filename, size_t size) {
144+ static char* getSectionNames(const wchar_t* filename, size_t size) {
142145 char* buffer = new char[size];
143- if (::GetPrivateProfileSectionNames(buffer, size, filename) < size - 2)
146+ if (::GetPrivateProfileSectionNamesAFileW(buffer, size, filename) < size - 2)
144147 return buffer;
145148 delete[] buffer;
146149 return NULL;
147150 }
148- static char* getValueNames(const char* filename, const char* section, size_t size) {
151+ static char* getValueNames(const wchar_t* filename, const char* section, size_t size) {
149152 static const char null = '\0';
150153 char* buffer = new char[size];
151- if (::GetPrivateProfileString(section, NULL, &null, buffer, size, filename) < size - 2)
154+ if (GetPrivateProfileStringAFileW(section, NULL, &null, buffer, size, filename) < size - 2)
152155 return buffer;
153156 delete[] buffer;
154157 return NULL;
155158 }
156- static String getString(const char* filename, const char* section, const char* name, bool& exists, size_t size) {
159+ static String getString(const wchar_t* filename, const char* section, const char* name, bool& exists, size_t size) {
157160 char* buffer = (char*) alloca(size);
158- size_t len = ::GetPrivateProfileString(section, name, INVALID(), buffer, size, filename);
161+ size_t len = GetPrivateProfileStringAFileW(section, name, INVALID(), buffer, size, filename);
159162 if (len < size - 2) {
160163 // 改行を含んだ文字列はiniファイルからは取得できないので取得失敗したことが分かる
161164 if (buffer[0] == '\n') {
162- exists = false;
165+ exists = false;
163166 return NULL;
164167 }
165168 // エスケープ文字を展開
@@ -174,7 +177,7 @@
174177 buffer.append(subkeyName);
175178 return buffer.toString();
176179 }
177- static bool deleteAllSubsection(const char* filename, const char* section, const char* subkey) {
180+ static bool deleteAllSubsection(const wchar_t* filename, const char* section, const char* subkey) {
178181 String keyname = generateSectionName(section, subkey);
179182 int keyname_len = keyname.length();
180183
@@ -187,7 +190,7 @@
187190 while (*name != '\0') {
188191 if (strncmp(name, keyname, keyname_len) == 0) {
189192 if (name[keyname_len] == '\0' || name[keyname_len] == '\\') {
190- if (!::WritePrivateProfileString(name, NULL, NULL, filename)) {
193+ if (!WritePrivateProfileStringAFileW(name, NULL, NULL, filename)) {
191194 succeeded = false;
192195 break;
193196 }
@@ -200,12 +203,12 @@
200203 return succeeded;
201204 }
202205
203- String filename;
206+ WString filename;
204207 String section;
205208 public:
206209 IniFile() {
207210 }
208- IniFile(String filename, String section):filename(filename), section(section) {
211+ IniFile(WString filename, String section):filename(filename), section(section) {
209212 }
210213 IniFile(const IniFile& parent, const char* subkeyName):filename(parent.filename), section(generateSectionName(parent.section, subkeyName)) {
211214 }
@@ -214,7 +217,7 @@
214217 return filename != NULL && section != NULL;
215218 }
216219 long getInteger(const char* name, long defaultValue = 0)const {
217- return filename != NULL && section != NULL ? ::GetPrivateProfileInt(section, name, defaultValue, filename) : defaultValue;
220+ return filename != NULL && section != NULL ? ::GetPrivateProfileIntAFileW(section, name, defaultValue, filename) : defaultValue;
218221 }
219222 String getString(const char* name)const {
220223 return getString(name, NULL);
@@ -256,7 +259,7 @@
256259 buffer.append('"');
257260 value = buffer.toString();
258261 }
259- return ::WritePrivateProfileString(section, name, value, filename) != FALSE;
262+ return ::WritePrivateProfileStringAFileW(section, name, value, filename) != FALSE;
260263 }
261264 return false;
262265 }
@@ -266,7 +269,7 @@
266269
267270 bool existsValue(const char* name) {
268271 char buffer[3];
269- ::GetPrivateProfileString(section, name, INVALID(), buffer, countof(buffer), filename);
272+ ::GetPrivateProfileStringAFileW(section, name, INVALID(), buffer, countof(buffer), filename);
270273 return buffer[0] != '\n';
271274 }
272275 bool deleteKey(const char* name) {
@@ -274,10 +277,10 @@
274277 }
275278 bool deleteValue(const char* name) {
276279 return filename != NULL && section != NULL && name != NULL
277- && ::WritePrivateProfileString(section, name, NULL, filename) != FALSE;
280+ && ::WritePrivateProfileStringAFileW(section, name, NULL, filename) != FALSE;
278281 }
279282
280- bool open(String filename, String section) {
283+ bool open(WString filename, String section) {
281284 close();
282285 this->filename = filename;
283286 this->section = section;
--- trunk/TTProxy/YCL/include/YCL/String.h (revision 9428)
+++ trunk/TTProxy/YCL/include/YCL/String.h (revision 9429)
@@ -232,7 +232,7 @@
232232 // chr 探す文字。
233233 // 返値:
234234 // 文字の見つかったインデックス。見つからなければ-1。
235- int indexOf(char chr)const {
235+ size_t indexOf(char chr)const {
236236 return indexOf(chr, 0);
237237 }
238238 // 指定の文字がどの位置にあるかを指定の位置から探す。
@@ -241,7 +241,7 @@
241241 // from 探し始める位置。
242242 // 返値:
243243 // 文字の見つかったインデックス。見つからなければ-1。
244- int indexOf(char chr, size_t from)const {
244+ size_t indexOf(char chr, size_t from)const {
245245 if (from >= length())
246246 return -1;
247247 const char* found = strchr(string + from, chr);
@@ -254,7 +254,7 @@
254254 // str 探す文字列。
255255 // 返値:
256256 // 文字列の見つかったインデックス。見つからなければ-1。
257- int indexOf(const char* str)const {
257+ size_t indexOf(const char* str)const {
258258 return indexOf(str, 0);
259259 }
260260 // 指定の文字列がどの位置にあるかを指定の位置から探す。
@@ -264,7 +264,7 @@
264264 // 返値:
265265 // 文字列の見つかったインデックス。見つからなければ-1。
266266 //
267- int indexOf(const char* str, size_t from)const {
267+ size_t indexOf(const char* str, size_t from)const {
268268 if (from >= length())
269269 return -1;
270270 const char* found = strstr(string + from, str);
@@ -281,7 +281,7 @@
281281 // chr 探す文字。
282282 // 返値:
283283 // 文字の見つかったインデックス。見つからなければ-1。
284- int lastIndexOf(char chr)const {
284+ size_t lastIndexOf(char chr)const {
285285 return lastIndexOf(chr, (size_t) -1);
286286 }
287287 // 指定の文字が指定の位置よりも前で最後に見つかる位置を取得する。
@@ -290,7 +290,7 @@
290290 // from 探し始める位置。
291291 // 返値:
292292 // 文字の見つかったインデックス。見つからなければ-1。
293- int lastIndexOf(char chr, size_t from)const {
293+ size_t lastIndexOf(char chr, size_t from)const {
294294 size_t len = length();
295295 if (from > len - 1)
296296 from = len - 1;
@@ -311,7 +311,7 @@
311311 // str 探す文字列。
312312 // 返値:
313313 // 文字列の見つかったインデックス。見つからなければ-1。
314- int lastIndexOf(const char* str)const {
314+ size_t lastIndexOf(const char* str)const {
315315 return lastIndexOf(str, (size_t) -1);
316316 }
317317 // 指定の文字列が指定の位置よりも前で最後に見つかる位置を取得する。
@@ -320,7 +320,7 @@
320320 // from 探し始める位置。
321321 // 返値:
322322 // 文字列の見つかったインデックス。見つからなければ-1。
323- int lastIndexOf(const char* str, size_t from)const {
323+ size_t lastIndexOf(const char* str, size_t from)const {
324324 size_t len = length();
325325 size_t str_len = strlen(str);
326326 if (from > len - str_len)
--- trunk/TTProxy/YCL/include/YCL/wstring.h (nonexistent)
+++ trunk/TTProxy/YCL/include/YCL/wstring.h (revision 9429)
@@ -0,0 +1,684 @@
1+/*
2+ * Copyright (C) 2021- TeraTerm Project
3+ * All rights reserved.
4+ *
5+ * Redistribution and use in source and binary forms, with or without
6+ * modification, are permitted provided that the following conditions
7+ * are met:
8+ *
9+ * 1. Redistributions of source code must retain the above copyright
10+ * notice, this list of conditions and the following disclaimer.
11+ * 2. Redistributions in binary form must reproduce the above copyright
12+ * notice, this list of conditions and the following disclaimer in the
13+ * documentation and/or other materials provided with the distribution.
14+ * 3. The name of the author may not be used to endorse or promote products
15+ * derived from this software without specific prior written permission.
16+ *
17+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
18+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20+ * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
21+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27+ */
28+
29+#ifndef _YCL_WSTRING_H_
30+#define _YCL_WSTRING_H_
31+
32+#pragma once
33+
34+#include <YCL/common.h>
35+
36+#include <string.h>
37+#include <wchar.h>
38+
39+namespace yebisuya {
40+
41+// 文字列の管理・操作を行うクラス。
42+class WString {
43+private:
44+ // 文字列を格納するバッファ。
45+ // 文字列の前には参照カウンタを持ち、
46+ // 代入や破棄の際にはそこを変更する。
47+ const wchar_t* string;
48+
49+ // utilities
50+ // 文字列を格納するバッファを作成する。
51+ // 文字列と参照カウンタの分の領域を確保する。
52+ // 参照カウンタは0になっている。
53+ // 引数:
54+ // length 文字列の長さ。
55+ // 返値:
56+ // 作成したバッファの文字列部のアドレス。
57+ static wchar_t* createBuffer(size_t length) {
58+ size_t* count = (size_t*) new unsigned char[sizeof (size_t) + sizeof (wchar_t) * (length + 1)];
59+ *count = 0;
60+ return (wchar_t*) (count + 1);
61+ }
62+ // 文字列を格納したバッファを作成する。
63+ // 引数:
64+ // source 格納する文字列。
65+ // 返値:
66+ // 作成したバッファの文字列部のアドレス。
67+ static const wchar_t* create(const wchar_t* source) {
68+ return source != NULL ? create(source, wcslen(source)) : NULL;
69+ }
70+ // 文字列を格納したバッファを作成する。
71+ // 引数:
72+ // source 格納する文字列。
73+ // length 文字列の長さ。
74+ // 返値:
75+ // 作成したバッファの文字列部のアドレス。
76+ static const wchar_t* create(const wchar_t* source, size_t length) {
77+ if (source != NULL) {
78+ wchar_t* buffer = createBuffer(length);
79+ wmemcpy(buffer, source, length);
80+ buffer[length] = '\0';
81+ return buffer;
82+ }
83+ return NULL;
84+ }
85+ // 二つの文字列を連結し格納したバッファを作成する。
86+ // 引数:
87+ // str1 連結する文字列(前)。
88+ // str2 連結する文字列(後)。
89+ // 返値:
90+ // 作成したバッファの文字列部のアドレス。
91+ static const wchar_t* concat(const wchar_t* str1, const wchar_t* str2) {
92+ size_t len1 = wcslen(str1);
93+ size_t len2 = wcslen(str2);
94+ wchar_t* buffer = createBuffer(len1 + len2);
95+ wmemcpy(buffer, str1, len1);
96+ wmemcpy(buffer + len1, str2, len2);
97+ buffer[len1 + len2] = '\0';
98+ return buffer;
99+ }
100+ // private methods
101+ // 参照カウンタを減らし、0になったらバッファを破棄する。
102+ void release() {
103+ if (string != NULL) {
104+ size_t* count = (size_t*) string - 1;
105+ if (--*count == 0)
106+ delete[] (unsigned char*) count;
107+ }
108+ }
109+ // 参照カウンタを増やす。
110+ void add() {
111+ if (string != NULL) {
112+ size_t* count = (size_t*) string - 1;
113+ ++*count;
114+ }
115+ }
116+ // 別のバッファと置き換える。
117+ // 元のバッファの参照カウンタを減らし、
118+ // 新しいバッファの参照カウンタを増やす。
119+ // 引数:
120+ // source 置き換える新しいバッファ。
121+ void set(const wchar_t* source) {
122+ if (string != source) {
123+ release();
124+ string = source;
125+ add();
126+ }
127+ }
128+public:
129+ // constructor
130+ // デフォルトコンストラクタ。
131+ // NULLが入っているので、このままで文字列操作するとアクセス違反になるので注意。
132+ WString():string(NULL) {
133+ }
134+ // 元の文字列を指定するコンストラクタ。
135+ // 引数:
136+ // source 元の文字列。
137+ WString(const wchar_t* source):string(NULL) {
138+ set(create(source));
139+ }
140+ // 元の文字列を長さ付きで指定するコンストラクタ。
141+ // 引数:
142+ // source 元の文字列。
143+ // length 文字列の長さ。
144+ WString(const wchar_t* source, size_t length):string(NULL) {
145+ set(create(source, length));
146+ }
147+ // コピーコンストラクタ。
148+ // 引数:
149+ // source 元の文字列。
150+ WString(const WString& source):string(NULL) {
151+ set(source.string);
152+ }
153+ // 二つの文字列を連結するコンストラクタ。
154+ // 引数:
155+ // str1 前になる文字列。
156+ // str2 後になる文字列。
157+ WString(const wchar_t* str1, const wchar_t* str2):string(NULL) {
158+ set(concat(str1, str2));
159+ }
160+ // 二つの文字列を連結するコンストラクタ。
161+ // 引数:
162+ // str1 前になる文字列。
163+ // str2 後になる文字列。
164+ WString(const WString& str1, const wchar_t* str2):string(NULL) {
165+ set(*str2 != '\0' ? concat(str1.string, str2) : str1.string);
166+ }
167+ // destructor
168+ // デストラクタ。
169+ // 派生することは考えていないので仮想関数にはしない。
170+ ~WString() {
171+ release();
172+ }
173+ // public methods
174+ // この文字列の後に指定の文字列を連結する。
175+ // 引数:
176+ // source 連結する文字列。
177+ // 返値:
178+ // 連結された文字列。
179+ WString concat(const wchar_t* source)const {
180+ return WString(*this, source);
181+ }
182+ // 文字列との比較を行う。
183+ // NULLとも比較できる。
184+ // 引数:
185+ // str 比較する文字列。
186+ // 返値:
187+ // 等しければ0、strの方が大きければ負、小さければ正。
188+ int compareTo(const wchar_t* str)const {
189+ if (str == NULL)
190+ return string == NULL ? 0 : 1;
191+ else if (string == NULL)
192+ return -1;
193+ return wcscmp(string, str);
194+ }
195+ // 文字列との比較を大文字小文字の区別なしで行う。
196+ // NULLとも比較できる。
197+ // 引数:
198+ // str 比較する文字列。
199+ // 返値:
200+ // 等しければ0、strの方が大きければ負、小さければ正。
201+ int compareToIgnoreCase(const wchar_t* str)const {
202+ if (str == NULL)
203+ return string == NULL ? 0 : 1;
204+ else if (string == NULL)
205+ return -1;
206+ return _wcsicmp(string, str);
207+ }
208+ // 文字列との比較を行う。
209+ // NULLとも比較できる。
210+ // 引数:
211+ // str 比較する文字列。
212+ // 返値:
213+ // 等しければ真。
214+ bool equals(const wchar_t* str)const {
215+ return compareTo(str) == 0;
216+ }
217+ // 文字列との比較を大文字小文字の区別なしで行う。
218+ // NULLとも比較できる。
219+ // 引数:
220+ // str 比較する文字列。
221+ // 返値:
222+ // 等しければ真。
223+ bool equalsIgnoreCase(const wchar_t* str)const {
224+ return compareToIgnoreCase(str) == 0;
225+ }
226+ // 指定された文字列で始まっているかどうかを判定する。
227+ // 引数:
228+ // str 比較する文字列。
229+ // 返値:
230+ // 指定された文字列で始まっていれば真。
231+ bool startsWith(const wchar_t* str)const {
232+ return startsWith(str, 0);
233+ }
234+ // 指定の位置から指定された文字列で始まっているかどうかを判定する。
235+ // 引数:
236+ // str 比較する文字列。
237+ // 返値:
238+ // 指定された文字列で始まっていれば真。
239+ bool startsWith(const wchar_t* str, int offset)const {
240+ return wcsncmp(string, str, wcslen(str)) == 0;
241+ }
242+ // 指定された文字列で終わっているかどうかを判定する。
243+ // 引数:
244+ // str 比較する文字列。
245+ // 返値:
246+ // 指定された文字列で終わっていれば真。
247+ //
248+ bool endsWith(const wchar_t* str)const {
249+ size_t str_length = wcslen(str);
250+ size_t string_length = length();
251+ if (string_length < str_length)
252+ return false;
253+ return wcscmp(string + string_length - str_length, str) == 0;
254+ }
255+ // 指定の文字がどの位置にあるかを探す。
256+ // 引数:
257+ // chr 探す文字。
258+ // 返値:
259+ // 文字の見つかったインデックス。見つからなければ-1。
260+ int indexOf(char chr)const {
261+ return indexOf(chr, 0);
262+ }
263+ // 指定の文字がどの位置にあるかを指定の位置から探す。
264+ // 引数:
265+ // chr 探す文字。
266+ // from 探し始める位置。
267+ // 返値:
268+ // 文字の見つかったインデックス。見つからなければ-1。
269+ int indexOf(wchar_t chr, size_t from)const {
270+ if (from >= length())
271+ return -1;
272+ const wchar_t* found = wcschr(string + from, chr);
273+ if (found == NULL)
274+ return -1;
275+ return found - string;
276+ }
277+ // 指定の文字列がどの位置にあるかを探す。
278+ // 引数:
279+ // str 探す文字列。
280+ // 返値:
281+ // 文字列の見つかったインデックス。見つからなければ-1。
282+ int indexOf(const wchar_t* str)const {
283+ return indexOf(str, 0);
284+ }
285+ // 指定の文字列がどの位置にあるかを指定の位置から探す。
286+ // 引数:
287+ // str 探す文字列。
288+ // from 探し始める位置。
289+ // 返値:
290+ // 文字列の見つかったインデックス。見つからなければ-1。
291+ //
292+ int indexOf(const wchar_t* str, size_t from)const {
293+ if (from >= length())
294+ return -1;
295+ const wchar_t* found = wcsstr(string + from, str);
296+ if (found == NULL)
297+ return -1;
298+ return found - string;
299+ }
300+ // 文字列の長さを返す。
301+ size_t length()const {
302+ return wcslen(string);
303+ }
304+ // 指定の文字が最後に見つかる位置を取得する。
305+ // 引数:
306+ // chr 探す文字。
307+ // 返値:
308+ // 文字の見つかったインデックス。見つからなければ-1。
309+ int lastIndexOf(char chr)const {
310+ return lastIndexOf(chr, (size_t) -1);
311+ }
312+ // 指定の文字が指定の位置よりも前で最後に見つかる位置を取得する。
313+ // 引数:
314+ // chr 探す文字。
315+ // from 探し始める位置。
316+ // 返値:
317+ // 文字の見つかったインデックス。見つからなければ-1。
318+ int lastIndexOf(wchar_t chr, size_t from)const {
319+ size_t len = length();
320+ if (from > len - 1)
321+ from = len - 1;
322+ const wchar_t* s = string;
323+ const wchar_t* end = string + from;
324+ const wchar_t* found = NULL;
325+ while (*s != '0' && s <= end) {
326+ if (*s == chr)
327+ found = s;
328+ s++;
329+ }
330+ return found != NULL ? found - string : -1;
331+ }
332+ // 指定の文字列が最後に見つかる位置を取得する。
333+ // 引数:
334+ // str 探す文字列。
335+ // 返値:
336+ // 文字列の見つかったインデックス。見つからなければ-1。
337+ int lastIndexOf(const wchar_t* str)const {
338+ return lastIndexOf(str, (size_t) -1);
339+ }
340+ // 指定の文字列が指定の位置よりも前で最後に見つかる位置を取得する。
341+ // 引数:
342+ // str 探す文字列。
343+ // from 探し始める位置。
344+ // 返値:
345+ // 文字列の見つかったインデックス。見つからなければ-1。
346+ int lastIndexOf(const wchar_t* str, size_t from)const {
347+ size_t len = length();
348+ size_t str_len = wcslen(str);
349+ if (from > len - str_len)
350+ from = len - str_len;
351+ const wchar_t* s = string + from;
352+ while (s >= string) {
353+ if (wcsncmp(s, str, str_len) == 0)
354+ return s - string;
355+ s--;
356+ }
357+ return -1;
358+ }
359+ // 文字列の一部を取り出す。
360+ // 引数:
361+ // start 取り出す文字列の先頭の位置。
362+ // 返値:
363+ // 文字列の一部。
364+ WString substring(int start)const {
365+ return WString(string + start);
366+ }
367+ // 文字列の一部を取り出す。
368+ // 引数:
369+ // start 取り出す文字列の先頭の位置。
370+ // end 取り出す文字列の後の位置。
371+ // 返値:
372+ // 文字列の一部。
373+ WString substring(int start, int end)const {
374+ return WString(string + start, end - start);
375+ }
376+ // 指定の位置にある文字を取り出す。
377+ // 引数:
378+ // index 取り出す文字の位置。
379+ // 返値:
380+ // 指定の位置にある文字。
381+ char charAt(size_t index)const {
382+ return index < length() ? string[index] : '\0';
383+ }
384+ // 指定の文字を指定の文字に置き換えます。
385+ // 引数:
386+ // oldChr 元の文字。
387+ // newChr 置き換える文字。
388+ // 返値:
389+ // 置換後の文字列。
390+ WString replace(char oldChr, char newChr)const {
391+ WString result(string);
392+ char* s = (char*) result.string;
393+ while (*s != '\0'){
394+ if (WString::isLeadByte(*s))
395+ s++;
396+ else if (*s == oldChr)
397+ *s = newChr;
398+ s++;
399+ }
400+ return result;
401+ }
402+ // 文字列中の大文字を小文字に変換する。
403+ // 返値:
404+ // 変換後の文字列。
405+ WString toLowerCase()const {
406+ WString result(string);
407+ char* s = (char*) result.string;
408+ while (*s != '\0'){
409+ if (WString::isLeadByte(*s))
410+ s++;
411+ else if ('A' <= *s && *s <= 'Z')
412+ *s += 'a' - 'A';
413+ s++;
414+ }
415+ return result;
416+ }
417+ // 文字列中の小文字を大文字に変換する。
418+ // 返値:
419+ // 変換後の文字列。
420+ WString toUpperCase()const {
421+ WString result(string);
422+ char* s = (char*) result.string;
423+ while (*s != '\0'){
424+ if (WString::isLeadByte(*s))
425+ s++;
426+ else if ('a' <= *s && *s <= 'z')
427+ *s += 'A' - 'a';
428+ s++;
429+ }
430+ return result;
431+ }
432+ // 文字列の前後の空白文字を削除する。
433+ // 返値:
434+ // 削除後の文字列。
435+ WString trim()const {
436+ const wchar_t* s = string;
437+ while (*s != '\0' && (unsigned char) *s <= ' ')
438+ s++;
439+ const wchar_t* start = s;
440+ s = string + length();
441+ while (s > start && (*s != '\0' && (unsigned char) *s <= ' '))
442+ s--;
443+ return WString(start, s - start);
444+ }
445+
446+ // operators
447+
448+ // const char*へのキャスト演算子
449+ // 返値:
450+ // 文字列へのアドレス。
451+ operator const wchar_t*()const {
452+ return string;
453+ }
454+ // char配列のように扱うための[]演算子。
455+ // 引数:
456+ // index 取得する文字のインデックス。
457+ // 返値:
458+ // 指定のインデックスにある文字。
459+ char operator[](size_t index)const {
460+ return charAt(index);
461+ }
462+ // 文字列を連結するための+演算子。
463+ // 引数:
464+ // source 連結する文字列。
465+ // 返値:
466+ // 連結した文字列。
467+ WString operator+(const wchar_t* source)const {
468+ return WString(string, source);
469+ }
470+ // 文字列を連結するための+演算子。
471+ // 引数:
472+ // source 連結する文字列。
473+ // 返値:
474+ // 連結した文字列。
475+ WString operator+(const WString& source)const {
476+ return *string != '\0' ? WString(string, source.string) : source;
477+ }
478+ // 文字列を連結するための+演算子。
479+ // 引数:
480+ // str1 連結する文字列(前)。
481+ // str2 連結する文字列(後)。
482+ // 返値:
483+ // 連結した文字列。
484+ friend WString operator+(const wchar_t* str1, const WString& str2) {
485+ return *str1 != '\0' ? WString(str1, str2.string) : str2;
486+ }
487+ // 代入演算子。
488+ // 引数:
489+ // source 代入する文字列。
490+ // 返値:
491+ // 代入結果。
492+ WString& operator=(const wchar_t* source) {
493+ set(create(source));
494+ return *this;
495+ }
496+ // 代入演算子。
497+ // 引数:
498+ // source 代入する文字列。
499+ // 返値:
500+ // 代入結果。
501+ WString& operator=(const WString& source) {
502+ set(source.string);
503+ return *this;
504+ }
505+ // 連結した結果を代入する演算子。
506+ // 引数:
507+ // source 連結する文字列。
508+ // 返値:
509+ // 連結結果。
510+ WString& operator+=(const wchar_t* source) {
511+ if (*source != '\0')
512+ set(concat(string, source));
513+ return *this;
514+ }
515+ // 比較演算子。
516+ // 引数:
517+ // str 比較対象の文字列。
518+ // 返値:
519+ // strの方が等しければ真。
520+ bool operator==(const WString& str)const {
521+ return compareTo(str.string) == 0;
522+ }
523+ // 比較演算子。
524+ // 引数:
525+ // str 比較対象の文字列。
526+ // 返値:
527+ // strの方が等しければ真。
528+ bool operator==(const wchar_t* str)const {
529+ return compareTo(str) == 0;
530+ }
531+ // 比較演算子。
532+ // 引数:
533+ // str1 比較する文字列。
534+ // str2 比較する文字列。
535+ // 返値:
536+ // str1よりstr2の方が等しければ真。
537+ friend bool operator==(const wchar_t* str1, const WString& str2) {
538+ return str2.compareTo(str1) == 0;
539+ }
540+ // 比較演算子。
541+ // 引数:
542+ // str 比較対象の文字列。
543+ // 返値:
544+ // strの方が等しくなければ真。
545+ bool operator!=(const WString& str)const {
546+ return compareTo(str) != 0;
547+ }
548+ // 比較演算子。
549+ // 引数:
550+ // str 比較対象の文字列。
551+ // 返値:
552+ // strの方が等しくなければ真。
553+ bool operator!=(const wchar_t* str)const {
554+ return compareTo(str) != 0;
555+ }
556+ // 比較演算子。
557+ // 引数:
558+ // str1 比較する文字列。
559+ // str2 比較する文字列。
560+ // 返値:
561+ // str1よりstr2の方が等しくなければ真。
562+ friend bool operator!=(const wchar_t* str1, const WString& str2) {
563+ return str2.compareTo(str1) != 0;
564+ }
565+ // 比較演算子。
566+ // 引数:
567+ // str 比較対象の文字列。
568+ // 返値:
569+ // strの方が大きければ真。
570+ bool operator<(const WString& str)const {
571+ return compareTo(str) < 0;
572+ }
573+ // 比較演算子。
574+ // 引数:
575+ // str 比較対象の文字列。
576+ // 返値:
577+ // strの方が大きければ真。
578+ bool operator<(const wchar_t* str)const {
579+ return compareTo(str) < 0;
580+ }
581+ // 比較演算子。
582+ // 引数:
583+ // str1 比較する文字列。
584+ // str2 比較する文字列。
585+ // 返値:
586+ // str1よりstr2の方が大きければ真。
587+ friend bool operator<(const wchar_t* str1, const WString& str2) {
588+ return str2.compareTo(str1) > 0;
589+ }
590+ // 比較演算子。
591+ // 引数:
592+ // str 比較対象の文字列。
593+ // 返値:
594+ // strの方が大きいか等しければ真。
595+ bool operator<=(const WString& str)const {
596+ return compareTo(str) <= 0;
597+ }
598+ // 比較演算子。
599+ // 引数:
600+ // str 比較対象の文字列。
601+ // 返値:
602+ // strの方が大きいか等しければ真。
603+ bool operator<=(const wchar_t* str)const {
604+ return compareTo(str) <= 0;
605+ }
606+ // 比較演算子。
607+ // 引数:
608+ // str1 比較する文字列。
609+ // str2 比較する文字列。
610+ // 返値:
611+ // str1よりstr2の方が大きいか等しければ真。
612+ friend bool operator<=(const wchar_t* str1, const WString& str2) {
613+ return str2.compareTo(str1) >= 0;
614+ }
615+ // 比較演算子。
616+ // 引数:
617+ // str 比較対象の文字列。
618+ // 返値:
619+ // strの方が小さければ真。
620+ bool operator>(const WString& str)const {
621+ return compareTo(str) > 0;
622+ }
623+ // 比較演算子。
624+ // 引数:
625+ // str 比較対象の文字列。
626+ // 返値:
627+ // strの方が小さければ真。
628+ bool operator>(const wchar_t* str)const {
629+ return compareTo(str) > 0;
630+ }
631+ // 比較演算子。
632+ // 引数:
633+ // str1 比較する文字列。
634+ // str2 比較する文字列。
635+ // 返値:
636+ // str1よりstr2の方が小さければ真。
637+ friend bool operator>(const wchar_t* str1, const WString& str2) {
638+ return str2.compareTo(str1) < 0;
639+ }
640+ // 比較演算子。
641+ // 引数:
642+ // str 比較対象の文字列。
643+ // 返値:
644+ // strの方が小さいか等しければ真。
645+ bool operator>=(const WString& str)const {
646+ return compareTo(str) >= 0;
647+ }
648+ // 比較演算子。
649+ // 引数:
650+ // str 比較対象の文字列。
651+ // 返値:
652+ // strの方が小さいか等しければ真。
653+ bool operator>=(const wchar_t* str)const {
654+ return compareTo(str) >= 0;
655+ }
656+ // 比較演算子。
657+ // 引数:
658+ // str1 比較する文字列。
659+ // str2 比較する文字列。
660+ // 返値:
661+ // str1よりstr2の方が小さいか等しければ真。
662+ friend bool operator>=(const wchar_t* str1, const WString& str2) {
663+ return str2.compareTo(str1) <= 0;
664+ }
665+
666+ // public utilities
667+
668+ // 2バイト文字の最初の1バイトかどうかを判定する。
669+ // 引数:
670+ // 判定するバイト。
671+ // 返値:
672+ // 2バイト文字の最初の1バイトであれば真。
673+ static bool isLeadByte(char ch) {
674+ #ifdef _INC_WINDOWS
675+ return ::IsDBCSLeadByte(ch) != 0;
676+ #else
677+ return (ch & 0x80) != 0;
678+ #endif
679+ }
680+};
681+
682+}
683+
684+#endif//_YCL_WSTRING_H_
--- trunk/TTXKanjiMenu/CMakeLists.txt (revision 9428)
+++ trunk/TTXKanjiMenu/CMakeLists.txt (revision 9429)
@@ -49,6 +49,7 @@
4949 ${PACKAGE_NAME}
5050 PRIVATE
5151 ttpcmn
52+ common_static
5253 )
5354
5455 install(
--- trunk/TTXKanjiMenu/ttxkanjimenu.c (revision 9428)
+++ trunk/TTXKanjiMenu/ttxkanjimenu.c (revision 9429)
@@ -22,6 +22,8 @@
2222 #include <stdio.h>
2323 #include <string.h>
2424
25+#include "inifile_com.h"
26+
2527 #define IniSection "TTXKanjiMenu"
2628 #define ORDER 5000
2729
@@ -257,13 +259,13 @@
257259 /*
258260 * 設定の読み込み
259261 */
260-static void PASCAL TTXKanjiMenuReadIniFile(PCHAR fn, PTTSet ts) {
262+static void PASCAL TTXKanjiMenuReadIniFile(const wchar_t *fn, PTTSet ts) {
261263 char buff[20];
262264
263265 /* Call original ReadIniFile */
264266 pvar->origReadIniFile(fn, ts);
265267
266- GetPrivateProfileString(IniSection, "UseOneSetting", "on", buff, sizeof(buff), fn);
268+ GetPrivateProfileStringAFileW(IniSection, "UseOneSetting", "on", buff, sizeof(buff), fn);
267269 if (_stricmp(buff, "off") == 0) {
268270 pvar->UseOneSetting = FALSE;
269271 }
@@ -288,11 +290,11 @@
288290 /*
289291 * 設定の保存
290292 */
291-static void PASCAL TTXKanjiMenuWriteIniFile(PCHAR fn, PTTSet ts) {
293+static void PASCAL TTXKanjiMenuWriteIniFile(const wchar_t *fn, PTTSet ts) {
292294 /* Call original WriteIniFile */
293295 pvar->origWriteIniFile(fn, ts);
294296
295- WritePrivateProfileString(IniSection, "UseOneSetting", pvar->UseOneSetting?"on":"off", fn);
297+ WritePrivateProfileStringAFileW(IniSection, "UseOneSetting", pvar->UseOneSetting?"on":"off", fn);
296298
297299 return;
298300 }
--- trunk/TTXSamples/TTXAdditionalTitle/CMakeLists.txt (revision 9428)
+++ trunk/TTXSamples/TTXAdditionalTitle/CMakeLists.txt (revision 9429)
@@ -49,5 +49,6 @@
4949 ${PACKAGE_NAME}
5050 PRIVATE
5151 ttpcmn
52+ common_static
5253 )
5354
--- trunk/TTXSamples/TTXAdditionalTitle/TTXAdditionalTitle.c (revision 9428)
+++ trunk/TTXSamples/TTXAdditionalTitle/TTXAdditionalTitle.c (revision 9429)
@@ -10,6 +10,8 @@
1010 #include <winsock2.h>
1111 #include <ws2tcpip.h>
1212
13+#include "inifile_com.h"
14+
1315 #define ORDER 4800
1416 // #define ID_MENUITEM 37000
1517 #define INISECTION "AdditionalTitle"
@@ -240,15 +242,15 @@
240242 return;
241243 }
242244
243-static void PASCAL TTXReadIniFile(PCHAR fn, PTTSet ts) {
245+static void PASCAL TTXReadIniFile(const wchar_t *fn, PTTSet ts) {
244246 char buff[sizeof(pvar->ts->Title)];
245247
246248 (pvar->origReadIniFile)(fn, ts);
247- GetPrivateProfileString(INISECTION, "AdditionalTitle", "", pvar->add_title, sizeof(pvar->add_title), fn);
249+ GetPrivateProfileStringAFileW(INISECTION, "AdditionalTitle", "", pvar->add_title, sizeof(pvar->add_title), fn);
248250
249251 strncpy_s(pvar->orig_title, sizeof(pvar->orig_title), pvar->ts->Title, _TRUNCATE);
250252
251- GetPrivateProfileString(INISECTION, "AddMode", "off", buff, sizeof(buff), fn);
253+ GetPrivateProfileStringAFileW(INISECTION, "AddMode", "off", buff, sizeof(buff), fn);
252254 if (_stricmp(buff, "top") == 0) {
253255 pvar->add_mode = ADD_TOP;
254256 pvar->ts->AcceptTitleChangeRequest = FALSE;
@@ -264,21 +266,21 @@
264266 }
265267 }
266268
267-static void PASCAL TTXWriteIniFile(PCHAR fn, PTTSet ts) {
269+static void PASCAL TTXWriteIniFile(const wchar_t *fn, PTTSet ts) {
268270 strncpy_s(pvar->ts->Title, sizeof(pvar->ts->Title), pvar->orig_title, _TRUNCATE);
269271 (pvar->origWriteIniFile)(fn, ts);
270272 SetTitleStr(pvar->orig_title, FALSE);
271273
272- WritePrivateProfileString(INISECTION, "AdditionalTitle", pvar->add_title, fn);
274+ WritePrivateProfileStringAFileW(INISECTION, "AdditionalTitle", pvar->add_title, fn);
273275 switch (pvar->add_mode) {
274276 case ADD_NONE:
275- WritePrivateProfileString(INISECTION, "AddMode", "off", fn);
277+ WritePrivateProfileStringAFileW(INISECTION, "AddMode", "off", fn);
276278 break;
277279 case ADD_TOP:
278- WritePrivateProfileString(INISECTION, "AddMode", "top", fn);
280+ WritePrivateProfileStringAFileW(INISECTION, "AddMode", "top", fn);
279281 break;
280282 case ADD_BOTTOM:
281- WritePrivateProfileString(INISECTION, "AddMode", "bottom", fn);
283+ WritePrivateProfileStringAFileW(INISECTION, "AddMode", "bottom", fn);
282284 break;
283285 default:
284286 ; // not reached
--- trunk/TTXSamples/TTXCopyIniFile/TTXCopyIniFile.c (revision 9428)
+++ trunk/TTXSamples/TTXCopyIniFile/TTXCopyIniFile.c (revision 9429)
@@ -13,19 +13,19 @@
1313 typedef struct {
1414 PReadIniFile origReadIniFile;
1515 PWriteIniFile origWriteIniFile;
16- char origIniFileName[MAXPATHLEN];
16+ wchar_t origIniFileName[MAXPATHLEN];
1717 } TInstVar;
1818
1919 static TInstVar *pvar;
2020 static TInstVar InstVar;
2121
22-static void PASCAL TTXReadIniFile(PCHAR fn, PTTSet ts) {
23- strcpy_s(pvar->origIniFileName, sizeof(pvar->origIniFileName), fn);
22+static void PASCAL TTXReadIniFile(const wchar_t *fn, PTTSet ts) {
23+ wcscpy_s(pvar->origIniFileName, sizeof(pvar->origIniFileName), fn);
2424 (pvar->origReadIniFile)(fn, ts);
2525 }
2626
27-static void PASCAL TTXWriteIniFile(PCHAR fn, PTTSet ts) {
28- CopyFile(pvar->origIniFileName, fn, TRUE);
27+static void PASCAL TTXWriteIniFile(const wchar_t *fn, PTTSet ts) {
28+ CopyFileW(pvar->origIniFileName, fn, TRUE);
2929 (pvar->origWriteIniFile)(fn, ts);
3030 }
3131
--- trunk/TTXSamples/TTXFixedWinSize/TTXFixedWinSize.c (revision 9428)
+++ trunk/TTXSamples/TTXFixedWinSize/TTXFixedWinSize.c (revision 9429)
@@ -57,7 +57,7 @@
5757 *hooks->SetupTerminal = FixedSizeSetupTerminalDlg;
5858 }
5959
60-static void PASCAL FixedSizeReadIniFile(PCHAR fn, PTTSet ts) {
60+static void PASCAL FixedSizeReadIniFile(const wchar_t *fn, PTTSet ts) {
6161 (pvar->origReadIniFile)(fn, ts);
6262 ts->TerminalWidth = WIDTH;
6363 ts->TerminalHeight = HEIGHT;
--- trunk/TTXSamples/TTXRecurringCommand/TTXRecurringCommand.c (revision 9428)
+++ trunk/TTXSamples/TTXRecurringCommand/TTXRecurringCommand.c (revision 9429)
@@ -9,6 +9,8 @@
99 #include "resource.h"
1010 #include "i18n.h"
1111 #include "dlglib.h"
12+#include "inifile_com.h"
13+#include "codeconv.h"
1214
1315 #define ORDER 4000
1416
@@ -74,10 +76,10 @@
7476 return NULL;
7577 }
7678
77-WORD GetOnOff(PCHAR Sect, PCHAR Key, PCHAR FName, BOOL Default)
79+WORD GetOnOff(PCHAR Sect, PCHAR Key, const wchar_t *FName, BOOL Default)
7880 {
7981 char Temp[4];
80- GetPrivateProfileString(Sect, Key, "", Temp, sizeof(Temp), FName);
82+ GetPrivateProfileStringAFileW(Sect, Key, "", Temp, sizeof(Temp), FName);
8183 if (Default) {
8284 if (_stricmp(Temp, "off") == 0)
8385 return 0;
@@ -328,24 +330,24 @@
328330 //
329331 // TTXReadIniFile, TTXWriteIniFile -- 設定ファイルの読み書き
330332 //
331-void ReadINI(PCHAR fn, PTTSet ts) {
332- char sect[OutBuffSize];
333- char *p;
333+void ReadINI(const wchar_t *fn, PTTSet ts) {
334+ wchar_t sect[OutBuffSize];
335+ wchar_t *p;
334336
335337 // DLL ファイル名から、INI のセクション名を決める
336338 if (fn[0] == '\\' || fn[0] == '/' || (fn[0] != 0 && fn[1] == ':')) {
337- strncpy_s(sect, sizeof(sect), fn, _TRUNCATE);
339+ wcsncpy_s(sect, _countof(sect), fn, _TRUNCATE);
338340 }
339341 else {
340- GetModuleFileName(NULL, sect, sizeof(sect));
341- p = strrchr(sect, '\\');
342+ GetModuleFileNameW(NULL, sect, _countof(sect));
343+ p = wcsrchr(sect, '\\');
342344 if (!p) {
343345 return;
344346 }
345- strncpy_s(p+1, sizeof(sect) - ((p+1)-sect), fn, _TRUNCATE);
347+ wcsncpy_s(p+1, sizeof(sect) - ((p+1)-sect), fn, _TRUNCATE);
346348 }
347349
348- GetPrivateProfileString(SECTION, "Command", "", pvar->orgCommand, sizeof(pvar->orgCommand), sect);
350+ GetPrivateProfileStringAFileW(SECTION, "Command", "", pvar->orgCommand, sizeof(pvar->orgCommand), sect);
349351 strncpy_s(pvar->command, sizeof(pvar->command), pvar->orgCommand, _TRUNCATE);
350352 UnEscapeStr(pvar->command);
351353 pvar->cmdLen = (int)strlen(pvar->command);
@@ -356,7 +358,7 @@
356358 pvar->command[pvar->cmdLen] = '\0';
357359 }
358360
359- pvar->interval = GetPrivateProfileInt(SECTION, "Interval", DEFAULT_INTERVAL, sect);
361+ pvar->interval = GetPrivateProfileIntAFileW(SECTION, "Interval", DEFAULT_INTERVAL, sect);
360362 if (pvar->interval < MINIMUM_INTERVAL) {
361363 pvar->interval = MINIMUM_INTERVAL;
362364 }
@@ -364,7 +366,7 @@
364366 pvar->enable = GetOnOff(SECTION, "Enable", sect, FALSE);
365367 }
366368
367-static void PASCAL TTXReadIniFile(PCHAR fn, PTTSet ts) {
369+static void PASCAL TTXReadIniFile(const wchar_t *fn, PTTSet ts) {
368370 pvar->origReadIniFile(fn, ts);
369371 ReadINI(fn, ts);
370372
@@ -371,19 +373,19 @@
371373 return;
372374 }
373375
374-static void PASCAL TTXWriteIniFile(PCHAR fn, PTTSet ts) {
376+static void PASCAL TTXWriteIniFile(const wchar_t *fn, PTTSet ts) {
375377 char buff[20];
376378
377379 pvar->origWriteIniFile(fn, ts);
378380
379- WritePrivateProfileString(SECTION, "Enable", pvar->enable?"on":"off", fn);
381+ WritePrivateProfileStringAFileW(SECTION, "Enable", pvar->enable?"on":"off", fn);
380382
381- WritePrivateProfileString(SECTION, "Command", pvar->orgCommand, fn);
383+ WritePrivateProfileStringAFileW(SECTION, "Command", pvar->orgCommand, fn);
382384
383385 _snprintf_s(buff, sizeof(buff), _TRUNCATE, "%d", pvar->interval);
384- WritePrivateProfileString(SECTION, "Interval", buff, fn);
386+ WritePrivateProfileStringAFileW(SECTION, "Interval", buff, fn);
385387
386- WritePrivateProfileString(SECTION, "AddNewLine", pvar->add_nl?"on":"off", fn);
388+ WritePrivateProfileStringAFileW(SECTION, "AddNewLine", pvar->add_nl?"on":"off", fn);
387389
388390 return;
389391 }
@@ -403,7 +405,10 @@
403405 while (next = GetParam(buff, sizeof(buff), next)) {
404406 DequoteParam(buff, sizeof(buff), buff);
405407 if (_strnicmp(buff, "/F=", 3) == 0) {
406- ReadINI(buff+3, ts);
408+ char *f = buff+3;
409+ wchar_t *fW = ToWcharA(f);
410+ ReadINI(fW, ts);
411+ free(fW);
407412 }
408413 }
409414
--- trunk/TTXSamples/TTXResizeMenu/TTXResizeMenu.c (revision 9428)
+++ trunk/TTXSamples/TTXResizeMenu/TTXResizeMenu.c (revision 9429)
@@ -7,6 +7,7 @@
77 #include <string.h>
88
99 #include "compat_win.h"
10+#include "inifile_com.h"
1011
1112 #define ORDER 5900
1213 #define SECTION "Resize Menu"
@@ -183,7 +184,7 @@
183184 return;
184185 }
185186
186-static void PASCAL ResizeMenuReadIniFile(PCHAR fn, PTTSet ts) {
187+static void PASCAL ResizeMenuReadIniFile(const wchar_t *fn, PTTSet ts) {
187188 int i, x, y;
188189 char Key[20], Buff[100];
189190
@@ -191,7 +192,7 @@
191192
192193 for (i=0; i<MAX_MENU_ITEMS; i++) {
193194 _snprintf_s(Key, sizeof(Key), _TRUNCATE, "ResizeMenu%d", i+1);
194- GetPrivateProfileString(SECTION, Key, "\n", Buff, sizeof(Buff), fn);
195+ GetPrivateProfileStringAFileW(SECTION, Key, "\n", Buff, sizeof(Buff), fn);
195196
196197 if (sscanf_s(Buff, "%d , %d", &x, &y) == 2) {
197198 if (x < -1 ) {
--- trunk/TTXSamples/TTXViewMode/TTXViewMode.c (revision 9428)
+++ trunk/TTXSamples/TTXViewMode/TTXViewMode.c (revision 9429)
@@ -8,6 +8,7 @@
88 #include <string.h>
99 #include <windows.h>
1010 #include "dlglib.h"
11+#include "inifile_com.h"
1112
1213 #define ORDER 4000
1314 #define ID_MENU_VIEWMODE 55200
@@ -110,13 +111,13 @@
110111 }
111112 }
112113
113-static void PASCAL TTXReadIniFile(PCHAR fn, PTTSet ts) {
114+static void PASCAL TTXReadIniFile(const wchar_t *fn, PTTSet ts) {
114115 pvar->origReadIniFile(fn, ts);
115- GetPrivateProfileString(SECTION, "Password", "", pvar->password, sizeof(pvar->password), fn);
116+ GetPrivateProfileStringAFileW(SECTION, "Password", "", pvar->password, sizeof(pvar->password), fn);
116117 return;
117118 }
118119
119-static void PASCAL TTXWriteIniFile(PCHAR fn, PTTSet ts) {
120+static void PASCAL TTXWriteIniFile(const wchar_t *fn, PTTSet ts) {
120121 pvar->origWriteIniFile(fn, ts);
121122 // WritePrivateProfileString(SECTION, "Password", pvar->password, fn);
122123 return;
--- trunk/TTXSamples/TTXttyrec/CMakeLists.txt (revision 9428)
+++ trunk/TTXSamples/TTXttyrec/CMakeLists.txt (revision 9429)
@@ -48,6 +48,7 @@
4848 target_link_libraries(
4949 TTXttyplay
5050 PRIVATE
51+ common_static
5152 ttpcmn
5253 #
5354 comdlg32
@@ -101,7 +102,9 @@
101102 target_link_libraries(
102103 TTXttyrec
103104 PRIVATE
105+ common_static
104106 ttpcmn
107+ #
105108 comdlg32
106109 )
107110
--- trunk/TTXSamples/TTXttyrec/TTXttyplay.c (revision 9428)
+++ trunk/TTXSamples/TTXttyrec/TTXttyplay.c (revision 9429)
@@ -10,6 +10,8 @@
1010 #include <winsock2.h>
1111 #include <ws2tcpip.h>
1212
13+#include "inifile_com.h"
14+
1315 #include "gettimeofday.h"
1416
1517 #define ORDER 6001
@@ -416,11 +418,11 @@
416418 }
417419 }
418420
419-static void PASCAL TTXReadIniFile(PCHAR fn, PTTSet ts) {
421+static void PASCAL TTXReadIniFile(const wchar_t *fn, PTTSet ts) {
420422 (pvar->origReadIniFile)(fn, ts);
421423 // ts->TitleFormat = 0;
422- pvar->maxwait = GetPrivateProfileInt(INISECTION, "MaxWait", 0, fn);
423- pvar->speed = GetPrivateProfileInt(INISECTION, "Speed", 0, fn);
424+ pvar->maxwait = GetPrivateProfileIntAFileW(INISECTION, "MaxWait", 0, fn);
425+ pvar->speed = GetPrivateProfileIntAFileW(INISECTION, "Speed", 0, fn);
424426 }
425427
426428 static void PASCAL TTXGetSetupHooks(TTXSetupHooks *hooks) {
--- trunk/TTXSamples/TTXttyrec/TTXttyrec.c (revision 9428)
+++ trunk/TTXSamples/TTXttyrec/TTXttyrec.c (revision 9429)
@@ -9,6 +9,8 @@
99 #include <winsock2.h>
1010 #include <ws2tcpip.h>
1111
12+#include "inifile_com.h"
13+
1214 #include "gettimeofday.h"
1315
1416 #define ORDER 6000
@@ -64,10 +66,10 @@
6466 return NULL;
6567 }
6668
67-BOOL GetOnOff(PCHAR sect, PCHAR key, PCHAR fn, BOOL def) {
69+BOOL GetOnOff(PCHAR sect, PCHAR key, const wchar_t *fn, BOOL def) {
6870 char buff[4];
6971
70- GetPrivateProfileString(sect, key, "", buff, sizeof(buff), fn);
72+ GetPrivateProfileStringAFileW(sect, key, "", buff, sizeof(buff), fn);
7173
7274 if (def) {
7375 if (_stricmp(buff, "off") == 0) {
@@ -97,7 +99,7 @@
9799 pvar->record = FALSE;
98100 }
99101
100-static void PASCAL TTXReadIniFile(PCHAR fn, PTTSet ts) {
102+static void PASCAL TTXReadIniFile(const wchar_t *fn, PTTSet ts) {
101103 (pvar->origReadIniFile)(fn, ts);
102104 pvar->rec_stsize = GetOnOff(INISECTION, "RecordStartSize", fn, TRUE);
103105 }
--- trunk/teraterm/teraterm/ttsetup.h (revision 9428)
+++ trunk/teraterm/teraterm/ttsetup.h (revision 9429)
@@ -40,10 +40,10 @@
4040 // 実際の型は tttypes_key.h を include
4141 typedef struct TKeyMap_st *PKeyMap;
4242
43-typedef void (PASCAL *PReadIniFile)
44- (PCHAR FName, PTTSet ts);
45-typedef void (PASCAL *PWriteIniFile)
46- (PCHAR FName, PTTSet ts);
43+//typedef void (PASCAL *PReadIniFile)(PCHAR FName, PTTSet ts);
44+typedef void (PASCAL *PReadIniFile)(const wchar_t *FName, PTTSet ts);
45+//typedef void (PASCAL *PWriteIniFile)(PCHAR FName, PTTSet ts);
46+typedef void (PASCAL *PWriteIniFile)(const wchar_t *FName, PTTSet ts);
4747 typedef void (PASCAL *PReadKeyboardCnf)
4848 (PCHAR FName, PKeyMap KeyMap, BOOL ShowWarning);
4949 typedef void (PASCAL *PCopyHostList)
--- trunk/teraterm/teraterm/vtwin.cpp (revision 9428)
+++ trunk/teraterm/teraterm/vtwin.cpp (revision 9429)
@@ -255,7 +255,7 @@
255255 /* first instance */
256256 if (LoadTTSET()) {
257257 /* read setup info from "teraterm.ini" */
258- (*ReadIniFile)(ts.SetupFName, &ts);
258+ (*ReadIniFile)(ts.SetupFNameW, &ts);
259259 FreeTTSET();
260260 }
261261 else {
@@ -266,7 +266,7 @@
266266 // 2つめ以降のプロセスにおいても、ディスクから TERATERM.INI を読む。(2004.11.4 yutaka)
267267 if (LoadTTSET()) {
268268 /* read setup info from "teraterm.ini" */
269- (*ReadIniFile)(ts.SetupFName, &ts);
269+ (*ReadIniFile)(ts.SetupFNameW, &ts);
270270 FreeTTSET();
271271 }
272272 else {
@@ -1134,7 +1134,7 @@
11341134 strncat_s(ts.SetupFName,sizeof(ts.SetupFName),TempName,_TRUNCATE);
11351135
11361136 if (LoadTTSET()) {
1137- (*ReadIniFile)(ts.SetupFName,&ts);
1137+ (*ReadIniFile)(ts.SetupFNameW, &ts);
11381138 }
11391139 FreeTTSET();
11401140
@@ -4726,7 +4726,7 @@
47264726
47274727 CopyFileW(PrevSetupFNW, ts.SetupFNameW, TRUE);
47284728 /* write current setup values to file */
4729- (*WriteIniFile)(ts.SetupFName, &ts);
4729+ (*WriteIniFile)(ts.SetupFNameW, &ts);
47304730 /* copy host list */
47314731 char * PrevSetupFN = ToCharW(PrevSetupFNW);
47324732 (*CopyHostList)(PrevSetupFN, ts.SetupFName);
--- trunk/teraterm/ttpset/ttset.c (revision 9428)
+++ trunk/teraterm/ttpset/ttset.c (revision 9429)
@@ -47,6 +47,7 @@
4747 #include "servicenames.h"
4848 #include "codeconv.h"
4949 #include "win32helper.h"
50+#include "inifile_com.h"
5051
5152 #define DllExport __declspec(dllexport)
5253 #include "ttset.h"
@@ -160,87 +161,10 @@
160161 return (ret);
161162 }
162163
163-/**
164- * GetPrivateProfileStringA() のファイル名だけが wchar_t 版
165- */
166-DWORD GetPrivateProfileStringAFileW(const char *appA, const char *keyA, const char* defA, char *strA, DWORD size, const wchar_t *filenameW)
167-{
168- DWORD lenA;
169- wchar_t *appW = ToWcharA(appA);
170- wchar_t *keyW = ToWcharA(keyA);
171- wchar_t *defW = ToWcharA(defA);
172- DWORD lenW_max = size;
173- wchar_t *strW = malloc(sizeof(wchar_t) * lenW_max);
174- DWORD lenW = GetPrivateProfileStringW(appW, keyW, defW, strW, lenW_max, filenameW);
175- free(appW);
176- free(keyW);
177- free(defW);
178- if (lenW == 0) {
179- free(strW);
180- *strA = '\0';
181- return 0;
182- }
183- if (lenW < lenW_max) {
184- lenW++; // for L'\0'
185- }
186- lenA = WideCharToMultiByte(CP_ACP, 0, strW, lenW, strA, size, NULL, NULL);
187- // GetPrivateProfileStringW() の戻り値は '\0' を含まない文字列長
188- // WideCharToMultiByte() の戻り値は '\0' を含む文字列長
189- if (lenW != 0 && strA[lenA-1] == 0) {
190- lenA--;
191- }
192- free(strW);
193- return lenA;
194-}
195-
196-/**
197- * WritePrivateProfileStringA() のファイル名だけが wchar_t 版
198- */
199-BOOL WritePrivateProfileStringAFileW(const char *appA, const char *keyA, const char *strA, const wchar_t *filenameW)
200-{
201- wchar_t *appW = ToWcharA(appA);
202- wchar_t *keyW = ToWcharA(keyA);
203- wchar_t *strW = ToWcharA(strA);
204- BOOL r = WritePrivateProfileStringW(appW, keyW, strW, filenameW);
205- free(appW);
206- free(keyW);
207- free(strW);
208- return r;
209-}
210-
211-/**
212- * GetPrivateProfileIntFileA() のファイル名だけが wchar_t 版
213- */
214-UINT GetPrivateProfileIntFileW(const char *appA, const char *keyA, int def, const wchar_t *filenameW)
215-{
216- wchar_t *appW = ToWcharA(appA);
217- wchar_t *keyW = ToWcharA(keyA);
218- UINT r = GetPrivateProfileIntW(appW, keyW, def, filenameW);
219- free(appW);
220- free(keyW);
221- return r;
222-}
223-
224-/**
225- * WritePrivateProfileInt() のファイル名だけが wchar_t 版
226- */
227-BOOL WritePrivateProfileIntFileW(const char *appA, const char *keyA, int val, const wchar_t *filenameW)
228-{
229- wchar_t strW[MAX_PATH];
230- wchar_t *appW = ToWcharA(appA);
231- wchar_t *keyW = ToWcharA(keyA);
232- BOOL r;
233- _snwprintf_s(strW, _countof(strW), _TRUNCATE, L"%d", val);
234- r = WritePrivateProfileStringW(appW, keyW, strW, filenameW);
235- free(appW);
236- free(keyW);
237- return r;
238-}
239-
240164 #if INI_FILE_IS_UNICODE
241165 #undef GetPrivateProfileInt
242166 #undef GetPrivateProfileString
243-#define GetPrivateProfileInt(p1, p2, p3, p4) GetPrivateProfileIntFileW(p1, p2, p3, p4)
167+#define GetPrivateProfileInt(p1, p2, p3, p4) GetPrivateProfileIntAFileW(p1, p2, p3, p4)
244168 #define GetPrivateProfileString(p1, p2, p3, p4, p5, p6) GetPrivateProfileStringAFileW(p1, p2, p3, p4, p5, p6)
245169 #define GetPrivateProfileStringA(p1, p2, p3, p4, p5, p6) GetPrivateProfileStringAFileW(p1, p2, p3, p4, p5, p6)
246170 #define WritePrivateProfileStringA(p1, p2, p3, p4) WritePrivateProfileStringAFileW(p1, p2, p3, p4)
@@ -392,11 +316,7 @@
392316 strncpy_s(name, len, icon, _TRUNCATE);
393317 }
394318
395-#if INI_FILE_IS_UNICODE
396319 static WORD GetOnOff(PCHAR Sect, PCHAR Key, const wchar_t *FName, BOOL Default)
397-#else
398-static WORD GetOnOff(PCHAR Sect, PCHAR Key, const char *FName, BOOL Default)
399-#endif
400320 {
401321 char Temp[4];
402322 GetPrivateProfileString(Sect, Key, "", Temp, sizeof(Temp), FName);
@@ -414,21 +334,13 @@
414334 }
415335 }
416336
417-#if INI_FILE_IS_UNICODE
418337 void WriteOnOff(PCHAR Sect, PCHAR Key, const wchar_t *FName, WORD Flag)
419-#else
420-void WriteOnOff(PCHAR Sect, PCHAR Key, const char *FName, WORD Flag)
421-#endif
422338 {
423339 const char *on_off = (Flag != 0) ? "on" : "off";
424340 WritePrivateProfileStringA(Sect, Key, on_off, FName);
425341 }
426342
427-#if INI_FILE_IS_UNICODE
428343 void WriteInt(PCHAR Sect, PCHAR Key, const wchar_t *FName, int i)
429-#else
430-void WriteInt(PCHAR Sect, PCHAR Key, const char *FName, int i)
431-#endif
432344 {
433345 char Temp[15];
434346 _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%d", i);
@@ -435,11 +347,7 @@
435347 WritePrivateProfileStringA(Sect, Key, Temp, FName);
436348 }
437349
438-#if INI_FILE_IS_UNICODE
439350 void WriteUint(PCHAR Sect, PCHAR Key, const wchar_t *FName, UINT i)
440-#else
441-void WriteUint(PCHAR Sect, PCHAR Key, const char *FName, UINT i)
442-#endif
443351 {
444352 char Temp[15];
445353 _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%u", i);
@@ -446,11 +354,7 @@
446354 WritePrivateProfileStringA(Sect, Key, Temp, FName);
447355 }
448356
449-#if INI_FILE_IS_UNICODE
450357 void WriteInt2(PCHAR Sect, PCHAR Key, const wchar_t *FName, int i1, int i2)
451-#else
452-void WriteInt2(PCHAR Sect, PCHAR Key, const char *FName, int i1, int i2)
453-#endif
454358 {
455359 char Temp[32];
456360 _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%d,%d", i1, i2);
@@ -457,13 +361,8 @@
457361 WritePrivateProfileStringA(Sect, Key, Temp, FName);
458362 }
459363
460-#if INI_FILE_IS_UNICODE
461364 void WriteInt4(PCHAR Sect, PCHAR Key, const wchar_t *FName,
462365 int i1, int i2, int i3, int i4)
463-#else
464-void WriteInt4(PCHAR Sect, PCHAR Key, const char *FName,
465- int i1, int i2, int i3, int i4)
466-#endif
467366 {
468367 char Temp[64];
469368 _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%d,%d,%d,%d",
@@ -471,13 +370,8 @@
471370 WritePrivateProfileStringA(Sect, Key, Temp, FName);
472371 }
473372
474-#if INI_FILE_IS_UNICODE
475373 void WriteInt6(PCHAR Sect, PCHAR Key, const wchar_t *FName,
476374 int i1, int i2, int i3, int i4, int i5, int i6)
477-#else
478-void WriteInt6(PCHAR Sect, PCHAR Key, const char *FName,
479- int i1, int i2, int i3, int i4, int i5, int i6)
480-#endif
481375 {
482376 char Temp[96];
483377 _snprintf_s(Temp, sizeof(Temp), _TRUNCATE, "%d,%d,%d,%d,%d,%d",
@@ -486,13 +380,8 @@
486380 }
487381
488382 // フォント情報書き込み、4パラメータ版
489-#if INI_FILE_IS_UNICODE
490383 static void WriteFont(PCHAR Sect, PCHAR Key, const wchar_t *FName,
491384 PCHAR Name, int x, int y, int charset)
492-#else
493-static void WriteFont(PCHAR Sect, PCHAR Key, const char *FName,
494- PCHAR Name, int x, int y, int charset)
495-#endif
496385 {
497386 char Temp[80];
498387 if (Name[0] != 0)
@@ -504,15 +393,9 @@
504393 }
505394
506395 // フォント情報読み込み、4パラメータ版
507-#if INI_FILE_IS_UNICODE
508396 static void ReadFont(
509397 const char *Sect, const char *Key, const char *Default, const wchar_t *FName,
510398 char *FontName, size_t FontNameLen, POINT *FontSize, int *FontCharSet)
511-#else
512-static void ReadFont(
513- const char *Sect, const char *Key, const char *Default, const char *FName,
514- char *FontName, size_t FontNameLen, POINT *FontSize, int *FontCharSet)
515-#endif
516399 {
517400 char Temp[MAX_PATH];
518401 GetPrivateProfileString(Sect, Key, Default,
@@ -533,15 +416,9 @@
533416 }
534417
535418 // フォント情報読み込み、3パラメータ版
536-#if INI_FILE_IS_UNICODE
537419 static void ReadFont3(
538420 const char *Sect, const char *Key, const char *Default, const wchar_t *FName,
539421 char *FontName, size_t FontNameLen, int *FontPoint, int *FontCharSet)
540-#else
541-static void ReadFont3(
542- const char *Sect, const char *Key, const char *Default, const char *FName,
543- char *FontName, size_t FontNameLen, int *FontPoint, int *FontCharSet)
544-#endif
545422 {
546423 char Temp[MAX_PATH];
547424 GetPrivateProfileString(Sect, Key, Default,
@@ -840,16 +717,11 @@
840717
841718 }
842719
843-void PASCAL ReadIniFile(PCHAR FNameA, PTTSet ts)
720+void PASCAL ReadIniFile(const wchar_t *FName, PTTSet ts)
844721 {
845722 int i;
846723 HDC TmpDC;
847724 char Temp[MAX_PATH], Temp2[MAX_PATH], *p;
848-#if INI_FILE_IS_UNICODE
849- const wchar_t *FName = ToWcharA(FNameA);
850-#else
851- const char *FName = FNameA;
852-#endif
853725
854726 ts->Minimize = 0;
855727 ts->HideWindow = 0;
@@ -2390,13 +2262,9 @@
23902262 if (ts->UnicodeEmojiWidth < 1 || 2 < ts->UnicodeEmojiWidth) {
23912263 ts->UnicodeEmojiWidth = 1;
23922264 }
2393-
2394-#if INI_FILE_IS_UNICODE
2395- free((void *)FName);
2396-#endif
23972265 }
23982266
2399-void PASCAL WriteIniFile(PCHAR FNameA, PTTSet ts)
2267+void PASCAL WriteIniFile(const wchar_t *FName, PTTSet ts)
24002268 {
24012269 int i;
24022270 char Temp[MAX_PATH];
@@ -2403,11 +2271,6 @@
24032271 char buf[20];
24042272 int ret;
24052273 char uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG], msg[MAX_UIMSG];
2406-#if INI_FILE_IS_UNICODE
2407- const wchar_t *FName = ToWcharA(FNameA);
2408-#else
2409- const char *FName = FNameA;
2410-#endif
24112274
24122275 /* version */
24132276 ret = WritePrivateProfileString(Section, "Version", TT_VERSION_STR("."), FName);
@@ -3323,13 +3186,8 @@
33233186 WritePrivateProfileString(ETERM_SECTION, "BGThemeFile",
33243187 ts->EtermLookfeel.BGThemeFile, FName);
33253188 {
3326-#if INI_FILE_IS_UNICODE
33273189 wchar_t TempW[MAX_PATH];
33283190 _snwprintf_s(TempW, _countof(TempW), _TRUNCATE, L"%hs\\%hs", ts->HomeDir, BG_THEME_IMAGEFILE);
3329-#else
3330- char TempW[MAX_PATH];
3331- _snprintf_s(TempW, _countof(TempW), _TRUNCATE, "%s\\%s", ts->HomeDir, BG_THEME_IMAGEFILE);
3332-#endif
33333191 WritePrivateProfileStringA(BG_SECTION, BG_DESTFILE, ts->BGImageFilePath, TempW);
33343192 WriteInt(BG_SECTION, BG_THEME_IMAGE_BRIGHTNESS1, TempW, ts->BGImgBrightness);
33353193 WriteInt(BG_SECTION, BG_THEME_IMAGE_BRIGHTNESS2, TempW, ts->BGImgBrightness);
@@ -3733,10 +3591,6 @@
37333591 WriteInt(Section, "UnicodeAmbiguousWidth", FName, ts->UnicodeAmbiguousWidth);
37343592 WriteOnOff(Section, "UnicodeEmojiOverride", FName, ts->UnicodeEmojiOverride);
37353593 WriteInt(Section, "UnicodeEmojiWidth", FName, ts->UnicodeEmojiWidth);
3736-
3737-#if INI_FILE_IS_UNICODE
3738- free((void *)FName);
3739-#endif
37403594 }
37413595
37423596 void PASCAL CopySerialList(PCHAR IniSrcA, PCHAR IniDestA, PCHAR section,
@@ -4039,8 +3893,9 @@
40393893 if (_stricmp(ts->SetupFName, Temp) != 0) {
40403894 strncpy_s(ts->SetupFName, sizeof(ts->SetupFName), Temp,
40413895 _TRUNCATE);
3896+ free(ts->SetupFNameW);
40423897 ts->SetupFNameW = ToWcharA(ts->SetupFName);
4043- ReadIniFile(ts->SetupFName, ts);
3898+ ReadIniFile(ts->SetupFNameW, ts);
40443899 }
40453900 }
40463901 }
--- trunk/ttssh2/ttxssh/ttxssh.c (revision 9428)
+++ trunk/ttssh2/ttxssh/ttxssh.c (revision 9429)
@@ -86,6 +86,8 @@
8686
8787 #include "compat_win.h"
8888 #include "codeconv.h"
89+#include "inifile_com.h"
90+#include "asprintf.h"
8991
9092 #include "libputty.h"
9193
@@ -98,6 +100,12 @@
98100 #undef EndDialog
99101 #define EndDialog(p1,p2) \
100102 TTEndDialog(p1, p2)
103+#undef GetPrivateProfileInt
104+#undef GetPrivateProfileString
105+#define GetPrivateProfileInt(p1, p2, p3, p4) GetPrivateProfileIntAFileW(p1, p2, p3, p4)
106+#define GetPrivateProfileString(p1, p2, p3, p4, p5, p6) GetPrivateProfileStringAFileW(p1, p2, p3, p4, p5, p6)
107+#define GetPrivateProfileStringA(p1, p2, p3, p4, p5, p6) GetPrivateProfileStringAFileW(p1, p2, p3, p4, p5, p6)
108+#define WritePrivateProfileStringA(p1, p2, p3, p4) WritePrivateProfileStringAFileW(p1, p2, p3, p4)
101109
102110 #define MATCH_STR(s, o) strncmp((s), (o), NUM_ELEM(o) - 1)
103111 #define MATCH_STR_I(s, o) _strnicmp((s), (o), NUM_ELEM(o) - 1)
@@ -223,13 +231,13 @@
223231 pvar->ts_SSH->TryDefaultAuth = FALSE;
224232 }
225233
226-static BOOL read_BOOL_option(PCHAR fileName, char *keyName, BOOL def)
234+static BOOL read_BOOL_option(const wchar_t *fileName, char *keyName, BOOL def)
227235 {
228236 char buf[1024];
229237
230238 buf[0] = 0;
231- GetPrivateProfileString("TTSSH", keyName, "", buf, sizeof(buf),
232- fileName);
239+ GetPrivateProfileStringAFileW("TTSSH", keyName, "", buf, sizeof(buf),
240+ fileName);
233241 if (buf[0] == 0) {
234242 return def;
235243 } else {
@@ -239,7 +247,7 @@
239247 }
240248 }
241249
242-static void read_string_option(PCHAR fileName, char *keyName,
250+static void read_string_option(const wchar_t *fileName, char *keyName,
243251 char *def, char *buf, int bufSize)
244252 {
245253
@@ -247,7 +255,7 @@
247255 GetPrivateProfileString("TTSSH", keyName, def, buf, bufSize, fileName);
248256 }
249257
250-static void read_ssh_options(PTInstVar pvar, PCHAR fileName)
258+static void read_ssh_options(PTInstVar pvar, const wchar_t *fileName)
251259 {
252260 char buf[1024];
253261 TS_SSH *settings = pvar->ts_SSH;
@@ -381,7 +389,7 @@
381389 clear_local_settings(pvar);
382390 }
383391
384-static void write_ssh_options(PTInstVar pvar, PCHAR fileName,
392+static void write_ssh_options(PTInstVar pvar, const wchar_t *fileName,
385393 TS_SSH *settings, BOOL copy_forward)
386394 {
387395 char buf[1024];
@@ -1339,7 +1347,7 @@
13391347 *hooks->GetHostName = TTXGetHostName;
13401348 }
13411349
1342-static void PASCAL TTXReadINIFile(PCHAR fileName, PTTSet ts)
1350+static void PASCAL TTXReadINIFile(const wchar_t *fileName, PTTSet ts)
13431351 {
13441352 (pvar->ReadIniFile) (fileName, ts);
13451353 read_ssh_options(pvar, fileName);
@@ -1348,7 +1356,7 @@
13481356 FWDUI_load_settings(pvar);
13491357 }
13501358
1351-static void PASCAL TTXWriteINIFile(PCHAR fileName, PTTSet ts)
1359+static void PASCAL TTXWriteINIFile(const wchar_t *fileName, PTTSet ts)
13521360 {
13531361 (pvar->WriteIniFile) (fileName, ts);
13541362 *pvar->ts_SSH = pvar->settings;
@@ -1358,15 +1366,16 @@
13581366 }
13591367
13601368 static void read_ssh_options_from_user_file(PTInstVar pvar,
1361- char *user_file_name)
1369+ const wchar_t *user_file_name)
13621370 {
13631371 if (user_file_name[0] == '.') {
13641372 read_ssh_options(pvar, user_file_name);
13651373 } else {
1366- char buf[1024];
1374+ wchar_t *fname;
13671375
1368- get_teraterm_dir_relative_name(buf, sizeof(buf), user_file_name);
1369- read_ssh_options(pvar, buf);
1376+ fname = get_teraterm_dir_relative_nameW(user_file_name);
1377+ read_ssh_options(pvar, fname);
1378+ free(fname);
13701379 }
13711380
13721381 pvar->settings = *pvar->ts_SSH;
@@ -1433,14 +1442,19 @@
14331442 action = OPTION_NONE;
14341443
14351444 if ((option[0] == '-' || option[0] == '/')) {
1445+ wchar_t* option2W;
14361446 if (MATCH_STR(option + 1, "ssh") == 0) {
14371447 if (MATCH_STR(option + 4, "-f=") == 0) {
14381448 strncpy_s(option2, opt_len, option + 7, _TRUNCATE);
1439- read_ssh_options_from_user_file(pvar, option2);
1449+ option2W = ToWcharA(option2);
1450+ read_ssh_options_from_user_file(pvar, option2W);
1451+ free(option2W);
14401452 action = OPTION_CLEAR;
14411453 } else if (MATCH_STR(option + 4, "-consume=") == 0) {
14421454 strncpy_s(option2, opt_len, option + 13, _TRUNCATE);
1443- read_ssh_options_from_user_file(pvar, option2);
1455+ option2W = ToWcharA(option2);
1456+ read_ssh_options_from_user_file(pvar, option2W);
1457+ free(option2W);
14441458 DeleteFile(option2);
14451459 action = OPTION_CLEAR;
14461460 }
@@ -1448,7 +1462,9 @@
14481462 // ttermpro.exe の /F= 指定でも TTSSH の設定を読む (2006.10.11 maya)
14491463 } else if (MATCH_STR_I(option + 1, "f=") == 0) {
14501464 strncpy_s(option2, opt_len, option + 3, _TRUNCATE);
1451- read_ssh_options_from_user_file(pvar, option2);
1465+ option2W = ToWcharA(option2);
1466+ read_ssh_options_from_user_file(pvar, option2W);
1467+ free(option2W);
14521468 // Tera Term側でも解釈する必要があるので消さない
14531469 }
14541470 }
@@ -2454,6 +2470,27 @@
24542470
24552471 }
24562472
2473+/**
2474+ * ファイル名をフルパスに変換する
2475+ * @return フルパスファイル名
2476+ * free()すること
2477+ */
2478+wchar_t *get_teraterm_dir_relative_nameW(const wchar_t *basename)
2479+{
2480+ wchar_t *path;
2481+ wchar_t *ret;
2482+
2483+ if (basename[0] == '\\' || basename[0] == '/'
2484+ || (basename[0] != 0 && basename[1] == ':')) {
2485+ return _wcsdup(basename);
2486+ }
2487+
2488+ // ttermpro.exeのパス
2489+ path = GetHomeDirW(NULL);
2490+ aswprintf(&ret, L"%s\\%s", path, basename);
2491+ return ret;
2492+}
2493+
24572494 void get_teraterm_dir_relative_name(char *buf, int bufsize,
24582495 char *basename)
24592496 {
@@ -4662,7 +4699,11 @@
46624699 buf[cmdlen] = 0;
46634700 cmd[i] = 0;
46644701
4665- write_ssh_options(pvar, tmpFile, &pvar->settings, FALSE);
4702+ {
4703+ wchar_t *tmpFileW = ToWcharA(tmpFile);
4704+ write_ssh_options(pvar, tmpFileW, &pvar->settings, FALSE);
4705+ free(tmpFileW);
4706+ }
46664707
46674708 strncat_s(cmd, cmdlen, " /ssh-consume=", _TRUNCATE);
46684709 strncat_s(cmd, cmdlen, tmpFile, _TRUNCATE);
--- trunk/ttssh2/ttxssh/ttxssh.h (revision 9428)
+++ trunk/ttssh2/ttxssh/ttxssh.h (revision 9429)
@@ -127,7 +127,7 @@
127127
128128
129129 /*
130- * Host key rotation
130+ * Host key rotation
131131 */
132132 #define SSH_UPDATE_HOSTKEYS_NO 0
133133 #define SSH_UPDATE_HOSTKEYS_YES 1
@@ -384,6 +384,7 @@
384384 #endif
385385
386386 void get_teraterm_dir_relative_name(char *buf, int bufsize, char *basename);
387+wchar_t *get_teraterm_dir_relative_nameW(const wchar_t *basename);
387388 int copy_teraterm_dir_relative_path(char *dest, int destsize, char *basename);
388389 int uuencode(unsigned char *src, int srclen, unsigned char *target, int targsize);
389390
Show on old repository browser