X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fdata-out.c;h=94e72f668be641d81bedca51660e8716e5773c2b;hb=fa1fffd5c789d9c7875fc3bdf556eaf017cf524e;hp=96bf58bd6238c6ab34d3dfee5317eab4b52ec9d9;hpb=a124375065d0768546f6e7670d9c6d6a0b2b5379;p=pspp diff --git a/src/data/data-out.c b/src/data/data-out.c index 96bf58bd62..94e72f668b 100644 --- a/src/data/data-out.c +++ b/src/data/data-out.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2009, 2011 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2009, 2011, 2012 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 @@ -16,7 +16,7 @@ #include -#include "data-out.h" +#include "data/data-out.h" #include #include @@ -26,22 +26,21 @@ #include #include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "minmax.h" +#include "data/calendar.h" +#include "data/format.h" +#include "data/settings.h" +#include "data/value.h" +#include "libpspp/assertion.h" +#include "libpspp/cast.h" +#include "libpspp/float-format.h" +#include "libpspp/i18n.h" +#include "libpspp/integer-format.h" +#include "libpspp/message.h" +#include "libpspp/misc.h" +#include "libpspp/pool.h" +#include "libpspp/str.h" + +#include "gl/minmax.h" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -388,14 +387,11 @@ output_date (const union value *input, const struct fmt_spec *format, double number = input->f; int year, month, day, yday; - const char *template = fmt_date_template (format->type); - size_t template_width = strlen (template); - int excess_width = format->w - template_width; + const char *template = fmt_date_template (format->type, format->w); char tmp[64]; char *p = tmp; - assert (format->w >= template_width); if (number == SYSMIS) goto missing; @@ -412,6 +408,8 @@ output_date (const union value *input, const struct fmt_spec *format, while (*template != '\0') { + int excess_width; + int ch = *template; int count = 1; while (template[count] == ch) @@ -440,7 +438,7 @@ output_date (const union value *input, const struct fmt_spec *format, } break; case 'y': - if (count >= 4 || excess_width >= 2) + if (count >= 4) { if (year <= 9999) p += sprintf (p, "%04d", year); @@ -500,10 +498,7 @@ output_date (const union value *input, const struct fmt_spec *format, } p += strlen (p); } - break; - case 'X': - *p++ = ' '; - break; + goto done; default: assert (count == 1); *p++ = ch; @@ -511,6 +506,7 @@ output_date (const union value *input, const struct fmt_spec *format, } } + done: buf_copy_lpad (output, format->w, tmp, p - tmp, ' '); output[format->w] = '\0'; return; @@ -868,6 +864,8 @@ rounder_init (struct rounder *r, double number, int max_decimals) r->leading_zeros = strspn (r->string, "0."); r->leading_nines = strspn (r->string, "9."); r->integer_digits = strchr (r->string, '.') - r->string; + assert (r->integer_digits < 64); + assert (r->integer_digits >= 0); r->negative = number < 0; }