132 lines
2.9 KiB
C
132 lines
2.9 KiB
C
/* 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 (¤t_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;
|
|
}
|