diff options
| author | Maurus Cuelenaere <mcuelenaere@gmail.com> | 2009-05-27 22:48:50 +0000 |
|---|---|---|
| committer | Maurus Cuelenaere <mcuelenaere@gmail.com> | 2009-05-27 22:48:50 +0000 |
| commit | b2581e143d7c9a564026fbe3bf4f471b2260fd0f (patch) | |
| tree | f6a25e4d6626fa986da215db75f781b1d85bc2cc /apps/plugins/lua/gmtime.c | |
| parent | 64595105b1e63eedcd0c47290cf6c0d5e7e4cd46 (diff) | |
| download | rockbox-b2581e143d7c9a564026fbe3bf4f471b2260fd0f.zip rockbox-b2581e143d7c9a564026fbe3bf4f471b2260fd0f.tar.gz rockbox-b2581e143d7c9a564026fbe3bf4f471b2260fd0f.tar.bz2 rockbox-b2581e143d7c9a564026fbe3bf4f471b2260fd0f.tar.xz | |
Lua: add support for os library
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21106 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/lua/gmtime.c')
| -rw-r--r-- | apps/plugins/lua/gmtime.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/apps/plugins/lua/gmtime.c b/apps/plugins/lua/gmtime.c new file mode 100644 index 0000000..f13c855 --- /dev/null +++ b/apps/plugins/lua/gmtime.c @@ -0,0 +1,58 @@ +#include <time.h> + +/* 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; +} |