
/*
 * Full year calendar generator 
 *
 * pasp@users.sourceforge.net
 *
 */

#include <stdio.h>

#define MAX_MONTHS      12
#define MAX_WEEKS       6
#define DAYS_PER_WEEK   7

void
fill_calendar(int year, char *calendar_table) {

int days_in_month[] = {
    31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};

int i, j, x;
int leap, days, fday;

    for(i=0; i < MAX_MONTHS*(MAX_WEEKS*DAYS_PER_WEEK-(MAX_WEEKS-1)); i++) {
        calendar_table[i] = -1;
    }

    for(j=0; j < MAX_MONTHS; j++) {

        leap = year % ((!(year % 100)) ? 400 : 4);
        days = days_in_month[j] + ((j == 1 && !leap) ? 1 : 0);
        i = (j + 10) % 12 + 1;
        x = year - i / 11;
        fday = (((13*i-1) / 5) + ((x % 100) / 4) + (x / 400) + (x % 100) - 2*(x / 100)) % DAYS_PER_WEEK;
        fday = (fday+DAYS_PER_WEEK) % DAYS_PER_WEEK + 1;

        i = 1;

        while (--days >= 0) {
            calendar_table[j*(MAX_WEEKS*DAYS_PER_WEEK-(MAX_WEEKS-1)) - 1 + fday++] = i++;
        }

    }

}


void
display_calendar(int year, char *calendar_table) {

char *day_names[] = {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su" };
char *month_names[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };

int i, j;
char d;

    printf("\n* %d *\n\n     ", year);

    for(i=0; i < (MAX_WEEKS*DAYS_PER_WEEK-(MAX_WEEKS-1)); i++) {
        printf("%s ", day_names[i%7]);
    }
    printf("\n     ");
    for(i=0; i < (MAX_WEEKS*DAYS_PER_WEEK-(MAX_WEEKS-1)); i++) {
        printf("==+");
    }
    printf("\n");

    for(i=0; i < MAX_MONTHS; i++) {

        printf("%s: ", month_names[i]);

        for(j=0; j < (MAX_WEEKS*DAYS_PER_WEEK-(MAX_WEEKS-1)); j++) {
            d = calendar_table[i*(MAX_WEEKS*DAYS_PER_WEEK-(MAX_WEEKS-1))+j];
            if (d < 0) {
                printf("   ");
            } else {
                printf("%2d ", d);
            }
        }

        printf("\n");
    }
}


int main(int argc, char **argv) {

char calendar_table[MAX_MONTHS*(MAX_WEEKS*DAYS_PER_WEEK-(MAX_WEEKS-1))];
int year;

    year = 2007;

    fill_calendar(year, calendar_table);
    display_calendar(year, calendar_table);

    return 0;
}


/* 15.07.2007 */


