X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fexpressions%2Foperations.def;h=db71d2770339db273fa5114fe456afb83f106411;hb=f15c854d8500105766b2f5666bb62b983ff24f88;hp=6f0bd0e1430a3f4bcbf1a0742fef8303bb6918ab;hpb=35dac0a274893c6ba1d58d33a0889096eef033b4;p=pspp-builds.git diff --git a/src/language/expressions/operations.def b/src/language/expressions/operations.def index 6f0bd0e1..db71d277 100644 --- a/src/language/expressions/operations.def +++ b/src/language/expressions/operations.def @@ -1,23 +1,20 @@ // -*- c -*- // -// PSPP - computes sample statistics. -// Copyright (C) 2005, 2006 Free Software Foundation, Inc. -// Written by Ben Pfaff . +// PSPP - a program for statistical analysis. +// Copyright (C) 2005, 2006, 2009 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 2 of the -// License, or (at your option) any later version. +// 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. +// 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, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -// 02110-1301, USA. */ +// along with this program. If not, see . operator NEG (x) = -x; @@ -319,10 +316,13 @@ function XDATE.WKDAY (date >= DAY_S) = calendar_offset_to_wday (date / DAY_S); function XDATE.YEAR (date >= DAY_S) = calendar_offset_to_year (date / DAY_S); // Date arithmetic functions. -function DATEDIFF (date1, date2, string unit) = unimplemented; -function DATESUM (date, quantity, string unit) = unimplemented; -function DATESUM (date, quantity, string unit, string roll_over) - = unimplemented; +no_abbrev function DATEDIFF (date2 >= DAY_S, date1 >= DAY_S, string unit) + = expr_date_difference (date1, date2, unit); +no_abbrev function DATESUM (date, quantity, string unit) + = expr_date_sum (date, quantity, unit, ss_cstr ("closest")); +no_abbrev function DATESUM (date, quantity, string unit, string method) + = expr_date_sum (date, quantity, unit, method); + // String functions. string function CONCAT (string a[n]) @@ -573,7 +573,7 @@ string function RTRIM (string s, string c) function NUMBER (string s, ni_format f) { union value out; - data_in (ss_head (s, f->w), f->type, f->d, 0, &out, 0); + data_in (ss_head (s, f->w), LEGACY_NATIVE, f->type, f->d, 0, 0, &out, 0); return out.f; } @@ -582,11 +582,15 @@ absorb_miss string function STRING (x, no_format f) { union value v; struct substring dst; + char *s; v.f = x; - dst = alloc_string (e, f->w); + assert (!fmt_is_string (f->type)); - data_out (&v, f, dst.string); + s = data_out (&v, f); + dst = alloc_string (e, strlen (s)); + strcpy (dst.string, s); + free (s); return dst; } @@ -613,7 +617,7 @@ absorb_miss string function SUBSTR (string s, ofs, cnt) return empty_string; } -absorb_miss no_opt string function VALUELABEL (var v) +absorb_miss no_opt no_abbrev string function VALUELABEL (var v) expression e; case c; { @@ -647,7 +651,7 @@ function PDF.BETA (x >= 0 && x <= 1, a > 0, b > 0) = gsl_ran_beta_pdf (x, a, b); function CDF.BETA (x >= 0 && x <= 1, a > 0, b > 0) = gsl_cdf_beta_P (x, a, b); function IDF.BETA (P >= 0 && P <= 1, a > 0, b > 0) - = gslextras_cdf_beta_Pinv (P, a, b); + = gsl_cdf_beta_Pinv (P, a, b); no_opt function RV.BETA (a > 0, b > 0) = gsl_ran_beta (get_rng (), a, b); function NCDF.BETA (x >= 0, a > 0, b > 0, lambda > 0) = ncdf_beta (x, a, b, lambda); @@ -850,7 +854,7 @@ no_opt function RV.BERNOULLI (p >= 0 && p <= 1) // Binomial distribution. function CDF.BINOM (k, n > 0 && n == floor (n), p >= 0 && p <= 1) - = gslextras_cdf_binomial_P (k, p, n); + = gsl_cdf_binomial_P (k, p, n); function PDF.BINOM (k >= 0 && k == floor (k) && k <= n, n > 0 && n == floor (n), p >= 0 && p <= 1) @@ -860,7 +864,7 @@ no_opt function RV.BINOM (p > 0 && p == floor (p), n >= 0 && n <= 1) // Geometric distribution. function CDF.GEOM (k >= 1 && k == floor (k), p >= 0 && p <= 1) - = gslextras_cdf_geometric_P (k, p); + = gsl_cdf_geometric_P (k, p); function PDF.GEOM (k >= 1 && k == floor (k), p >= 0 && p <= 1) = gsl_ran_geometric_pdf (k, p); @@ -871,7 +875,7 @@ function CDF.HYPER (k >= 0 && k == floor (k) && k <= c, a > 0 && a == floor (a), b > 0 && b == floor (b) && b <= a, c > 0 && c == floor (c) && c <= a) - = gslextras_cdf_hypergeometric_P (k, c, a - c, b); + = gsl_cdf_hypergeometric_P (k, c, a - c, b); function PDF.HYPER (k >= 0 && k == floor (k) && k <= c, a > 0 && a == floor (a), b > 0 && b == floor (b) && b <= a, @@ -890,7 +894,7 @@ no_opt extension function RV.LOG (p > 0 && p <= 1) // Negative binomial distribution. function CDF.NEGBIN (k >= 1, n == floor (n), p > 0 && p <= 1) - = gslextras_cdf_negative_binomial_P (k, p, n); + = gsl_cdf_negative_binomial_P (k, p, n); function PDF.NEGBIN (k >= 1, n == floor (n), p > 0 && p <= 1) = gsl_ran_negative_binomial_pdf (k, p, n); no_opt function RV.NEGBIN (n == floor (n), p > 0 && p <= 1) @@ -898,7 +902,7 @@ no_opt function RV.NEGBIN (n == floor (n), p > 0 && p <= 1) // Poisson distribution. function CDF.POISSON (k >= 0 && k == floor (k), mu > 0) - = gslextras_cdf_poisson_P (k, mu); + = gsl_cdf_poisson_P (k, mu); function PDF.POISSON (k >= 0 && k == floor (k), mu > 0) = gsl_ran_poisson_pdf (k, mu); no_opt function RV.POISSON (mu > 0) = gsl_ran_poisson (get_rng (), mu); @@ -925,7 +929,7 @@ no_opt operator VEC_ELEM_NUM (idx) { const struct variable *var = vector_get_var (v, (size_t) idx - 1); double value = case_num (c, var); - return !var_is_num_user_missing (var, value) ? value : SYSMIS; + return !var_is_num_missing (var, value, MV_USER) ? value : SYSMIS; } else { @@ -972,7 +976,7 @@ no_opt operator NUM_VAR () num_var v; { double d = case_num (c, v); - return !var_is_num_user_missing (v, d) ? d : SYSMIS; + return !var_is_num_missing (v, d, MV_USER) ? d : SYSMIS; } no_opt string operator STR_VAR () @@ -988,11 +992,11 @@ no_opt string operator STR_VAR () no_opt perm_only function LAG (num_var v, pos_int n_before) dataset ds; { - struct ccase *c = lagged_case (ds, n_before); + const struct ccase *c = lagged_case (ds, n_before); if (c != NULL) { double x = case_num (c, v); - return !var_is_num_user_missing (v, x) ? x : SYSMIS; + return !var_is_num_missing (v, x, MV_USER) ? x : SYSMIS; } else return SYSMIS; @@ -1001,11 +1005,11 @@ no_opt perm_only function LAG (num_var v, pos_int n_before) no_opt perm_only function LAG (num_var v) dataset ds; { - struct ccase *c = lagged_case (ds, 1); + const struct ccase *c = lagged_case (ds, 1); if (c != NULL) { double x = case_num (c, v); - return !var_is_num_user_missing (v, x) ? x : SYSMIS; + return !var_is_num_missing (v, x, MV_USER) ? x : SYSMIS; } else return SYSMIS; @@ -1015,7 +1019,7 @@ no_opt perm_only string function LAG (str_var v, pos_int n_before) expression e; dataset ds; { - struct ccase *c = lagged_case (ds, n_before); + const struct ccase *c = lagged_case (ds, n_before); if (c != NULL) return copy_string (e, case_str (c, v), var_get_width (v)); else @@ -1026,7 +1030,7 @@ no_opt perm_only string function LAG (str_var v) expression e; dataset ds; { - struct ccase *c = lagged_case (ds, 1); + const struct ccase *c = lagged_case (ds, 1); if (c != NULL) return copy_string (e, case_str (c, v), var_get_width (v)); else