[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Minios-devel] [UNIKRAFT PATCH v3 1/3] lib/uktime: Import timegm from musl


  • To: "minios-devel@xxxxxxxxxxxxx" <minios-devel@xxxxxxxxxxxxx>
  • From: Vlad-Andrei BĂDOIU (78692) <vlad_andrei.badoiu@xxxxxxxxxxxxxxx>
  • Date: Thu, 12 Sep 2019 11:31:51 +0000
  • Accept-language: en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=stud.acs.upb.ro; dmarc=pass action=none header.from=stud.acs.upb.ro; dkim=pass header.d=stud.acs.upb.ro; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=b3AOrQOFTIdnWBupUeXduK2hvspYD3ifmxYogl0HG2o=; b=PKZpDO73xLxW1lN8fhlP5shPbQa+UbqA5ZtYRopqq1ZO4+17Uo1MVpPlAF6g6E5NeGbXGOMRKotglzpUKA5jo2nJ9poZnH17N8AQnwC1M+JhaPXzq63YE4TnIhC7fW9urH3vVziS/Waa1bjmKNHRdkgKnPqWAaClDgfK9XdEBH7TW6c9cycAurLToG9idTjvxrRL6ZLVswxVI9DcG+Mj5dkOfLzjw6eUwScTSUm1AwVsS4Fvz87Dr5fHJC6pwbZpcMrSJfqGMCSvVz9DZragrQfzlUb5fcljlsPrqKdZcfMQqZMmu1OZ0AZykIDIA3vjojOyks4au5WOTlCxc1eXXg==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=hfbtjdvfzMzoqEbRc4atwJfjSkJ5+9vZDtQ/Sa11YMT+zKoKDn1WC//0W1S7U3tVHV980Gu8CdZpuB3EV+H6QK2VtwYb+Ml3cSCIyv3CgShx2OC70e7Ey4AQb7QqAXahkihXB7VnNykw4QZIymNq8pZJBAzU1+Qw45iIVniU8wJ9PZD/ncT6JQpieNI77VA8NBeV7hRDURnjJWH8wygX5IXLWWn/a/W8SqUICDYJc+TAuAqnBHV+/wiXERRaYdNvG6bb2HFfKFkYbBkk3YgOWW9ds0Z1UV0WVavgsGDUnl+TVzAmA+57HtpGclYD0adV5a+jWlp2ghP99Krh/NxDTg==
  • Authentication-results: spf=none (sender IP is ) smtp.mailfrom=vlad_andrei.badoiu@xxxxxxxxxxxxxxx;
  • Cc: Vlad-Andrei BĂDOIU (78692) <vlad_andrei.badoiu@xxxxxxxxxxxxxxx>, "costin.lupu@xxxxxxxxx" <costin.lupu@xxxxxxxxx>
  • Delivery-date: Thu, 12 Sep 2019 11:32:01 +0000
  • List-id: Mini-os development list <minios-devel.lists.xenproject.org>
  • Thread-index: AQHVaV2r+zpK5AdqbUGNjNMpf5aABg==
  • Thread-topic: [UNIKRAFT PATCH v3 1/3] lib/uktime: Import timegm from musl

Copied as is from the official musl git mirror
git://git.musl-libc.org/musl, commit 6fcb440d.

Signed-off-by: Vlad-Andrei Badoiu <vlad_andrei.badoiu@xxxxxxxxxxxxxxx>
---
 lib/uktime/musl-imported/include/time.h       | 138 ++++++++++++++++++
 .../musl-imported/src/__month_to_secs.c       |  10 ++
 lib/uktime/musl-imported/src/__secs_to_tm.c   |  82 +++++++++++
 lib/uktime/musl-imported/src/__tm_to_secs.c   |  24 +++
 lib/uktime/musl-imported/src/__year_to_secs.c |  47 ++++++
 lib/uktime/musl-imported/src/time_impl.h      |  11 ++
 lib/uktime/musl-imported/src/timegm.c         |  18 +++
 7 files changed, 330 insertions(+)
 create mode 100644 lib/uktime/musl-imported/include/time.h
 create mode 100644 lib/uktime/musl-imported/src/__month_to_secs.c
 create mode 100644 lib/uktime/musl-imported/src/__secs_to_tm.c
 create mode 100644 lib/uktime/musl-imported/src/__tm_to_secs.c
 create mode 100644 lib/uktime/musl-imported/src/__year_to_secs.c
 create mode 100644 lib/uktime/musl-imported/src/time_impl.h
 create mode 100644 lib/uktime/musl-imported/src/timegm.c

