-/* PSPP - EXAMINE data for normality . -*-c-*-
+/* PSPP - a program for statistical analysis.
+ Copyright (C) 2004 Free Software Foundation, Inc.
-Copyright (C) 2004 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 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 2 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.
-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, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301, USA. */
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <config.h>
#include <language/command.h>
#include <language/dictionary/split-file.h>
#include <language/lexer/lexer.h>
-#include <libpspp/alloc.h>
#include <libpspp/compiler.h>
#include <libpspp/hash.h>
-#include <libpspp/magic.h>
#include <libpspp/message.h>
#include <libpspp/misc.h>
#include <libpspp/str.h>
#include <output/table.h>
#include "minmax.h"
+#include "xalloc.h"
#include "gettext.h"
#define _(msgid) gettext (msgid)
/* Represent a factor as a string, so it can be
printed in a human readable fashion */
-const char * factor_to_string (const struct factor *fctr,
+static void factor_to_string (const struct factor *fctr,
const struct factor_statistics *fs,
- const struct variable *var);
-
+ const struct variable *var,
+ struct string *str
+ );
/* Represent a factor as a string, so it can be
printed in a human readable fashion,
but sacrificing some readablility for the sake of brevity */
-const char *factor_to_string_concise (const struct factor *fctr,
- struct factor_statistics *fs);
+static void factor_to_string_concise (const struct factor *fctr,
+ const struct factor_statistics *fs,
+ struct string *);
for ( fs = fctr->fs ; *fs ; ++fs )
{
- const char *s = factor_to_string (fctr, *fs, dependent_vars[v]);
+ struct string str;
+ ds_init_empty (&str);
+ factor_to_string (fctr, *fs, dependent_vars[v], &str);
if ( cmd.a_plot[XMN_PLT_NPPLOT] )
- np_plot (& (*fs)->m[v], s);
+ np_plot (& (*fs)->m[v], ds_cstr (&str));
if ( cmd.a_plot[XMN_PLT_HISTOGRAM] )
{
normal.stddev = (*fs)->m[v].stddev;
histogram_plot ((*fs)->m[v].histogram,
- s, &normal, 0);
+ ds_cstr (&str) , &normal, 0);
}
+ ds_destroy (&str);
+
} /* for ( fs .... */
} /* for ( v = 0 ..... */
struct factor *fctr;
if (!casereader_peek (input, 0, &c))
- return;
+ {
+ casereader_destroy (input);
+ return;
+ }
output_split_file_values (ds, &c);
case_destroy (&c);
0 != compare_values (prev, (*fs)->id[0],
var_get_width (fctr->indep_var[0])))
{
+ struct string vstr;
+ ds_init_empty (&vstr);
+ var_append_value_name (fctr->indep_var[0],
+ (*fs)->id[0], &vstr);
+
tab_text (tbl,
1,
(i * n_factors ) + count +
heading_rows,
TAB_LEFT | TAT_TITLE,
- var_get_value_name (fctr->indep_var[0],
- (*fs)->id[0])
+ ds_cstr (&vstr)
);
+ ds_destroy (&vstr);
+
if (fctr->indep_var[1] && count > 0 )
tab_hline (tbl, TAL_1, 1, n_cols - 1,
(i * n_factors ) + count + heading_rows);
prev = (*fs)->id[0];
-
if ( fctr->indep_var[1])
+ {
+ struct string vstr;
+ ds_init_empty (&vstr);
+ var_append_value_name (fctr->indep_var[1],
+ (*fs)->id[1], &vstr);
tab_text (tbl,
2,
(i * n_factors ) + count +
heading_rows,
TAB_LEFT | TAT_TITLE,
- var_get_value_name (fctr->indep_var[1], (*fs)->id[1])
+ ds_cstr (&vstr)
);
+ ds_destroy (&vstr);
+ }
populate_summary (tbl, heading_columns,
(i * n_factors) + count
if ( !prev || 0 != compare_values (prev, (*fs)->id[0],
var_get_width (fctr->indep_var[0])))
{
+ struct string vstr;
+ ds_init_empty (&vstr);
+ var_append_value_name (fctr->indep_var[0],
+ (*fs)->id[0], &vstr);
if ( count > 0 )
tab_hline (tbl, TAL_1, 1, n_cols - 1, row);
tab_text (tbl,
1, row,
TAB_LEFT | TAT_TITLE,
- var_get_value_name (fctr->indep_var[0],
- (*fs)->id[0])
+ ds_cstr (&vstr)
);
+
+ ds_destroy (&vstr);
}
prev = (*fs)->id[0];
tab_hline (tbl, TAL_1, 2, n_cols - 1, row);
if ( fctr->indep_var[1])
+ {
+ struct string vstr;
+ ds_init_empty (&vstr);
+ var_append_value_name (fctr->indep_var[1], (*fs)->id[1], &vstr);
+
tab_text (tbl, 2, row,
TAB_LEFT | TAT_TITLE,
- var_get_value_name (fctr->indep_var[1], (*fs)->id[1])
+ ds_cstr (&vstr)
);
+ ds_destroy (&vstr);
+ }
+
populate_extremes (tbl, heading_columns - 2,
row, n_extremities,
& (*fs)->m[i]);
if ( !prev || 0 != compare_values (prev, (*fs)->id[0],
var_get_width (fctr->indep_var[0])))
{
+ struct string vstr;
+ ds_init_empty (&vstr);
+ var_append_value_name (fctr->indep_var[0],
+ (*fs)->id[0], &vstr);
if ( count > 0 )
tab_hline (tbl, TAL_1, 1, n_cols - 1, row);
tab_text (tbl,
1, row,
TAB_LEFT | TAT_TITLE,
- var_get_value_name (fctr->indep_var[0],
- (*fs)->id[0])
+ ds_cstr (&vstr)
);
+
+ ds_destroy (&vstr);
}
prev = (*fs)->id[0];
tab_hline (tbl, TAL_1, 2, n_cols - 1, row);
if ( fctr->indep_var[1])
+ {
+ struct string vstr;
+ ds_init_empty (&vstr);
+ var_append_value_name (fctr->indep_var[1], (*fs)->id[1], &vstr);
+
tab_text (tbl, 2, row,
TAB_LEFT | TAT_TITLE,
- var_get_value_name (fctr->indep_var[1], (*fs)->id[1])
+ ds_cstr (&vstr)
);
+ ds_destroy (&vstr);
+ }
+
populate_descriptives (tbl, heading_columns - 2,
row, & (*fs)->m[i]);
for ( fs = fctr->fs ; *fs ; ++fs )
{
+ struct string str;
double y_min = DBL_MAX;
double y_max = -DBL_MAX;
struct chart *ch = chart_create ();
- const char *s = factor_to_string (fctr, *fs, 0 );
+ ds_init_empty (&str);
+ factor_to_string (fctr, *fs, 0, &str );
- chart_write_title (ch, s);
+ chart_write_title (ch, ds_cstr (&str));
for ( i = 0 ; i < n_vars ; ++i )
{
}
chart_submit (ch);
-
+ ds_destroy (&str);
}
}
for ( fs = fctr->fs ; *fs ; ++fs )
{
-
- const char *s = factor_to_string_concise (fctr, *fs);
-
+ struct string str;
const double box_width = (ch->data_right - ch->data_left)
/ (n_factors * 2.0 ) ;
const double box_centre = ( f++ * 2 + 1) * box_width
+ ch->data_left;
+ ds_init_empty (&str);
+ factor_to_string_concise (fctr, *fs, &str);
+
boxplot_draw_boxplot (ch,
box_centre, box_width,
& (*fs)->m[i],
- s);
+ ds_cstr (&str));
+ ds_destroy (&str);
}
}
else if ( ch )
if ( !prev || 0 != compare_values (prev, (*fs)->id[0],
var_get_width (fctr->indep_var[0])))
{
+ struct string vstr;
+ ds_init_empty (&vstr);
+ var_append_value_name (fctr->indep_var[0],
+ (*fs)->id[0], &vstr);
+
if ( count > 0 )
tab_hline (tbl, TAL_1, 1, n_cols - 1, row);
tab_text (tbl,
1, row,
TAB_LEFT | TAT_TITLE,
- var_get_value_name (fctr->indep_var[0],
- (*fs)->id[0])
+ ds_cstr (&vstr)
);
-
+ ds_destroy (&vstr);
}
prev = (*fs)->id[0];
tab_hline (tbl, TAL_1, 2, n_cols - 1, row);
if ( fctr->indep_var[1])
+ {
+ struct string vstr;
+ ds_init_empty (&vstr);
+ var_append_value_name (fctr->indep_var[1], (*fs)->id[1], &vstr);
+
tab_text (tbl, 2, row,
TAB_LEFT | TAT_TITLE,
- var_get_value_name (fctr->indep_var[1], (*fs)->id[1])
+ ds_cstr (&vstr)
);
+ ds_destroy (&vstr);
+ }
+
populate_percentiles (tbl, n_heading_columns - 1,
row, & (*fs)->m[i]);
}
-
-
-const char *
+static void
factor_to_string (const struct factor *fctr,
const struct factor_statistics *fs,
- const struct variable *var)
+ const struct variable *var,
+ struct string *str
+ )
{
-
- static char buf1[100];
- char buf2[100];
-
- strcpy (buf1,"");
-
if (var)
- sprintf (buf1, "%s (",var_to_string (var) );
+ ds_put_format (str, "%s (",var_to_string (var) );
- snprintf (buf2, 100, "%s = %s",
- var_to_string (fctr->indep_var[0]),
- var_get_value_name (fctr->indep_var[0], fs->id[0]));
+ ds_put_format (str, "%s = ",
+ var_to_string (fctr->indep_var[0]));
- strcat (buf1, buf2);
+ var_append_value_name (fctr->indep_var[0], fs->id[0], str);
if ( fctr->indep_var[1] )
{
- sprintf (buf2, "; %s = %s)",
- var_to_string (fctr->indep_var[1]),
- var_get_value_name (fctr->indep_var[1], fs->id[1]));
- strcat (buf1, buf2);
+ ds_put_format (str, "; %s = )",
+ var_to_string (fctr->indep_var[1]));
+
+ var_append_value_name (fctr->indep_var[1], fs->id[1], str);
}
else
{
if ( var )
- strcat (buf1, ")");
+ ds_put_cstr (str, ")");
}
-
- return buf1;
}
-
-const char *
+static void
factor_to_string_concise (const struct factor *fctr,
- struct factor_statistics *fs)
+ const struct factor_statistics *fs,
+ struct string *str
+ )
{
-
- static char buf[100];
-
- char buf2[100];
-
- snprintf (buf, 100, "%s",
- var_get_value_name (fctr->indep_var[0], fs->id[0]));
+ var_append_value_name (fctr->indep_var[0], fs->id[0], str);
if ( fctr->indep_var[1] )
{
- sprintf (buf2, ",%s)", var_get_value_name (fctr->indep_var[1],
- fs->id[1]) );
- strcat (buf, buf2);
- }
+ ds_put_cstr (str, ",");
+ var_append_value_name (fctr->indep_var[1],fs->id[1], str);
- return buf;
+ ds_put_cstr (str, ")");
+ }
}
+
+/*
+ Local Variables:
+ mode: c
+ End:
+*/