mirror of
https://github.com/nasa/trick.git
synced 2024-12-20 05:37:55 +00:00
Sanitize field names when generating STL functions
A sanitizing function was already present in FieldVisitor.cpp. I refactored and moved it to Utilities. Refs #429
This commit is contained in:
parent
34c62c5aab
commit
05b4d09b2b
@ -252,22 +252,6 @@ bool FieldVisitor::VisitPointerType(clang::PointerType *p) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string mangle_string( std::string in_name ) {
|
|
||||||
// convert characters not valid in a function name to underscores
|
|
||||||
std::string mangled_name = in_name ;
|
|
||||||
// Create a mangled type name, some characters have to converted to underscores.
|
|
||||||
std::replace( mangled_name.begin(), mangled_name.end(), '<', '_') ;
|
|
||||||
std::replace( mangled_name.begin(), mangled_name.end(), '>', '_') ;
|
|
||||||
std::replace( mangled_name.begin(), mangled_name.end(), ' ', '_') ;
|
|
||||||
std::replace( mangled_name.begin(), mangled_name.end(), ',', '_') ;
|
|
||||||
std::replace( mangled_name.begin(), mangled_name.end(), ':', '_') ;
|
|
||||||
std::replace( mangled_name.begin(), mangled_name.end(), '*', '_') ;
|
|
||||||
std::replace( mangled_name.begin(), mangled_name.end(), ']', '_') ;
|
|
||||||
std::replace( mangled_name.begin(), mangled_name.end(), '[', '_') ;
|
|
||||||
|
|
||||||
return mangled_name ;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::map < std::string , std::string > FieldVisitor::processed_templates ;
|
std::map < std::string , std::string > FieldVisitor::processed_templates ;
|
||||||
|
|
||||||
bool FieldVisitor::ProcessTemplate(std::string in_name , clang::CXXRecordDecl * crd ) {
|
bool FieldVisitor::ProcessTemplate(std::string in_name , clang::CXXRecordDecl * crd ) {
|
||||||
@ -284,7 +268,7 @@ bool FieldVisitor::ProcessTemplate(std::string in_name , clang::CXXRecordDecl *
|
|||||||
// Check to see if we've processed this template before
|
// Check to see if we've processed this template before
|
||||||
// If not we need to create attributes for this template
|
// If not we need to create attributes for this template
|
||||||
if ( processed_templates.find(in_name) == processed_templates.end() ) {
|
if ( processed_templates.find(in_name) == processed_templates.end() ) {
|
||||||
std::string mangled_name = mangle_string(in_name) ;
|
std::string mangled_name = sanitize(in_name) ;
|
||||||
|
|
||||||
// save off the mangled name of this template to be used if another variable is the same template type
|
// save off the mangled name of this template to be used if another variable is the same template type
|
||||||
processed_templates[in_name] = fdes->getContainerClass() + "_" +
|
processed_templates[in_name] = fdes->getContainerClass() + "_" +
|
||||||
|
@ -160,7 +160,7 @@ void PrintFileContents10::print_field_init_attr_stmts( std::ostream & ostream ,
|
|||||||
|
|
||||||
if ( fdes->isSTL() ) {
|
if ( fdes->isSTL() ) {
|
||||||
auto print = [&](const std::string& field) {
|
auto print = [&](const std::string& field) {
|
||||||
ostream << prefix << field << " = " << field << "_" << fullyQualifiedMangledClassNameUnderscores + "_" + fieldName + " ;\n";
|
ostream << prefix << field << " = " << field << "_" << fullyQualifiedMangledClassNameUnderscores + "_" + sanitize(fieldName) + " ;\n";
|
||||||
};
|
};
|
||||||
|
|
||||||
if ( fdes->isCheckpointable() ) {
|
if ( fdes->isCheckpointable() ) {
|
||||||
@ -404,7 +404,7 @@ void PrintFileContents10::printEnumMapFooter( std::ostream & ostream ) {
|
|||||||
void PrintFileContents10::printStlFunction(const std::string& name, const std::string& parameters, const std::string& call, std::ostream& ostream, FieldDescription& fieldDescription, ClassValues& classValues) {
|
void PrintFileContents10::printStlFunction(const std::string& name, const std::string& parameters, const std::string& call, std::ostream& ostream, FieldDescription& fieldDescription, ClassValues& classValues) {
|
||||||
const std::string typeName = fieldDescription.getTypeName();
|
const std::string typeName = fieldDescription.getTypeName();
|
||||||
const std::string functionName = name + "_stl";
|
const std::string functionName = name + "_stl";
|
||||||
ostream << "void " << functionName << "_" << classValues.getFullyQualifiedMangledTypeName("__") << "_" << fieldDescription.getName()
|
ostream << "void " << functionName << "_" << classValues.getFullyQualifiedMangledTypeName("__") << "_" << sanitize(fieldDescription.getName())
|
||||||
<< "(" << parameters << ") {" << std::endl
|
<< "(" << parameters << ") {" << std::endl
|
||||||
<< " " << typeName << "* stl = reinterpret_cast<" << typeName << "*>(start_address);" << std::endl
|
<< " " << typeName << "* stl = reinterpret_cast<" << typeName << "*>(start_address);" << std::endl
|
||||||
<< " " << call << ";" << std::endl
|
<< " " << call << ";" << std::endl
|
||||||
|
@ -6,6 +6,14 @@
|
|||||||
|
|
||||||
#include "Utilities.hh"
|
#include "Utilities.hh"
|
||||||
|
|
||||||
|
std::string sanitize(const std::string& text) {
|
||||||
|
std::string result = text;
|
||||||
|
for (char c : {'<', '>', ' ', ',', ':', '*', '[', ']'}) {
|
||||||
|
std::replace(result.begin(), result.end(), c, '_');
|
||||||
|
}
|
||||||
|
return result ;
|
||||||
|
}
|
||||||
|
|
||||||
// removes leading and trailing whitespace from a string
|
// removes leading and trailing whitespace from a string
|
||||||
std::string trim(const std::string& str, const std::string& whitespace ) {
|
std::string trim(const std::string& str, const std::string& whitespace ) {
|
||||||
size_t strBegin = str.find_first_not_of(whitespace);
|
size_t strBegin = str.find_first_not_of(whitespace);
|
||||||
|
@ -14,6 +14,7 @@ enum Color {
|
|||||||
SKIP = 95
|
SKIP = 95
|
||||||
};
|
};
|
||||||
|
|
||||||
|
std::string sanitize(const std::string&);
|
||||||
std::string trim( const std::string& str, const std::string& whitespace = " \t\n\r" ) ;
|
std::string trim( const std::string& str, const std::string& whitespace = " \t\n\r" ) ;
|
||||||
bool isInUserCode( clang::CompilerInstance & ci , clang::SourceLocation sl , HeaderSearchDirs & hsd ) ;
|
bool isInUserCode( clang::CompilerInstance & ci , clang::SourceLocation sl , HeaderSearchDirs & hsd ) ;
|
||||||
bool isInUserOrTrickCode( clang::CompilerInstance & ci , clang::SourceLocation sl , HeaderSearchDirs & hsd ) ;
|
bool isInUserOrTrickCode( clang::CompilerInstance & ci , clang::SourceLocation sl , HeaderSearchDirs & hsd ) ;
|
||||||
|
Loading…
Reference in New Issue
Block a user