/* File: mycal5.c

   Step 5 in writing my version of the
   calendar program.  Printing an 
   entire year.
*/

#include <stdio.h>
#include "genlib.h"
#include "simpio.h"

void PrintOneMonth(int start, int days) ;
int AddDay(int weekday, int inc) ;
int YearDays(int year) ; 
int MonthDays(int month, int year) ;
bool IsLeapYear(int year) ;

main() {
  int year, month, i ;
  int start, this_month_days ;

  printf("year =? ") ;
  year = GetInteger() ;

  /* January 1900, starts on Monday */
  start = 1 ;
  for (i = 1900; i < year ; i++) {
     start = AddDay(start, YearDays(i)) ;
  }

  for (month = 1 ; month <= 12 ; month++) {
      printf("Month = %d\n", month) ;
      printf("  S  M Tu  W Th  F  S\n") ;
      this_month_days = MonthDays(month, year) ;
      PrintOneMonth(start, this_month_days) ;
      printf("\n") ;
      start = AddDay(start, this_month_days) ;
  }
}

int AddDay(int weekday, int inc) {
   return( (weekday + inc) % 7 ) ;
}

void PrintOneMonth(int start, int days) {
   int i ;

   /* Indent the first line */
   for (i = 0 ; i < start ; i++) {
      printf("   ") ;
   }

   for (i = 1 ; i <= days ; i++) {
      printf("%3d", i) ;
      /* print newline at end of week */
      if ( (i + start) % 7 == 0 ) {
	 printf("\n") ;
      }
   }

   /* Print newline at end of month
     only if necessary */
   if( (i + start) % 7 != 1)  {
      printf("\n") ;
   }
}

int YearDays(int year) {
   if (IsLeapYear(year)) {
      return(366) ;
   } else {
      return(365) ;
   }
}

int MonthDays(int month, int year) {
    switch (month) {
      case 2:
        if (IsLeapYear(year)) return (29);
        return (28);
      case 4: case 6: case 9: case 11:
        return (30);
      default:
        return (31);
    }
}

bool IsLeapYear(int year) {
    return ( ((year % 4 == 0) && (year % 100 != 0))
             || (year % 400 == 0) );
}
