stage4/generate_c/generate_c_st.cc
changeset 221 c6aed7e5f070
parent 220 f332b62cd2c1
child 226 29f8ffc203c1
--- a/stage4/generate_c/generate_c_st.cc	Tue Dec 01 09:03:33 2009 +0100
+++ b/stage4/generate_c/generate_c_st.cc	Wed Dec 02 16:11:01 2009 +0100
@@ -119,22 +119,19 @@
   unsigned int vartype = search_varfb_instance_type->get_vartype(symbol);
   if (this->is_variable_prefix_null()) {
     if (wanted_variablegeneration == fparam_output_vg) {
-      if (vartype == search_var_instance_decl_c::external_vt) {
+      if (vartype == search_var_instance_decl_c::external_vt)
     	s4o.print(GET_EXTERNAL);
-    	s4o.print("(");
-    	symbol->var_name->accept(*this);
-      }
-      else {
-    	s4o.print("&(");
-        generate_c_base_c::visit(symbol);
-      }
+      else
+    	s4o.print("&");
+      s4o.print("(");
+      generate_c_base_c::visit(symbol);
       s4o.print(")");
     }
     else {
       if (vartype == search_var_instance_decl_c::external_vt) {
         s4o.print(GET_EXTERNAL);
         s4o.print("(");
-        symbol->var_name->accept(*this);
+        generate_c_base_c::visit(symbol);
         s4o.print(")");
       }
       else
@@ -144,42 +141,29 @@
   else {
     switch (wanted_variablegeneration) {
       case expression_vg:
-        if (vartype == search_var_instance_decl_c::external_vt) {
+        if (vartype == search_var_instance_decl_c::external_vt)
     	  s4o.print(GET_EXTERNAL);
-    	  s4o.print("(");
-          symbol->var_name->accept(*this);
-        }
-        else {
-          if (vartype == search_var_instance_decl_c::located_vt)
-            s4o.print(GET_LOCATED);
-          else
-            s4o.print(GET_VAR);
-          s4o.print("(");
-          generate_c_base_c::visit(symbol);
-        }
+    	else if (vartype == search_var_instance_decl_c::located_vt)
+		  s4o.print(GET_LOCATED);
+	    else
+		  s4o.print(GET_VAR);
+	    s4o.print("(");
+	    generate_c_base_c::visit(symbol);
         s4o.print(")");
 		break;
       case fparam_output_vg:
-        if (vartype == search_var_instance_decl_c::external_vt) {
+        if (vartype == search_var_instance_decl_c::external_vt)
           s4o.print(GET_EXTERNAL_BY_REF);
-          s4o.print("(");
-          symbol->var_name->accept(*this);
-        }
-        else {
-          if (vartype == search_var_instance_decl_c::located_vt)
-            s4o.print(GET_LOCATED_BY_REF);
-          else
-            s4o.print(GET_VAR_BY_REF);
-          s4o.print("(");
-          generate_c_base_c::visit(symbol);
-        }
+        else if (vartype == search_var_instance_decl_c::located_vt)
+          s4o.print(GET_LOCATED_BY_REF);
+        else
+          s4o.print(GET_VAR_BY_REF);
+        s4o.print("(");
+        generate_c_base_c::visit(symbol);
         s4o.print(")");
         break;
       default:
-        if (vartype == search_var_instance_decl_c::external_vt)
-          symbol->var_name->accept(*this);
-        else
-          generate_c_base_c::visit(symbol);
+        generate_c_base_c::visit(symbol);
         break;
 	}
   }
@@ -224,6 +208,67 @@
 /* B.1.4.2   Multi-element Variables */
 /*************************************/
 
+// 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:
+    	symbol->record_variable->accept(*this);
+    	s4o.print(".");
+    	symbol->field_selector->accept(*this);
+        break;
+	}
+  }
+  return NULL;
+}
+
 /*  subscripted_variable '[' subscript_list ']' */
 //SYM_REF2(array_variable_c, subscripted_variable, subscript_list)
 void *visit(array_variable_c *symbol) {