summaryrefslogtreecommitdiff
path: root/libchill/abstime.c
diff options
context:
space:
mode:
Diffstat (limited to 'libchill/abstime.c')
-rw-r--r--libchill/abstime.c131
1 files changed, 131 insertions, 0 deletions
diff --git a/libchill/abstime.c b/libchill/abstime.c
new file mode 100644
index 00000000000..2933fa83e9d
--- /dev/null
+++ b/libchill/abstime.c
@@ -0,0 +1,131 @@
+/* Implement timing-related runtime actions for CHILL.
+ Copyright (C) 1992,1993 Free Software Foundation, Inc.
+ Author: Wilfried Moser
+
+This file is part of GNU CC.
+
+GNU CC 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, or (at your option)
+any later version.
+
+GNU CC 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 GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#include <time.h>
+#include "rtltypes.h"
+
+EXCEPTION (rangefail);
+
+#define SECOND_VALID 1
+#define MINUTE_VALID 2
+#define HOUR_VALID 4
+#define DAY_VALID 8
+#define MONTH_VALID 16
+#define YEAR_VALID 32
+
+extern void __cause_ex1 (char *ex, char *file, int lineno);
+
+#define CAUSE_RANGEFAIL __cause_ex1 ("rangefail", filename, lineno)
+
+/*
+ * function _abstime
+ *
+ * parameters:
+ * mask - mask of valid values
+ * year
+ * month
+ * day
+ * hour
+ * minute
+ * second
+ *
+ * returns:
+ * unsigned long
+ *
+ * exceptions:
+ * rangefail
+ *
+ * abstract:
+ * perform the ABSTIME builtin call
+ *
+ */
+
+unsigned long
+_abstime (mask, year, month, day, hour, minute, second,
+ filename, lineno)
+ int mask, year, month, day, hour, minute, second;
+ char *filename;
+ int lineno;
+{
+ struct tm *time_str;
+ time_t result, current_time;
+
+ /* first of all get current time */
+ if ((current_time = time (0)) == (time_t)-1)
+ /* FIXME: what excpetion ?? */
+ CAUSE_RANGEFAIL;
+
+ /* if we just have to determine the current time, we are ready.
+ This is shown by mask == 0. */
+ if (mask == 0)
+ return (unsigned long)current_time;
+
+ /* convert current time to struct tm */
+ time_str = localtime (&current_time);
+
+ if (mask & YEAR_VALID)
+ {
+ if (year < 1900)
+ CAUSE_RANGEFAIL;
+ time_str->tm_year = year - 1900;
+ }
+
+ if (mask & MONTH_VALID)
+ {
+ if (month < 1 || month > 12)
+ CAUSE_RANGEFAIL;
+ time_str->tm_mon = month - 1;
+ }
+
+ if (mask & DAY_VALID)
+ {
+ if (day < 1 || day > 31)
+ CAUSE_RANGEFAIL;
+ time_str->tm_mday = day;
+ }
+
+ if (mask & HOUR_VALID)
+ {
+ if (hour < 0 || hour > 23)
+ CAUSE_RANGEFAIL;
+ time_str->tm_hour = hour;
+ }
+
+ if (mask & MINUTE_VALID)
+ {
+ if (minute < 0 || minute > 59)
+ CAUSE_RANGEFAIL;
+ time_str->tm_min = minute;
+ }
+
+ if (mask & SECOND_VALID)
+ {
+ if (second < 0 || second > 59)
+ CAUSE_RANGEFAIL;
+ time_str->tm_sec = second;
+ }
+
+ /* do it */
+ time_str->tm_isdst = -1;
+ if ((result = mktime (time_str)) == (time_t)-1)
+ CAUSE_RANGEFAIL;
+
+ return (unsigned long)result;
+}