Moved currently useless parts inside #if 0
[grub2/phcoder.git] / normal / datetime.c
blob44791e18c5a29f73a61e40fbf0f7d021ff063f51
1 /* datetime.c - Module for common datetime function. */
2 /*
3 * GRUB -- GRand Unified Bootloader
4 * Copyright (C) 2008 Free Software Foundation, Inc.
6 * GRUB is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * GRUB is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
20 #include <grub/datetime.h>
22 static char *grub_weekday_names[] =
24 "Sunday",
25 "Monday",
26 "Tuesday",
27 "Wednesday",
28 "Thursday",
29 "Friday",
30 "Saturday",
33 int
34 grub_get_weekday (struct grub_datetime *datetime)
36 int a, y, m;
38 a = (14 - datetime->month) / 12;
39 y = datetime->year - a;
40 m = datetime->month + 12 * a - 2;
42 return (datetime->day + y + y / 4 - y / 100 + y / 400 + (31 * m / 12)) % 7;
45 char *
46 grub_get_weekday_name (struct grub_datetime *datetime)
48 return grub_weekday_names[grub_get_weekday (datetime)];
51 #define SECPERMIN 60
52 #define SECPERHOUR (60*SECPERMIN)
53 #define SECPERDAY (24*SECPERHOUR)
54 #define SECPERYEAR (365*SECPERDAY)
55 #define SECPER4YEARS (4*SECPERYEAR+SECPERDAY)
58 void
59 grub_unixtime2datetime (grub_int32_t nix, struct grub_datetime *datetime)
61 int i;
62 int div;
63 grub_uint8_t months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
64 /* In the period of validity of unixtime all years divisible by 4
65 are bissextile*/
66 /* Convenience: let's have 3 consecutive non-bissextile years
67 at the beginning of the epoch. So count from 1973 instead of 1970 */
68 nix -= 3*SECPERYEAR + SECPERDAY;
69 /* Transform C divisions and modulos to mathematical ones */
70 div = nix / SECPER4YEARS;
71 if (nix < 0)
72 div--;
73 datetime->year = 1973 + 4 * div;
74 nix -= div * SECPER4YEARS;
76 /* On 31st December of bissextile years 365 days from the beginning
77 of the year elapsed but year isn't finished yet */
78 if (nix / SECPERYEAR == 4)
80 datetime->year += 3;
81 nix -= 3*SECPERYEAR;
83 else
85 datetime->year += nix / SECPERYEAR;
86 nix %= SECPERYEAR;
88 for (i = 0; i < 12
89 && nix >= ((grub_int32_t) (i==1 && datetime->year % 4 == 0
90 ? 29 : months[i]))*SECPERDAY; i++)
91 nix -= ((grub_int32_t) (i==1 && datetime->year % 4 == 0
92 ? 29 : months[i]))*SECPERDAY;
93 datetime->month = i + 1;
94 datetime->day = 1 + (nix / SECPERDAY);
95 nix %= SECPERDAY;
96 datetime->hour = (nix / SECPERHOUR);
97 nix %= SECPERHOUR;
98 datetime->minute = nix / SECPERMIN;
99 datetime->second = nix % SECPERMIN;