Fixed a bug in frequencies.q which would crash on alpha values
[pspp-builds.git] / src / expr-prs.c
index d447afdf3bbb0190f58d1a4b76ddbe709ffe6986..046e360f1dfe610a6035a7b5e08ad31295f0affa 100644 (file)
    02111-1307, USA. */
 
 #include <config.h>
+#include "expr.h"
+#include "exprP.h"
 #include <assert.h>
 #include <ctype.h>
 #include <float.h>
 #include <stdlib.h>
+#include "algorithm.h"
 #include "alloc.h"
 #include "error.h"
-#include "expr.h"
-#include "exprP.h"
 #include "lexer.h"
 #include "misc.h"
 #include "str.h"
 #include "var.h"
-#include "vector.h"
 #include "vfm.h"
 \f
 /* Declarations. */
@@ -57,8 +57,8 @@ static union any_node *append_nonterminal_arg (union any_node *,
                                               union any_node *);
 static int type_check (union any_node **n, int type, int flags);
 
+static algo_compare_func compare_functions;
 static void init_func_tab (void);
-static int cmp_func (const void *a, const void *b);
 
 #if DEBUGGING
 static void debug_print_tree (union any_node *, int);
@@ -623,7 +623,7 @@ parse_primary (union any_node **n)
          }
 
        /* Otherwise, it must be a user variable. */
-       v = find_variable (tokid);
+       v = dict_lookup_var (default_dict, tokid);
        lex_get ();
        if (v == NULL)
          {
@@ -756,7 +756,9 @@ ternary_func (struct function * f, int x unused, union any_node ** n)
 static int
 MISSING_func (struct function * f, int x unused, union any_node ** n)
 {
-  if (token == T_ID && is_varname (tokid) && lex_look_ahead () == ')')
+  if (token == T_ID
+      && dict_lookup_var (default_dict, tokid) != NULL
+      && lex_look_ahead () == ')')
     {
       struct var_node *c = xmalloc (sizeof *c);
       c->v = parse_variable ();
@@ -774,7 +776,9 @@ SYSMIS_func (struct function * f unused, int x unused, union any_node ** n)
 {
   int t;
   
-  if (token == T_ID && is_varname (tokid) && lex_look_ahead () == ')')
+  if (token == T_ID
+      && dict_lookup_var (default_dict, tokid)
+      && lex_look_ahead () == ')')
     {
       struct variable *v;
       v = parse_variable ();
@@ -893,7 +897,7 @@ nary_num_func (struct function *f, int min_args, union any_node **n)
 
       /* FIXME: Is this condition failsafe?  Can we _ever_ have two
          juxtaposed identifiers otherwise?  */
-      if (token == T_ID && is_varname (tokid)
+      if (token == T_ID && dict_lookup_var (default_dict, tokid) != NULL
          && toupper (lex_look_ahead ()) == 'T')
        {
          struct variable **v;
@@ -905,7 +909,7 @@ nary_num_func (struct function *f, int min_args, union any_node **n)
            opts |= PV_NUMERIC;
          else if (type == ALPHA)
            opts |= PV_STRING;
-         if (!parse_variables (NULL, &v, &nv, opts))
+         if (!parse_variables (default_dict, &v, &nv, opts))
            goto fail;
          if (nv + (*n)->nonterm.n >= m)
            {
@@ -1220,10 +1224,10 @@ parse_function (union any_node ** n)
   char fname[32], *cp;
   int t;
   int min_args;
-  struct vector *v;
+  const struct vector *v;
 
   /* Check for a vector with this name. */
-  v = find_vector (tokid);
+  v = dict_lookup_vector (default_dict, tokid);
   if (v)
     {
       lex_get ();
@@ -1232,7 +1236,7 @@ parse_function (union any_node ** n)
 
       *n = xmalloc (sizeof (struct nonterm_node)
                    + sizeof (union any_node *[2]));
-      (*n)->nonterm.type = (v->v[0]->type == NUMERIC
+      (*n)->nonterm.type = (v->var[0]->type == NUMERIC
                        ? OP_VEC_ELEM_NUM : OP_VEC_ELEM_STR);
       (*n)->nonterm.n = 0;
 
@@ -1251,9 +1255,9 @@ parse_function (union any_node ** n)
          msg (SE, _("`)' expected after a vector index value."));
          goto fail;
        }
-      ((*n)->nonterm.arg[1]) = (union any_node *) v->index;
+      ((*n)->nonterm.arg[1]) = (union any_node *) v->idx;
 
-      return v->v[0]->type == NUMERIC ? EX_NUMERIC : EX_STRING;
+      return v->var[0]->type == NUMERIC ? EX_NUMERIC : EX_STRING;
     }
 
   ds_truncate (&tokstr, 31);
@@ -1275,7 +1279,8 @@ parse_function (union any_node ** n)
     struct function f;
     f.s = fname;
     
-    fp = bsearch (&f, func_tab, func_count, sizeof *func_tab, cmp_func);
+    fp = binary_search (func_tab, func_count, sizeof *func_tab, &f,
+                        compare_functions, NULL);
   }
   
   if (!fp)
@@ -1468,10 +1473,8 @@ expr_type_name (int type)
 
     default:
       assert (0);
+      return 0;
     }
-#if __GNUC__ || __BORLANDC__
-  return 0;
-#endif
 }
 
 static const char *
@@ -1485,10 +1488,8 @@ type_name (int type)
       return _("string");
     default:
       assert (0);
+      return 0;
     }
-#if __GNUC__ || __BORLANDC__
-  return 0;
-#endif
 }
 
 static void
@@ -1622,10 +1623,15 @@ static struct function func_tab[] =
   {"SUBSTR", OP_SUBSTR, generic_str_func, "ssn/n"},
 };
 
+/* An algo_compare_func that compares functions A and B based on
+   their names. */
 static int
-cmp_func (const void *a, const void *b)
+compare_functions (const void *a_, const void *b_, void *aux unused)
 {
-  return strcmp (*(char **) a, *(char **) b);
+  const struct function *a = a_;
+  const struct function *b = b_;
+
+  return strcmp (a->s, b->s);
 }
 
 static void
@@ -1640,7 +1646,7 @@ init_func_tab (void)
   }
 
   func_count = sizeof func_tab / sizeof *func_tab;
-  qsort (func_tab, func_count, sizeof *func_tab, cmp_func);
+  sort (func_tab, func_count, sizeof *func_tab, compare_functions, NULL);
 }
 \f
 /* Debug output. */