added automake.mk files in src/language
[pspp] / src / examine.q
index 3454b66f927a82696d64bbed727625512a593abc..43ecc13037d3d6a2faf3ab0ae762a08cd78022ae 100644 (file)
@@ -15,8 +15,8 @@ General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA. */
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301, USA. */
 
 #include <config.h>
 #include <gsl/gsl_cdf.h>
@@ -44,12 +44,16 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 #include "moments.h"
 #include "percentiles.h"
 
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
 /* (headers) */
 #include "chart.h"
 
 /* (specification)
    "EXAMINE" (xmn_):
-   *variables=custom;
+   *^variables=custom;
    +total=custom;
    +nototal=custom;
    +missing=miss:pairwise/!listwise,
@@ -73,7 +77,7 @@ static struct cmd_examine cmd;
 
 static struct variable **dependent_vars;
 
-static int n_dependent_vars;
+static size_t n_dependent_vars;
 
 
 struct factor 
@@ -165,7 +169,7 @@ const char *factor_to_string_concise(const struct factor *fctr,
 
 
 /* Function to use for testing for missing values */
-static is_missing_func value_is_missing;
+static is_missing_func *value_is_missing;
 
 
 /* PERCENTILES */
@@ -189,9 +193,9 @@ cmd_examine(void)
 
   /* If /MISSING=INCLUDE is set, then user missing values are ignored */
   if (cmd.incl == XMN_INCLUDE ) 
-    value_is_missing = is_system_missing;
+    value_is_missing = mv_is_value_system_missing;
   else
-    value_is_missing = is_missing;
+    value_is_missing = mv_is_value_missing;
 
   if ( cmd.st_n == SYSMIS ) 
     cmd.st_n = 5;
@@ -229,6 +233,7 @@ cmd_examine(void)
        hsh_destroy ( ff->fstats ) ;
        free ( ff ) ;
       }
+    factors = 0;
   }
 
   subc_list_double_destroy(&percentile_list);
