summaryrefslogtreecommitdiff
path: root/05/tcc-0.9.25/time.h
diff options
context:
space:
mode:
Diffstat (limited to '05/tcc-0.9.25/time.h')
-rw-r--r--05/tcc-0.9.25/time.h293
1 files changed, 0 insertions, 293 deletions
diff --git a/05/tcc-0.9.25/time.h b/05/tcc-0.9.25/time.h
deleted file mode 100644
index 8207156..0000000
--- a/05/tcc-0.9.25/time.h
+++ /dev/null
@@ -1,293 +0,0 @@
-#ifndef _TIME_H
-#define _TIME_H
-
-#include <stdc_common.h>
-#define CLK_TCK 1000000000 // doesnt matter; clock() will always fail.
-
-typedef long clock_t;
-
-clock_t clock(void) {
- // "If the processor time used is not available or its value cannot be represented, the function returns the value (clock_t)-1." C89 ยง 4.12.2.1
- return -1;
-}
-
-double difftime(time_t time1, time_t time0) {
- return (double)(time1 - time0);
-}
-
-time_t time(time_t *timer) {
- struct timespec ts = {0};
- if (clock_gettime(CLOCK_REALTIME, &ts) != 0) return -1;
- if (timer) *timer = ts.tv_sec;
- return ts.tv_sec;
-}
-
-
-// @NONSTANDARD(except in UTC+0): we don't support local time in timezones other than UTC+0.
-
-struct tm {
- int tm_sec; /* seconds after the minute --- [0, 60] */
- int tm_min; /* minutes after the hour --- [0, 59] */
- int tm_hour; /* hours since midnight --- [0, 23] */
- int tm_mday; /* day of the month --- [1, 31] */
- int tm_mon; /* months since January --- [0, 11] */
- int tm_year; /* years since 1900 */
- int tm_wday; /* days since Sunday --- [0, 6] */
- int tm_yday; /* days since January 1 --- [0, 365] */
- int tm_isdst; /* Daylight Saving Time flag */
-};
-
-
-void _gmtime_r(const time_t *timer, struct tm *tm) {
- time_t t = *timer;
- int year = 1970;
- int days = t / 86400;
- int leap_year;
- int month;
-
- tm->tm_isdst = 0;
- tm->tm_wday = (4 + days) % 7; // jan 1 1970 was a thursday
- while (1) {
- leap_year = year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
- int ydays = leap_year ? 366 : 365;
- if (days < ydays) break;
- days -= ydays;
- ++year;
- }
- tm->tm_year = year - 1900;
- tm->tm_yday = days;
- for (month = 0; month < 12; ++month) {
- int mdays;
- switch (month) {
- case 0: case 2: case 4: case 6: case 7: case 9: case 11:
- mdays = 31;
- break;
- case 3: case 5: case 8: case 10:
- mdays = 30;
- break;
- case 1:
- mdays = 28 + leap_year;
- break;
- }
- if (days < mdays) break;
- days -= mdays;
- }
- tm->tm_mday = days + 1;
- tm->tm_mon = month;
- t %= 86400;
- tm->tm_hour = t / 3600;
- t %= 3600;
- tm->tm_min = t / 60;
- tm->tm_sec = t % 60;
-}
-
-time_t mktime(struct tm *tm) {
- // @NONSTANDARD-ish.
- // not implementing this -- note that the implementation has to support tm_* values
- // outside of their proper ranges.
- return (time_t)-1;
-
-}
-
-struct tm *gmtime(const time_t *timer) {
- static struct tm result;
- _gmtime_r(timer, &result);
- return &result;
-}
-
-struct tm *localtime(const time_t *timer) {
- static struct tm result;
- _gmtime_r(timer, &result);
- return &result;
-}
-
-static const char _wday_name[7][4] = {
- "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
-};
-static const char _weekday_name[7][16] = {
- "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
-};
-static const char _mon_name[12][4] = {
- "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
-};
-static const char _month_name[12][16] = {
- "January", "February", "March", "April", "May", "June",
- "July", "August", "September", "October", "November", "December"
-};
-
-char *asctime(const struct tm *timeptr) {
- // lifted from the (draft of the) C standard
- static char result[32];
- 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));
-}
-
-size_t strftime(char *s, size_t maxsize, const char *format, const struct tm *tm) {
- size_t n = 0, l;
- char *name;
-
- while (*format) {
- if (*format == '%') {
- ++format;
- int c = *format++;
- switch (c) {
- case 'a':
- if (n+4 >= maxsize) return 0;
- strcpy(s, _wday_name[tm->tm_wday]);
- s += 3;
- n += 3;
- break;
- case 'A':
- name = _weekday_name[tm->tm_wday];
- l = strlen(name);
- if (n+l+1 >= maxsize) return 0;
- strcpy(s, name);
- s += l;
- n += l;
- break;
- case 'b':
- if (n+4 >= maxsize) return 0;
- strcpy(s, _mon_name[tm->tm_mon]);
- s += 3;
- n += 3;
- break;
- case 'B':
- name = _month_name[tm->tm_mon];
- l = strlen(name);
- if (n+l+1 >= maxsize) return 0;
- strcpy(s, name);
- s += l;
- n += l;
- break;
- case 'c':
- if (n+32 >= maxsize) return 0;
- sprintf(s, "%s %02d %s %d %02d:%02d:%02d %s UTC",
- _wday_name[tm->tm_wday], tm->tm_mday, _mon_name[tm->tm_mon],
- 1900+tm->tm_year, (tm->tm_hour + 11) % 12 + 1, tm->tm_min, tm->tm_sec,
- tm->tm_hour >= 12 ? "PM" : "AM");
- s += 31;
- n += 31;
- break;
- case 'd':
- if (n+3 >= maxsize) return 0;
- sprintf(s, "%02d", tm->tm_mday);
- s += 2;
- n += 2;
- break;
- case 'H':
- if (n+3 >= maxsize) return 0;
- sprintf(s, "%02d", tm->tm_hour);
- s += 2;
- n += 2;
- break;
- case 'I':
- if (n+3 >= maxsize) return 0;
- sprintf(s, "%02d", (tm->tm_hour + 11) % 12 + 1);
- s += 2;
- n += 2;
- break;
- case 'j':
- if (n+4 >= maxsize) return 0;
- sprintf(s, "%03d", tm->tm_yday + 1);
- s += 3;
- n += 3;
- break;
- case 'm':
- if (n+3 >= maxsize) return 0;
- sprintf(s, "%02d", tm->tm_mon + 1);
- s += 2;
- n += 2;
- break;
- case 'M':
- if (n+3 >= maxsize) return 0;
- sprintf(s, "%02d", tm->tm_min);
- s += 2;
- n += 2;
- break;
- case 'p':
- if (n+3 >= maxsize) return 0;
- sprintf(s, "%s", tm->tm_hour >= 12 ? "PM" : "AM");
- s += 2;
- n += 2;
- break;
- case 'S':
- if (n+3 >= maxsize) return 0;
- sprintf(s, "%02d", tm->tm_sec);
- s += 2;
- n += 2;
- break;
- case 'w':
- if (n+2 >= maxsize) return 0;
- sprintf(s, "%d", tm->tm_wday);
- s += 1;
- n += 1;
- break;
- case 'x':
- if (n+16 >= maxsize) return 0;
- sprintf(s, "%s %02d %s %d",
- _wday_name[tm->tm_wday], tm->tm_mday, _mon_name[tm->tm_mon],
- 1900+tm->tm_year);
- s += 15;
- n += 15;
- break;
- case 'X':
- if (n+16 >= maxsize) return 0;
- sprintf(s, "%02d:%02d:%02d %s UTC",
- (tm->tm_hour + 11) % 12 + 1, tm->tm_min, tm->tm_sec,
- tm->tm_hour >= 12 ? "PM" : "AM");
- s += 15;
- n += 15;
- break;
- case 'y':
- if (n+3 >= maxsize) return 0;
- sprintf(s, "%02d", tm->tm_year % 100);
- s += 2;
- n += 2;
- break;
- case 'Y':
- if (n+5 >= maxsize) return 0;
- sprintf(s, "%d", tm->tm_year + 1900);
- s += 4;
- n += 4;
- break;
- case 'Z':
- if (n+4 >= maxsize) return 0;
- strcpy(s, "UTC");
- s += 3;
- n += 3;
- break;
- case '%':
- if (n >= maxsize) return 0;
- *s++ = '%';
- n += 1;
- break;
- case 'U': // WEEK NUMBER OF THE YEAR? WHO GIVES A SHIT?
- case 'W': // WEEK NUMBER OF THE YEAR MONDAY-BASED EDITION. IF YOU DIDNT ALREADY GET ENOUGH WEEK NUMBERS. FUCK YOU
- default:
- fprintf(stderr, "Bad strftime format.\n");
- abort();
-
- }
- } else {
- if (n >= maxsize) return 0;
- *s++ = *format++;
- n += 1;
- }
- }
- if (n >= maxsize) return 0;
- *s = 0;
- #undef _Push_str
- return n;
-}
-
-#endif // _TIME_H