I'm proposing this patch to aggregate.c

My motivation for it is to make the implementation of a dialog box easier,
but it also improves the comprehension of the code IMO.

J'

-- 
PGP Public key ID: 1024D/2DE827B3 
fingerprint = 8797 A26D 0854 2EAB 0285  A290 8A67 719C 2DE8 27B3
See http://pgp.mit.edu or any PGP keyserver for public key.


diff --git a/src/language/stats/aggregate.c b/src/language/stats/aggregate.c
index 0d918fb..7430b81 100644
--- a/src/language/stats/aggregate.c
+++ b/src/language/stats/aggregate.c
@@ -46,11 +46,14 @@
 #include <math/statistic.h>
 #include <math/percentiles.h>
 
+#include "aggregate.h"
+
 #include "minmax.h"
 #include "xalloc.h"
 
 #include "gettext.h"
 #define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
 
 /* Argument for AGGREGATE function. */
 union agr_argument
@@ -87,49 +90,38 @@ struct agr_var
 /* Aggregation functions. */
 enum
   {
-    NONE, SUM, MEAN, MEDIAN, SD, MAX, MIN, PGT, PLT, PIN, POUT, FGT, FLT, FIN,
+    SUM, MEAN, MEDIAN, SD, MAX, MIN, PGT, PLT, PIN, POUT, FGT, FLT, FIN,
     FOUT, N, NU, NMISS, NUMISS, FIRST, LAST,
-    N_AGR_FUNCS, N_NO_VARS, NU_NO_VARS,
+
     FUNC = 0x1f, /* Function mask. */
     FSTRING = 1<<5, /* String function bit. */
   };
 
-/* Attributes of an aggregation function. */
-struct agr_func
-  {
-    const char *name;		/* Aggregation function name. */
-    size_t n_args;              /* Number of arguments. */
-    enum val_type alpha_type;   /* When given ALPHA arguments, output type. */
-    struct fmt_spec format;	/* Format spec if alpha_type != ALPHA. */
-  };
 
 /* Attributes of aggregation functions. */
-static const struct agr_func agr_func_tab[] =
+const struct agr_func agr_func_tab[] =
   {
-    {"<NONE>",  0, -1,          {0, 0, 0}},
-    {"SUM",     0, -1,          {FMT_F, 8, 2}},
-    {"MEAN",	0, -1,          {FMT_F, 8, 2}},
-    {"MEDIAN",	0, -1,          {FMT_F, 8, 2}},
-    {"SD",      0, -1,          {FMT_F, 8, 2}},
-    {"MAX",     0, VAL_STRING,  {-1, -1, -1}},
-    {"MIN",     0, VAL_STRING,  {-1, -1, -1}},
-    {"PGT",     1, VAL_NUMERIC, {FMT_F, 5, 1}},
-    {"PLT",     1, VAL_NUMERIC, {FMT_F, 5, 1}},
-    {"PIN",     2, VAL_NUMERIC, {FMT_F, 5, 1}},
-    {"POUT",    2, VAL_NUMERIC, {FMT_F, 5, 1}},
-    {"FGT",     1, VAL_NUMERIC, {FMT_F, 5, 3}},
-    {"FLT",     1, VAL_NUMERIC, {FMT_F, 5, 3}},
-    {"FIN",     2, VAL_NUMERIC, {FMT_F, 5, 3}},
-    {"FOUT",    2, VAL_NUMERIC, {FMT_F, 5, 3}},
-    {"N",       0, VAL_NUMERIC, {FMT_F, 7, 0}},
-    {"NU",      0, VAL_NUMERIC, {FMT_F, 7, 0}},
-    {"NMISS",   0, VAL_NUMERIC, {FMT_F, 7, 0}},
-    {"NUMISS",  0, VAL_NUMERIC, {FMT_F, 7, 0}},
-    {"FIRST",   0, VAL_STRING,  {-1, -1, -1}},
-    {"LAST",    0, VAL_STRING,  {-1, -1, -1}},
-    {NULL,      0, -1,          {-1, -1, -1}},
-    {"N",       0, VAL_NUMERIC, {FMT_F, 7, 0}},
-    {"NU",      0, VAL_NUMERIC, {FMT_F, 7, 0}},
+    {"SUM",     N_("Sum of values"), AGR_SV_YES, 0, -1,          {FMT_F, 8, 2}},
+    {"MEAN",	N_("Mean average"), AGR_SV_YES, 0, -1,          {FMT_F, 8, 2}},
+    {"MEDIAN",	N_("Median average"), AGR_SV_YES, 0, -1,          {FMT_F, 8, 2}},
+    {"SD",      N_("Standard deviation"), AGR_SV_YES, 0, -1,          {FMT_F, 8, 2}},
+    {"MAX",     N_("Maximum value"), AGR_SV_YES, 0, VAL_STRING,  {-1, -1, -1}},
+    {"MIN",     N_("Minimum value"), AGR_SV_YES, 0, VAL_STRING,  {-1, -1, -1}},
+    {"PGT",     N_("Percentage greater than"), AGR_SV_YES, 1, VAL_NUMERIC, {FMT_F, 5, 1}},
+    {"PLT",     N_("Percentage less than"), AGR_SV_YES, 1, VAL_NUMERIC, {FMT_F, 5, 1}},
+    {"PIN",     N_("Percentage included in range"), AGR_SV_YES, 2, VAL_NUMERIC, {FMT_F, 5, 1}},
+    {"POUT",    N_("Percentage excluded from range"), AGR_SV_YES, 2, VAL_NUMERIC, {FMT_F, 5, 1}},
+    {"FGT",     N_("Fraction greater than"), AGR_SV_YES, 1, VAL_NUMERIC, {FMT_F, 5, 3}},
+    {"FLT",     N_("Fraction less than"), AGR_SV_YES, 1, VAL_NUMERIC, {FMT_F, 5, 3}},
+    {"FIN",     N_("Fraction included in range"), AGR_SV_YES, 2, VAL_NUMERIC, {FMT_F, 5, 3}},
+    {"FOUT",    N_("Fraction excluded from range"), AGR_SV_YES, 2, VAL_NUMERIC, {FMT_F, 5, 3}},
+    {"N",       N_("Number of cases"), AGR_SV_NO, 0, VAL_NUMERIC, {FMT_F, 7, 0}},
+    {"NU",      N_("Number of cases (unweighted)"), AGR_SV_OPT, 0, VAL_NUMERIC, {FMT_F, 7, 0}},
+    {"NMISS",   N_("Number of missing values"), AGR_SV_YES, 0, VAL_NUMERIC, {FMT_F, 7, 0}},
+    {"NUMISS",  N_("Number of missing values (unweighted)"), AGR_SV_YES, 0, VAL_NUMERIC, {FMT_F, 7, 0}},
+    {"FIRST",   N_("First non-missing value"), AGR_SV_YES, 0, VAL_STRING,  {-1, -1, -1}},
+    {"LAST",    N_("Last non-missing value"), AGR_SV_YES, 0, VAL_STRING,  {-1, -1, -1}},
+    {NULL,      NULL, AGR_SV_NO, 0, -1,          {-1, -1, -1}},
   };
 
 /* Missing value types. */
