stage4/generate_c/generate_c_vardecl.cc
changeset 377 60b012b7793f
parent 334 63b52a8a12f3
child 392 9b88b8b6bccd
equal deleted inserted replaced
376:7dcbd8418771 377:60b012b7793f
   103       s4o.print(s4o.indent_spaces);
   103       s4o.print(s4o.indent_spaces);
   104       s4o.print("static const ");
   104       s4o.print("static const ");
   105 
   105 
   106       current_mode = typedecl_am;
   106       current_mode = typedecl_am;
   107       array_specification->accept(*this);
   107       array_specification->accept(*this);
   108 
       
   109       s4o.print(" temp = ");
   108       s4o.print(" temp = ");
   110 
   109 
   111       init_array_values(array_initialization);
   110       init_array_values(array_initialization);
   112 
   111 
   113       s4o.print(";\n");
   112       s4o.print(";\n");
   186       return NULL;
   185       return NULL;
   187     }
   186     }
   188     
   187     
   189     /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
   188     /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
   190     void *visit(array_specification_c *symbol) {
   189     void *visit(array_specification_c *symbol) {
   191       symbol->array_subrange_list->accept(*this);
   190       identifier_c* type_name;
   192       switch (current_mode) {
   191       switch (current_mode) {
   193         case arraysize_am:
   192         case arraysize_am:
       
   193           symbol->array_subrange_list->accept(*this);
   194           array_base_type = symbol->non_generic_type_name;
   194           array_base_type = symbol->non_generic_type_name;
   195           array_default_value = (symbol_c *)symbol->non_generic_type_name->accept(*type_initial_value_c::instance());;
   195           array_default_value = (symbol_c *)symbol->non_generic_type_name->accept(*type_initial_value_c::instance());;
   196           if (array_default_value == NULL) ERROR;
   196           if (array_default_value == NULL) ERROR;
   197           break;
   197           break;
       
   198         case typedecl_am:
       
   199           s4o.print("__");
       
   200           symbol->non_generic_type_name->accept(*this);
       
   201           symbol->array_subrange_list->accept(*this);
       
   202           break;
   198         default:
   203         default:
       
   204           symbol->array_subrange_list->accept(*this);
   199           break;
   205           break;
   200       } 
   206       } 
   201       return NULL;
   207       return NULL;
   202     }
   208     }
   203     
   209     
   204     /*  signed_integer DOTDOT signed_integer */
   210     /*  signed_integer DOTDOT signed_integer */
   205     //SYM_REF2(subrange_c, lower_limit, upper_limit)
   211     //SYM_REF2(subrange_c, lower_limit, upper_limit)
   206     void *visit(subrange_c *symbol) {
   212     void *visit(subrange_c *symbol) {
       
   213       int dimension = extract_integer(symbol->upper_limit) - extract_integer(symbol->lower_limit) + 1;
   207       switch (current_mode) {
   214       switch (current_mode) {
   208         case arraysize_am:
   215         case arraysize_am:
   209           array_size *= extract_integer(symbol->upper_limit) - extract_integer(symbol->lower_limit) + 1;
   216           array_size *= dimension;
       
   217           break;
       
   218         case typedecl_am:
       
   219           s4o.print("_");
       
   220           s4o.print_integer(dimension);
   210           break;
   221           break;
   211         default:
   222         default:
   212           break;
   223           break;
   213       }
   224       }
   214       return NULL;
   225       return NULL;
  1377   void_type_init();
  1388   void_type_init();
  1378 
  1389 
  1379   return NULL;
  1390   return NULL;
  1380 }
  1391 }
  1381 
  1392 
       
  1393 /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
       
  1394 void *visit(array_specification_c *symbol) {
       
  1395   s4o.print("__");
       
  1396   symbol->non_generic_type_name->accept(*this);
       
  1397   symbol->array_subrange_list->accept(*this);
       
  1398   return NULL;
       
  1399 }
       
  1400 
       
  1401 /*  signed_integer DOTDOT signed_integer */
       
  1402 //SYM_REF2(subrange_c, lower_limit, upper_limit)
       
  1403 void *visit(subrange_c *symbol) {
       
  1404   int dimension = extract_integer(symbol->upper_limit) - extract_integer(symbol->lower_limit) + 1;
       
  1405   s4o.print("_");
       
  1406   print_integer(dimension);
       
  1407   return NULL;
       
  1408 }
       
  1409 
  1382 /*  var1_list ':' initialized_structure */
  1410 /*  var1_list ':' initialized_structure */
  1383 // SYM_REF2(structured_var_init_decl_c, var1_list, initialized_structure)
  1411 // SYM_REF2(structured_var_init_decl_c, var1_list, initialized_structure)
  1384 void *visit(structured_var_init_decl_c *symbol) {
  1412 void *visit(structured_var_init_decl_c *symbol) {
  1385   TRACE("structured_var_init_decl_c");
  1413   TRACE("structured_var_init_decl_c");
  1386   /* Please read the comments inside the var1_init_decl_c
  1414   /* Please read the comments inside the var1_init_decl_c
  1519 
  1547 
  1520   return NULL;
  1548   return NULL;
  1521 }
  1549 }
  1522 
  1550 
  1523 void *visit(array_initial_elements_list_c *symbol) {
  1551 void *visit(array_initial_elements_list_c *symbol) {
  1524   if (wanted_varformat == localinit_vf) {
  1552   if (wanted_varformat == localinit_vf || wanted_varformat == constructorinit_vf) {
  1525 	generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o);
  1553 	generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o);
  1526 	array_initialization->init_array_size(this->current_var_type_symbol);
  1554 	array_initialization->init_array_size(this->current_var_type_symbol);
  1527 	array_initialization->init_array_values(this->current_var_init_symbol);
  1555 	array_initialization->init_array_values(this->current_var_init_symbol);
  1528 	delete array_initialization;
  1556 	delete array_initialization;
  1529   }
  1557   }
  1950       }
  1978       }
  1951       if (this->current_var_init_symbol != NULL) {
  1979       if (this->current_var_init_symbol != NULL) {
  1952 	    s4o.print(nv->get());
  1980 	    s4o.print(nv->get());
  1953 	    s4o.print(INIT_GLOBAL);
  1981 	    s4o.print(INIT_GLOBAL);
  1954 	    s4o.print("(");
  1982 	    s4o.print("(");
       
  1983 	    this->current_var_type_symbol->accept(*this);
       
  1984 	    s4o.print(",");
  1955 	    if (symbol->global_var_name != NULL)
  1985 	    if (symbol->global_var_name != NULL)
  1956 		  symbol->global_var_name->accept(*this);
  1986 		  symbol->global_var_name->accept(*this);
  1957 	    else
  1987 	    else
  1958 		  symbol->location->accept(*this);
  1988 		  symbol->location->accept(*this);
  1959 	    s4o.print(",");
  1989 	    s4o.print(",__INITIAL_VALUE(");
  1960 	    this->current_var_init_symbol->accept(*this);
  1990 	    this->current_var_init_symbol->accept(*this);
       
  1991 	    s4o.print(")");
  1961 	    print_retain();
  1992 	    print_retain();
  1962 	    s4o.print(")");
  1993 	    s4o.print(")");
  1963       }
  1994       }
  1964       break;
  1995       break;
  1965 
  1996 
  2011         for(int i = 0; i < list->n; i++) {
  2042         for(int i = 0; i < list->n; i++) {
  2012           s4o.print(nv->get());
  2043           s4o.print(nv->get());
  2013 
  2044 
  2014           s4o.print(INIT_GLOBAL);
  2045           s4o.print(INIT_GLOBAL);
  2015           s4o.print("(");
  2046           s4o.print("(");
       
  2047           this->current_var_type_symbol->accept(*this);
       
  2048           s4o.print(",");
  2016           list->elements[i]->accept(*this);
  2049           list->elements[i]->accept(*this);
  2017           s4o.print(",");
  2050           s4o.print(",__INITIAL_VALUE(");
  2018           this->current_var_init_symbol->accept(*this);
  2051           this->current_var_init_symbol->accept(*this);
       
  2052           s4o.print(")");
  2019           print_retain();
  2053           print_retain();
  2020           s4o.print(")");
  2054           s4o.print(")");
  2021 #if 0
  2055 #if 0
  2022  	  /* The following code would be for globalinit_vf !!
  2056  	  /* The following code would be for globalinit_vf !!
  2023 	   * But it is not currently required...
  2057 	   * But it is not currently required...