344 current_basetypedeclaration = none_bd; |
344 current_basetypedeclaration = none_bd; |
345 |
345 |
346 if (array_is_derived) |
346 if (array_is_derived) |
347 s4o_incl.print("__DECLARE_DERIVED_TYPE("); |
347 s4o_incl.print("__DECLARE_DERIVED_TYPE("); |
348 else |
348 else |
349 s4o_incl.print("__DECLARE_ARRAY_TYPE("); |
349 s4o_incl.print("__DECLARE_ARRAY_TYPE("); |
350 current_basetypedeclaration = arraybasetypeincl_bd; |
350 current_basetypedeclaration = arraybasetypeincl_bd; |
351 symbol->array_spec_init->accept(*this); |
351 symbol->array_spec_init->accept(*this); |
352 current_basetypedeclaration = none_bd; |
352 current_basetypedeclaration = none_bd; |
353 s4o_incl.print(","); |
353 s4o_incl.print(","); |
354 symbol->identifier->accept(*basedecl); |
354 symbol->identifier->accept(*basedecl); |
355 if (!array_is_derived) { |
355 if (!array_is_derived) { |
356 s4o_incl.print(","); |
356 s4o_incl.print(","); |
357 current_basetypedeclaration = arraysubrange_bd; |
357 current_basetypedeclaration = arraysubrange_bd; |
358 symbol->array_spec_init->accept(*this); |
358 symbol->array_spec_init->accept(*this); |
359 current_basetypedeclaration = none_bd; |
359 current_basetypedeclaration = none_bd; |
360 } |
360 } |
361 s4o_incl.print(")\n"); |
361 s4o_incl.print(")\n"); |
362 |
362 |
363 if (search_base_type.type_is_subrange(symbol->identifier)) { |
363 if (search_base_type.type_is_subrange(symbol->identifier)) { |
364 s4o.print("#define __CHECK_"); |
364 s4o.print("#define __CHECK_"); |
365 symbol->identifier->accept(*this); |
365 symbol->identifier->accept(*this); |
366 s4o.print(" __CHECK_"); |
366 s4o.print(" __CHECK_"); |
367 current_basetypedeclaration = arraybasetype_bd; |
367 current_basetypedeclaration = arraybasetype_bd; |
368 symbol->array_spec_init->accept(*this); |
368 symbol->array_spec_init->accept(*this); |
369 current_basetypedeclaration = none_bd; |
369 current_basetypedeclaration = none_bd; |
370 s4o.print("\n"); |
370 s4o.print("\n"); |
371 } |
371 } |
372 |
372 |
373 current_type_name = symbol->identifier; |
373 current_type_name = symbol->identifier; |
374 current_basetypedeclaration = arraytranslateindex_bd; |
374 current_basetypedeclaration = arraytranslateindex_bd; |
375 symbol->array_spec_init->accept(*this); |
375 symbol->array_spec_init->accept(*this); |
376 current_basetypedeclaration = none_bd; |
376 current_basetypedeclaration = none_bd; |
377 s4o.print("\n"); |
377 s4o.print("\n"); |
378 |
378 |
379 current_typedefinition = none_td; |
379 current_typedefinition = none_td; |
380 |
380 |
381 return NULL; |
381 return NULL; |
382 } |
382 } |
383 |
383 |
384 /* array_specification [ASSIGN array_initialization] */ |
384 /* array_specification [ASSIGN array_initialization] */ |
385 /* array_initialization may be NULL ! */ |
385 /* array_initialization may be NULL ! */ |
386 void *visit(array_spec_init_c *symbol) { |
386 void *visit(array_spec_init_c *symbol) { |
387 TRACE("array_spec_init_c"); |
387 TRACE("array_spec_init_c"); |
388 |
388 |
389 identifier_c *array_type_name; |
389 if (current_typedefinition == array_td) { |
390 |
390 switch (current_basetypedeclaration) { |
391 switch (current_basetypedeclaration) { |
391 case arrayderiveddeclaration_bd: |
392 case arrayderiveddeclaration_bd: |
392 array_is_derived = dynamic_cast<identifier_c *>(symbol->array_specification) != NULL; |
393 array_type_name = dynamic_cast<identifier_c *>(symbol->array_specification); |
393 break; |
394 array_is_derived = array_type_name != NULL; |
394 case arraytranslateindex_bd: |
395 break; |
395 if (!array_is_derived) |
396 case arraytranslateindex_bd: |
396 symbol->array_specification->accept(*this); |
397 if (!array_is_derived) |
397 s4o.print("#define __"); |
398 symbol->array_specification->accept(*this); |
398 current_type_name->accept(*this); |
399 |
399 s4o.print("_TRANSIDX(row, index) __"); |
400 s4o.print("#define __"); |
400 if (array_is_derived) |
401 current_type_name->accept(*this); |
401 symbol->array_specification->accept(*this); |
402 s4o.print("_TRANSIDX(row, index) __"); |
402 else |
403 if (array_is_derived) |
403 current_type_name->accept(*this); |
404 symbol->array_specification->accept(*this); |
404 s4o.print("_TRANSIDX##row(index)"); |
405 else |
405 break; |
406 current_type_name->accept(*this); |
406 default: |
407 s4o.print("_TRANSIDX##row(index)"); |
407 if (array_is_derived) |
408 break; |
408 symbol->array_specification->accept(*basedecl); |
409 default: |
409 else |
410 if (array_is_derived) |
410 symbol->array_specification->accept(*this); |
411 symbol->array_specification->accept(*basedecl); |
411 break; |
412 else |
412 } |
413 symbol->array_specification->accept(*this); |
413 } |
414 break; |
414 else { |
|
415 symbol->array_specification->accept(*basedecl); |
415 } |
416 } |
416 return NULL; |
417 return NULL; |
417 } |
418 } |
418 |
419 |
419 /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */ |
420 /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */ |