X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fexpressions%2Fhelpers.c;h=5aad13eb160b5f3f160481fcdaefa30a92b05354;hb=73ce37552fb2846a5a5c23d401f21b4951888029;hp=a28f1a666ef2180ea17730c024dbfe19f4d1980e;hpb=49622888cd4954bf11544b2e43f58e523c9954b5;p=pspp diff --git a/src/language/expressions/helpers.c b/src/language/expressions/helpers.c index a28f1a666e..5aad13eb16 100644 --- a/src/language/expressions/helpers.c +++ b/src/language/expressions/helpers.c @@ -1,27 +1,31 @@ +/* PSPP - a program for statistical analysis. + Copyright (C) 2008, 2010, 2011, 2015 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 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, see . */ + #include -#include "helpers.h" -#include -#include -#include -#include -#include "private.h" -const struct substring empty_string = {NULL, 0}; +#include "language/expressions/helpers.h" -static void -expr_error (void *aux UNUSED, const char *format, ...) -{ - struct msg m; - va_list args; +#include +#include - m.category = MSG_SYNTAX; - m.severity = MSG_ERROR; - va_start (args, format); - m.text = xvasprintf (format, args); - va_end (args); +#include "language/expressions/private.h" +#include "libpspp/assertion.h" +#include "libpspp/pool.h" - msg_emit (&m); -} +const struct substring empty_string = {NULL, 0}; double expr_ymd_to_ofs (double year, double month, double day) @@ -29,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) { @@ -37,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 @@ -163,10 +175,13 @@ recognize_unit (struct substring name, enum date_unit *unit) return true; } - 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)); + msg (SE, _("Unrecognized date unit `%.*s'. " + "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; } @@ -314,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; } } @@ -326,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; @@ -345,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; } @@ -388,7 +409,7 @@ expr_date_sum (double date, double quantity, struct substring unit_name, } int -compare_string (const struct substring *a, const struct substring *b) +compare_string_3way (const struct substring *a, const struct substring *b) { size_t i; @@ -573,14 +594,14 @@ ncdf_beta (double x, double a, double b, double lambda) double cdf_bvnor (double x0, double x1, double r) { - double z = x0 * x0 - 2. * r * x0 * x1 + x1 * x1; + double z = pow2 (x0) - 2. * r * x0 * x1 + pow2 (x1); return exp (-z / (2. * (1 - r * r))) * (2. * M_PI * sqrt (1 - r * r)); } double idf_fdist (double P, double df1, double df2) { - double temp = gslextras_cdf_beta_Pinv (P, df1 / 2, df2 / 2); + double temp = gsl_cdf_beta_Pinv (P, df1 / 2, df2 / 2); return temp * df2 / ((1. - temp) * df1); } @@ -640,3 +661,17 @@ npdf_beta (double x, double a, double b, double lambda) return sum; } } + +double +round_nearest (double x, double mult, double fuzzbits) +{ + double adjustment; + + if (fuzzbits <= 0) + fuzzbits = settings_get_fuzzbits (); + adjustment = .5 + exp2 (fuzzbits - DBL_MANT_DIG); + + x /= mult; + x = x >= 0. ? floor (x + adjustment) : -floor (-x + adjustment); + return x * mult; +}