]> git.proxmox.com Git - grub2.git/blame - normal/datetime.c
Merge mainline into sparc-mkimage
[grub2.git] / normal / datetime.c
CommitLineData
05aaebfb 1/* datetime.c - Module for common datetime function. */
2/*
3 * GRUB -- GRand Unified Bootloader
4 * Copyright (C) 2008 Free Software Foundation, Inc.
5 *
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.
10 *
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.
15 *
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/>.
18 */
19
20#include <grub/datetime.h>
21
22static char *grub_weekday_names[] =
23{
24 "Sunday",
25 "Monday",
26 "Tuesday",
27 "Wednesday",
28 "Thursday",
29 "Friday",
30 "Saturday",
31};
32
33int
34grub_get_weekday (struct grub_datetime *datetime)
35{
36 int a, y, m;
37
38 a = (14 - datetime->month) / 12;
39 y = datetime->year - a;
40 m = datetime->month + 12 * a - 2;
41
42 return (datetime->day + y + y / 4 - y / 100 + y / 400 + (31 * m / 12)) % 7;
43}
44
45char *
46grub_get_weekday_name (struct grub_datetime *datetime)
47{
48 return grub_weekday_names[grub_get_weekday (datetime)];
49}
50
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)
56
57
58void
59grub_unixtime2datetime (grub_int32_t nix, struct grub_datetime *datetime)
60{
61 int i;
62 int div;
b39f9d20 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
05aaebfb 65 are bissextile*/
b39f9d20 66 /* Convenience: let's have 3 consecutive non-bissextile years
4241d2b1 67 at the beginning of the epoch. So count from 1973 instead of 1970 */
05aaebfb 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;
75
4241d2b1 76 /* On 31st December of bissextile years 365 days from the beginning
77 of the year elapsed but year isn't finished yet */
05aaebfb 78 if (nix / SECPERYEAR == 4)
79 {
80 datetime->year += 3;
81 nix -= 3*SECPERYEAR;
82 }
83 else
84 {
85 datetime->year += nix / SECPERYEAR;
86 nix %= SECPERYEAR;
87 }
b39f9d20 88 for (i = 0; i < 12
89 && nix >= ((grub_int32_t) (i==1 && datetime->year % 4 == 0
05aaebfb 90 ? 29 : months[i]))*SECPERDAY; i++)
b39f9d20 91 nix -= ((grub_int32_t) (i==1 && datetime->year % 4 == 0
05aaebfb 92 ? 29 : months[i]))*SECPERDAY;
b39f9d20 93 datetime->month = i + 1;
05aaebfb 94 datetime->day = 1 + (nix / SECPERDAY);
95 nix %= SECPERDAY;
b39f9d20 96 datetime->hour = (nix / SECPERHOUR);
05aaebfb 97 nix %= SECPERHOUR;
98 datetime->minute = nix / SECPERMIN;
99 datetime->second = nix % SECPERMIN;
100}