summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSadeep Madurange <smadurange@users.noreply.github.com>2022-01-04 18:47:36 +0800
committerSadeep Madurange <smadurange@users.noreply.github.com>2022-01-04 18:47:36 +0800
commit9eaa5264381f5355c26ced80ec91c8cb156c339f (patch)
treede5d2504d225cfc3da6dd48eb95207ec1e6de625
parentaee53a9e46d7045b199c5e18324b549285b008ea (diff)
downloadk&r-exercises-9eaa5264381f5355c26ced80ec91c8cb156c339f.tar.gz
5.8
-rw-r--r--5/8.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/5/8.c b/5/8.c
index a659364..f1bbc7f 100644
--- a/5/8.c
+++ b/5/8.c
@@ -6,8 +6,6 @@ int day_of_year(int year, int month, int day);
/* Sets month and day from day of year */
void month_day(int year, int yearday, int *pmonth, int *pday);
-int main() { return 0; }
-
static char daytab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
@@ -15,6 +13,22 @@ static char daytab[2][13] = {
int day_of_year(int year, int month, int day) {
int i, leap;
+ // leap year logic is only valid if this is true.
+ if (year < 1752) {
+ printf("error: invalid year\n");
+ return -1;
+ }
+
+ if (month < 1 || month > 12) {
+ printf("error: invalid month\n");
+ return -1;
+ }
+
+ if (day < 1) {
+ printf("error: invalid day\n");
+ return -1;
+ }
+
leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
for (i = 1; i < month; i++)
@@ -25,6 +39,18 @@ int day_of_year(int year, int month, int day) {
void month_day(int year, int yearday, int *pmonth, int *pday) {
int i, leap;
+
+ if (year < 0) {
+ *pmonth = *pday = 0;
+ printf("error: invalid year\n");
+ return;
+ }
+
+ if (yearday < 1) {
+ *pmonth = *pday = 0;
+ printf("error: invalid yearday\n");
+ return;
+ }
leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;