diff --git a/erpcgen/src/Generator.cpp b/erpcgen/src/Generator.cpp index 11e2d242f..88d2d7850 100644 --- a/erpcgen/src/Generator.cpp +++ b/erpcgen/src/Generator.cpp @@ -16,6 +16,7 @@ #include "annotations.h" #include "format_string.hpp" +#include #include #include #include @@ -34,6 +35,10 @@ Generator::Generator(InterfaceDefinition *def, generator_type_t generatorType) , m_globals(&(def->getGlobals())) , m_generatorType(generatorType) { + string scopeName = "erpcShim"; + string scopeNameC; + string scopeNamePrefix = ""; + m_templateData["erpcVersion"] = ERPC_VERSION; m_templateData["erpcVersionNumber"] = ERPC_VERSION_NUMBER; @@ -75,8 +80,28 @@ Generator::Generator(InterfaceDefinition *def, generator_type_t generatorType) m_templateData["crc16"] = m_idlCrc16; } - m_outputDirectory /= getAnnStringValue(m_def->getProgramSymbol(), OUTPUT_DIR_ANNOTATION); + m_outputDirectory /= getAnnStringValue(program, OUTPUT_DIR_ANNOTATION); + + if (findAnnotation(program, SCOPE_NAME_ANNOTATION) == nullptr) + { + scopeName = program->getName(); + } + else + { + scopeName = getAnnStringValue(program, SCOPE_NAME_ANNOTATION); + } + } + + m_templateData["scopeName"] = scopeName; + if (scopeName != "") + { + scopeNameC = scopeName; + std::transform(scopeNameC.begin(), scopeNameC.end(), scopeNameC.begin(), ::toupper); + + scopeNamePrefix = "_"; } + m_templateData["scopeNameC"] = scopeNameC; + m_templateData["scopeNamePrefix"] = scopeNamePrefix; // get group annotation with vector of theirs interfaces m_groups.clear(); diff --git a/erpcgen/src/annotations.h b/erpcgen/src/annotations.h index 148d15f60..afa0cc600 100644 --- a/erpcgen/src/annotations.h +++ b/erpcgen/src/annotations.h @@ -64,6 +64,9 @@ //! Do not free memory for a parameter in the server shim. #define RETAIN_ANNOTATION "retain" +//! Scope name for erpc shim code +#define SCOPE_NAME_ANNOTATION "scope_name" + //! Data handled through shared memory area #define SHARED_ANNOTATION "shared" diff --git a/erpcgen/src/templates/c_common_header.template b/erpcgen/src/templates/c_common_header.template index 0ce6dd46a..8c093ba79 100644 --- a/erpcgen/src/templates/c_common_header.template +++ b/erpcgen/src/templates/c_common_header.template @@ -32,8 +32,8 @@ {$>checkCrc()} {% endif -- not commonTypesFile %} {% if commonTypesFile == "" %} -#if !defined(ERPC_TYPE_DEFINITIONS) -#define ERPC_TYPE_DEFINITIONS +#if !defined(ERPC_TYPE_DEFINITIONS{$scopeNamePrefix}{$scopeNameC}) +#define ERPC_TYPE_DEFINITIONS{$scopeNamePrefix}{$scopeNameC} {% if not empty(enums) %} // Enumerators data types declarations @@ -102,7 +102,7 @@ extern const {$c.typeAndName};{$c.ilComment}{$loop.addNewLineIfNotLast} {% endfor -- consts %} {% endif -- consts %} -#endif // ERPC_TYPE_DEFINITIONS +#endif // ERPC_TYPE_DEFINITIONS{$scopeNamePrefix}{$scopeNameC} {% endif -- commonTypesFile %} {% if not genCommonTypesFile %} diff --git a/erpcgen/test/test_scope_c.yml b/erpcgen/test/test_scope_c.yml new file mode 100644 index 000000000..e97752565 --- /dev/null +++ b/erpcgen/test/test_scope_c.yml @@ -0,0 +1,63 @@ +--- +name: default scope +desc: without program name and annotation +idl: | + interface test { + bar(int32 x) -> void + } +test.h: + - | + #if !defined(ERPC_TYPE_DEFINITIONS_ERPCSHIM) + #define ERPC_TYPE_DEFINITIONS_ERPCSHIM + - | + #endif // ERPC_TYPE_DEFINITIONS_ERPCSHIM + +--- +name: program name based scope +desc: scope based on program name +idl: | + program test + + interface test { + bar(int32 x) -> void + } +test.h: + - | + #if !defined(ERPC_TYPE_DEFINITIONS_TEST) + #define ERPC_TYPE_DEFINITIONS_TEST + - | + #endif // ERPC_TYPE_DEFINITIONS_TEST + +--- +name: annotation based scope +desc: scope based on annotation value +idl: | + @scope_name("myScope") + program test + + interface test { + bar(int32 x) -> void + } +test.h: + - | + #if !defined(ERPC_TYPE_DEFINITIONS_MYSCOPE) + #define ERPC_TYPE_DEFINITIONS_MYSCOPE + - | + #endif // ERPC_TYPE_DEFINITIONS_MYSCOPE + +--- +name: empty scope name +desc: scope based on annotation value "" +idl: | + @scope_name("") + program test + + interface test { + bar(int32 x) -> void + } +test.h: + - | + #if !defined(ERPC_TYPE_DEFINITIONS) + #define ERPC_TYPE_DEFINITIONS + - | + #endif // ERPC_TYPE_DEFINITIONS