-function DATE.DMY (d, m, y) = expr_ymd_to_date (y, m, d);
-function DATE.MDY (m, d, y) = expr_ymd_to_date (y, m, d);
-function DATE.MOYR (m, y) = expr_ymd_to_date (y, m, 1);
-function DATE.QYR (q, y) = expr_ymd_to_date (y, q * 3 - 2, 1);
-function DATE.WKYR (w, y) = expr_wkyr_to_date (w, y);
-function DATE.YRDAY (y, yday) = expr_yrday_to_date (y, yday);
-function YRMODA (y, m, d) = expr_yrmoda (y, m, d);
+function DATE.DMY (integer d, integer m, integer y)
+ expression e;
+ expr_node n;
+= expr_ymd_to_date (y, m, d, e, n, 3, 2, 1);
+
+function DATE.MDY (integer m, integer d, integer y)
+ expression e;
+ expr_node n;
+= expr_ymd_to_date (y, m, d, e, n, 3, 1, 2);
+
+function DATE.MOYR (integer m, integer y)
+ expression e;
+ expr_node n;
+= expr_ymd_to_date (y, m, 1, e, n, 2, 1, 0);
+
+function DATE.QYR (integer q, integer y)
+ expression e;
+ expr_node n;
+{
+ if (q < 1 || q > 4)
+ {
+ msg_at (SW, expr_location (e, n->args[0]),
+ _("Argument 1 to DATE.QYR must be 1, 2, 3, or 4 (not %d)."), q);
+ return SYSMIS;
+ }
+ return expr_ymd_to_date (y, q * 3 - 2, 1, e, n, 2, 0, 0);
+}
+
+function DATE.WKYR (integer w, integer y)
+ expression e;
+ expr_node n;
+{
+ if (w < 1 || w > 53)
+ {
+ msg_at (SE, expr_location (e, n->args[0]),
+ _("The week argument to DATE.WKYR is outside the acceptable "
+ "range of 1 to 53. The result will be system-missing."));
+ return SYSMIS;
+ }
+ else
+ {
+ double yr_1_1 = expr_ymd_to_ofs (y, 1, 1, e, n, 2, 0, 0);
+ if (yr_1_1 != SYSMIS)
+ return DAY_S * (yr_1_1 + WEEK_DAY * (w - 1));
+ else
+ return SYSMIS;
+ }
+}
+
+function DATE.YRDAY (integer y, integer yd)
+ expression e;
+ expr_node n;
+{
+ if (yd < 1 || yd > 366)
+ {
+ msg_at (SE, expr_location (e, n->args[1]),
+ _("The value %d as day argument to DATE.YRDAY is outside the "
+ "acceptable range of 1 to 366. "
+ "The result will be system-missing."), yd);
+ return SYSMIS;
+ }
+ else
+ {
+ double yr_1_1 = expr_ymd_to_ofs (y, 1, 1, e, n, 1, 0, 0);
+ if (yr_1_1 != SYSMIS)
+ return DAY_S * (yr_1_1 + yd - 1.);
+ else
+ return SYSMIS;
+ }
+}
+
+function YRMODA (integer y, integer m, integer d)
+ expression e;
+ expr_node n;
+{
+ if (y >= 0 && y <= 99)
+ y += 1900;
+ else if (y > 47516)
+ {
+ msg_at (SE, expr_location (e, n->args[0]),
+ _("The year argument to YRMODA is greater than 47516. "
+ "The result will be system-missing."));
+ return SYSMIS;
+ }
+
+ return expr_ymd_to_ofs (y, m, d, e, n, 1, 2, 3);
+}