import from github
This commit is contained in:
64
agbcc/libc/time/asctime.c
Normal file
64
agbcc/libc/time/asctime.c
Normal file
@ -0,0 +1,64 @@
|
||||
/*
|
||||
* asctime.c
|
||||
* Original Author: G. Haley
|
||||
*
|
||||
* Converts the broken down time in the structure pointed to by tim_p into a
|
||||
* string of the form
|
||||
*
|
||||
* Wed Jun 15 11:38:07 1988\n\0
|
||||
*
|
||||
* Returns a pointer to the string.
|
||||
*/
|
||||
|
||||
/*
|
||||
FUNCTION
|
||||
<<asctime>>---format time as string
|
||||
|
||||
INDEX
|
||||
asctime
|
||||
INDEX
|
||||
_asctime_r
|
||||
|
||||
ANSI_SYNOPSIS
|
||||
#include <time.h>
|
||||
char *asctime(const struct tm *<[clock]>);
|
||||
char *asctime_r(const struct tm *<[clock]>, char *<[buf]>);
|
||||
|
||||
TRAD_SYNOPSIS
|
||||
#include <time.h>
|
||||
char *asctime(<[clock]>)
|
||||
struct tm *<[clock]>;
|
||||
char *asctime_r(<[clock]>)
|
||||
struct tm *<[clock]>;
|
||||
char *<[buf]>;
|
||||
|
||||
DESCRIPTION
|
||||
Format the time value at <[clock]> into a string of the form
|
||||
. Wed Jun 15 11:38:07 1988\n\0
|
||||
The string is generated in a static buffer; each call to <<asctime>>
|
||||
overwrites the string generated by previous calls.
|
||||
|
||||
RETURNS
|
||||
A pointer to the string containing a formatted timestamp.
|
||||
|
||||
PORTABILITY
|
||||
ANSI C requires <<asctime>>.
|
||||
|
||||
<<asctime>> requires no supporting OS subroutines.
|
||||
*/
|
||||
|
||||
#include <time.h>
|
||||
#include <_ansi.h>
|
||||
#include <reent.h>
|
||||
|
||||
#ifndef _REENT_ONLY
|
||||
|
||||
char *
|
||||
_DEFUN (asctime, (tim_p),
|
||||
_CONST struct tm *tim_p)
|
||||
{
|
||||
char *buf = _REENT->_new._reent._asctime_buf;
|
||||
return asctime_r (tim_p, buf);
|
||||
}
|
||||
|
||||
#endif
|
27
agbcc/libc/time/asctime_r.c
Normal file
27
agbcc/libc/time/asctime_r.c
Normal file
@ -0,0 +1,27 @@
|
||||
/*
|
||||
* asctime_r.c
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
char *
|
||||
_DEFUN (asctime_r, (tim_p, result),
|
||||
_CONST struct tm *tim_p _AND
|
||||
char *result)
|
||||
{
|
||||
static _CONST char day_name[7][3] = {
|
||||
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
|
||||
};
|
||||
static _CONST char mon_name[12][3] = {
|
||||
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
||||
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
|
||||
};
|
||||
|
||||
sprintf (result, "%.3s %.3s %.2d %.2d:%.2d:%.2d %d\n",
|
||||
day_name[tim_p->tm_wday],
|
||||
mon_name[tim_p->tm_mon],
|
||||
tim_p->tm_mday, tim_p->tm_hour, tim_p->tm_min,
|
||||
tim_p->tm_sec, 1900 + tim_p->tm_year);
|
||||
return result;
|
||||
}
|
69
agbcc/libc/time/clock.c
Normal file
69
agbcc/libc/time/clock.c
Normal file
@ -0,0 +1,69 @@
|
||||
/* NetWare can not use this implementation of clock, since it does not
|
||||
have times or any similar function. It provides its own version of
|
||||
clock in clib.nlm. If we can not use clib.nlm, then we must write
|
||||
clock in sys/netware. */
|
||||
|
||||
#ifdef CLOCK_PROVIDED
|
||||
|
||||
int _dummy_clock = 1;
|
||||
|
||||
#else
|
||||
|
||||
/*
|
||||
* clock.c
|
||||
* Original Author: G. Haley
|
||||
*
|
||||
* Determines the processor time used by the program since invocation. The time
|
||||
* in seconds is the value returned divided by the value of the macro CLK_TCK.
|
||||
* If the processor time used is not available, (clock_t) -1 is returned.
|
||||
*/
|
||||
|
||||
/*
|
||||
FUNCTION
|
||||
<<clock>>---cumulative processor time
|
||||
|
||||
INDEX
|
||||
clock
|
||||
|
||||
ANSI_SYNOPSIS
|
||||
#include <time.h>
|
||||
clock_t clock(void);
|
||||
|
||||
TRAD_SYNOPSIS
|
||||
#include <time.h>
|
||||
clock_t clock();
|
||||
|
||||
DESCRIPTION
|
||||
Calculates the best available approximation of the cumulative amount
|
||||
of time used by your program since it started. To convert the result
|
||||
into seconds, divide by the macro <<CLOCKS_PER_SEC>>.
|
||||
|
||||
RETURNS
|
||||
The amount of processor time used so far by your program, in units
|
||||
defined by the machine-dependent macro <<CLOCKS_PER_SEC>>. If no
|
||||
measurement is available, the result is <<-1>>.
|
||||
|
||||
PORTABILITY
|
||||
ANSI C requires <<clock>> and <<CLOCKS_PER_SEC>>.
|
||||
|
||||
Supporting OS subroutine required: <<times>>.
|
||||
*/
|
||||
|
||||
#include <time.h>
|
||||
#include <sys/times.h>
|
||||
#include <reent.h>
|
||||
|
||||
clock_t
|
||||
clock ()
|
||||
{
|
||||
struct tms tim_s;
|
||||
clock_t res;
|
||||
|
||||
if ((res = (clock_t) _times_r (_REENT, &tim_s)) != -1)
|
||||
res = (clock_t) (tim_s.tms_utime + tim_s.tms_stime +
|
||||
tim_s.tms_cutime + tim_s.tms_cstime);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
#endif /* CLOCK_PROVIDED */
|
52
agbcc/libc/time/ctime.c
Normal file
52
agbcc/libc/time/ctime.c
Normal file
@ -0,0 +1,52 @@
|
||||
/*
|
||||
* ctime.c
|
||||
* Original Author: G. Haley
|
||||
*/
|
||||
|
||||
/*
|
||||
FUNCTION
|
||||
<<ctime>>---convert time to local and format as string
|
||||
|
||||
INDEX
|
||||
ctime
|
||||
|
||||
ANSI_SYNOPSIS
|
||||
#include <time.h>
|
||||
char *ctime(time_t <[clock]>);
|
||||
char *ctime_r(time_t <[clock]>, char *<[buf]>);
|
||||
|
||||
TRAD_SYNOPSIS
|
||||
#include <time.h>
|
||||
char *ctime(<[clock]>)
|
||||
time_t <[clock]>;
|
||||
char *ctime_r(<[clock]>, <[buf]>)
|
||||
time_t <[clock]>;
|
||||
char *<[buf]>;
|
||||
|
||||
DESCRIPTION
|
||||
Convert the time value at <[clock]> to local time (like <<localtime>>)
|
||||
and format it into a string of the form
|
||||
. Wed Jun 15 11:38:07 1988\n\0
|
||||
(like <<asctime>>).
|
||||
|
||||
RETURNS
|
||||
A pointer to the string containing a formatted timestamp.
|
||||
|
||||
PORTABILITY
|
||||
ANSI C requires <<ctime>>.
|
||||
|
||||
<<ctime>> requires no supporting OS subroutines.
|
||||
*/
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#ifndef _REENT_ONLY
|
||||
|
||||
char *
|
||||
_DEFUN (ctime, (tim_p),
|
||||
_CONST time_t * tim_p)
|
||||
{
|
||||
return asctime (localtime (tim_p));
|
||||
}
|
||||
|
||||
#endif
|
15
agbcc/libc/time/ctime_r.c
Normal file
15
agbcc/libc/time/ctime_r.c
Normal file
@ -0,0 +1,15 @@
|
||||
/*
|
||||
* ctime_r.c
|
||||
*/
|
||||
|
||||
#include <time.h>
|
||||
|
||||
char *
|
||||
_DEFUN (ctime_r, (tim_p, result),
|
||||
_CONST time_t * tim_p _AND
|
||||
char * result)
|
||||
|
||||
{
|
||||
struct tm tm;
|
||||
return asctime_r (localtime_r (tim_p, &tm), result);
|
||||
}
|
44
agbcc/libc/time/difftime.c
Normal file
44
agbcc/libc/time/difftime.c
Normal file
@ -0,0 +1,44 @@
|
||||
/*
|
||||
* difftime.c
|
||||
* Original Author: G. Haley
|
||||
*/
|
||||
|
||||
/*
|
||||
FUNCTION
|
||||
<<difftime>>---subtract two times
|
||||
|
||||
INDEX
|
||||
difftime
|
||||
|
||||
ANSI_SYNOPSIS
|
||||
#include <time.h>
|
||||
double difftime(time_t <[tim1]>, time_t <[tim2]>);
|
||||
|
||||
TRAD_SYNOPSIS
|
||||
#include <time.h>
|
||||
double difftime(<[tim1]>, <[tim2]>)
|
||||
time_t <[tim1]>;
|
||||
time_t <[tim2]>;
|
||||
|
||||
DESCRIPTION
|
||||
Subtracts the two times in the arguments: `<<<[tim1]> - <[tim2]>>>'.
|
||||
|
||||
RETURNS
|
||||
The difference (in seconds) between <[tim2]> and <[tim1]>, as a <<double>>.
|
||||
|
||||
PORTABILITY
|
||||
ANSI C requires <<difftime>>, and defines its result to be in seconds
|
||||
in all implementations.
|
||||
|
||||
<<difftime>> requires no supporting OS subroutines.
|
||||
*/
|
||||
|
||||
#include <time.h>
|
||||
|
||||
double
|
||||
_DEFUN (difftime, (tim1, tim2),
|
||||
time_t tim1 _AND
|
||||
time_t tim2)
|
||||
{
|
||||
return ((double) tim1 - tim2);
|
||||
}
|
67
agbcc/libc/time/gmtime.c
Normal file
67
agbcc/libc/time/gmtime.c
Normal file
@ -0,0 +1,67 @@
|
||||
/*
|
||||
* gmtime.c
|
||||
* Original Author: G. Haley
|
||||
*
|
||||
* Converts the calendar time pointed to by tim_p into a broken-down time
|
||||
* expressed as Greenwich Mean Time (GMT). Returns a pointer to a structure
|
||||
* containing the broken-down time, or a null pointer if GMT is not
|
||||
* available.
|
||||
*/
|
||||
|
||||
/*
|
||||
FUNCTION
|
||||
<<gmtime>>---convert time to UTC traditional form
|
||||
|
||||
INDEX
|
||||
gmtime
|
||||
|
||||
ANSI_SYNOPSIS
|
||||
#include <time.h>
|
||||
struct tm *gmtime(const time_t *<[clock]>);
|
||||
struct tm *gmtime_r(const time_t *<[clock]>, struct tm *<[res]>);
|
||||
|
||||
TRAD_SYNOPSIS
|
||||
#include <time.h>
|
||||
struct tm *gmtime(<[clock]>)
|
||||
const time_t *<[clock]>;
|
||||
struct tm *gmtime_r(<[clock]>, <[res]>)
|
||||
const time_t *<[clock]>;
|
||||
struct tm *<[res]>;
|
||||
|
||||
DESCRIPTION
|
||||
<<gmtime>> assumes the time at <[clock]> represents a local time.
|
||||
<<gmtime>> converts it to UTC (Universal Coordinated Time, also known in some
|
||||
countries as GMT, Greenwich Mean time), then converts the
|
||||
representation from the arithmetic representation to
|
||||
the traditional representation defined by <<struct tm>>.
|
||||
|
||||
<<gmtime>> constructs the traditional time representation in static
|
||||
storage; each call to <<gmtime>> or <<localtime>> will overwrite the
|
||||
information generated by previous calls to either function.
|
||||
|
||||
RETURNS
|
||||
A pointer to the traditional time representation (<<struct tm>>).
|
||||
|
||||
PORTABILITY
|
||||
ANSI C requires <<gmtime>>.
|
||||
|
||||
<<gmtime>> requires no supporting OS subroutines.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
#define _GMT_OFFSET 0
|
||||
|
||||
#ifndef _REENT_ONLY
|
||||
|
||||
struct tm *
|
||||
_DEFUN (gmtime, (tim_p),
|
||||
_CONST time_t * tim_p)
|
||||
{
|
||||
time_t tim = *tim_p + _GMT_OFFSET;
|
||||
|
||||
return (localtime (&tim));
|
||||
}
|
||||
|
||||
#endif
|
17
agbcc/libc/time/gmtime_r.c
Normal file
17
agbcc/libc/time/gmtime_r.c
Normal file
@ -0,0 +1,17 @@
|
||||
/*
|
||||
* gmtime_r.c
|
||||
*/
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#define _GMT_OFFSET 0
|
||||
|
||||
struct tm *
|
||||
_DEFUN (gmtime_r, (tim_p, res),
|
||||
_CONST time_t * tim_p _AND
|
||||
struct tm *res)
|
||||
{
|
||||
time_t tim = *tim_p + _GMT_OFFSET;
|
||||
|
||||
return (localtime_r (&tim, res));
|
||||
}
|
57
agbcc/libc/time/lcltime.c
Normal file
57
agbcc/libc/time/lcltime.c
Normal file
@ -0,0 +1,57 @@
|
||||
/*
|
||||
* localtime.c
|
||||
*/
|
||||
|
||||
/*
|
||||
FUNCTION
|
||||
<<localtime>>---convert time to local representation
|
||||
|
||||
INDEX
|
||||
localtime
|
||||
|
||||
ANSI_SYNOPSIS
|
||||
#include <time.h>
|
||||
struct tm *localtime(time_t *<[clock]>);
|
||||
struct tm *localtime_r(time_t *<[clock]>, struct tm *<[res]>);
|
||||
|
||||
TRAD_SYNOPSIS
|
||||
#include <time.h>
|
||||
struct tm *localtime(<[clock]>)
|
||||
time_t *<[clock]>;
|
||||
struct tm *localtime(<[clock]>, <[res]>)
|
||||
time_t *<[clock]>;
|
||||
struct tm *<[res]>;
|
||||
|
||||
DESCRIPTION
|
||||
<<localtime>> converts the time at <[clock]> into local time, then
|
||||
converts its representation from the arithmetic representation to the
|
||||
traditional representation defined by <<struct tm>>.
|
||||
|
||||
<<localtime>> constructs the traditional time representation in static
|
||||
storage; each call to <<gmtime>> or <<localtime>> will overwrite the
|
||||
information generated by previous calls to either function.
|
||||
|
||||
<<mktime>> is the inverse of <<localtime>>.
|
||||
|
||||
RETURNS
|
||||
A pointer to the traditional time representation (<<struct tm>>).
|
||||
|
||||
PORTABILITY
|
||||
ANSI C requires <<localtime>>.
|
||||
|
||||
<<localtime>> requires no supporting OS subroutines.
|
||||
*/
|
||||
|
||||
#include <time.h>
|
||||
#include <reent.h>
|
||||
|
||||
#ifndef _REENT_ONLY
|
||||
|
||||
struct tm *
|
||||
_DEFUN (localtime, (tim_p),
|
||||
_CONST time_t * tim_p)
|
||||
{
|
||||
return localtime_r (tim_p, &(_REENT->_new._reent._localtime_buf));
|
||||
}
|
||||
|
||||
#endif
|
104
agbcc/libc/time/lcltime_r.c
Normal file
104
agbcc/libc/time/lcltime_r.c
Normal file
@ -0,0 +1,104 @@
|
||||
/*
|
||||
* localtime_r.c
|
||||
* Original Author: Adapted from tzcode maintained by Arthur David Olson.
|
||||
*
|
||||
* Converts the calendar time pointed to by tim_p into a broken-down time
|
||||
* expressed as local time. Returns a pointer to a structure containing the
|
||||
* broken-down time.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
#define SECSPERMIN 60L
|
||||
#define MINSPERHOUR 60L
|
||||
#define HOURSPERDAY 24L
|
||||
#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR)
|
||||
#define SECSPERDAY (SECSPERHOUR * HOURSPERDAY)
|
||||
#define DAYSPERWEEK 7
|
||||
#define MONSPERYEAR 12
|
||||
|
||||
#define YEAR_BASE 1900
|
||||
#define EPOCH_YEAR 1970
|
||||
#define EPOCH_WDAY 4
|
||||
|
||||
#define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0)
|
||||
|
||||
static _CONST int mon_lengths[2][MONSPERYEAR] = {
|
||||
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
|
||||
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
|
||||
} ;
|
||||
|
||||
static _CONST int year_lengths[2] = {
|
||||
365,
|
||||
366
|
||||
} ;
|
||||
|
||||
struct tm *
|
||||
_DEFUN (localtime_r, (tim_p, res),
|
||||
_CONST time_t * tim_p _AND
|
||||
struct tm *res)
|
||||
{
|
||||
long days, rem;
|
||||
int y;
|
||||
int yleap;
|
||||
_CONST int *ip;
|
||||
|
||||
days = ((long) *tim_p) / SECSPERDAY;
|
||||
rem = ((long) *tim_p) % SECSPERDAY;
|
||||
while (rem < 0)
|
||||
{
|
||||
rem += SECSPERDAY;
|
||||
--days;
|
||||
}
|
||||
while (rem >= SECSPERDAY)
|
||||
{
|
||||
rem -= SECSPERDAY;
|
||||
++days;
|
||||
}
|
||||
|
||||
/* compute hour, min, and sec */
|
||||
res->tm_hour = (int) (rem / SECSPERHOUR);
|
||||
rem %= SECSPERHOUR;
|
||||
res->tm_min = (int) (rem / SECSPERMIN);
|
||||
res->tm_sec = (int) (rem % SECSPERMIN);
|
||||
|
||||
/* compute day of week */
|
||||
if ((res->tm_wday = ((EPOCH_WDAY + days) % DAYSPERWEEK)) < 0)
|
||||
res->tm_wday += DAYSPERWEEK;
|
||||
|
||||
/* compute year & day of year */
|
||||
y = EPOCH_YEAR;
|
||||
if (days >= 0)
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
yleap = isleap(y);
|
||||
if (days < year_lengths[yleap])
|
||||
break;
|
||||
y++;
|
||||
days -= year_lengths[yleap];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
do
|
||||
{
|
||||
--y;
|
||||
yleap = isleap(y);
|
||||
days += year_lengths[yleap];
|
||||
} while (days < 0);
|
||||
}
|
||||
|
||||
res->tm_year = y - YEAR_BASE;
|
||||
res->tm_yday = days;
|
||||
ip = mon_lengths[yleap];
|
||||
for (res->tm_mon = 0; days >= ip[res->tm_mon]; ++res->tm_mon)
|
||||
days -= ip[res->tm_mon];
|
||||
res->tm_mday = days + 1;
|
||||
|
||||
/* set daylight saving time flag */
|
||||
res->tm_isdst = -1;
|
||||
|
||||
return (res);
|
||||
}
|
204
agbcc/libc/time/mktime.c
Normal file
204
agbcc/libc/time/mktime.c
Normal file
@ -0,0 +1,204 @@
|
||||
/*
|
||||
* mktime.c
|
||||
* Original Author: G. Haley
|
||||
*
|
||||
* Converts the broken-down time, expressed as local time, in the structure
|
||||
* pointed to by tim_p into a calendar time value. The original values of the
|
||||
* tm_wday and tm_yday fields of the structure are ignored, and the original
|
||||
* values of the other fields have no restrictions. On successful completion
|
||||
* the fields of the structure are set to represent the specified calendar
|
||||
* time. Returns the specified calendar time. If the calendar time can not be
|
||||
* represented, returns the value (time_t) -1.
|
||||
*/
|
||||
|
||||
/*
|
||||
FUNCTION
|
||||
<<mktime>>---convert time to arithmetic representation
|
||||
|
||||
INDEX
|
||||
mktime
|
||||
|
||||
ANSI_SYNOPSIS
|
||||
#include <time.h>
|
||||
time_t mktime(struct tm *<[timp]>);
|
||||
|
||||
TRAD_SYNOPSIS
|
||||
#include <time.h>
|
||||
time_t mktime(<[timp]>)
|
||||
struct tm *<[timp]>;
|
||||
|
||||
DESCRIPTION
|
||||
<<mktime>> assumes the time at <[timp]> is a local time, and converts
|
||||
its representation from the traditional representation defined by
|
||||
<<struct tm>> into a representation suitable for arithmetic.
|
||||
|
||||
<<localtime>> is the inverse of <<mktime>>.
|
||||
|
||||
RETURNS
|
||||
If the contents of the structure at <[timp]> do not form a valid
|
||||
calendar time representation, the result is <<-1>>. Otherwise, the
|
||||
result is the time, converted to a <<time_t>> value.
|
||||
|
||||
PORTABILITY
|
||||
ANSI C requires <<mktime>>.
|
||||
|
||||
<<mktime>> requires no supporting OS subroutines.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
#define _SEC_IN_MINUTE 60
|
||||
#define _SEC_IN_HOUR 3600
|
||||
#define _SEC_IN_DAY 86400
|
||||
|
||||
static _CONST int DAYS_IN_MONTH[12] =
|
||||
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
||||
|
||||
#define _DAYS_IN_MONTH(x) ((x == 1) ? days_in_feb : DAYS_IN_MONTH[x])
|
||||
|
||||
static _CONST int _DAYS_BEFORE_MONTH[12] =
|
||||
{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
|
||||
|
||||
#define _ISLEAP(y) (((y) % 4) == 0 && (((y) % 100) != 0 || (((y)+1900) % 400) == 0))
|
||||
#define _DAYS_IN_YEAR(year) (_ISLEAP(year) ? 366 : 365)
|
||||
|
||||
static void
|
||||
validate_structure (tim_p)
|
||||
struct tm *tim_p;
|
||||
{
|
||||
div_t res;
|
||||
int days_in_feb = 28;
|
||||
|
||||
/* calculate time & date to account for out of range values */
|
||||
if (tim_p->tm_sec < 0 || tim_p->tm_sec > 59)
|
||||
{
|
||||
res = div (tim_p->tm_sec, 60);
|
||||
tim_p->tm_min += res.quot;
|
||||
if ((tim_p->tm_sec = res.rem) < 0)
|
||||
{
|
||||
tim_p->tm_sec += 60;
|
||||
--tim_p->tm_min;
|
||||
}
|
||||
}
|
||||
|
||||
if (tim_p->tm_min < 0 || tim_p->tm_min > 59)
|
||||
{
|
||||
res = div (tim_p->tm_min, 60);
|
||||
tim_p->tm_hour += res.quot;
|
||||
if ((tim_p->tm_min = res.rem) < 0)
|
||||
{
|
||||
tim_p->tm_min += 60;
|
||||
--tim_p->tm_hour;
|
||||
}
|
||||
}
|
||||
|
||||
if (tim_p->tm_hour < 0 || tim_p->tm_hour > 23)
|
||||
{
|
||||
res = div (tim_p->tm_hour, 24);
|
||||
tim_p->tm_mday += res.quot;
|
||||
if ((tim_p->tm_hour = res.rem) < 0)
|
||||
{
|
||||
tim_p->tm_hour += 24;
|
||||
--tim_p->tm_mday;
|
||||
}
|
||||
}
|
||||
|
||||
if (tim_p->tm_mon > 11)
|
||||
{
|
||||
res = div (tim_p->tm_mon, 12);
|
||||
tim_p->tm_year += res.quot;
|
||||
if ((tim_p->tm_mon = res.rem) < 0)
|
||||
{
|
||||
tim_p->tm_mon += 12;
|
||||
--tim_p->tm_year;
|
||||
}
|
||||
}
|
||||
|
||||
if (_DAYS_IN_YEAR (tim_p->tm_year) == 366)
|
||||
days_in_feb = 29;
|
||||
|
||||
if (tim_p->tm_mday <= 0)
|
||||
{
|
||||
while (tim_p->tm_mday <= 0)
|
||||
{
|
||||
if (--tim_p->tm_mon == -1)
|
||||
{
|
||||
tim_p->tm_year--;
|
||||
tim_p->tm_mon = 11;
|
||||
days_in_feb =
|
||||
((_DAYS_IN_YEAR (tim_p->tm_year) == 366) ?
|
||||
29 : 28);
|
||||
}
|
||||
tim_p->tm_mday += _DAYS_IN_MONTH (tim_p->tm_mon);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while (tim_p->tm_mday > _DAYS_IN_MONTH (tim_p->tm_mon))
|
||||
{
|
||||
tim_p->tm_mday -= _DAYS_IN_MONTH (tim_p->tm_mon);
|
||||
if (++tim_p->tm_mon == 12)
|
||||
{
|
||||
tim_p->tm_year++;
|
||||
tim_p->tm_mon = 0;
|
||||
days_in_feb =
|
||||
((_DAYS_IN_YEAR (tim_p->tm_year) == 366) ?
|
||||
29 : 28);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
time_t
|
||||
mktime (tim_p)
|
||||
struct tm *tim_p;
|
||||
{
|
||||
time_t tim = 0;
|
||||
long days = 0;
|
||||
int year;
|
||||
|
||||
/* validate structure */
|
||||
validate_structure (tim_p);
|
||||
|
||||
/* compute hours, minutes, seconds */
|
||||
tim += tim_p->tm_sec + (tim_p->tm_min * _SEC_IN_MINUTE) +
|
||||
(tim_p->tm_hour * _SEC_IN_HOUR);
|
||||
|
||||
/* compute days in year */
|
||||
days += tim_p->tm_mday - 1;
|
||||
days += _DAYS_BEFORE_MONTH[tim_p->tm_mon];
|
||||
if (tim_p->tm_mon > 1 && _DAYS_IN_YEAR (tim_p->tm_year) == 366)
|
||||
days++;
|
||||
|
||||
/* compute day of the year */
|
||||
tim_p->tm_yday = days;
|
||||
|
||||
if (tim_p->tm_year > 10000
|
||||
|| tim_p->tm_year < -10000)
|
||||
{
|
||||
return (time_t) -1;
|
||||
}
|
||||
|
||||
/* compute days in other years */
|
||||
if (tim_p->tm_year > 70)
|
||||
{
|
||||
for (year = 70; year < tim_p->tm_year; year++)
|
||||
days += _DAYS_IN_YEAR (year);
|
||||
}
|
||||
else if (tim_p->tm_year < 70)
|
||||
{
|
||||
for (year = 69; year > tim_p->tm_year; year--)
|
||||
days -= _DAYS_IN_YEAR (year);
|
||||
days -= _DAYS_IN_YEAR (year);
|
||||
}
|
||||
|
||||
/* compute day of the week */
|
||||
if ((tim_p->tm_wday = (days + 4) % 7) < 0)
|
||||
tim_p->tm_wday += 7;
|
||||
|
||||
/* compute total seconds */
|
||||
tim += (days * _SEC_IN_DAY);
|
||||
|
||||
return tim;
|
||||
}
|
444
agbcc/libc/time/strftime.c
Normal file
444
agbcc/libc/time/strftime.c
Normal file
@ -0,0 +1,444 @@
|
||||
/*
|
||||
* strftime.c
|
||||
* Original Author: G. Haley
|
||||
*
|
||||
* Places characters into the array pointed to by s as controlled by the string
|
||||
* pointed to by format. If the total number of resulting characters including
|
||||
* the terminating null character is not more than maxsize, returns the number
|
||||
* of characters placed into the array pointed to by s (not including the
|
||||
* terminating null character); otherwise zero is returned and the contents of
|
||||
* the array indeterminate.
|
||||
*/
|
||||
|
||||
/*
|
||||
FUNCTION
|
||||
<<strftime>>---flexible calendar time formatter
|
||||
|
||||
INDEX
|
||||
strftime
|
||||
|
||||
ANSI_SYNOPSIS
|
||||
#include <time.h>
|
||||
size_t strftime(char *<[s]>, size_t <[maxsize]>,
|
||||
const char *<[format]>, const struct tm *<[timp]>);
|
||||
|
||||
TRAD_SYNOPSIS
|
||||
#include <time.h>
|
||||
size_t strftime(<[s]>, <[maxsize]>, <[format]>, <[timp]>)
|
||||
char *<[s]>;
|
||||
size_t <[maxsize]>;
|
||||
char *<[format]>;
|
||||
struct tm *<[timp]>;
|
||||
|
||||
DESCRIPTION
|
||||
<<strftime>> converts a <<struct tm>> representation of the time (at
|
||||
<[timp]>) into a string, starting at <[s]> and occupying no more than
|
||||
<[maxsize]> characters.
|
||||
|
||||
You control the format of the output using the string at <[format]>.
|
||||
<<*<[format]>>> can contain two kinds of specifications: text to be
|
||||
copied literally into the formatted string, and time conversion
|
||||
specifications. Time conversion specifications are two-character
|
||||
sequences beginning with `<<%>>' (use `<<%%>>' to include a percent
|
||||
sign in the output). Each defined conversion specification selects a
|
||||
field of calendar time data from <<*<[timp]>>>, and converts it to a
|
||||
string in one of the following ways:
|
||||
|
||||
o+
|
||||
o %a
|
||||
An abbreviation for the day of the week.
|
||||
|
||||
o %A
|
||||
The full name for the day of the week.
|
||||
|
||||
o %b
|
||||
An abbreviation for the month name.
|
||||
|
||||
o %B
|
||||
The full name of the month.
|
||||
|
||||
o %c
|
||||
A string representing the complete date and time, in the form
|
||||
. Mon Apr 01 13:13:13 1992
|
||||
|
||||
o %d
|
||||
The day of the month, formatted with two digits.
|
||||
|
||||
o %H
|
||||
The hour (on a 24-hour clock), formatted with two digits.
|
||||
|
||||
o %I
|
||||
The hour (on a 12-hour clock), formatted with two digits.
|
||||
|
||||
o %j
|
||||
The count of days in the year, formatted with three digits
|
||||
(from `<<001>>' to `<<366>>').
|
||||
|
||||
o %m
|
||||
The month number, formatted with two digits.
|
||||
|
||||
o %M
|
||||
The minute, formatted with two digits.
|
||||
|
||||
o %p
|
||||
Either `<<AM>>' or `<<PM>>' as appropriate.
|
||||
|
||||
o %S
|
||||
The second, formatted with two digits.
|
||||
|
||||
o %U
|
||||
The week number, formatted with two digits (from `<<00>>' to `<<53>>';
|
||||
week number 1 is taken as beginning with the first Sunday in a year).
|
||||
See also <<%W>>.
|
||||
|
||||
o %w
|
||||
A single digit representing the day of the week: Sunday is day <<0>>.
|
||||
|
||||
o %W
|
||||
Another version of the week number: like `<<%U>>', but counting week 1
|
||||
as beginning with the first Monday in a year.
|
||||
|
||||
o
|
||||
o %x
|
||||
A string representing the complete date, in a format like
|
||||
. Mon Apr 01 1992
|
||||
|
||||
o %X
|
||||
A string representing the full time of day (hours, minutes, and
|
||||
seconds), in a format like
|
||||
. 13:13:13
|
||||
|
||||
o %y
|
||||
The last two digits of the year.
|
||||
|
||||
o %Y
|
||||
The full year, formatted with four digits to include the century.
|
||||
|
||||
o %Z
|
||||
Defined by ANSI C as eliciting the time zone if available; it is not
|
||||
available in this implementation (which accepts `<<%Z>>' but generates
|
||||
no output for it).
|
||||
|
||||
o %%
|
||||
A single character, `<<%>>'.
|
||||
o-
|
||||
|
||||
RETURNS
|
||||
When the formatted time takes up no more than <[maxsize]> characters,
|
||||
the result is the length of the formatted string. Otherwise, if the
|
||||
formatting operation was abandoned due to lack of room, the result is
|
||||
<<0>>, and the string starting at <[s]> corresponds to just those
|
||||
parts of <<*<[format]>>> that could be completely filled in within the
|
||||
<[maxsize]> limit.
|
||||
|
||||
PORTABILITY
|
||||
ANSI C requires <<strftime>>, but does not specify the contents of
|
||||
<<*<[s]>>> when the formatted string would require more than
|
||||
<[maxsize]> characters.
|
||||
|
||||
<<strftime>> requires no supporting OS subroutines.
|
||||
*/
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
static _CONST int dname_len[7] =
|
||||
{6, 6, 7, 9, 8, 6, 8};
|
||||
|
||||
static _CONST char *_CONST dname[7] =
|
||||
{"Sunday", "Monday", "Tuesday", "Wednesday",
|
||||
"Thursday", "Friday", "Saturday"};
|
||||
|
||||
static _CONST int mname_len[12] =
|
||||
{7, 8, 5, 5, 3, 4, 4, 6, 9, 7, 8, 8};
|
||||
|
||||
static _CONST char *_CONST mname[12] =
|
||||
{"January", "February", "March", "April",
|
||||
"May", "June", "July", "August", "September", "October", "November",
|
||||
"December"};
|
||||
|
||||
size_t
|
||||
_DEFUN (strftime, (s, maxsize, format, tim_p),
|
||||
char *s _AND
|
||||
size_t maxsize _AND
|
||||
_CONST char *format _AND
|
||||
_CONST struct tm *tim_p)
|
||||
{
|
||||
size_t count = 0;
|
||||
int i;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
while (*format && *format != '%')
|
||||
{
|
||||
if (count < maxsize - 1)
|
||||
s[count++] = *format++;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (*format == '\0')
|
||||
break;
|
||||
|
||||
format++;
|
||||
switch (*format)
|
||||
{
|
||||
case 'a':
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
if (count < maxsize - 1)
|
||||
s[count++] =
|
||||
dname[tim_p->tm_wday][i];
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case 'A':
|
||||
for (i = 0; i < dname_len[tim_p->tm_wday]; i++)
|
||||
{
|
||||
if (count < maxsize - 1)
|
||||
s[count++] =
|
||||
dname[tim_p->tm_wday][i];
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case 'b':
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
if (count < maxsize - 1)
|
||||
s[count++] =
|
||||
mname[tim_p->tm_mon][i];
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case 'B':
|
||||
for (i = 0; i < mname_len[tim_p->tm_mon]; i++)
|
||||
{
|
||||
if (count < maxsize - 1)
|
||||
s[count++] =
|
||||
mname[tim_p->tm_mon][i];
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case 'c':
|
||||
if (count < maxsize - 24)
|
||||
{
|
||||
for (i = 0; i < 3; i++)
|
||||
s[count++] =
|
||||
dname[tim_p->tm_wday][i];
|
||||
s[count++] = ' ';
|
||||
for (i = 0; i < 3; i++)
|
||||
s[count++] =
|
||||
mname[tim_p->tm_mon][i];
|
||||
|
||||
sprintf (&s[count],
|
||||
" %.2d %2.2d:%2.2d:%2.2d %.4d",
|
||||
tim_p->tm_mday, tim_p->tm_hour,
|
||||
tim_p->tm_min,
|
||||
tim_p->tm_sec, 1900 +
|
||||
tim_p->tm_year);
|
||||
count += 17;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
break;
|
||||
case 'd':
|
||||
if (count < maxsize - 2)
|
||||
{
|
||||
sprintf (&s[count], "%.2d",
|
||||
tim_p->tm_mday);
|
||||
count += 2;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
break;
|
||||
case 'H':
|
||||
if (count < maxsize - 2)
|
||||
{
|
||||
sprintf (&s[count], "%2.2d",
|
||||
tim_p->tm_hour);
|
||||
count += 2;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
break;
|
||||
case 'I':
|
||||
if (count < maxsize - 2)
|
||||
{
|
||||
if (tim_p->tm_hour == 0 ||
|
||||
tim_p->tm_hour == 12)
|
||||
{
|
||||
s[count++] = '1';
|
||||
s[count++] = '2';
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf (&s[count], "%.2d",
|
||||
tim_p->tm_hour % 12);
|
||||
count += 2;
|
||||
}
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
break;
|
||||
case 'j':
|
||||
if (count < maxsize - 3)
|
||||
{
|
||||
sprintf (&s[count], "%.3d",
|
||||
tim_p->tm_yday + 1);
|
||||
count += 3;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
break;
|
||||
case 'm':
|
||||
if (count < maxsize - 2)
|
||||
{
|
||||
sprintf (&s[count], "%.2d",
|
||||
tim_p->tm_mon + 1);
|
||||
count += 2;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
break;
|
||||
case 'M':
|
||||
if (count < maxsize - 2)
|
||||
{
|
||||
sprintf (&s[count], "%2.2d",
|
||||
tim_p->tm_min);
|
||||
count += 2;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
break;
|
||||
case 'p':
|
||||
if (count < maxsize - 2)
|
||||
{
|
||||
if (tim_p->tm_hour < 12)
|
||||
s[count++] = 'A';
|
||||
else
|
||||
s[count++] = 'P';
|
||||
|
||||
s[count++] = 'M';
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
break;
|
||||
case 'S':
|
||||
if (count < maxsize - 2)
|
||||
{
|
||||
sprintf (&s[count], "%2.2d",
|
||||
tim_p->tm_sec);
|
||||
count += 2;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
break;
|
||||
case 'U':
|
||||
if (count < maxsize - 2)
|
||||
{
|
||||
sprintf (&s[count], "%2.2d",
|
||||
(tim_p->tm_yday + 7 -
|
||||
tim_p->tm_wday) / 7);
|
||||
count += 2;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
break;
|
||||
case 'w':
|
||||
if (count < maxsize - 1)
|
||||
{
|
||||
sprintf (&s[count], "%1.1d",
|
||||
tim_p->tm_wday);
|
||||
count++;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
break;
|
||||
case 'W':
|
||||
if (count < maxsize - 2)
|
||||
{
|
||||
sprintf (&s[count], "%2.2d",
|
||||
(tim_p->tm_yday + ((8 -
|
||||
tim_p->tm_wday) % 7)) / 7);
|
||||
count += 2;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
break;
|
||||
case 'x':
|
||||
if (count < maxsize - 15)
|
||||
{
|
||||
for (i = 0; i < 3; i++)
|
||||
s[count++] =
|
||||
dname[tim_p->tm_wday][i];
|
||||
s[count++] = ' ';
|
||||
for (i = 0; i < 3; i++)
|
||||
s[count++] =
|
||||
mname[tim_p->tm_mon][i];
|
||||
|
||||
sprintf (&s[count],
|
||||
" %.2d %.4d", tim_p->tm_mday,
|
||||
1900 + tim_p->tm_year);
|
||||
count += 8;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
break;
|
||||
case 'X':
|
||||
if (count < maxsize - 8)
|
||||
{
|
||||
sprintf (&s[count],
|
||||
"%2.2d:%2.2d:%2.2d",
|
||||
tim_p->tm_hour, tim_p->tm_min,
|
||||
tim_p->tm_sec);
|
||||
count += 8;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
break;
|
||||
case 'y':
|
||||
if (count < maxsize - 2)
|
||||
{
|
||||
/* The year could be greater than 100, so we need the value
|
||||
modulo 100. The year could be negative, so we need to
|
||||
correct for a possible negative remainder. */
|
||||
sprintf (&s[count], "%2.2d",
|
||||
(tim_p->tm_year % 100 + 100) % 100);
|
||||
count += 2;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
break;
|
||||
case 'Y':
|
||||
if (count < maxsize - 4)
|
||||
{
|
||||
sprintf (&s[count], "%.4d",
|
||||
1900 + tim_p->tm_year);
|
||||
count += 4;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
break;
|
||||
case 'Z':
|
||||
break;
|
||||
case '%':
|
||||
if (count < maxsize - 1)
|
||||
s[count++] = '%';
|
||||
else
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
if (*format)
|
||||
format++;
|
||||
else
|
||||
break;
|
||||
}
|
||||
s[count] = '\0';
|
||||
|
||||
return count;
|
||||
}
|
59
agbcc/libc/time/time.c
Normal file
59
agbcc/libc/time/time.c
Normal file
@ -0,0 +1,59 @@
|
||||
/* FIXME: doc says "not avail" due to #if 0.
|
||||
DELETE that line if inappropriate! */
|
||||
/*
|
||||
FUNCTION
|
||||
<<time>>---get current calendar time (as single number)
|
||||
|
||||
INDEX
|
||||
time
|
||||
|
||||
ANSI_SYNOPSIS
|
||||
#include <time.h>
|
||||
time_t time(time_t *<[t]>);
|
||||
|
||||
TRAD_SYNOPSIS
|
||||
#include <time.h>
|
||||
time_t time(<[t]>)
|
||||
time_t *<[t]>;
|
||||
|
||||
DESCRIPTION
|
||||
<<time>> looks up the best available representation of the current
|
||||
time and returns it, encoded as a <<time_t>>. It stores the same
|
||||
value at <[t]> unless the argument is <<NULL>>.
|
||||
|
||||
RETURNS
|
||||
A <<-1>> result means the current time is not available; otherwise the
|
||||
result represents the current time.
|
||||
|
||||
PORTABILITY
|
||||
ANSI C requires <<time>>.
|
||||
|
||||
Supporting OS subroutine required: Some implementations require
|
||||
<<gettimeofday>>.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_GETTIMEOFDAY
|
||||
|
||||
/* Most times we have a system call in newlib/libc/sys/.. to do this job */
|
||||
|
||||
#include <_ansi.h>
|
||||
#include <reent.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
time_t
|
||||
_DEFUN (time, (t),
|
||||
time_t * t)
|
||||
{
|
||||
struct timeval now;
|
||||
|
||||
if (_gettimeofday_r (_REENT, &now, (struct timezone *) 0) >= 0)
|
||||
{
|
||||
if (t)
|
||||
*t = now.tv_sec;
|
||||
return now.tv_sec;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user