stage4/generate_c/generate_c_typedecl.cc
changeset 123 a9b4af71cfa4
parent 121 9e8ce092e169
child 139 668a54686827
equal deleted inserted replaced
122:9e57c6d79398 123:a9b4af71cfa4
    81     typedefinition_t current_typedefinition;
    81     typedefinition_t current_typedefinition;
    82 
    82 
    83     typedef enum {
    83     typedef enum {
    84       none_bd,
    84       none_bd,
    85       subrangebasetype_bd,
    85       subrangebasetype_bd,
    86       subrangebasetypeexploration_bd,
       
    87       subrangetest_bd,
    86       subrangetest_bd,
    88       arraybasetype_bd,
    87       arraybasetype_bd,
    89       arraybasetypeincl_bd,
    88       arraybasetypeincl_bd,
    90       arraysubrange_bd,
    89       arraysubrange_bd,
    91       arraytranslateindex_bd
    90       arraytranslateindex_bd
   204   current_basetypedeclaration = none_bd;
   203   current_basetypedeclaration = none_bd;
   205   s4o_incl.print(" ");
   204   s4o_incl.print(" ");
   206   symbol->subrange_type_name->accept(*basedecl);
   205   symbol->subrange_type_name->accept(*basedecl);
   207   s4o_incl.print(";\n\n");
   206   s4o_incl.print(";\n\n");
   208   
   207   
   209   current_basetypedeclaration = subrangebasetypeexploration_bd;
       
   210   symbol->subrange_spec_init->accept(*this);
       
   211   current_basetypedeclaration = none_bd;
       
   212   
       
   213   current_type_name = symbol->subrange_type_name;
   208   current_type_name = symbol->subrange_type_name;
   214   
   209   
   215   current_basetypedeclaration = subrangetest_bd;
   210   current_basetypedeclaration = subrangetest_bd;
   216   symbol->subrange_spec_init->accept(*this);
   211   symbol->subrange_spec_init->accept(*this);
   217   current_basetypedeclaration = none_bd;
   212   current_basetypedeclaration = none_bd;
   231 /*  integer_type_name '(' subrange')' */
   226 /*  integer_type_name '(' subrange')' */
   232 void *visit(subrange_specification_c *symbol) {
   227 void *visit(subrange_specification_c *symbol) {
   233   switch (current_basetypedeclaration) {
   228   switch (current_basetypedeclaration) {
   234     case subrangebasetype_bd:
   229     case subrangebasetype_bd:
   235       symbol->integer_type_name->accept(*basedecl);
   230       symbol->integer_type_name->accept(*basedecl);
   236       break;
       
   237     case subrangebasetypeexploration_bd:
       
   238       search_base_type.explore_type(symbol->integer_type_name);
       
   239       break;
   231       break;
   240     case subrangetest_bd:
   232     case subrangetest_bd:
   241       if (symbol->subrange != NULL) {
   233       if (symbol->subrange != NULL) {
   242         current_type_name->accept(*this);
   234         current_type_name->accept(*this);
   243         s4o.print(" __CHECK_");
   235         s4o.print(" __CHECK_");
   245         s4o.print("(");
   237         s4o.print("(");
   246         current_type_name->accept(*this);
   238         current_type_name->accept(*this);
   247         s4o.print(" value) {\n");
   239         s4o.print(" value) {\n");
   248         s4o.indent_right();
   240         s4o.indent_right();
   249         
   241         
   250         if (search_base_type.base_is_subrange()) {
   242         if (search_base_type.type_is_subrange(symbol->integer_type_name)) {
   251           s4o.print(s4o.indent_spaces + "value = __CHECK_");
   243           s4o.print(s4o.indent_spaces + "value = __CHECK_");
   252           symbol->integer_type_name->accept(*this);
   244           symbol->integer_type_name->accept(*this);
   253           s4o.print("(value);\n");
   245           s4o.print("(value);\n");
   254         }
   246         }
   255         
   247         
   363   current_basetypedeclaration = arraysubrange_bd;
   355   current_basetypedeclaration = arraysubrange_bd;
   364   symbol->array_spec_init->accept(*this);
   356   symbol->array_spec_init->accept(*this);
   365   current_basetypedeclaration = none_bd;
   357   current_basetypedeclaration = none_bd;
   366   s4o_incl.print(";\n");
   358   s4o_incl.print(";\n");
   367   
   359   
   368   search_base_type.explore_type(symbol->array_spec_init);
   360   if (search_base_type.type_is_subrange(current_type_name)) {
   369   if (search_base_type.base_is_subrange()) {
       
   370     s4o.print("#define __CHECK_");
   361     s4o.print("#define __CHECK_");
   371     symbol->identifier->accept(*this);
   362     symbol->identifier->accept(*this);
   372     s4o.print(" __CHECK_");
   363     s4o.print(" __CHECK_");
   373     current_basetypedeclaration = arraybasetype_bd;
   364     current_basetypedeclaration = arraybasetype_bd;
   374     symbol->array_spec_init->accept(*this);
   365     symbol->array_spec_init->accept(*this);