Make the missing value code do more work, so that its callers can do
[pspp-builds.git] / src / language / expressions / operations.def
index 6f0bd0e1430a3f4bcbf1a0742fef8303bb6918ab..be33a0d96aa989167b7d7dec7293200091705d93 100644 (file)
@@ -2,7 +2,6 @@
 //
 // PSPP - computes sample statistics.
 // Copyright (C) 2005, 2006 Free Software Foundation, Inc.
-// Written by Ben Pfaff <blp@gnu.org>.
 // 
 // This program is free software; you can redistribute it and/or
 // modify it under the terms of the GNU General Public License as
@@ -319,10 +318,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])
@@ -613,7 +615,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;
 {
@@ -925,7 +927,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 +974,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 ()
@@ -992,7 +994,7 @@ no_opt perm_only function LAG (num_var v, pos_int 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;
@@ -1005,7 +1007,7 @@ no_opt perm_only function LAG (num_var v)
   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;