[alt.sources] Pcal v4.0, part 3 of 5

jbr0@cbnews.att.com (joseph.a.brownlee) (03/14/91)

#!/bin/sh
# This is part 03 of a multipart archive
# ============= pcal.man ==============
if test -f 'pcal.man' -a X"$1" != X"-c"; then
	echo 'x - skipping pcal.man (File already exists)'
else
echo 'x - extracting pcal.man (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'pcal.man' &&
.TH PCAL 1
.SH NAME
pcal \- generate PostScript calendars
.SH SYNOPSIS
.BR pcal " ["
.BR \-e " | " \-f
.I cal
] [
.BI \-o " file"
] [
.BR \-j " | " \-J
] [
.BR \-l " | " \-p
] [
.BR \-m " | " \-M
] [
.BI \-b " day"
| all ]
[
.BI \-g " day"
| all ]
[
.B \-O
] [
.BI \-F " day"
] [
.BR \-A " | " \-E
] [
.BI \-t " title_font"
] [
.BI \-d " day_font"
] [
.BI \-n " text_font"
] [
.BI \-L " footer_string"
] [
.BI \-C " footer_string"
] [
.BI \-R " footer_string"
] [
.BI \-D " symbol"
] [
.BI \-U " symbol"
] [
.BI \-x " xscale"
] [
.BI \-y " yscale"
] [
.BI \-X " xtrans"
] [
.BI \-Y " ytrans"
] [
.B \-I
] [
.B \-B
] [
.B \-w
] [
.B \-h
] [
.B month
] [
.B year
] [
.B nmonths
]
.SH DESCRIPTION
.I Pcal
generates PostScript to produce landscape or portrait calendars for any 
month and year.  The arguments
.BR month ,
.BR year ,
and
.BR nmonths ,
if provided, should be numeric.  The 
.BR month
value should be in the range 1 \- 12, and the 
.BR year
value should be specified as 1 or 2 digits or as the full 4 digit year.
If no numeric arguments are provided, the calendar for the current month
and year will be generated.
.PP
If one numeric argument is provided, it is interpreted as the
.BR year
value, and calendars for the entire year will be generated.  Otherwise, 
.BR nmonth
months, starting with
.BR month
and
.BR year ,
will be generated.
.PP
For whole-year calendars (i.e. the
.B \-w
option is given), the command line arguments are interpreted somewhat
differently.  By default, all months in the current year are printed, starting
with January.  If the
.B month
argument alone is given, it is expected to be the desired
.B year
to print, and prints all of the months in the given year.  If both
.BR month " and " year
are given, then 12 consecutive months are printed starting at the given
month and year.  If the
.BR month ", " year ", and " nmonths
arguments are all present, printing begins with the given month and year and
.B nmonths
months are printed, rounded up to the nearest multiple of 12.
.PP
.B The Date File
.PP
By default,
.I pcal
simply prints an empty calendar.  Its real power is in its ability to place
``events'' in appropriate days on the calendar, thus allowing the user to
create personalized calendars.  This is achieved through the use of the
``date file''.
.PP
The date file is named
.IR \.calendar " (" pcal.dat
under MS-DOS),
or
.I calendar
for compatibility with older versions.
.I Pcal
will look in several places for such a file.  First, if a file called
.I \.calendar
exists in the caller's home directory, it is used.  Next, if such a file exists
in the directory indicated by
environment variable
.BR PCAL_DIR
(or the current directory if no such variable is defined), it is used.
Finally, the directory where the
.I pcal
executable resides will be checked.  If no date file is found, an empty
calendar is printed.
.PP
If a date file is found, it will be searched for lines with
leading dates matching the requested month and year.
Any text following the dates found will be printed on the calendar under the
appropriate day of the month.  Dates in the
.I \.calendar
file may be expressed in any of several formats:
.PP
.ft CW
.nf
X	<ordinal> <day_spec> in <month_spec>{*} {<text>}
X	<day_spec> <prep> <date_spec>{*} {<text>}
X	<date_spec>{*} {<text>}
.fi
.ft
.PP
Where:
.PP
.nf
X	<month_name>	:= first 3+ characters of name of month, or ``all''
X	<month_spec>	:= <month_name>, or ``year''
X	<day_spec>	:= first 3+ characters of name of weekday, ``day'',
X				``weekday'', ``workday'', ``holiday'', ``nonweekday'',
X				``nonworkday'', or ``nonholiday''
X	<ordinal>	:= any ordinal number (``1st'', ``2nd'', etc.), ``first'' ... ``fifth'',
X				``last'', ``odd'', ``even'', or ``all''
X	<prep>		:= ``before'', ``preceding'', ``after'', ``following'',
X				``on_or_before'' (``oob''), or ``on_or_after'' (``ooa'')
X	<sep>		:= one or more non-numeric, non-space, non-'*' characters
X	<month>	:= a numeric month (1-12)
X	<day>		:= day of month (1-31)
X	<year>		:= a numeric year
.fi
.ft
.PP
If the
.B \-A
option (American date formats, the default) is given:
.PP
.nf
X	<date_spec>	:= [ <month_name> <day> | <month><sep><day>{<sep><year>} ]
.fi
.PP
If the
.B \-E
option (European date formats) is given:
.PP
.nf
X	<date_spec>	:= [ <day> <month_name> | <day><sep><month>{<sep><year>} ]
.fi
.PP
Examples:
.PP
.ft CW
.nf
X	last Monday in May*         Memorial Day Holiday
.sp
X	all Fridays in Oct          Status Meeting, 11 AM
X	last workday in all         Progress report due
X	all Fri in all              Time card due, 3 PM
X	Fri on_or_before all 15     Pay Day
X	even Fridays in year        Pay Day
X	183rd day of year           mid-year
.sp
X	Tue after first Mon in Nov  Election Day (USA)
.sp
X	4th Thu in Nov*             Thanksgiving
X	Fri after 4th Thu in Nov*   Day after Thanksgiving
.sp
X	12/25/90*                   Christmas     # American
X	25.12.90*                   Christmas     # European
.sp
X	Dec 25*                     Christmas     # American
X	25 Dec*                     Christmas     # European
.fi
.ft
.PP
Any non-numeric character may separate numeric dates.  Holidays may
be flagged by following the date immediately with `*'
as in the examples above; this will cause the
date to be printed in gray.
``Each'' and ``every'' are accepted as synonyms for ``all'', and any word may
be used in place of ``in''.  The abbreviations ``oob'' and ``ooa'' may be used
in place of the keywords ``on_or_before'' and ``on_or_after'', respectively.
.PP
Wildcard day names are also provided.  The keyword ``weekday'' applies to any
days which are normally printed in black on the calendar.  The keyword
``workday'' is the same, but does not include any holidays.  The keyword
``holiday'' includes only those days flagged as holidays.  The keywords
``nonweekday'', ``nonworkday'', and ``nonholiday'' are also recognized as
negations of the above.  See the
.B CAVEATS
below for important notes on using these keywords.
.PP
Ordinal day numbers may be used to specify dates, either relative to the
month or to the year.  Either words or numeric abbreviations may be used for
``first'' through ``fifth''; higher numbers must be given using the
numeric equivalent (e.g. 100th).  Negative ordinal numbers may even be used.
For example, ``\-2nd'' means ``next to last''.
.PP
``Odd'' and ``even'' do not refer to the actual date; instead, ``odd''
means ``alternate, starting with the first'', and ``even'' means ``alternate,
starting with the second''.  Thus, ``odd Fridays in March'' refers to
the first, third, and (if present) fifth Fridays in March - not to
those Fridays falling on odd dates.
.PP
``All'' refers to each individual month; ``year'' refers to the year
as an entity.  Thus ``odd Fridays in all'' refers to the first, third, and fifth
Friday of each month, while ``odd Fridays in year'' refers to
the first Friday of January and every other Friday thereafter.
.PP
Text in the date file may use C-like escape sequences (i.e. a `\\' followed by
a character, 1 \- 3 octal digits, or `x' followed by 1 \- 2 hexadecimal digits).
Escaped whitespace (including
.B newline
) and the standard ANSI character escapes (`\\a', `\\b', `\\f', `\\n', `\\r',
`\\t', `\\v') are all replaced by a single blank.
.PP
Lines in the
.I \.calendar
file consisting of 
.B year XXXX
(where
.B XXXX
is a numeric year) can be used
to set the year for following entries.  This assumes that the following
entries do not contain a year; any date entries containing year information
will set the remembered year to that year.
.PP
Lines in the
.I \.calendar
file consisting of 
.B opt <options>
can be used to override the defaults for
any command-line options except
.BR \-e ,
.BR \-f ,
.BR \-h ,
.BR \-D ", and"
.BR \-U .
Any options specified in this manner
are, in turn, overridden by those specified explicitly on the command line.
.PP
Lines in the
.I \.calendar
file consisting of
.B note <month>
can be used to place notes regarding the
entire month is one of the unused blocks of the calendar.  The
.B <month>
indicator may be either a number 1 through 12 or an alphabetic month name
as described above;  ``note all'' will place the associated text in the
notes block for each month in the current year.
.PP
Comments are supported in the
.I \.calendar
file.  Any characters following a `#' character through the end of the
line are ignored.
.PP
.I Pcal
supports rudimentary
.IR cpp -like
functionality in the
date file, allowing the following constructs:
.BR "define | undef" ,
.B if{n}def ... {else ...} endif,
and
.BR include .
Note that these are not preceded by `#' as they are in C.
Symbol names defined using these keywords (or via the 
.B -D
option) are case-insensitive.
It is not an error to
.BR undef
an undefined symbol, nor to
.BR define
a previously-defined one.  An
.BR ifdef
alone is always
.BR false "; an"
.BR ifndef
alone is always
.BR true .
.PP
The name of the file in the 
.BR include
directive may optionally be
surrounded by either "" or <>, both of which are ignored.  If the
name is not an absolute path, it is taken to be relative to the
directory where the file containing the directive is located.
.I Pcal
is smart enough to translate
.B ~/
to the user's home directory.
.PP
In addition to pre-processing keywords,
.I pcal
also accepts boolean expressions in
.B if{n}def
directives.  These expressions consist of symbol names joined by the boolean
operators
.BR ! ", " & ", " ^ ", and "
.BR | ,
in order of precedence, high to low.  Parentheses may be used to alter the
precedence.  The synonyms
.BR && " and " ||
are accepted for
.BR & " and " | .
A symbol name evaluates to 
.B true
if currently defined,
.B false
if not; thus:
.PP
.ft CW
.nf
X	ifdef A | B | C
.fi
.ft
.PP
\&...is
.B true
if any of the symbols A, B, and C is defined, and:
.PP
.ft CW
.nf
X	ifdef A & B & C
.fi
.ft
.PP
\&...is
.B true
if they all are.  Note that 
.B ifndef <expr>
is equivalent to 
.B ifdef !( <expr> ).
.PP
.B The Moon File
.PP
If a file of the name
.IR .moonXX " (" moonXX.dat
under MS-DOS),
where
.B XX
is the last two digits of the calendar year, exists in the same directory
as the date file,
.I pcal
uses the information contained within to calculate the phase of the
moon.  If no such file exists,
.I pcal
uses an approximate algorithm.
.PP
Entries in the moon file must conform to the following syntax:
.PP
If the
.B \-A
option (American date formats, the default) is given:
.PP
.ft CW
.nf
X	<quarter> <month><sep><day> {<hour><sep><min>}
.fi
.ft
.PP
If the
.B \-E
option (European date formats) is given:
.PP
.ft CW
.nf
X	<quarter> <day><sep><month> {<hour><sep><min>}
.fi
.ft
.PP
Where:
.PP
.nf
X	<quarter>	:= ``nm'', ``fq'' or ``1q'', ``fm'', ``3q'' or ``lq'' (new moon,
X				first quarter, full moon, last quarter)
X	<hour>		:= number 0-23 (24-hour clock)
X	<min>		:= number 0-59
.fi
.PP
This file must contain entries for all quarter moons in the year,
in chronological order; if any errors are encountered,
.I pcal
will revert to using its default algorithm.
.PP
As in the date file, comments start with '#' and run through
end-of-line.  
.PP
.B Options
.PP
.I Pcal
has many options:
.P
.TP 12
.B \-e
Prints an empty calendar.  Do not print entries from a
.I \.calendar
file.
.TP
.BI \-f " cal"
Directs
.I pcal
to use the file name
.I cal
as the input file in place of the default
.I \.calendar
file in the user's home directory (or the directory pointed to by
.BR PCAL_DIR ).
.TP
.BI \-o " file"
Directs
.I pcal
to write the output to
.I file
instead of to stdout.
.TP
.B \-l
Causes the output to be in landscape mode (default).  This also resets the
x- and y-axis scaling and translation factors to the defaults for
landscape mode.
.TP
.B \-p
Causes the output to be in portrait mode.  This also resets the
x- and y-axis scaling and translation factors to the defaults for portrait
mode.
.TP
.B \-j
Causes the Julian date (day of year) to be printed in each calendar box.
.TP
.B \-J
Causes the Julian date and the number of days remaining in the year to
be printed in each calendar box.
.TP
.B \-m
Causes moon icons to be printed on dates corresponding to
new, half, and full moons (the default is that no moons are printed).
.TP
.B \-M
Causes moon icons to be printed on all dates (the default is
that no moons are printed).
.TP
.BI \-b " day" " | all"
Causes all dates falling on weekday
.I day
to be printed in black;
.B \-b all
causes all weekdays to be printed in black.
.TP
.BI \-g " day" " | all"
Causes all dates falling on weekday
.I day
to be printed in gray;
.B \-g all
causes all weekdays to be printed in gray.
.IP
The default for the
.BR \-b " and " \-g
options is to print Saturdays and Sundays in gray and other days, unless
flagged as holidays, in black.
.TP
.BI \-O
Causes pcal to print ``gray'' dates as outlined characters.
.TP
.BI \-F " day"
Selects weekday
.I day
as the first day of the week.  The given day will appear in the left-most
column of the calendar.
.TP
.B \-A
Directs
.I pcal
to use American date conventions
.B mm/dd{/yy}
and
.B month dd
) when parsing the date file (default).
.TP
.B \-E
Directs
.I pcal
to use European date conventions
.B dd/mm{/yy}
and
.B dd month
) when parsing the date file.
.TP
.BI \-X " xtrans"
Specifies the x-axis translation value for positioning the output on the page.
.TP
.BI \-Y " ytrans"
Specifies the y-axis translation value for positioning the output on the page.
.TP
.BI \-x " xscale"
Specifies the x-axis scaling factor for the calendar size.
.TP
.BI \-y " yscale"
Specifies the y-axis scaling factor for the calendar size.
.TP
.BI \-t " title_font"
Specifies the name of a font to use to print the
month name and year at the top of the calendar.  For example,
.BR "pcal \-t Times-Roman" .
.TP
.BI \-d " day_font"
Similar to the
.B \-t
option, but selects the font used to print the day numbers.
.TP
.BI \-n " text_font"
Similar to the
.B \-t
option, but selects the font used to print the text inside each day and in
the notes block.
.TP
.BI \-D " symbol"
Defines the named symbol prior to reading the date file.
.TP
.BI \-U " symbol"
Un-defines the named symbol prior to reading the date file.
.TP
.BI \-L " string"
Causes the accompanying string to be printed as a left-justified footer.
.TP
.BI \-C " string"
Causes the accompanying string to be printed as a centered footer.
.TP
.BI \-R " string"
Causes the accompanying string to be printed as a right-justified
footer.
.TP
.BI \-B
Causes pcal to leave unused calendar boxes blank (default is gray).
.TP
.BI \-w
Causes pcal to print a calendar for 12 consecutive months: 3 rows / 4
columns in landscape mode, 4 rows / 3 columns in portrait mode.  See the
CAVEATS section for details on the use of this option with other options.
.TP
.B \-I
Resets all parameters to the program defaults.
.TP
.B \-h
Causes
.I pcal
to write version information and a usage message (to stdout) and terminate.
.PP
Any option which normally takes an argument may be specified without
the argument in order to reset the value to the program default.  Note that
while the
.B \-D
option alone clears all the defined symbols, the
.B \-U
option alone has no effect.  The
.B \-
(or
.BR "\-\|\-" " as per"
System V) argument may be used to disambiguate command lines such as:
.IP
.B pcal \-t 9 90
.PP
This could be written instead as one of the following:
.IP
.B pcal \-t \- 9 90
.br
.B pcal \-t \-\|\- 9 90
.PP
If the environment variable
.BR PCAL_OPTS
is defined, its contents are parsed as a command line.  Flags set via
.BR PCAL_OPTS
override the program defaults, but are overridden by options set via 
.B opt
lines in the
.I \.calendar
file or explicitly on the command line.
.SH CAVEATS
The ``workday'' and ``holiday'' keywords are aware of only those holidays
which have already been flagged at the point where they appear.  For example,
consider January 1990:
.PP
.ft CW
.nf
.ne 7
X			    January 1990
X			 S  M Tu  W Th  F  S
X			    1  2  3  4  5  6
X			 7  8  9 10 11 12 13
X			14 15 16 17 18 19 20
X			21 22 23 24 25 26 27
X			28 29 30 31
.fi
.ft
.PP
If the
.I \.calendar
file looked like this:
.PP
.ft CW
.nf
X	workday on_or_before all 15	payday
X	3rd Mon in Jan*			MLK day
.fi
.ft
.PP
\&\.\.\. then
.I pcal
would mark the 15th as ``payday'' since at that point in the
.I \.calendar
file it has no way of knowing that January 15th will later be flagged as a
holiday.  If the two lines were reversed, such that the holiday preceded the
``workday'' wildcard, then
.I pcal
would work as intended, marking instead the 12th as ``payday''.  Also, beware
of year boundaries which affect the handling of all of the day wildcard
keywords.  In general, it is best to place monthly wildcards such as the
example above at the end of each year to achieve the desired effect.
.PP
When the
.B \-w
and
.B \-p
options are used together,
.I pcal
revises the y-scale factor in order to use the entire portrait page; therefore,
the user should avoid using use the
.B \-y
option when using both the
.B \-w
and
.B \-p
options.  Use of the
.B \-w
option in any case effectively disables the
.BR \-m ", " \-M ", " \-j ", and "
.B \-J
options.
.SH SEE ALSO
cal(1)
.SH AUTHORS
The original PostScript code to generate the calendars was written by
Patrick Wood (Copyright (c) 1987 by Patrick Wood of Pipeline Associates,
Inc.), and authorized for modification and redistribution.  The calendar
file inclusion code was originally written in
.IR bs (1)
by Bill Vogel of AT&T.  Patrick's original PostScript was modified and
enhanced several times by others whose names have regrettably been lost.
Ken Keirnan of Pacific Bell assembled the original ``C'' version upon which
this is based; additional modifications and enhancements are the work of
Joseph P. Larson, Ed Hand, Andrew W. Rogers, Mark Kantrowitz, Joe Brownlee,
Jamie Zawinski, Bill Hogsett, and Floyd Miller.
SHAR_EOF
chmod 0644 pcal.man ||
echo 'restore of pcal.man failed'
Wc_c="`wc -c < 'pcal.man'`"
test 17774 -eq "$Wc_c" ||
	echo 'pcal.man: original size 17774, current size' "$Wc_c"
