Preprocessor: set platform info

This commit is contained in:
Daniel Marjamäki 2016-07-25 14:52:23 +02:00
parent 90faa80590
commit 2feb86a6af
4 changed files with 50 additions and 0 deletions

View File

@ -115,6 +115,8 @@ unsigned int CppCheck::processFile(const std::string& filename, std::istream& fi
// Get directives
preprocessor.setDirectives(tokens1);
preprocessor.setPlatformInfo(&tokens1);
// Get configurations..
if (_settings.userDefines.empty() || _settings.force) {
Timer t("Preprocessor::getConfigs", _settings.showtime, &S_timerResults);

View File

@ -440,6 +440,26 @@ void Preprocessor::removeComments()
}
}
void Preprocessor::setPlatformInfo(simplecpp::TokenList *tokens) const
{
tokens->sizeOfType["bool"] = _settings.sizeof_bool;
tokens->sizeOfType["short"] = _settings.sizeof_short;
tokens->sizeOfType["int"] = _settings.sizeof_int;
tokens->sizeOfType["long"] = _settings.sizeof_long;
tokens->sizeOfType["long long"] = _settings.sizeof_long_long;
tokens->sizeOfType["float"] = _settings.sizeof_float;
tokens->sizeOfType["double"] = _settings.sizeof_double;
tokens->sizeOfType["long double"] = _settings.sizeof_long_double;
tokens->sizeOfType["bool *"] = _settings.sizeof_pointer;
tokens->sizeOfType["short *"] = _settings.sizeof_pointer;
tokens->sizeOfType["int *"] = _settings.sizeof_pointer;
tokens->sizeOfType["long *"] = _settings.sizeof_pointer;
tokens->sizeOfType["long long *"] = _settings.sizeof_pointer;
tokens->sizeOfType["float *"] = _settings.sizeof_pointer;
tokens->sizeOfType["double *"] = _settings.sizeof_pointer;
tokens->sizeOfType["long double *"] = _settings.sizeof_pointer;
}
std::string Preprocessor::getcode(const simplecpp::TokenList &tokens1, const std::string &cfg, std::vector<std::string> &files, const bool writeLocations)
{
const std::string filename(files[0]);

View File

@ -96,6 +96,7 @@ public:
void removeComments();
void setPlatformInfo(simplecpp::TokenList *tokens) const;
/**
* Extract the code for each configuration

View File

@ -103,6 +103,8 @@ private:
TEST_CASE(error4); // #2919 - wrong filename is reported
TEST_CASE(error5);
TEST_CASE(setPlatformInfo);
// Handling include guards (don't create extra configuration for it)
TEST_CASE(includeguard1);
TEST_CASE(includeguard2);
@ -633,6 +635,31 @@ private:
ASSERT_EQUALS("", errout.str());
}
void setPlatformInfo() {
Settings settings;
Preprocessor preprocessor(settings, this);
// read code with simplecpp..
const char filedata[] = "#if sizeof(long) == 4\n"
"1\n"
"#else\n"
"2\n"
"#endif\n";
std::istringstream istr(filedata);
std::vector<std::string> files;
simplecpp::TokenList tokens(istr, files, "test.c");
// preprocess code with unix32 platform..
settings.platform(Settings::PlatformType::Unix32);
preprocessor.setPlatformInfo(&tokens);
ASSERT_EQUALS("\n1", preprocessor.getcode(tokens, "", files, false));
// preprocess code with unix64 platform..
settings.platform(Settings::PlatformType::Unix64);
preprocessor.setPlatformInfo(&tokens);
ASSERT_EQUALS("\n\n\n2", preprocessor.getcode(tokens, "", files, false));
}
void includeguard1() {
// Handling include guards..
const char filedata[] = "#file \"abc.h\"\n"