X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fcalendar.c;h=7330b1a659621d850d4acf9d78ec8fd968bb97e9;hb=a98dca0147497cc47e34902ae3de618f3d6672f5;hp=0a6498dd3ad2def303ac79f26b2756cf9e280853;hpb=dcf9b154cbcaa35c3d8459a201b77eec8bcb30bd;p=pspp-builds.git diff --git a/src/data/calendar.c b/src/data/calendar.c index 0a6498dd..7330b1a6 100644 --- a/src/data/calendar.c +++ b/src/data/calendar.c @@ -13,7 +13,7 @@ /* Calculates and returns floor(a/b) for integer b > 0. */ static int -floor_div (int a, int b) +floor_div (int a, int b) { assert (b > 0); return (a >= 0 ? a : a - b + 1) / b; @@ -22,7 +22,7 @@ floor_div (int a, int b) /* Calculates floor(a/b) and the corresponding remainder and stores them into *Q and *R. */ static void -floor_divmod (int a, int b, int *q, int *r) +floor_divmod (int a, int b, int *q, int *r) { *q = floor_div (a, b); *r = a - b * *q; @@ -30,13 +30,13 @@ floor_divmod (int a, int b, int *q, int *r) /* Returns true if Y is a leap year, false otherwise. */ static bool -is_leap_year (int y) +is_leap_year (int y) { return y % 4 == 0 && (y % 100 != 0 || y % 400 == 0); } static int -raw_gregorian_to_offset (int y, int m, int d) +raw_gregorian_to_offset (int y, int m, int d) { return (EPOCH - 1 + 365 * (y - 1) @@ -56,7 +56,7 @@ calendar_gregorian_to_offset (int y, int m, int d, calendar_error_func *error, void *aux) { /* Normalize year. */ - if (y >= 0 && y < 100) + if (y >= 0 && y < 100) { int epoch = get_epoch (); int century = epoch / 100 + (y < epoch % 100); @@ -64,14 +64,14 @@ calendar_gregorian_to_offset (int y, int m, int d, } /* Normalize month. */ - if (m < 1 || m > 12) + if (m < 1 || m > 12) { - if (m == 0) + if (m == 0) { y--; m = 12; } - else if (m == 13) + else if (m == 13) { y++; m = 1; @@ -84,14 +84,14 @@ calendar_gregorian_to_offset (int y, int m, int d, } /* Normalize day. */ - if (d < 0 || d > 31) + if (d < 0 || d > 31) { error (aux, _("Day %d is not in acceptable range of 0 to 31."), d); return SYSMIS; } /* Validate date. */ - if (y < 1582 || (y == 1582 && (m < 10 || (m == 10 && d < 15)))) + if (y < 1582 || (y == 1582 && (m < 10 || (m == 10 && d < 15)))) { error (aux, _("Date %04d-%d-%d is before the earliest acceptable " "date of 1582-10-15."), y, m, d); @@ -105,9 +105,9 @@ calendar_gregorian_to_offset (int y, int m, int d, /* Returns the number of days in the given YEAR from January 1 up to (but not including) the first day of MONTH. */ static int -cum_month_days (int year, int month) +cum_month_days (int year, int month) { - static const int cum_month_days[12] = + static const int cum_month_days[12] = { 0, 31, /* Jan */ @@ -131,7 +131,7 @@ cum_month_days (int year, int month) Gregorian calendar year it is in. Dates both before and after the epoch are supported. */ int -calendar_offset_to_year (int ofs) +calendar_offset_to_year (int ofs) { int d0; int n400, d1; @@ -153,14 +153,15 @@ calendar_offset_to_year (int ofs) } /* Takes a count of days from 14 Oct 1582 and translates it into - a Gregorian calendar date in (*Y,*M,*D). Dates both before - and after the epoch are supported. */ + a Gregorian calendar date in (*Y,*M,*D). Also stores the + year-relative day number into *YD. Dates both before and + after the epoch are supported. */ void -calendar_offset_to_gregorian (int ofs, int *y, int *m, int *d) +calendar_offset_to_gregorian (int ofs, int *y, int *m, int *d, int *yd) { int year = *y = calendar_offset_to_year (ofs); int january1 = raw_gregorian_to_offset (year, 1, 1); - int yday = ofs - january1 + 1; + int yday = *yd = ofs - january1 + 1; int march1 = january1 + cum_month_days (year, 3); int correction = ofs < march1 ? 0 : (is_leap_year (year) ? 1 : 2); int month = *m = (12 * (yday - 1 + correction) + 373) / 367; @@ -193,19 +194,30 @@ calendar_offset_to_wday (int ofs) /* Takes a count of days from 14 Oct 1582 and returns the month it is in. */ int -calendar_offset_to_month (int ofs) +calendar_offset_to_month (int ofs) { - int y, m, d; - calendar_offset_to_gregorian (ofs, &y, &m, &d); + int y, m, d, yd; + calendar_offset_to_gregorian (ofs, &y, &m, &d, &yd); return m; } /* Takes a count of days from 14 Oct 1582 and returns the corresponding day of the month. */ int -calendar_offset_to_mday (int ofs) +calendar_offset_to_mday (int ofs) { - int y, m, d; - calendar_offset_to_gregorian (ofs, &y, &m, &d); + int y, m, d, yd; + calendar_offset_to_gregorian (ofs, &y, &m, &d, &yd); return d; } + +/* Returns the number of days in the specified month. */ +int +calendar_days_in_month (int y, int m) +{ + static const int days_per_month[12] + = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + + assert (m >= 1 && m <= 12); + return m == 2 && is_leap_year (y) ? 29 : days_per_month[m - 1]; +}