409 lines
8 KiB
C
409 lines
8 KiB
C
![]() |
/* wraptime.c provides access to time related system calls.
|
||
|
|
||
|
Copyright (C) 2009-2022 Free Software Foundation, Inc.
|
||
|
Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
|
||
|
|
||
|
This file is part of GNU Modula-2.
|
||
|
|
||
|
GNU Modula-2 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, or (at your option)
|
||
|
any later version.
|
||
|
|
||
|
GNU Modula-2 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.
|
||
|
|
||
|
Under Section 7 of GPL version 3, you are granted additional
|
||
|
permissions described in the GCC Runtime Library Exception, version
|
||
|
3.1, as published by the Free Software Foundation.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License and
|
||
|
a copy of the GCC Runtime Library Exception along with this program;
|
||
|
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||
|
<http://www.gnu.org/licenses/>. */
|
||
|
|
||
|
#include "config.h"
|
||
|
|
||
|
#if defined(HAVE_SYS_TYPES_H)
|
||
|
#include "sys/types.h"
|
||
|
#endif
|
||
|
|
||
|
#if defined(HAVE_SYS_TIME_H)
|
||
|
#include "sys/time.h"
|
||
|
#endif
|
||
|
|
||
|
#if defined(HAVE_TIME_H)
|
||
|
#include "time.h"
|
||
|
#endif
|
||
|
|
||
|
#if defined(HAVE_MALLOC_H)
|
||
|
#include "malloc.h"
|
||
|
#endif
|
||
|
|
||
|
#if defined(HAVE_LIMITS_H)
|
||
|
#include "limits.h"
|
||
|
#endif
|
||
|
|
||
|
#if !defined(TRUE)
|
||
|
#define TRUE (1 == 1)
|
||
|
#endif
|
||
|
|
||
|
#if !defined(FALSE)
|
||
|
#define FALSE (1 == 0)
|
||
|
#endif
|
||
|
|
||
|
#if !defined(NULL)
|
||
|
#define NULL (void *)0
|
||
|
#endif
|
||
|
|
||
|
/* InitTimeval returns a newly created opaque type. */
|
||
|
|
||
|
#if defined(HAVE_TIMEVAL) && defined(HAVE_MALLOC_H)
|
||
|
struct timeval *
|
||
|
wraptime_InitTimeval (void)
|
||
|
{
|
||
|
return (struct timeval *)malloc (sizeof (struct timeval));
|
||
|
}
|
||
|
#else
|
||
|
void *
|
||
|
wraptime_InitTimeval (void)
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* KillTimeval deallocates the memory associated with an opaque type. */
|
||
|
|
||
|
struct timeval *
|
||
|
wraptime_KillTimeval (void *tv)
|
||
|
{
|
||
|
#if defined(HAVE_MALLOC_H)
|
||
|
free (tv);
|
||
|
#endif
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
/* InitTimezone returns a newly created opaque type. */
|
||
|
|
||
|
#if defined(HAVE_STRUCT_TIMEZONE) && defined(HAVE_MALLOC_H)
|
||
|
struct timezone *
|
||
|
wraptime_InitTimezone (void)
|
||
|
{
|
||
|
return (struct timezone *)malloc (sizeof (struct timezone));
|
||
|
}
|
||
|
#else
|
||
|
void *
|
||
|
wraptime_InitTimezone (void)
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* KillTimezone - deallocates the memory associated with an opaque
|
||
|
type. */
|
||
|
|
||
|
struct timezone *
|
||
|
wraptime_KillTimezone (struct timezone *tv)
|
||
|
{
|
||
|
#if defined(HAVE_MALLOC_H)
|
||
|
free (tv);
|
||
|
#endif
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
/* InitTM - returns a newly created opaque type. */
|
||
|
|
||
|
#if defined(HAVE_STRUCT_TM) && defined(HAVE_MALLOC_H)
|
||
|
struct tm *
|
||
|
wraptime_InitTM (void)
|
||
|
{
|
||
|
return (struct tm *)malloc (sizeof (struct tm));
|
||
|
}
|
||
|
#else
|
||
|
void *
|
||
|
wraptime_InitTM (void)
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* KillTM - deallocates the memory associated with an opaque type. */
|
||
|
|
||
|
struct tm *
|
||
|
wraptime_KillTM (struct tm *tv)
|
||
|
{
|
||
|
#if defined(HAVE_MALLOC_H)
|
||
|
free (tv);
|
||
|
#endif
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
/* gettimeofday - calls gettimeofday(2) with the same parameters, tv,
|
||
|
and, tz. It returns 0 on success. */
|
||
|
|
||
|
#if defined(HAVE_STRUCT_TIMEZONE) && defined(HAVE_GETTIMEOFDAY)
|
||
|
int
|
||
|
wraptime_gettimeofday (void *tv, struct timezone *tz)
|
||
|
{
|
||
|
return gettimeofday (tv, tz);
|
||
|
}
|
||
|
#else
|
||
|
int
|
||
|
wraptime_gettimeofday (void *tv, void *tz)
|
||
|
{
|
||
|
return -1;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* settimeofday - calls settimeofday(2) with the same parameters, tv,
|
||
|
and, tz. It returns 0 on success. */
|
||
|
|
||
|
#if defined(HAVE_STRUCT_TIMEZONE) && defined(HAVE_SETTIMEOFDAY)
|
||
|
int
|
||
|
wraptime_settimeofday (void *tv, struct timezone *tz)
|
||
|
{
|
||
|
return settimeofday (tv, tz);
|
||
|
}
|
||
|
#else
|
||
|
int
|
||
|
wraptime_settimeofday (void *tv, void *tz)
|
||
|
{
|
||
|
return -1;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* wraptime_GetFractions - returns the tv_usec field inside the
|
||
|
timeval structure. */
|
||
|
|
||
|
#if defined(HAVE_TIMEVAL)
|
||
|
unsigned int
|
||
|
wraptime_GetFractions (struct timeval *tv)
|
||
|
{
|
||
|
return (unsigned int)tv->tv_usec;
|
||
|
}
|
||
|
#else
|
||
|
unsigned int
|
||
|
wraptime_GetFractions (void *tv)
|
||
|
{
|
||
|
return (unsigned int)-1;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* localtime_r - returns the tm parameter, m, after it has been
|
||
|
assigned with appropriate contents determined by, tv. Notice that
|
||
|
this procedure function expects, timeval, as its first parameter
|
||
|
and not a time_t (as expected by the posix equivalent). */
|
||
|
|
||
|
#if defined(HAVE_TIMEVAL)
|
||
|
struct tm *
|
||
|
wraptime_localtime_r (struct timeval *tv, struct tm *m)
|
||
|
{
|
||
|
return localtime_r (&tv->tv_sec, m);
|
||
|
}
|
||
|
#else
|
||
|
struct tm *
|
||
|
wraptime_localtime_r (void *tv, struct tm *m)
|
||
|
{
|
||
|
return m;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* wraptime_GetYear - returns the year from the structure, m. */
|
||
|
|
||
|
#if defined(HAVE_STRUCT_TM)
|
||
|
unsigned int
|
||
|
wraptime_GetYear (struct tm *m)
|
||
|
{
|
||
|
return m->tm_year;
|
||
|
}
|
||
|
#else
|
||
|
unsigned int
|
||
|
wraptime_GetYear (void *m)
|
||
|
{
|
||
|
return (unsigned int)-1;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* wraptime_GetMonth - returns the month from the structure, m. */
|
||
|
|
||
|
#if defined(HAVE_STRUCT_TM)
|
||
|
unsigned int
|
||
|
wraptime_GetMonth (struct tm *m)
|
||
|
{
|
||
|
return m->tm_mon;
|
||
|
}
|
||
|
#else
|
||
|
unsigned int
|
||
|
wraptime_GetMonth (void *m)
|
||
|
{
|
||
|
return (unsigned int)-1;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* wraptime_GetDay - returns the day of the month from the structure,
|
||
|
m. */
|
||
|
|
||
|
#if defined(HAVE_STRUCT_TM)
|
||
|
unsigned int
|
||
|
wraptime_GetDay (struct tm *m)
|
||
|
{
|
||
|
return m->tm_mday;
|
||
|
}
|
||
|
#else
|
||
|
unsigned int
|
||
|
wraptime_GetDay (void *m)
|
||
|
{
|
||
|
return (unsigned int)-1;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* wraptime_GetHour - returns the hour of the day from the structure,
|
||
|
m. */
|
||
|
|
||
|
#if defined(HAVE_STRUCT_TM)
|
||
|
unsigned int
|
||
|
wraptime_GetHour (struct tm *m)
|
||
|
{
|
||
|
return m->tm_hour;
|
||
|
}
|
||
|
#else
|
||
|
unsigned int
|
||
|
wraptime_GetHour (void *m)
|
||
|
{
|
||
|
return (unsigned int)-1;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* wraptime_GetMinute - returns the minute within the hour from the
|
||
|
structure, m. */
|
||
|
|
||
|
#if defined(HAVE_STRUCT_TM)
|
||
|
unsigned int
|
||
|
wraptime_GetMinute (struct tm *m)
|
||
|
{
|
||
|
return m->tm_min;
|
||
|
}
|
||
|
#else
|
||
|
unsigned int
|
||
|
wraptime_GetMinute (void *m)
|
||
|
{
|
||
|
return (unsigned int)-1;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* wraptime_GetSecond - returns the seconds in the minute from the
|
||
|
structure, m. The return value will always be in the range 0..59.
|
||
|
A leap minute of value 60 will be truncated to 59. */
|
||
|
|
||
|
#if defined(HAVE_STRUCT_TM)
|
||
|
unsigned int
|
||
|
wraptime_GetSecond (struct tm *m)
|
||
|
{
|
||
|
if (m->tm_sec == 60)
|
||
|
return 59;
|
||
|
else
|
||
|
return m->tm_sec;
|
||
|
}
|
||
|
#else
|
||
|
unsigned int
|
||
|
wraptime_GetSecond (void *m)
|
||
|
{
|
||
|
return (unsigned int)-1;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* wraptime_GetSummerTime - returns true if summer time is in effect. */
|
||
|
|
||
|
#if defined(HAVE_STRUCT_TIMEZONE)
|
||
|
unsigned int
|
||
|
wraptime_GetSummerTime (struct timezone *tz)
|
||
|
{
|
||
|
return tz->tz_dsttime != 0;
|
||
|
}
|
||
|
#else
|
||
|
unsigned int
|
||
|
wraptime_GetSummerTime (void *tz)
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* wraptime_GetDST - returns the number of minutes west of GMT. */
|
||
|
|
||
|
#if defined(HAVE_STRUCT_TIMEZONE)
|
||
|
int
|
||
|
wraptime_GetDST (struct timezone *tz)
|
||
|
{
|
||
|
return tz->tz_minuteswest;
|
||
|
}
|
||
|
#else
|
||
|
int
|
||
|
wraptime_GetDST (void *tz)
|
||
|
{
|
||
|
#if defined(INT_MIN)
|
||
|
return INT_MIN;
|
||
|
#else
|
||
|
return (int)((unsigned int)-1);
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* SetTimezone - set the timezone field inside timeval, tv. */
|
||
|
|
||
|
#if defined(HAVE_STRUCT_TIMEZONE)
|
||
|
void
|
||
|
wraptime_SetTimezone (struct timezone *tz, int zone, int minuteswest)
|
||
|
{
|
||
|
tz->tz_dsttime = zone;
|
||
|
tz->tz_minuteswest = minuteswest;
|
||
|
}
|
||
|
#else
|
||
|
void
|
||
|
wraptime_SetTimezone (void *tz, int zone, int minuteswest)
|
||
|
{
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* SetTimeval - sets the fields in tm, t, with: second, minute, hour,
|
||
|
day, month, year, fractions. */
|
||
|
|
||
|
#if defined(HAVE_TIMEVAL)
|
||
|
void
|
||
|
wraptime_SetTimeval (struct tm *t, unsigned int second, unsigned int minute,
|
||
|
unsigned int hour, unsigned int day, unsigned int month,
|
||
|
unsigned int year, unsigned int yday, unsigned int wday,
|
||
|
unsigned int isdst)
|
||
|
{
|
||
|
t->tm_sec = second;
|
||
|
t->tm_min = minute;
|
||
|
t->tm_hour = hour;
|
||
|
t->tm_mday = day;
|
||
|
t->tm_mon = month;
|
||
|
t->tm_year = year;
|
||
|
t->tm_yday = yday;
|
||
|
t->tm_wday = wday;
|
||
|
t->tm_isdst = isdst;
|
||
|
}
|
||
|
#else
|
||
|
void
|
||
|
wraptime_SetTimeval (void *t, unsigned int second, unsigned int minute,
|
||
|
unsigned int hour, unsigned int day, unsigned int month,
|
||
|
unsigned int year, unsigned int yday, unsigned int wday,
|
||
|
unsigned int isdst)
|
||
|
{
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* init - init/finish functions for the module */
|
||
|
|
||
|
void
|
||
|
_M2_wraptime_init ()
|
||
|
{
|
||
|
}
|
||
|
void
|
||
|
_M2_wraptime_fini ()
|
||
|
{
|
||
|
}
|