fi
# ============= pcal.tex ==============
if test -f 'pcal.tex' -a X"$1" != X"-c"; then
	echo 'x - skipping pcal.tex (File already exists)'
else
echo 'x - extracting pcal.tex (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'pcal.tex' &&
% -*-LaTeX-*-
% Converted automatically from troff to LaTeX by tr2tex on Fri Mar  1 21:59:54 1991
% tr2tex was written by Kamal Al-Yahya at Stanford University
% (Kamal%Hanauma@SU-SCORE.ARPA)
X
\documentstyle[troffman]{article}
\begin{document}
%
% input file: pcal.man
%
\phead{PCAL}{1}{}
X
\shead{NAME}
pcal -- generate PostScript calendars
X
\shead{SYNOPSIS}
{\bf pcal}{\rm \ [} {\bf --e}{\rm \ $|$\ }{\bf --f} {\it cal} ] [ {\bf
--o}{\it \ file} ] [ {\bf --j}{\rm \ $|$\ }{\bf --J} ] [ {\bf --l}{\rm \
$|$\ }{\bf --p} ] [ {\bf --m}{\rm \ $|$\ }{\bf --M} ] [ {\bf --b}{\it \
day} $|$ all ] [ {\bf --g}{\it \ day} $|$ all ]\hfil\break
[ {\bf --O} ] [ {\bf --F}{\it \ day} ] [ {\bf --A}{\rm \ $|$\ }{\bf --E}
] [ {\bf --t}{\it \ title\_font} ] [ {\bf --d}{\it \ day\_font} ] [ {\bf
--n}{\it \ text\_font} ] [ {\bf --L}{\it \ footer\_string} ]\hfil\break
[ {\bf --C}{\it \ footer\_string} ] [ {\bf --R}{\it \ footer\_string} ] [
{\bf --D}{\it \ symbol} ] [ {\bf --U}{\it \ symbol} ] [ {\bf --x}{\it \
xscale} ] [ {\bf --y}{\it \ yscale} ]\hfil\break
[ {\bf --X}{\it \ xtrans} ] [ {\bf --Y}{\it \ ytrans} ] [ {\bf --I} ] [
{\bf --B} ] [ {\bf --w} ] [ {\bf --h} ]\hfil\break
[ {\bf month} ] [ {\bf year} ] [ {\bf nmonths} ]
X
\shead{DESCRIPTION}
{\it Pcal} generates PostScript to produce landscape or portrait
calendars for any month and year.  The arguments {\bf month}{\rm ,} {\bf
year}{\rm ,} and {\bf nmonths}{\rm ,} if provided, should be numeric.
The {\bf month} value should be in the range 1 -- 12, and the {\bf year}
value should be specified as 1 or 2 digits or as the full 4 digit year.
If no numeric arguments are provided, the calendar for the current month
and year will be generated.
\vskip\baselineskip
X
If one numeric argument is provided, it is interpreted as the {\bf year}
value, and calendars for the entire year will be generated.  Otherwise,
{\bf nmonth} months, starting with {\bf month} and {\bf year}{\rm ,} will
be generated.
\vskip\baselineskip
X
For whole-year calendars ({\it i.e.}, the {\bf --w} option is given), the
command line arguments are interpreted somewhat differently.  By default,
all months in the current year are printed, starting with January.  If
the {\bf month} argument alone is given, it is expected to be the desired
{\bf year} to print, and prints all of the months in the given year.  If
both {\bf month}{\rm \ and\ }{\bf year} are given, then 12 consecutive
months are printed starting at the given month and year.  If the {\bf
month}{\rm ,\ }{\bf year}{\rm ,\ and\ }{\bf nmonths} arguments are all
present, printing begins with the given month and year and {\bf nmonths}
months are printed, rounded up to the nearest multiple of 12.
\vskip\baselineskip
X
{\bf The Date File}
\vskip\baselineskip
X
By default, {\it pcal} simply prints an empty calendar.  Its real power
is in its ability to place ``events'' in appropriate days on the
calendar, thus allowing the user to create personalized calendars.  This
is achieved through the use of the ``date file''.
\vskip\baselineskip
X
The date file is named {\it .calendar} (or {\it calendar} for
compatibility with older versions).  {\it Pcal} will look in several
places for such a file.  First, if a file called {\it .calendar} exists
in the caller's home directory, it is used.  Next, if such a file exists
in the directory indicated by environment variable {\bf PCAL\_DIR} (or
the current directory if no such variable is defined), it is used.
Finally, the directory where the {\it pcal} executable resides will be
checked.  If no date file is found, an empty calendar is printed.
\vskip\baselineskip
X
If a date file is found, it will be searched for lines with leading dates
matching the requested month and year.  Any text following the dates
found will be printed on the calendar under the appropriate day of the
month.  Dates in the {\it .calendar} file may be expressed in any of
several formats:
X
{\tt
\nofill
X        $<$ordinal$>$ $<$day\_spec$>$ in $<$month\_spec$>$\{$\ast$\} \{$<$text$>$\}
X        $<$day\_spec$>$ $<$prep$>$ $<$date\_spec$>$\{$\ast$\} \{$<$text$>$\}
X        $<$date\_spec$>$\{$\ast$\} \{$<$text$>$\}
\fill}
Where:
{\tt
\nofill
X        $<$month\_name$>$    := first 3+ characters of name of month, or "all"
X        $<$month\_spec$>$    := $<$month\_name$>$, or "year"
X        $<$day\_spec$>$      := first 3+ characters of name of weekday, "day",
X                            "weekday", "workday", "holiday", "nonweekday",
X                            "nonworkday", or "nonholiday"
X        $<$ordinal$>$       := any ordinal number ("1st", "2nd", {\it etc}.),
X                            "first" $\ldots$ "fifth", "last", "odd",
X                            "even", or "all"
X        $<$prep$>$          := "before", "preceding", "after", "following",
X                            "on\_or\_before" ("oob"), or "on\_or\_after" ("ooa")
X        $<$sep$>$           := one or more non-numeric, non-space, non-`$\ast$' characters
X        $<$month$>$         := a numeric month (1-12)
X        $<$day$>$           := day of month (1-31)
X        $<$year$>$          := a numeric year
\fill}
X
If the {\bf --A} option (American date formats, the default) is given:
{\tt
\nofill
X    $<$date\_spec$>$   := [ $<$month\_name$>$ $<$day$>$ $|$ $<$month$>$$<$sep$>$$<$day$>$\{$<$sep$>$$<$year$>$\} ]
\fill}
X
If the {\bf --E} option (European date formats) is given:
{\tt
\nofill
X    $<$date\_spec$>$   := [ $<$day$>$ $<$month\_name$>$ $|$ $<$day$>$$<$sep$>$$<$month$>$\{$<$sep$>$$<$year$>$\} ]
\fill}
X
Examples:
{\tt
\nofill
X        last Monday in May$\ast$         Memorial Day Holiday
\vskip\baselineskip
X        all Fridays in Oct          Status Meeting, 11 AM
X        last workday in all         Progress report due
X        all Fri in all              Time card due, 3 PM
X        Fri on\_or\_before all 15      Pay Day
X        even Fridays in year        Pay Day
X        183rd day of year           mid-year
\vskip\baselineskip
X        Tue after first Mon in Nov  Election Day (USA)
\vskip\baselineskip
X        4th Thu in Nov$\ast$             Thanksgiving
X        Fri after 4th Thu in Nov$\ast$   Day after Thanksgiving
\vskip\baselineskip
X        12/25/90$\ast$                   Christmas     \# American
X        25.12.90$\ast$                   Christmas     \# European
\vskip\baselineskip
X        Dec 25$\ast$                     Christmas     \# American
X        25 Dec$\ast$                     Christmas     \# European
\fill}
X
Any non-numeric character may separate numeric dates.  Holidays may be
flagged by following the date immediately with `$\ast$' as in the examples
above; this will cause the date to be printed in gray.  ``Each'' and
``every'' are accepted as synonyms for ``all'', and any word may be used
in place of ``in''.  The abbreviations ``oob'' and ``ooa'' may be used in
place of the keywords ``on\_or\_before'' and ``on\_or\_after'',
respectively.
\vskip\baselineskip
X
Wildcard day names are also provided.  The keyword ``weekday'' applies to
any days which are normally printed in black on the calendar.  The
keyword ``workday'' is the same, but does not include any holidays.  The
keyword ``holiday'' includes only those days flagged as holidays.  The
keywords ``nonweekday'', ``nonworkday'', and ``nonholiday'' are also
recognized as negations of the above.  See the {\bf CAVEATS} below for
important notes on using these keywords.
\vskip\baselineskip
X
Ordinal day numbers may be used to specify dates, either relative to the
month or to the year.  Either words or numeric abbreviations may be used
for ``first'' through ``fifth''; higher numbers must be given using the
numeric equivalent (e.g. 100th).  Negative ordinal numbers may even be
used.  For example, ``--2nd'' means ``next to last''.
\vskip\baselineskip
X
``Odd'' and ``even'' do not refer to the actual date; instead, ``odd''
means ``alternate, starting with the first'', and ``even'' means
``alternate, starting with the second''.  Thus, ``odd Fridays in March''
refers to the first, third, and (if present) fifth Fridays in March - not
to those Fridays falling on odd dates.
\vskip\baselineskip
X
``All'' refers to each individual month; ``year'' refers to the year as
an entity.  Thus ``odd Fridays in all'' refers to the first, third, and
fifth Friday of each month, while ``odd Fridays in year'' refers to the
first Friday of January and every other Friday thereafter.
\vskip\baselineskip
X
Text in the date file may use C-like escape sequences ({\it i.e.}, a `\bs
' followed by a character, 1 -- 3 octal digits, or `x' followed by 1 -- 2
hexadecimal digits).  Escaped whitespace (including {\bf newline} ) and
the standard ANSI character escapes (`\bs a', `\bs b', `\bs f', `\bs n',
`\bs r', `\bs t', `\bs v') are all replaced by a single blank.
\vskip\baselineskip
X
Lines in the {\it .calendar} file consisting of {\bf year} XXXX (where
XXXXX is a numeric year) can be used to set the year for following
entries.  This assumes that the following entries do not contain a year;
any date entries containing year information will set the remembered year
to that year.
\vskip\baselineskip
X
Lines in the {\it .calendar} file consisting of {\bf opt} $<$options$>$
can be used to override the defaults for any command-line options except
{\bf --e}{\rm ,} {\bf --f}{\rm ,} {\bf --h}{\rm ,} {\bf --D}{\rm ,\ and}
{\bf --U}{\rm .} Any options specified in this manner are, in turn,
overridden by those specified explicitly on the command line.
\vskip\baselineskip
X
Lines in the {\it .calendar} file consisting of {\bf note} $<$month$>$
can be used to place notes regarding the entire month is one of the
unused blocks of the calendar.  The {\bf $<$month$>$} indicator may be
either a number 1 through 12 or an alphabetic month name as described
above;  ``note all'' will place the associated text in the notes block
for each month in the current year.
\vskip\baselineskip
X
Comments are supported in the {\it .calendar} file.  Any characters
following a `\#' character through the end of the line are ignored.
\vskip\baselineskip
X
{\it Pcal} supports rudimentary {\it cpp}{\rm -like} functionality in the
date file, allowing the following constructs:  {\bf define\ $|$\
undef}{\rm ,} {\bf if\{n\}def $\ldots$ \{else $\ldots$\} endif}, and {\bf
include}{\rm .} Note that these are not preceded by `\#' as they are in
C.  Symbol names defined using these keywords (or via the {\bf -D}
option) are case-insensitive.  It is not an error to {\bf undef} an
undefined symbol, nor to {\bf define} a previously-defined one.  An {\bf
ifdef} alone is always {\bf false}{\rm ;\ an} {\bf ifndef} alone is
always {\bf true}{\rm .}
\vskip\baselineskip
X
The name of the file in the {\bf include} directive may optionally be
surrounded by either "" or $<$$>$, both of which are ignored.  If the
name is not an absolute path, it is taken to be relative to the directory
where the file containing the directive is located.  {\it Pcal} is smart
enough to translate {\bf \~{}/} to the user's home directory.
\vskip\baselineskip
X
In addition to pre-processing keywords, {\it pcal} also accepts boolean
expressions in {\bf if\{n}\}def directives.  These expressions consist of
symbol names joined by the boolean operators {\bf !}{\rm ,\ }{\bf \&}{\rm
,\ }{\bf \^{}}{\rm ,\ and\ } {\bf $|$}{\rm ,} in order of precedence,
high to low.  Parentheses may be used to alter the precedence.  The
synonyms {\bf \&\&}{\rm \ and\ }{\bf $|$$|$} are accepted for {\bf
\&}{\rm \ and\ }{\bf $|$}{\rm .} A symbol name evaluates to {\bf true} if
currently defined, {\bf false} if not; thus:
{\tt
\nofill
X        ifdef A $|$ B $|$ C
\fill}
X
$\ldots$ is {\bf true} if any of the symbols A, B, and C is defined, and:
{\tt
\nofill
X        ifdef A \& B \& C
\fill}
X
$\ldots$ is {\bf true} if they all are.  Note that {\bf ifndef} $<$expr$>$ is
equivalent to {\bf ifdef} !( $<$expr$>$ ).
\vskip\baselineskip
X
{\bf The Moon File}
\vskip\baselineskip
X
If a file of the name {\it .moonXX} (where {\it XX} is the last two
digits of the calendar year) exists in the same directory as the date
file, {\it pcal} uses the information contained within to calculate the
phase of the moon.  If no such file exists, {\it pcal} uses an
approximate algorithm.
\vskip\baselineskip
X
Entries in the moon file must conform to the following syntax;  If the
{\bf --A} option (American date formats, the default) is given:
{\tt
\nofill
X        $<$quarter$>$ $<$month$>$$<$sep$>$$<$day$>$ \{$<$hour$>$$<$sep$>$$<$min$>$\}
\fill}
X
If the {\bf --E} option (European date formats) is given:
{\tt
\nofill
X        $<$quarter$>$ $<$day$>$$<$sep$>$$<$month$>$ \{$<$hour$>$$<$sep$>$$<$min$>$\}
\fill}
X
Where:
{\tt
\nofill
X        $<$quarter$>$   := "nm", "fq" or "1q", "fm", "3q" or "lq"
X                        (new moon, first quarter, full moon, last quarter)
X        $<$hour$>$      := number 0-23 (24-hour clock)
X        $<$min$>$       := number 0-59
\fill}
X
This file must contain entries for all quarter moons in the year, in
chronological order; if any errors are encountered, {\it pcal} will
revert to using its default algorithm.  As in the date file, comments
start with '\#' and run through end-of-line.
\vskip\baselineskip
X
{\bf Options}
\vskip\baselineskip
X
{\it Pcal} has many options:
X
\begin{TPlist}{{\bf --e}}
\item[{{\bf --e}}] Prints an empty calendar.  Do not print entries from a
X    {\it .calendar} file.
\item[{{\bf --f}{\it \ cal}}] Directs {\it pcal} to use the file name
X    {\it cal} as the input file in place of the default {\it .calendar}
X    file in the user's home directory (or the directory pointed to by
X    {\bf PCAL\_DIR}{\rm ).}
\item[{{\bf --o}{\it \ file} }] Directs {\it pcal} to write the output to
X    {\it file} instead of to stdout.
\item[{{\bf --l}}] Causes the output to be in landscape mode (default).
X    This also resets the x- and y-axis scaling and translation factors to
X    the defaults for landscape mode.
\item[{{\bf --p}}] Causes the output to be in portrait mode.  This also
X    resets the x- and y-axis scaling and translation factors to the
X    defaults for portrait mode.
\item[{{\bf --j}}] Causes the Julian date (day of year) to be printed in
X    each calendar box.
\item[{{\bf --J}}] Causes the Julian date and the number of days
X    remaining in the year to be printed in each calendar box.
\item[{{\bf --m}}] Causes moon icons to be printed on dates corresponding
X    to new, half, and full moons (the default is that no moons are
X    printed).
\item[{{\bf --M}}] Causes moon icons to be printed on all dates (the
X    default is that no moons are printed).
\item[{{\bf --b}{\it \ day}{\bf \ $|$\ all} }] Causes all dates falling
X    on weekday {\it day} to be printed in black;  {\bf --b} all causes
X    all weekdays to be printed in black.
\item[{{\bf --g}{\it \ day}{\bf \ $|$\ all} }] Causes all dates falling
X    on weekday {\it day} to be printed in gray;  {\bf --g} all causes all
X    weekdays to be printed in gray.
X    \begin{itemize}
X    \item[{}] The default for the {\bf --b}{\rm \ and\ }{\bf --g} options is
X        to print Saturdays and Sundays in gray and other days, unless flagged
X        as holidays, in black.
X    \end{itemize}
\item[{{\bf --O} }] Causes pcal to print ``gray'' dates as outlined
X    characters.
\item[{{\bf --F}{\it \ day} }] Selects weekday {\it day} as the first day
X    of the week.  The given day will appear in the left-most column of
X    the calendar.
\item[{{\bf --A}}] Directs {\it pcal} to use American date conventions
X    {\bf mm/dd\{/yy}\} and {\bf month} dd ) when parsing the date file
X    (default).
\item[{{\bf --E}}] Directs {\it pcal} to use European date conventions
X    {\bf dd/mm\{/yy}\} and {\bf dd} month ) when parsing the date file.
\item[{{\bf --X}{\it \ xtrans} }] Specifies the x-axis translation value
X    for positioning the output on the page.
\item[{{\bf --Y}{\it \ ytrans} }] Specifies the y-axis translation value
X    for positioning the output on the page.
\item[{{\bf --x}{\it \ xscale} }] Specifies the x-axis scaling factor for
X    the calendar size.
\item[{{\bf --y}{\it \ yscale} }] Specifies the y-axis scaling factor for
X    the calendar size.
\item[{{\bf --t}{\it \ title\_font} }] Specifies the name of a font to
X    use to print the month name and year at the top of the calendar.  For
X    example, {\bf pcal\ --t\ Times-Roman}{\rm .}
\item[{{\bf --d}{\it \ day\_font} }] Similar to the {\bf --t} option, but
X    selects the font used to print the day numbers.
\item[{{\bf --n}{\it \ text\_font} }] Similar to the {\bf --t} option,
X    but selects the font used to print the text inside each day and in
X    the notes block.
\item[{{\bf --D}{\it \ symbol} }] Defines the named symbol prior to
X    reading the date file.
\item[{{\bf --U}{\it \ symbol} }] Un-defines the named symbol prior to
X    reading the date file.
\item[{{\bf --L}{\it \ string} }] Causes the accompanying string to be
X    printed as a left-justified footer.
\item[{{\bf --C}{\it \ string} }] Causes the accompanying string to be
X    printed as a centered footer.
\item[{{\bf --R}{\it \ string} }] Causes the accompanying string to be
X    printed as a right-justified footer.
\item[{{\bf --B} }] Causes pcal to leave unused calendar boxes blank
X    (default is gray).
\item[{{\bf --w} }] Causes pcal to print a calendar for 12 consecutive
X    months: 3 rows / 4 columns in landscape mode, 4 rows / 3 columns in
X    portrait mode.  See the CAVEATS section for details on the use of
X    this option with other options.
\item[{{\bf --I}}] Resets all parameters to the program defaults.
\item[{{\bf --h}}] Causes {\it pcal} to write version information and a
X    usage message (to stdout) and terminate.
\end{TPlist}
X
Any option which normally takes an argument may be specified without the
argument in order to reset the value to the program default.  Note that
while the {\bf --D} option alone clears all the defined symbols, the {\bf
--U} option alone has no effect.  The {\bf --} (or {\bf --\,--}{\rm \ as\
per} System V) argument may be used to disambiguate command lines such
as:
\begin{itemize}
\item[{}] {\bf pcal} --t 9 90
\end{itemize}
This could be written instead as one of the following:
\begin{itemize}
\item[{}] {\bf pcal} --t -- 9 90 \nwl {\bf pcal} --t --\,-- 9 90
\end{itemize}
X
If the environment variable {\bf PCAL\_OPTS} is defined, its contents are
parsed as a command line.  Flags set via {\bf PCAL\_OPTS} override the
program defaults, but are overridden by options set via {\bf opt} lines
in the {\it .calendar} file or explicitly on the command line.
X
\shead{CAVEATS}
The ``workday'' and ``holiday'' keywords are aware of only those holidays
which have already been flagged at the point where they appear.  For
example, consider January 1990:
X
{\tt\vbox{
\nofill
X                                January 1990
X                             S  M Tu  W Th  F  S
X                                1  2  3  4  5  6
X                             7  8  9 10 11 12 13
X                            14 15 16 17 18 19 20
X                            21 22 23 24 25 26 27
X                            28 29 30 31
\fill}}
X
If the {\it .calendar} file looked like this:
{\tt
\nofill
X        workday on\_or\_before all 15        payday
X        3rd Mon in Jan$\ast$                 MLK day
\fill}
X
then {\it pcal} would mark the 15th as ``payday'' since at that point in
the {\it .calendar} file it has no way of knowing that January 15th will
later be flagged as a holiday.  If the two lines were reversed, such that
the holiday preceded the ``workday'' wildcard, then {\it pcal} would work
as intended, marking instead the 12th as ``payday''.  Also, beware of
year boundaries which affect the handling of all of the day wildcard
keywords.  In general, it is best to place monthly wildcards such as the
example above at the end of each year to achieve the desired effect.
\vskip\baselineskip
X
When the {\bf --w} and {\bf --p} options are used together, {\it pcal}
revises the y-scale factor in order to use the entire portrait page;
therefore, the user should avoid using use the {\bf --y} option when
using both the {\bf --w} and {\bf --p} options.  Use of the {\bf --w}
option in any case effectively disables the {\bf --m}{\rm ,\ }{\bf
--M}{\rm ,\ }{\bf --j}{\rm ,\ and\ } {\bf --J} options.
X
\shead{SEE ALSO}
cal(1)
X
\shead{AUTHORS}
The original PostScript code to generate the calendars was written by
Patrick Wood (\copyright 1987 by Patrick Wood of Pipeline Associates,
Inc.), and authorized for modification and redistribution.  The calendar
file inclusion code was originally written in {\it bs}{\rm (1)} by Bill
Vogel of AT\&T.  Patrick's original PostScript was modified and enhanced
several times by others whose names have regrettably been lost.  Ken
Keirnan of Pacific Bell assembled the original ``C'' version upon which
this is based; additional modifications and enhancements are the work of
Joseph P. Larson, Ed Hand, Andrew W. Rogers, Mark Kantrowitz, Joe
Brownlee, Jamie Zawinski, Bill Hogsett, and Floyd Miller.
X
\end{document}
SHAR_EOF
chmod 0644 pcal.tex ||
echo 'restore of pcal.tex failed'
Wc_c="`wc -c < 'pcal.tex'`"
test 20982 -eq "$Wc_c" ||
	echo 'pcal.tex: original size 20982, current size' "$Wc_c"
fi
# ============= pcaldefs.h ==============
if test -f 'pcaldefs.h' -a X"$1" != X"-c"; then
	echo 'x - skipping pcaldefs.h (File already exists)'
else
echo 'x - extracting pcaldefs.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'pcaldefs.h' &&
/*
X * pcaldefs.h - definitions for Pcal program
X *
X * Revision history:
X *
X *	4.0	AWR	03/01/91	Add STDLIB macro for systems which
X *					support <stdlib.h>
X *
X *		AWR	02/22/91	add definitions for MS-DOS support (as
X *					per Floyd Miller)
X *
X *		AWR	02/19/91	revise ORD_XXX to support negative
X *					ordinals
X *
X *					add definitions for Amiga support (as
X *					per Bill Hogsett)
X *
X *		AWR	02/06/91	additional defs for expression
X *					processing
X *
X *		AWR	02/04/91	support "year" as additional month
X *					name; use negative numbers for
X *					special ordinal codes (reserve
X *					positive numbers for ordinals)
X *
X *			01/28/91	miscellaneous new constants/macros
X *
X *			01/07/91	add FEB_29_OK (cf. enter_day_info())
X *
X *	3.0	AWR	12/10/90	support "weekday", "workday",
X *					"holiday", et. al.
X *
X *		AWR	11/13/90	extracted from pcal.c; added scale and
X *					translation support (-x, -y, -X, -Y);
X *					added -j, -J flags
X *
X */
X
/*
X * System dependencies:
X */
X
#ifdef VMS		/* VMS oddities isolated here */
X
#include <ssdef.h>	/* required for trnlog() */
#include <descrip.h>
X
#define HOME_DIR	"SYS$LOGIN"
#define DATEFILE	"calendar.dat"
#define MOONFILE	"moonXX.dat"	/* 'XX' replaced with year */
#define DEFAULT_OUTFILE	"calendar.ps"
#define START_PATH	'['
#define END_PATH	']'
X
#define EXIT_SUCCESS	1		/* VMS exit() parameters */
#define EXIT_FAILURE	3
X
#else
#ifdef AMIGA		/* more oddities for Amiga */
X
#include <string.h>
X
#define PROTOS				/* compiler accepts prototypes */
#define STDLIB				/* system has <stdlib.h> */
#define HOME_DIR	"RAM:"
#define DATEFILE	"s:calendar.dat"
#define MOONFILE	"s:.moonXX"	/* 'XX' replaced with year */
#define DEFAULT_OUTFILE	"RAM:calendar.ps"
#define START_PATH	'/'
#define END_PATH	'/'
X
#else
#ifdef DOS		/* even more oddities for MS-DOS */
X
#define DATEFILE	"pcal.dat"
#define MOONFILE	"moonXX.dat"	/* 'XX' replaced with year */
#define START_PATH	'\\'
#define END_PATH	'\\'
#define HOME_DIR	"HOME"
#define ALT_DATEFILE	"calendar"	/* for backward compatibility */
X
#else			/* neither VMS, Amiga, nor MS-DOS - assume Un*x */
X
#define UNIXX		/* to distinguish from others (not used yet) */
X
#define HOME_DIR	"HOME"
#define DATEFILE	".calendar"
#define ALT_DATEFILE	"calendar"	/* for backward compatibility */
#define MOONFILE	".moonXX"	/* 'XX' replaced with year */
#define ALT_MOONFILE	"moonXX"	/* analogous to ALT_DATEFILE */
#define START_PATH	'/'
#define END_PATH	'/'
X
#endif
#endif
#endif
X
/* define OUTFILE to DEFAULT_OUTFILE if defined, otherwise to "" (stdout) */
X
#ifdef DEFAULT_OUTFILE
#define OUTFILE		DEFAULT_OUTFILE
#else
#define OUTFILE		""
#endif
X
/* PROTOS may be defined independently of __STDC__ for compilers which
X * support function prototypes but are not fully ANSI-compliant
X */
X
#if defined(__STDC__) && ! defined(PROTOS)
#define PROTOS	
#endif
X
/* STDLIB may be defined independently of __STDC__ for systems which
X * support <stdlib.h> but are not fully ANSI-compliant
X */
X
#if defined(__STDC__) && ! defined(STDLIB)
#define STDLIB			/* cf. {no}protos.h */
#endif
X
#ifdef STDLIB			/* include <stdlib.h> if known to exist */
#include <stdlib.h>
#endif
X
/* EXIT_SUCCESS and EXIT_FAILURE should be defined in <stdlib.h>
X * (or above if non-standard); define here if necessary
X */
X
#ifndef EXIT_SUCCESS
#define EXIT_SUCCESS	0
#endif
#ifndef EXIT_FAILURE
#define EXIT_FAILURE	1
#endif
X
/* definition of NULL (if needed) */
X 
#ifndef NULL
#define NULL	0
#endif
X
/*
X * Environment variables (global symbol, logical name on VMS):
X */
X
#define PCAL_OPTS	"PCAL_OPTS"	/* command-line flags */
#define PCAL_DIR	"PCAL_DIR"	/* calendar file directory */
X
/*
X * Function-like macros:
X */
X
#define FPR		(void)fprintf
#define PRT		(void)printf
X
#define PUTCHAR(_c) \
X	PRT((_c) == ' ' || isalnum(_c) ? "%c" : "\\%03o" , (_c) & 0377)
#define PUTSTR(_s)  \
X	if (1) { char *_p; for (_p = _s; *_p; _p++) PUTCHAR(*_p); } else
X
#define IS_LEAP(y)	((y) % 4 == 0 && ((y) % 100 != 0 || (y) % 400 == 0))
#define LENGTH_OF(m, y) (month_len[(m)-1] + ((m) == FEB && IS_LEAP(y)))
#define YEAR_LEN(y)	(IS_LEAP(y) ? 366 : 365)
#define DAY_OF_YEAR(m, d, y) ((month_off[(m)-1] + ((m) > FEB && IS_LEAP(y))) + d)
#define OFFSET_OF(m, y) ((month_off[(m)-1] + ((m) > FEB && IS_LEAP(y))) % 7)
#define FIRST_OF(m, y)	calc_weekday(m, 1, y)
X
#define PREV_MONTH(m, y) ((m) == JAN ? DEC : (m) - 1)
#define PREV_YEAR(m, y)  ((m) == JAN ? (y) - 1 : (y))
#define NEXT_MONTH(m, y) ((m) == DEC ? JAN : (m) + 1)
#define NEXT_YEAR(m, y)  ((m) == DEC ? (y) + 1 : (y))
X
#define INIT_COLORS	memcpy(day_color, default_color, sizeof(day_color))
X
#define P_LASTCHAR(p)	((p) && *(p) ? (p) + strlen(p) - 1 : NULL)
#define LASTCHAR(p)	(p)[strlen(p) - 1]
X
#define IS_NUMERIC(p)	((p)[strspn((p), DIGITS)] == '\0')
#define IS_WILD(w)	((w) >= WILD_FIRST && (w) <= WILD_LAST)
X
#define MAKE_DATE(dt, m, d, y) \
X	if (1) { (dt).mm = m; (dt).dd = d; (dt).yy = y; } else
X
#define ERR(errmsg) \
X	FPR(stderr, E_ILL_LINE, progname, errmsg, filename, line);
X
#ifdef __STDC__
#define TOLOWER(c)	tolower(c)
#else
#define TOLOWER(c)	(isupper(c) ? tolower(c) : (c))
#endif
X
#ifndef isodigit			/* rare */
#define isodigit(c)	((c) >= '0' && (c) <= '7')
#endif
#ifndef isxdigit			/* ANSI standard */
#define isxdigit(c) \
X	(isdigit(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F'))
#endif
X
X
/* preprocessor token codes - cf. get_token(), pcallang.h */
X
#define PP_DEFINE	 0
#define PP_ELSE		 1
#define PP_ENDIF	 2
#define PP_IFDEF	 3
#define PP_IFNDEF	 4
#define PP_INCLUDE	 5
#define PP_UNDEF	 6
#define PP_OTHER	-1	/* not pp token */
X
/* ordinal number codes - cf. get_ordinal(), pcallang.h */
X
#define ORD_NEGNUM	-1	/* negative ordinal (-2nd == next to last) */
#define ORD_POSNUM	 1	/* positive ordinal */
#define ORD_ODD		 2	/* special codes for "odd" and "even" */
#define ORD_EVEN	 3
#define ORD_ALL		 4	/* special code for "all" used as ordinal */
#define ORD_OTHER	 0	/* not ordinal token */
X
/* moon phase codes - cf. pcallang.h and moonphas.c */
X
#define MOON_NM		 0	/* new moon */
#define MOON_1Q		 1	/* first quarter */
#define MOON_FM	 	 2	/* full moon */
#define MOON_3Q		 3	/* last quarter */
#define MOON_OTHER	-1	/* unrecognizable */
X
/* date type codes - cf. date_type(), get_keywd(), and pcallang.h */
X
#define DT_ALL		 0	/* "all" keyword" */
#define DT_NOTE		 1	/* "note" keyword */
#define DT_OPT		 2	/* "opt" keyword */
#define DT_YEAR		 3	/* "year" keyword */
#define DT_MONTH	 4	/* name of month */
#define DT_DATE		 5	/* date of form dd/mm{/yy} or mm/dd{/yy} */
#define DT_EURDATE	 6	/* European date of form dd <month> */
#define DT_ORDINAL	 7	/* ordinal (first, 1st, ... last) */
#define DT_WEEKDAY	 8	/* weekday name */
#define DT_OTHER	-1	/* unrecognizable first token */
X
/* preposition token codes - cf. get_prep(), pcallang.h */
X
#define PR_BEFORE	 0
#define PR_ON_BEFORE	 1
#define PR_AFTER	 2
#define PR_ON_AFTER	 3
#define PR_OTHER	-1	/* not a preposition */
X
X
/*
X * Miscellaneous other constants:
X */
X
#define FALSE		0	/* pseudo-Booleans */
#define TRUE		1
X
#define MAX_NESTING	10	/* maximum nesting level for file inclusion */
X
#define MAX_PP_SYMS	100	/* number of definable preprocessor symbols */
#define PP_SYM_UNDEF     -1	/* flag for undefined symbol */
X
#define EXPR_ERR	-1	/* expression parsing error */
X
#define MIN_YR		1900	/* significant years (calendar limits) */
#define MAX_YR		9999
X
#define CENTURY		1900	/* default century for two-digit years */
X
#define JAN		 1	/* significant months */
#define FEB		 2
#define DEC		12
#define NOT_MONTH	-1	/* not valid month */
#define ALL_MONTHS	 0	/* select all months */
#define ENTIRE_YEAR	13	/* select entire year as one entity */
X
#define SUN		 0	/* significant weekdays */
#define SAT		 6
#define NOT_WEEKDAY	-1	/* not valid weekday */
X
#define SCREENWIDTH	72	/* command-line message in usage() */
X
#define FEB_29_OK	1	/* if != 0, ignore 2/29 of common year */
X
/* wildcards - cf. days[] in pcallang.h and pdatefcn[] in pcal.c */
X
#define ANY_DAY		 7	/* special - matches any day */
#define ANY_WEEKDAY	 8	/* matches any weekday (including holidays) */
#define ANY_WORKDAY	 9	/* matches any weekday (excluding holidays) */
#define ANY_HOLIDAY	10	/* matches any holiday */
#define ANY_NONWEEKDAY	11	/* converses of above three */
#define ANY_NONWORKDAY	12
#define ANY_NONHOLIDAY	13
X
#define WILD_FIRST	ANY_DAY
#define WILD_LAST	ANY_NONHOLIDAY
X
#define DAY_TEXT	0	/* types of text in data structure */
#define HOLIDAY_TEXT	1
#define NOTE_TEXT	2
X
#define NOTE_DAY	32	/* dummy day for notes text */
X
#define MAX_DATES	366	/* maximum "wildcard" dates */
X
#define MAXWORD		100	/* maximum words in date file line */
#define STRSIZ		200	/* size of misc. strings */
#define LINSIZ		512	/* size of source line buffer */
X
#define MAXARGS		3	/* numeric command-line args */
X
#define WHITESPACE	" \t"	/* token delimiters in date file */
#define DIGITS    	"0123456789"
X
/* passes where flags may be recognized (cf. get_args(), pcallang.h) */
#define P_ENV	1	/* parsed from environment variable */
#define P_CMD1	2	/* parsed in first command-line pass */
#define P_OPT	4	/* parsed on "opt" lines in date file */
#define P_CMD2	8	/* parsed in second command-line pass */
X
/*
X * Defaults for calendar layout:
X */
X
#define DAYFONT		"Times-Bold"	/* default font names */
#define TITLEFONT	"Times-Bold"
#define NOTESFONT	"Helvetica-Narrow"
X
#define LFOOT 		""              /* default foot strings */
#define CFOOT 		""
#define RFOOT 		""
X
#define LANDSCAPE  	90		/* degrees to rotate */
#define PORTRAIT    	 0
#define ROTATE	   	LANDSCAPE	/* default */
X
/* scaling/translation factors based on 8.5 x 11 inch (612 x 792 point) page */
X
#define XSVAL_L		"1"		/* scale/translate values (landscape) */
#define YSVAL_L		"1"
#define XTVAL_L		"46"		/* (792 - 700) / 2 = 46 */
#define YTVAL_L		"-120"
#define XSVAL_P		"0.773"		/* scale/translate values (portrait) */
#define YSVAL_P		"0.773"		/* 612/792 */
#define XTVAL_P		"46"
#define YTVAL_P		"492"		/* 612 - 120 = 492 */
X
#if (ROTATE == LANDSCAPE)		/* select appropriate defaults */
#define XSVAL		XSVAL_L
#define YSVAL		YSVAL_L
#define XTVAL		XTVAL_L
#define YTVAL		YTVAL_L
#else
#define XSVAL		XSVAL_P
#define YSVAL		YSVAL_P
#define XTVAL		XTVAL_P
#define YTVAL		YTVAL_P
#endif
X
#define USA_DATES	0		/* date styles */
#define EUR_DATES	1
#define DATE_STYLE	USA_DATES	/* default */
X
#define FIRST_DAY	SUN		/* first day of logical week */
X
#define BLACK		0		/* colors for dates */
#define GRAY		1
#define DAY_COLOR	{ GRAY, BLACK, BLACK, BLACK, BLACK, BLACK, GRAY }
X
#define NO_DATEFILE 	0		/* date file (if any) to use */
#define USER_DATEFILE	1
#define SYS_DATEFILE	2
X
/* values below must be in sync with conditionals[] in pcal.c */
#define NO_MOONS	0		/* no moon icons */
#define ALL_MOONS	1		/* moon icon on every day */
#define SOME_MOONS	2		/* icons on full, half, new moons */
#define DRAW_MOONS	NO_MOONS	/* default */
X
#define NO_JULIANS	0		/* no Julian dates */
#define ALL_JULIANS	1		/* Julian date + days left */
#define SOME_JULIANS	2		/* just Julian dates */
#define JULIAN_DATES	NO_JULIANS	/* default: none */
X
/*
X * Global typedef declarations for data structure (cf. readfile.c)
X */
X
/*
X * The internal data structure consists of a series of linked lists as 
X * pictured below (for clarity, only one instance of each node is shown):
X *
X *
X * head
X *  |
X *  |        year_info
X *  |    -----------------           month_info
X *   -->| year            |       -----------------            day_info
X *      | month_info*[0]  |----->| holidays        |       ----------------
X *      |   ...           |      | day_info*[0]    |----->| is_holiday     |
X *      | month_info*[11] |--->  |   ...           |      | text_string*   |--->
X *      | next year_info* |--    | day_info*[30]   |--->  | next day_info* |-- 
X *       -----------------   |   | day_info*[NOTE] |--->   ----------------   |
X *                           |    -----------------                           |
X *                           |                                                |
X *             ...        <--                                     ...      <--
X *
X * 
X * Each year_info node consists of the year, 12 pointers (Jan .. Dec) to
X * month_info nodes, and a pointer to the next year_info node in the chain.
X * (The year_info chain is maintained in ascending order by year.)
X *
X * Each month_info node consists of a bitmap of the holidays for that month, 
X * a pointer to the day_info chain for all 31 possible days of the month, and
X * an additional pointer to the day_info chain for the "Notes" pseudo-day. 
X * (A day_info chain is a linked list of all the text entries for a given
X * day, in the order in which they were encountered in the date file.)
X *
X * Each day_info node consists of a flag indicating whether the associated
X * text string is holiday or non-holiday text (any given day may have both),
X * a pointer to the text string itself, and a pointer to the next day_info 
X * node in the chain.
X *
X */
X
typedef struct d_i {
X	int is_holiday;
X	char *text;
X	struct d_i *next;
X	} day_info;
X
typedef struct m_i {
X	unsigned long holidays;
X	day_info *day[32];	/* including NOTE_DAY */
X	} month_info;
X
typedef struct y_i {
X	int year;
X	month_info *month[12];
X	struct y_i *next;
X	} year_info;
X
/*
X * Global typedef declarations for keyword descriptors (cf. pcallang.h)
X */
X
typedef struct {
X	char *name;
X	int   code;
X	} KWD;
X
typedef struct {
X	char *name;
X	int   code;
X	int   value;
X	} KWD_O;		/* keyword plus ordinal value */
X
typedef struct {
X	char *name;
X	int   code;
#ifdef PROTOS
X	int (*pfcn)(char *);
#else
X	int (*pfcn)();
#endif
X	} KWD_F;		/* keyword plus dispatch function */
X
/*
X * Global typedef declaration for date structure (cf. parse_ord())
X */
X
typedef struct {
X	int mm;
X	int dd;
X	int yy;
} DATE;
X
/* 
X * Global typedef declaration for flag usage struct (cf. pcallang.h, get_args())
X */
X
typedef struct {
X	char flag;		/* name of flag */
X	char has_arg;		/* TRUE if flag takes (optional) arg */
X	char passes;		/* "or" of P_xxx for relevant passes */
X	} FLAG_USAGE;
X
/*
X * Global typedef declarations for usage message (cf. pcallang.h, usage())
X */
X
typedef struct {
X	char flag;		/* name of flag */
X	char *meta;		/* metaname for argument (if any) */
X	char *text;		/* associated text */
X	char *def;		/* default value (if any) */
X	} FLAG_MSG;
X
typedef struct {
X	char *desc;		/* description of param */
X	char *text;		/* associated text */
X	} PARAM_MSG;
X
typedef char *DATE_MSG;		/* date file syntax message */
X
SHAR_EOF
chmod 0666 pcaldefs.h ||
echo 'restore of pcaldefs.h failed'
Wc_c="`wc -c < 'pcaldefs.h'`"
test 14453 -eq "$Wc_c" ||
	echo 'pcaldefs.h: original size 14453, current size' "$Wc_c"
fi
# ============= pcalglob.h ==============
if test -f 'pcalglob.h' -a X"$1" != X"-c"; then
	echo 'x - skipping pcalglob.h (File already exists)'
else
echo 'x - extracting pcalglob.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'pcalglob.h' &&
/*
X * pcalglob.h - definitions and declarations of globals used throughout Pcal
X *
X * Revision history:
X *
X *	4.0	AWR	01/28/91	Added support for -b and -w flags
X *
X *			01/15/91	Extracted from pcal.c
X *
X */
X
#ifdef PROTOS
#include "protos.h"
#else
#include "noprotos.h"
#endif
X
/*
X * Definitions and/or declarations of globals
X */
X
#ifdef MAIN_MODULE
X
/*
X * Misc. globals
X */
X
year_info *head = NULL;		/* head of internal data structure */
int curr_year;			/* current default year for date file entries */
char *words[MAXWORD];		/* maximum number of words per date file line */
char lbuf[LINSIZ];		/* date file source line buffer */
char progname[STRSIZ];		/* program name (for error messages) */
char version[20];		/* program version (for info messages) */
X
/* lengths and offsets of months in common year */
char month_len[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
short month_off[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
X
#ifdef PROTOS
int (*pdatefcn[])(int, int, int) = {
#else
int (*pdatefcn[])() = {
#endif
X	is_anyday, is_weekday, is_workday, is_holiday, not_weekday,
X	not_workday, not_holiday };
X
/*
X * Default values for command-line options:
X */
X
char default_color[] = DAY_COLOR; 	/* -b, -g */
char day_color[7];
X
int datefile_type = SYS_DATEFILE;	/* -e, -f */
char datefile[STRSIZ] = "";
X
int rotate = ROTATE;			/* -l, -p */
X
int draw_moons = DRAW_MOONS;		/* -m, -M */
X
char dayfont[STRSIZ] = DAYFONT;		/* -d, -t, -n */
char titlefont[STRSIZ] = TITLEFONT;
char notesfont[STRSIZ] = NOTESFONT;
X
char lfoot[STRSIZ] = LFOOT;             /* -L, -C, -R */
char cfoot[STRSIZ] = CFOOT;
char rfoot[STRSIZ] = RFOOT;
X
int first_day_of_week = FIRST_DAY;	/* -F */
X
int date_style = DATE_STYLE;		/* -A, -E */
X
char outfile[STRSIZ] = OUTFILE;		/* -o */
X
char xsval[12] = XSVAL;			/* -x, -y, -X, -Y */
char ysval[12] = YSVAL;
char xtval[12] = XTVAL;
char ytval[12] = YTVAL;
X
int julian_dates = JULIAN_DATES;	/* -j */
X
int do_whole_year = FALSE;		/* -w */
X
int blank_boxes = FALSE;		/* -B */
X
int outline_nums = FALSE;		/* -O */
X
#else
X
/*
X * Misc. globals
X */
X
extern year_info *head;		/* head of internal data structure */
extern int curr_year;		/* current default year for date file entries */
extern char *words[];		/* maximum number of words per date file line */
extern char lbuf[];		/* date file source line buffer */
extern char progname[];		/* program name (for error messages) */
extern char version[];		/* program version (for info messages) */
X
/* lengths and offsets of months in common year */
extern char month_len[];
extern short month_off[];
X
/* dispatch functions and table for wildcard processing */
extern int (*pdatefcn[])(); 
X
/*
X * Default values for command-line options:
X */
X
extern char default_color[];	 	/* -b, -g */
extern char day_color[];
X
extern int datefile_type;		/* -e, -f */
extern char datefile[];
X
extern int rotate;			/* -l, -p */
X
extern int draw_moons;			/* -m, -M */
X
extern char dayfont[];			/* -d, -t, -n */
extern char titlefont[];
extern char notesfont[];
X
extern char lfoot[];			/* -L, -C, -R */
extern char cfoot[];
extern char rfoot[];
X
extern int first_day_of_week;		/* -F */
X
extern int date_style;			/* -A, -E */
X
extern char outfile[];			/* -o */
X
extern char xsval[];			/* -x, -y, -X, -Y */
extern char ysval[];
extern char xtval[];
extern char ytval[];
X
extern int julian_dates;		/* -j */
X
extern int do_whole_year;		/* -w */
X
extern int blank_boxes;			/* -B */
X
extern int outline_nums;		/* -O */
X
#endif
X
SHAR_EOF
chmod 0666 pcalglob.h ||
echo 'restore of pcalglob.h failed'
Wc_c="`wc -c < 'pcalglob.h'`"
test 3493 -eq "$Wc_c" ||
	echo 'pcalglob.h: original size 3493, current size' "$Wc_c"
fi
true || echo 'restore of pcalinit.c failed'
echo End of part 3, continue with part 4
exit 0