From 197bd6cee306125d9b54e93e8a8bf6228d2dfd4b Mon Sep 17 00:00:00 2001 From: Sabine Date: Wed, 2 Nov 2022 16:48:11 +0700 Subject: [PATCH] chore(developer): use char16_t in CheckFileNameConsistency --- developer/kmcompx/tests/kmcompxtest.cpp | 2 +- .../src/kmcmpdll/CheckFilenameConsistency.cpp | 54 ++++++++++++------- .../src/kmcmpdll/CheckFilenameConsistency.h | 5 +- developer/src/kmcmpdll/Compiler.cpp | 24 +++++---- developer/src/kmcmpdll/kmx_u16.cpp | 38 +++++++------ 5 files changed, 74 insertions(+), 49 deletions(-) diff --git a/developer/kmcompx/tests/kmcompxtest.cpp b/developer/kmcompx/tests/kmcompxtest.cpp index 0b6785bc6a..738df40f5f 100644 --- a/developer/kmcompx/tests/kmcompxtest.cpp +++ b/developer/kmcompx/tests/kmcompxtest.cpp @@ -88,7 +88,7 @@ int main(int argc, char *argv[]) if (error_vec[i] == error_val) return 0; } - return 1; + return 4; } else return 1; // no CERR_ in Name => CompileKeyboardFile failed diff --git a/developer/src/kmcmpdll/CheckFilenameConsistency.cpp b/developer/src/kmcmpdll/CheckFilenameConsistency.cpp index 01ba54b205..5b19077579 100644 --- a/developer/src/kmcmpdll/CheckFilenameConsistency.cpp +++ b/developer/src/kmcmpdll/CheckFilenameConsistency.cpp @@ -34,7 +34,7 @@ bool IsRelativePath(KMX_CHAR const * p) { return TRUE; } -bool IsRelativePath(KMX_WCHART const * p) { +bool IsRelativePath(KMX_WCHAR const * p) { // Relative path (returns TRUE): // ..\...\BITMAP.BMP // PATH\BITMAP.BMP @@ -48,40 +48,50 @@ bool IsRelativePath(KMX_WCHART const * p) { // \\SERVER\SHARE\...\BITMAP.BMP #if defined(_WIN32) || defined(_WIN64) - if (*p == L'\\') return FALSE; + if (*p == u'\\') return FALSE; #else - if (*p == L'/') return FALSE; + if (*p == u'/') return FALSE; #endif - if (*p && *(p + 1) == L':') return FALSE; + if (*p && *(p + 1) == u':') return FALSE; return TRUE; } KMX_DWORD CheckFilenameConsistency( KMX_CHAR const * Filename, BOOL ReportMissingFile) { PKMX_WCHAR WFilename = strtowstr(( KMX_CHAR *)Filename); - KMX_DWORD const result = CheckFilenameConsistency(u16fmt(WFilename).c_str(), ReportMissingFile); - delete WFilename; + KMX_DWORD const result = CheckFilenameConsistency(WFilename, ReportMissingFile); + delete WFilename; return result; } -KMX_DWORD CheckFilenameConsistency(KMX_WCHART const * Filename, bool ReportMissingFile) { - KMX_WCHART Name[_MAX_PATH], FName[_MAX_FNAME], Ext[_MAX_EXT]; +KMX_DWORD CheckFilenameConsistency(KMX_WCHAR const * Filename, bool ReportMissingFile) { + KMX_WCHAR Name[_MAX_PATH], FName[_MAX_FNAME], Ext[_MAX_EXT]; KMX_WCHAR ErrExtra[256]; intptr_t n; if (IsRelativePath(Filename)) { PKMX_WCHAR WCompileDir = strtowstr(CompileDir); - wcscpy_s(Name, _countof(Name), u16fmt(WCompileDir).c_str()); // I3481 - wcscat_s(Name, _countof(Name), Filename); // I3481 + u16ncpy(Name, WCompileDir, _countof(Name)); // I3481 + u16ncat(Name, Filename, _countof(Name)); // I3481 } else { - wcscpy_s(Name, _countof(Name), Filename); // I3481 + u16ncpy(Name, Filename, _countof(Name)); // I3481 // _S2 wcscpy_s(Name, _countof(Name), Filename); // I3481 } #if defined(_WIN32) || defined(_WIN64) + // convert char16_t to wchar_t* + // char16_t -> std::u16string + std::u16string u16str(Name); + // std::u16string -> std::string + std::string stri = string_from_u16string(u16str); + // std::string -> std::wstring + std::wstring wstr = wstring_from_string(stri); + // std::wstring -> wchar_t* + const KMX_WCHART* wchptr = wstr.c_str(); + _wfinddata_t fi; - n = _wfindfirst(Name, &fi); + n = _wfindfirst(wchptr, &fi); _findclose(n); #else n= access(Name,F_OK); @@ -96,15 +106,18 @@ KMX_DWORD CheckFilenameConsistency(KMX_WCHART const * Filename, bool ReportMissi } #if defined(_WIN32) || defined(_WIN64) - const wchar_t* cptr1 = wcsrchr(Name, '\\'); + const KMX_WCHAR* cptr1 = u16chr(Name, '\\'); // _S2 const wchar_t* cptr1 = wcsrchr(Name, '\\'); #else - const wchar_t* cptr1 = wcsrchr(Name, '/'); + const KMX_WCHAR* cptr1 = u16rchr(Name, '/'); #endif cptr1++; //TODO: sort out how to find common includes in non-Windows platforms: #if defined(_WIN32) || defined(_WIN64) - if (wcscmp(cptr1, fi.name) != 0) { +KMX_WCHAR fi_name_char16[260]; +u16sprintf(fi_name_char16,_countof(fi.name),fi.name); + + if (u16cmp(cptr1, fi_name_char16) != 0) { u16sprintf(ErrExtra,_countof(ErrExtra),L"reference '%ls' does not match actual filename '%ls'", cptr1, &fi.name); AddWarning(CHINT_FilenameHasDifferingCase); } @@ -119,17 +132,20 @@ KMX_DWORD CheckFilenameConsistencyForCalls(PFILE_KEYBOARD fk) { // where store(DllFunction) "my.dll:func" will look for a // file called function.call_js. This is ripe for rewrite! // But let's check what we have anyway + PFILE_STORE sp; DWORD i, msg; for (i = 0, sp = fk->dpStoreArray; i < fk->cxStoreArray; i++, sp++) { if (!sp->fIsCall) continue; - const std::wstring callsite(u16fmt(sp->dpString).c_str()); + const std::u16string callsite(sp->dpString); const auto colon = callsite.find(':'); - if (colon == std::wstring::npos) continue; + if (colon == std::u16string::npos) continue; + + auto func1 = callsite.substr(colon + 1); + std::u16string str_js(u".call_js"); + std::u16string func = func1+ str_js; - auto func = callsite.substr(colon + 1); - func.append(L".call_js"); if ((msg = CheckFilenameConsistency(func.c_str(), FALSE)) != CERR_None) { return msg; } diff --git a/developer/src/kmcmpdll/CheckFilenameConsistency.h b/developer/src/kmcmpdll/CheckFilenameConsistency.h index 6e28727eea..29228ad615 100644 --- a/developer/src/kmcmpdll/CheckFilenameConsistency.h +++ b/developer/src/kmcmpdll/CheckFilenameConsistency.h @@ -5,6 +5,7 @@ KMX_DWORD CheckFilenameConsistencyForCalls(PFILE_KEYBOARD fk); KMX_DWORD CheckFilenameConsistency(KMX_CHAR const * Filename, bool ReportMissingFile); -KMX_DWORD CheckFilenameConsistency(KMX_WCHART const * Filename, bool ReportMissingFile); +KMX_DWORD CheckFilenameConsistency(KMX_WCHAR const * Filename, bool ReportMissingFile); + bool IsRelativePath(KMX_CHAR const * p); -bool IsRelativePath(KMX_WCHART const * p); +bool IsRelativePath(KMX_WCHAR const * p); diff --git a/developer/src/kmcmpdll/Compiler.cpp b/developer/src/kmcmpdll/Compiler.cpp index 4a100e53e7..8d8acd485c 100644 --- a/developer/src/kmcmpdll/Compiler.cpp +++ b/developer/src/kmcmpdll/Compiler.cpp @@ -1348,7 +1348,7 @@ KMX_DWORD ProcessSystemStore(PFILE_KEYBOARD fk, KMX_DWORD SystemID, PFILE_STORE delete[] sp->dpString; sp->dpString = q; - if ((msg = CheckFilenameConsistency(u16fmt(sp->dpString).c_str(), FALSE)) != CERR_None) { + if ((msg = CheckFilenameConsistency( (sp->dpString), FALSE)) != CERR_None) { return msg; } } @@ -1360,15 +1360,15 @@ KMX_DWORD ProcessSystemStore(PFILE_KEYBOARD fk, KMX_DWORD SystemID, PFILE_STORE case TSS_KMW_HELPFILE: case TSS_KMW_EMBEDJS: - VERIFY_KEYBOARD_VERSION(fk, VERSION_70, CERR_70FeatureOnly); - if ((msg = CheckFilenameConsistency(u16fmt(sp->dpString).c_str(), FALSE)) != CERR_None) { + VERIFY_KEYBOARD_VERSION(fk, VERSION_70, CERR_70FeatureOnly); + if ((msg = CheckFilenameConsistency(sp->dpString, FALSE)) != CERR_None) { return msg; } break; case TSS_KMW_EMBEDCSS: VERIFY_KEYBOARD_VERSION(fk, VERSION_90, CERR_90FeatureOnlyEmbedCSS); - if ((msg = CheckFilenameConsistency(u16fmt(sp->dpString).c_str(), FALSE)) != CERR_None) { + if ((msg = CheckFilenameConsistency(sp->dpString, FALSE)) != CERR_None) { return msg; } break; @@ -1420,7 +1420,7 @@ KMX_DWORD ProcessSystemStore(PFILE_KEYBOARD fk, KMX_DWORD SystemID, PFILE_STORE case TSS_LAYOUTFILE: // I3483 VERIFY_KEYBOARD_VERSION(fk, VERSION_90, CERR_90FeatureOnlyLayoutFile); // I4140 - if ((msg = CheckFilenameConsistency(u16fmt(sp->dpString).c_str(), FALSE)) != CERR_None) { + if ((msg = CheckFilenameConsistency(sp->dpString, FALSE)) != CERR_None) { return msg; } // Used by KMW compiler @@ -3388,6 +3388,7 @@ KMX_DWORD ReadLine(FILE* fp_in , PKMX_WCHAR wstr, KMX_BOOL PreProcess) // Always a "\r\n" to the EOF, avoids funny bugs u16ncat(str, u"\r\n", _countof(str)); // I3481 + //u16ncat(str, u"\n", _countof(str)); // I3481 if (len == 0) return CERR_EndOfFile; @@ -3514,8 +3515,9 @@ KMX_BOOL IsSameToken(PKMX_WCHAR *p, KMX_WCHAR const * token) KMX_DWORD ImportBitmapFile(PFILE_KEYBOARD fk, PKMX_WCHAR szName, PKMX_DWORD FileSize, PKMX_BYTE *Buf) { FILE *fp; - KMX_WCHAR szNewName[260], *p; - if (IsRelativePath(u16fmt(szName).c_str())) + KMX_WCHAR szNewName[260], *p; + //if (IsRelativePath(u16fmt(szName).c_str())) + if (IsRelativePath(szName)) { PKMX_WCHAR WCompileDir = strtowstr(CompileDir); u16ncpy(szNewName, WCompileDir, _countof(szNewName)); // I3481 @@ -3527,7 +3529,7 @@ KMX_DWORD ImportBitmapFile(PFILE_KEYBOARD fk, PKMX_WCHAR szName, PKMX_DWORD File #if defined(_WIN32) || defined(_WIN64) - fp =_wfsopen((wchar_t*)szNewName, L"rb", _SH_DENYWR); + fp =_wfsopen((KMX_WCHART*)szNewName, L"rb", _SH_DENYWR); #else //fp = fopen( ( const PKMX_CHAR) szNewName, "rb"); #endif @@ -3541,7 +3543,7 @@ KMX_DWORD ImportBitmapFile(PFILE_KEYBOARD fk, PKMX_WCHAR szName, PKMX_DWORD File u16ncat(szNewName, u".bmp", _countof(szNewName)); // I3481 #if defined(_WIN32) || defined(_WIN64) - fp = _wfsopen((const wchar_t*)szNewName, L"rb", _SH_DENYWR); + fp = _wfsopen((const KMX_WCHART*)szNewName, L"rb", _SH_DENYWR); #else fp = fopen(( const PKMX_CHAR) szNewName, "rb"); #endif @@ -3551,7 +3553,7 @@ KMX_DWORD ImportBitmapFile(PFILE_KEYBOARD fk, PKMX_WCHAR szName, PKMX_DWORD File } KMX_DWORD msg; - if ((msg = CheckFilenameConsistency(u16fmt(szNewName).c_str(), FALSE)) != CERR_None) { + if ((msg = CheckFilenameConsistency(szNewName, FALSE)) != CERR_None) { return msg; } @@ -3740,7 +3742,7 @@ FILE* UTF16TempFromUTF8(FILE* fp_in , KMX_BOOL hasPreamble) if(fp_out == NULL) // I3228 // I3510 { fclose(fp_in); - return NULL; //return INVALID_HANDLE_VALUE; can I exchange that? + return NULL; //return INVALID_HANDLE_VALUE; _S2 can I exchange that? } PKMX_BYTE buf, p; diff --git a/developer/src/kmcmpdll/kmx_u16.cpp b/developer/src/kmcmpdll/kmx_u16.cpp index 94f04485b9..ab9aeb92a1 100644 --- a/developer/src/kmcmpdll/kmx_u16.cpp +++ b/developer/src/kmcmpdll/kmx_u16.cpp @@ -9,44 +9,41 @@ #include #include +//std::wstring -> std::string std::string string_from_wstring(std::wstring const str) { std::wstring_convert, wchar_t> converter; return converter.to_bytes(str); } - +//std::string -> std::wstring std::wstring wstring_from_string(std::string const str) { std::wstring_convert, wchar_t> converter; return converter.from_bytes(str); } +//std::string -> std::u16string std::u16string u16string_from_string(std::string const str) { std::wstring_convert, char16_t> converter; return converter.from_bytes(str); } +//std::u16string -> std::string std::string string_from_u16string(std::u16string const str) { std::wstring_convert, char16_t> converter; return converter.to_bytes(str); } -long int u16tol(const KMX_WCHAR* str, KMX_WCHAR** endptr, int base) -{ - auto s = string_from_u16string(str); - char* t; - long int result = strtol(s.c_str(), &t, base); - if(endptr != nullptr) *endptr = (KMX_WCHAR*) str + (t-s.c_str()); - return result; -} - -// often used with c_str() e.g. u16fmt( DEBUGSTORE_MATCH).c_str() +// often used with c_str() e.g. u16fmt( DEBUGSTORE_MATCH).c_str() +// const char16_t* -> std::u8string -> std::wstring std::wstring u16fmt(const km_kbp_cp* str) { std::wstring_convert, wchar_t> convert_wstring; std::wstring_convert, char16_t> convert; - std::string utf8str = convert.to_bytes(str); - std::wstring wstr = convert_wstring.from_bytes(utf8str); + + std::string utf8str = convert.to_bytes(str); // const char16_t*-> std::u8string + std::wstring wstr = convert_wstring.from_bytes(utf8str); // std::u8string -> std::wstring return wstr; } + // const wchar_t* -> std::u8string -> std::u16string -> char16_t* void u16sprintf(km_kbp_cp* dst, const size_t sz, const wchar_t* fmt, ...) { wchar_t* wbuf = new wchar_t[sz]; va_list args; @@ -56,13 +53,22 @@ void u16sprintf(km_kbp_cp* dst, const size_t sz, const wchar_t* fmt, ...) { std::wstring_convert, wchar_t> convert_wstring; std::wstring_convert, char16_t> convert; - std::string utf8str = convert_wstring.to_bytes(wbuf); - std::u16string u16str = convert.from_bytes(utf8str); - u16ncpy(dst, u16str.c_str(), sz); + std::string utf8str = convert_wstring.to_bytes(wbuf); // const wchar_t* -> std::u8string + std::u16string u16str = convert.from_bytes(utf8str); // std::u8string -> std::u16string + u16ncpy(dst, u16str.c_str(), sz); // std::u16string -> char16_t* delete[] wbuf; } +long int u16tol(const KMX_WCHAR* str, KMX_WCHAR** endptr, int base) +{ + auto s = string_from_u16string(str); + char* t; + long int result = strtol(s.c_str(), &t, base); + if (endptr != nullptr) *endptr = (KMX_WCHAR*)str + (t - s.c_str()); + return result; +} + std::string toHex(int num1) { if (num1 == 0) return "0";