start adding Windows ASCII TCHAR conversion support

This commit is contained in:
Robert Reif 2011-09-24 14:51:03 -04:00
parent 424f349b88
commit f97424b242
7 changed files with 153 additions and 37 deletions

View File

@ -596,8 +596,10 @@ bool CmdLineParser::ParseFromArgs(int argc, const char* const argv[])
{
std::string platform(11+argv[i]);
if (platform == "win32")
_settings->platform(Settings::Win32);
if (platform == "win32A")
_settings->platform(Settings::Win32A);
else if (platform == "win32W")
_settings->platform(Settings::Win32W);
else if (platform == "win64")
_settings->platform(Settings::Win64);
else if (platform == "unix32")
@ -739,8 +741,10 @@ void CmdLineParser::PrintHelp()
" 32 bit unix variant\n"
" * unix64\n"
" 64 bit unix variant\n"
" * win32\n"
" 32 bit Windows\n"
" * win32A\n"
" 32 bit Windows ASCII character encoding\n"
" * win32W\n"
" 32 bit Windows UNICODE character encoding\n"
" * win64\n"
" 64 bit Windows\n"
" -q, --quiet Only print error messages.\n"

View File

@ -53,11 +53,11 @@ Settings::Settings()
// This assumes the code you are checking is for the same architecture this is compiled on.
#if defined(_WIN32)
platform(Win32);
platform(Win32A);
#elif defined(_WIN64)
platform(Win64);
#else
platform(Host);
platform(Unspecified);
#endif
}
@ -140,8 +140,8 @@ bool Settings::platform(PlatformType type)
{
switch (type)
{
case Host: // same as system this code was compile on
platformType = Host;
case Unspecified: // same as system this code was compile on
platformType = type;
sizeof_bool = sizeof(bool);
sizeof_short = sizeof(short);
sizeof_int = sizeof(int);
@ -153,8 +153,9 @@ bool Settings::platform(PlatformType type)
sizeof_size_t = sizeof(size_t);
sizeof_pointer = sizeof(void *);
return true;
case Win32:
platformType = Win32;
case Win32W:
case Win32A:
platformType = type;
sizeof_bool = 1; // 4 in Visual C++ 4.2
sizeof_short = 2;
sizeof_int = 4;
@ -167,7 +168,7 @@ bool Settings::platform(PlatformType type)
sizeof_pointer = 4;
return true;
case Win64:
platformType = Win64;
platformType = type;
sizeof_bool = 1;
sizeof_short = 2;
sizeof_int = 4;
@ -180,7 +181,7 @@ bool Settings::platform(PlatformType type)
sizeof_pointer = 8;
return true;
case Unix32:
platformType = Unix32;
platformType = type;
sizeof_bool = 1;
sizeof_short = 2;
sizeof_int = 4;
@ -193,7 +194,7 @@ bool Settings::platform(PlatformType type)
sizeof_pointer = 4;
return true;
case Unix64:
platformType = Unix64;
platformType = type;
sizeof_bool = 1;
sizeof_short = 2;
sizeof_int = 4;

View File

@ -205,8 +205,9 @@ public:
enum PlatformType
{
Host, // whatever system this code was compiled on
Win32,
Unspecified, // whatever system this code was compiled on
Win32A,
Win32W,
Win64,
Unix32,
Unix64

View File

@ -2550,6 +2550,9 @@ bool Tokenizer::tokenize(std::istream &code,
// convert Microsoft memory functions
simplifyMicrosoftMemoryFunctions();
// convert Microsoft string functions
simplifyMicrosoftStringFunctions();
// Remove Qt signals and slots
simplifyQtSignalsSlots();
@ -6642,7 +6645,8 @@ void Tokenizer::simplifyPlatformTypes()
}
}
if (_settings->platformType == Settings::Win32 ||
if (_settings->platformType == Settings::Win32A ||
_settings->platformType == Settings::Win32W ||
_settings->platformType == Settings::Win64)
{
for (Token *tok = _tokens; tok; tok = tok->next())
@ -6765,6 +6769,28 @@ void Tokenizer::simplifyPlatformTypes()
}
else if (tok->str() == "VOID")
tok->str("void");
else if (tok->str() == "TCHAR")
{
if (_settings->platformType == Settings::Win32A)
tok->str("char");
}
else if (Token::Match(tok, "PTSTR|LPTSTR"))
{
if (_settings->platformType == Settings::Win32A)
{
tok->str("char");
tok->insertToken("*");
}
}
else if (Token::Match(tok, "PCTSTR|LPCTSTR"))
{
if (_settings->platformType == Settings::Win32A)
{
tok->str("const");
tok->insertToken("*");
tok->insertToken("char");
}
}
}
}
}
@ -10418,7 +10444,8 @@ void Tokenizer::simplifyBuiltinExpect()
void Tokenizer::simplifyMicrosoftMFC()
{
// skip if not Windows
if (!(_settings->platformType == Settings::Win32 ||
if (!(_settings->platformType == Settings::Win32A ||
_settings->platformType == Settings::Win32W ||
_settings->platformType == Settings::Win64))
return;
@ -10443,7 +10470,8 @@ void Tokenizer::simplifyMicrosoftMFC()
void Tokenizer::simplifyMicrosoftMemoryFunctions()
{
// skip if not Windows
if (!(_settings->platformType == Settings::Win32 ||
if (!(_settings->platformType == Settings::Win32A ||
_settings->platformType == Settings::Win32W ||
_settings->platformType == Settings::Win64))
return;
@ -10530,6 +10558,47 @@ 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 (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();
}
}
}
// Remove Borland code
void Tokenizer::simplifyBorland()
{

View File

@ -627,6 +627,12 @@ public:
*/
void simplifyMicrosoftMemoryFunctions();
/**
* Convert Microsoft string functions
* _tcscpy -> strcpy
*/
void simplifyMicrosoftStringFunctions();
/**
* Remove Borland code
*/

View File

@ -384,7 +384,7 @@ private:
TEST_CASE(removeRedundantFor);
}
std::string tok(const char code[], bool simplify = true, Settings::PlatformType type = Settings::Host)
std::string tok(const char code[], bool simplify = true, Settings::PlatformType type = Settings::Unspecified)
{
errout.str("");
@ -863,7 +863,7 @@ private:
// Simplify 'sizeof'..
std::string sizeof_(const char code[], bool simplify = true, Settings::PlatformType type = Settings::Host)
std::string sizeof_(const char code[], bool simplify = true, Settings::PlatformType type = Settings::Unspecified)
{
errout.str("");
@ -977,8 +977,8 @@ private:
{
const char code[] = ";INT32 i[10];\n"
"sizeof(i[0]);\n";
ASSERT_EQUALS("; INT32 i [ 10 ] ; sizeof ( i [ 0 ] ) ;", sizeof_(code, true, Settings::Host));
ASSERT_EQUALS("; int i [ 10 ] ; 4 ;", sizeof_(code, true, Settings::Win32));
ASSERT_EQUALS("; INT32 i [ 10 ] ; sizeof ( i [ 0 ] ) ;", sizeof_(code, true, Settings::Unspecified));
ASSERT_EQUALS("; int i [ 10 ] ; 4 ;", sizeof_(code, true, Settings::Win32A));
}
void sizeof8()
@ -1147,7 +1147,7 @@ private:
"compat_ulong_t um ; "
"long size ; size = sizeof ( m ) / sizeof ( um ) ;";
ASSERT_EQUALS(code, tok(code, true, Settings::Win32));
ASSERT_EQUALS(code, tok(code, true, Settings::Win32A));
}
void sizeof11()
@ -2815,7 +2815,7 @@ private:
{
// Ticket #1997
const char code[] = "void * operator new[](size_t);";
ASSERT_EQUALS("void * operatornew[] ( long ) ;", tok(code, true, Settings::Win32));
ASSERT_EQUALS("void * operatornew[] ( long ) ;", tok(code, true, Settings::Win32A));
}
ASSERT_EQUALS("; a [ 0 ] ;", tok(";a[0*(*p)];"));

View File

@ -361,6 +361,8 @@ private:
TEST_CASE(removeRedundantCodeAfterReturn);
TEST_CASE(platformWin32);
TEST_CASE(platformWin32A);
TEST_CASE(platformWin32W);
TEST_CASE(platformWin64);
TEST_CASE(platformUnix32);
TEST_CASE(platformUnix64);
@ -379,7 +381,7 @@ private:
}
std::string tokenizeAndStringify(const char code[], bool simplify = false, bool expand = true, Settings::PlatformType platform = Settings::Host)
std::string tokenizeAndStringify(const char code[], bool simplify = false, bool expand = true, Settings::PlatformType platform = Settings::Unspecified)
{
errout.str("");
@ -4014,7 +4016,7 @@ private:
const char code[] = "struct foo {\n"
" void operator delete(void *obj, size_t sz);\n"
"}\n";
const std::string actual(tokenizeAndStringify(code, false, true, Settings::Win32));
const std::string actual(tokenizeAndStringify(code, false, true, Settings::Win32A));
const char expected[] = "struct foo {\n"
"void operatordelete ( void * obj , unsigned long sz ) ;\n"
@ -5545,37 +5547,37 @@ private:
void microsoftMFC()
{
const char code1[] = "class MyDialog : public CDialog { DECLARE_MESSAGE_MAP() private: CString text; };";
ASSERT_EQUALS("class MyDialog : public CDialog { private: CString text ; } ;", tokenizeAndStringify(code1,false,true,Settings::Win32));
ASSERT_EQUALS("class MyDialog : public CDialog { private: CString text ; } ;", tokenizeAndStringify(code1,false,true,Settings::Win32A));
const char code2[] = "class MyDialog : public CDialog { DECLARE_DYNAMIC(MyDialog) private: CString text; };";
ASSERT_EQUALS("class MyDialog : public CDialog { private: CString text ; } ;", tokenizeAndStringify(code2,false,true,Settings::Win32));
ASSERT_EQUALS("class MyDialog : public CDialog { private: CString text ; } ;", tokenizeAndStringify(code2,false,true,Settings::Win32A));
const char code3[] = "class MyDialog : public CDialog { DECLARE_DYNCREATE(MyDialog) private: CString text; };";
ASSERT_EQUALS("class MyDialog : public CDialog { private: CString text ; } ;", tokenizeAndStringify(code3,false,true,Settings::Win32));
ASSERT_EQUALS("class MyDialog : public CDialog { private: CString text ; } ;", tokenizeAndStringify(code3,false,true,Settings::Win32A));
const char code4[] = "class MyDialog : public CDialog { DECLARE_DYNAMIC_CLASS(MyDialog) private: CString text; };";
ASSERT_EQUALS("class MyDialog : public CDialog { private: CString text ; } ;", tokenizeAndStringify(code4,false,true,Settings::Win32));
ASSERT_EQUALS("class MyDialog : public CDialog { private: CString text ; } ;", tokenizeAndStringify(code4,false,true,Settings::Win32A));
}
void microsoftMemory()
{
const char code1[] = "void foo() { int a[10], b[10]; CopyMemory(a, b, sizeof(a)); }";
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; int b [ 10 ] ; memcpy ( a , b , sizeof ( a ) ) ; }", tokenizeAndStringify(code1,false,true,Settings::Win32));
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; int b [ 10 ] ; memcpy ( a , b , sizeof ( a ) ) ; }", tokenizeAndStringify(code1,false,true,Settings::Win32A));
const char code2[] = "void foo() { int a[10]; FillMemory(a, sizeof(a), 255); }";
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; memset ( a , 255 , sizeof ( a ) ) ; }", tokenizeAndStringify(code2,false,true,Settings::Win32));
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; memset ( a , 255 , sizeof ( a ) ) ; }", tokenizeAndStringify(code2,false,true,Settings::Win32A));
const char code3[] = "void foo() { int a[10], b[10]; MoveMemory(a, b, sizeof(a)); }";
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; int b [ 10 ] ; memmove ( a , b , sizeof ( a ) ) ; }", tokenizeAndStringify(code3,false,true,Settings::Win32));
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; int b [ 10 ] ; memmove ( a , b , sizeof ( a ) ) ; }", tokenizeAndStringify(code3,false,true,Settings::Win32A));
const char code4[] = "void foo() { int a[10]; ZeroMemory(a, sizeof(a)); }";
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; memset ( a , 0 , sizeof ( a ) ) ; }", tokenizeAndStringify(code4,false,true,Settings::Win32));
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; memset ( a , 0 , sizeof ( a ) ) ; }", tokenizeAndStringify(code4,false,true,Settings::Win32A));
const char code5[] = "void foo() { ZeroMemory(f(1, g(a, b)), h(i, j(0, 1))); }";
ASSERT_EQUALS("void foo ( ) { memset ( f ( 1 , g ( a , b ) ) , 0 , h ( i , j ( 0 , 1 ) ) ) ; }", tokenizeAndStringify(code5,false,true,Settings::Win32));
ASSERT_EQUALS("void foo ( ) { memset ( f ( 1 , g ( a , b ) ) , 0 , h ( i , j ( 0 , 1 ) ) ) ; }", tokenizeAndStringify(code5,false,true,Settings::Win32A));
const char code6[] = "void foo() { FillMemory(f(1, g(a, b)), h(i, j(0, 1)), 255); }";
ASSERT_EQUALS("void foo ( ) { memset ( f ( 1 , g ( a , b ) ) , 255 , h ( i , j ( 0 , 1 ) ) ) ; }", tokenizeAndStringify(code6,false,true,Settings::Win32));
ASSERT_EQUALS("void foo ( ) { memset ( f ( 1 , g ( a , b ) ) , 255 , h ( i , j ( 0 , 1 ) ) ) ; }", tokenizeAndStringify(code6,false,true,Settings::Win32A));
}
void borland()
@ -6087,7 +6089,40 @@ private:
"long S ; "
"void * T ;";
ASSERT_EQUALS(expected, tokenizeAndStringify(code, true, true, Settings::Win32));
ASSERT_EQUALS(expected, tokenizeAndStringify(code, true, true, Settings::Win32A));
}
void platformWin32A()
{
const char code[] = "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, str);"
"}";
const char expected[] = "char c ; "
"char * ptstr ; "
"char * lptstr ; "
"const char * pctstr ; "
"const char * lpctstr ; "
"void foo ( ) { "
"char src [ 10 ] = \"123456789\" ; "
"char dst [ 10 ] ; "
"strcpy ( dst , src ) ; "
"dst [ 0 ] = 0 ; "
"strcat ( dst , str ) ; "
"}";
ASSERT_EQUALS(expected, tokenizeAndStringify(code, false, true, Settings::Win32A));
}
void platformWin32W()
{
}
void platformWin64()