home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 2: PC
/
frozenfish_august_1995.bin
/
bbs
/
d09xx
/
d0975.lha
/
PCal
/
pcallang.h
< prev
next >
Wrap
C/C++ Source or Header
|
1992-02-19
|
35KB
|
992 lines
/*
* pcallang.h - language-dependent strings (month and day names, option file
* keywords, preprocessor tokens, prepositions, etc.):
*
* Revision history:
*
* 4.3 AWR 12/03/91 support -s flag (override default
* shading of dates and fill boxes)
*
* 10/17/91 support -Z flag to generate debugging
* information
*
* 4.2 AWR 10/08/91 support -[kK] flags (select position
* of small calendars
*
* 10/03/91 support "note/<n>" (new message only)
*
* support -S flag (no small calendars)
*
* 10/02/91 support -N flag (user-specified notes
* heading)
*
* change message for -n to reflect
* optional notes font size
*
* 09/30/91 support "if" (synonym for "ifdef") and
* "elif" in date file
*
* 09/19/91 support -c flag (generate input file
* suitable for use with Un*x "calendar"
* utility and Pcal)
*
* support "elif" in "if{n}def" block
*
* 4.11 AWR 08/20/91 support "nearest" keyword as per
* Andy Fyfe
*
* changed MIN_ORD_LEN from 3 to 4 (to
* distinguish "even" from "every")
*
* add ABBR_DAY_LEN and ABBR_MONTH_LEN
* (cf. writefil.c) for length of
* abbreviated day/month names
*
* document %u and %w formats and number
* following %[+-] (cf. writefil.c)
*
* add DEF_WHOLE_YEAR (predefined when
* -w flag specified - cf. pcal.c)
*
* 4.1 AWR 08/16/91 support -G flag (outlined gray)
*
* 4.02 AWR 07/02/91 support -v flag (version number);
* add ordinal_suffix(); add format
* specifiers to help message
*
* 4.0 AWR 03/01/91 expand parameter message to explain
* parameter meaning when -w specified
*
* AWR 02/19/91 revise ordinal definitions for
* support of negative ordinals
*
* AWR 02/06/91 add text describing expression syntax
*
* AWR 02/04/91 support "odd" and "even" ordinals
*
* AWR 01/28/91 support -B (blank fill squares) flag
* and -O (outline "gray" dates) flag
*
* AWR 01/16/91 added moon file support (tokens, help
* file text, error messages); define
* note block heading here
*
* AWR 01/07/91 added support for -w (whole year) flag
*
* 3.0 AWR 12/10/90 added support for "workday", "weekday",
* "holiday", et. al.
*
* AWR 11/15/90 extracted from pcal.c; revised
* to contain all language-dependent
* strings
*/
#define ALL "all" /* command-line or date file keyword */
#ifdef MAIN_MODULE
char *months[12] = {
"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"
};
/* Must be a 2-D array so address within may be used as an initializer;
* wildcard names must be in same order as symbolic names in pcaldefs.h
*/
char days[14][12] = {
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
"Saturday", /* weekday names */
"day", "weekday", "workday", "holiday", "nonweekday", "nonworkday",
"nonholiday" /* wildcards */
};
/* preprocessor tokens: token name, token code, dispatch routine; note that
* substring "if" must follow "ifdef" and "ifndef" for proper matching
*/
KWD_F pp_info[] = {
"define", PP_DEFINE, do_define,
"elif", PP_ELIF, do_ifdef,
"else", PP_ELSE, NULL,
"endif", PP_ENDIF, NULL,
"ifdef", PP_IFDEF, do_ifdef,
"ifndef", PP_IFNDEF, do_ifndef,
"if", PP_IFDEF, do_ifdef, /* "ifdef" synonym */
"include", PP_INCLUDE, NULL, /* do_include */
"undef", PP_UNDEF, do_undef,
NULL, PP_OTHER, NULL }; /* must be last */
/* ordinal numbers - e.g. "first Monday in September": ordinal name,
* ordinal code, ordinal value; note that "all" is parsed as a keyword
* and (depending on context) may be subsequently treated as an ordinal
*/
KWD_O ordinals[] = {
"first", ORD_POSNUM, 1,
"second", ORD_POSNUM, 2,
"third", ORD_POSNUM, 3,
"fourth", ORD_POSNUM, 4,
"fifth", ORD_POSNUM, 5,
"last", ORD_NEGNUM, -1,
"odd", ORD_ODD, 0,
"even", ORD_EVEN, 0,
NULL, ORD_OTHER, 0 }; /* must be last */
/* allowable suffixes for ordinal numbers - these must be in order 0, 1, 2...
* according to the rules of the target language; cf. ordinal_suffix() below
*/
char *ord_suffix[] = { "th", "st", "nd", "rd", NULL };
/* prepositions - e.g., "Friday after fourth Thursday in November" */
KWD preps[] = {
"before", PR_BEFORE,
"preceding", PR_BEFORE,
"on_or_before", PR_ON_BEFORE,
"oob", PR_ON_BEFORE,
"after", PR_AFTER,
"following", PR_AFTER,
"on_or_after", PR_ON_AFTER,
"ooa", PR_ON_AFTER,
"nearest", PR_NEAREST,
NULL, PR_OTHER }; /* must be last */
/* other keywords */
KWD keywds[] = {
ALL, DT_ALL,
"each", DT_ALL,
"every", DT_ALL,
"note", DT_NOTE,
"opt", DT_OPT,
"year", DT_YEAR,
NULL, DT_OTHER }; /* must be last */
/* moon phases (for moon file) */
KWD phases[] = {
"new_moon", MOON_NM, /* new moon */
"nm", MOON_NM,
"first_quarter",MOON_1Q, /* first quarter */
"1Q", MOON_1Q,
"FQ", MOON_1Q,
"full_moon", MOON_FM, /* full moon */
"FM", MOON_FM,
"last_quarter", MOON_3Q, /* last (third) quarter */
"LQ", MOON_3Q,
"third_quarter",MOON_3Q,
"3Q", MOON_3Q,
NULL, MOON_OTHER }; /* must be last */
/* default notes box header */
char default_notes_hdr[] = "Notes";
#else
extern char *months[];
extern char days[14][12];
extern KWD_F pp_info[];
extern KWD preps[];
extern KWD_O ordinals[];
extern char *ord_suffix[];
extern KWD keywds[];
extern KWD phases[];
extern char default_notes_hdr[];
#endif
/* minimum size of abbreviations - adjust as appropriate for target language */
#define MIN_DAY_LEN 3 /* distinguish "Thursday" from "third" */
#define ABBR_DAY_LEN 3 /* length of abbreviated day names */
#define MIN_MONTH_LEN 3
#define ABBR_MONTH_LEN 3 /* length of abbreviated month names */
#define MIN_PPTOK_LEN 3
#define MIN_PREP_LEN 7 /* distinguish "on_or_before", "on_or_after" */
#define MIN_ORD_LEN 4 /* distinguish "every" from "even" */
/*
* Symbolic names for command-line flags. These may be changed
* as desired in order to be meaningful in languages other than
* English.
*/
#define F_INITIALIZE 'I' /* re-initialize program defaults */
#define F_BLACK_DAY 'b' /* print day in black */
#define F_GRAY_DAY 'g' /* print day in gray */
#define F_DAY_FONT 'd' /* select alternate day font */
#define F_NOTES_FONT 'n' /* select alternate notes font */
#define F_TITLE_FONT 't' /* select alternate title font */
#define F_EMPTY_CAL 'e' /* print empty calendar */
#define F_DATE_FILE 'f' /* select alternate date file */
#define F_OUT_FILE 'o' /* select alternate output file */
#define F_LANDSCAPE 'l' /* landscape mode */
#define F_PORTRAIT 'p' /* portrait mode */
#define F_HELP 'h' /* generate full help message */
#define F_USAGE 'u' /* generate parameter usage message */
#define F_VERSION 'v' /* generate version ID */
#define F_MOON_4 'm' /* print new/half/full moons */
#define F_MOON_ALL 'M' /* print all moons */
#define F_DEFINE 'D' /* define preprocessor symbol */
#define F_UNDEF 'U' /* undefine preprocessor symbol */
#define F_L_FOOT 'L' /* define left foot string */
#define F_C_FOOT 'C' /* define center foot string */
#define F_R_FOOT 'R' /* define right foot string */
#define F_NOTES_HDR 'N' /* define heading for notes box */
#define F_FIRST_DAY 'F' /* define alternate starting day */
#define F_USA_DATES 'A' /* parse American date format */
#define F_EUR_DATES 'E' /* parse European date format */
#define F_X_TRANS 'X' /* X-axis transformation */
#define F_Y_TRANS 'Y' /* Y-axis transformation */
#define F_X_SCALE 'x' /* X-axis scale factor */
#define F_Y_SCALE 'y' /* Y-axis scale factor */
#define F_JULIAN 'j' /* print Julian day (day of year) */
#define F_JULIAN_ALL 'J' /* print Julian day and days left */
#define F_WHOLE_YEAR 'w' /* print whole year per page */
/* (cf. W_WYFLAG below) */
#define F_BLANK_BOXES 'B' /* don't fill unused boxes */
#define F_SC_NONE 'S' /* suppress small calendars */
#define F_SC_FIRST 'k' /* prev/next in first two boxes */
#define F_SC_SPLIT 'K' /* split between first and last boxes */
#define F_OUTLINE_GRAY 'G' /* outline and fill "gray" dates */
#define F_OUTLINE 'O' /* draw "gray" dates as outlines */
#define F_SHADING 's' /* define date/fill box shading */
#define F_CALENDAR 'c' /* generate "calendar" utility input */
/* special "hidden" flag (and subflags) for debug info generation */
#define F_DEBUG 'Z' /* generate debugging information */
#define D_DATES 'D' /* debug dates as read */
#define D_FILE_PATHS 'F' /* debug date file paths */
#define D_MOON 'M' /* debug moon phases */
#define D_TEXT 'T' /* debug dates/text as written */
#define D_OPT 'O' /* debug option flags */
#define D_PREPROCESSOR 'P' /* debug "preprocessor" operation */
/*
* Flag usage information - not strictly language-dependent, but here anyway
* (N.B.: all flags must be represented by an entry in this table!)
*
* Flags may appear in any of three places: in environment variable
* PCAL_OPTS, on the command line, or in "opt" lines in the date file.
* The command line is actually parsed twice: once before reading the date
* file to get the flags needed in processing it (-[bcefgkwADEKSU]), and
* and again after reading the date file to give the user one last chance
* to override any of the other flags set earlier. (Note, however, that
* the only way to turn off -J|-j [Julian dates], -M|-m [moons], -w [whole
* year], or -G|-O [outline "gray" dates] once selected is to use -I to
* reinitialize all program defaults.)
*
* The table below supplies the following information about each flag:
*
* - Its name (cf. symbolic definitions above)
*
* - Whether or not it can take an (optional) argument
*
* - Which passes parse it - in order, they are: P_CMD0 ("pre-pass" of
* command line to find debugging flags), P_ENV (environment variable),
* P_CMD1 (first command line pass), P_OPT ("opt" lines in date file),
* and P_CMD2 (second command line pass)
*
*/
#ifdef MAIN_MODULE
FLAG_USAGE flag_tbl[] = {
/* flag name arg? passes where parsed */
F_INITIALIZE, FALSE, P_ENV | P_CMD1 | P_OPT | P_CMD2 ,
F_BLACK_DAY, TRUE, P_ENV | P_CMD1 | P_OPT ,
F_GRAY_DAY, TRUE, P_ENV | P_CMD1 | P_OPT ,
F_DAY_FONT, TRUE, P_ENV | P_OPT | P_CMD2 ,
F_NOTES_FONT, TRUE, P_ENV | P_OPT | P_CMD2 ,
F_TITLE_FONT, TRUE, P_ENV | P_OPT | P_CMD2 ,
F_EMPTY_CAL, FALSE, P_ENV | P_CMD1 ,
F_DATE_FILE, TRUE, P_ENV | P_CMD1 ,
F_OUT_FILE, TRUE, P_ENV | P_OPT | P_CMD2 ,
F_LANDSCAPE, FALSE, P_ENV | P_OPT | P_CMD2 ,
F_PORTRAIT, FALSE, P_ENV | P_OPT | P_CMD2 ,
F_HELP, FALSE, P_CMD1 ,
F_USAGE, FALSE, P_CMD1 ,
F_VERSION, FALSE, P_CMD1 ,
F_MOON_4, FALSE, P_ENV | P_OPT | P_CMD2 ,
F_MOON_ALL, FALSE, P_ENV | P_OPT | P_CMD2 ,
F_DEFINE, TRUE, P_ENV | P_CMD1 ,
F_UNDEF, TRUE, P_ENV | P_CMD1 ,
F_L_FOOT, TRUE, P_ENV | P_OPT | P_CMD2 ,
F_C_FOOT, TRUE, P_ENV | P_OPT | P_CMD2 ,
F_R_FOOT, TRUE, P_ENV | P_OPT | P_CMD2 ,
F_NOTES_HDR, TRUE, P_ENV | P_OPT | P_CMD2 ,
F_FIRST_DAY, TRUE, P_ENV | P_OPT | P_CMD2 ,
F_USA_DATES, FALSE, P_ENV | P_CMD1 | P_OPT ,
F_EUR_DATES, FALSE, P_ENV | P_CMD1 | P_OPT ,
F_X_TRANS, TRUE, P_ENV | P_OPT | P_CMD2 ,
F_Y_TRANS, TRUE, P_ENV | P_OPT | P_CMD2 ,
F_X_SCALE, TRUE, P_ENV | P_OPT | P_CMD2 ,
F_Y_SCALE, TRUE, P_ENV | P_OPT | P_CMD2 ,
F_JULIAN, FALSE, P_ENV | P_OPT | P_CMD2 ,
F_JULIAN_ALL, FALSE, P_ENV | P_OPT | P_CMD2 ,
F_WHOLE_YEAR, FALSE, P_ENV | P_CMD1 | P_OPT ,
F_BLANK_BOXES, FALSE, P_ENV | P_OPT | P_CMD2 ,
F_SC_NONE, FALSE, P_ENV | P_CMD1 | P_OPT ,
F_SC_FIRST, FALSE, P_ENV | P_CMD1 | P_OPT ,
F_SC_SPLIT, FALSE, P_ENV | P_CMD1 | P_OPT ,
F_OUTLINE_GRAY, FALSE, P_ENV | P_OPT | P_CMD2 ,
F_OUTLINE, FALSE, P_ENV | P_OPT | P_CMD2 ,
F_SHADING, TRUE, P_ENV | P_OPT | P_CMD2 ,
F_CALENDAR, FALSE, P_ENV | P_CMD1 ,
F_DEBUG, TRUE, P_CMD0 | P_ENV | P_OPT ,
'-', FALSE, P_ENV | P_CMD1 | P_OPT | P_CMD2 ,
'\0', FALSE, P_ENV | P_CMD1 | P_OPT | P_CMD2 /* must be last */
};
/* subflags for debug info flag F_DEBUG */
DEBUG_INFO debug_info[] = {
D_DATES, DEBUG_DATES,
D_FILE_PATHS, DEBUG_PATHS,
D_MOON, DEBUG_MOON,
D_OPT, DEBUG_OPTS,
D_PREPROCESSOR, DEBUG_PP,
D_TEXT, DEBUG_TEXT,
'\0', 0 /* must be last */
};
#else
extern FLAG_USAGE flag_tbl[];
extern DEBUG_INFO debug_info[];
#endif
/*
* Words used in usage() message - translate as necessary
*/
#define W_DEFAULT "default" /* translate as required */
#define W_USAGE "Usage"
#define W_FONT "<FONT>" /* names of metavariables */
#define W_FONT_SIZE "<FONT>{/<n>}"
#define W_DAY "<DAY>"
#define W_STRING "<STRING>"
#define W_FILE "<FILE>"
#define W_SYMBOL "<SYMBOL>"
#define W_VALUE "<VALUE>"
#define W_SHADING "{<d>}{/<f>}"
#define W_MM "MM" /* abbrev. for month, year */
#define W_YY "YY"
#define W_WYFLAG "-w" /* must conform to F_WHOLE_YEAR */
#define W_BLACK "black" /* cf. color_msg() */
#define W_GRAY "gray"
/* special flag_msg[] entries for end of option group, etc. */
#define END_GROUP '\n', NULL, NULL, NULL /* end of option group */
#define END_LIST '\0', NULL, NULL, NULL /* end of list */
#define GROUP_DEFAULT ' ', NULL, " " /* group default */
/*
* Message strings to be printed by usage() - translate as necessary
*/
#ifdef MAIN_MODULE
FLAG_MSG flag_msg[] = {
/* flag name metasyntax description default */
F_INITIALIZE, NULL, "initialize all parameters to program defaults", NULL,
END_GROUP,
F_BLACK_DAY, W_DAY, "print weekday in black", NULL,
F_GRAY_DAY, W_DAY, "print weekday in gray (see below)", NULL,
END_GROUP,
F_OUTLINE_GRAY, NULL, "print \"gray\" dates as filled outlines", NULL,
F_OUTLINE, NULL, "print \"gray\" dates as unfilled outlines", NULL,
#if NUM_STYLE == GRAY_NUMS
GROUP_DEFAULT, "gray characters",
#else
#if NUM_STYLE == OUTLINE_NUMS
GROUP_DEFAULT, "unfilled outlines",
#else
GROUP_DEFAULT, "filled outlines",
#endif
#endif
END_GROUP,
F_SHADING, W_SHADING, "specify date/fill box shading", SHADING,
END_GROUP,
F_DAY_FONT, W_FONT, "specify alternate day name font", DAYFONT,
F_NOTES_FONT, W_FONT_SIZE, "specify alternate notes font and optional size <n>", NULL,
' ', NULL, " ", NOTESFONT,
F_TITLE_FONT, W_FONT, "specify alternate title font", TITLEFONT,
END_GROUP,
F_EMPTY_CAL, NULL, "generate empty calendar (ignore date file)", NULL,
END_GROUP,
F_DATE_FILE, W_FILE, "specify alternate date file", DATEFILE,
END_GROUP,
#ifdef DEFAULT_OUTFILE
F_OUT_FILE, W_FILE, "specify alternate output file", DEFAULT_OUTFILE,
#else
F_OUT_FILE, W_FILE, "specify alternate output file", "stdout",
#endif
END_GROUP,
F_LANDSCAPE, NULL, "generate landscape-style calendar", NULL,
F_PORTRAIT, NULL, "generate portrait-style calendar", NULL,
#if ROTATE == LANDSCAPE
GROUP_DEFAULT, "landscape",
#else
GROUP_DEFAULT, "portrait",
#endif
END_GROUP,
F_HELP, NULL, "print this help message", NULL,
F_USAGE, NULL, "print parameter usage message", NULL,
F_VERSION, NULL, "print version information", NULL,
END_GROUP,
F_MOON_4, NULL, "draw a \"moon\" icon at full/new/half moons", NULL,
F_MOON_ALL, NULL, "draw a \"moon\" icon every day", NULL,
#if DRAW_MOONS == NO_MOONS
GROUP_DEFAULT, "no moons",
#else
#if DRAW_MOONS == SOME_MOONS
GROUP_DEFAULT, "full/new/half moons",
#else
GROUP_DEFAULT, "every day",
#endif
#endif
END_GROUP,
F_DEFINE, W_SYMBOL, "define preprocessor symbol", NULL,
F_UNDEF, W_SYMBOL, "undefine preprocessor symbol", NULL,
END_GROUP,
F_L_FOOT, W_STRING, "specify left foot string", LFOOT,
F_C_FOOT, W_STRING, "specify center foot string", CFOOT,
F_R_FOOT, W_STRING, "specify right foot string", RFOOT,
END_GROUP,
F_NOTES_HDR, W_STRING, "specify header for notes box", default_notes_hdr,
END_GROUP,
F_FIRST_DAY, W_DAY, "specify starting day of week", days[FIRST_DAY],
END_GROUP,
F_USA_DATES, NULL, "parse American dates (\"mm/dd{/yy}\" and \"month dd\")", NULL,
F_EUR_DATES, NULL, "parse European dates (\"dd/mm{/yy}\" and \"dd month\")", NULL,
#if DATE_STYLE == USA_DATES
GROUP_DEFAULT, "American",
#else
GROUP_DEFAULT, "European",
#endif
END_GROUP,
F_X_TRANS, W_VALUE, "specify x-axis translation", XTVAL,
F_Y_TRANS, W_VALUE, "specify y-axis translation", YTVAL,
F_X_SCALE, W_VALUE, "specify x-axis scale factor", XSVAL,
F_Y_SCALE, W_VALUE, "specify y-axis scale factor", YSVAL,
END_GROUP,
F_JULIAN, NULL, "print Julian day (day of year)", NULL,
F_JULIAN_ALL, NULL, "print Julian day and days left in year", NULL,
#if JULIAN_DATES == NO_JULIANS
GROUP_DEFAULT, "neither",
#else
#if JULIAN_DATES == SOME_JULIANS
GROUP_DEFAULT, "Julian day",
#else
GROUP_DEFAULT, "both",
#endif
#endif
END_GROUP,
F_WHOLE_YEAR, NULL, "print whole year (12 consecutive months) per page", NULL,
END_GROUP,
F_BLANK_BOXES, NULL, "leave unused boxes blank", NULL,
END_GROUP,
F_SC_NONE, NULL, "suppress generation of small calendars", NULL,
F_SC_FIRST, NULL, "print small calendars in first two boxes", NULL,
F_SC_SPLIT, NULL, "print previous month in first box, next in last", NULL,
#if SMALL_CAL_POS == SC_LAST
GROUP_DEFAULT, "last two boxes",
#else
#if SMALL_CAL_POS == SC_FIRST
GROUP_DEFAULT, "first two boxes",
#else
#if SMALL_CAL_POS == SC_SPLIT
GROUP_DEFAULT, "first/last boxes",
#else
GROUP_DEFAULT, "suppress small calendars",
#endif
#endif
#endif
END_GROUP,
F_CALENDAR, NULL, "generate input for Un*x calendar(1) utility", NULL,
END_GROUP, /* must precede END_LIST */
END_LIST /* must be last */
};
#else
extern FLAG_MSG flag_msg[];
#endif
/* Numeric parameter descriptions and text */
#ifdef MAIN_MODULE
#if __STDC__
PARAM_MSG param_msg[] = {
W_YY, "generate calendar for year " W_YY " (19" W_YY " if " W_YY " < 100)",
W_MM " " W_YY, "generate calendar for month " W_MM " (Jan = 1), year " W_YY,
W_MM " " W_YY " N", "generate calendars for N months, starting at " W_MM "/" W_YY,
"(" W_DEFAULT ")", "generate calendar for current month and/or year",
"", "",
"if " W_WYFLAG " specified:", "",
"", "",
W_YY, "generate calendar for year " W_YY " (19" W_YY " if " W_YY " < 100)",
W_MM " " W_YY, "generate calendars for 12 months, starting at " W_MM "/" W_YY,
W_MM " " W_YY " N", "generate calendars for N months, starting at " W_MM "/" W_YY,
"", " (N rounded up to next multiple of 12)",
"(" W_DEFAULT ")", "generate calendar for current year",
NULL, NULL /* must be last */
};
#else
PARAM_MSG param_msg[] = {
"YY", "generate calendar for year YY (19YY if YY < 100)",
"MM YY", "generate calendar for month MM (Jan = 1), year YY",
"MM YY N", "generate calendars for N months, starting at MM/YY",
"(default)", "generate calendar for current month and year",
"", "",
"if -w specified:", "",
"", "",
"YY", "generate calendar for year YY (19YY if YY < 100)",
"MM YY", "generate calendar for 12 months, starting at MM/YY",
"MM YY N", "generate calendars for N months, starting at MM/YY",
"", " (N rounded up to next multiple of 12)",
"(default)", "generate calendar for current year",
NULL, NULL /* must be last */
};
#endif
#else
extern PARAM_MSG param_msg[];
#endif
#define PARAM_MSGS 3 /* number of above to print in command-line syntax message */
/* Date file syntax message - lines are copied intact */
#ifdef MAIN_MODULE
char *date_msg[] = {
"",
"Date file syntax:",
"",
"The following rules describe the syntax of date file entries:",
"",
" year <year>",
"",
" opt <options>",
"",
" note{/<number>} <month_spec> <text>",
" note{/<number>} <month> <text>",
"",
" if -A flag (American date formats) specified:",
" <month_name> <day>{*} {<text>}",
" <month><sep><day>{<sep><year>}{*} {<text>}",
"",
" if -E flag (European date formats) specified:",
" <day> <month_name>{*} {<text>}",
" <day><sep><month>{<sep><year>}{*} {<text>}",
"",
" <ordinal> <day_name> in <month_spec>{*} {<text>}",
" <day_name> <prep> <date_spec>",
"",
"where",
"",
" {x} means x is optional",
"",
" <date_spec> := any of the above date specs (not year, note, or opt)",
" <month_name> := first 3+ characters of name of month, or \"all\"",
" <month_spec> := <month_name>, or \"year\"",
" <day_name> := first 3+ characters of name of weekday, \"day\",",
"\t\t\"weekday\", \"workday\", \"holiday\", \"nonweekday\",",
"\t\t\"nonworkday\", \"nonholiday\", \"new_moon\",",
"\t\t\"first_quarter\", \"full_moon\", or \"last_quarter\"",
" <ordinal> := ordinal number (\"1st\", \"2nd\", etc.), \"first\" .. \"fifth\",",
"\t\t\"last\", \"even\", \"odd\", or \"all\"",
" <prep> := \"before\", \"preceding\", \"after\", \"following\", \"nearest\",",
"\t\t\"on_or_before\", or \"on_or_after\"",
" <sep> := one or more non-numeric, non-space, non-'*' characters",
" <month>, <day>, <year> are the numeric forms",
"",
" <options> := any command-line option except -[cefhuvDU]",
"",
"Comments start with '#' and run through end-of-line.",
"",
"Holidays may be flagged by specifying '*' as the last character of",
"the date field(s), e.g. \"10/12* Columbus Day\", \"July 4* Independence",
"Day\", etc. Any dates flagged as holidays will be printed in gray, and",
"any associated text will appear adjacent to the date.",
"",
"Note that the numeric date formats (mm/dd{/yy}, dd.mm{.yy}) support",
"an optional year, which will become the subsequent default year. The",
"alphabetic date formats (month dd, dd month) do not support a year",
"field; the \"year yy\" command is provided to reset the default year.",
"",
"\"Floating\" days may be specified in the date file as \"first Mon in ",
"Sep\", \"last Mon in May\", \"4th Thu in Nov\", etc.; any word may be",
"used in place of \"in\". \"Relative floating\" days (e.g. \"Fri after 4th ",
"Thu in Nov\") are also accepted; they may span month/year bounds.",
"Pcal also accepts date specs such as \"all Friday{s} in October\", \"last",
"Thursday in all\", etc., and produces the expected results; \"each\" and",
"\"every\" are accepted as synonyms for \"all\". Negative ordinals are",
"allowed; \"-2nd\" means \"next to last\".",
"",
"The words \"day\", \"weekday\", \"workday\", and \"holiday\" may be used as",
"wildcards: \"day\" matches any day, \"weekday\" matches any day normally",
"printed in black, \"workday\" matches any day normally printed in black",
"and not explicitly flagged as a holiday, and \"holiday\" matches any",
"day explicitly flagged as a holiday. \"Nonweekday\", \"nonworkday\",",
"and \"nonholiday\" are also supported and have the obvious meanings.",
"Moon phases may also appear as wildcards; \"nm\" is accepted as a",
"synonym for \"new_moon\", \"1q\" and \"fq\" for \"first_quarter\", \"fm\" for",
"\"full_moon\", and \"3q\", \"lq\", and \"third_quarter\" for \"last_quarter\". ",
"",
"\"Odd\" and \"even\" do not refer to the actual date; instead, \"odd\"",
"means \"alternate, starting with the first\"; \"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.",
"",
"\"All\" refers to each individual month; \"year\" refers to the year",
"as an entity. Thus \"odd Fridays in all\" refers to the first/third/",
"fifth Friday of each month, while \"odd Fridays in year\" refers to",
"the first Friday of January and every other Friday thereafter.",
"",
"Additional notes may be propagated to an empty calendar box by the",
"inclusion of one or more lines of the form \"note{/<number>} <month>",
"<text>\", where <month> may be numeric or alphabetic; \"note{/<number>}",
"all <text>\" propagates <text> to each month in the current year.",
"<number> is an optional positive or negative number specifying the",
"empty box where the associated text is to be placed: if positive,",
"Pcal counts forward from the first empty box; if negative, Pcal counts",
"backward from the last empty box. Thus, \"note/1 ...\" places the",
"associated text in the first empty box, and \"note/-3 ...\" in the",
"third-to-last; the default is -1 (last empty box). (Note that if the",
"-S option is used, it must be specified either on the command line or",
"prior to any \"note\" lines in the date file.)",
"",
"Pcal also allows format specifiers in the text (and foot strings -",
"cf. the -L, -C, -R, and -N options); each will be replaced by its",
"equivalent string as outlined in the table below. (Most of these are",
"derived from the strftime() function; %[louwMD0+-] are Pcal-specific.)",
"",
"\t%a : abbreviated weekday",
"\t%A : full weekday",
"\t%b : abbreviated month name",
"\t%B : full month name",
"\t%d : day of month (1-31)",
"\t%j : day of year (1-366)",
"\t%l : days left in year (0-365)",
"\t%m : month (1-12)",
"\t%u : week number (1-54)",
"\t%U : week number (0-53)",
"\t%w : week number (1-54)",
"\t%W : week number (0-53)",
"\t%y : year w/o century (00-99)",
"\t%Y : year w/century",
"\t%% : '%' character",
"",
"\t%o : print number as ordinal",
"\t%0 : print number with leading zeroes",
"\t%+ : use following month or year",
"\t%- : use previous month or year",
"\t%{+N}[DWMY] : adjust date by +N days/weeks/months/years",
"\t%{-N}[DWMY] : adjust date by -N days/weeks/months/years",
"",
"%u considers the week containing 1/1 as week 1 and the following",
"logical Sunday (the first day of the week as printed; cf. the -F",
"flag) as the start of week 2; %U considers the first logical Sunday",
"as the first day of week 1. %w and %W behave like %u and %U",
"respectively, but use the first logical Monday instead. (Note that",
"%w has a different meaning to strftime().)",
"",
"%o prints a number as an ordinal, with the appropriate suffix (\"st\",",
"\"nd\", \"rd\", or \"th\" in English) appended; for example, \"%od\" prints",
"the day of the month as \"1st\", \"2nd\", \"3rd\", etc.",
"",
"Unlike strftime(), Pcal's default is to print numbers (except %y)",
"without leading zeroes. If leading zeroes are desired, the '0'",
"prefix may be used; for example, \"%0j\" prints the day of year as",
"001-365.",
"",
"%+ and %- direct Pcal to substitute the following/previous month/year",
"in the following [bBmyY] specifier; for example, \"%+B\" prints the",
"name of the next month.",
"",
"%{[+-]N}[DWMY] do not print anything, but instead adjust the",
"working date by +-N days (D), weeks (W), months (M), or years (Y);",
"subsequent format specifiers use the adjusted date instead of the",
"current date. For example, \"%+1M %B %Y\" adjusts the date forward by",
"one month and then prints the resulting month and year (\"January",
"1991\" in December, 1990); \"%-2W %b %d\" adjusts the date backward",
"by two weeks and prints the resulting month and day (\"Jul 26\" on",
"August 9).",
"",
"Such date adjustments are normally cumulative; for example,",
"\"%+1Y%-1D\" adjusts the date forward by one year and then backward",
"by one day. If %D or %M is specified alone (or if N is zero), Pcal",
"restores the original date. (Note that %M has a different meaning",
"to strftime().)",
"",
"The \"Notes\" box uses the first of the current month as the default",
"date. All foot strings use the first of the current month in single-",
"month mode and the first of the starting month in whole-year mode.",
"",
"Simple cpp-like functionality is provided. The date file may include",
"the following commands, which work like their cpp counterparts:",
"",
"\tdefine <sym>",
"\tundef <sym>",
"",
"\tif{{n}def} <expr>",
"\t ...",
"\t{ elif <expr>",
"\t ... }*",
"\t{ else",
"\t ... }",
"\tendif",
"",
"\tinclude <file>",
"",
"Note that these do not start with '#', which is reserved as a comment",
"character.",
"",
"<sym> is a symbol name consisting of a letter followed by zero or",
"more letters, digits, or underscores ('_'). Symbol names are always",
"treated in a case-insensitive manner.",
"",
"<expr> is an expression consisting of symbol names joined by the logical",
"operators (in order of precedence, high to low) '!' (unary negate), '&'",
"(and), '^' (exclusive or), and '|' (inclusive or). '&&' and '||' are",
"accepted as synonyms for '&' and '|' respectively; the order of",
"evaluation may be altered by the use of parentheses. A symbol whose",
"name is currently defined evaluates to TRUE; one whose name is not",
"currently defined evaluates to FALSE. Thus \"ifdef A | B | C\" is TRUE",
"if any of the symbols A, B, and C is currently defined, and",
"\"ifdef A & B & C\" is TRUE if all of them are.",
"",
"\"ifndef A | B | C\" is equivalent to \"ifdef !(A | B | C)\" (or, using",
"DeMorgan's Law, \"ifdef !A & !B & !C\") - in other words, TRUE if none of",
"the symbols A, B, and C is currently defined.",
"",
"\"if\" is accepted as a synonym for \"ifdef\".",
"",
"\"elif A\" is TRUE if A is defined. Multiple \"elif\" clauses may appear;",
"at most one \"if{{n}def}\", \"elif\", or \"else\" clause in a given block",
"will be processed.",
"",
"\"define\" alone deletes all the current definitions; \"if{def}\" alone is",
"always false; \"ifndef\" alone is always true.",
"",
"The file name in the \"include\" directive may optionally be surrounded",
"by \"\" or <>; in any case, path names are taken to be relative to",
"the location of the file containing the \"include\" directive. If the",
"string \"%y\" appears in the file name, it is replaced by the last two",
"digits of the current year.",
"",
"The \"-w\" flag defines the symbol \"whole_year\", which may be tested",
"in the same manner as any user-defined symbol.",
"",
"",
"Moon file syntax:",
"",
"The user may enter the dates and (optionally) times of quarter",
"moons (from a reliable source such as an almanac or astronomical",
"table) into a file called .moon%y (moon%y.dat on VMS), where %y is",
"the last two digits of the year. If such a file exists (in the",
"same directory as the date file, or in the directory where Pcal",
"itself lives), Pcal will interpolate the phase of the moon from the",
"information in this file instead of using the default algorithm.",
"",
"(Pcal originally used an extremely simplistic moon phase algorithm;",
"the moon file was added to v4.0 to enable Pcal to interpolate the",
"phase of the moon from the [presumably more accurate] information",
"within. More recently, the original moon phase algorithm was",
"superseded by an astronomer-strength version, largely obviating",
"the need for a moon file; however, it will continue to be",
"supported for the foreseeable future.)",
"",
"Entries in the moon file must conform to the following syntax:",
"",
" if -A flag (American date formats) specified:",
" <quarter> <month><sep><day> {<hour><sep><min>}",
"",
" if -E flag (European date formats) specified:",
" <quarter> <day><sep><month> {<hour><sep><min>}",
"",
"where",
"",
" <quarter> := \"nm\", \"fq\" or \"1q\", \"fm\", \"lq\" or \"3q\" (new",
"\t\tmoon, first quarter, full moon, last quarter)",
" <hour> := number 0-23 (24-hour clock)",
" <min> := number 0-59",
"",
"This file must contain entries for all quarter moons in the year,",
"in chronological order; if any errors are encountered, Pcal will",
"revert to using its default algorithm.",
"",
"As in the date file, comments start with '#' and run through",
"end-of-line. ",
NULL
};
#else
extern char *date_msg[];
#endif
/* format strings for color_msg() - translate as necessary */
#define COLOR_MSG_1 "all days in %s"
#define COLOR_MSG_2 "in %s; others in %s"
/* format string for short usage() message */
#define USAGE_MSG "\"%s -%c\" prints full description of flags, parameters, and file formats\n"
/* format strings for comment in PostScript output file */
#define VERSION_MSG "Generated by %s %s"
#define DATEFILE_MSG " from %s"
#define LINE_SEP ".p" /* text line separator */
/* strings used in error messages */
#define ENV_VAR "environment variable "
#define DATE_FILE "date file "
/* Error and information messages - translate as necessary */
/* program error messages */
#define E_ALLOC_ERR "%s: calloc() failed - out of memory\n"
#define E_FOPEN_ERR "%s: can't open file %s\n"
#define E_ILL_LINE "%s: %s in file %s, line %d\n"
#define E_ILL_MONTH "%s: month %d not in range %d .. %d\n"
#define E_ILL_OPT "%s: unrecognized flag %s"
#define E_ILL_OPT2 " (%s\"%s\")"
#define E_ILL_YEAR "%s: year %d not in range %d .. %d\n"
#define E_SYMFULL "%s: symbol table full - can't define %s\n"
#define E_UNT_IFDEF "%s: unterminated if{n}def..{else..}endif in file %s\n"
#define E_FLAG_IGNORED "%s: -%c flag ignored (%s\"%s\")\n"
/* preprocessor error strings */
#define E_ELSE_ERR "unmatched \"else\""
#define E_ELIF_ERR "unmatched \"elif\""
#define E_END_ERR "unmatched \"endif\""
#define E_GARBAGE "extraneous data on \"%s\" line"
#define E_INV_DATE "invalid date"
#define E_NO_MATCH "no match for wildcard"
#define E_INV_LINE "unrecognized line"
#define E_FILE_NESTING "maximum file nesting level exceeded"
#define E_IF_NESTING "maximum \"if{n}def\" nesting level exceeded"
#define E_EXPR_SYNTAX "syntax error in expression"
/* moon file error strings */
#define E_DATE_SEQ "date or phase out of sequence"
#define E_PREM_EOF "premature EOF"
/* information message (VMS, Amiga only) */
#define I_OUT_NAME "%s: output is in file %s\n"
/* predefined macro names */
#define DEF_WHOLE_YEAR "whole_year" /* defined when -w set */
/*
* Yes, some source code in a header file. This is a language-dependent
* routine used by writefil.c to translate the %o (ordinal suffix) format
* specifier into the appropriate string for printing, and seemed to belong
* here with the other language dependencies.
*/
#ifdef WRITEFIL /* include only in writefil.c */
#ifdef PROTOS
static char *ordinal_suffix(int num)
#else
static char *ordinal_suffix(num)
int num; /* ordinal number - assumed positive */
#endif
{
static char buf[10];
int tens, units;
/* Select suffix according to rules for target language. In English,
* the rules are as follows:
*
* tens digit units digit suffix
* (any) 0, 4..9 "th"
* 1 (any) "th"
* != 1 1 "st"
* != 1 2 "nd"
* != 1 3 "rd"
*/
tens = (num / 10) % 10;
units = num % 10;
strcpy(buf, ord_suffix[(units > 3 || tens == 1) ? 0 : units]);
return buf;
}
#endif