From a5c4d3bbfddd9f45d045bb9d24b40511f783adcc Mon Sep 17 00:00:00 2001 From: nathancorvussolis Date: Fri, 19 Jun 2015 02:18:58 +0900 Subject: [PATCH] =?UTF-8?q?2.1.0=20UTF-8,=20UTF-16=E3=81=AE=E4=B8=8D?= =?UTF-8?q?=E6=AD=A3=E3=81=AA=E3=82=B3=E3=83=BC=E3=83=89=E3=82=92=E3=82=A8?= =?UTF-8?q?=E3=83=A9=E3=83=BC=E3=81=A8=E3=81=99=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E3=81=97=E3=81=BE=E3=81=97=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.TXT | 7 +- crvskkserv/crvskkserv.h | 8 +- crvskkserv/eucjis2004.cpp | 144 ++++++++++------------------ crvskkserv/eucjis2004.h | 12 +-- crvskkserv/search_google_cgiapi.cpp | 34 ++++--- crvskkserv/utf8.cpp | 4 +- 6 files changed, 84 insertions(+), 125 deletions(-) diff --git a/README.TXT b/README.TXT index 4418ddf..99f0297 100644 --- a/README.TXT +++ b/README.TXT @@ -1,7 +1,7 @@  ------------------------------------------------------------------------------- - crvskkserv 2.0.2 + crvskkserv 2.1.0 ------------------------------------------------------------------------------- @@ -36,7 +36,8 @@ UTF-8からEUC-JIS-2004に変換できない文字を含む候補は除外され "1<見出し語> " 辞書検索 - 応答 : 検索結果 "1/<候補 1>/<候補 2>/ … /<候補 n>\n" または 検索結果なし "4\n" + 応答 : 検索結果 "1/<候補 1>/<候補 2>/ … /<候補 n>\n" + または 検索結果なし "4\n" "2" バージョン番号取得 @@ -66,7 +67,7 @@ crvskkserv The MIT License -Copyright (c) 2012-2014 SASAKI Nobuyuki +Copyright (C) 2012-2015 SASAKI Nobuyuki Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), diff --git a/crvskkserv/crvskkserv.h b/crvskkserv/crvskkserv.h index af620e4..fb01f77 100644 --- a/crvskkserv/crvskkserv.h +++ b/crvskkserv/crvskkserv.h @@ -2,13 +2,13 @@ #pragma once #define RC_PRODUCT "crvskkserv" -#define RC_VERSION "2.0.2" -#define RC_VERSION_D 2,0,2,0 -#define RC_TITLE "crvskkserv (ver. 2.0.2)" +#define RC_VERSION "2.1.0" +#define RC_VERSION_D 2,1,0,0 +#define RC_TITLE "crvskkserv (ver. 2.1.0)" #define RC_AUTHOR "nathancorvussolis" #define APP_TITLE L"crvskkserv" -#define APP_VERSION L"2.0.2" +#define APP_VERSION L"2.1.0" #define RES_VER RC_PRODUCT "/" RC_VERSION " " #define REQ_END '0' diff --git a/crvskkserv/eucjis2004.cpp b/crvskkserv/eucjis2004.cpp index fc6803d..baca4e6 100644 --- a/crvskkserv/eucjis2004.cpp +++ b/crvskkserv/eucjis2004.cpp @@ -165,6 +165,21 @@ size_t EucJis2004ToUcp(LPCSTR src, size_t srcsize, PUCSCHAR ucp1, PUCSCHAR ucp2) return srcused; } +// 終端NULLを付加 + +void AddNullWideChar(size_t *srcsize, size_t si, LPWSTR dst, size_t *dstsize, size_t di) +{ + if(srcsize != NULL) + { + *srcsize = si; + } + *dstsize = di + 1; + if(dst != NULL) + { + *(dst + di) = L'\0'; + } +} + // EUC-JIS-2004をUTF-16へ変換 BOOL EucJis2004ToWideChar(LPCSTR src, size_t *srcsize, LPWSTR dst, size_t *dstsize) @@ -179,6 +194,11 @@ BOOL EucJis2004ToWideChar(LPCSTR src, size_t *srcsize, LPWSTR dst, size_t *dstsi return FALSE; } + if(dst == NULL) + { + *dstsize = (size_t)-1; + } + if(src == NULL) { *dstsize = 0; @@ -192,7 +212,7 @@ BOOL EucJis2004ToWideChar(LPCSTR src, size_t *srcsize, LPWSTR dst, size_t *dstsi for(si = 0; ; si++) { - if((ss <= si) || (*(src + si) == 0x00)) + if((ss <= si) || (*(src + si) == '\0')) { break; } @@ -201,15 +221,7 @@ BOOL EucJis2004ToWideChar(LPCSTR src, size_t *srcsize, LPWSTR dst, size_t *dstsi i = EucJis2004ToUcp(src + si, ss - si, &ucp[0], &ucp[1]); if((ucp[0] == 0) || (i == 0)) { - if(srcsize != NULL) - { - *srcsize = si; - } - *dstsize = di + 1; - if(dst != NULL) - { - *(dst + di) = L'\0'; - } + AddNullWideChar(srcsize, si, dst, dstsize, di); return FALSE; } si += i - 1; @@ -226,15 +238,7 @@ BOOL EucJis2004ToWideChar(LPCSTR src, size_t *srcsize, LPWSTR dst, size_t *dstsi if(*dstsize <= di + utf16num[0] + utf16num[1]) //limit { - if(srcsize != NULL) - { - *srcsize = si; - } - *dstsize = di + 1; - if(dst != NULL) - { - *(dst + di) = L'\0'; - } + AddNullWideChar(srcsize, si, dst, dstsize, di); return FALSE; } @@ -251,6 +255,14 @@ BOOL EucJis2004ToWideChar(LPCSTR src, size_t *srcsize, LPWSTR dst, size_t *dstsi } } + AddNullWideChar(srcsize, si, dst, dstsize, di); + return TRUE; +} + +// 終端NULLを付加 + +void AddNullEucJis2004(size_t *srcsize, size_t si, LPSTR dst, size_t *dstsize, size_t di) +{ if(srcsize != NULL) { *srcsize = si; @@ -258,9 +270,8 @@ BOOL EucJis2004ToWideChar(LPCSTR src, size_t *srcsize, LPWSTR dst, size_t *dstsi *dstsize = di + 1; if(dst != NULL) { - *(dst + di) = L'\0'; + *(dst + di) = '\0'; } - return TRUE; } // UTF-16をEUC-JIS-2004へ変換 @@ -282,6 +293,11 @@ BOOL WideCharToEucJis2004(LPCWSTR src, size_t *srcsize, LPSTR dst, size_t *dstsi return FALSE; } + if(dst == NULL) + { + *dstsize = (size_t)-1; + } + if(src == NULL) { *dstsize = 0; @@ -295,24 +311,16 @@ BOOL WideCharToEucJis2004(LPCWSTR src, size_t *srcsize, LPSTR dst, size_t *dstsi for(si = 0; ; si++) { - if((ss <= si) || (*(src + si) == 0x0000)) + if((ss <= si) || (*(src + si) == L'\0')) { break; } - if(*(src + si) <= 0x007F) //ASCII + if(*(src + si) <= L'\x7F') //ASCII { if(*dstsize <= di + 1) //limit { - if(srcsize != NULL) - { - *srcsize = si; - } - *dstsize = di + 1; - if(dst != NULL) - { - *(dst + di) = 0; - } + AddNullEucJis2004(srcsize, si, dst, dstsize, di); return FALSE; } if(dst != NULL) @@ -354,15 +362,7 @@ BOOL WideCharToEucJis2004(LPCWSTR src, size_t *srcsize, LPSTR dst, size_t *dstsi { if(*dstsize <= di + 2) //limit { - if(srcsize != NULL) - { - *srcsize = si; - } - *dstsize = di + 1; - if(dst != NULL) - { - *(dst + di) = 0; - } + AddNullEucJis2004(srcsize, si, dst, dstsize, di); return FALSE; } if(dst != NULL) @@ -387,15 +387,7 @@ BOOL WideCharToEucJis2004(LPCWSTR src, size_t *srcsize, LPSTR dst, size_t *dstsi { if(*dstsize <= di + 2) //limit { - if(srcsize != NULL) - { - *srcsize = si; - } - *dstsize = di + 1; - if(dst != NULL) - { - *(dst + di) = 0; - } + AddNullEucJis2004(srcsize, si, dst, dstsize, di); return FALSE; } if(dst != NULL) @@ -415,15 +407,7 @@ BOOL WideCharToEucJis2004(LPCWSTR src, size_t *srcsize, LPSTR dst, size_t *dstsi { if(*dstsize <= di + 3) //limit { - if(srcsize != NULL) - { - *srcsize = si; - } - *dstsize = di + 1; - if(dst != NULL) - { - *(dst + di) = 0; - } + AddNullEucJis2004(srcsize, si, dst, dstsize, di); return FALSE; } if(dst != NULL) @@ -457,15 +441,7 @@ BOOL WideCharToEucJis2004(LPCWSTR src, size_t *srcsize, LPSTR dst, size_t *dstsi { if(*dstsize <= di + 2) //limit { - if(srcsize != NULL) - { - *srcsize = si; - } - *dstsize = di + 1; - if(dst != NULL) - { - *(dst + di) = 0; - } + AddNullEucJis2004(srcsize, si, dst, dstsize, di); return FALSE; } if(dst != NULL) @@ -482,39 +458,23 @@ BOOL WideCharToEucJis2004(LPCWSTR src, size_t *srcsize, LPSTR dst, size_t *dstsi if(!exist) { - if(srcsize != NULL) - { - *srcsize = si; - } - *dstsize = di + 1; - if(dst != NULL) - { - *(dst + di) = 0; - } + AddNullEucJis2004(srcsize, si, dst, dstsize, di); return FALSE; } } } - if(srcsize != NULL) - { - *srcsize = si; - } - *dstsize = di + 1; - if(dst != NULL) - { - *(dst + di) = 0; - } + AddNullEucJis2004(srcsize, si, dst, dstsize, di); return TRUE; } std::string wstring_to_eucjis2004_string(const std::wstring &s) { std::string ret; - size_t len = -1; + size_t len; - WideCharToEucJis2004(s.c_str(), NULL, NULL, &len); - if(len > 0) + BOOL b = WideCharToEucJis2004(s.c_str(), NULL, NULL, &len); + if(b && len > 0) { try { @@ -534,10 +494,10 @@ std::string wstring_to_eucjis2004_string(const std::wstring &s) std::wstring eucjis2004_string_to_wstring(const std::string &s) { std::wstring ret; - size_t len = -1; + size_t len; - EucJis2004ToWideChar(s.c_str(), NULL, NULL, &len); - if(len > 0) + BOOL b = EucJis2004ToWideChar(s.c_str(), NULL, NULL, &len); + if(b && len > 0) { try { diff --git a/crvskkserv/eucjis2004.h b/crvskkserv/eucjis2004.h index 1cabe50..a02bcb2 100644 --- a/crvskkserv/eucjis2004.h +++ b/crvskkserv/eucjis2004.h @@ -31,13 +31,13 @@ size_t EucJis2004ToUcp(LPCSTR src, size_t srcsize, PUCSCHAR ucp1, PUCSCHAR ucp2) // 引数 // src : 変換元のEUC-JIS-2004文字列 // NULLのとき戻り値はFALSEになる -// srcsize : NULLのときsrcの末尾のNULLまで変換する -// NULL以外のとき指定されたサイズまたはsrcの末尾のNULLの短いほうまで変換する +// srcsize : NULLのときsrcの終端NULLまで変換する +// NULL以外のとき指定されたサイズまたはsrcの終端NULLの短いほうまで変換する // 変換に使用されたサイズ(char単位)が戻る // dst : 変換先のUTF-16LE文字列バッファ // NULLは許容される // dstsize : dstのサイズ -// 変換結果のサイズ(wchar_t単位)が戻る +// 変換結果の終端NULLを含むサイズ(wchar_t単位)が戻る // NULLのとき戻り値はFALSEになる BOOL EucJis2004ToWideChar(LPCSTR src, size_t *srcsize, LPWSTR dst, size_t *dstsize); @@ -48,13 +48,13 @@ BOOL EucJis2004ToWideChar(LPCSTR src, size_t *srcsize, LPWSTR dst, size_t *dstsi // 引数 // src : 変換元のUTF-16LE文字列 // NULLのとき戻り値はFALSEになる -// srcsize : NULLのときsrcの末尾のNULLまで変換する -// NULL以外のとき指定されたサイズまたはsrcの末尾のNULLの短いほうまで変換する +// srcsize : NULLのときsrcの終端NULLまで変換する +// NULL以外のとき指定されたサイズまたはsrcの終端NULLの短いほうまで変換する // 変換に使用されたサイズ(wchar_t単位)が戻る // dst : 変換先のEUC-JIS-2004文字列バッファ // NULLは許容される // dstsize : dstのサイズ -// 変換結果のサイズ(char単位)が戻る +// 変換結果の終端NULLを含むサイズ(char単位)が戻る // NULLのとき戻り値はFALSEになる BOOL WideCharToEucJis2004(LPCWSTR src, size_t *srcsize, LPSTR dst, size_t *dstsize); diff --git a/crvskkserv/search_google_cgiapi.cpp b/crvskkserv/search_google_cgiapi.cpp index 123d120..bc0eb01 100644 --- a/crvskkserv/search_google_cgiapi.cpp +++ b/crvskkserv/search_google_cgiapi.cpp @@ -48,7 +48,6 @@ void search_google_cgiapi(DICINFO &dicinfo, const std::string &key, std::string DWORD dwTimeout; std::wstring wkey; std::string ckey; - size_t dstsize; //接続情報取得 split_google_cgiapi_path(dicinfo, filter, annotation, timeout, encoding); @@ -56,18 +55,21 @@ void search_google_cgiapi(DICINFO &dicinfo, const std::string &key, std::string //文字コードチェック、UTF-8変換 if(encoding == inival_googlecgiapi_encoding_euc) { - dstsize = -1; - if(!EucJis2004ToWideChar(key.c_str(), NULL, NULL, &dstsize)) + wkey = eucjis2004_string_to_wstring(key); + if(wkey.empty()) { return; } - wkey = eucjis2004_string_to_wstring(key); ckey = wstring_to_utf8_string(wkey); } else if(encoding == inival_googlecgiapi_encoding_utf8) { ckey = key; wkey = utf8_string_to_wstring(ckey); + if(wkey.empty()) + { + return; + } } else { @@ -218,22 +220,18 @@ void search_google_cgiapi(DICINFO &dicinfo, const std::string &key, std::string wjson += L"\n"; - if(encoding == inival_googlecgiapi_encoding_euc) + wjson_tmp = wjson; + wreg = L"/[^/]+"; + while(std::regex_search(wjson_tmp, wres, wreg)) { - wjson_tmp = wjson; - wreg = L"/[^/]+"; - while(std::regex_search(wjson_tmp, wres, wreg)) + if(encoding == inival_googlecgiapi_encoding_euc) { - dstsize = -1; - if(WideCharToEucJis2004(wres.str().c_str(), NULL, NULL, &dstsize)) - { - s += wstring_to_eucjis2004_string(wres.str()); - } - wjson_tmp = wres.suffix(); + s += wstring_to_eucjis2004_string(wres.str()); } - } - else if(encoding == inival_googlecgiapi_encoding_utf8) - { - s = wstring_to_utf8_string(wjson); + else if(encoding == inival_googlecgiapi_encoding_utf8) + { + s += wstring_to_utf8_string(wres.str()); + } + wjson_tmp = wres.suffix(); } } diff --git a/crvskkserv/utf8.cpp b/crvskkserv/utf8.cpp index 08063cb..b6ac5d7 100644 --- a/crvskkserv/utf8.cpp +++ b/crvskkserv/utf8.cpp @@ -3,7 +3,7 @@ std::string wstring_to_utf8_string(const std::wstring &s) { std::string ret; - int len = WideCharToMultiByte(CP_UTF8, 0, s.c_str(), -1, NULL, 0, NULL, NULL); + int len = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s.c_str(), -1, NULL, 0, NULL, NULL); if(len > 0) { try @@ -27,7 +27,7 @@ std::wstring utf8_string_to_wstring(const std::string &s) { std::wstring ret; - int len = MultiByteToWideChar(CP_UTF8, 0, s.c_str(), -1, NULL, 0); + int len = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, s.c_str(), -1, NULL, 0); if(len > 0) { try