From 545aa9e55bf501e8dd2cac41c1365f3decab5235 Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Sat, 24 Sep 2011 16:02:56 -0400 Subject: [PATCH] start adding Windows wide character support --- lib/tokenize.cpp | 117 +++++++++++++++++++++++++++++++----------- test/testtokenize.cpp | 37 +++++++++++-- 2 files changed, 119 insertions(+), 35 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 0aecd396a..e17021ebc 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -6762,7 +6762,7 @@ void Tokenizer::simplifyPlatformTypes() else tok->insertToken("long"); } - else if (Token::Match(tok, "USHORT|WORD")) + else if (Token::Match(tok, "USHORT|WORD|WCHAR|wchar_t")) { tok->str("unsigned"); tok->insertToken("short"); @@ -6773,6 +6773,11 @@ void Tokenizer::simplifyPlatformTypes() { if (_settings->platformType == Settings::Win32A) tok->str("char"); + else + { + tok->str("unsigned"); + tok->insertToken("short"); + } } else if (Token::Match(tok, "PTSTR|LPTSTR")) { @@ -6781,6 +6786,12 @@ void Tokenizer::simplifyPlatformTypes() tok->str("char"); tok->insertToken("*"); } + else + { + tok->str("unsigned"); + tok->insertToken("*"); + tok->insertToken("short"); + } } else if (Token::Match(tok, "PCTSTR|LPCTSTR")) { @@ -6790,6 +6801,13 @@ void Tokenizer::simplifyPlatformTypes() tok->insertToken("*"); tok->insertToken("char"); } + else + { + tok->str("const"); + tok->insertToken("*"); + tok->insertToken("short"); + tok->insertToken("unsigned"); + } } } } @@ -10561,40 +10579,77 @@ void Tokenizer::simplifyMicrosoftMemoryFunctions() void Tokenizer::simplifyMicrosoftStringFunctions() { // skip if not Windows - if (_settings->platformType != Settings::Win32A) - return; - - for (Token *tok = _tokens; tok; tok = tok->next()) + if (_settings->platformType == Settings::Win32A) { - if (Token::simpleMatch(tok, "_tcscpy (")) + for (Token *tok = _tokens; tok; tok = tok->next()) { - tok->str("strcpy"); + if (Token::simpleMatch(tok, "_tcscpy (")) + { + tok->str("strcpy"); + } + else if (Token::simpleMatch(tok, "_tcscat (")) + { + tok->str("strcat"); + } + else if (Token::simpleMatch(tok, "_tcsncpy (")) + { + tok->str("strncpy"); + } + else if (Token::simpleMatch(tok, "_tcsncat (")) + { + tok->str("strncat"); + } + else if (Token::simpleMatch(tok, "_tcslen (")) + { + tok->str("strlen"); + } + else if (Token::simpleMatch(tok, "_tcsnlen (")) + { + tok->str("strnlen"); + } + else if (Token::Match(tok, "_T ( %str% )")) + { + tok->deleteThis(); + tok->deleteThis(); + tok->deleteNext(); + } } - else if (Token::simpleMatch(tok, "_tcscat (")) + } + else if (_settings->platformType == Settings::Win32W || + _settings->platformType == Settings::Win64) + { + for (Token *tok = _tokens; tok; tok = tok->next()) { - tok->str("strcat"); - } - else if (Token::simpleMatch(tok, "_tcsncpy (")) - { - tok->str("strncpy"); - } - else if (Token::simpleMatch(tok, "_tcsncat (")) - { - tok->str("strncat"); - } - else if (Token::simpleMatch(tok, "_tcslen (")) - { - tok->str("strlen"); - } - else if (Token::simpleMatch(tok, "_tcsnlen (")) - { - tok->str("strnlen"); - } - else if (Token::Match(tok, "_T ( %str% )")) - { - tok->deleteThis(); - tok->deleteThis(); - tok->deleteNext(); + if (Token::simpleMatch(tok, "_tcscpy (")) + { + tok->str("wcscpy"); + } + else if (Token::simpleMatch(tok, "_tcscat (")) + { + tok->str("wcscat"); + } + else if (Token::simpleMatch(tok, "_tcsncpy (")) + { + tok->str("wcsncpy"); + } + else if (Token::simpleMatch(tok, "_tcsncat (")) + { + tok->str("wcsncat"); + } + else if (Token::simpleMatch(tok, "_tcslen (")) + { + tok->str("wcslen"); + } + else if (Token::simpleMatch(tok, "_tcsnlen (")) + { + tok->str("wcsnlen"); + } + else if (Token::Match(tok, "_T ( %str% )")) + { + tok->deleteThis(); + tok->deleteThis(); + tok->deleteNext(); + } } } } diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 9c1736df9..555e13413 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -6094,7 +6094,8 @@ private: void platformWin32A() { - const char code[] = "TCHAR c;" + const char code[] = "wchar_t wc;" + "TCHAR c;" "PTSTR ptstr;" "LPTSTR lptstr;" "PCTSTR pctstr;" @@ -6104,9 +6105,10 @@ private: " TCHAR dst[10];" " _tcscpy(dst, src);" " dst[0] = 0;" - " _tcscat(dst, str);" + " _tcscat(dst, src);" "}"; - const char expected[] = "char c ; " + const char expected[] = "unsigned short wc ; " + "char c ; " "char * ptstr ; " "char * lptstr ; " "const char * pctstr ; " @@ -6116,13 +6118,40 @@ private: "char dst [ 10 ] ; " "strcpy ( dst , src ) ; " "dst [ 0 ] = 0 ; " - "strcat ( dst , str ) ; " + "strcat ( dst , src ) ; " "}"; ASSERT_EQUALS(expected, tokenizeAndStringify(code, false, true, Settings::Win32A)); } void platformWin32W() { + const char code[] = "wchar_t wc;" + "TCHAR c;" + "PTSTR ptstr;" + "LPTSTR lptstr;" + "PCTSTR pctstr;" + "LPCTSTR lpctstr;" + "void foo() {" + " TCHAR src[10] = _T(\"123456789\");" + " TCHAR dst[10];" + " _tcscpy(dst, src);" + " dst[0] = 0;" + " _tcscat(dst, src);" + "}"; + const char expected[] = "unsigned short wc ; " + "unsigned short c ; " + "unsigned short * ptstr ; " + "unsigned short * lptstr ; " + "const unsigned short * pctstr ; " + "const unsigned short * lpctstr ; " + "void foo ( ) { " + "unsigned short src [ 10 ] = \"123456789\" ; " + "unsigned short dst [ 10 ] ; " + "wcscpy ( dst , src ) ; " + "dst [ 0 ] = 0 ; " + "wcscat ( dst , src ) ; " + "}"; + ASSERT_EQUALS(expected, tokenizeAndStringify(code, false, true, Settings::Win32W)); } void platformWin64()