Subcommand to export a model as a C function
[pspp-builds.git] / src / examine.q
index f92bba1fd2160709f263a860b9bd0dd22699e38d..fc0c0c9a94f8752aee67aeeded7b8b68553daa15 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,6 +44,10 @@ 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"
 
@@ -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;
@@ -324,7 +328,7 @@ output_examine(void)
 
       if ( cmd.sbc_plot) 
        {
-         int v;
+         size_t v;
 
          struct factor_statistics **fs = fctr->fs ;
 
@@ -390,7 +394,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 +417,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 +511,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 +534,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 +611,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 +628,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 +650,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);
@@ -707,7 +712,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 +723,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 +812,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 +834,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 +1513,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 +1694,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 +1779,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 +1858,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 )