John Darrington <[EMAIL PROTECTED]> writes:

> I'm sure that sounds like a better idea.  Do these accessor functions
> exist, or are they yet to be written?

Here's a suggested patch for review.
? expr-accessor.patch
Index: src/language/expressions/parse.c
===================================================================
RCS file: /cvsroot/pspp/pspp/src/language/expressions/parse.c,v
retrieving revision 1.25
diff -u -p -r1.25 parse.c
--- src/language/expressions/parse.c	2 Apr 2007 08:55:52 -0000	1.25
+++ src/language/expressions/parse.c	16 Apr 2007 00:38:14 -0000
@@ -1507,3 +1507,42 @@ allocate_unary_variable (struct expressi
   return expr_allocate_unary (e, var_is_numeric (v) ? OP_NUM_VAR : OP_STR_VAR,
                               expr_allocate_variable (e, v));
 }
+
+/* Export function details to other modules. */
+
+/* Returns the operation structure for the function with the
+   given IDX. */
+const struct operation *
+expr_get_function (size_t idx)
+{
+  assert (idx < OP_function_cnt);
+  return &operations[OP_function_first + idx];
+}
+
+/* Returns the number of expression functions. */
+size_t
+expr_get_function_cnt (void) 
+{
+  return OP_function_cnt;
+}
+
+/* Returns the name of operation OP. */
+const char *
+expr_operation_get_name (const struct operation *op) 
+{
+  return op->name;
+}
+
+/* Returns the human-readable prototype for operation OP. */
+const char *
+expr_operation_get_prototype (const struct operation *op) 
+{
+  return op->prototype;
+}
+
+/* Returns the number of arguments for operation OP. */
+int
+expr_operation_get_arg_cnt (const struct operation *op) 
+{
+  return op->arg_cnt;
+}
Index: src/language/expressions/public.h
===================================================================
RCS file: /cvsroot/pspp/pspp/src/language/expressions/public.h,v
retrieving revision 1.4
diff -u -p -r1.4 public.h
--- src/language/expressions/public.h	15 Dec 2006 00:16:02 -0000	1.4
+++ src/language/expressions/public.h	16 Apr 2007 00:38:14 -0000
@@ -50,4 +50,10 @@ double expr_evaluate_num (struct express
 void expr_evaluate_str (struct expression *, const struct ccase *,
                         int case_idx, char *dst, size_t dst_size);
 
+const struct operation *expr_get_function (size_t idx);
+size_t expr_get_function_cnt (void);
+const char *expr_operation_get_name (const struct operation *);
+const char *expr_operation_get_prototype (const struct operation *);
+int expr_operation_get_arg_cnt (const struct operation *);
+
 #endif /* expr.h */
Index: src/ui/gui/compute-dialog.c
===================================================================
RCS file: /cvsroot/pspp/pspp/src/ui/gui/compute-dialog.c,v
retrieving revision 1.2
diff -u -p -r1.2 compute-dialog.c
--- src/ui/gui/compute-dialog.c	16 Apr 2007 00:19:41 -0000	1.2
+++ src/ui/gui/compute-dialog.c	16 Apr 2007 00:38:14 -0000
@@ -29,11 +29,11 @@
 #include "dialog-common.h"
 #include "dict-display.h"
 
+#include <language/expressions/public.h>
 #include <language/syntax-string-source.h>
 #include "syntax-editor.h"
 
 
-#include <language/expressions/private.h>
 #include "c-ctype.h"
 
 static void function_list_populate (GtkTreeView *tv);
@@ -291,12 +291,6 @@ enum {
 };
 
 
-static const struct operation fs[] =
-  {
-#include "parse.inc"
-  };
-
-
 static void
 function_list_populate (GtkTreeView *tv)
 {
@@ -304,25 +298,20 @@ function_list_populate (GtkTreeView *tv)
   GtkTreeIter iter;
   gint i;
 
-  const gint n_funcs = sizeof (fs) / sizeof fs[0] ;
+  const gint n_funcs = expr_get_function_cnt ();
 
   liststore = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT);
 
   for (i = 0 ; i < n_funcs ; ++i)
     {
-      if ( fs[i].prototype == NULL)
-	continue;
-
-      /* All the real ones seem to begin with an upper case letter */
-      if ( !c_isupper(*fs[i].prototype))
-	continue;
-
+      const struct operation *op = expr_get_function (i);
+      
       gtk_list_store_append (liststore, &iter);
 
       gtk_list_store_set (liststore, &iter,
-			  COL_NAME, fs[i].name,
-			  COL_USAGE,fs[i].prototype,
-			  COL_ARITY, fs[i].arg_cnt,
+			  COL_NAME, expr_operation_get_name (op),
+			  COL_USAGE, expr_operation_get_prototype (op),
+			  COL_ARITY, expr_operation_get_arg_cnt (op),
 			  -1);
     }
 
-- 
"But hey, the fact that I have better taste than anybody else in the
 universe is just something I have to live with. It's not easy being
 me."
--Linus Torvalds
_______________________________________________
pspp-dev mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/pspp-dev

Reply via email to