koreth@panarthea.ebay.sun.com (Steven Grimm) (11/26/89)
Submitted-by: mlake@irscscm.ucb.com (Marshall Lake)
Posting-number: Volume 3, Issue 12
Archive-name: cal
The enclosed source code is a UNIX-like calendar program.
It was developed using MWC. The documentation is self-contained.
-------CUT-------
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".
# Contents: ./cal.c
if test -f './cal.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'./cal.c'\"
else
echo shar: Extracting \"'./cal.c'\" \(12751 characters\)
sed "s/^X//" >'./cal.c' <<'END_OF_FILE'
/*
cal: a UNIX-like calendar program
format: cal [-nihf filename]
where n = the number of days to look ahead including
today, max 99, default 2
filename = file to look for instead of cal.txt
i return information regarding CAL
h return help with regard to CAL
f use the following specified file as input to CAL
instead of cal.txt
RETURNS:
0 - CAL terminated successfully
1 - bad calling format
2 - "count of days" greater than 99 or longer than 2 positions
3 - "count of days" = 0
4 - cal.txt file not found
5 - record in cal.txt greater than 1000 characters
6 - information only requested (i and/or h options)
Marshall Lake, TEAM Software, 4/26/88
POB 7332
Washington, DC 20044
Tel 703-533-2132
Fax 703-538-4598
GEnie: MLAKE
CIS: 73717,3174
uucp: ...{media,teemc,tcsc3b2,ki4pv}!ka3ovk!irscscm!mlake
*/
#include <time.h>
#include <stdio.h>
#include <osbind.h>
#include <ctype.h>
long elapsed_time;
char today[26],
filename[100] = "cal.txt",
blanks[14] = " ",
alpha_months[37] = "JanFebMarAprMayJunJulAugSepOctNovDec",
full_months[109] = "january february march april may june\
july august septemberoctober november december ";
int orig_day, day,
orig_month, month;
main (argc, argv)
int argc;
char *argv[];
{
int x,
y,
l,
set_i, set_f, set_h, set_n,
count_of_days,
loop;
char cal_rec[1001],
mat1[5], /* mm/dd */
mat11[4], /* m/dd */
mat12[4], /* mm/d */
mat13[3], /* m/d */
mat2[5], /* mm-dd */
mat21[4], /* m-dd */
mat22[4], /* mm-d */
mat23[3], /* m-d */
mat3[6], /* aaa dd */
mat31[5], /* aaa d */
mat4[6], /* dd aaa */
mat41[5], /* d aaa */
mat5[13], /* aaaaaaaaa dd */
mat51[12], /* aaaaaaaaa d */
mat6[13], /* dd aaaaaaaaa */
mat61[12]; /* d aaaaaaaaa */
FILE *stream;
if (argc > 3)
bad_format ();
set_i = set_h = set_f = set_n = 0;
if (argc > 1) {
if (strlen (argv[1]) > 6 || argv[1][0] != '-')
bad_format ();
for (x = 1; x < strlen (argv[1]); x++)
if (argv[1][x] >= '0' && argv[1][x] <= '9') {
if (set_n == 1)
bad_format ();
set_n = 1;
if (argv[1][x + 1] >= '0' && argv[1][x + 1] <= '9') {
if (argv[1][x + 2] >= '0' && argv[1][x + 2] <= '9') {
fprintf (stderr, " max count 2 digits\n\n");
exit (2);
}
count_of_days = (argv[1][x] - '0') * 10 +
(argv[1][x + 1] - '0');
x++;
}
else
count_of_days = argv[1][x] - '0';
}
else
if (argv[1][x] == 'f') {
if (set_f == 1 || argc != 3)
bad_format ();
set_f = 1;
}
else
if (argv[1][x] == 'i') {
if (set_i == 1)
bad_format ();
set_i = 1;
}
else
if (argv[1][x] == 'h') {
if (set_h == 1)
bad_format ();
set_h = 1;
}
else
bad_format ();
}
if (set_n == 0)
count_of_days = 2;
if (set_f == 1)
strcpy (&filename[0], argv[2]);
if (set_i == 1) {
printf ("\n\n CAL: a UNIX-like calendar program\n");
printf (" written by M. Lake\n");
printf (" v1.3 7/28/88\n\n");
}
if (set_h == 1)
print_info ();
if (count_of_days == 0)
exit (3);
if (set_i == 1 || set_h == 1 && set_n == 0 && set_f == 0)
exit (6);
time (&elapsed_time);
strncpy (&today[0], ctime (&elapsed_time), 26);
orig_day = (today[8] - '0') * 10 + (today[9] - '0');
for (x = 0; x < 34; x += 3)
if (strncmp (&today[4], &alpha_months[x], 3) == 0)
orig_month = x / 3 + 1;
if ((stream = fopen (filename, "rb")) == NULL) {
fprintf (stderr,
"%s file does not exist where it is expected!\n\n", filename);
exit (4);
}
mat1[2] = mat11[1] = mat12[2] = mat13[1] = '/';
mat2[2] = mat21[1] = mat22[2] = mat23[1] = '-';
mat3[3] = mat4[2] = mat31[3] = mat41[1] = ' ';
cal_rec[1000] = '\0';
while (1) {
next_record:
month = orig_month;
day = orig_day;
if ((fgets (&cal_rec[0], 1001, stream)) == 0) {
fclose (stream);
exit (0);
}
if (strlen (&cal_rec[0]) == 1000) {
fprintf (stderr, "\n\nA record in %s is too big!!\n", filename);
fprintf (stderr, "1000 characters is the largest allowed.\n");
fclose (stream);
exit (5);
}
l = strlen (&cal_rec[0]) - 1;
for (loop = 0; loop < count_of_days; loop++) {
strncpy (&mat5[0], &blanks[0], 13);
strncpy (&mat6[0], &blanks[0], 13);
strncpy (&mat51[0], &blanks[0], 12);
strncpy (&mat61[0], &blanks[0], 12);
mat1[0] = mat2[0] = mat12[0] = mat22[0] = month / 10 + '0';
mat1[1] = mat2[1] = mat11[0] = mat21[0] = mat12[1] =
mat22[1] = mat13[0] = mat23[0] = month % 10 + '0';
mat1[3] = mat2[3] = mat3[4] = mat4[0] = mat6[0] = mat11[2] =
mat21[2] = day / 10 + '0';
mat1[4] = mat2[4] = mat3[5] = mat4[1] = mat6[1] = mat11[3] =
mat21[3] = mat12[3] = mat22[3] = mat13[2] = mat23[2] =
mat31[4] = mat41[0] = mat61[0] = day % 10 + '0';
for (x = (month - 1) * 3, y = 0; y < 3; x++, y++)
mat3[y] = mat4[y + 3] = mat31[y] = mat41[y + 2] =
alpha_months[x];
for (x = (month - 1) * 9, y = 0; y < 9; x++, y++)
mat5[y] = mat6[y + 3] = mat51[y] = mat61[y + 2] =
full_months[x];
for (x = 3; x < 12; x++)
if (mat6[x] == ' ') {
mat6[x] = mat5[x] = mat61[x - 1] = mat51[x - 1] = '\0';
break;
}
mat5[x - 2] = day / 10 + '0';
mat5[x - 1] = mat51[x - 2] = day % 10 + '0';
for (x = 0; (x + 2) < l; x++) {
if (strncmp (&cal_rec[x], &mat1[0], 5) == 0 ||
strncmp (&cal_rec[x], &mat2[0], 5) == 0 ||
strnicmp (&cal_rec[x], &mat3[0], 6) == 0 ||
strnicmp (&cal_rec[x], &mat5[0], strlen (&mat5[0])) == 0 ||
strnicmp (&cal_rec[x], &mat6[0], strlen (&mat6[0])) == 0 ||
strnicmp (&cal_rec[x], &mat4[0], 6) == 0) {
printf ("%s", cal_rec);
goto next_record;
}
if (month < 10 && day < 10)
if ((strncmp (&cal_rec[x], &mat13[0], 3) == 0 ||
strncmp (&cal_rec[x], &mat23[0], 3) == 0) &&
(cal_rec[x - 1] < '0' || cal_rec[x - 1] > '9') &&
(cal_rec[x + 3] < '0' || cal_rec[x + 3] > '9')) {
printf ("%s", cal_rec);
goto next_record;
}
if (month < 10)
if ((strncmp (&cal_rec[x], &mat11[0], 4) == 0 ||
strncmp (&cal_rec[x], &mat21[0], 4) == 0) &&
(cal_rec[x - 1] < '0' || cal_rec[x - 1] > '9')) {
printf ("%s", cal_rec);
goto next_record;
}
if (day < 10) {
if (((strncmp (&cal_rec[x], &mat12[0], 4) == 0 ||
strncmp (&cal_rec[x], &mat22[0], 4) == 0) &&
(cal_rec[x + 4] < '0' || cal_rec[x + 4] > '9')) ||
(strnicmp (&cal_rec[x], &mat31[0], 5) == 0 &&
(cal_rec[x + 5] < '0' || cal_rec[x + 5] > '9')) ||
(strnicmp (&cal_rec[x], &mat41[0], 5) == 0 &&
(cal_rec[x - 1] < '0' || cal_rec[x - 1] > '9'))) {
printf ("%s", cal_rec);
goto next_record;
}
if ((strnicmp (&cal_rec[x], &mat51[0],
strlen (&mat51[0])) == 0 &&
(cal_rec[x + strlen (&mat51[0])] < '0' ||
cal_rec[x + strlen (&mat51[0])] > '9')) ||
(strnicmp (&cal_rec[x], &mat61[0],
strlen (&mat61[0])) == 0 &&
(cal_rec[x - 1] < '0' || cal_rec[x - 1] > '9'))) {
printf ("%s", cal_rec);
goto next_record;
}
}
}
add_a_day ();
}
}
}
add_a_day () {
day++;
if (day == 29 && month == 2) {
day = 1;
month++;
}
if (day == 31 && (month == 9 || month == 4 ||
month == 6 || month == 11)) {
day = 1;
month++;
}
if (day == 32)
if (month == 12)
day = month = 1;
else {
day = 1;
month++;
}
}
bad_format () {
fprintf (stderr, "\n format: 'cal [-nihf filename]'\n");
fprintf (stderr, " where n = count of days to check\n");
fprintf (stderr, "\n enter 'cal -h' and press <RETURN> for help\n");
exit (1);
}
/* check for a match with no regard to case */
strnicmp (a, b, length)
char *a, *b;
int length;
{
char a_fld[100], b_fld[100];
int x;
strncpy (&a_fld[0], a, length);
strncpy (&b_fld[0], b, length);
for (x = 0; x < length; x++) {
if (isupper (a_fld[x]))
a_fld[x] = tolower (a_fld[x]);
if (isupper (b_fld[x]))
b_fld[x] = tolower (b_fld[x]);
}
return (strncmp (&a_fld[0], &b_fld[0], length));
}
print_info () {
printf ("\n\ncal: a UNIX-like calendar program\n\n");
printf ("format: cal [-nihf filename]\n");
printf (" where n = the number of days to look ahead including\n");
printf (" today, max 99, default 2\n");
printf (" filename = file to look for instead of cal.txt\n\n");
printf (" i return information regarding CAL\n");
printf (" h return help with regard to CAL\n");
printf (" f use the following specified file as input to CAL\n");
printf (" instead of cal.txt\n\n");
printf ("CAL will return records from a 'cal.txt' file residing in\n");
printf ("the same directory as where 'cal.prg' is called from.\n");
printf ("CAL will seek out and return records containing dates that\n");
printf ("are being requested. A record is a string of characters\n");
printf ("ending with a carriage return.\n\n");
printf (" ** PRESS ANY KEY **\n");
Crawcin ();
printf ("\n\nThe format of the date may be any of the following:\n");
printf ("mm/dd, m/dd, mm/d, m/d\n");
printf ("mm-dd, m-dd, mm-d, m-d\n");
printf ("aaa dd, aaa d\n");
printf ("dd aaa, d aaa\n");
printf ("aaaaaaaaa dd, aaaaaaaaa d\n");
printf ("dd aaaaaaaaa, d aaaaaaaaa\n\n");
printf ("where mm or m = numeric month (1 - 12), dd or d = numeric\n");
printf ("day (1 - 31), aaa = the first three characters of the\n");
printf ("alpha month (jan - dec), aaaaaaaaa = the entire alpha\n");
printf ("month (january - december) and is variable length.\n\n");
printf ("CAL is NOT case sensitive with regard to alpha months.\n");
printf ("'cal.txt' may be any size up to the physical limitations\n");
printf ("of your machine.\n");
printf ("The largest record allowed is 1000 characters.\n\n");
printf (" ** PRESS ANY KEY **\n");
Crawcin ();
printf ("\n\nRESERVATIONS:\n");
printf ("CAL will not recognize years.\n");
printf ("The internal date in your machine must be correct to\n");
printf ("enable CAL to return the correct information.\n\n");
}
END_OF_FILE
if test 12751 -ne `wc -c <'./cal.c'`; then
echo shar: \"'./cal.c'\" unpacked with wrong size!
fi
# end of './cal.c'
fi