X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=functions%2Ftime.c;fp=functions%2Ftime.c;h=0000000000000000000000000000000000000000;hb=a1f747e81dad0bb9897cb11c652403bb7bbf084c;hp=54dcc017901434c87300d12d53ca4cfc517738c7;hpb=1d9d92ba957a0b8307c9a65c35867fde68e6533b;p=pdclib diff --git a/functions/time.c b/functions/time.c deleted file mode 100644 index 54dcc01..0000000 --- a/functions/time.c +++ /dev/null @@ -1,539 +0,0 @@ -/* ---------------------------------------------------------------------------- - * $Id$ - * ---------------------------------------------------------------------------- - * Public Domain C Library - http://pdclib.sourceforge.net - * This code is Public Domain. Use, modify, and redistribute at will. - * --------------------------------------------------------------------------*/ - -char * asctime( const struct tm * tptr ) { /* TODO */ }; -clock_t clock( void ) { /* TODO */ }; -char * ctime( const time_t * tod ) { /* TODO */ }; -double difftime( time_t t1, time_t t0 ) { /* TODO */ }; -struct tm * gmtime( const time_t * tod ) { /* TODO */ }; -struct tm * localtime( const time_t * tod ) { /* TODO */ }; -time_t mktime( struct tm * tptr ) { /* TODO */ }; -size_t strftime( char * restrict s, size_t n, const char * restrict format, - const struct tm * restrict tptr ) { /* TODO */ }; -time_t time( time_t * tod ) { /* TODO */ }; - -/* PDPC code - unreviewed, verbatim -/* scalar date routines -- public domain by Ray Gardner -** These will work over the range 1-01-01 thru 14699-12-31 -** The functions written by Ray are isleap, months_to_days, -** years_to_days, ymd_to_scalar, scalar_to_ymd. -** modified slightly by Paul Edwards -*/ - -static int isleap(unsigned yr) -{ - return yr % 400 == 0 || (yr % 4 == 0 && yr % 100 != 0); -} - -static unsigned months_to_days(unsigned month) -{ - return (month * 3057 - 3007) / 100; -} - -static long years_to_days (unsigned yr) -{ - return yr * 365L + yr / 4 - yr / 100 + yr / 400; -} - -static long ymd_to_scalar(unsigned yr, unsigned mo, unsigned day) -{ - long scalar; - - scalar = day + months_to_days(mo); - if ( mo > 2 ) /* adjust if past February */ - scalar -= isleap(yr) ? 1 : 2; - yr--; - scalar += years_to_days(yr); - return (scalar); -} - -static void scalar_to_ymd(long scalar, - unsigned *pyr, - unsigned *pmo, - unsigned *pday) -{ - unsigned n; /* compute inverse of years_to_days() */ - - n = (unsigned)((scalar * 400L) / 146097L); - while (years_to_days(n) < scalar) - { - n++; - } - for ( n = (unsigned)((scalar * 400L) / 146097L); years_to_days(n) < scalar; ) - n++; /* 146097 == years_to_days(400) */ - *pyr = n; - n = (unsigned)(scalar - years_to_days(n-1)); - if ( n > 59 ) { /* adjust if past February */ - n += 2; - if ( isleap(*pyr) ) - n -= n > 62 ? 1 : 2; - } - *pmo = (n * 100 + 3007) / 3057; /* inverse of months_to_days() */ - *pday = n - months_to_days(*pmo); - return; -} - -time_t time(time_t *timer) -{ - time_t tt; -#ifdef __OS2__ - DATETIME dt; - APIRET rc; -#endif -#if (defined(__MSDOS__) || defined(__MVS__)) - struct { - int year; - int month; - int day; - int hours; - int minutes; - int seconds; - int hundredths; - } dt; -#endif -#ifdef __MVS__ - unsigned int clk[2]; -#endif - -#ifdef __OS2__ - rc = DosGetDateTime(&dt); - if (rc != 0) - { - tt = (time_t)-1; - } - else -#endif -#ifdef __MSDOS__ - __datetime(&dt); -#endif -#ifdef __MVS__ - tt = __getclk(clk); -#else - - { - tt = ymd_to_scalar(dt.year, dt.month, dt.day) - - ymd_to_scalar(1970, 1, 1); - tt = tt * 24 + dt.hours; - tt = tt * 60 + dt.minutes; - tt = tt * 60 + dt.seconds; - } -#endif - if (timer != NULL) - { - *timer = tt; - } - return (tt); -} - -clock_t clock(void) -{ - return ((clock_t)-1); -} - -double difftime(time_t time1, time_t time0) -{ - return ((double)(time1 - time0)); -} - -time_t mktime(struct tm *timeptr) -{ - time_t tt; - - if ((timeptr->tm_year < 70) || (timeptr->tm_year > 120)) - { - tt = (time_t)-1; - } - else - { - tt = ymd_to_scalar(timeptr->tm_year + 1900, - timeptr->tm_mon, - timeptr->tm_mday) - - ymd_to_scalar(1970, 1, 1); - tt = tt * 24 + timeptr->tm_hour; - tt = tt * 60 + timeptr->tm_min; - tt = tt * 60 + timeptr->tm_sec; - } - return (tt); -} - -char *asctime(const struct tm *timeptr) -{ - static const char wday_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" - }; - static char result[26]; - - sprintf(result, "%.3s %.3s%3d %.2d:%.2d:%.2d %d\n", - wday_name[timeptr->tm_wday], - mon_name[timeptr->tm_mon], - timeptr->tm_mday, timeptr->tm_hour, - timeptr->tm_min, timeptr->tm_sec, - 1900 + timeptr->tm_year); - return result; -} - -char *ctime(const time_t *timer) -{ - return (asctime(localtime(timer))); -} - -struct tm *gmtime(const time_t *timer) -{ - return (localtime(timer)); -} - -/* dow - written by Paul Edwards, 1993-01-31 */ -/* Released to the Public Domain */ -/* This routine will work over the range 1-01-01 to 32767-12-31. - It assumes the current calendar system has always been in - place in that time. If you pass 0 or negative years, then - it produces results on the assumption that there is a year - 0. It should always produce a value in the range of 0..6 - if a valid month and day have been passed, no matter what - the year is. However, it has not been tested for negative - years, because the results are meaningless anyway. It is - mainly to stop people playing silly buggers and causing - the macro to crash on negative years. */ - -/* Modified 1994-08-26 by Paul Edwards to make it return - 0..6 for Sunday..Saturday instead of Monday..Sunday */ -/* change the "(d) + 1" to "(d) + 0" to get it back to Monday - to Sunday if you want */ - -#define dow(y,m,d) \ - ((((((m)+9)%12+1)<<4)%27 + (d) + 1 + \ - ((y)%400+400) + ((y)%400+400)/4 - ((y)%400+400)/100 + \ - (((m)<=2) ? ( \ - (((((y)%4)==0) && (((y)%100)!=0)) || (((y)%400)==0)) \ - ? 5 : 6) : 0)) % 7) - -static struct tm tms; - -struct tm *localtime(const time_t *timer) -{ - unsigned yr, mo, da; - unsigned long secs; - unsigned long days; - - days = *timer / (60L*60*24); - secs = *timer % (60L*60*24); - scalar_to_ymd(days + ymd_to_scalar(1970, 1, 1), &yr, &mo, &da); - tms.tm_year = yr - 1900; - tms.tm_mon = mo - 1; - tms.tm_mday = da; - tms.tm_yday = (int)(ymd_to_scalar(tms.tm_year + 1900, 1, 1) - - ymd_to_scalar(tms.tm_year + 1900, mo, da)); - tms.tm_wday = dow(tms.tm_year + 1900, mo, da); - tms.tm_isdst = -1; - tms.tm_sec = (int)(secs % 60); - secs /= 60; - tms.tm_min = (int)(secs % 60); - secs /= 60; - tms.tm_hour = (int)secs; - return (&tms); -} - -/* - * strftime.c - * - * implements the iso c function strftime() - * - * written 1989-09-06 by jim nutt - * released into the public domain by jim nutt - * - * modified 1989-10-21 by Rob Duff - * - * modified 1994-08-26 by Paul Edwards - */ - -static char *aday[] = { - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" -}; - -static char *day[] = { - "Sunday", "Monday", "Tuesday", "Wednesday", - "Thursday", "Friday", "Saturday" -}; - -static char *amonth[] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" -}; - -static char *month[] = { - "January", "February", "March", "April", "May", "June", - "July", "August", "September", "October", "November", "December" -}; - -static char *__tzname[2] = { "" "" }; -static char buf[26]; - -static void strfmt(char *str, const char *fmt, ...); - -/** - * - * size_t strftime(char *str, - * size_t maxs, - * const char *fmt, - * const struct tm *t) - * - * this functions acts much like a sprintf for time/date output. - * given a pointer to an output buffer, a format string and a - * time, it copies the time to the output buffer formatted in - * accordance with the format string. the parameters are used - * as follows: - * - * str is a pointer to the output buffer, there should - * be at least maxs characters available at the address - * pointed to by str. - * - * maxs is the maximum number of characters to be copied - * into the output buffer, included the '\0' terminator - * - * fmt is the format string. a percent sign (%) is used - * to indicate that the following character is a special - * format character. the following are valid format - * characters: - * - * %A full weekday name (Monday) - * %a abbreviated weekday name (Mon) - * %B full month name (January) - * %b abbreviated month name (Jan) - * %c standard date and time representation - * %d day-of-month (01-31) - * %H hour (24 hour clock) (00-23) - * %I hour (12 hour clock) (01-12) - * %j day-of-year (001-366) - * %M minute (00-59) - * %m month (01-12) - * %p local equivalent of AM or PM - * %S second (00-59) - * %U week-of-year, first day sunday (00-53) - * %W week-of-year, first day monday (00-53) - * %w weekday (0-6, sunday is 0) - * %X standard time representation - * %x standard date representation - * %Y year with century - * %y year without century (00-99) - * %Z timezone name - * %% percent sign - * - * the standard date string is equivalent to: - * - * %a %b %d %Y - * - * the standard time string is equivalent to: - * - * %H:%M:%S - * - * the standard date and time string is equivalent to: - * - * %a %b %d %H:%M:%S %Y - * - * strftime returns the number of characters placed in the - * buffer, not including the terminating \0, or zero if more - * than maxs characters were produced. - * -**/ - -size_t strftime(char *s, size_t maxs, const char *f, const struct tm *t) -{ - int w; - char *p, *q, *r; - - p = s; - q = s + maxs - 1; - while ((*f != '\0')) - { - if (*f++ == '%') - { - r = buf; - switch (*f++) - { - case '%' : - r = "%"; - break; - - case 'a' : - r = aday[t->tm_wday]; - break; - - case 'A' : - r = day[t->tm_wday]; - break; - - case 'b' : - r = amonth[t->tm_mon]; - break; - - case 'B' : - r = month[t->tm_mon]; - break; - - case 'c' : - strfmt(r, "%0 %0 %2 %2:%2:%2 %4", - aday[t->tm_wday], amonth[t->tm_mon], - t->tm_mday,t->tm_hour, t->tm_min, - t->tm_sec, t->tm_year+1900); - break; - - case 'd' : - strfmt(r,"%2",t->tm_mday); - break; - - case 'H' : - strfmt(r,"%2",t->tm_hour); - break; - - case 'I' : - strfmt(r,"%2",(t->tm_hour%12)?t->tm_hour%12:12); - break; - - case 'j' : - strfmt(r,"%3",t->tm_yday+1); - break; - - case 'm' : - strfmt(r,"%2",t->tm_mon+1); - break; - - case 'M' : - strfmt(r,"%2",t->tm_min); - break; - - case 'p' : - r = (t->tm_hour>11)?"PM":"AM"; - break; - - case 'S' : - strfmt(r,"%2",t->tm_sec); - break; - - case 'U' : - w = t->tm_yday/7; - if (t->tm_yday%7 > t->tm_wday) - w++; - strfmt(r, "%2", w); - break; - - case 'W' : - w = t->tm_yday/7; - if (t->tm_yday%7 > (t->tm_wday+6)%7) - w++; - strfmt(r, "%2", w); - break; - - case 'w' : - strfmt(r,"%1",t->tm_wday); - break; - - case 'x' : - strfmt(r, "%3s %3s %2 %4", aday[t->tm_wday], - amonth[t->tm_mon], t->tm_mday, t->tm_year+1900); - break; - - case 'X' : - strfmt(r, "%2:%2:%2", t->tm_hour, - t->tm_min, t->tm_sec); - break; - - case 'y' : - strfmt(r,"%2",t->tm_year%100); - break; - - case 'Y' : - strfmt(r,"%4",t->tm_year+1900); - break; - - case 'Z' : - r = (t->tm_isdst) ? __tzname[1] : __tzname[0]; - break; - - default: - buf[0] = '%'; /* reconstruct the format */ - buf[1] = f[-1]; - buf[2] = '\0'; - if (buf[1] == 0) - f--; /* back up if at end of string */ - } - while (*r) - { - if (p == q) - { - *q = '\0'; - return 0; - } - *p++ = *r++; - } - } - else - { - if (p == q) - { - *q = '\0'; - return 0; - } - *p++ = f[-1]; - } - } - *p = '\0'; - return (size_t)(p - s); -} - -static int pow[5] = { 1, 10, 100, 1000, 10000 }; - -/** - * static void strfmt(char *str, char *fmt); - * - * simple sprintf for strftime - * - * each format descriptor is of the form %n - * where n goes from zero to four - * - * 0 -- string %s - * 1..4 -- int %?.?d - * -**/ - -static void strfmt(char *str, const char *fmt, ...) -{ - int ival, ilen; - char *sval; - va_list vp; - - va_start(vp, fmt); - while (*fmt) - { - if (*fmt++ == '%') - { - ilen = *fmt++ - '0'; - if (ilen == 0) /* zero means string arg */ - { - sval = va_arg(vp, char*); - while (*sval) - *str++ = *sval++; - } - else /* always leading zeros */ - { - ival = va_arg(vp, int); - while (ilen) - { - ival %= pow[ilen--]; - *str++ = (char)('0' + ival / pow[ilen]); - } - } - } - else *str++ = fmt[-1]; - } - *str = '\0'; - va_end(vp); -} -*/