77 class generate_c_array_initialization_c: public generate_c_typedecl_c { |
77 class generate_c_array_initialization_c: public generate_c_typedecl_c { |
78 |
78 |
79 public: |
79 public: |
80 typedef enum { |
80 typedef enum { |
81 none_am, |
81 none_am, |
82 dimensioncount_am, |
82 arraysize_am, |
83 initializationvalue_am, |
83 typedecl_am, |
84 arrayassignment_am, |
84 initializationvalue_am |
85 varlistparse_am |
|
86 } arrayinitialization_mode_t; |
85 } arrayinitialization_mode_t; |
87 |
86 |
88 arrayinitialization_mode_t current_mode; |
87 arrayinitialization_mode_t current_mode; |
89 |
88 |
90 symbol_c* array_base_type; |
89 symbol_c* array_base_type; |
91 symbol_c* array_default_value; |
90 symbol_c* array_default_value; |
92 symbol_c* array_default_initialization; |
91 symbol_c* array_default_initialization; |
93 |
92 |
94 private: |
93 private: |
95 int dimension_number; |
|
96 int current_dimension; |
94 int current_dimension; |
97 int array_size; |
95 int array_size; |
98 int defined_values_count; |
96 int defined_values_count; |
99 int current_initialization_count; |
97 int current_initialization_count; |
100 |
98 |
101 public: |
99 public: |
102 generate_c_array_initialization_c(stage4out_c *s4o_ptr): generate_c_typedecl_c(s4o_ptr) {} |
100 generate_c_array_initialization_c(stage4out_c *s4o_ptr): generate_c_typedecl_c(s4o_ptr) {} |
103 ~generate_c_array_initialization_c(void) {} |
101 ~generate_c_array_initialization_c(void) {} |
104 |
102 |
105 void init_array_dimensions(symbol_c *array_specification) { |
103 void init_array_size(symbol_c *array_specification) { |
106 dimension_number = 0; |
|
107 current_dimension = 0; |
|
108 array_size = 1; |
104 array_size = 1; |
109 defined_values_count = 0; |
105 defined_values_count = 0; |
110 current_initialization_count = 0; |
106 current_initialization_count = 0; |
111 array_base_type = array_default_value = array_default_initialization = NULL; |
107 array_base_type = array_default_value = array_default_initialization = NULL; |
112 |
108 |
113 current_mode = dimensioncount_am; |
109 current_mode = arraysize_am; |
114 array_specification->accept(*this); |
110 array_specification->accept(*this); |
115 } |
111 } |
116 |
112 |
117 void init_array(symbol_c *var1_list, symbol_c *array_specification, symbol_c *array_initialization) { |
113 void init_array(symbol_c *var1_list, symbol_c *array_specification, symbol_c *array_initialization) { |
118 int i; |
114 int i; |
119 |
115 |
120 init_array_dimensions(array_specification); |
116 init_array_size(array_specification); |
121 |
117 |
122 current_mode = initializationvalue_am; |
|
123 s4o.print("\n"); |
118 s4o.print("\n"); |
124 s4o.print(s4o.indent_spaces + "{\n"); |
119 s4o.print(s4o.indent_spaces + "{\n"); |
125 s4o.indent_right(); |
120 s4o.indent_right(); |
126 s4o.print(s4o.indent_spaces + "int index["); |
|
127 print_integer(dimension_number); |
|
128 s4o.print("];\n"); |
|
129 s4o.print(s4o.indent_spaces); |
121 s4o.print(s4o.indent_spaces); |
130 s4o.print("static const "); |
122 s4o.print("static const "); |
|
123 |
|
124 current_mode = typedecl_am; |
131 array_specification->accept(*this); |
125 array_specification->accept(*this); |
|
126 |
132 s4o.print(" temp = "); |
127 s4o.print(" temp = "); |
|
128 |
133 init_array_values(array_initialization); |
129 init_array_values(array_initialization); |
|
130 |
134 s4o.print(";\n"); |
131 s4o.print(";\n"); |
135 |
|
136 current_mode = arrayassignment_am; |
|
137 array_specification->accept(*this); |
|
138 |
|
139 current_mode = varlistparse_am; |
|
140 var1_list->accept(*this); |
132 var1_list->accept(*this); |
141 |
|
142 current_mode = arrayassignment_am; |
|
143 for (i = 0; i < dimension_number; i++) { |
|
144 s4o.indent_left(); |
|
145 s4o.print(s4o.indent_spaces + "}\n"); |
|
146 } |
|
147 s4o.indent_left(); |
133 s4o.indent_left(); |
148 s4o.print(s4o.indent_spaces + "}"); |
134 s4o.print(s4o.indent_spaces + "}"); |
149 } |
135 } |
150 |
136 |
151 void init_array_values(symbol_c *array_initialization) { |
137 void init_array_values(symbol_c *array_initialization) { |
152 s4o.print("{"); |
138 s4o.print("{{"); |
|
139 |
|
140 current_mode = initializationvalue_am; |
153 array_initialization->accept(*this); |
141 array_initialization->accept(*this); |
|
142 |
154 if (array_default_initialization != NULL && defined_values_count < array_size) |
143 if (array_default_initialization != NULL && defined_values_count < array_size) |
155 array_default_initialization->accept(*this); |
144 array_default_initialization->accept(*this); |
156 if (defined_values_count < array_size) { |
145 if (defined_values_count < array_size) { |
157 for (int i = defined_values_count; i < array_size; i++) { |
146 for (int i = defined_values_count; i < array_size; i++) { |
158 if (defined_values_count > 0) |
147 if (defined_values_count > 0) |
159 s4o.print(","); |
148 s4o.print(","); |
160 array_default_value->accept(*this); |
149 array_default_value->accept(*this); |
161 defined_values_count++; |
150 defined_values_count++; |
162 } |
151 } |
163 } |
152 } |
164 s4o.print("}"); |
153 |
|
154 s4o.print("}}"); |
165 } |
155 } |
166 |
156 |
167 void *visit(identifier_c *type_name) { |
157 void *visit(identifier_c *type_name) { |
168 symbol_c *type_decl; |
158 symbol_c *type_decl; |
169 switch (current_mode) { |
159 switch (current_mode) { |
170 case dimensioncount_am: |
160 case arraysize_am: |
171 case arrayassignment_am: |
|
172 /* look up the type declaration... */ |
161 /* look up the type declaration... */ |
173 type_decl = type_symtable.find_value(type_name); |
162 type_decl = type_symtable.find_value(type_name); |
174 if (type_decl == type_symtable.end_value()) |
163 if (type_decl == type_symtable.end_value()) |
175 /* Type declaration not found!! */ |
164 /* Type declaration not found!! */ |
176 ERROR; |
165 ERROR; |
244 |
221 |
245 /* signed_integer DOTDOT signed_integer */ |
222 /* signed_integer DOTDOT signed_integer */ |
246 //SYM_REF2(subrange_c, lower_limit, upper_limit) |
223 //SYM_REF2(subrange_c, lower_limit, upper_limit) |
247 void *visit(subrange_c *symbol) { |
224 void *visit(subrange_c *symbol) { |
248 switch (current_mode) { |
225 switch (current_mode) { |
249 case dimensioncount_am: |
226 case arraysize_am: |
250 dimension_number++; |
|
251 array_size *= extract_integer(symbol->upper_limit) - extract_integer(symbol->lower_limit) + 1; |
227 array_size *= extract_integer(symbol->upper_limit) - extract_integer(symbol->lower_limit) + 1; |
252 break; |
|
253 case arrayassignment_am: |
|
254 s4o.print(s4o.indent_spaces + "for (index["); |
|
255 print_integer(current_dimension); |
|
256 s4o.print("] = 0; index["); |
|
257 print_integer(current_dimension); |
|
258 s4o.print("] <= "); |
|
259 print_integer(extract_integer(symbol->upper_limit) - extract_integer(symbol->lower_limit)); |
|
260 s4o.print("; index["); |
|
261 print_integer(current_dimension); |
|
262 s4o.print("]++) {\n"); |
|
263 s4o.indent_right(); |
|
264 current_dimension++; |
|
265 break; |
228 break; |
266 default: |
229 default: |
267 break; |
230 break; |
268 } |
231 } |
269 return NULL; |
232 return NULL; |
536 |
499 |
537 void init_structure_default(symbol_c *structure_type_name) { |
500 void init_structure_default(symbol_c *structure_type_name) { |
538 structure_type_decl = NULL; |
501 structure_type_decl = NULL; |
539 current_element_type = NULL; |
502 current_element_type = NULL; |
540 |
503 |
541 current_mode = typedecl_sm; |
504 current_mode = initdefault_sm; |
542 structure_type_name->accept(*this); |
505 structure_type_name->accept(*this); |
543 } |
506 } |
544 |
507 |
545 void init_structure(symbol_c *var1_list, symbol_c *structure_type_name, symbol_c *structure_initialization) { |
508 void init_structure(symbol_c *var1_list, symbol_c *structure_type_name, symbol_c *structure_initialization) { |
546 int i; |
509 int i; |
547 |
510 |
548 init_structure_default(structure_type_name); |
511 init_structure_default(structure_type_name); |
549 |
512 |
550 current_mode = initializationvalue_sm; |
|
551 s4o.print("\n"); |
513 s4o.print("\n"); |
552 s4o.print(s4o.indent_spaces + "{\n"); |
514 s4o.print(s4o.indent_spaces + "{\n"); |
553 s4o.indent_right(); |
515 s4o.indent_right(); |
554 s4o.print(s4o.indent_spaces); |
516 s4o.print(s4o.indent_spaces); |
555 s4o.print("static const "); |
517 s4o.print("static const "); |
|
518 |
|
519 current_mode = typedecl_sm; |
556 structure_type_name->accept(*this); |
520 structure_type_name->accept(*this); |
|
521 |
557 s4o.print(" temp = "); |
522 s4o.print(" temp = "); |
558 structure_initialization->accept(*this); |
523 |
|
524 init_structure_values(structure_initialization); |
|
525 |
559 s4o.print(";\n"); |
526 s4o.print(";\n"); |
560 |
|
561 current_mode = varlistparse_sm; |
|
562 var1_list->accept(*this); |
527 var1_list->accept(*this); |
563 |
|
564 s4o.indent_left(); |
528 s4o.indent_left(); |
565 s4o.print(s4o.indent_spaces + "}"); |
529 s4o.print(s4o.indent_spaces + "}"); |
|
530 } |
|
531 |
|
532 void init_structure_values(symbol_c *structure_initialization) { |
|
533 current_mode = initializationvalue_sm; |
|
534 structure_initialization->accept(*this); |
566 } |
535 } |
567 |
536 |
568 void *visit(identifier_c *type_name) { |
537 void *visit(identifier_c *type_name) { |
569 symbol_c *type_decl; |
538 symbol_c *type_decl; |
570 switch (current_mode) { |
539 switch (current_mode) { |
571 case typedecl_sm: |
540 case initdefault_sm: |
572 /* look up the type declaration... */ |
541 /* look up the type declaration... */ |
573 type_decl = type_symtable.find_value(type_name); |
542 type_decl = type_symtable.find_value(type_name); |
574 if (type_decl == type_symtable.end_value()) |
543 if (type_decl == type_symtable.end_value()) |
575 /* Type declaration not found!! */ |
544 /* Type declaration not found!! */ |
576 ERROR; |
545 ERROR; |
680 |
645 |
681 /* helper symbol for array_initialization */ |
646 /* helper symbol for array_initialization */ |
682 /* structure_element_initialization_list ',' structure_element_initialization */ |
647 /* structure_element_initialization_list ',' structure_element_initialization */ |
683 void *generate_c_array_initialization_c::visit(structure_element_initialization_list_c *symbol) { |
648 void *generate_c_array_initialization_c::visit(structure_element_initialization_list_c *symbol) { |
684 generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o); |
649 generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o); |
685 structure_initialization->set_variable_prefix(get_variable_prefix()); |
|
686 structure_initialization->init_structure_default(array_base_type); |
650 structure_initialization->init_structure_default(array_base_type); |
687 structure_initialization->current_mode = generate_c_structure_initialization_c::initializationvalue_sm; |
651 structure_initialization->init_structure_values(symbol); |
688 symbol->accept(*structure_initialization); |
|
689 delete structure_initialization; |
652 delete structure_initialization; |
690 return NULL; |
653 return NULL; |
691 } |
654 } |
692 |
655 |
693 /***********************************************************************/ |
656 /***********************************************************************/ |
1532 TRACE("var_declaration_list_c"); |
1495 TRACE("var_declaration_list_c"); |
1533 print_list(symbol); |
1496 print_list(symbol); |
1534 return NULL; |
1497 return NULL; |
1535 } |
1498 } |
1536 |
1499 |
1537 #if 0 |
|
1538 /* var1_list ':' array_specification */ |
1500 /* var1_list ':' array_specification */ |
1539 SYM_REF2(array_var_declaration_c, var1_list, array_specification) |
1501 //SYM_REF2(array_var_declaration_c, var1_list, array_specification) |
1540 #endif |
1502 void *visit(array_var_declaration_c *symbol) { |
|
1503 TRACE("array_var_declaration_c"); |
|
1504 /* Please read the comments inside the var1_init_decl_c |
|
1505 * visitor, as they apply here too. |
|
1506 */ |
|
1507 |
|
1508 /* Start off by setting the current_var_type_symbol and |
|
1509 * current_var_init_symbol private variables... |
|
1510 */ |
|
1511 update_type_init(symbol->array_specification); |
|
1512 |
|
1513 /* now to produce the c equivalent... */ |
|
1514 if (wanted_varformat == constructorinit_vf) { |
|
1515 generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o); |
|
1516 array_initialization->set_variable_prefix(get_variable_prefix()); |
|
1517 array_initialization->init_array(symbol->var1_list, this->current_var_type_symbol, this->current_var_init_symbol); |
|
1518 delete array_initialization; |
|
1519 } |
|
1520 else |
|
1521 symbol->var1_list->accept(*this); |
|
1522 |
|
1523 /* Values no longer in scope, and therefore no longer used. |
|
1524 * Make an effort to keep them set to NULL when not in use |
|
1525 * in order to catch bugs as soon as possible... |
|
1526 */ |
|
1527 void_type_init(); |
|
1528 |
|
1529 return NULL; |
|
1530 } |
1541 |
1531 |
1542 void *visit(array_initial_elements_list_c *symbol) { |
1532 void *visit(array_initial_elements_list_c *symbol) { |
1543 if (wanted_varformat == localinit_vf) { |
1533 if (wanted_varformat == localinit_vf) { |
1544 generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o); |
1534 generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o); |
1545 array_initialization->init_array_dimensions(this->current_var_type_symbol); |
1535 array_initialization->init_array_size(this->current_var_type_symbol); |
1546 array_initialization->current_mode = generate_c_array_initialization_c::initializationvalue_am; |
|
1547 array_initialization->init_array_values(this->current_var_init_symbol); |
1536 array_initialization->init_array_values(this->current_var_init_symbol); |
1548 delete array_initialization; |
1537 delete array_initialization; |
1549 } |
1538 } |
1550 return NULL; |
1539 return NULL; |
1551 } |
1540 } |