Compare commits

..

12 Commits

Author SHA1 Message Date
Dianne Skoll a933c8bc69 Document that we don't read subdirectories when expanding *.rem.
Remind unit tests / tests (push) Successful in 31s
2024-12-06 20:21:09 -05:00
Dianne Skoll 087fbfd8e6 If a path returned by glob is a directory, ignore it. 2024-12-06 20:18:45 -05:00
Dianne Skoll ff641d7990 Refuse to open directories. 2024-12-06 20:09:30 -05:00
Dianne Skoll 54e788b765 Make the sun functions return E_SWERR if BASE != 1990.
Remind unit tests / tests (push) Successful in 44s
2024-12-04 13:12:40 -05:00
Dianne Skoll 4283feff31 Change #error to #warning so cppcheck can analyze funcs.c 2024-12-04 13:10:03 -05:00
Dianne Skoll 062a84b758 Simplify HAS_DATE and HAS_TIME macros by making type values into bitmasks.
Remind unit tests / tests (push) Successful in 34s
2024-12-02 09:50:33 -05:00
Dianne Skoll d161a8ff1a Actually allow up to 9 levels of INCLUDE nesting.
Remind unit tests / tests (push) Successful in 42s
2024-11-30 23:03:09 -05:00
Dianne Skoll 0df4a79531 Use memcpy to copy omit contexts. 2024-11-30 22:42:40 -05:00
Dianne Skoll 1b26e39e2f Update holidays as per recent commits to the Python library.
Remind unit tests / tests (push) Successful in 25s
2024-11-24 21:44:30 -05:00
Dianne Skoll c63c4cf07e Make token name const. 2024-11-19 22:59:47 -05:00
Dianne Skoll 586b3565f0 Sort token types. 2024-11-19 22:58:19 -05:00
Dianne Skoll 877aaed1a1 Fix spelling error in comment. 2024-11-18 11:20:13 -05:00
28 changed files with 1633 additions and 1575 deletions
+1
View File
@@ -19,3 +19,4 @@ OMIT 24 September MSG ទិវាប្រកាសរដ្ឋធម្មន
OMIT 15 October MSG ទិវាប្រារព្ឋពិធីគោរពព្រះវិញ្ញាណក្ខន្ឋ ព្រះករុណា ព្រះបាទសម្តេចព្រះ នរោត្តម សីហនុ ព្រះមហាវីរក្សត្រ ព្រះវររាជបិតាឯករាជ្យ បូរណភាពទឹកដី និងឯកភាពជាតិខ្មែរ ព្រះបរមរតនកោដ្ឋ
OMIT 29 October MSG ព្រះរាជពិធីគ្រងព្រះបរមរាជសម្បត្តិ របស់ ព្រះករុណា ព្រះបាទសម្តេចព្រះបរមនាថ នរោត្តម សីហមុនី ព្រះមហាក្សត្រនៃព្រះរាជាណាចក្រកម្ពុជា
OMIT 9 November MSG ពិធីបុណ្យឯករាជ្យជាតិ
OMIT 29 December MSG ទិវាសន្តិភាពនៅកម្ពុជា
-1
View File
@@ -24,7 +24,6 @@ REM 3 July ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 7, 4)) == 6] MSG Ind
OMIT 4 July MSG Independence Day
REM 5 July ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 7, 4)) == 0] MSG Independence Day (observed)
REM First Monday in September ADDOMIT SCANFROM -28 MSG Labor Day
REM Second Monday in October ADDOMIT SCANFROM -28 MSG Columbus Day
REM 10 November ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 11, 11)) == 6] MSG Veterans Day (observed)
OMIT 11 November MSG Veterans Day
REM 12 November ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 11, 11)) == 0] MSG Veterans Day (observed)
+1
View File
@@ -16,4 +16,5 @@ REM 18 April ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 4, 17)) == 0] MSG
REM 15 July ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 7, 16)) == 6] MSG Manu'a Islands Cession Day (observed)
OMIT 16 July MSG Manu'a Islands Cession Day
REM 17 July ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 7, 16)) == 0] MSG Manu'a Islands Cession Day (observed)
REM Second Monday in October ADDOMIT SCANFROM -28 MSG Columbus Day
REM Second Sunday in October ADDOMIT SCANFROM -28 MSG White Sunday
+1
View File
@@ -11,3 +11,4 @@
# also include [$SysInclude]/holidays/us.rem
REM Third Monday in January ADDOMIT SCANFROM -28 MSG Dr. Martin Luther King Jr. / Civil Rights Day
REM Second Monday in October ADDOMIT SCANFROM -28 MSG Columbus Day
+1
View File
@@ -14,3 +14,4 @@ REM 11 February ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 2, 12)) == 6] M
OMIT 12 February MSG Lincoln's Birthday
REM 13 February ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 2, 12)) == 0] MSG Lincoln's Birthday (observed)
OMIT [easterdate($Uy)-2] MSG Good Friday
REM Second Monday in October ADDOMIT SCANFROM -28 MSG Columbus Day
+1
View File
@@ -11,6 +11,7 @@
# also include [$SysInclude]/holidays/us.rem
REM Fourth Monday in April ADDOMIT SCANFROM -28 MSG State Holiday
REM Second Monday in October ADDOMIT SCANFROM -28 MSG Columbus Day
REM Friday 23 November ADDOMIT SCANFROM -28 MSG State Holiday
REM 23 December ADDOMIT SCANFROM -28 SATISFY [$TW == 4 || $Tw == 5] MSG Washington's Birthday
REM 24 December ADDOMIT SCANFROM -28 SATISFY [$Tw == 1 || $Tw == 2 || $Tw == 4] MSG Washington's Birthday
+1
View File
@@ -11,3 +11,4 @@
# also include [$SysInclude]/holidays/us.rem
REM Third Monday in January ADDOMIT SCANFROM -28 MSG Martin Luther King Jr. / Idaho Human Rights Day
REM Second Monday in October ADDOMIT SCANFROM -28 MSG Columbus Day
+1
View File
@@ -14,3 +14,4 @@ REM 11 February ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 2, 12)) == 6] M
OMIT 12 February MSG Lincoln's Birthday
REM 13 February ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 2, 12)) == 0] MSG Lincoln's Birthday (observed)
REM First Monday in March ADDOMIT SCANFROM -28 MSG Casimir Pulaski Day
REM Second Monday in October ADDOMIT SCANFROM -28 MSG Columbus Day
+1
View File
@@ -12,6 +12,7 @@
OMIT [easterdate($Uy)-2] MSG Good Friday
REM Tuesday 2 May ADDOMIT SCANFROM -28 MSG Primary Election Day
REM Second Monday in October ADDOMIT SCANFROM -28 MSG Columbus Day
REM Friday 23 November ADDOMIT SCANFROM -28 MSG Lincoln's Birthday
REM 23 December ADDOMIT SCANFROM -28 SATISFY [$TW == 4 || $Tw == 5] MSG Washington's Birthday
REM 24 December ADDOMIT SCANFROM -28 SATISFY [$Tw == 1 || $Tw == 2 || $Tw == 4] MSG Washington's Birthday
+1
View File
@@ -14,3 +14,4 @@ OMIT 17 March MSG Evacuation Day
REM 18 March ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 3, 17)) == 0] MSG Evacuation Day (observed)
REM 19 March ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 3, 17)) == 6] MSG Evacuation Day (observed)
REM Third Monday in April ADDOMIT SCANFROM -28 MSG Patriots' Day
REM Second Monday in October ADDOMIT SCANFROM -28 MSG Columbus Day
+1
View File
@@ -10,4 +10,5 @@
# If you want the national holidays as well, you must
# also include [$SysInclude]/holidays/us.rem
REM Second Monday in October ADDOMIT SCANFROM -28 MSG Columbus Day
REM Friday 23 November ADDOMIT SCANFROM -28 MSG American Indian Heritage Day
+1
View File
@@ -13,3 +13,4 @@
REM 7 May ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 8)) == 6] MSG Truman Day (observed)
OMIT 8 May MSG Truman Day
REM 9 May ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 8)) == 0] MSG Truman Day (observed)
REM Second Monday in October ADDOMIT SCANFROM -28 MSG Columbus Day
+13
View File
@@ -0,0 +1,13 @@
# SPDX-License-Identifier: MIT
# Holiday file for subdivision MT in United States
# Derived from the Python holidays project at
# https://github.com/vacanza/holidays
#
# Note that this file includes only the holidays for
# the specific subdivision MT.
# See important caveats in the file ../README
#
# If you want the national holidays as well, you must
# also include [$SysInclude]/holidays/us.rem
REM Second Monday in October ADDOMIT SCANFROM -28 MSG Columbus Day
+1
View File
@@ -14,3 +14,4 @@ REM 11 February ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 2, 12)) == 6] M
OMIT 12 February MSG Lincoln's Birthday
REM 13 February ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 2, 12)) == 0] MSG Lincoln's Birthday (observed)
OMIT [easterdate($Uy)-2] MSG Good Friday
REM Second Monday in October ADDOMIT SCANFROM -28 MSG Columbus Day
+1
View File
@@ -14,3 +14,4 @@ REM 11 February ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 2, 12)) == 6] M
OMIT 12 February MSG Lincoln's Birthday
REM 13 February ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 2, 12)) == 0] MSG Lincoln's Birthday (observed)
OMIT 15 February MSG Susan B. Anthony Day
REM Second Monday in October ADDOMIT SCANFROM -28 MSG Columbus Day
+13
View File
@@ -0,0 +1,13 @@
# SPDX-License-Identifier: MIT
# Holiday file for subdivision OH in United States
# Derived from the Python holidays project at
# https://github.com/vacanza/holidays
#
# Note that this file includes only the holidays for
# the specific subdivision OH.
# See important caveats in the file ../README
#
# If you want the national holidays as well, you must
# also include [$SysInclude]/holidays/us.rem
REM Second Monday in October ADDOMIT SCANFROM -28 MSG Columbus Day
+1
View File
@@ -10,4 +10,5 @@
# If you want the national holidays as well, you must
# also include [$SysInclude]/holidays/us.rem
REM Second Monday in October ADDOMIT SCANFROM -28 MSG Columbus Day
REM Friday 23 November ADDOMIT SCANFROM -28 MSG Day After Thanksgiving
+1
View File
@@ -13,3 +13,4 @@
REM 23 July ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 7, 24)) == 6] MSG Pioneer Day (observed)
OMIT 24 July MSG Pioneer Day
REM 25 July ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 7, 24)) == 0] MSG Pioneer Day (observed)
REM Second Monday in October ADDOMIT SCANFROM -28 MSG Columbus Day
+1
View File
@@ -13,4 +13,5 @@
REM 19 June ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 6, 20)) == 6] MSG West Virginia Day (observed)
OMIT 20 June MSG West Virginia Day
REM 21 June ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 6, 20)) == 0] MSG West Virginia Day (observed)
REM Second Monday in October ADDOMIT SCANFROM -28 MSG Columbus Day
REM Friday 23 November ADDOMIT SCANFROM -28 MSG Day After Thanksgiving
+11 -9
View File
@@ -14,11 +14,12 @@ If \fIfilename\fR is specified as a single dash '-', then \fBRemind\fR
takes its input from standard input.
.PP
If \fIfilename\fR happens to
be a directory rather than a plain file, then \fBRemind\fR reads all of
the files in that directory that match the pattern "*.rem". The files
are read in sorted order; the sort order may depend on your locale, but
should match the sort order used by the shell to expand "*.rem".
If \fIfilename\fR happens to be a directory rather than a plain file,
then \fBRemind\fR reads all of the files (but not any subdirectories!)
in that directory that match the pattern "*.rem". The files are read
in sorted order; the sort order may depend on your locale, but should
match the sort order used by the shell to expand "*.rem".
.PP
\fBRemind\fR reads its files starting from the beginning to the end, or
until it encounters a line whose sole content is "__EOF__" (without the quotes.)
@@ -1925,10 +1926,11 @@ administrator.)
If you specify a filename of "-" in the \fBINCLUDE\fR command, \fBRemind\fR
will begin reading from standard input.
.PP
If you specify a \fIdirectory\fR as the argument to \fBINCLUDE\fR, then
\fBRemind\fR will process all files in that directory that match the shell
pattern "*.rem". The files are processed in sorted order; the sort order
matches that used by the shell when it expands "*.rem".
If you specify a \fIdirectory\fR as the argument to \fBINCLUDE\fR,
then \fBRemind\fR will process all files (but not subdirectories!) in
that directory that match the shell pattern "*.rem". The files are
processed in sorted order; the sort order matches that used by the
shell when it expands "*.rem".
.PP
Note that the file specified by an \fBINCLUDE\fR command is interpreted
relative to the \fIcurrent working directory of the Remind process\fR.
+1 -1
View File
@@ -92,7 +92,7 @@ depend:
# distributions, etc.
cppcheck:
cppcheck -j`nproc` --force --enable=all --suppress=ConfigurationNotChecked --suppress=unmatchedSuppression --suppress=variableScope --inline-suppr .
cppcheck -j`nproc` -v --force --enable=all --suppress=ConfigurationNotChecked --suppress=unmatchedSuppression --suppress=variableScope --inline-suppr .
# Build a tar file based on all files checked into git.
distro:
+20 -4
View File
@@ -726,6 +726,8 @@ static int SetupGlobChain(char const *dirname, IncludeStruct *i)
size_t l;
int r;
glob_t glob_buf;
struct stat sb;
DirectoryFilenameChain *dc = CachedDirectoryChains;
i->chain = NULL;
@@ -808,6 +810,16 @@ static int SetupGlobChain(char const *dirname, IncludeStruct *i)
/* Add the files to the chain backwards to preserve sort order */
for (r=glob_buf.gl_pathc-1; r>=0; r--) {
if (stat(glob_buf.gl_pathv[r], &sb) < 0) {
/* Couldn't stat the file... fuggedaboutit */
continue;
}
/* Don't add directories */
if (S_ISDIR(sb.st_mode)) {
continue;
}
FilenameChain *ch = malloc(sizeof(FilenameChain));
if (!ch) {
globfree(&glob_buf);
@@ -816,8 +828,6 @@ static int SetupGlobChain(char const *dirname, IncludeStruct *i)
return E_NO_MEM;
}
/* TODO: stat the file and only add if it's a plain file and
readable by us */
ch->filename = StrDup(glob_buf.gl_pathv[r]);
if (!ch->filename) {
globfree(&glob_buf);
@@ -858,7 +868,7 @@ static int IncludeCmd(char const *cmd)
got_a_fresh_line();
clear_callstack();
if (IStackPtr+1 >= INCLUDE_NEST) return E_NESTED_INCLUDE;
if (IStackPtr >= INCLUDE_NEST) return E_NESTED_INCLUDE;
i = &IStack[IStackPtr];
/* Use "cmd|" as the filename */
@@ -977,7 +987,7 @@ int IncludeFile(char const *fname)
got_a_fresh_line();
clear_callstack();
if (IStackPtr+1 >= INCLUDE_NEST) return E_NESTED_INCLUDE;
if (IStackPtr >= INCLUDE_NEST) return E_NESTED_INCLUDE;
i = &IStack[IStackPtr];
if (FileName) {
@@ -1149,6 +1159,12 @@ static int CheckSafety(void)
return 0;
}
if (S_ISDIR(statbuf.st_mode)) {
fclose(fp);
fp = NULL;
return 0;
}
if (!CheckSafetyAux(&statbuf)) {
fclose(fp);
fp = NULL;
+7 -3
View File
@@ -210,8 +210,8 @@ static int CacheHebYear, CacheHebMon, CacheHebDay;
/* Macro for getting time part of a time or datetime value */
#define TIMEPART(x) ((x).type == TIME_TYPE ? (x).v.val : ((x).v.val % MINUTES_PER_DAY))
#define HASDATE(x) ((x).type == DATE_TYPE || (x).type == DATETIME_TYPE)
#define HASTIME(x) ((x).type == TIME_TYPE || (x).type == DATETIME_TYPE)
#define HASDATE(x) ((x).type & DATE_TYPE)
#define HASTIME(x) ((x).type & TIME_TYPE)
/* Macro for copying a value while destroying original copy */
#define DCOPYVAL(x, y) ( (x) = (y), (y).type = ERR_TYPE )
@@ -2756,7 +2756,7 @@ static int SunStuff(int rise, double cosz, int dse)
/* Mean anomaly of sun starting from 1 Jan 1990 */
/* NOTE: This assumes that BASE = 1990!!! */
#if BASE != 1990
#error Sun calculations assume a BASE of 1990!
#warning Sun calculations assume a BASE of 1990!
#endif
t = 0.9856002585 * t;
M = t + 357.828757; /* In degrees */
@@ -2839,6 +2839,10 @@ static int FSun(int rise, func_info *info)
double cosz = 0.0;
int r;
/* Sun calculations assume BASE is 1990 */
if (BASE != 1990) {
return E_SWERR;
}
if (rise == 0 || rise == 1) {
/* Sunrise and sunset : cos(90 degrees + 50 arcminutes) */
cosz = -0.01454389765158243;
+10 -18
View File
@@ -116,10 +116,9 @@ int DestroyOmitContexts(int print_unmatched)
/***************************************************************/
int PushOmitContext(ParsePtr p)
{
register int i;
OmitContext *context;
/* Create the saved context */
/* Create the saved context */
context = NEW(OmitContext);
if (!context) return E_NO_MEM;
@@ -152,14 +151,11 @@ int PushOmitContext(ParsePtr p)
return E_NO_MEM;
}
/* Copy the context over */
for (i=0; i<NumFullOmits; i++)
*(context->fullsave + i) = FullOmitArray[i];
/* Copy the context over */
memcpy(context->fullsave, FullOmitArray, NumFullOmits * sizeof(int));
memcpy(context->partsave, PartialOmitArray, NumPartialOmits * sizeof(int));
for (i=0; i<NumPartialOmits; i++)
*(context->partsave + i) = PartialOmitArray[i];
/* Add the context to the stack */
/* Add the context to the stack */
context->next = SavedOmitContexts;
SavedOmitContexts = context;
return VerifyEoln(p);
@@ -175,7 +171,6 @@ int PushOmitContext(ParsePtr p)
int PopOmitContext(ParsePtr p)
{
register int i;
OmitContext *c = SavedOmitContexts;
if (!c) return E_POP_NO_PUSH;
@@ -183,17 +178,14 @@ int PopOmitContext(ParsePtr p)
NumPartialOmits = c->numpart;
WeekdayOmits = c->weekdaysave;
/* Copy the context over */
for (i=0; i<NumFullOmits; i++)
FullOmitArray[i] = *(c->fullsave + i);
/* Copy the context over */
memcpy(FullOmitArray, c->fullsave, NumFullOmits * sizeof(int));
memcpy(PartialOmitArray, c->partsave, NumPartialOmits * sizeof(int));
for (i=0; i<NumPartialOmits; i++)
PartialOmitArray[i] = *(c->partsave + i);
/* Remove the context from the stack */
/* Remove the context from the stack */
SavedOmitContexts = c->next;
/* Free memory used by the saved context */
/* Free memory used by the saved context */
if (c->partsave) free(c->partsave);
if (c->fullsave) free(c->fullsave);
if (c->filename) free(c->filename);
+22 -41
View File
@@ -15,15 +15,18 @@
typedef struct udf_struct UserFunc;
/* Define the types of values */
#define ERR_TYPE 0
#define INT_TYPE 1
#define TIME_TYPE 2
#define DATE_TYPE 3
#define STR_TYPE 4
#define DATETIME_TYPE 5
#define SPECIAL_TYPE 6 /* Only for system variables */
#define CONST_INT_TYPE 7 /* Only for system variables */
/* Define the types of values. We use bitmasks so we can define
DATETIME_TYPE as a combo of DATE_TYPE and TIME_TYPE */
#define ERR_TYPE 0x0
#define INT_TYPE 0x1
#define TIME_TYPE 0x2
#define DATE_TYPE 0x4
/* DATETIME_TYPE has both DATE and TIME bits turned on */
#define DATETIME_TYPE (TIME_TYPE | DATE_TYPE)
#define STR_TYPE 0x8
#define SPECIAL_TYPE 0x10 /* Only for system variables */
#define CONST_INT_TYPE 0x20 /* Only for system variables */
#define BEG_OF_EXPR '['
#define END_OF_EXPR ']'
@@ -206,42 +209,20 @@ typedef Parser *ParsePtr; /* Pointer to parser structure */
/* Enumeration of the tokens */
enum TokTypes
{ T_Illegal,
/* Commands first */
T_Rem, T_Push, T_Pop, T_Preserve, T_Include, T_IncludeR, T_IncludeCmd, T_If, T_Else, T_EndIf,
T_IfTrig, T_ErrMsg,
T_Set, T_UnSet, T_Fset, T_Funset, T_Frename, T_Omit, T_Banner, T_Exit,
T_AddOmit, T_NoQueue,
T_WkDay,
T_Month, T_Time, T_Date, T_DateTime,
T_Skip, T_At, T_RemType, T_Until, T_Year, T_Day, T_Rep, T_Delta,
T_Back, T_BackAdj,
T_Once,
T_Empty,
T_Comment,
T_Number,
T_Clr,
T_Debug,
T_Dumpvars,
T_Scanfrom,
T_Flush,
T_Priority,
T_Sched,
T_Warn,
T_Tag,
T_Duration,
T_LongTime,
T_OmitFunc,
T_Through,
T_MaybeUncomputable,
T_Ordinal,
T_In,
T_LastBack,
T_Expr
T_AddOmit, T_At, T_Back, T_BackAdj, T_Banner, T_Clr, T_Comment,
T_Date, T_DateTime, T_Day, T_Debug, T_Delta, T_Dumpvars, T_Duration,
T_Else, T_Empty, T_EndIf, T_ErrMsg, T_Exit, T_Expr,
T_Flush, T_Frename, T_Fset, T_Funset, T_If, T_IfTrig, T_In,
T_Include, T_IncludeCmd, T_IncludeR, T_LastBack, T_LongTime,
T_MaybeUncomputable, T_Month, T_NoQueue, T_Number, T_Omit, T_OmitFunc,
T_Once, T_Ordinal, T_Pop, T_Preserve, T_Priority, T_Push,T_Rem,
T_RemType, T_Rep, T_Scanfrom, T_Sched, T_Set, T_Skip, T_Tag, T_Through,
T_Time, T_UnSet, T_Until, T_Warn, T_WkDay, T_Year
};
/* The structure of a token */
typedef struct {
char *name;
char const *name;
char MinLen;
enum TokTypes type;
int val;
+1 -1
View File
@@ -27,7 +27,7 @@ if test `id -u` = 0 ; then
exit 1
fi
# We alias "remind" here so that we don't inadvertantly add code that
# We alias "remind" here so that we don't inadvertently add code that
# runs the system-installed verion of Remind rather than
# ../src/remind. This trick was suggested by Jochen Sprickerhof
alias remind="echo You should be using ../src/remind explicitly in test-rem >&2; exit 1"
+1514 -1496
View File
File diff suppressed because one or more lines are too long
+5 -1
View File
@@ -26,8 +26,12 @@ continued so there
# This should work
INCLUDECMD echo INCLUDECMD echo INCLUDECMD echo INCLUDECMD echo INCLUDECMD echo INCLUDECMD echo INCLUDECMD echo MSG Yippee
# This should fail
# This should work
INCLUDECMD echo INCLUDECMD echo INCLUDECMD echo INCLUDECMD echo INCLUDECMD echo INCLUDECMD echo INCLUDECMD echo INCLUDECMD echo MSG Yippee
# This should fail
INCLUDECMD echo INCLUDECMD echo INCLUDECMD echo INCLUDECMD echo INCLUDECMD echo INCLUDECMD echo INCLUDECMD echo INCLUDECMD echo INCLUDECMD echo MSG Yippee
REM MSG Today is [hebday(today())] [hebmon(today())] [hebyear(today())]
fset _h(x, y) trigger(hebdate(x,y))