From b2581e143d7c9a564026fbe3bf4f471b2260fd0f Mon Sep 17 00:00:00 2001 From: Maurus Cuelenaere Date: Wed, 27 May 2009 22:48:50 +0000 Subject: Lua: add support for os library git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21106 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/lua/gmtime.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 apps/plugins/lua/gmtime.c (limited to 'apps/plugins/lua/gmtime.c') diff --git a/apps/plugins/lua/gmtime.c b/apps/plugins/lua/gmtime.c new file mode 100644 index 0000000000..f13c855de8 --- /dev/null +++ b/apps/plugins/lua/gmtime.c @@ -0,0 +1,58 @@ +#include + +/* seconds per day */ +#define SPD 24*60*60 + +/* days per month -- nonleap! */ +const short __spm[13] = + { 0, + (31), + (31+28), + (31+28+31), + (31+28+31+30), + (31+28+31+30+31), + (31+28+31+30+31+30), + (31+28+31+30+31+30+31), + (31+28+31+30+31+30+31+31), + (31+28+31+30+31+30+31+31+30), + (31+28+31+30+31+30+31+31+30+31), + (31+28+31+30+31+30+31+31+30+31+30), + (31+28+31+30+31+30+31+31+30+31+30+31), + }; + +int __isleap(int year) { + /* every fourth year is a leap year except for century years that are + * not divisible by 400. */ +/* return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); */ + return (!(year%4) && ((year%100) || !(year%400))); +} + +struct tm *gmtime(const time_t *timep) { + static struct tm r; + time_t i; + register time_t work=*timep%(SPD); + r.tm_sec=work%60; work/=60; + r.tm_min=work%60; r.tm_hour=work/60; + work=*timep/(SPD); + r.tm_wday=(4+work)%7; + for (i=1970; ; ++i) { + register time_t k=__isleap(i)?366:365; + if (work>=k) + work-=k; + else + break; + } + r.tm_year=i-1900; + r.tm_yday=work; + + r.tm_mday=1; + if (__isleap(i) && (work>58)) { + if (work==59) r.tm_mday=2; /* 29.2. */ + work-=1; + } + + for (i=11; i && (__spm[i]>work); --i) ; + r.tm_mon=i; + r.tm_mday+=work-__spm[i]; + return &r; +} -- cgit v1.2.3