1 /* Time Keeping Bugs Abound! */
8 static int is_leap_year(year_t year)
10 return (year % 400 == 0) ? 1 :
11 (year % 100 == 0) ? 0 :
12 (year % 4 == 0) ? 1 : 0;
15 static wday_t day_of_week(year_t year, month_t month, day_t day)
17 static int tmp[] = {0, 3, 2, 5, 0, 3,
21 int start = year + year / 4
25 return (start + day) % 7;
29 int days_in_year(year_t year)
31 return 365 + is_leap_year(year);
34 int days_in_month(year_t year, month_t month)
36 static int mdays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
37 int days = mdays[month];
39 days += is_leap_year(year);
43 int weeks_in_month(year_t year, month_t month)
45 int start = start_of_month(year, month);
46 int days = days_in_month(year, month);
47 return ((start + days)-1) / 7 + 1;
50 wday_t start_of_month(year_t year, month_t month)
52 return day_of_week(year, month, 1);
56 const char *month_to_str(month_t month)
58 static const char *map[] =
59 { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
60 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", };
63 const char *month_to_string(month_t month)
65 static const char *map[] =
66 { "January", "February", "March", "April",
67 "May", "June", "July", "August",
68 "September", "October", "November", "December" };
72 const char *day_to_st(wday_t day)
74 static const char *map[] =
75 { "Su","Mo", "Tu", "We", "Th", "Fr", "Sa" };
78 const char *day_to_str(wday_t day)
80 static const char *map[] =
81 { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
84 const char *day_to_string(wday_t day)
86 static const char *map[] =
87 { "Sunday", "Monday", "Tuesday", "Wednesday",
88 "Thursday", "Friday", "Saturday" };
95 printf("Year Month Start Weeks Days\n");
96 for (int y = 2012; y <= 2012; y++)
97 for (int m = JAN; m <= DEC; m++) {
99 printf("%-10s", month_to_string(m));
100 printf("%-6s", day_to_str(start_of_month(y,m)));
101 printf("%-6d", weeks_in_month(y,m));
102 printf("%-2d", days_in_month(y,m));