X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fprint.c;h=a42c82d5bca3e4da742cd5fdc70d819e07e470be;hb=7b80235141f331530de337cceeab87de873c5cc2;hp=8cb7b1d432d92f2bac609ad108d9c6a0894ef899;hpb=4848cff524922cc77ed21662406807471e96a68e;p=pspp diff --git a/src/print.c b/src/print.c index 8cb7b1d432..a42c82d5bc 100644 --- a/src/print.c +++ b/src/print.c @@ -14,8 +14,8 @@ 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. */ /* FIXME: seems like a lot of code duplication with data-list.c. */ @@ -35,6 +35,9 @@ #include "tab.h" #include "var.h" +#include "gettext.h" +#define _(msgid) gettext (msgid) + /* Describes what to do when an output field is encountered. */ enum { @@ -246,8 +249,8 @@ struct fmt_list static struct { struct variable **v; /* variable list */ - int nv; /* number of variables in list */ - int cv; /* number of variables from list used up so far + size_t nv; /* number of variables in list */ + size_t cv; /* number of variables from list used up so far by the FORTRAN-like format specifiers */ int recno; /* current 1-based record number */ @@ -449,7 +452,7 @@ parse_variable_argument (void) else { /* User wants dictionary format specifiers. */ - int i; + size_t i; lex_match ('*'); for (i = 0; i < fx.nv; i++) @@ -478,13 +481,28 @@ fail: return 0; } +/* Verifies that FORMAT doesn't need a variable wider than WIDTH. + Returns true iff that is the case. */ +static bool +check_string_width (const struct fmt_spec *format, const struct variable *v) +{ + if (get_format_var_width (format) > v->width) + { + msg (SE, _("Variable %s has width %d so it cannot be output " + "as format %s."), + v->name, v->width, fmt_to_string (format)); + return false; + } + return true; +} + /* Parses a column specification for parse_specs(). */ static int fixed_parse_compatible (void) { - int dividend; + int individual_var_width; int type; - int i; + size_t i; type = fx.v[0]->type; for (i = 1; i < fx.nv; i++) @@ -592,40 +610,28 @@ fixed_parse_compatible (void) if ((fx.lc - fx.fc + 1) % fx.nv) { - msg (SE, _("The %d columns %d-%d can't be evenly divided into %d " - "fields."), fx.lc - fx.fc + 1, fx.fc + 1, fx.lc + 1, fx.nv); + msg (SE, _("The %d columns %d-%d can't be evenly divided into %u " + "fields."), + fx.lc - fx.fc + 1, fx.fc + 1, fx.lc + 1, (unsigned) fx.nv); return 0; } - dividend = (fx.lc - fx.fc + 1) / fx.nv; - fx.spec.u.v.f.w = dividend; - if (!check_output_specifier (&fx.spec.u.v.f, 1)) + individual_var_width = (fx.lc - fx.fc + 1) / fx.nv; + fx.spec.u.v.f.w = individual_var_width; + if (!check_output_specifier (&fx.spec.u.v.f, true) + || !check_specifier_type (&fx.spec.u.v.f, type, true)) return 0; - if ((type == ALPHA) ^ (formats[fx.spec.u.v.f.type].cat & FCAT_STRING)) - { - msg (SE, _("%s variables cannot be displayed with format %s."), - type == ALPHA ? _("String") : _("Numeric"), - fmt_to_string (&fx.spec.u.v.f)); - return 0; - } - - /* Check that, for string variables, the user didn't specify a width - longer than an actual string width. */ if (type == ALPHA) { - /* Minimum width of all the string variables specified. */ - int min_len = fx.v[0]->width; - - for (i = 1; i < fx.nv; i++) - min_len = min (min_len, fx.v[i]->width); - if (!check_string_specifier (&fx.spec.u.v.f, min_len)) - return 0; + for (i = 0; i < fx.nv; i++) + if (!check_string_width (&fx.spec.u.v.f, fx.v[i])) + return false; } fx.spec.type = PRT_VAR; for (i = 0; i < fx.nv; i++) { - fx.spec.fc = fx.fc + dividend * i; + fx.spec.fc = fx.fc + individual_var_width * i; fx.spec.u.v.v = fx.v[i]; append_var_spec (&fx.spec); } @@ -688,15 +694,10 @@ dump_fmt_list (struct fmt_list * f) } v = fx.v[fx.cv++]; - if ((v->type == ALPHA) ^ (formats[f->f.type].cat & FCAT_STRING)) - { - msg (SE, _("Display format %s may not be used with a " - "%s variable."), fmt_to_string (&f->f), - v->type == ALPHA ? _("string") : _("numeric")); - return 0; - } - if (!check_string_specifier (&f->f, v->width)) - return 0; + if (!check_output_specifier (&f->f, true) + || !check_specifier_type (&f->f, v->type, true) + || !check_string_width (&f->f, v)) + return false; fx.spec.type = PRT_VAR; fx.spec.u.v.v = v;