X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fexpressions%2Fhelpers.c;h=720d910f686dd6993c9df4d3d19fc9762af9548e;hb=d7a8159acf53f6bf70940d711b32348b6ae75f16;hp=08f787fea2f30c14099df3c82808623b2e886e30;hpb=7d34380bb2fddca820a6f414564738cc2f70afc9;p=pspp diff --git a/src/language/expressions/helpers.c b/src/language/expressions/helpers.c index 08f787fea2..720d910f68 100644 --- a/src/language/expressions/helpers.c +++ b/src/language/expressions/helpers.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2008, 2010 Free Software Foundation, Inc. + Copyright (C) 2008, 2010, 2011 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 @@ -15,33 +15,17 @@ along with this program. If not, see . */ #include -#include "helpers.h" + +#include "language/expressions/helpers.h" + #include #include -#include -#include -#include "private.h" -const struct substring empty_string = {NULL, 0}; +#include "language/expressions/private.h" +#include "libpspp/assertion.h" +#include "libpspp/pool.h" -static void -expr_error (void *aux UNUSED, const char *format, ...) -{ - struct msg m; - va_list args; - - m.category = MSG_C_SYNTAX; - m.severity = MSG_S_ERROR; - va_start (args, format); - m.text = xvasprintf (format, args); - m.where.file_name = NULL; - m.where.line_number = 0; - m.where.first_column = 0; - m.where.last_column = 0; - va_end (args); - - msg_emit (&m); -} +const struct substring empty_string = {NULL, 0}; double expr_ymd_to_ofs (double year, double month, double day) @@ -49,6 +33,8 @@ expr_ymd_to_ofs (double year, double month, double day) int y = year; int m = month; int d = day; + char *error; + double ofs; if (y != year || m != month || d != day) { @@ -57,7 +43,13 @@ expr_ymd_to_ofs (double year, double month, double day) return SYSMIS; } - return calendar_gregorian_to_offset (y, m, d, expr_error, NULL); + ofs = calendar_gregorian_to_offset (y, m, d, &error); + if (error != NULL) + { + msg (SE, "%s", error); + free (error); + } + return ofs; } double @@ -183,12 +175,13 @@ recognize_unit (struct substring name, enum date_unit *unit) return true; } - /* TRANSLATORS: Don't translate the the actual unit names `weeks', `days' etc - They must remain in their original English. */ msg (SE, _("Unrecognized date unit `%.*s'. " - "Valid date units are `years', `quarters', `months', " - "`weeks', `days', `hours', `minutes', and `seconds'."), - (int) ss_length (name), ss_data (name)); + "Valid date units are `%s', `%s', `%s', " + "`%s', `%s', `%s', `%s', and `%s'."), + (int) ss_length (name), ss_data (name), + "years", "quarters", "months", + "weeks", "days", "hours", "minutes", "seconds"); + return false; } @@ -336,7 +329,7 @@ recognize_method (struct substring method_name, enum date_sum_method *method) else { msg (SE, _("Invalid DATESUM method. " - "Valid choices are `closest' and `rollover'.")); + "Valid choices are `%s' and `%s'."), "closest", "rollover"); return false; } } @@ -348,6 +341,7 @@ add_months (double date, int months, enum date_sum_method method) { int y, m, d, yd; double output; + char *error; calendar_offset_to_gregorian (date / DAY_S, &y, &m, &d, &yd); y += months / 12; @@ -367,9 +361,14 @@ add_months (double date, int months, enum date_sum_method method) if (method == SUM_CLOSEST && d > calendar_days_in_month (y, m)) d = calendar_days_in_month (y, m); - output = calendar_gregorian_to_offset (y, m, d, expr_error, NULL); + output = calendar_gregorian_to_offset (y, m, d, &error); if (output != SYSMIS) output = (output * DAY_S) + fmod (date, DAY_S); + else + { + msg (SE, "%s", error); + free (error); + } return output; }