Adopt use of gnulib for portability.
[pspp-builds.git] / src / examine.q
index d49f9f165ac3479b4988f07fecefa16b1995b09c..b54f574b5c36631f79ed2b7e98f0fd5f3daca5f3 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,
@@ -218,6 +222,19 @@ cmd_examine(void)
   if ( dependent_vars ) 
     free (dependent_vars);
 
+  {
+    struct factor *f = factors ;
+    while ( f ) 
+      {
+       struct factor *ff = f;
+
+       f = f->next;
+       free ( ff->fs );
+       hsh_destroy ( ff->fstats ) ;
+       free ( ff ) ;
+      }
+  }
+
   subc_list_double_destroy(&percentile_list);
 
   return CMD_SUCCESS;
@@ -359,6 +376,8 @@ output_examine(void)
 }
 
 
+/* Create a hash table of percentiles and their values from the list of
+   percentiles */
 static struct hsh_table *
 list_to_ptile_hash(const subc_list_double *l)
 {
@@ -378,6 +397,7 @@ list_to_ptile_hash(const subc_list_double *l)
       struct percentile *p = xmalloc (sizeof (struct percentile));
       
       p->p = subc_list_double_at(l,i);
+      p->v = SYSMIS;
 
       hsh_insert(h, p);
 
@@ -397,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();
 
@@ -596,6 +616,7 @@ factor_calc(struct ccase *c, int case_no, double weight, int case_missing)
 
   while ( fctr) 
     {
+      struct factor_statistics **foo ;
       union value indep_vals[2] ;
 
       indep_vals[0] = * case_data(c, fctr->indep_var[0]->fv);
@@ -607,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 ) 
@@ -1492,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,
@@ -1514,12 +1535,14 @@ populate_descriptives(struct tab_table *tbl, int col, int row,
     
     assert(p);
 
+
     tab_float (tbl, col + 2, 
               row + 4,
               TAB_CENTER,
               p->v,
               8, 2);
   }
+    
 
   tab_text (tbl, col, 
            row + 5,
@@ -1671,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);
@@ -1759,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;
@@ -1838,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 = xmalloc (m->n_data * sizeof(double));
     double d_max = -DBL_MAX;
     double d_min = DBL_MAX;
     for ( i = 0 ; i < m->n_data; ++i )