diff --git a/lib/uktime/musl-imported/include/time.h 
b/lib/uktime/musl-imported/include/time.h
new file mode 100644
index 00000000..672b3fc3
--- /dev/null
+++ b/lib/uktime/musl-imported/include/time.h
@@ -0,0 +1,138 @@
+#ifndef        _TIME_H
+#define _TIME_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#ifdef __cplusplus
+#define NULL 0L
+#else
+#define NULL ((void*)0)
+#endif
+
+
+#define __NEED_size_t
+#define __NEED_time_t
+#define __NEED_clock_t
+#define __NEED_struct_timespec
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+#define __NEED_clockid_t
+#define __NEED_timer_t
+#define __NEED_pid_t
+#define __NEED_locale_t
+#endif
+
+#include <bits/alltypes.h>
+
+#if defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
+#define __tm_gmtoff tm_gmtoff
+#define __tm_zone tm_zone
+#endif
+
+struct tm {
+       int tm_sec;
+       int tm_min;
+       int tm_hour;
+       int tm_mday;
+       int tm_mon;
+       int tm_year;
+       int tm_wday;
+       int tm_yday;
+       int tm_isdst;
+       long __tm_gmtoff;
+       const char *__tm_zone;
+};
+
+clock_t clock (void);
+time_t time (time_t *);
+double difftime (time_t, time_t);
+time_t mktime (struct tm *);
+size_t strftime (char *__restrict, size_t, const char *__restrict, const 
struct tm *__restrict);
+struct tm *gmtime (const time_t *);
+struct tm *localtime (const time_t *);
+char *asctime (const struct tm *);
+char *ctime (const time_t *);
+int timespec_get(struct timespec *, int);
+
+#define CLOCKS_PER_SEC 1000000L
+
+#define TIME_UTC 1
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+
+size_t strftime_l (char *  __restrict, size_t, const char *  __restrict, const 
struct tm *  __restrict, locale_t);
+
+struct tm *gmtime_r (const time_t *__restrict, struct tm *__restrict);
+struct tm *localtime_r (const time_t *__restrict, struct tm *__restrict);
+char *asctime_r (const struct tm *__restrict, char *__restrict);
+char *ctime_r (const time_t *, char *);
+
+void tzset (void);
+
+struct itimerspec {
+       struct timespec it_interval;
+       struct timespec it_value;
+};
+
+#define CLOCK_REALTIME           0
+#define CLOCK_MONOTONIC          1
+#define CLOCK_PROCESS_CPUTIME_ID 2
+#define CLOCK_THREAD_CPUTIME_ID  3
+#define CLOCK_MONOTONIC_RAW      4
+#define CLOCK_REALTIME_COARSE    5
+#define CLOCK_MONOTONIC_COARSE   6
+#define CLOCK_BOOTTIME           7
+#define CLOCK_REALTIME_ALARM     8
+#define CLOCK_BOOTTIME_ALARM     9
+#define CLOCK_SGI_CYCLE         10
+#define CLOCK_TAI               11
+
+#define TIMER_ABSTIME 1
+
+int nanosleep (const struct timespec *, struct timespec *);
+int clock_getres (clockid_t, struct timespec *);
+int clock_gettime (clockid_t, struct timespec *);
+int clock_settime (clockid_t, const struct timespec *);
+int clock_nanosleep (clockid_t, int, const struct timespec *, struct timespec 
*);
+int clock_getcpuclockid (pid_t, clockid_t *);
+
+struct sigevent;
+int timer_create (clockid_t, struct sigevent *__restrict, timer_t *__restrict);
+int timer_delete (timer_t);
+int timer_settime (timer_t, int, const struct itimerspec *__restrict, struct 
itimerspec *__restrict);
+int timer_gettime (timer_t, struct itimerspec *);
+int timer_getoverrun (timer_t);
+
+extern char *tzname[2];
+
+#endif
+
+
+#if defined(_XOPEN_SOURCE) || defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
+char *strptime (const char *__restrict, const char *__restrict, struct tm 
*__restrict);
+extern int daylight;
+extern long timezone;
+extern int getdate_err;
+struct tm *getdate (const char *);
+#endif
+
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+int stime(const time_t *);
+time_t timegm(struct tm *);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/lib/uktime/musl-imported/src/__month_to_secs.c 
b/lib/uktime/musl-imported/src/__month_to_secs.c
new file mode 100644
index 00000000..43248fb3
--- /dev/null
+++ b/lib/uktime/musl-imported/src/__month_to_secs.c
@@ -0,0 +1,10 @@
+int __month_to_secs(int month, int is_leap)
+{
+       static const int secs_through_month[] = {
+               0, 31*86400, 59*86400, 90*86400,
+               120*86400, 151*86400, 181*86400, 212*86400,
+               243*86400, 273*86400, 304*86400, 334*86400 };
+       int t = secs_through_month[month];
+       if (is_leap && month >= 2) t+=86400;
+       return t;
+}
diff --git a/lib/uktime/musl-imported/src/__secs_to_tm.c 
b/lib/uktime/musl-imported/src/__secs_to_tm.c
new file mode 100644
index 00000000..093d9021
--- /dev/null
+++ b/lib/uktime/musl-imported/src/__secs_to_tm.c
@@ -0,0 +1,82 @@
+#include "time_impl.h"
+#include <limits.h>
+
+/* 2000-03-01 (mod 400 year, immediately after feb29 */
+#define LEAPOCH (946684800LL + 86400*(31+29))
+
+#define DAYS_PER_400Y (365*400 + 97)
+#define DAYS_PER_100Y (365*100 + 24)
+#define DAYS_PER_4Y   (365*4   + 1)
+
+int __secs_to_tm(long long t, struct tm *tm)
+{
+       long long days, secs, years;
+       int remdays, remsecs, remyears;
+       int qc_cycles, c_cycles, q_cycles;
+       int months;
+       int wday, yday, leap;
+       static const char days_in_month[] = 
{31,30,31,30,31,31,30,31,30,31,31,29};
+
+       /* Reject time_t values whose year would overflow int */
+       if (t < INT_MIN * 31622400LL || t > INT_MAX * 31622400LL)
+               return -1;
+
+       secs = t - LEAPOCH;
+       days = secs / 86400;
+       remsecs = secs % 86400;
+       if (remsecs < 0) {
+               remsecs += 86400;
+               days--;
+       }
+
+       wday = (3+days)%7;
+       if (wday < 0) wday += 7;
+
+       qc_cycles = days / DAYS_PER_400Y;
+       remdays = days % DAYS_PER_400Y;
+       if (remdays < 0) {
+               remdays += DAYS_PER_400Y;
+               qc_cycles--;
+       }
+
+       c_cycles = remdays / DAYS_PER_100Y;
+       if (c_cycles == 4) c_cycles--;
+       remdays -= c_cycles * DAYS_PER_100Y;
+
+       q_cycles = remdays / DAYS_PER_4Y;
+       if (q_cycles == 25) q_cycles--;
+       remdays -= q_cycles * DAYS_PER_4Y;
+
+       remyears = remdays / 365;
+       if (remyears == 4) remyears--;
+       remdays -= remyears * 365;
+
+       leap = !remyears && (q_cycles || !c_cycles);
+       yday = remdays + 31 + 28 + leap;
+       if (yday >= 365+leap) yday -= 365+leap;
+
+       years = remyears + 4*q_cycles + 100*c_cycles + 400LL*qc_cycles;
+
+       for (months=0; days_in_month[months] <= remdays; months++)
+               remdays -= days_in_month[months];
+
+       if (months >= 10) {
+               months -= 12;
+               years++;
+       }
+
+       if (years+100 > INT_MAX || years+100 < INT_MIN)
+               return -1;
+
+       tm->tm_year = years + 100;
+       tm->tm_mon = months + 2;
+       tm->tm_mday = remdays + 1;
+       tm->tm_wday = wday;
+       tm->tm_yday = yday;
+
+       tm->tm_hour = remsecs / 3600;
+       tm->tm_min = remsecs / 60 % 60;
+       tm->tm_sec = remsecs % 60;
+
+       return 0;
+}
diff --git a/lib/uktime/musl-imported/src/__tm_to_secs.c 
b/lib/uktime/musl-imported/src/__tm_to_secs.c
new file mode 100644
index 00000000..c29fa985
--- /dev/null
+++ b/lib/uktime/musl-imported/src/__tm_to_secs.c
@@ -0,0 +1,24 @@
+#include "time_impl.h"
+
+long long __tm_to_secs(const struct tm *tm)
+{
+       int is_leap;
+       long long year = tm->tm_year;
+       int month = tm->tm_mon;
+       if (month >= 12 || month < 0) {
+               int adj = month / 12;
+               month %= 12;
+               if (month < 0) {
+                       adj--;
+                       month += 12;
+               }
+               year += adj;
+       }
+       long long t = __year_to_secs(year, &is_leap);
+       t += __month_to_secs(month, is_leap);
+       t += 86400LL * (tm->tm_mday-1);
+       t += 3600LL * tm->tm_hour;
+       t += 60LL * tm->tm_min;
+       t += tm->tm_sec;
+       return t;
+}
diff --git a/lib/uktime/musl-imported/src/__year_to_secs.c 
b/lib/uktime/musl-imported/src/__year_to_secs.c
new file mode 100644
index 00000000..2824ec6d
--- /dev/null
+++ b/lib/uktime/musl-imported/src/__year_to_secs.c
@@ -0,0 +1,47 @@
+long long __year_to_secs(long long year, int *is_leap)
+{
+       if (year-2ULL <= 136) {
+               int y = year;
+               int leaps = (y-68)>>2;
+               if (!((y-68)&3)) {
+                       leaps--;
+                       if (is_leap) *is_leap = 1;
+               } else if (is_leap) *is_leap = 0;
+               return 31536000*(y-70) + 86400*leaps;
+       }
+
+       int cycles, centuries, leaps, rem;
+
+       if (!is_leap) is_leap = &(int){0};
+       cycles = (year-100) / 400;
+       rem = (year-100) % 400;
+       if (rem < 0) {
+               cycles--;
+               rem += 400;
+       }
+       if (!rem) {
+               *is_leap = 1;
+               centuries = 0;
+               leaps = 0;
+       } else {
+               if (rem >= 200) {
+                       if (rem >= 300) centuries = 3, rem -= 300;
+                       else centuries = 2, rem -= 200;
+               } else {
+                       if (rem >= 100) centuries = 1, rem -= 100;
+                       else centuries = 0;
+               }
+               if (!rem) {
+                       *is_leap = 0;
+                       leaps = 0;
+               } else {
+                       leaps = rem / 4U;
+                       rem %= 4U;
+                       *is_leap = !rem;
+               }
+       }
+
+       leaps += 97*cycles + 24*centuries - *is_leap;
+
+       return (year-100) * 31536000LL + leaps * 86400LL + 946684800 + 86400;
+}
diff --git a/lib/uktime/musl-imported/src/time_impl.h 
b/lib/uktime/musl-imported/src/time_impl.h
new file mode 100644
index 00000000..f26d8005
--- /dev/null
+++ b/lib/uktime/musl-imported/src/time_impl.h
@@ -0,0 +1,11 @@
+#include <time.h>
+
+hidden int __days_in_month(int, int);
+hidden int __month_to_secs(int, int);
+hidden long long __year_to_secs(long long, int *);
+hidden long long __tm_to_secs(const struct tm *);
+hidden const char *__tm_to_tzname(const struct tm *);
+hidden int __secs_to_tm(long long, struct tm *);
+hidden void __secs_to_zone(long long, int, int *, long *, long *, const char 
**);
+hidden const char *__strftime_fmt_1(char (*)[100], size_t *, int, const struct 
tm *, locale_t, int);
+extern hidden const char __utc[];
diff --git a/lib/uktime/musl-imported/src/timegm.c 
b/lib/uktime/musl-imported/src/timegm.c
new file mode 100644
index 00000000..4e5907d7
--- /dev/null
+++ b/lib/uktime/musl-imported/src/timegm.c
@@ -0,0 +1,18 @@
+#define _GNU_SOURCE
+#include "time_impl.h"
+#include <errno.h>
+
+time_t timegm(struct tm *tm)
+{
+       struct tm new;
+       long long t = __tm_to_secs(tm);
+       if (__secs_to_tm(t, &new) < 0) {
+               errno = EOVERFLOW;
+               return -1;
+       }
+       *tm = new;
+       tm->tm_isdst = 0;
+       tm->__tm_gmtoff = 0;
+       tm->__tm_zone = __utc;
+       return t;
+}
-- 
2.20.1


_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.