diff --git a/src/android/nact_android.cpp b/src/android/nact_android.cpp index 13576b9..86a6a07 100644 --- a/src/android/nact_android.cpp +++ b/src/android/nact_android.cpp @@ -11,9 +11,8 @@ void NACT::text_dialog() if (!jni.env()) return; - char *oldstr = encoding->toUtf8(tvar[tvar_index - 1]); - jstring joldstr = jni.env()->NewStringUTF(oldstr); - free(oldstr); + std::string oldstr = encoding->toUtf8(tvar[tvar_index - 1]); + jstring joldstr = jni.env()->NewStringUTF(oldstr.c_str()); if (!joldstr) { WARNING("Failed to allocate a string"); return; @@ -23,9 +22,8 @@ void NACT::text_dialog() if (!jnewstr) return; const char* newstr_utf8 = jni.env()->GetStringUTFChars(jnewstr, NULL); - char* newstr = encoding->fromUtf8(newstr_utf8); - strcpy_s(tvar[tvar_index - 1], 22, newstr); - free(newstr); + std::string newstr = encoding->fromUtf8(newstr_utf8); + strcpy_s(tvar[tvar_index - 1], 22, newstr.c_str()); jni.env()->ReleaseStringUTFChars(jnewstr, newstr_utf8); } diff --git a/src/config.cpp b/src/config.cpp index cccdaa1..9b25f2d 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -111,9 +111,7 @@ TexthookMode parse_texthook_mode(const char *s, int lineno = -1) void init_string(std::string& s, Encoding* encoding, const char *dflt) { - char *encoded = encoding->fromUtf8(s.empty() ? dflt : s.c_str()); - s = encoded; - free(encoded); + s = encoding->fromUtf8(s.empty() ? dflt : s.c_str()); } } // namespace diff --git a/src/debugger/cli_frontend.cpp b/src/debugger/cli_frontend.cpp index bb0c2de..7642a57 100644 --- a/src/debugger/cli_frontend.cpp +++ b/src/debugger/cli_frontend.cpp @@ -348,9 +348,8 @@ CliFrontend::CommandResult CliFrontend::cmd_string() { if (no < 1 || no > MAX_STRVAR) { printf("Bad string index %s\n", arg); } else { - char *utf = g_nact->encoding->toUtf8(g_nact->get_string(no - 1)); - printf("string[%d] = \"%s\"\n", no, utf); // TODO: escaping - free(utf); + std::string utf = g_nact->encoding->toUtf8(g_nact->get_string(no - 1)); + printf("string[%d] = \"%s\"\n", no, utf.c_str()); // TODO: escaping } arg = strtok(NULL, whitespaces); } diff --git a/src/debugger/dap_frontend.cpp b/src/debugger/dap_frontend.cpp index c6d3bb5..eb50d49 100644 --- a/src/debugger/dap_frontend.cpp +++ b/src/debugger/dap_frontend.cpp @@ -141,12 +141,7 @@ private: } std::string format_string_value(const char* str) { - char *utf = g_nact->encoding->toUtf8(str); - std::string value = "\""; - value += utf; - value += "\""; - free(utf); - return value; + return "\"" + g_nact->encoding->toUtf8(str) + "\""; } void send_json(Json& json) { @@ -403,9 +398,7 @@ private: } value = value.substr(1, value.size() - 2); - char* encoded = g_nact->encoding->fromUtf8(value.c_str()); - g_nact->set_string(index, encoded); - free(encoded); + g_nact->set_string(index, g_nact->encoding->fromUtf8(value.c_str()).c_str()); resp["success"] = true; resp["body"] = { diff --git a/src/emscripten/nact_emscripten.cpp b/src/emscripten/nact_emscripten.cpp index 8ce9e0f..c40fd4b 100644 --- a/src/emscripten/nact_emscripten.cpp +++ b/src/emscripten/nact_emscripten.cpp @@ -19,7 +19,7 @@ Uint32 custom_event_type = static_cast(-1); void NACT::text_dialog() { static char buf[256]; - char *oldstr = encoding->toUtf8(tvar[tvar_index - 1]); + std::string oldstr = encoding->toUtf8(tvar[tvar_index - 1]); int ok = EM_ASM_({ var r = xsystem35.shell.inputString("文字列を入力してください", UTF8ToString($0), $1); if (r) { @@ -27,12 +27,9 @@ void NACT::text_dialog() return 1; } return 0; - }, oldstr, tvar_maxlen, buf, sizeof buf); - free(oldstr); + }, oldstr.c_str(), tvar_maxlen, buf, sizeof buf); if (ok) { - char *newstr = encoding->fromUtf8(buf); - strcpy_s(tvar[tvar_index - 1], 22, newstr); - free(newstr); + strcpy_s(tvar[tvar_index - 1], 22, encoding->fromUtf8(buf).c_str()); } } diff --git a/src/encoding.cpp b/src/encoding.cpp index c02109b..9062cdd 100644 --- a/src/encoding.cpp +++ b/src/encoding.cpp @@ -24,15 +24,14 @@ public: return sjis_to_unicode(code); } - char* fromUtf8(const char* str) override + std::string fromUtf8(const char* str) override { unsigned char* src = (unsigned char*)str; - unsigned char* dst = (unsigned char*)malloc(strlen(str) + 1); - unsigned char* dstp = dst; + std::string result; while (*src) { if (*src <= 0x7f) { - *dstp++ = *src++; + result += *src++; continue; } @@ -44,36 +43,34 @@ public: u = (src[0] & 0xf) << 12 | (src[1] & 0x3f) << 6 | (src[2] & 0x3f); src += 3; } else { - *dstp++ = '?'; + result += '?'; do src++; while ((*src & 0xc0) == 0x80); continue; } if (u > 0xff60 && u <= 0xff9f) { - *dstp++ = u - 0xff60 + 0xa0; + result += u - 0xff60 + 0xa0; } else { int c = unicode_to_sjis(u); if (c) { - *dstp++ = c >> 8; - *dstp++ = c & 0xff; + result += c >> 8; + result += c & 0xff; } else { - *dstp++ = '?'; + result += '?'; } } } - *dstp = '\0'; - return (char*)dst; + return result; } - char* toUtf8(const char* str) override + std::string toUtf8(const char* str) override { unsigned char* src = (unsigned char*)str; - unsigned char* dst = (unsigned char*)malloc(strlen(str) * 3 + 1); - unsigned char* dstp = dst; + std::string result; while (*src) { if (*src <= 0x7f) { - *dstp++ = *src++; + result += *src++; continue; } @@ -87,18 +84,17 @@ public: } if (c <= 0x7f) { - *dstp++ = c; + result += c; } else if (c <= 0x7ff) { - *dstp++ = 0xc0 | c >> 6; - *dstp++ = 0x80 | (c & 0x3f); + result += 0xc0 | c >> 6; + result += 0x80 | (c & 0x3f); } else { - *dstp++ = 0xe0 | c >> 12; - *dstp++ = 0x80 | (c >> 6 & 0x3f); - *dstp++ = 0x80 | (c & 0x3f); + result += 0xe0 | c >> 12; + result += 0x80 | (c >> 6 & 0x3f); + result += 0x80 | (c & 0x3f); } } - *dstp = '\0'; - return (char*)dst; + return result; } private: @@ -179,14 +175,14 @@ public: return code; } - char* fromUtf8(const char* s) override + std::string fromUtf8(const char* s) override { - return strdup(s); + return std::string(s); } - char* toUtf8(const char* s) override + std::string toUtf8(const char* s) override { - return strdup(s); + return std::string(s); } }; diff --git a/src/encoding.h b/src/encoding.h index 5b3cbf7..fbc98f4 100644 --- a/src/encoding.h +++ b/src/encoding.h @@ -2,6 +2,7 @@ #define _ENCODING_H_ #include +#include // Gaiji characters are mapped to Unicode Private Use Area U+E000-U+E0BB. const int GAIJI_FIRST = 0xE000; @@ -28,8 +29,8 @@ class Encoding { } // Convert from/to utf-8 encoding. Caller must free() the returned buffer. - virtual char* fromUtf8(const char* s) = 0; - virtual char* toUtf8(const char* s) = 0; + virtual std::string fromUtf8(const char* s) = 0; + virtual std::string toUtf8(const char* s) = 0; }; #endif // _ENCODING_H_ diff --git a/src/win/nact_win.cpp b/src/win/nact_win.cpp index 51bfb5b..4796b8a 100644 --- a/src/win/nact_win.cpp +++ b/src/win/nact_win.cpp @@ -91,11 +91,10 @@ void NACT::text_dialog() swprintf_s(wstring, 64, L"文字列を入力してください(最大%d文字)", g_nact->tvar_maxlen); SetWindowTextW(GetDlgItem(hDlg, IDC_TEXT), wstring); - char *oldstr = g_nact->encoding->toUtf8(g_nact->tvar[g_nact->tvar_index - 1]); - MultiByteToWideChar(CP_UTF8, 0, oldstr, -1, wstring, 64); + std::string oldstr = g_nact->encoding->toUtf8(g_nact->tvar[g_nact->tvar_index - 1]); + MultiByteToWideChar(CP_UTF8, 0, oldstr.c_str(), -1, wstring, 64); SetWindowTextW(GetDlgItem(hDlg, IDC_EDITBOX), wstring); EnableWindow(GetDlgItem(hDlg, IDOK), oldstr[0] != '\0'); - free(oldstr); } break; @@ -115,9 +114,7 @@ void NACT::text_dialog() { GetDlgItemTextW(hDlg, IDC_EDITBOX, wstring, 64); WideCharToMultiByte(CP_UTF8, 0, wstring, -1, string, sizeof(string), NULL, NULL); - char *newstr = g_nact->encoding->fromUtf8(string); - strcpy_s(g_nact->tvar[g_nact->tvar_index - 1], 22, newstr); - free(newstr); + strcpy_s(g_nact->tvar[g_nact->tvar_index - 1], 22, g_nact->encoding->fromUtf8(string).c_str()); EndDialog(hDlg, IDOK); } break;