static char daytab[2][13] = { {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, }; /* set day of year from month & day */ int day_of_year(int year, int month, int day) { int i, leap; if ((month <= 0 || month > 12) || (day <= 0 || day > 31) || (year < 0)) return -1; leap = year%4 == 0 && year%100 != 0 || year%400 == 0; for (i = 1; i < month; i++) day += daytab[leap][i]; return day; } /* set month, day from day of year */ void month_day(int year, int yearday, int *pmonth, int *pday) { int i, leap; if ((year < 0) || (yearday <= 0 || yearday > 366)) { *pmonth = -1; *pday = -1; return; } leap = year%4 == 0 && year%100 != 0 || year%400 == 0; for (i = 1; yearday > daytab[leap][i]; i++) yearday -= daytab[leap][i]; *pmonth = i; *pday = yearday; } /* set day of year from month & day, pointer version */ int pday_of_year(int year, int month, int day) { int leap; char *daytp[][] = daytab; if ((month <= 0 || month > 12) || (day <= 0 || day > 31) || (year < 0)) return -1; leap = year%4 == 0 && year%100 != 0 || year%400 == 0; while (daytp[leap] < daytab[leap] + month + 1) day += *daytp[leap]++; return day; } /* set month, day from day of year, pointer version */ void pmonth_day(int year, int yearday, int *pmonth, int *pday) { int leap; char *daytp[][] = daytab; if ((year < 0) || (yearday <= 0 || yearday > 366)) { *pmonth = -1; *pday = -1; return; } leap = year%4 == 0 && year%100 != 0 || year%400 == 0; while (yearday > *daytab[leap]) yearday -= *daytp[leap]++; *pmonth = daytp[leap] - daytab[leap]; *pday = yearday; }