@@ -496,11 +488,7 @@ parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict,
       /* Check for leading lparen. */
       if (!lex_match (lexer, '('))
 	{
-	  if (func_index == N)
-	    func_index = N_NO_VARS;
-	  else if (func_index == NU)
-	    func_index = NU_NO_VARS;
-	  else
+	  if (function->src_vars == AGR_SV_YES)
 	    {
 	      lex_error (lexer, _("expecting `('"));
 	      goto error;
@@ -649,7 +637,7 @@ parse_aggregate_functions (struct lexer *lexer, const struct dictionary *dict,
                 struct fmt_spec f;
 		v->src = NULL;
 		destvar = dict_create_var (agr->dict, dest[i], 0);
-                if (func_index == N_NO_VARS && dict_get_weight (dict) != NULL)
+                if (func_index == N && dict_get_weight (dict) != NULL)
                   f = fmt_for_output (FMT_F, 8, 2);
                 else
                   f = function->format;
@@ -948,13 +936,13 @@ accumulate_aggregate_info (struct agr_proc *agr, const struct ccase *input)
 	  default:
 	    NOT_REACHED ();
 	  }
-    } else {
+      } else {
       switch (iter->function)
 	{
-	case N_NO_VARS:
+	case N:
 	  iter->dbl[0] += weight;
 	  break;
-	case NU_NO_VARS:
+	case NU:
 	  iter->int1++;
 	  break;
 	default:
@@ -1078,7 +1066,7 @@ dump_aggregate_info (const struct agr_proc *agr, struct casewriter *output, cons
 	    break;
 	  case N:
 	  case N | FSTRING:
-	    v->f = i->dbl[0];
+	      v->f = i->dbl[0];
             break;
 	  case NU:
 	  case NU | FSTRING:
@@ -1095,12 +1083,6 @@ dump_aggregate_info (const struct agr_proc *agr, struct casewriter *output, cons
 	    else
               value_set_missing (v, width);
 	    break;
-	  case N_NO_VARS:
-	    v->f = i->dbl[0];
-	    break;
-	  case NU_NO_VARS:
-	    v->f = i->int1;
-	    break;
 	  case NMISS:
 	  case NMISS | FSTRING:
 	    v->f = i->dbl[0];
diff --git a/src/language/stats/aggregate.h b/src/language/stats/aggregate.h
new file mode 100644
index 0000000..95e574a
--- /dev/null
+++ b/src/language/stats/aggregate.h
@@ -0,0 +1,47 @@
+/* PSPP - a program for statistical analysis.
+   Copyright (C) 2010 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>. */
+
+
+#ifndef AGGREGATE_H
+#define AGGREGATE_H
+
+#include <data/format.h>
+#include <data/val-type.h>
+
+#include <stddef.h>
+
+enum agr_src_vars
+  {
+    AGR_SV_NO,
+    AGR_SV_YES,
+    AGR_SV_OPT
+  };
+
+/* Attributes of an aggregation function. */
+struct agr_func
+  {
+    const char *name;		/* Aggregation function name. */
+    const char *description;    /* Translatable string describing the function. */
+    enum agr_src_vars src_vars; /* Whether source variables are a parameter of the function */
+    size_t n_args;              /* Number of arguments (not including src vars). */
+    enum val_type alpha_type;   /* When given ALPHA arguments, output type. */
+    struct fmt_spec format;	/* Format spec if alpha_type != ALPHA. */
+  };
+
+extern const struct agr_func agr_func_tab[];
+
+
+#endif

Attachment: signature.asc
Description: Digital signature

_______________________________________________
pspp-dev mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/pspp-dev

Reply via email to