--- a/absyntax_utils/search_var_instance_decl.cc Fri Dec 04 15:13:08 2009 +0100
+++ b/absyntax_utils/search_var_instance_decl.cc Sat Dec 05 18:53:01 2009 +0100
@@ -69,7 +69,7 @@
return (symbol_c *)search_scope->accept(*this);
}
-unsigned int search_var_instance_decl_c::get_vartype() {
+unsigned int search_var_instance_decl_c::get_vartype(void) {
return current_vartype;
}
--- a/absyntax_utils/search_var_instance_decl.hh Fri Dec 04 15:13:08 2009 +0100
+++ b/absyntax_utils/search_var_instance_decl.hh Sat Dec 05 18:53:01 2009 +0100
@@ -69,7 +69,7 @@
public:
search_var_instance_decl_c(symbol_c *search_scope);
symbol_c *get_decl(symbol_c *variable_instance_name);
- unsigned int get_vartype();
+ unsigned int get_vartype(void);
public:
--- a/absyntax_utils/search_varfb_instance_type.cc Fri Dec 04 15:13:08 2009 +0100
+++ b/absyntax_utils/search_varfb_instance_type.cc Sat Dec 05 18:53:01 2009 +0100
@@ -56,13 +56,13 @@
search_varfb_instance_type_c::search_varfb_instance_type_c(symbol_c *search_scope): search_var_instance_decl(search_scope) {
this->decompose_var_instance_name = NULL;
this->current_structelement_name = NULL;
- this->search_base_type = false;
-}
-
-symbol_c *search_varfb_instance_type_c::get_type(symbol_c *variable_name, bool base_type) {
+ this->current_rawtype = NULL;
+}
+
+symbol_c *search_varfb_instance_type_c::get_type(symbol_c *variable_name) {
this->current_structelement_name = NULL;
+ this->current_rawtype = NULL;
this->decompose_var_instance_name = new decompose_var_instance_name_c(variable_name);
- this->search_base_type = base_type;
if (NULL == decompose_var_instance_name) ERROR;
/* find the part of the variable name that will appear in the
@@ -88,7 +88,7 @@
symbol_c *res = (symbol_c *)var_decl->accept(*this);
if (NULL == res) ERROR;
- /* make sure that we have decomposed all strcuture elements of the variable name */
+ /* make sure that we have decomposed all structure elements of the variable name */
symbol_c *var_name = decompose_var_instance_name->next_part();
if (NULL != var_name) ERROR;
@@ -97,6 +97,8 @@
unsigned int search_varfb_instance_type_c::get_vartype(symbol_c *variable_name) {
this->current_structelement_name = NULL;
+ this->current_rawtype = NULL;
+ this->is_complex = false;
this->decompose_var_instance_name = new decompose_var_instance_name_c(variable_name);
if (NULL == decompose_var_instance_name) ERROR;
@@ -120,15 +122,28 @@
* This class, while visiting, will recursively call
* decompose_var_instance_name->get_next() when and if required...
*/
+ var_decl->accept(*this);
unsigned int res = search_var_instance_decl.get_vartype();
- /* make sure that we have decomposed all strcuture elements of the variable name */
+ /* make sure that we have decomposed all structure elements of the variable name */
symbol_c *var_name = decompose_var_instance_name->next_part();
if (NULL != var_name) ERROR;
return res;
}
+symbol_c *search_varfb_instance_type_c::get_rawtype(symbol_c *variable_name) {
+ symbol_c *rawtype = this->get_type(variable_name);
+ if (this->current_rawtype != NULL)
+ return this->current_rawtype;
+ else
+ return rawtype;
+}
+
+bool search_varfb_instance_type_c::type_is_complex(void) {
+ return this->is_complex;
+}
+
/* a helper function... */
void *search_varfb_instance_type_c::visit_list(list_c *list) {
if (NULL == current_structelement_name) ERROR;
@@ -163,10 +178,11 @@
/* No. It is not a function block, so we let
* the base class take care of it...
*/
- if (this->search_base_type)
+ this->current_rawtype = type_name;
+ if (current_structelement_name == NULL)
+ return base_type(type_name);
+ else
return search_base_type_c::visit(type_name);
- else
- return type_name;
}
/********************************/
@@ -181,6 +197,7 @@
/* array_specification [ASSIGN array_initialization} */
/* array_initialization may be NULL ! */
void *search_varfb_instance_type_c::visit(array_spec_init_c *symbol) {
+ this->is_complex = true;
symbol_c *var_name = decompose_var_instance_name->next_part();
if (NULL != var_name)
current_structelement_name = var_name;
@@ -209,7 +226,8 @@
/* structure_initialization may be NULL ! */
// SYM_REF2(initialized_structure_c, structure_type_name, structure_initialization)
void *search_varfb_instance_type_c::visit(initialized_structure_c *symbol) {
- /* make sure that we have decomposed all strcuture elements of the variable name */
+ this->is_complex = true;
+ /* make sure that we have decomposed all structure elements of the variable name */
symbol_c *var_name = decompose_var_instance_name->next_part();
if (NULL == var_name) {
/* this is it... !
--- a/absyntax_utils/search_varfb_instance_type.hh Fri Dec 04 15:13:08 2009 +0100
+++ b/absyntax_utils/search_varfb_instance_type.hh Sat Dec 05 18:53:01 2009 +0100
@@ -53,13 +53,16 @@
search_var_instance_decl_c search_var_instance_decl;
decompose_var_instance_name_c *decompose_var_instance_name;
symbol_c *current_structelement_name;
- bool search_base_type;
+ symbol_c *current_rawtype;
+ bool is_complex;
public:
search_varfb_instance_type_c(symbol_c *search_scope);
- symbol_c *get_type(symbol_c *variable_name, bool base_type = true);
+ symbol_c *get_type(symbol_c *variable_name);
+ symbol_c *get_rawtype(symbol_c *variable_name);
unsigned int get_vartype(symbol_c *variable_name);
+ bool type_is_complex(void);
private:
/* a helper function... */
--- a/lib/accessor.h Fri Dec 04 15:13:08 2009 +0100
+++ b/lib/accessor.h Sat Dec 05 18:53:01 2009 +0100
@@ -20,21 +20,25 @@
// variable initialization macros
-#define __INIT_STRUCT(name, initial, retained)\
- name.value = initial;\
- name.flags |= retained?__IEC_RETAIN_FLAG:0;
+#define __INIT_RETAIN(name, retained)\
+ name.flags |= retained?__IEC_RETAIN_FLAG:0;
#define __INIT_VAR(name, initial, retained)\
- __INIT_STRUCT(name, initial, retained)
+ name.value = initial;\
+ __INIT_RETAIN(name, retained)
#define __INIT_GLOBAL(name, initial, retained)\
- __INIT_STRUCT((*GLOBAL__##name), initial, retained)
+ (*GLOBAL__##name).value = initial;\
+ __INIT_RETAIN((*GLOBAL__##name), retained)
#define __INIT_GLOBAL_LOCATED(resource, name, location, retained)\
- __INIT_STRUCT(resource##__##name, location, retained)
+ resource##__##name.value = location;\
+ __INIT_RETAIN(resource##__##name, retained)
#define __INIT_EXTERNAL(type, global, name, retained)\
{extern __IEC_##type##_t *GLOBAL__##global;\
- __INIT_STRUCT(name, &((*GLOBAL__##global).value), retained)}
+ name.value = &((*GLOBAL__##global).value);\
+ __INIT_RETAIN(name, retained)}
#define __INIT_LOCATED(type, location, name, retained)\
{extern type *location;\
- __INIT_STRUCT(name, location, retained)}
+ name.value = location;\
+ __INIT_RETAIN(name, retained)}
#define __INIT_LOCATED_VALUE(name, initial)\
*(name.value) = initial;
@@ -42,10 +46,10 @@
// variable getting macros
#define __GET_VAR(name, ...)\
name.value __VA_ARGS__
-#define __GET_EXTERNAL(name)\
- name.flags & __IEC_FORCE_FLAG ? name.fvalue : *(name.value)
-#define __GET_LOCATED(name)\
- name.flags & __IEC_FORCE_FLAG ? name.fvalue : *(name.value)
+#define __GET_EXTERNAL(name, ...)\
+ (name.flags & __IEC_FORCE_FLAG) ? name.fvalue __VA_ARGS__ : *(name.value) __VA_ARGS__
+#define __GET_LOCATED(name, ...)\
+ (name.flags & __IEC_FORCE_FLAG) ? name.fvalue __VA_ARGS__ : *(name.value) __VA_ARGS__
#define __GET_VAR_BY_REF(name)\
&(name)
#define __GET_EXTERNAL_BY_REF(name)\
@@ -56,9 +60,9 @@
// variable setting macros
#define __SET_VAR(name, new_value, ...)\
if (!(name.flags & __IEC_FORCE_FLAG)) name.value __VA_ARGS__ = new_value
-#define __SET_EXTERNAL(name, new_value)\
- if (!(name.flags & __IEC_FORCE_FLAG)) *(name.value) = new_value
-#define __SET_LOCATED(name, new_value)\
- if (!(name.flags & __IEC_FORCE_FLAG)) *(name.value) = new_value
+#define __SET_EXTERNAL(name, new_value, ...)\
+ if (!(name.flags & __IEC_FORCE_FLAG)) *(name.value) __VA_ARGS__ = new_value
+#define __SET_LOCATED(name, new_value, ...)\
+ if (!(name.flags & __IEC_FORCE_FLAG)) *(name.value) __VA_ARGS__ = new_value
#endif //__ACCESSOR_H
--- a/stage4/generate_c/generate_c_il.cc Fri Dec 04 15:13:08 2009 +0100
+++ b/stage4/generate_c/generate_c_il.cc Sat Dec 05 18:53:01 2009 +0100
@@ -1004,7 +1004,7 @@
if (param_value != NULL)
if ((param_direction == function_param_iterator_c::direction_out) ||
(param_direction == function_param_iterator_c::direction_inout)) {
- symbol_c *param_type = search_varfb_instance_type->get_type(param_value, false);
+ symbol_c *param_type = search_varfb_instance_type->get_rawtype(param_value);
unsigned int vartype = search_varfb_instance_type->get_vartype(param_value);
if (!this->is_variable_prefix_null()) {
@@ -1376,7 +1376,7 @@
}
void *visit(ST_operator_c *symbol) {
- symbol_c *operand_type = search_varfb_instance_type->get_type(this->current_operand, false);
+ symbol_c *operand_type = search_varfb_instance_type->get_rawtype(this->current_operand);
if (!this->is_variable_prefix_null()) {
unsigned int vartype = search_varfb_instance_type->get_vartype(this->current_operand);
@@ -1409,7 +1409,7 @@
}
void *visit(STN_operator_c *symbol) {
- symbol_c *operand_type = search_varfb_instance_type->get_type(this->current_operand, false);
+ symbol_c *operand_type = search_varfb_instance_type->get_rawtype(this->current_operand);
if (!this->is_variable_prefix_null()) {
unsigned int vartype = search_varfb_instance_type->get_vartype(this->current_operand);
--- a/stage4/generate_c/generate_c_st.cc Fri Dec 04 15:13:08 2009 +0100
+++ b/stage4/generate_c/generate_c_st.cc Sat Dec 05 18:53:01 2009 +0100
@@ -44,6 +44,8 @@
typedef enum {
expression_vg,
assignment_vg,
+ complextype_base_vg,
+ complextype_suffix_vg,
fparam_output_vg
} variablegeneration_t;
@@ -111,14 +113,74 @@
private:
+void *print_getter(symbol_c *symbol) {
+ unsigned int vartype = search_varfb_instance_type->get_vartype(symbol);
+ if (vartype == search_var_instance_decl_c::external_vt)
+ s4o.print(GET_EXTERNAL);
+ else if (vartype == search_var_instance_decl_c::located_vt)
+ s4o.print(GET_LOCATED);
+ else
+ s4o.print(GET_VAR);
+ s4o.print("(");
+
+ wanted_variablegeneration = complextype_base_vg;
+ symbol->accept(*this);
+ if (search_varfb_instance_type->type_is_complex())
+ s4o.print(",");
+ wanted_variablegeneration = complextype_suffix_vg;
+ symbol->accept(*this);
+ s4o.print(")");
+ wanted_variablegeneration = expression_vg;
+ return NULL;
+}
+
+void *print_setter(symbol_c* symbol,
+ symbol_c* type,
+ symbol_c* value,
+ symbol_c* fb_symbol = NULL,
+ symbol_c* fb_value = NULL) {
+ unsigned int vartype = search_varfb_instance_type->get_vartype(symbol);
+ if (vartype == search_var_instance_decl_c::external_vt)
+ s4o.print(SET_EXTERNAL);
+ else if (vartype == search_var_instance_decl_c::located_vt)
+ s4o.print(SET_LOCATED);
+ else
+ s4o.print(SET_VAR);
+ s4o.print("(");
+
+ if (fb_symbol != NULL) {
+ print_variable_prefix();
+ fb_symbol->accept(*this);
+ s4o.print(".");
+ }
+ else
+ wanted_variablegeneration = complextype_base_vg;
+ symbol->accept(*this);
+ s4o.print(",");
+ wanted_variablegeneration = expression_vg;
+ print_check_function(type, value, fb_value);
+ if (search_varfb_instance_type->type_is_complex()) {
+ s4o.print(",");
+ wanted_variablegeneration = complextype_suffix_vg;
+ symbol->accept(*this);
+ }
+ s4o.print(")");
+ wanted_variablegeneration = expression_vg;
+ return NULL;
+}
/*********************/
/* B 1.4 - Variables */
/*********************/
void *visit(symbolic_variable_c *symbol) {
- unsigned int vartype = search_varfb_instance_type->get_vartype(symbol);
- if (this->is_variable_prefix_null()) {
- if (wanted_variablegeneration == fparam_output_vg) {
+ unsigned int vartype;
+ if (wanted_variablegeneration == complextype_base_vg)
+ generate_c_base_c::visit(symbol);
+ else if (wanted_variablegeneration == complextype_suffix_vg)
+ return NULL;
+ else if (this->is_variable_prefix_null()) {
+ vartype = search_varfb_instance_type->get_vartype(symbol);
+ if (wanted_variablegeneration == fparam_output_vg) {
if (vartype == search_var_instance_decl_c::external_vt)
s4o.print(GET_EXTERNAL);
else
@@ -141,7 +203,8 @@
else {
switch (wanted_variablegeneration) {
case expression_vg:
- if (vartype == search_var_instance_decl_c::external_vt)
+ vartype = search_varfb_instance_type->get_vartype(symbol);
+ if (vartype == search_var_instance_decl_c::external_vt)
s4o.print(GET_EXTERNAL);
else if (vartype == search_var_instance_decl_c::located_vt)
s4o.print(GET_LOCATED);
@@ -152,7 +215,8 @@
s4o.print(")");
break;
case fparam_output_vg:
- if (vartype == search_var_instance_decl_c::external_vt)
+ vartype = search_varfb_instance_type->get_vartype(symbol);
+ if (vartype == search_var_instance_decl_c::external_vt)
s4o.print(GET_EXTERNAL_BY_REF);
else if (vartype == search_var_instance_decl_c::located_vt)
s4o.print(GET_LOCATED_BY_REF);
@@ -211,60 +275,24 @@
// SYM_REF2(structured_variable_c, record_variable, field_selector)
void *visit(structured_variable_c *symbol) {
TRACE("structured_variable_c");
-
- unsigned int vartype = search_varfb_instance_type->get_vartype(symbol->record_variable);
- if (this->is_variable_prefix_null()) {
- symbol->record_variable->accept(*this);
- s4o.print(".");
- symbol->field_selector->accept(*this);
- }
- else {
- variablegeneration_t old_wanted_variablegeneration = wanted_variablegeneration;
- switch (wanted_variablegeneration) {
- case expression_vg:
- wanted_variablegeneration = assignment_vg;
- if (vartype == search_var_instance_decl_c::external_vt) {
- s4o.print(GET_EXTERNAL);
- s4o.print("(");
- symbol->record_variable->accept(*this);
- s4o.print(").");
- symbol->field_selector->accept(*this);
- }
- else {
- if (vartype == search_var_instance_decl_c::located_vt)
- s4o.print(GET_LOCATED);
- else
- s4o.print(GET_VAR);
- s4o.print("(");
- symbol->record_variable->accept(*this);
- s4o.print(".");
- symbol->field_selector->accept(*this);
- s4o.print(")");
- }
- wanted_variablegeneration = old_wanted_variablegeneration;
- break;
- case fparam_output_vg:
- wanted_variablegeneration = assignment_vg;
- s4o.print("&(");
- if (vartype == search_var_instance_decl_c::external_vt)
- s4o.print(GET_EXTERNAL);
- else if (vartype == search_var_instance_decl_c::located_vt)
- s4o.print(GET_LOCATED);
- else
- s4o.print(GET_VAR);
- s4o.print("(");
- symbol->record_variable->accept(*this);
- s4o.print(").");
- symbol->field_selector->accept(*this);
- s4o.print("))");
- wanted_variablegeneration = old_wanted_variablegeneration;
- break;
- default:
+ switch (wanted_variablegeneration) {
+ case complextype_base_vg:
+ symbol->record_variable->accept(*this);
+ break;
+ case complextype_suffix_vg:
+ symbol->record_variable->accept(*this);
+ s4o.print(".");
+ symbol->field_selector->accept(*this);
+ break;
+ default:
+ if (this->is_variable_prefix_null()) {
symbol->record_variable->accept(*this);
s4o.print(".");
symbol->field_selector->accept(*this);
- break;
- }
+ }
+ else
+ print_getter(symbol);
+ break;
}
return NULL;
}
@@ -272,11 +300,30 @@
/* subscripted_variable '[' subscript_list ']' */
//SYM_REF2(array_variable_c, subscripted_variable, subscript_list)
void *visit(array_variable_c *symbol) {
- current_array_type = search_varfb_instance_type->get_type(symbol->subscripted_variable, false);
- symbol->subscripted_variable->accept(*this);
- if (current_array_type != NULL) {
- symbol->subscript_list->accept(*this);
- current_array_type = NULL;
+ switch (wanted_variablegeneration) {
+ case complextype_base_vg:
+ symbol->subscripted_variable->accept(*this);
+ break;
+ case complextype_suffix_vg:
+ current_array_type = search_varfb_instance_type->get_rawtype(symbol->subscripted_variable);
+ symbol->subscripted_variable->accept(*this);
+ if (current_array_type != NULL) {
+ symbol->subscript_list->accept(*this);
+ current_array_type = NULL;
+ }
+ break;
+ default:
+ if (this->is_variable_prefix_null()) {
+ current_array_type = search_varfb_instance_type->get_rawtype(symbol->subscripted_variable);
+ symbol->subscripted_variable->accept(*this);
+ if (current_array_type != NULL) {
+ symbol->subscript_list->accept(*this);
+ current_array_type = NULL;
+ }
+ }
+ else
+ print_getter(symbol);
+ break;
}
return NULL;
}
@@ -708,32 +755,16 @@
/* B 3.2.1 Assignment Statements */
/*********************************/
void *visit(assignment_statement_c *symbol) {
- symbol_c *left_type = search_varfb_instance_type->get_type(symbol->l_exp, false);
+ symbol_c *left_type = search_varfb_instance_type->get_rawtype(symbol->l_exp);
- if (!this->is_variable_prefix_null()) {
- unsigned int vartype = search_varfb_instance_type->get_vartype(symbol->l_exp);
- if (vartype == search_var_instance_decl_c::external_vt)
- s4o.print(SET_EXTERNAL);
- else if (vartype == search_var_instance_decl_c::located_vt)
- s4o.print(SET_LOCATED);
- else
- s4o.print(SET_VAR);
- s4o.print("(");
-
- wanted_variablegeneration = assignment_vg;
+ if (this->is_variable_prefix_null()) {
symbol->l_exp->accept(*this);
- wanted_variablegeneration = expression_vg;
-
- s4o.print(",");
+ s4o.print(" = ");
+ print_check_function(left_type, symbol->r_exp);
}
else {
- symbol->l_exp->accept(*this);
-
- s4o.print(" = ");
- }
- print_check_function(left_type, symbol->r_exp);
- if (!this->is_variable_prefix_null())
- s4o.print(")");
+ print_setter(symbol->l_exp, left_type, symbol->r_exp);
+ }
return NULL;
}
@@ -781,21 +812,17 @@
if (param_value != NULL)
if ((param_direction == function_param_iterator_c::direction_in) ||
(param_direction == function_param_iterator_c::direction_inout)) {
- if (!this->is_variable_prefix_null()) {
- s4o.print(SET_VAR);
- s4o.print("(");
+ if (this->is_variable_prefix_null()) {
+ print_variable_prefix();
+ symbol->fb_name->accept(*this);
+ s4o.print(".");
+ param_name->accept(*this);
+ s4o.print(" = ");
+ print_check_function(param_type, param_value);
}
- print_variable_prefix();
- symbol->fb_name->accept(*this);
- s4o.print(".");
- param_name->accept(*this);
- if (this->is_variable_prefix_null())
- s4o.print(" = ");
- else
- s4o.print(",");
- print_check_function(param_type, param_value);
- if (!this->is_variable_prefix_null())
- s4o.print(")");
+ else {
+ print_setter(param_name, param_type, param_value, symbol->fb_name);
+ }
s4o.print(";\n" + s4o.indent_spaces);
}
} /* for(...) */
@@ -827,31 +854,15 @@
if (param_value != NULL)
if ((param_direction == function_param_iterator_c::direction_out) ||
(param_direction == function_param_iterator_c::direction_inout)) {
- symbol_c *param_type = search_varfb_instance_type->get_type(param_value, false);
-
- if (!this->is_variable_prefix_null()) {
- unsigned int vartype = search_varfb_instance_type->get_vartype(param_value);
- s4o.print(";\n"+ s4o.indent_spaces);
- if (vartype == search_var_instance_decl_c::external_vt)
- s4o.print(SET_EXTERNAL);
- else if (vartype == search_var_instance_decl_c::located_vt)
- s4o.print(SET_LOCATED);
- else
- s4o.print(SET_VAR);
- s4o.print("(");
-
- wanted_variablegeneration = assignment_vg;
+ symbol_c *param_type = search_varfb_instance_type->get_rawtype(param_value);
+ if (this->is_variable_prefix_null()) {
param_value->accept(*this);
- wanted_variablegeneration = expression_vg;
- s4o.print(",");
+ s4o.print(" = ");
+ print_check_function(param_type, param_name, symbol->fb_name);
}
else {
- param_value->accept(*this);
- s4o.print(" = ");
+ print_setter(param_value, param_type, param_name, NULL, symbol->fb_name);
}
- print_check_function(param_type, param_name, symbol->fb_name);
- if (!this->is_variable_prefix_null())
- s4o.print(")");
}
} /* for(...) */
--- a/stage4/generate_c/generate_c_vardecl.cc Fri Dec 04 15:13:08 2009 +0100
+++ b/stage4/generate_c/generate_c_vardecl.cc Sat Dec 05 18:53:01 2009 +0100
@@ -588,9 +588,9 @@
for (i = 0; i < symbol->n; i++) {
s4o.print(s4o.indent_spaces);
- print_variable_prefix();
s4o.print(SET_VAR);
s4o.print("(");
+ print_variable_prefix();
symbol->elements[i]->accept(*this);
s4o.print(",temp);\n");
}
@@ -1506,7 +1506,13 @@
#endif
void *visit(array_initial_elements_list_c *symbol) {
- s4o.print(";// array initialisation");
+ if (wanted_varformat == localinit_vf) {
+ generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o);
+ array_initialization->init_array_dimensions(this->current_var_type_symbol);
+ array_initialization->current_mode = generate_c_array_initialization_c::initializationvalue_am;
+ array_initialization->init_array_values(this->current_var_init_symbol);
+ delete array_initialization;
+ }
return NULL;
}
@@ -1542,6 +1548,16 @@
return NULL;
}
+void *visit(structure_element_initialization_list_c *symbol) {
+ if (wanted_varformat == localinit_vf) {
+ generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o);
+ structure_initialization->init_structure_default(this->current_var_type_symbol);
+ structure_initialization->current_mode = generate_c_structure_initialization_c::initializationvalue_sm;
+ this->current_var_init_symbol->accept(*structure_initialization);
+ delete structure_initialization;
+ }
+ return NULL;
+}
/* VAR [CONSTANT] var_init_decl_list END_VAR */
/* option -> may be NULL ! */