@@ -324,7 +329,7 @@ output_examine(void)
 
       if ( cmd.sbc_plot) 
        {
-         int v;
+         size_t v;
 
          struct factor_statistics **fs = fctr->fs ;
 
@@ -390,7 +395,7 @@ list_to_ptile_hash(const subc_list_double *l)
 
   for ( i = 0 ; i < subc_list_double_count(l) ; ++i )
     {
-      struct percentile *p = xmalloc (sizeof (struct percentile));
+      struct percentile *p = xmalloc (sizeof *p);
       
       p->p = subc_list_double_at(l,i);
       p->v = SYSMIS;
@@ -413,9 +418,9 @@ xmn_custom_percentiles(struct cmd_examine *p UNUSED)
 
   lex_match('(');
 
-  while ( lex_double_p() ) 
+  while ( lex_is_number() ) 
     {
-      subc_list_double_push(&percentile_list,lex_double());
+      subc_list_double_push(&percentile_list,lex_number());
 
       lex_get();
 
@@ -507,7 +512,7 @@ xmn_custom_variables(struct cmd_examine *cmd )
 
   assert(n_dependent_vars);
 
-  totals = xmalloc( sizeof(struct metrics) * n_dependent_vars);
+  totals = xnmalloc (n_dependent_vars, sizeof *totals);
 
   if ( lex_match(T_BY))
     {
@@ -530,7 +535,7 @@ static int
 examine_parse_independent_vars(struct cmd_examine *cmd)
 {
   int success;
-  struct factor *sf = xmalloc(sizeof(struct factor));
+  struct factor *sf = xmalloc (sizeof *sf);
 
   if ((token != T_ID || dict_lookup_var (default_dict, tokid) == NULL)
       && token != T_ALL)
@@ -607,11 +612,12 @@ static int bad_weight_warn = 1;
 void
 factor_calc(struct ccase *c, int case_no, double weight, int case_missing)
 {
-  int v;
+  size_t v;
   struct factor *fctr = factors;
 
   while ( fctr) 
     {
+      struct factor_statistics **foo ;
       union value indep_vals[2] ;
 
       indep_vals[0] = * case_data(c, fctr->indep_var[0]->fv);
@@ -623,7 +629,7 @@ factor_calc(struct ccase *c, int case_no, double weight, int case_missing)
 
       assert(fctr->fstats);
 
-      struct factor_statistics **foo = ( struct factor_statistics ** ) 
+      foo = ( struct factor_statistics ** ) 
        hsh_probe(fctr->fstats, (void *) &indep_vals);
 
       if ( !*foo ) 
@@ -645,7 +651,7 @@ factor_calc(struct ccase *c, int case_no, double weight, int case_missing)
          const struct variable *var = dependent_vars[v];
          const union value *val = case_data (c, var->fv);
 
-         if ( value_is_missing(val,var) || case_missing ) 
+         if ( value_is_missing (&var->miss, val) || case_missing ) 
            val = 0;
          
          metrics_calc( &(*foo)->m[v], val, weight, case_no);
@@ -658,9 +664,6 @@ factor_calc(struct ccase *c, int case_no, double weight, int case_missing)
 
 }
 
-
-
-
 static void 
 run_examine(const struct casefile *cf, void *cmd_ )
 {
@@ -672,7 +675,6 @@ run_examine(const struct casefile *cf, void *cmd_ )
 
   /* Make sure we haven't got rubbish left over from a 
      previous split */
-
   struct factor *fctr = factors;
   while (fctr) 
     {
@@ -707,7 +709,7 @@ run_examine(const struct casefile *cf, void *cmd_ )
              const struct variable *var = dependent_vars[v];
              const union value *val = case_data (&c, var->fv);
 
-             if ( value_is_missing(val,var))
+             if ( value_is_missing(&var->miss, val))
                case_missing = 1;
                   
            }
@@ -718,7 +720,7 @@ run_examine(const struct casefile *cf, void *cmd_ )
          const struct variable *var = dependent_vars[v];
          const union value *val = case_data (&c, var->fv);
 
-         if ( value_is_missing(val,var) || case_missing ) 
+         if ( value_is_missing(&var->miss, val) || case_missing ) 
            val = 0;
 
          metrics_calc(&totals[v], val, weight, case_no);
@@ -807,7 +809,7 @@ run_examine(const struct casefile *cf, void *cmd_ )
                hsh_probe(fctr->fstats, (void *) &key );
 
              if ( !*ffs ) {
-               int i;
+               size_t i;
                (*ffs) = create_factor_statistics (n_dependent_vars,
                                                   &key[0], &key[1]);
                for ( i = 0 ; i < n_dependent_vars ; ++i ) 
@@ -829,7 +831,7 @@ run_examine(const struct casefile *cf, void *cmd_ )
 
   if ( totals ) 
     {
-      int i;
+      size_t i;
       for ( i = 0 ; i < n_dependent_vars ; ++i ) 
        {
          metrics_destroy(&totals[i]);
@@ -1508,8 +1510,8 @@ populate_descriptives(struct tab_table *tbl, int col, int row,
 
   tab_text (tbl, col, 
            row + 3,
-           TAB_LEFT | TAT_TITLE,
-           _("5% Trimmed Mean"));
+           TAB_LEFT | TAT_TITLE | TAT_PRINTF,
+           _("5%% Trimmed Mean"));
 
   tab_float (tbl, col + 2, 
             row + 3,
@@ -1689,10 +1691,7 @@ box_plot_variables(const struct factor *fctr,
     {
       double y_min = DBL_MAX;
       double y_max = -DBL_MAX;
-      struct chart *ch;
-
-      ch = chart_create();
-
+      struct chart *ch = chart_create();
       const char *s = factor_to_string(fctr, *fs, 0 );
 
       chart_write_title(ch, s);
@@ -1777,7 +1776,7 @@ box_plot_group(const struct factor *fctr,
                                   s);
            }
        }
-      else
+      else if ( ch )
        {
          const double box_width = (ch->data_right - ch->data_left) / 3.0;
          const double box_centre = (ch->data_right + ch->data_left) / 2.0;
@@ -1856,8 +1855,7 @@ np_plot(const struct metrics *m, const char *factorname)
   {
     /* We have to cache the detrended data, beacause we need to 
        find its limits before we can plot it */
-    double *d_data;
-    d_data = xmalloc (m->n_data * sizeof(double));
+    double *d_data = xnmalloc (m->n_data, sizeof *d_data);
     double d_max = -DBL_MAX;
     double d_min = DBL_MAX;
     for ( i = 0 ; i < m->n_data; ++i )