lexer: Be consistent across 32/64 bit in lex_force_int_range().
[pspp] / src / language / lexer / lexer.c
index 2e6232afdc4ab6bee345ac0a2238e99d28ff6503..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);
@@ -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;