Page 114

Rewrite the routines day_of_year and month_day with pointers instead of indexing.

static char reg_year[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
static char leap_year[] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
static char *daytab[2] = { reg_year, leap_year };

int day_of_year(int year, int month, int day)
{
	int i, leap;

	leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;

	if (year < 0 || month < 1 || month > 12 || day < 1 ||
	    day > *(*(daytab + leap) + month + 1)) {
		return -1;
	}

	for (i = 1; i < month; i++) {
		day += *(*(daytab + leap) + i);
	}
	return day;
}

int month_day(int year, int yearday, int *pmonth, int *pday)
{
	int i, leap;

	leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;

	if (year < 0 || yearday > 365 + leap) {
		return -1;
	}

	for (i = 1; yearday > *(*(daytab + leap) + i); i++) {
		yearday -= *(*(daytab + leap) + i);
	}
	*pmonth = i;
	*pday = yearday;

	return 1;
}

#include <stdio.h>

int main()
{
	printf("%d\n", day_of_year(2021, 07, 19));

	int month, day;
	month_day(2021, 200, &month, &day);
	printf("%d, %d\n", month, day);
}