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

Re: [tyndur-devel] [PATCH] libc: gmtime() und localtime()



+ libc: gmtime() und localtime()
    localtime geht noch fest von UTC+1 aus

Signed-off-by: Andreas Freimuth <m.nemo@xxxxxxx>

diff --git a/src/modules/include/time.h b/src/modules/include/time.h
--- a/src/modules/include/time.h
+++ b/src/modules/include/time.h
@@ -46,6 +46,13 @@
 
 time_t time(time_t* t);
 
+/// Timestamp in tm-Struct einfuellen
+struct tm* gmtime(const time_t* time_ptr);
+struct tm* gmtime_r(const time_t* time_ptr, struct tm* result);
+
+struct tm* localtime(const time_t* time_ptr);
+struct tm* localtime_r(const time_t* time_ptr, struct tm* result);
+
 #ifndef CONFIG_LIBC_NO_STUBS
 /// Datum und Uhrzeit in einen String umwandeln
 char* ctime(const time_t* time_ptr);
@@ -53,11 +60,6 @@
 /// Zeit und Datum als String
 char* asctime(const struct tm* time_ptr);
 
-/// Timestamp in tm-Struct einfuellen
-struct tm* gmtime(const time_t* time_ptr);
-
-struct tm* localtime(const time_t* time_ptr);
-
 time_t mktime(struct tm* time_ptr);
 #endif
 
diff --git a/src/modules/lib/stdlibc/time.c b/src/modules/lib/stdlibc/time.c
--- a/src/modules/lib/stdlibc/time.c
+++ b/src/modules/lib/stdlibc/time.c
@@ -30,18 +30,9 @@
 #include <stdio.h>
 #include <lost/config.h>
 
+static struct tm tm;
+
 #ifndef CONFIG_LIBC_NO_STUBS
-static struct tm tm = {
-    .tm_wday = 3,
-    .tm_mday = 42,
-    .tm_mon = 6,
-    .tm_year = 1337,
-    .tm_yday = 1337,
-
-    .tm_hour = 13,
-    .tm_min = 37,
-    .tm_sec = 42
-};
 static char* asctime_buf = "Wed Jun 42 13:37:42 1337\n";
 static char* ctime_string = "Wed Jun 42 13:37:42 1337\n";
 #endif
@@ -54,14 +45,14 @@
 time_t time(time_t* t)
 {
     time_t result = 0;
-    
+
     FILE* time_file = fopen("cmos:/unix_time", "r");
     if (time_file == NULL) {
         printf("time():Konnte 'cmos:/unix_time' nicht oeffnen. Ist das ");
         printf("cmos-Modul geladen?\n");
         return 0;
     }
-    
+
     fread(&result, sizeof(time_t), 1, time_file);
     fclose(time_file);
 
@@ -71,33 +62,117 @@
     return result;
 }
 
-#ifndef CONFIG_LIBC_NO_STUBS
 /**
- * TODO
- **/
-struct tm* localtime(const time_t* time)
+ * Timestamp, unter Bachtung der Zeitzone, in tm-Struktur einfuellen
+ *
+ * @param timer_ptr Pointer auf den Timestamp
+ * @param result Pointer auf die tm-Struktur, die gefuellt werden soll.
+ *
+ * @return result
+ */
+struct tm* localtime_r(const time_t* time_ptr, struct tm* result)
 {
-    // TODO
-    return &tm;
+    /* FIXME hier wird fest von UTC+1 ausgegangen */
+    time_t ltime = *time_ptr + 60*60;
+    return gmtime_r(&ltime, result);
+}
+
+/**
+ * Timestamp, unter Bachtung der Zeitzone, in tm-Struktur einfuellen
+ *
+ * @param timer_ptr Pointer auf den Timestamp
+ *
+ * @return Pointer auf die interne statisch allozierte tm-Struktur. Diese kann
+ *          bei jedem Aufruf einer Zeitfunktion ueberschrieben werden!
+ */
+struct tm* localtime(const time_t* time_ptr)
+{
+    return localtime_r(time_ptr, &tm);
 }
 
 /**
  * Timestamp in tm-Struktur einfuellen
  *
- * @param time_ptr Pointer auf den Timestamp
+ * @param timer_ptr Pointer auf den Timestamp
+ * @param result Pointer auf die tm-Struktur, die gefuellt werden soll.
+ *
+ * @return result
+ */
+struct tm* gmtime_r(const time_t* timer_ptr, struct tm* result)
+{
+    static const int monat[2][12] = {
+        { 0,31,59,90,120,151,181,212,243,273,304,334},
+        { 0,31,60,91,121,152,182,213,244,274,305,335}
+    };
+
+    time_t time = *timer_ptr;
+    int schaltjahr = 0;
+
+    /* die Uhrzeit ist noch einfach */
+    result->tm_sec = time % 60;
+    time /= 60;
+    result->tm_min = time % 60;
+    time /= 60;
+    result->tm_hour = time % 24;
+    time /= 24;
+
+    /* 01.01.70 wahr ein Donnerstag (4) */
+    result->tm_wday = (time + 4) % 7;
+
+    /* jetzt kommen die Schaltjahre ins Spiel */
+
+    /* rebase auf 1969-01-01 00:00:00 UTC
+     * dann ist jedes 4. Jahr ein Schaltjahr
+     */
+    time += 365;
+
+    int tmp_years = 69 + 4 * (time / (4*365 + 1));
+    time %= 4*365 + 1;
+
+    if( (time / 365) > 2 ) {
+        schaltjahr = 1;
+        result->tm_year = tmp_years + 3;
+        result->tm_yday = time - 3*365;
+    } else {
+        result->tm_year = tmp_years + (time / 365);
+        result->tm_yday = time % 365;
+    }
+
+    /* den richtigen monat raussuchen */
+    if( monat[schaltjahr][result->tm_yday / 30] > result->tm_yday ) {
+        result->tm_mon = (result->tm_yday / 30) - 1;
+    } else if( monat[schaltjahr][result->tm_yday / 30 + 1] > result->tm_yday ) {
+        result->tm_mon = (result->tm_yday / 30);
+    } else {
+        result->tm_mon = (result->tm_yday / 30) + 1;
+    }
+
+    result->tm_mday = 1 + (result->tm_yday - monat[schaltjahr][result->tm_mon]);
+
+    result->tm_isdst = -1;
+
+    return result;
+}
+
+/**
+ * Timestamp in tm-Struktur einfuellen
+ *
+ * @param timer_ptr Pointer auf den Timestamp
  *
  * @return Pointer auf die interne statisch allozierte tm-Struktur. Diese kann
  *          bei jedem Aufruf einer Zeitfunktion ueberschrieben werden!
  */
-struct tm* gmtime(const time_t* time_ptr)
+struct tm* gmtime(const time_t* timer_ptr)
 {
-    // TODO
-    return &tm;
+    return gmtime_r(timer, &tm);
 }
 
+
+#ifndef CONFIG_LIBC_NO_STUBS
+
 /**
  * TODO
- **/
+ */
 char* asctime(const struct tm* time)
 {
     // TODO

Attachment: signature.asc
Description: OpenPGP digital signature