stage4/generate_c/generate_c_vardecl.cc
changeset 596 4efb11e44065
parent 594 c8092e909886
child 635 a20a70021d37
child 661 f537c3315f83
equal deleted inserted replaced
595:c41975a290ce 596:4efb11e44065
   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;