diff -r 25f3b479a8ce -r 155560bfe837 stage4/generate_c/generate_c.cc --- a/stage4/generate_c/generate_c.cc Fri Dec 23 15:17:45 2011 +0100 +++ b/stage4/generate_c/generate_c.cc Fri Dec 30 18:25:39 2011 +0100 @@ -104,6 +104,7 @@ #define DECLARE_GLOBAL_LOCATED "__DECLARE_GLOBAL_LOCATED" #define DECLARE_EXTERNAL "__DECLARE_EXTERNAL" #define DECLARE_LOCATED "__DECLARE_LOCATED" +#define DECLARE_GLOBAL_PROTOTYPE "__DECLARE_GLOBAL_PROTOTYPE" /* Variable declaration symbol for accessor macros */ #define INIT_VAR "__INIT_VAR" @@ -126,6 +127,8 @@ #define SET_EXTERNAL "__SET_EXTERNAL" #define SET_LOCATED "__SET_LOCATED" +/* Variable initial value symbol for accessor macros */ +#define INITIAL_VALUE "__INITIAL_VALUE" /* Generate a name for a temporary variable. * Each new name generated is appended a different number, @@ -1558,11 +1561,13 @@ class generate_c_config_c: public generate_c_typedecl_c { private: stage4out_c *s4o_ptr; - + stage4out_c *s4o_incl_ptr; + public: - generate_c_config_c(stage4out_c *s4o_ptr) - : generate_c_typedecl_c(s4o_ptr) { + generate_c_config_c(stage4out_c *s4o_ptr, stage4out_c *s4o_incl_ptr) + : generate_c_typedecl_c(s4o_ptr, s4o_incl_ptr) { generate_c_config_c::s4o_ptr = s4o_ptr; + generate_c_config_c::s4o_incl_ptr = s4o_incl_ptr; }; virtual ~generate_c_config_c(void) {} @@ -1581,8 +1586,17 @@ /********************/ /* 2.1.6 - Pragmas */ /********************/ -void *visit(enable_code_generation_pragma_c * symbol) {s4o_ptr->enable_output(); return NULL;} -void *visit(disable_code_generation_pragma_c * symbol) {s4o_ptr->disable_output(); return NULL;} +void *visit(enable_code_generation_pragma_c * symbol) { + s4o_ptr->enable_output(); + s4o_incl_ptr->enable_output(); + return NULL; +} + +void *visit(disable_code_generation_pragma_c * symbol) { + s4o_ptr->disable_output(); + s4o_incl_ptr->disable_output(); + return NULL; +} /********************************/ @@ -1626,6 +1640,15 @@ delete vardecl; s4o.print("\n"); + /* (A.3) Declare global prototypes in include file */ + vardecl = new generate_c_vardecl_c(&s4o_incl, + generate_c_vardecl_c::globalprototype_vf, + generate_c_vardecl_c::global_vt, + symbol->configuration_name); + vardecl->print(symbol); + delete vardecl; + s4o_incl.print("\n"); + /* (B) Initialisation Function */ /* (B.1) Ressources initialisation protos... */ wanted_declaretype = initprotos_dt; @@ -1755,20 +1778,24 @@ private: /* The name of the resource curretnly being processed... */ + symbol_c *current_configuration; symbol_c *current_resource_name; symbol_c *current_task_name; symbol_c *current_global_vars; + bool configuration_name; stage4out_c *s4o_ptr; public: generate_c_resources_c(stage4out_c *s4o_ptr, symbol_c *config_scope, symbol_c *resource_scope, unsigned long time) : generate_c_typedecl_c(s4o_ptr) { + current_configuration = config_scope; search_config_instance = new search_var_instance_decl_c(config_scope); search_resource_instance = new search_var_instance_decl_c(resource_scope); common_ticktime = time; current_resource_name = NULL; current_task_name = NULL; current_global_vars = NULL; + configuration_name = false; generate_c_resources_c::s4o_ptr = s4o_ptr; }; @@ -1821,6 +1848,20 @@ return NULL; } + /*************************/ + /* B.1 - Common elements */ + /*************************/ + /*******************************************/ + /* B 1.1 - Letters, digits and identifiers */ + /*******************************************/ + + void *visit(identifier_c *symbol) { + if (configuration_name) + s4o.print(symbol->value); + else + generate_c_base_c::visit(symbol); + return NULL; + } /********************/ /* 2.1.6 - Pragmas */ @@ -1848,9 +1889,13 @@ return NULL; } -/********************************/ -/* B 1.7 Configuration elements */ -/********************************/ + /********************************/ + /* B 1.7 Configuration elements */ + /********************************/ + + void *visit(configuration_declaration_c *symbol) { + return symbol->configuration_name->accept(*this); + } /* RESOURCE resource_name ON resource_type_name @@ -1893,7 +1938,12 @@ s4o.print("extern unsigned long long common_ticktime__;\n\n"); - s4o.print("#include \"accessor.h\"\n\n"); + s4o.print("#include \"accessor.h\"\n"); + s4o.print("#include \""); + configuration_name = true; + current_configuration->accept(*this); + configuration_name = false; + s4o.print(".h\"\n"); s4o.print("#include \"POUS.h\"\n\n"); /* (A.2) Global variables... */ @@ -2446,9 +2496,10 @@ } symbol->configuration_name->accept(*this); - + stage4out_c config_s4o(current_builddir, current_name, "c"); - generate_c_config_c generate_c_config(&config_s4o); + stage4out_c config_incl_s4o(current_builddir, current_name, "h"); + generate_c_config_c generate_c_config(&config_s4o, &config_incl_s4o); symbol->accept(generate_c_config); config_s4o.print("unsigned long long common_ticktime__ = ");