+ 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(<ime, 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