stage4/generate_c/generate_c.cc
changeset 547 dab341e80664
parent 522 f9cff11ae622
child 548 7cc08964e0a7
--- a/stage4/generate_c/generate_c.cc	Wed May 09 22:59:10 2012 +0100
+++ b/stage4/generate_c/generate_c.cc	Wed May 09 23:00:10 2012 +0100
@@ -353,6 +353,10 @@
     
     unsigned long long get_time(void) {return time;};
 
+    /* NOTE: we should really remove this function, and replace it with  extract_integer_value() (in absyntax_utils.h)
+     *       but right now I don't want to spend time checking if this change will introduce some conversion bug
+     *       since it returns a long long, and not a float!
+     */
     void *get_integer_value(token_c *token) {
       std::string str = "";
       for (unsigned int i = 0; i < strlen(token->value); i++)
@@ -362,6 +366,10 @@
       return NULL;
     }
 
+    /* NOTE: this function is incomplete, as it should also be removing '_' inserted into the literal,
+     *       but we leave it for now.
+     *       In truth, we should really have an extract_real_value() in absyntax_util.h !!!
+     */
     void *get_float_value(token_c *token) {
       current_value = atof(token->value);
       return NULL;
@@ -388,48 +396,31 @@
     /* SYM_TOKEN(fixed_point_c) */
     void *visit(fixed_point_c *symbol) {return get_float_value(symbol);}
     
-    /* SYM_REF2(days_c, days, hours) */
-    void *visit(days_c *symbol) {
-      if (symbol->hours)
-        symbol->hours->accept(*this);
-      symbol->days->accept(*this);
-      time += (unsigned long long)(current_value * 24 * 3600 * SECOND);
-      return NULL;
-    }
-    
-    /* SYM_REF2(hours_c, hours, minutes) */
-    void *visit(hours_c *symbol) {
-      if (symbol->minutes)
-        symbol->minutes->accept(*this);
-      symbol->hours->accept(*this);
-      time += (unsigned long long)(current_value * 3600 * SECOND);
-      return NULL;
-    }
-    
-    /* SYM_REF2(minutes_c, minutes, seconds) */
-    void *visit(minutes_c *symbol) {
-      if (symbol->seconds)
-        symbol->seconds->accept(*this);
-      symbol->minutes->accept(*this);
+    
+    /* SYM_REF5(interval_c, days, hours, minutes, seconds, milliseconds) */
+    void *visit(interval_c *symbol) {
+      current_value = 0;
+      if (NULL != symbol->milliseconds) symbol->milliseconds->accept(*this);
+      time += (unsigned long long)(current_value * MILLISECOND);
+   
+      current_value = 0;
+      if (NULL != symbol->seconds)      symbol->seconds->accept(*this);
+      time += (unsigned long long)(current_value * SECOND);
+   
+      current_value = 0;
+      if (NULL != symbol->minutes)      symbol->minutes->accept(*this);
       time += (unsigned long long)(current_value * 60 * SECOND);
-      return NULL;
-    }
-    
-    /* SYM_REF2(seconds_c, seconds, milliseconds) */
-    void *visit(seconds_c *symbol) {
-      if (symbol->milliseconds)
-        symbol->milliseconds->accept(*this);
-      symbol->seconds->accept(*this);
-      time += (unsigned long long)(current_value * SECOND);
-      return NULL;
-    }
-    
-    /* SYM_REF2(milliseconds_c, milliseconds, unused) */
-    void *visit(milliseconds_c *symbol) {
-      symbol->milliseconds->accept(*this);
-      time += (unsigned long long)(current_value * MILLISECOND);
-      return NULL;
-    }
+   
+      current_value = 0;
+      if (NULL != symbol->hours)        symbol->hours->accept(*this);
+      time += (unsigned long long)(current_value * 60 * 60 * SECOND);
+   
+      current_value = 0;
+      if (NULL != symbol->days)         symbol->days->accept(*this);
+      time += (unsigned long long)(current_value * 60 * 60 * 24 * SECOND);
+   
+      return NULL;
+    }      
 };
 
 /***********************************************************************/
@@ -791,7 +782,7 @@
     /*  signed_integer DOTDOT signed_integer */
     //SYM_REF2(subrange_c, lower_limit, upper_limit)
     void *visit(subrange_c *symbol) {
-      int dimension = extract_integer(symbol->upper_limit) - extract_integer(symbol->lower_limit) + 1;
+      int dimension = extract_integer_value(symbol->upper_limit) - extract_integer_value(symbol->lower_limit) + 1;
       switch (current_mode) {
         case arrayname_im:
           current_array_name += "_";