X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=inline;f=src%2Flanguage%2Fexpressions%2Fhelpers.c;h=5aad13eb160b5f3f160481fcdaefa30a92b05354;hb=c59aaac4ae90d783e96de486208b245f4f31691f;hp=2d707e9941dd2c480bf1446d2d81e9f697192988;hpb=638a86001fe7a237bd6c19a181d796305290d72a;p=pspp
diff --git a/src/language/expressions/helpers.c b/src/language/expressions/helpers.c
index 2d707e9941..5aad13eb16 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 Free Software Foundation, Inc.
+ 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
@@ -15,31 +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;
- va_end (args);
-
- msg_emit (&m);
-}
+const struct substring empty_string = {NULL, 0};
double
expr_ymd_to_ofs (double year, double month, double day)
@@ -47,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)
{
@@ -55,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
@@ -181,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;
}
@@ -334,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;
}
}
@@ -346,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;
@@ -365,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;
}
@@ -660,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;
+}