/* * cal.c -- カレンダ * * Copyright (C) 1990, 2006 candy * */ static char rcsid[] = "$Id: cal.c,v 2.1 1992/07/03 10:27:34 candy Exp candy $"; /* * XC の localtime はバギーなので注意。 * tm_mon が(0 .. 11)でなく(1 .. 12) になっている。 * バグフィクスして使用してね。 */ #include #include #include #include #include #include "calendar.h" char *myname; static char usage_msg[] = "カレンダ V0.8089\n" "Usage: %s {[month] [year]} ...\n" "Ex:\tcal\t\t今月\n" "\tcal 2\t\t今年 2 月\n" "\tcal 1990\t\t1990年\n" "\tcal 11 1990\t\t1990 の 11 月\n" "Not: かっこよく表示したい時は `cal 1990 | mc -l8' として下さい\n" ; /* * */ static char *monName[12] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; /* * */ void cal1(int yy, int mm) { char top[64]; int i, d, countnl; long mjd = ymd_to_mjd(yy, mm + 1, 1); int week = week_of_mjd(mjd); int d1 = day_of_manth(yy, mm + 1); snprintf(top, sizeof(top), "%s %d", monName[mm], yy); printf("%*s%s\nSu Mo Tu We Th Fr Sa\n", (20 - strlen(top)) / 2, "", top); for (i = 0; i < week; i++) fputs(i + 1 == week ? " " : " ", stdout); countnl = 0; for (d = 0; d < d1; d++) { if (week != 0) putchar(' '); printf("%2d", d + 1); week++; if (week == 7) { putchar('\n'); week = 0; countnl++; } }/* for */ if (week != 0) { putchar('\n'); countnl++; } while (countnl < 6) { putchar('\n'); countnl++; } }/* cal1 */ /* * */ void cal(int y0, int y1, int m0, int m1) { int year, month; for (year = y0; year <= y1; year++) { for (month = m0; month <= m1; month++) { cal1(year, month); }/* for */ }/* for */ }/* cal */ /* * */ int main(int argc, char *argv[]) { time_t theTime; struct tm theTm; int m0, m1, y0, y1; int show_usage; myname = argv[0]; show_usage = 0; time(&theTime); theTm = *localtime(&theTime); if (argc == 1) { y0 = y1 = theTm.tm_year + 1900; m0 = m1 = theTm.tm_mon; cal(y0, y1, m0, m1); } else { int i; for (i = 1; i < argc; i++) { int x; char *par; par = argv[i]; x = atoi(par); if (x <= 0) { show_usage++; } if (x <= 12) { /* month */ m0 = m1 = x - 1; y0 = y1 = theTm.tm_year + 1900; if (i + 1 < argc) { x = atoi(argv[i + 1]); if (x > 12) { /* month year */ i++; /* year を捨てる */ y0 = y1 = x; } } } else { /* year */ m0 = 0; m1 = 11; y0 = y1 = x; } if (show_usage || m0 < 0 || m0 >= 12 || m1 < 0 || m1 >= 12) { fprintf(stderr, usage_msg, myname); exit(1); } cal(y0, y1, m0, m1); }/* for */ }/* argc != 1 */ return 0; }/* main */