263 } |
263 } |
264 |
264 |
265 /* integer '(' [array_initial_element] ')' */ |
265 /* integer '(' [array_initial_element] ')' */ |
266 /* array_initial_element may be NULL ! */ |
266 /* array_initial_element may be NULL ! */ |
267 void *visit(array_initial_elements_c *symbol) { |
267 void *visit(array_initial_elements_c *symbol) { |
268 unsigned long long int initial_element_number; |
268 unsigned long long int initial_element_count; |
|
269 |
|
270 /* This code assumes that unsigned long long int is >= uint64_t */ |
|
271 if (std::numeric_limits< uint64_t >::max() > std::numeric_limits< unsigned long long int >::max()) |
|
272 ERROR_MSG("Assertion (sizeof(uint64_t) > sizeof(unsigned long long int)) failed! Compiler cannot execute correctly on the current platform!"); |
269 |
273 |
270 switch (current_mode) { |
274 switch (current_mode) { |
271 case initializationvalue_am: |
275 case initializationvalue_am: |
272 initial_element_number = extract_int64_value(symbol->integer); |
276 if (VALID_CVALUE( int64, symbol->integer) && (GET_CVALUE( int64, symbol->integer) >= 0)) |
|
277 initial_element_count = GET_CVALUE( int64, symbol->integer); |
|
278 else if (VALID_CVALUE(uint64, symbol->integer)) |
|
279 initial_element_count = GET_CVALUE(uint64, symbol->integer); |
|
280 else ERROR; |
|
281 |
273 if (current_initialization_count < defined_values_count) { |
282 if (current_initialization_count < defined_values_count) { |
274 unsigned long long int temp_element_number = 0; |
283 unsigned long long int temp_element_number = 0; |
275 unsigned long long int diff = defined_values_count - current_initialization_count; |
284 unsigned long long int diff = defined_values_count - current_initialization_count; |
276 if (diff <= initial_element_number) |
285 if (diff <= initial_element_count) |
277 temp_element_number = initial_element_number - diff; |
286 temp_element_number = initial_element_count - diff; |
278 current_initialization_count += initial_element_number - 1; |
287 current_initialization_count += initial_element_count - 1; |
279 initial_element_number = temp_element_number; |
288 initial_element_count = temp_element_number; |
280 if (initial_element_number > 0) { |
289 if (initial_element_count > 0) { |
281 defined_values_count++; |
290 defined_values_count++; |
282 s4o.print(","); |
291 s4o.print(","); |
283 } |
292 } |
284 } |
293 } |
285 else |
294 else |
286 current_initialization_count += initial_element_number - 1; |
295 current_initialization_count += initial_element_count - 1; |
287 if (defined_values_count + initial_element_number > array_size) |
296 if (defined_values_count + initial_element_count > array_size) |
288 ERROR; |
297 ERROR; |
289 for (unsigned long long int i = 0; i < initial_element_number; i++) { |
298 for (unsigned long long int i = 0; i < initial_element_count; i++) { |
290 if (i > 0) |
299 if (i > 0) |
291 s4o.print(","); |
300 s4o.print(","); |
292 if (symbol->array_initial_element != NULL) { |
301 if (symbol->array_initial_element != NULL) { |
293 symbol->array_initial_element->accept(*this); |
302 symbol->array_initial_element->accept(*this); |
294 } |
303 } |
295 else { |
304 else { |
296 array_default_value->accept(*this); |
305 array_default_value->accept(*this); |
297 } |
306 } |
298 } |
307 } |
299 if (initial_element_number > 1) |
308 if (initial_element_count > 1) |
300 defined_values_count += initial_element_number - 1; |
309 defined_values_count += initial_element_count - 1; |
301 break; |
310 break; |
302 default: |
311 default: |
303 break; |
312 break; |
304 } |
313 } |
305 return NULL; |
314 return NULL; |