From 7e0f021a9aec35fd8e6725e87e3313b101d26f5e Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Sun, 27 Jan 2008 11:37:44 +0100 Subject: Initial import (2.0.2-6) --- reference/C/CONTRIB/SNIP/cal.c | 144 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100755 reference/C/CONTRIB/SNIP/cal.c (limited to 'reference/C/CONTRIB/SNIP/cal.c') diff --git a/reference/C/CONTRIB/SNIP/cal.c b/reference/C/CONTRIB/SNIP/cal.c new file mode 100755 index 0000000..f564093 --- /dev/null +++ b/reference/C/CONTRIB/SNIP/cal.c @@ -0,0 +1,144 @@ +/* +** CAL - a calendar for DOS +** +** a public domain demo using Ray Gardner's SCALDATE.C scalar date functions +** by Bob Stout +*/ + +#include +#include + +/* +** function prototypes for SCALDATE.C +*/ + +int isleap (unsigned); +long ymd_to_scalar (unsigned, unsigned, unsigned); + +/* +** calendar generation information +*/ + +int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; +char *month[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; +char *daynames[8] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}; + +/* +** box drawing stuff +*/ + +#ifdef MSDOS + const char *topborder = "\xd5\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd" + "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd" + "\xcd\xcd\xcd\xcd\xb8"; + const char *midborder = "\xc6\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd" + "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd" + "\xcd\xcd\xcd\xcd\xb5"; + const char *botborder = "\xd4\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd" + "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd" + "\xcd\xcd\xcd\xcd\xbe"; + const char *line = "\xb3"; +#else + const char *line = ""; +#endif + +/* +** tell 'em they messed up +*/ + +void usage(void) +{ + puts("Usage: CAL m y"); + puts("where: m = month (1 - 12)"); + puts(" y = year (1 - 99, 1800 - 3000)"); + exit(-1); +} + +/* +** Define ISO to be 1 for ISO (Mon-Sun) calendars +*/ + +#ifndef ISO + #define ISO 0 +#endif + +#if (ISO != 0 && ISO != 1) + #error ISO must be set to either 0 or 1 +#endif + +/* +** here's where the real work's done +*/ + +int main(int argc, char *argv[]) +{ + int day, day_1, numdays, i, j; + unsigned yr, mo; + + if (3 > argc) + usage(); + + yr = atoi(argv[2]); + mo = atoi(argv[1]); + + if (!mo || 12 < mo) + usage(); + + if (100 > yr) + yr += 1900; + + if (3000 < yr || 1800 > yr) + usage(); + + for (i = 0, mo -= 1; i < 3; ++i, ++mo) + { + if (!mo) + { + mo = 12; + --yr; + } + if (12 < mo) + { + mo = 1; + ++yr; + } + numdays = days[mo - 1]; + if (2 == mo && isleap(yr)) + ++numdays; + day_1 = (int)((ymd_to_scalar(yr, mo, 1) - (long)ISO) % 7L); + +#ifdef MSDOS + if (!i) + puts(topborder); +#endif + fputs(line, stdout); + for (j = 0; j < 7; ) + { + fputs(daynames[ISO + j], stdout); + if (7 != ++j) + fputc(' ', stdout); + } + printf("%s < %s, %d\n%s", line, month[mo - 1], yr, line); + + for (day = 0; day < day_1; ++day) + fputs(" ", stdout); + for (day = 1; day <= numdays; ++day, ++day_1, day_1 %= 7) + { + if (!day_1 && 1 != day) + printf("\b%s\n%s", line, line); + printf("%3d ", day); + } + for ( ; day_1; ++day_1, day_1 %= 7) + fputs(" ", stdout); +#ifdef MSDOS + printf("\b%s\n", line); + if (2 > i) + puts(midborder); + else puts(botborder); +#else + fputc('\n', stdout); +#endif + } + return 0; +} -- cgit v1.2.3-54-g00ecf