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

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



Wie ich gerade feststellen musste, hatte das mit dem Postfix gestern
noch nicht so recht geklappt, was dazu führte, dass mailman die Mails
nicht an die Adressen ausserhalb meines Servers zustellen konnte.
Deshalb sende ich diese Nachricht nochmal.

----- Forwarded message from Andreas Freimuth <m.nemo@xxxxxxx> -----

Date: Wed, 12 Aug 2009 01:11:40 +0200
From: Andreas Freimuth <m.nemo@xxxxxxx>
To: tyndur-Patches <tyndur-devel@xxxxxxxxxx>
Subject: Re: [tyndur-devel] [PATCH] libc: gmtime() und localtime()

Ich habe es tatsächlich geschaft noch einen neuen Fehler einzubauen.

--
Andreas Freimuth


+ 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_ptr, &tm);
 }
 
+
+#ifndef CONFIG_LIBC_NO_STUBS
+
 /**
  * TODO
- **/
+ */
 char* asctime(const struct tm* time)
 {
     // TODO




----- End forwarded message -----

-- 
Antoine Kaufmann
<toni@xxxxxxxxxxxxxxxx>

Attachment: pgp4s1MnFez1t.pgp
Description: PGP signature