lexer: Be consistent across 32/64 bit in lex_force_int_range().
[pspp] / src / language / lexer / lexer.c
index 6d9aec843ab80e94c197a8a7ee825b0e180bf2c1..d94ae9df7ca05671214f9314dabc2bf99b93f2d1 100644 (file)
@@ -821,9 +821,14 @@ lex_force_int (struct lexer *lexer)
 bool
 lex_force_int_range (struct lexer *lexer, const char *name, long min, long max)
 {
+  bool is_number = lex_is_number (lexer);
   bool is_integer = lex_is_integer (lexer);
-  bool too_small = is_integer && lex_integer (lexer) < min;
-  bool too_big = is_integer && lex_integer (lexer) > max;
+  bool too_small = (is_integer ? lex_integer (lexer) < min
+                    : is_number ? lex_number (lexer) < min
+                    : false);
+  bool too_big = (is_integer ? lex_integer (lexer) > max
+                  : is_number ? lex_number (lexer) > max
+                  : false);
   if (is_integer && !too_small && !too_big)
     return true;
 
@@ -1899,27 +1904,32 @@ lex_source_try_get_merge (const struct lex_source *src_)
                                           _("Macro Expansion")));
 
   /* Append the macro expansion tokens to the lookahead. */
-  char *macro_rep = ds_steal_cstr (&s);
-  size_t *ref_cnt = xmalloc (sizeof *ref_cnt);
-  *ref_cnt = expansion.n;
-  for (size_t i = 0; i < expansion.n; i++)
+  if (expansion.n > 0)
     {
-      struct lex_token *token = xmalloc (sizeof *token);
-      *token = (struct lex_token) {
-        .token = expansion.mts[i].token,
-        .token_pos = c0->token_pos,
-        .token_len = (c1->token_pos + c1->token_len) - c0->token_pos,
-        .line_pos = c0->line_pos,
-        .first_line = c0->first_line,
-        .macro_rep = macro_rep,
-        .ofs = ofs[i],
-        .len = len[i],
-        .ref_cnt = ref_cnt,
-      };
-      lex_stage_push_last (&src->merge, token);
+      char *macro_rep = ds_steal_cstr (&s);
+      size_t *ref_cnt = xmalloc (sizeof *ref_cnt);
+      *ref_cnt = expansion.n;
+      for (size_t i = 0; i < expansion.n; i++)
+        {
+          struct lex_token *token = xmalloc (sizeof *token);
+          *token = (struct lex_token) {
+            .token = expansion.mts[i].token,
+            .token_pos = c0->token_pos,
+            .token_len = (c1->token_pos + c1->token_len) - c0->token_pos,
+            .line_pos = c0->line_pos,
+            .first_line = c0->first_line,
+            .macro_rep = macro_rep,
+            .ofs = ofs[i],
+            .len = len[i],
+            .ref_cnt = ref_cnt,
+          };
+          lex_stage_push_last (&src->merge, token);
 
-      ss_dealloc (&expansion.mts[i].syntax);
+          ss_dealloc (&expansion.mts[i].syntax);
+        }
     }
+  else
+    ds_destroy (&s);
   free (expansion.mts);
   free (ofs);
   free (len);
@@ -1952,6 +1962,7 @@ static bool
 lex_source_get_lookahead (struct lex_source *src)
 {
   struct merger m = MERGER_INIT;
+  struct token out;
   for (size_t i = 0; ; i++)
     {
       while (lex_stage_count (&src->merge) <= i && !lex_source_get_merge (src))
@@ -1963,7 +1974,6 @@ lex_source_get_lookahead (struct lex_source *src)
           return false;
         }
 
-      struct token out;
       int retval = merger_add (&m, &lex_stage_nth (&src->merge, i)->token,
                                &out);
       if (!retval)
@@ -1992,7 +2002,7 @@ lex_source_get_lookahead (struct lex_source *src)
             .macro_rep = macro ? first->macro_rep : NULL,
             .ofs = macro ? first->ofs : 0,
             .len = macro ? (last->ofs - first->ofs) + last->len : 0,
-            .ref_cnt = first->ref_cnt,
+            .ref_cnt = macro ? first->ref_cnt : NULL,
           };
           if (t->ref_cnt)
             ++*t->ref_cnt;