stage4/generate_c/generate_c_typedecl.cc
changeset 322 293967b9277d
parent 310 f111a6986c22
child 327 da78d0d93c75
equal deleted inserted replaced
321:a96399ab57c2 322:293967b9277d
   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 */