Compare commits

...

26 Commits

Author SHA1 Message Date
Dianne Skoll
b9dea59206 Update changelog.
All checks were successful
Remind unit tests / tests (push) Successful in 39s
2024-09-02 14:46:58 -04:00
Dianne Skoll
46aa144b65 Bump version to 05.00.05 2024-09-02 10:15:56 -04:00
Dianne Skoll
914971308d Better error message.
All checks were successful
Remind unit tests / tests (push) Successful in 30s
2024-09-01 23:42:29 -04:00
Dianne Skoll
a22e81040f Check error return in a couple of spots. 2024-09-01 23:22:00 -04:00
Dianne Skoll
72f74f03cf Check for errors. 2024-09-01 23:18:09 -04:00
Dianne Skoll
d0e45e727e Don't print closing ] in error indicator.
All checks were successful
Remind unit tests / tests (push) Successful in 31s
2024-09-01 22:39:49 -04:00
Dianne Skoll
ce2b2e80da Remove unnecessary _h() function definition.
All checks were successful
Remind unit tests / tests (push) Successful in 28s
2024-09-01 11:31:28 -04:00
Dianne Skoll
11771b7d3d Better formatting of ^-- here message for expressions with embedded newlines 2024-09-01 11:27:34 -04:00
Dianne Skoll
01cb028532 Fix up tests to pass in September 2024. 2024-09-01 11:09:32 -04:00
Dianne Skoll
58b6f43b9c Better diagnosis of wrong #args for builtin functions. 2024-09-01 09:03:26 -04:00
Dianne Skoll
1dedb667e8 Prevent a couple of file descriptor leaks.
All checks were successful
Remind unit tests / tests (push) Successful in 28s
2024-08-31 09:06:05 -04:00
Dianne Skoll
8a96236788 Avoid warnings if REM_USE_WCHAR is undefined.
All checks were successful
Remind unit tests / tests (push) Successful in 28s
2024-08-30 20:44:08 -04:00
Dianne Skoll
2a13163659 Fix some weird edge cases in text-mode calendar formatting.
All checks were successful
Remind unit tests / tests (push) Successful in 28s
2024-08-29 13:25:36 -04:00
Dianne Skoll
336a9684d4 In calendar mode, SHADE the entire calendar box including day number.
All checks were successful
Remind unit tests / tests (push) Successful in 29s
2024-08-29 08:50:57 -04:00
Dianne Skoll
86945c6e18 Remove incorrect test obsoleted by changes in 05.00.04. 2024-08-29 08:39:55 -04:00
Dianne Skoll
684280db5e Remove "SCHED _sfun" and hard-code "+15" instead. 2024-08-29 08:15:10 -04:00
Dianne Skoll
d801408933 Update WHATSNEW. 2024-08-29 08:01:50 -04:00
Dianne Skoll
79b3da3820 Update man page.
All checks were successful
Remind unit tests / tests (push) Successful in 27s
2024-08-28 20:43:27 -04:00
Dianne Skoll
ed021d3f46 Let IIF's boolean arg be any type... we use truthy(). 2024-08-28 20:41:21 -04:00
Dianne Skoll
27d0fda280 Factor out truthy code from Fiif 2024-08-28 20:38:04 -04:00
Dianne Skoll
ef12da4ec6 Refactor out "truthy". 2024-08-28 20:36:30 -04:00
Dianne Skoll
7b098e95ad Make error messages more consistent. 2024-08-28 18:21:35 -04:00
Dianne Skoll
7d13f4b09e Better diagnostics when printing "Too many/few arguments" errors 2024-08-28 18:14:43 -04:00
Dianne Skoll
cecdfe6ade Bump version to 05.00.04. 2024-08-28 18:00:50 -04:00
Dianne Skoll
216bbd6378 Fix the logic that recurses into user-defined functions. 2024-08-28 17:56:47 -04:00
Dianne Skoll
30e2e9c633 When looking at SATISFY expressions to make sure they use the trigger date, look recursively into user-defined functions in the expression also. 2024-08-28 17:49:12 -04:00
19 changed files with 629 additions and 395 deletions

18
configure vendored
View File

@@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.71 for remind 05.00.03. # Generated by GNU Autoconf 2.71 for remind 05.00.05.
# #
# #
# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, # Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
@@ -608,8 +608,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='remind' PACKAGE_NAME='remind'
PACKAGE_TARNAME='remind' PACKAGE_TARNAME='remind'
PACKAGE_VERSION='05.00.03' PACKAGE_VERSION='05.00.05'
PACKAGE_STRING='remind 05.00.03' PACKAGE_STRING='remind 05.00.05'
PACKAGE_BUGREPORT='' PACKAGE_BUGREPORT=''
PACKAGE_URL='https://dianne.skoll.ca/projects/remind/' PACKAGE_URL='https://dianne.skoll.ca/projects/remind/'
@@ -1264,7 +1264,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures remind 05.00.03 to adapt to many kinds of systems. \`configure' configures remind 05.00.05 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1326,7 +1326,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of remind 05.00.03:";; short | recursive ) echo "Configuration of remind 05.00.05:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@@ -1414,7 +1414,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
remind configure 05.00.03 remind configure 05.00.05
generated by GNU Autoconf 2.71 generated by GNU Autoconf 2.71
Copyright (C) 2021 Free Software Foundation, Inc. Copyright (C) 2021 Free Software Foundation, Inc.
@@ -1864,7 +1864,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by remind $as_me 05.00.03, which was It was created by remind $as_me 05.00.05, which was
generated by GNU Autoconf 2.71. Invocation command line was generated by GNU Autoconf 2.71. Invocation command line was
$ $0$ac_configure_args_raw $ $0$ac_configure_args_raw
@@ -4703,7 +4703,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by remind $as_me 05.00.03, which was This file was extended by remind $as_me 05.00.05, which was
generated by GNU Autoconf 2.71. Invocation command line was generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@@ -4768,7 +4768,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config='$ac_cs_config_escaped' ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\ ac_cs_version="\\
remind config.status 05.00.03 remind config.status 05.00.05
configured by $0, generated by GNU Autoconf 2.71, configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View File

@@ -1,6 +1,6 @@
dnl Process this file with autoconf to produce a configure script. dnl Process this file with autoconf to produce a configure script.
AC_INIT(remind, 05.00.03, , , https://dianne.skoll.ca/projects/remind/) AC_INIT(remind, 05.00.05, , , https://dianne.skoll.ca/projects/remind/)
AC_CONFIG_SRCDIR([src/queue.c]) AC_CONFIG_SRCDIR([src/queue.c])
cat <<'EOF' cat <<'EOF'

View File

@@ -264,7 +264,7 @@ foreach $yearkey (sort keys %{$events} ) {
if ($start->hour > 0) { if ($start->hour > 0) {
print " AT "; print " AT ";
print $start->strftime("%H:%M"); print $start->strftime("%H:%M");
print " SCHED _sfun MSG %a %2 "; print " +15 MSG %a %2 ";
} else { } else {
print " MSG %a "; print " MSG %a ";
} }

View File

@@ -1,5 +1,46 @@
CHANGES TO REMIND CHANGES TO REMIND
* VERSION 5.0 Patch 5 - 2024-09-02
* CHANGE: remind: When using the "-c" option and with the SHADE special
enabled, shade the entire calendar box including the line containing the
day number.
* IMPROVEMENT: remind: Better error messages when diagnosing certain
errors in expressions.
* IMPROVEMENT: include/holidays/jewish.rem: Remove unnecessary _h()
function definition.
* BUG FIX: remind: In a couple of spots when we parsed a character, we did
not check for an error return. This has been fixed.
* BUG FIX: remind: Fix edge-case bugs in "remind -c" output formatting.
* BUG FIX: make test: Fix a test that was broken for all of September 2024.
* BUG FIX: remind: Fix a couple of potential file-descriptor leaks.
* BUG FIX: contrib/ical2rem.pl: Replace "SCHED _sfun" with "+15" to
hard-code 15-minutes advance warning rather than using an undefined
scheduling function. If this is not what you want, you should edit
ical2rem.pl to suit your taste; it's not officially part of Remind and
is meant more as a starting point for you to customize than a finished
product.
* DOCUMENTATION FIX: Remove obsolete info from Remind man page.
* VERSION 5.0 Patch 4 - 2024-08-29
* IMPROVEMENT: remind: When checking if a SATISFY expression refers to the
trigger date, look recursively at any user-defined functions it calls.
This reduces spurious warnings.
* CHANGE: remind: Allow any type to be used as the test argument for IIF.
* IMPROVEMENT: remind man page: Clarify how various types are treated
in boolean context.
* VERSION 5.0 Patch 3 - 2024-08-28 * VERSION 5.0 Patch 3 - 2024-08-28
* IMPROVEMENT: remind: Preserve newlines ("%_" sequences) in calendar * IMPROVEMENT: remind: Preserve newlines ("%_" sequences) in calendar

View File

@@ -10,7 +10,6 @@ SET InIsrael value("InIsrael", 0)
SET Reform value("Reform", 0) SET Reform value("Reform", 0)
# Convenient function definition to save typing # Convenient function definition to save typing
FSET _h(x, y) HEBDATE(x,y)
FSET _h2(x, y) HEBDATE(x, y, $U-7) FSET _h2(x, y) HEBDATE(x, y, $U-7)
FSET _PastSat(x, y) IIF(WKDAYNUM(_h2(x,y))!=6, _h2(x,y), _h2(x,y)+1) FSET _PastSat(x, y) IIF(WKDAYNUM(_h2(x,y))!=6, _h2(x,y), _h2(x,y)+1)
FSET _BackTwoFri(x, y) IIF(WKDAYNUM(_h2(x,y))!=5, _h2(x,y), _h2(x,y)-2) FSET _BackTwoFri(x, y) IIF(WKDAYNUM(_h2(x,y))!=5, _h2(x,y), _h2(x,y)-2)
@@ -19,28 +18,28 @@ FSET _BackTwoSat(x, y) IIF(WKDAYNUM(_h2(x,y))!=6, _h2(x,y), _h2(x,y)-2)
SET InIsrael VALUE("InIsrael", 0) SET InIsrael VALUE("InIsrael", 0)
SET Reform VALUE("Reform", 0) SET Reform VALUE("Reform", 0)
REM [_h(1, "Tishrey")] ++4 MSG %"Rosh Hashana 1%" is %b. REM [hebdate(1, "Tishrey")] ++4 MSG %"Rosh Hashana 1%" is %b.
# No RH-2 or Tzom Gedalia in Reform # No RH-2 or Tzom Gedalia in Reform
IF !Reform IF !Reform
REM [_h(2, "Tishrey")] ++4 MSG %"Rosh Hashana 2%" is %b. REM [hebdate(2, "Tishrey")] ++4 MSG %"Rosh Hashana 2%" is %b.
REM [_PastSat(3, "Tishrey")] ++4 MSG %"Tzom Gedalia%" is %b. REM [_PastSat(3, "Tishrey")] ++4 MSG %"Tzom Gedalia%" is %b.
ENDIF ENDIF
REM [_h(10, "Tishrey")] ++4 MSG %"Yom Kippur%" is %b. REM [hebdate(10, "Tishrey")] ++4 MSG %"Yom Kippur%" is %b.
REM [_h(15, "Tishrey")] ++4 MSG %"Sukkot 1%" is %b. REM [hebdate(15, "Tishrey")] ++4 MSG %"Sukkot 1%" is %b.
IF !InIsrael IF !InIsrael
REM [_h(16, "Tishrey")] MSG %"Sukkot 2%" REM [hebdate(16, "Tishrey")] MSG %"Sukkot 2%"
ENDIF ENDIF
REM [_h(21, "Tishrey")] ++4 MSG %"Hoshana Rabba%" is %b. REM [hebdate(21, "Tishrey")] ++4 MSG %"Hoshana Rabba%" is %b.
REM [_h(22, "Tishrey")] ++4 MSG %"Shemini Atzeret%" is %b. REM [hebdate(22, "Tishrey")] ++4 MSG %"Shemini Atzeret%" is %b.
IF InIsrael IF InIsrael
REM [_h(22, "Tishrey")] ++4 MSG %"Simchat Torah%" is %b. REM [hebdate(22, "Tishrey")] ++4 MSG %"Simchat Torah%" is %b.
ELSE ELSE
REM [_h(23, "Tishrey")] ++4 MSG %"Simchat Torah%" is %b. REM [hebdate(23, "Tishrey")] ++4 MSG %"Simchat Torah%" is %b.
ENDIF ENDIF
# Because Kislev can change length, we must be more careful about Chanukah # Because Kislev can change length, we must be more careful about Chanukah
@@ -58,11 +57,11 @@ REM [_chan(8)] MSG %"Chanukah 8%"
IF !Reform IF !Reform
# 10 Tevet will never be a Saturday, so whether or not to # 10 Tevet will never be a Saturday, so whether or not to
# move it is moot. (Thanks to Art Werschulz.) # move it is moot. (Thanks to Art Werschulz.)
REM [_h(10, "Tevet")] MSG %"Tzom Tevet%" is %b. REM [hebdate(10, "Tevet")] MSG %"Tzom Tevet%" is %b.
ENDIF ENDIF
REM [_h(15, "Shvat")] ++4 MSG %"Tu B'Shvat%" is %b. REM [hebdate(15, "Shvat")] ++4 MSG %"Tu B'Shvat%" is %b.
REM [_h(14, "Adar A")] ++4 MSG %"Purim Katan%" is %b. REM [hebdate(14, "Adar A")] ++4 MSG %"Purim Katan%" is %b.
# If Purim is on Sunday, then Fast of Esther is 11 Adar. # If Purim is on Sunday, then Fast of Esther is 11 Adar.
IF WKDAYNUM(_h2(13, "Adar")) != 6 IF WKDAYNUM(_h2(13, "Adar")) != 6
@@ -70,33 +69,33 @@ IF WKDAYNUM(_h2(13, "Adar")) != 6
ELSE ELSE
REM [_h2(11, "Adar")] ++4 MSG %"Fast of Esther%" is %b. REM [_h2(11, "Adar")] ++4 MSG %"Fast of Esther%" is %b.
ENDIF ENDIF
REM [_h(14, "Adar")] ++4 MSG %"Purim%" is %b. REM [hebdate(14, "Adar")] ++4 MSG %"Purim%" is %b.
REM [_h(15, "Nisan")] ++4 MSG %"Pesach%" is %b. REM [hebdate(15, "Nisan")] ++4 MSG %"Pesach%" is %b.
IF !InIsrael IF !InIsrael
REM [_h(16, "Nisan")] MSG %"Pesach 2%" REM [hebdate(16, "Nisan")] MSG %"Pesach 2%"
ENDIF ENDIF
REM [_h(21, "Nisan")] MSG %"Pesach 7%" REM [hebdate(21, "Nisan")] MSG %"Pesach 7%"
IF !InIsrael && !Reform IF !InIsrael && !Reform
REM [_h(22, "Nisan")] MSG %"Pesach 8%" REM [hebdate(22, "Nisan")] MSG %"Pesach 8%"
ENDIF ENDIF
REM [_h(27, "Nisan")] ++4 MSG %"Yom HaShoah%" is %b. REM [hebdate(27, "Nisan")] ++4 MSG %"Yom HaShoah%" is %b.
REM [_BackTwoFri(4, "Iyar")] ++4 MSG %"Yom HaZikaron%" is %b. REM [_BackTwoFri(4, "Iyar")] ++4 MSG %"Yom HaZikaron%" is %b.
REM [_BackTwoSat(5, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b. REM [_BackTwoSat(5, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
# Not sure about Reform's position on Lag B'Omer # Not sure about Reform's position on Lag B'Omer
IF !Reform IF !Reform
REM [_h(18, "Iyar")] ++4 MSG %"Lag B'Omer%" is %b. REM [hebdate(18, "Iyar")] ++4 MSG %"Lag B'Omer%" is %b.
ENDIF ENDIF
REM [_h(28, "Iyar")] ++4 MSG %"Yom Yerushalayim%" is %b. REM [hebdate(28, "Iyar")] ++4 MSG %"Yom Yerushalayim%" is %b.
REM [_h(6, "Sivan")] ++4 MSG %"Shavuot%" is %b. REM [hebdate(6, "Sivan")] ++4 MSG %"Shavuot%" is %b.
IF !InIsrael && !Reform IF !InIsrael && !Reform
REM [_h(7, "Sivan")] MSG %"Shavuot 2%" REM [hebdate(7, "Sivan")] MSG %"Shavuot 2%"
ENDIF ENDIF
# Fairly sure Reform Jews don't observe the next two # Fairly sure Reform Jews don't observe the next two

View File

@@ -2215,11 +2215,11 @@ and time separator characters for \fBDATE\fR and \fBTIME\fR constants apply
also to \fBDATETIME\fR constants. also to \fBDATETIME\fR constants.
.RE .RE
.PP .PP
.B ZERO VALUES .B ZERO VALUES AND TRUE/FALSE
.PP .PP
All types have an associated \fIzero value\fR, which is All types have an associated \fIzero value\fR, which is treated as
treated as \fIfalse\fR by the IF command and the logical operators. The \fIfalse\fR by the IF command, the IIF function, and the logical
zero values are: operators. The zero values are:
.PP .PP
.RS .RS
.PP .PP
@@ -3317,14 +3317,14 @@ out. The stripping algorithm is fairly naive; the function starts
stripping characters when it encounters a "<" and it stops stripping stripping characters when it encounters a "<" and it stops stripping
when it encounters a ">". when it encounters a ">".
.TP .TP
.B iif(si_test1, x_arg1, [si_test2, x_arg2,...], x_default) .B iif(x_test1, x_arg1, [x_test2, x_arg2,...], x_default)
If \fItest1\fR is not zero or the null string, returns \fIarg1\fR. If \fItest1\fR is true, returns \fIarg1\fR. Otherwise, if \fItest2\fR
Otherwise, if \fItest2\fR is not zero or the null string, returns is true, returns \fIarg2\fR, and so on. If all of the \fItest\fR
\fIarg2\fR, and so on. If all of the \fItest\fR arguments are false, arguments are false, returns \fIdefault\fR. Note that all arguments
returns \fIdefault\fR. Note that all arguments are \fIalways\fR evaluated. are \fIalways\fR evaluated. This function accepts an odd number of
This function accepts an odd number of arguments - note that prior to version arguments - note that prior to version 03.00.05 of \fBRemind\fR, it
03.00.05 of \fBRemind\fR, it accepted 3 arguments only. The 3-argument accepted 3 arguments only. The 3-argument version of \fBiif()\fR is
version of \fBiif()\fR is compatible with previous versions of \fBRemind\fR. compatible with previous versions of \fBRemind\fR.
.TP .TP
.B index(s_search, s_target [,i_start) .B index(s_search, s_target [,i_start)
Returns an \fBINT\fR that is the location of \fItarget\fR in the Returns an \fBINT\fR that is the location of \fItarget\fR in the
@@ -4706,10 +4706,7 @@ This is really useful only if \fIexpr\fR involves a call to the
\fIexpr\fR will not change as \fBRemind\fR iterates. In fact, if \fIexpr\fR will not change as \fBRemind\fR iterates. In fact, if
\fIexpr\fR is not a constant and does not call \fBtrigdate()\fR or \fIexpr\fR is not a constant and does not call \fBtrigdate()\fR or
related functions or system variables, then \fBRemind\fR will issue a related functions or system variables, then \fBRemind\fR will issue a
warning. If you have a user-defined function that calls warning.
\fBtrigdate()\fR, this can result in an unwanted warning. In that
case, pass \fBtrigdate()\fR or some related function or system
variable into your user-defined function from the SATISFY expression.
.PP .PP
An example of the usefulness of \fBSATISFY\fR: Suppose you wish to An example of the usefulness of \fBSATISFY\fR: Suppose you wish to
be warned of every Friday the 13th. Your first attempt may be: be warned of every Friday the 13th. Your first attempt may be:

View File

@@ -338,6 +338,7 @@ UnBackgroundize(int d)
printf("%s", Decolorize()); printf("%s", Decolorize());
} }
#ifdef REM_USE_WCHAR
static void static void
send_lrm(void) send_lrm(void)
{ {
@@ -352,6 +353,7 @@ send_lrm(void)
printf("\xE2\x80\x8E"); printf("\xE2\x80\x8E");
} }
} }
#endif
static char const * static char const *
despace(char const *s) despace(char const *s)
@@ -526,9 +528,9 @@ get_month_abbrev(char const *mon)
#endif #endif
} }
#ifdef REM_USE_WCHAR
static int make_wchar_versions(CalEntry *e) static int make_wchar_versions(CalEntry *e)
{ {
#ifdef REM_USE_WCHAR
size_t len; size_t len;
wchar_t *buf; wchar_t *buf;
len = mbstowcs(NULL, e->text, 0); len = mbstowcs(NULL, e->text, 0);
@@ -542,10 +544,8 @@ static int make_wchar_versions(CalEntry *e)
e->wc_text = buf; e->wc_text = buf;
e->wc_pos = buf; e->wc_pos = buf;
return 1; return 1;
#else
return 1;
#endif
} }
#endif
static void gon(void) static void gon(void)
{ {
@@ -900,13 +900,17 @@ static void DoCalendarOneWeek(int nleft)
if (UseVTColors) { if (UseVTColors) {
printf("\x1B[1m"); /* Bold */ printf("\x1B[1m"); /* Bold */
} }
Backgroundize(d);
PrintLeft(buf, ColSpaces-1, '*'); PrintLeft(buf, ColSpaces-1, '*');
putchar(' ');
UnBackgroundize(d);
if (UseVTColors) { if (UseVTColors) {
printf("\x1B[0m"); /* Normal */ printf("\x1B[0m"); /* Normal */
} }
putchar(' ');
} else { } else {
Backgroundize(d);
PrintLeft(buf, ColSpaces, ' '); PrintLeft(buf, ColSpaces, ' ');
UnBackgroundize(d);
} }
gon(); gon();
DRAW(tb); DRAW(tb);
@@ -1122,13 +1126,17 @@ static int WriteCalendarRow(void)
if (UseVTColors) { if (UseVTColors) {
printf("\x1B[1m"); /* Bold */ printf("\x1B[1m"); /* Bold */
} }
Backgroundize(d+i-wd);
PrintLeft(buf, ColSpaces-1, '*'); PrintLeft(buf, ColSpaces-1, '*');
putchar(' ');
if (UseVTColors) { if (UseVTColors) {
printf("\x1B[0m"); /* Normal */ printf("\x1B[0m"); /* Normal */
} }
putchar(' '); UnBackgroundize(d+i-wd);
} else { } else {
Backgroundize(d+i-wd);
PrintLeft(buf, ColSpaces, ' '); PrintLeft(buf, ColSpaces, ' ');
UnBackgroundize(d+i-wd);
} }
} }
gon(); gon();
@@ -1196,15 +1204,17 @@ static void PrintLeft(char const *s, int width, char pad)
{ {
#ifndef REM_USE_WCHAR #ifndef REM_USE_WCHAR
int len = strlen(s); int len = strlen(s);
printf("%s", s); int i;
while (len++ < width) putchar(pad); for (i=0; i<len && i<width; i++) {
fputc(*(s+i), stdout);
}
while (i++ < width) putchar(pad);
#else #else
size_t len = mbstowcs(NULL, s, 0); size_t len = mbstowcs(NULL, s, 0);
int i; int i;
wchar_t static_buf[128]; wchar_t static_buf[128];
wchar_t *buf; wchar_t *buf;
wchar_t *ws; wchar_t *ws;
int display_len;
if (!len) { if (!len) {
for (i=0; i<width; i++) { for (i=0; i<width; i++) {
@@ -1223,13 +1233,16 @@ static void PrintLeft(char const *s, int width, char pad)
} }
} }
(void) mbstowcs(buf, s, len+1); (void) mbstowcs(buf, s, len+1);
display_len = wcswidth(buf, len+1);
ws = buf; ws = buf;
for (i=0; i<width;) { i=0;
while (i<width) {
if (*ws) { if (*ws) {
if (i + wcwidth(*ws) > width) {
break;
}
i += wcwidth(*ws);
PutWideChar(*ws++, NULL); PutWideChar(*ws++, NULL);
i+= wcwidth(*ws);
} else { } else {
break; break;
} }
@@ -1242,7 +1255,10 @@ static void PrintLeft(char const *s, int width, char pad)
/* Possibly send lrm control sequence */ /* Possibly send lrm control sequence */
send_lrm(); send_lrm();
for (i=display_len; i<width; i++) fputc(pad, stdout); while (i<width) {
fputc(pad, stdout);
i++;
}
if (buf != static_buf) free(buf); if (buf != static_buf) free(buf);
#endif #endif
@@ -1263,7 +1279,7 @@ static void PrintCentered(char const *s, int width, char *pad)
int i; int i;
for (i=0; i<d; i++) fputs(pad, stdout); for (i=0; i<d; i++) fputs(pad, stdout);
for (i=0; i<width; i++) { for (i=0; i<width-d; i++) {
if (*s) { if (*s) {
if (isspace(*s)) { if (isspace(*s)) {
putchar(' '); putchar(' ');
@@ -1307,13 +1323,14 @@ static void PrintCentered(char const *s, int width, char *pad)
if (d < 0) d = 0; if (d < 0) d = 0;
ws = buf; ws = buf;
for (i=0; i<d; i++) fputs(pad, stdout); for (i=0; i<d; i++) fputs(pad, stdout);
for (i=0; i<width; i++) { i=0;
while (i+d < width) {
if (*ws) { if (*ws) {
PutWideChar(*ws++, NULL); if (i+d + wcwidth(*ws) > width) {
if (wcwidth(*ws) == 0) { break;
/* Don't count this character... it's zero-width */
i--;
} }
i += wcwidth(*ws);
PutWideChar(*ws++, NULL);
} else { } else {
break; break;
} }
@@ -1325,7 +1342,10 @@ static void PrintCentered(char const *s, int width, char *pad)
/* Possibly send lrm control sequence */ /* Possibly send lrm control sequence */
send_lrm(); send_lrm();
for (i=d+display_len; i<width; i++) fputs(pad, stdout); while (i+d<width) {
fputs(pad, stdout);
i++;
}
if (buf != static_buf) free(buf); if (buf != static_buf) free(buf);
#endif #endif
} }
@@ -2143,7 +2163,9 @@ static int DoCalRem(ParsePtr p, int col)
FreeTrig(&trig); FreeTrig(&trig);
return E_NO_MEM; return E_NO_MEM;
} }
#ifdef REM_USE_WCHAR
make_wchar_versions(e); make_wchar_versions(e);
#endif
DBufInit(&(e->tags)); DBufInit(&(e->tags));
DBufPuts(&(e->tags), DBufValue(&(trig.tags))); DBufPuts(&(e->tags), DBufValue(&(trig.tags)));
if (SynthesizeTags) { if (SynthesizeTags) {

View File

@@ -81,49 +81,74 @@ check_trigger_function(char const *fname, char const *type)
Wprint("%s function `%s' defined at %s:%d does not use its argument", type, fname, f->filename, f->lineno); Wprint("%s function `%s' defined at %s:%d does not use its argument", type, fname, f->filename, f->lineno);
} }
static int static void
ensure_satnode_mentions_trigdate_aux(expr_node *node) ensure_satnode_mentions_trigdate_aux(expr_node *node, int *mentioned)
{ {
char const *name; char const *name;
expr_node *other; expr_node *other;
UserFunc *f;
if (!node) { if (!node) {
return 0; return;
} }
if (*mentioned) {
return;
}
if (node->type == N_BUILTIN_FUNC) { if (node->type == N_BUILTIN_FUNC) {
name = node->u.builtin_func->name; name = node->u.builtin_func->name;
if (!strcmp(name, "trigdate") || if (!strcmp(name, "trigdate") ||
!strcmp(name, "trigdatetime")) { !strcmp(name, "trigdatetime")) {
return 1; *mentioned = 1;
return;
} }
} else if (node->type == N_SHORT_SYSVAR || node->type == N_SYSVAR) { } else if (node->type == N_SHORT_SYSVAR || node->type == N_SYSVAR) {
if (node->type == N_SHORT_SYSVAR) { if (node->type == N_SHORT_SYSVAR) {
name = node->u.name; name = node->u.name;
} else { } else {
name = node->u.value.v.str; name = node->u.value.v.str;
} if (!StrCmpi(name, "T") || }
if (!StrCmpi(name, "T") ||
!StrCmpi(name, "Td") || !StrCmpi(name, "Td") ||
!StrCmpi(name, "Tm") || !StrCmpi(name, "Tm") ||
!StrCmpi(name, "Tw") || !StrCmpi(name, "Tw") ||
!StrCmpi(name, "Ty")) { !StrCmpi(name, "Ty")) {
return 1; *mentioned = 1;
return;
}
} else if (node->type == N_SHORT_USER_FUNC || node->type == N_USER_FUNC) {
if (node->type == N_SHORT_USER_FUNC) {
name = node->u.name;
} else {
name = node->u.value.v.str;
}
f = FindUserFunc(name);
if (f && !f->recurse_flag) {
f->recurse_flag = 1;
ensure_satnode_mentions_trigdate_aux(f->node, mentioned);
f->recurse_flag = 0;
if (*mentioned) {
return;
}
} }
} }
if (ensure_satnode_mentions_trigdate_aux(node->child)) { ensure_satnode_mentions_trigdate_aux(node->child, mentioned);
return 1; if (*mentioned) {
return;
} }
other = node->sibling; other = node->sibling;
while (other) { while (other) {
if (ensure_satnode_mentions_trigdate_aux(other)) { ensure_satnode_mentions_trigdate_aux(other, mentioned);
return 1; if (*mentioned) {
return;
} }
other = other->sibling; other = other->sibling;
} }
return 0;
} }
static void ensure_satnode_mentions_trigdate(expr_node *node) static void ensure_satnode_mentions_trigdate(expr_node *node)
{ {
int mentioned; int mentioned = 0;
char const *str; char const *str;
if (node->type == N_CONSTANT || node->type == N_SHORT_STR) { if (node->type == N_CONSTANT || node->type == N_SHORT_STR) {
if (node->type == N_CONSTANT) { if (node->type == N_CONSTANT) {
@@ -146,7 +171,7 @@ static void ensure_satnode_mentions_trigdate(expr_node *node)
return; return;
} }
mentioned = ensure_satnode_mentions_trigdate_aux(node); ensure_satnode_mentions_trigdate_aux(node, &mentioned);
if (!mentioned) { if (!mentioned) {
Wprint("SATISFY: expression has no reference to trigdate() or $T..."); Wprint("SATISFY: expression has no reference to trigdate() or $T...");
} }

View File

@@ -204,7 +204,7 @@ EXTERN char *ErrMsg[]
/* E_ERR_READING */ "Error reading", /* E_ERR_READING */ "Error reading",
/* E_EXPECTING_EOL */ "Expecting end-of-line", /* E_EXPECTING_EOL */ "Expecting end-of-line",
/* E_BAD_HEBDATE */ "Invalid Hebrew date", /* E_BAD_HEBDATE */ "Invalid Hebrew date",
/* E_IIF_ODD */ "IIF needs odd number of arguments", /* E_IIF_ODD */ "iif(): odd number of arguments required",
/* E_MISS_ENDIF */ "Warning: Missing ENDIF", /* E_MISS_ENDIF */ "Warning: Missing ENDIF",
/* E_EXPECT_COMMA */ "Expecting comma", /* E_EXPECT_COMMA */ "Expecting comma",
/* E_WD_TWICE */ "Weekday specified twice", /* E_WD_TWICE */ "Weekday specified twice",

View File

@@ -425,8 +425,14 @@ eval_builtin(expr_node *node, Value *locals, Value *ans, int *nonconst)
Value stack_args[STACK_ARGS_MAX]; Value stack_args[STACK_ARGS_MAX];
/* Check that we have the right number of argumens */ /* Check that we have the right number of argumens */
if (node->num_kids < f->minargs) return E_2FEW_ARGS; if (node->num_kids < f->minargs) {
if (node->num_kids > f->maxargs && f->maxargs != NO_MAX) return E_2MANY_ARGS; Eprint("%s(): %s", f->name, ErrMsg[E_2FEW_ARGS]);
return E_2FEW_ARGS;
}
if (node->num_kids > f->maxargs && f->maxargs != NO_MAX) {
Eprint("%s(): %s", f->name, ErrMsg[E_2MANY_ARGS]);
return E_2MANY_ARGS;
}
/* If this is a new-style function that knows about expr_nodes, /* If this is a new-style function that knows about expr_nodes,
let it evaluate itself */ let it evaluate itself */
@@ -622,10 +628,12 @@ eval_userfunc(expr_node *node, Value *locals, Value *ans, int *nonconst)
/* Make sure we have the right number of arguments */ /* Make sure we have the right number of arguments */
if (node->num_kids < f->nargs) { if (node->num_kids < f->nargs) {
DBG(fprintf(ErrFp, "%s(...) => %s\n", fname, ErrMsg[E_2FEW_ARGS])); DBG(fprintf(ErrFp, "%s(...) => %s\n", fname, ErrMsg[E_2FEW_ARGS]));
Eprint("%s(): %s", f->name, ErrMsg[E_2FEW_ARGS]);
return E_2FEW_ARGS; return E_2FEW_ARGS;
} }
if (node->num_kids > f->nargs) { if (node->num_kids > f->nargs) {
DBG(fprintf(ErrFp, "%s(...) => %s\n", fname, ErrMsg[E_2MANY_ARGS])); DBG(fprintf(ErrFp, "%s(...) => %s\n", fname, ErrMsg[E_2MANY_ARGS]));
Eprint("%s(): %s", f->name, ErrMsg[E_2MANY_ARGS]);
return E_2MANY_ARGS; return E_2MANY_ARGS;
} }
@@ -1394,21 +1402,11 @@ static int logical_not(expr_node *node, Value *locals, Value *ans, int *nonconst
{ {
int r; int r;
Value v1; Value v1;
int truthy;
r = evaluate_expr_node(node->child, locals, &v1, nonconst); r = evaluate_expr_node(node->child, locals, &v1, nonconst);
if (r != OK) return r; if (r != OK) return r;
if (v1.type == STR_TYPE) {
if (*(v1.v.str)) {
truthy = 1;
} else {
truthy = 0;
}
} else {
truthy = v1.v.val;
}
ans->type = INT_TYPE; ans->type = INT_TYPE;
ans->v.val = !(truthy); ans->v.val = !truthy(&v1);
DBG(debug_evaluation_unop(ans, OK, &v1, "!")); DBG(debug_evaluation_unop(ans, OK, &v1, "!"));
DestroyValue(v1); DestroyValue(v1);
return OK; return OK;
@@ -1452,34 +1450,22 @@ static int logical_binop(expr_node *node, Value *locals, Value *ans, int *noncon
Value v; Value v;
char const *opname = (is_and) ? "&&" : "||"; char const *opname = (is_and) ? "&&" : "||";
int truthy;
/* Evaluate first arg */ /* Evaluate first arg */
int r = evaluate_expr_node(node->child, locals, &v, nonconst); int r = evaluate_expr_node(node->child, locals, &v, nonconst);
/* Bail on error */ /* Bail on error */
if (r != OK) return r; if (r != OK) return r;
if (v.type == STR_TYPE) {
if (*(v.v.str)) {
truthy = 1;
} else {
truthy = 0;
}
} else {
truthy = v.v.val;
}
if (is_and) { if (is_and) {
/* If first arg is false, return it */ /* If first arg is false, return it */
if (!truthy) { if (!truthy(&v)) {
*ans = v; *ans = v;
DBG(debug_evaluation_binop(ans, OK, &v, NULL, opname)); DBG(debug_evaluation_binop(ans, OK, &v, NULL, opname));
return OK; return OK;
} }
} else { } else {
/* If first arg is true, return it */ /* If first arg is true, return it */
if (truthy) { if (truthy(&v)) {
*ans = v; *ans = v;
DBG(debug_evaluation_binop(ans, OK, &v, NULL, opname)); DBG(debug_evaluation_binop(ans, OK, &v, NULL, opname));
return OK; return OK;
@@ -1569,9 +1555,10 @@ static int parse_expr_token_aux(DynamicBuffer *buf, char const **in)
return E_NO_MEM; return E_NO_MEM;
} }
(*in)++; (*in)++;
} } else {
return OK; return E_PARSE_ERR;
}
return OK;
case '!': case '!':
case '>': case '>':
case '<': case '<':
@@ -1792,6 +1779,7 @@ static expr_node * parse_function_call(char const **e, int *r, Var *locals, int
expr_node *node; expr_node *node;
expr_node *arg; expr_node *arg;
char *s; char *s;
char const *ptr;
CHECK_PARSE_LEVEL(); CHECK_PARSE_LEVEL();
node = alloc_expr_node(r); node = alloc_expr_node(r);
@@ -1864,6 +1852,7 @@ static expr_node * parse_function_call(char const **e, int *r, Var *locals, int
} }
} }
if (TOKEN_IS(")")) { if (TOKEN_IS(")")) {
ptr = *e;
*r = GET_TOKEN(); *r = GET_TOKEN();
if (*r != OK) { if (*r != OK) {
return free_expr_tree(node); return free_expr_tree(node);
@@ -1872,8 +1861,14 @@ static expr_node * parse_function_call(char const **e, int *r, Var *locals, int
/* Check args for builtin funcs */ /* Check args for builtin funcs */
if (node->type == N_BUILTIN_FUNC) { if (node->type == N_BUILTIN_FUNC) {
f = node->u.builtin_func; f = node->u.builtin_func;
if (node->num_kids < f->minargs) *r = E_2FEW_ARGS; if (node->num_kids < f->minargs) {
if (node->num_kids > f->maxargs && f->maxargs != NO_MAX) *r = E_2MANY_ARGS; *e = ptr;
*r = E_2FEW_ARGS;
}
if (node->num_kids > f->maxargs && f->maxargs != NO_MAX) {
*e = ptr;
*r = E_2MANY_ARGS;
}
} }
if (*r != OK) { if (*r != OK) {
if (node->type == N_BUILTIN_FUNC) { if (node->type == N_BUILTIN_FUNC) {
@@ -2516,15 +2511,23 @@ expr_node *parse_expression(char const **e, int *r, Var *locals)
} }
} }
if (*r == E_EXPECT_COMMA || if (*r == E_EXPECT_COMMA ||
*r == E_PARSE_ERR ||
*r == E_MISS_RIGHT_PAREN || *r == E_MISS_RIGHT_PAREN ||
*r == E_EXPECTING_EOL || *r == E_EXPECTING_EOL ||
*r == E_2MANY_ARGS ||
*r == E_2FEW_ARGS ||
*r == E_PARSE_ERR || *r == E_PARSE_ERR ||
*r == E_EOLN || *r == E_EOLN ||
*r == E_ILLEGAL_CHAR) { *r == E_ILLEGAL_CHAR) {
orig = o2; orig = o2;
while (*orig) { while (*orig) {
fprintf(ErrFp, "%c", *orig++); if (*orig == '\n') {
fprintf(ErrFp, " ");
orig++;
} else if (*orig == ']' && ! *(orig+1)) {
break;
} else {
fprintf(ErrFp, "%c", *orig++);
}
} }
fprintf(ErrFp, "\n"); fprintf(ErrFp, "\n");
orig = o2; orig = o2;
@@ -3068,3 +3071,17 @@ void print_expr_nodes_stats(void)
fprintf(stderr, " Expression nodes leaked: %d\n", ExprNodesUsed); fprintf(stderr, " Expression nodes leaked: %d\n", ExprNodesUsed);
fprintf(stderr, " Parse level high-water: %d\n", parse_level_high_water); fprintf(stderr, " Parse level high-water: %d\n", parse_level_high_water);
} }
/* Return 1 if a value is "true" for its type, 0 if "false" */
int truthy(Value const *v)
{
if (v->type == STR_TYPE) {
if (v->v.str && *(v->v.str)) {
return 1;
} else {
return 0;
}
}
return (v->v.val != 0);
}

View File

@@ -1284,6 +1284,7 @@ static int FChoose(expr_node *node, Value *locals, Value *ans, int *nonconst)
PUT(ErrMsg[E_BAD_TYPE]); PUT(ErrMsg[E_BAD_TYPE]);
OUT(); OUT();
} }
Eprint("choose(): %s", ErrMsg[E_BAD_TYPE]);
return E_BAD_TYPE; return E_BAD_TYPE;
} }
n = v.v.val; n = v.v.val;
@@ -1974,7 +1975,6 @@ static int FIndex(func_info *info)
/***************************************************************/ /***************************************************************/
static int FIif(expr_node *node, Value *locals, Value *ans, int *nonconst) static int FIif(expr_node *node, Value *locals, Value *ans, int *nonconst)
{ {
int istrue;
int r; int r;
int done; int done;
Value v; Value v;
@@ -2014,26 +2014,8 @@ static int FIif(expr_node *node, Value *locals, Value *ans, int *nonconst)
done = 1; done = 1;
PUT(PrintValue(&v, NULL)); PUT(PrintValue(&v, NULL));
} }
if (v.type != STR_TYPE && v.type != INT_TYPE) {
if (DebugFlag & DB_PRTEXPR) {
cur = cur->sibling;
while(cur) {
PUT(", ?");
cur = cur->sibling;
}
PUT(") => ");
PUT(ErrMsg[E_BAD_TYPE]);
OUT();
}
return E_BAD_TYPE;
}
if (v.type == INT_TYPE) { if (truthy(&v)) {
istrue = v.v.val;
} else {
istrue = *(v.v.str);
}
if (istrue) {
r = evaluate_expr_node(cur->sibling, locals, ans, nonconst); r = evaluate_expr_node(cur->sibling, locals, ans, nonconst);
if (r == OK && (DebugFlag & DB_PRTEXPR)) { if (r == OK && (DebugFlag & DB_PRTEXPR)) {
PUT(", "); PUT(", ");

View File

@@ -1119,6 +1119,8 @@ guess_terminal_background(int *r, int *g, int *b)
if (n != 8) { if (n != 8) {
/* write failed... WTF? Not much we can do */ /* write failed... WTF? Not much we can do */
tty_reset(ttyfd);
close(ttyfd);
return; return;
} }
@@ -1142,6 +1144,7 @@ guess_terminal_background(int *r, int *g, int *b)
return; return;
} }
tty_reset(ttyfd); tty_reset(ttyfd);
close(ttyfd);
buf[n+1] = 0; buf[n+1] = 0;
if (n < 25) { if (n < 25) {
/* Too short */ /* Too short */

View File

@@ -61,6 +61,8 @@ expr_node *parse_expression(char const **e, int *r, Var *locals);
int evaluate_expression(expr_node *node, Value *locals, Value *ans, int *nonconst); int evaluate_expression(expr_node *node, Value *locals, Value *ans, int *nonconst);
int evaluate_expr_node(expr_node *node, Value *locals, Value *ans, int *nonconst); int evaluate_expr_node(expr_node *node, Value *locals, Value *ans, int *nonconst);
int truthy(Value const *v);
void print_expr_tree(expr_node *node, FILE *fp); void print_expr_tree(expr_node *node, FILE *fp);
void unlimit_execution_time(void); void unlimit_execution_time(void);
expr_node *free_expr_tree(expr_node *node); expr_node *free_expr_tree(expr_node *node);

View File

@@ -317,5 +317,6 @@ typedef struct udf_struct {
int nargs; int nargs;
char const *filename; char const *filename;
int lineno; int lineno;
int recurse_flag;
} UserFunc; } UserFunc;

View File

@@ -160,6 +160,7 @@ int DoFset(ParsePtr p)
return E_NO_MEM; return E_NO_MEM;
} }
func->lineno = LineNo; func->lineno = LineNo;
func->recurse_flag = 0;
StrnCpy(func->name, DBufValue(&buf), VAR_NAME_LEN); StrnCpy(func->name, DBufValue(&buf), VAR_NAME_LEN);
DBufFree(&buf); DBufFree(&buf);
if (!Hush) { if (!Hush) {
@@ -206,6 +207,11 @@ int DoFset(ParsePtr p)
local_array[i+1].next = NULL; local_array[i+1].next = NULL;
func->nargs++; func->nargs++;
c = ParseNonSpaceChar(p, &r, 0); c = ParseNonSpaceChar(p, &r, 0);
if (r) {
DBufFree(&buf);
DestroyUserFunc(func);
return r;
}
if (c == ')') break; if (c == ')') break;
else if (c != ',') { else if (c != ',') {
DestroyUserFunc(func); DestroyUserFunc(func);
@@ -216,6 +222,10 @@ int DoFset(ParsePtr p)
/* Allow an optional = sign: FSET f(x) = x*x */ /* Allow an optional = sign: FSET f(x) = x*x */
c = ParseNonSpaceChar(p, &r, 1); c = ParseNonSpaceChar(p, &r, 1);
if (r) {
DestroyUserFunc(func);
return r;
}
if (c == '=') { if (c == '=') {
(void) ParseNonSpaceChar(p, &r, 0); (void) ParseNonSpaceChar(p, &r, 0);
} }
@@ -240,8 +250,9 @@ int DoFset(ParsePtr p)
} }
c = ParseNonSpaceChar(p, &r, 1); c = ParseNonSpaceChar(p, &r, 1);
if (c != 0) { if (c != 0 || r != 0) {
DestroyUserFunc(func); DestroyUserFunc(func);
if (r != 0) return r;
return E_EXPECTING_EOL; return E_EXPECTING_EOL;
} }

View File

@@ -587,7 +587,7 @@ int DoSet (Parser *p)
{ {
Value v; Value v;
int r; int r;
int ch;
DynamicBuffer buf; DynamicBuffer buf;
DynamicBuffer buf2; DynamicBuffer buf2;
DBufInit(&buf); DBufInit(&buf);
@@ -597,8 +597,11 @@ int DoSet (Parser *p)
if (r) return r; if (r) return r;
/* Allow optional equals-sign: SET var = value */ /* Allow optional equals-sign: SET var = value */
if (ParseNonSpaceChar(p, &r, 1) == '=') { ch = ParseNonSpaceChar(p, &r, 1);
if (r) return r;
if (ch == '=') {
ParseNonSpaceChar(p, &r, 0); ParseNonSpaceChar(p, &r, 0);
if (r) return r;
} }
if (p->isnested) { if (p->isnested) {

View File

@@ -584,7 +584,7 @@ tail +2 ../tests/once.timestamp >> ../tests/test.out 2>&1
rm -f ../tests/once.timestamp rm -f ../tests/once.timestamp
# Newlines in calendar output # Newlines in calendar output
(echo 'REM 16 MSG foo%_bar%_baz wookie quux apple %_ %_ %_ blech'; echo "REM 16 MSG ANOTHER") | ../src/remind -c -w80 - 1 sep 2024 >> ../tests/test.out 2>&1 (echo 'REM 16 MSG foo%_bar%_baz wookie quux apple %_ %_ %_ blech'; echo "REM 16 MSG ANOTHER") | ../src/remind -c -w80 - 1 sep 1990 >> ../tests/test.out 2>&1
# Remove references to SysInclude, which is build-specific # Remove references to SysInclude, which is build-specific
grep -F -v '$SysInclude' < ../tests/test.out > ../tests/test.out.1 && mv -f ../tests/test.out.1 ../tests/test.out grep -F -v '$SysInclude' < ../tests/test.out > ../tests/test.out.1 && mv -f ../tests/test.out.1 ../tests/test.out

View File

@@ -1029,7 +1029,7 @@ set a057 value("a05"+"6")
"a05" + "6" => "a056" "a05" + "6" => "a056"
value("a056") => "SDFJHSDF KSJDFH KJSDFH KSJDFH" value("a056") => "SDFJHSDF KSJDFH KJSDFH KSJDFH"
set a058 version() set a058 version()
version() => "05.00.03" version() => "05.00.05"
set a059 wkday(today()) set a059 wkday(today())
today() => 1991-02-16 today() => 1991-02-16
wkday(1991-02-16) => "Saturday" wkday(1991-02-16) => "Saturday"
@@ -2619,7 +2619,7 @@ a086 4
a109 2012-01-01 a109 2012-01-01
a128 2018-02-03@16:45 a128 2018-02-03@16:45
a039 "February" a039 "February"
a058 "05.00.03" a058 "05.00.05"
a077 "1992 92\n" a077 "1992 92\n"
a096 -4 a096 -4
a119 -1 a119 -1
@@ -5212,303 +5212,386 @@ max(5, 16) => 16
6 * 16 => 96 6 * 16 => 96
../tests/test.rem(1032): Trig(satisfied) = Saturday, 16 February, 1991 ../tests/test.rem(1032): Trig(satisfied) = Saturday, 16 February, 1991
FSET references_t(x) $T != x
REM SATISFY references_t($U)
../tests/test.rem(1035): Trig = Saturday, 16 February, 1991
$U => 1991-02-16
Entering UserFN references_t(1991-02-16)
$T => 1991-02-16
x => 1991-02-16
1991-02-16 != 1991-02-16 => 0
Leaving UserFN references_t(1991-02-16) => 0
../tests/test.rem(1035): Trig = Sunday, 17 February, 1991
$U => 1991-02-16
Entering UserFN references_t(1991-02-16)
$T => 1991-02-17
x => 1991-02-16
1991-02-17 != 1991-02-16 => 1
Leaving UserFN references_t(1991-02-16) => 1
../tests/test.rem(1035): Trig(satisfied) = Sunday, 17 February, 1991
FSET recursive_t(x) iif(x==0, recursive_t(1), references_t($U))
REM SATISFY recursive_t(0)
../tests/test.rem(1039): Trig = Saturday, 16 February, 1991
Entering UserFN recursive_t(0)
x => 0
0 == 0 => 1
Entering UserFN recursive_t(1)
x => 1
1 == 0 => 0
$U => 1991-02-16
Entering UserFN references_t(1991-02-16)
$T => 1991-02-16
x => 1991-02-16
1991-02-16 != 1991-02-16 => 0
Leaving UserFN references_t(1991-02-16) => 0
iif(0, ?, 0) => 0
Leaving UserFN recursive_t(1) => 0
iif(1, 0, ?) => 0
Leaving UserFN recursive_t(0) => 0
../tests/test.rem(1039): Trig = Sunday, 17 February, 1991
Entering UserFN recursive_t(0)
x => 0
0 == 0 => 1
Entering UserFN recursive_t(1)
x => 1
1 == 0 => 0
$U => 1991-02-16
Entering UserFN references_t(1991-02-16)
$T => 1991-02-17
x => 1991-02-16
1991-02-17 != 1991-02-16 => 1
Leaving UserFN references_t(1991-02-16) => 1
iif(0, ?, 1) => 1
Leaving UserFN recursive_t(1) => 1
iif(1, 1, ?) => 1
Leaving UserFN recursive_t(0) => 1
../tests/test.rem(1039): Trig(satisfied) = Sunday, 17 February, 1991
REM SATISFY recursive_t(2)
../tests/test.rem(1040): Trig = Saturday, 16 February, 1991
Entering UserFN recursive_t(2)
x => 2
2 == 0 => 0
$U => 1991-02-16
Entering UserFN references_t(1991-02-16)
$T => 1991-02-16
x => 1991-02-16
1991-02-16 != 1991-02-16 => 0
Leaving UserFN references_t(1991-02-16) => 0
iif(0, ?, 0) => 0
Leaving UserFN recursive_t(2) => 0
../tests/test.rem(1040): Trig = Sunday, 17 February, 1991
Entering UserFN recursive_t(2)
x => 2
2 == 0 => 0
$U => 1991-02-16
Entering UserFN references_t(1991-02-16)
$T => 1991-02-17
x => 1991-02-16
1991-02-17 != 1991-02-16 => 1
Leaving UserFN references_t(1991-02-16) => 1
iif(0, ?, 1) => 1
Leaving UserFN recursive_t(2) => 1
../tests/test.rem(1040): Trig(satisfied) = Sunday, 17 February, 1991
# These should be diagnosed # These should be diagnosed
REM SATISFY 0 REM SATISFY 0
../tests/test.rem(1035): SATISFY: constant 0 will never be true ../tests/test.rem(1043): SATISFY: constant 0 will never be true
../tests/test.rem(1035): Trig = Saturday, 16 February, 1991 ../tests/test.rem(1043): Trig = Saturday, 16 February, 1991
../tests/test.rem(1035): Trig = Sunday, 17 February, 1991 ../tests/test.rem(1043): Trig = Sunday, 17 February, 1991
../tests/test.rem(1035): Trig = Monday, 18 February, 1991 ../tests/test.rem(1043): Trig = Monday, 18 February, 1991
../tests/test.rem(1035): Trig = Tuesday, 19 February, 1991 ../tests/test.rem(1043): Trig = Tuesday, 19 February, 1991
../tests/test.rem(1035): Trig = Wednesday, 20 February, 1991 ../tests/test.rem(1043): Trig = Wednesday, 20 February, 1991
../tests/test.rem(1035): Trig = Thursday, 21 February, 1991 ../tests/test.rem(1043): Trig = Thursday, 21 February, 1991
../tests/test.rem(1035): Trig = Friday, 22 February, 1991 ../tests/test.rem(1043): Trig = Friday, 22 February, 1991
../tests/test.rem(1035): Trig = Saturday, 23 February, 1991 ../tests/test.rem(1043): Trig = Saturday, 23 February, 1991
../tests/test.rem(1035): Trig = Sunday, 24 February, 1991 ../tests/test.rem(1043): Trig = Sunday, 24 February, 1991
../tests/test.rem(1035): Trig = Monday, 25 February, 1991 ../tests/test.rem(1043): Trig = Monday, 25 February, 1991
../tests/test.rem(1035): Trig = Tuesday, 26 February, 1991 ../tests/test.rem(1043): Trig = Tuesday, 26 February, 1991
../tests/test.rem(1035): Trig = Wednesday, 27 February, 1991 ../tests/test.rem(1043): Trig = Wednesday, 27 February, 1991
../tests/test.rem(1035): Trig = Thursday, 28 February, 1991 ../tests/test.rem(1043): Trig = Thursday, 28 February, 1991
../tests/test.rem(1035): Trig = Friday, 1 March, 1991 ../tests/test.rem(1043): Trig = Friday, 1 March, 1991
../tests/test.rem(1035): Trig = Saturday, 2 March, 1991 ../tests/test.rem(1043): Trig = Saturday, 2 March, 1991
../tests/test.rem(1035): Trig = Sunday, 3 March, 1991 ../tests/test.rem(1043): Trig = Sunday, 3 March, 1991
../tests/test.rem(1035): Trig = Monday, 4 March, 1991 ../tests/test.rem(1043): Trig = Monday, 4 March, 1991
../tests/test.rem(1035): Trig = Tuesday, 5 March, 1991 ../tests/test.rem(1043): Trig = Tuesday, 5 March, 1991
../tests/test.rem(1035): Trig = Wednesday, 6 March, 1991 ../tests/test.rem(1043): Trig = Wednesday, 6 March, 1991
../tests/test.rem(1035): Trig = Thursday, 7 March, 1991 ../tests/test.rem(1043): Trig = Thursday, 7 March, 1991
../tests/test.rem(1035): Trig = Friday, 8 March, 1991 ../tests/test.rem(1043): Trig = Friday, 8 March, 1991
../tests/test.rem(1035): Trig = Saturday, 9 March, 1991 ../tests/test.rem(1043): Trig = Saturday, 9 March, 1991
../tests/test.rem(1035): Trig = Sunday, 10 March, 1991 ../tests/test.rem(1043): Trig = Sunday, 10 March, 1991
../tests/test.rem(1035): Trig = Monday, 11 March, 1991 ../tests/test.rem(1043): Trig = Monday, 11 March, 1991
../tests/test.rem(1035): Trig = Tuesday, 12 March, 1991 ../tests/test.rem(1043): Trig = Tuesday, 12 March, 1991
../tests/test.rem(1035): Trig = Wednesday, 13 March, 1991 ../tests/test.rem(1043): Trig = Wednesday, 13 March, 1991
../tests/test.rem(1035): Trig = Thursday, 14 March, 1991 ../tests/test.rem(1043): Trig = Thursday, 14 March, 1991
../tests/test.rem(1035): Trig = Friday, 15 March, 1991 ../tests/test.rem(1043): Trig = Friday, 15 March, 1991
../tests/test.rem(1035): Trig = Saturday, 16 March, 1991 ../tests/test.rem(1043): Trig = Saturday, 16 March, 1991
../tests/test.rem(1035): Trig = Sunday, 17 March, 1991 ../tests/test.rem(1043): Trig = Sunday, 17 March, 1991
../tests/test.rem(1035): Trig = Monday, 18 March, 1991 ../tests/test.rem(1043): Trig = Monday, 18 March, 1991
../tests/test.rem(1035): Trig = Tuesday, 19 March, 1991 ../tests/test.rem(1043): Trig = Tuesday, 19 March, 1991
../tests/test.rem(1035): Trig = Wednesday, 20 March, 1991 ../tests/test.rem(1043): Trig = Wednesday, 20 March, 1991
../tests/test.rem(1035): Trig = Thursday, 21 March, 1991 ../tests/test.rem(1043): Trig = Thursday, 21 March, 1991
../tests/test.rem(1035): Trig = Friday, 22 March, 1991 ../tests/test.rem(1043): Trig = Friday, 22 March, 1991
../tests/test.rem(1035): Trig = Saturday, 23 March, 1991 ../tests/test.rem(1043): Trig = Saturday, 23 March, 1991
../tests/test.rem(1035): Trig = Sunday, 24 March, 1991 ../tests/test.rem(1043): Trig = Sunday, 24 March, 1991
../tests/test.rem(1035): Trig = Monday, 25 March, 1991 ../tests/test.rem(1043): Trig = Monday, 25 March, 1991
../tests/test.rem(1035): Trig = Tuesday, 26 March, 1991 ../tests/test.rem(1043): Trig = Tuesday, 26 March, 1991
../tests/test.rem(1035): Trig = Wednesday, 27 March, 1991 ../tests/test.rem(1043): Trig = Wednesday, 27 March, 1991
../tests/test.rem(1035): Trig = Thursday, 28 March, 1991 ../tests/test.rem(1043): Trig = Thursday, 28 March, 1991
../tests/test.rem(1035): Trig = Friday, 29 March, 1991 ../tests/test.rem(1043): Trig = Friday, 29 March, 1991
../tests/test.rem(1035): Trig = Saturday, 30 March, 1991 ../tests/test.rem(1043): Trig = Saturday, 30 March, 1991
../tests/test.rem(1035): Trig = Sunday, 31 March, 1991 ../tests/test.rem(1043): Trig = Sunday, 31 March, 1991
../tests/test.rem(1035): Trig = Monday, 1 April, 1991 ../tests/test.rem(1043): Trig = Monday, 1 April, 1991
../tests/test.rem(1035): Trig = Tuesday, 2 April, 1991 ../tests/test.rem(1043): Trig = Tuesday, 2 April, 1991
../tests/test.rem(1035): Trig = Wednesday, 3 April, 1991 ../tests/test.rem(1043): Trig = Wednesday, 3 April, 1991
../tests/test.rem(1035): Trig = Thursday, 4 April, 1991 ../tests/test.rem(1043): Trig = Thursday, 4 April, 1991
../tests/test.rem(1035): Trig = Friday, 5 April, 1991 ../tests/test.rem(1043): Trig = Friday, 5 April, 1991
../tests/test.rem(1035): Trig = Saturday, 6 April, 1991 ../tests/test.rem(1043): Trig = Saturday, 6 April, 1991
../tests/test.rem(1035): Trig = Sunday, 7 April, 1991 ../tests/test.rem(1043): Trig = Sunday, 7 April, 1991
../tests/test.rem(1035): Trig = Monday, 8 April, 1991 ../tests/test.rem(1043): Trig = Monday, 8 April, 1991
../tests/test.rem(1035): Trig = Tuesday, 9 April, 1991 ../tests/test.rem(1043): Trig = Tuesday, 9 April, 1991
../tests/test.rem(1035): Trig = Wednesday, 10 April, 1991 ../tests/test.rem(1043): Trig = Wednesday, 10 April, 1991
../tests/test.rem(1035): Trig = Thursday, 11 April, 1991 ../tests/test.rem(1043): Trig = Thursday, 11 April, 1991
../tests/test.rem(1035): Trig = Friday, 12 April, 1991 ../tests/test.rem(1043): Trig = Friday, 12 April, 1991
../tests/test.rem(1035): Trig = Saturday, 13 April, 1991 ../tests/test.rem(1043): Trig = Saturday, 13 April, 1991
../tests/test.rem(1035): Trig = Sunday, 14 April, 1991 ../tests/test.rem(1043): Trig = Sunday, 14 April, 1991
../tests/test.rem(1035): Trig = Monday, 15 April, 1991 ../tests/test.rem(1043): Trig = Monday, 15 April, 1991
../tests/test.rem(1035): Trig = Tuesday, 16 April, 1991 ../tests/test.rem(1043): Trig = Tuesday, 16 April, 1991
../tests/test.rem(1035): Trig = Wednesday, 17 April, 1991 ../tests/test.rem(1043): Trig = Wednesday, 17 April, 1991
../tests/test.rem(1035): Trig = Thursday, 18 April, 1991 ../tests/test.rem(1043): Trig = Thursday, 18 April, 1991
../tests/test.rem(1035): Trig = Friday, 19 April, 1991 ../tests/test.rem(1043): Trig = Friday, 19 April, 1991
../tests/test.rem(1035): Trig = Saturday, 20 April, 1991 ../tests/test.rem(1043): Trig = Saturday, 20 April, 1991
../tests/test.rem(1035): Trig = Sunday, 21 April, 1991 ../tests/test.rem(1043): Trig = Sunday, 21 April, 1991
../tests/test.rem(1035): Trig = Monday, 22 April, 1991 ../tests/test.rem(1043): Trig = Monday, 22 April, 1991
../tests/test.rem(1035): Trig = Tuesday, 23 April, 1991 ../tests/test.rem(1043): Trig = Tuesday, 23 April, 1991
../tests/test.rem(1035): Trig = Wednesday, 24 April, 1991 ../tests/test.rem(1043): Trig = Wednesday, 24 April, 1991
../tests/test.rem(1035): Trig = Thursday, 25 April, 1991 ../tests/test.rem(1043): Trig = Thursday, 25 April, 1991
../tests/test.rem(1035): Trig = Friday, 26 April, 1991 ../tests/test.rem(1043): Trig = Friday, 26 April, 1991
../tests/test.rem(1035): Trig = Saturday, 27 April, 1991 ../tests/test.rem(1043): Trig = Saturday, 27 April, 1991
../tests/test.rem(1035): Trig = Sunday, 28 April, 1991 ../tests/test.rem(1043): Trig = Sunday, 28 April, 1991
../tests/test.rem(1035): Trig = Monday, 29 April, 1991 ../tests/test.rem(1043): Trig = Monday, 29 April, 1991
../tests/test.rem(1035): Trig = Tuesday, 30 April, 1991 ../tests/test.rem(1043): Trig = Tuesday, 30 April, 1991
../tests/test.rem(1035): Trig = Wednesday, 1 May, 1991 ../tests/test.rem(1043): Trig = Wednesday, 1 May, 1991
../tests/test.rem(1035): Trig = Thursday, 2 May, 1991 ../tests/test.rem(1043): Trig = Thursday, 2 May, 1991
../tests/test.rem(1035): Trig = Friday, 3 May, 1991 ../tests/test.rem(1043): Trig = Friday, 3 May, 1991
../tests/test.rem(1035): Trig = Saturday, 4 May, 1991 ../tests/test.rem(1043): Trig = Saturday, 4 May, 1991
../tests/test.rem(1035): Trig = Sunday, 5 May, 1991 ../tests/test.rem(1043): Trig = Sunday, 5 May, 1991
../tests/test.rem(1035): Trig = Monday, 6 May, 1991 ../tests/test.rem(1043): Trig = Monday, 6 May, 1991
../tests/test.rem(1035): Trig = Tuesday, 7 May, 1991 ../tests/test.rem(1043): Trig = Tuesday, 7 May, 1991
../tests/test.rem(1035): Trig = Wednesday, 8 May, 1991 ../tests/test.rem(1043): Trig = Wednesday, 8 May, 1991
../tests/test.rem(1035): Trig = Thursday, 9 May, 1991 ../tests/test.rem(1043): Trig = Thursday, 9 May, 1991
../tests/test.rem(1035): Trig = Friday, 10 May, 1991 ../tests/test.rem(1043): Trig = Friday, 10 May, 1991
../tests/test.rem(1035): Trig = Saturday, 11 May, 1991 ../tests/test.rem(1043): Trig = Saturday, 11 May, 1991
../tests/test.rem(1035): Trig = Sunday, 12 May, 1991 ../tests/test.rem(1043): Trig = Sunday, 12 May, 1991
../tests/test.rem(1035): Trig = Monday, 13 May, 1991 ../tests/test.rem(1043): Trig = Monday, 13 May, 1991
../tests/test.rem(1035): Trig = Tuesday, 14 May, 1991 ../tests/test.rem(1043): Trig = Tuesday, 14 May, 1991
../tests/test.rem(1035): Trig = Wednesday, 15 May, 1991 ../tests/test.rem(1043): Trig = Wednesday, 15 May, 1991
../tests/test.rem(1035): Trig = Thursday, 16 May, 1991 ../tests/test.rem(1043): Trig = Thursday, 16 May, 1991
../tests/test.rem(1035): Trig = Friday, 17 May, 1991 ../tests/test.rem(1043): Trig = Friday, 17 May, 1991
../tests/test.rem(1035): Trig = Saturday, 18 May, 1991 ../tests/test.rem(1043): Trig = Saturday, 18 May, 1991
../tests/test.rem(1035): Trig = Sunday, 19 May, 1991 ../tests/test.rem(1043): Trig = Sunday, 19 May, 1991
../tests/test.rem(1035): Trig = Monday, 20 May, 1991 ../tests/test.rem(1043): Trig = Monday, 20 May, 1991
../tests/test.rem(1035): Trig = Tuesday, 21 May, 1991 ../tests/test.rem(1043): Trig = Tuesday, 21 May, 1991
../tests/test.rem(1035): Trig = Wednesday, 22 May, 1991 ../tests/test.rem(1043): Trig = Wednesday, 22 May, 1991
../tests/test.rem(1035): Trig = Thursday, 23 May, 1991 ../tests/test.rem(1043): Trig = Thursday, 23 May, 1991
../tests/test.rem(1035): Trig = Friday, 24 May, 1991 ../tests/test.rem(1043): Trig = Friday, 24 May, 1991
../tests/test.rem(1035): Trig = Saturday, 25 May, 1991 ../tests/test.rem(1043): Trig = Saturday, 25 May, 1991
../tests/test.rem(1035): Trig = Sunday, 26 May, 1991 ../tests/test.rem(1043): Trig = Sunday, 26 May, 1991
../tests/test.rem(1035): Trig = Monday, 27 May, 1991 ../tests/test.rem(1043): Trig = Monday, 27 May, 1991
../tests/test.rem(1035): Trig = Tuesday, 28 May, 1991 ../tests/test.rem(1043): Trig = Tuesday, 28 May, 1991
../tests/test.rem(1035): Trig = Wednesday, 29 May, 1991 ../tests/test.rem(1043): Trig = Wednesday, 29 May, 1991
../tests/test.rem(1035): Trig = Thursday, 30 May, 1991 ../tests/test.rem(1043): Trig = Thursday, 30 May, 1991
../tests/test.rem(1035): Trig = Friday, 31 May, 1991 ../tests/test.rem(1043): Trig = Friday, 31 May, 1991
../tests/test.rem(1035): Trig = Saturday, 1 June, 1991 ../tests/test.rem(1043): Trig = Saturday, 1 June, 1991
../tests/test.rem(1035): Trig = Sunday, 2 June, 1991 ../tests/test.rem(1043): Trig = Sunday, 2 June, 1991
../tests/test.rem(1035): Trig = Monday, 3 June, 1991 ../tests/test.rem(1043): Trig = Monday, 3 June, 1991
../tests/test.rem(1035): Trig = Tuesday, 4 June, 1991 ../tests/test.rem(1043): Trig = Tuesday, 4 June, 1991
../tests/test.rem(1035): Trig = Wednesday, 5 June, 1991 ../tests/test.rem(1043): Trig = Wednesday, 5 June, 1991
../tests/test.rem(1035): Trig = Thursday, 6 June, 1991 ../tests/test.rem(1043): Trig = Thursday, 6 June, 1991
../tests/test.rem(1035): Trig = Friday, 7 June, 1991 ../tests/test.rem(1043): Trig = Friday, 7 June, 1991
../tests/test.rem(1035): Trig = Saturday, 8 June, 1991 ../tests/test.rem(1043): Trig = Saturday, 8 June, 1991
../tests/test.rem(1035): Trig = Sunday, 9 June, 1991 ../tests/test.rem(1043): Trig = Sunday, 9 June, 1991
../tests/test.rem(1035): Trig = Monday, 10 June, 1991 ../tests/test.rem(1043): Trig = Monday, 10 June, 1991
../tests/test.rem(1035): Trig = Tuesday, 11 June, 1991 ../tests/test.rem(1043): Trig = Tuesday, 11 June, 1991
../tests/test.rem(1035): Trig = Wednesday, 12 June, 1991 ../tests/test.rem(1043): Trig = Wednesday, 12 June, 1991
../tests/test.rem(1035): Trig = Thursday, 13 June, 1991 ../tests/test.rem(1043): Trig = Thursday, 13 June, 1991
../tests/test.rem(1035): Trig = Friday, 14 June, 1991 ../tests/test.rem(1043): Trig = Friday, 14 June, 1991
../tests/test.rem(1035): Trig = Saturday, 15 June, 1991 ../tests/test.rem(1043): Trig = Saturday, 15 June, 1991
../tests/test.rem(1035): Trig = Sunday, 16 June, 1991 ../tests/test.rem(1043): Trig = Sunday, 16 June, 1991
../tests/test.rem(1035): Trig = Monday, 17 June, 1991 ../tests/test.rem(1043): Trig = Monday, 17 June, 1991
../tests/test.rem(1035): Trig = Tuesday, 18 June, 1991 ../tests/test.rem(1043): Trig = Tuesday, 18 June, 1991
../tests/test.rem(1035): Trig = Wednesday, 19 June, 1991 ../tests/test.rem(1043): Trig = Wednesday, 19 June, 1991
../tests/test.rem(1035): Trig = Thursday, 20 June, 1991 ../tests/test.rem(1043): Trig = Thursday, 20 June, 1991
../tests/test.rem(1035): Trig = Friday, 21 June, 1991 ../tests/test.rem(1043): Trig = Friday, 21 June, 1991
../tests/test.rem(1035): Trig = Saturday, 22 June, 1991 ../tests/test.rem(1043): Trig = Saturday, 22 June, 1991
../tests/test.rem(1035): Trig = Sunday, 23 June, 1991 ../tests/test.rem(1043): Trig = Sunday, 23 June, 1991
../tests/test.rem(1035): Trig = Monday, 24 June, 1991 ../tests/test.rem(1043): Trig = Monday, 24 June, 1991
../tests/test.rem(1035): Trig = Tuesday, 25 June, 1991 ../tests/test.rem(1043): Trig = Tuesday, 25 June, 1991
../tests/test.rem(1035): Trig = Wednesday, 26 June, 1991 ../tests/test.rem(1043): Trig = Wednesday, 26 June, 1991
../tests/test.rem(1035): Trig = Thursday, 27 June, 1991 ../tests/test.rem(1043): Trig = Thursday, 27 June, 1991
../tests/test.rem(1035): Trig = Friday, 28 June, 1991 ../tests/test.rem(1043): Trig = Friday, 28 June, 1991
../tests/test.rem(1035): Trig = Saturday, 29 June, 1991 ../tests/test.rem(1043): Trig = Saturday, 29 June, 1991
../tests/test.rem(1035): Trig = Sunday, 30 June, 1991 ../tests/test.rem(1043): Trig = Sunday, 30 June, 1991
../tests/test.rem(1035): Trig = Monday, 1 July, 1991 ../tests/test.rem(1043): Trig = Monday, 1 July, 1991
../tests/test.rem(1035): Trig = Tuesday, 2 July, 1991 ../tests/test.rem(1043): Trig = Tuesday, 2 July, 1991
../tests/test.rem(1035): Trig = Wednesday, 3 July, 1991 ../tests/test.rem(1043): Trig = Wednesday, 3 July, 1991
../tests/test.rem(1035): Trig = Thursday, 4 July, 1991 ../tests/test.rem(1043): Trig = Thursday, 4 July, 1991
../tests/test.rem(1035): Trig = Friday, 5 July, 1991 ../tests/test.rem(1043): Trig = Friday, 5 July, 1991
../tests/test.rem(1035): Trig = Saturday, 6 July, 1991 ../tests/test.rem(1043): Trig = Saturday, 6 July, 1991
../tests/test.rem(1035): Trig = Sunday, 7 July, 1991 ../tests/test.rem(1043): Trig = Sunday, 7 July, 1991
../tests/test.rem(1035): Trig = Monday, 8 July, 1991 ../tests/test.rem(1043): Trig = Monday, 8 July, 1991
../tests/test.rem(1035): Trig = Tuesday, 9 July, 1991 ../tests/test.rem(1043): Trig = Tuesday, 9 July, 1991
../tests/test.rem(1035): Trig = Wednesday, 10 July, 1991 ../tests/test.rem(1043): Trig = Wednesday, 10 July, 1991
../tests/test.rem(1035): Trig = Thursday, 11 July, 1991 ../tests/test.rem(1043): Trig = Thursday, 11 July, 1991
../tests/test.rem(1035): Trig = Friday, 12 July, 1991 ../tests/test.rem(1043): Trig = Friday, 12 July, 1991
../tests/test.rem(1035): Trig = Saturday, 13 July, 1991 ../tests/test.rem(1043): Trig = Saturday, 13 July, 1991
../tests/test.rem(1035): Trig = Sunday, 14 July, 1991 ../tests/test.rem(1043): Trig = Sunday, 14 July, 1991
../tests/test.rem(1035): Trig = Monday, 15 July, 1991 ../tests/test.rem(1043): Trig = Monday, 15 July, 1991
../tests/test.rem(1035): Can't compute trigger ../tests/test.rem(1043): Can't compute trigger
REM SATSIFY "" REM SATSIFY ""
../tests/test.rem(1036): Missing REM type; assuming MSG ../tests/test.rem(1044): Missing REM type; assuming MSG
../tests/test.rem(1036): Trig = Saturday, 16 February, 1991 ../tests/test.rem(1044): Trig = Saturday, 16 February, 1991
../tests/test.rem(1036): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1044): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
../tests/test.rem(1036): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1044): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
SATSIFY "" SATSIFY ""
REM SATISFY [version() > "01.00.00"] REM SATISFY [version() > "01.00.00"]
../tests/test.rem(1037): SATISFY: expression has no reference to trigdate() or $T... ../tests/test.rem(1045): SATISFY: expression has no reference to trigdate() or $T...
../tests/test.rem(1037): Trig = Saturday, 16 February, 1991 ../tests/test.rem(1045): Trig = Saturday, 16 February, 1991
version() => "05.00.03" version() => "05.00.05"
"05.00.03" > "01.00.00" => 1 "05.00.05" > "01.00.00" => 1
../tests/test.rem(1037): Trig(satisfied) = Saturday, 16 February, 1991 ../tests/test.rem(1045): Trig(satisfied) = Saturday, 16 February, 1991
REM SATISFY [max(x, max(x, 1, 2, 3), 4, 5, 6) * 5] REM SATISFY [max(x, max(x, 1, 2, 3), 4, 5, 6) * 5]
../tests/test.rem(1038): SATISFY: expression has no reference to trigdate() or $T... ../tests/test.rem(1046): SATISFY: expression has no reference to trigdate() or $T...
../tests/test.rem(1038): Trig = Saturday, 16 February, 1991 ../tests/test.rem(1046): Trig = Saturday, 16 February, 1991
x => 3 x => 3
x => 3 x => 3
max(3, 1, 2, 3) => 3 max(3, 1, 2, 3) => 3
max(3, 3, 4, 5, 6) => 6 max(3, 3, 4, 5, 6) => 6
6 * 5 => 30 6 * 5 => 30
../tests/test.rem(1038): Trig(satisfied) = Saturday, 16 February, 1991 ../tests/test.rem(1046): Trig(satisfied) = Saturday, 16 February, 1991
FSET gg(x) 0 FSET gg(x) 0
REM WARN gg MSG Wookie REM WARN gg MSG Wookie
../tests/test.rem(1041): WARN function `gg' defined at ../tests/test.rem:1040 does not use its argument ../tests/test.rem(1049): WARN function `gg' defined at ../tests/test.rem:1048 does not use its argument
../tests/test.rem(1041): Trig = Saturday, 16 February, 1991 ../tests/test.rem(1049): Trig = Saturday, 16 February, 1991
Entering UserFN gg(1) Entering UserFN gg(1)
Leaving UserFN gg(1) => 0 Leaving UserFN gg(1) => 0
../tests/test.rem(1041): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1049): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
../tests/test.rem(1041): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1049): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
Wookie Wookie
REM AT 11:00 SCHED gg MSG blork REM AT 11:00 SCHED gg MSG blork
../tests/test.rem(1042): SCHED function `gg' defined at ../tests/test.rem:1040 does not use its argument ../tests/test.rem(1050): SCHED function `gg' defined at ../tests/test.rem:1048 does not use its argument
../tests/test.rem(1042): Trig = Saturday, 16 February, 1991 AT 11:00 ../tests/test.rem(1050): Trig = Saturday, 16 February, 1991 AT 11:00
../tests/test.rem(1042): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1050): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
../tests/test.rem(1042): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1050): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
blork blork
REM OMITFUNC gg MSG hehe REM OMITFUNC gg MSG hehe
../tests/test.rem(1043): OMITFUNC function `gg' defined at ../tests/test.rem:1040 does not use its argument ../tests/test.rem(1051): OMITFUNC function `gg' defined at ../tests/test.rem:1048 does not use its argument
../tests/test.rem(1043): Trig = Saturday, 16 February, 1991 ../tests/test.rem(1051): Trig = Saturday, 16 February, 1991
../tests/test.rem(1043): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1051): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
../tests/test.rem(1043): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1051): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
hehe hehe
FSET gg(x,y,z) 0 FSET gg(x,y,z) 0
../tests/test.rem(1045): Function gg redefined (previously defined at ../tests/test.rem:1040) ../tests/test.rem(1053): Function gg redefined (previously defined at ../tests/test.rem:1048)
REM WARN gg MSG Wookie REM WARN gg MSG Wookie
../tests/test.rem(1046): WARN function `gg' defined at ../tests/test.rem:1045 should take 1 argument but actually takes 3 ../tests/test.rem(1054): WARN function `gg' defined at ../tests/test.rem:1053 should take 1 argument but actually takes 3
../tests/test.rem(1046): Trig = Saturday, 16 February, 1991 ../tests/test.rem(1054): Trig = Saturday, 16 February, 1991
../tests/test.rem(1046): Undefined WARN function: `gg' ../tests/test.rem(1054): Undefined WARN function: `gg'
../tests/test.rem(1046): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1054): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
../tests/test.rem(1046): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1054): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
Wookie Wookie
REM AT 11:00 SCHED gg MSG blork REM AT 11:00 SCHED gg MSG blork
../tests/test.rem(1047): SCHED function `gg' defined at ../tests/test.rem:1045 should take 1 argument but actually takes 3 ../tests/test.rem(1055): SCHED function `gg' defined at ../tests/test.rem:1053 should take 1 argument but actually takes 3
../tests/test.rem(1047): Trig = Saturday, 16 February, 1991 AT 11:00 ../tests/test.rem(1055): Trig = Saturday, 16 February, 1991 AT 11:00
../tests/test.rem(1047): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1055): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
../tests/test.rem(1047): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1055): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
blork blork
REM OMITFUNC gg MSG hehe REM OMITFUNC gg MSG hehe
../tests/test.rem(1048): OMITFUNC function `gg' defined at ../tests/test.rem:1045 should take 1 argument but actually takes 3 ../tests/test.rem(1056): OMITFUNC function `gg' defined at ../tests/test.rem:1053 should take 1 argument but actually takes 3
../tests/test.rem(1048): Trig = Saturday, 16 February, 1991 ../tests/test.rem(1056): Trig = Saturday, 16 February, 1991
../tests/test.rem(1048): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1056): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
../tests/test.rem(1048): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1056): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
hehe hehe
FSET gg() 0 FSET gg() 0
../tests/test.rem(1050): Function gg redefined (previously defined at ../tests/test.rem:1045) ../tests/test.rem(1058): Function gg redefined (previously defined at ../tests/test.rem:1053)
REM WARN gg MSG Wookie REM WARN gg MSG Wookie
../tests/test.rem(1051): WARN function `gg' defined at ../tests/test.rem:1050 should take 1 argument but actually takes 0 ../tests/test.rem(1059): WARN function `gg' defined at ../tests/test.rem:1058 should take 1 argument but actually takes 0
../tests/test.rem(1051): Trig = Saturday, 16 February, 1991 ../tests/test.rem(1059): Trig = Saturday, 16 February, 1991
../tests/test.rem(1051): Undefined WARN function: `gg' ../tests/test.rem(1059): Undefined WARN function: `gg'
../tests/test.rem(1051): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1059): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
../tests/test.rem(1051): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1059): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
Wookie Wookie
REM AT 11:00 SCHED gg MSG blork REM AT 11:00 SCHED gg MSG blork
../tests/test.rem(1052): SCHED function `gg' defined at ../tests/test.rem:1050 should take 1 argument but actually takes 0 ../tests/test.rem(1060): SCHED function `gg' defined at ../tests/test.rem:1058 should take 1 argument but actually takes 0
../tests/test.rem(1052): Trig = Saturday, 16 February, 1991 AT 11:00 ../tests/test.rem(1060): Trig = Saturday, 16 February, 1991 AT 11:00
../tests/test.rem(1052): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1060): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
../tests/test.rem(1052): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1060): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
blork blork
REM OMITFUNC gg MSG hehe REM OMITFUNC gg MSG hehe
../tests/test.rem(1053): OMITFUNC function `gg' defined at ../tests/test.rem:1050 should take 1 argument but actually takes 0 ../tests/test.rem(1061): OMITFUNC function `gg' defined at ../tests/test.rem:1058 should take 1 argument but actually takes 0
../tests/test.rem(1053): Trig = Saturday, 16 February, 1991 ../tests/test.rem(1061): Trig = Saturday, 16 February, 1991
../tests/test.rem(1053): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1061): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
../tests/test.rem(1053): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1061): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
hehe hehe
FSET gg(x) x-x FSET gg(x) x-x
../tests/test.rem(1055): Function gg redefined (previously defined at ../tests/test.rem:1050) ../tests/test.rem(1063): Function gg redefined (previously defined at ../tests/test.rem:1058)
REM WARN gg MSG Wookie REM WARN gg MSG Wookie
../tests/test.rem(1056): Trig = Saturday, 16 February, 1991 ../tests/test.rem(1064): Trig = Saturday, 16 February, 1991
Entering UserFN gg(1) Entering UserFN gg(1)
x => 1 x => 1
x => 1 x => 1
1 - 1 => 0 1 - 1 => 0
Leaving UserFN gg(1) => 0 Leaving UserFN gg(1) => 0
../tests/test.rem(1056): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1064): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
../tests/test.rem(1056): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1064): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
Wookie Wookie
REM AT 11:00 SCHED gg MSG blork REM AT 11:00 SCHED gg MSG blork
../tests/test.rem(1057): Trig = Saturday, 16 February, 1991 AT 11:00 ../tests/test.rem(1065): Trig = Saturday, 16 February, 1991 AT 11:00
../tests/test.rem(1057): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1065): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
../tests/test.rem(1057): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1065): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
blork blork
REM OMITFUNC gg MSG hehe REM OMITFUNC gg MSG hehe
../tests/test.rem(1058): Trig = Saturday, 16 February, 1991 ../tests/test.rem(1066): Trig = Saturday, 16 February, 1991
../tests/test.rem(1058): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1066): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
../tests/test.rem(1058): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1066): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
hehe hehe
REM WARN not_defined MSG Wookie REM WARN not_defined MSG Wookie
../tests/test.rem(1060): Trig = Saturday, 16 February, 1991 ../tests/test.rem(1068): Trig = Saturday, 16 February, 1991
../tests/test.rem(1060): Undefined WARN function: `not_defined' ../tests/test.rem(1068): Undefined WARN function: `not_defined'
../tests/test.rem(1060): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1068): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
../tests/test.rem(1060): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1068): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
Wookie Wookie
REM AT 11:00 SCHED not_defined MSG blork REM AT 11:00 SCHED not_defined MSG blork
../tests/test.rem(1061): Undefined SCHED function: `not_defined' ../tests/test.rem(1069): Undefined SCHED function: `not_defined'
../tests/test.rem(1061): Trig = Saturday, 16 February, 1991 AT 11:00 ../tests/test.rem(1069): Trig = Saturday, 16 February, 1991 AT 11:00
../tests/test.rem(1061): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1069): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
../tests/test.rem(1061): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1069): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
blork blork
REM OMITFUNC not_defined MSG hehe REM OMITFUNC not_defined MSG hehe
../tests/test.rem(1062): Undefined OMITFUNC function: `not_defined' ../tests/test.rem(1070): Undefined OMITFUNC function: `not_defined'
../tests/test.rem(1062): Trig = Saturday, 16 February, 1991 ../tests/test.rem(1070): Trig = Saturday, 16 February, 1991
../tests/test.rem(1062): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1070): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
../tests/test.rem(1062): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7 ../tests/test.rem(1070): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
hehe hehe
@@ -5594,6 +5677,28 @@ set xyz ! "foo"
set xyz ! "0" set xyz ! "0"
! "0" => 0 ! "0" => 0
# Test error messages for function calls with too many / too few args
set zxk version(1)
../tests/test.rem(1114): version: Too many arguments
version(1)
^-- here
set zxk max()
../tests/test.rem(1115): max: Not enough arguments
max()
^-- here
fset dooby(x) 1
set zxk dooby()
dooby(...) => Not enough arguments
../tests/test.rem(1118): dooby(): Not enough arguments
set zxk dooby(1, 2)
dooby(...) => Too many arguments
../tests/test.rem(1119): dooby(): Too many arguments
set zxk dooby(1)
Entering UserFN dooby(1)
Leaving UserFN dooby(1) => 1
# Don't want Remind to queue reminders # Don't want Remind to queue reminders
EXIT EXIT
@@ -11747,7 +11852,7 @@ STDOUT is a: PIPE
| | | |1 |2 |3 |4 | | | | |1 |2 |3 |4 |
| | | |BLACK |BLUE |GREEN |CYAN | | | | |BLACK |BLUE |GREEN |CYAN |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
|5 |6 |7 |8 |9 |10 |11 | |5 |6 |7 |8 |9 |10 |11 |
|-@0 | | |BLACK |BRIGHT |BRIGHT |BRIGHT | |-@0 | | |BLACK |BRIGHT |BRIGHT |BRIGHT |
| | | | |BLUE |GREEN |CYAN | | | | | |BLUE |GREEN |CYAN |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
@@ -11769,7 +11874,7 @@ STDOUT is a: PIPE
| | | |1 |2 |3 |4 | | | | |1 |2 |3 |4 |
| | | |BLACK |BLUE |GREEN |CYAN | | | | |BLACK |BLUE |GREEN |CYAN |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
|5 |6 |7 |8 |9 |10 |11 | |5 |6 |7 |8 |9 |10 |11 |
|-@0,0 | | |BLACK |BRIGHT |BRIGHT |BRIGHT | |-@0,0 | | |BLACK |BRIGHT |BRIGHT |BRIGHT |
| | | | |BLUE |GREEN |CYAN | | | | | |BLUE |GREEN |CYAN |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
@@ -11791,7 +11896,7 @@ STDOUT is a: PIPE
| | | |1 |2 |3 |4 | | | | |1 |2 |3 |4 |
| | | |BLACK |BLUE |GREEN |CYAN | | | | |BLACK |BLUE |GREEN |CYAN |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
|5 |6 |7 |8 |9 |10 |11 | |5 |6 |7 |8 |9 |10 |11 |
|-@0,1 | | |BLACK |BRIGHT |BRIGHT |BRIGHT | |-@0,1 | | |BLACK |BRIGHT |BRIGHT |BRIGHT |
| | | | |BLUE |GREEN |CYAN | | | | | |BLUE |GREEN |CYAN |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
@@ -11813,7 +11918,7 @@ STDOUT is a: PIPE
| | | |1 |2 |3 |4 | | | | |1 |2 |3 |4 |
| | | |BLACK |BLUE |GREEN |CYAN | | | | |BLACK |BLUE |GREEN |CYAN |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
|5 |6 |7 |8 |9 |10 |11 | |5 |6 |7 |8 |9 |10 |11 |
|-@1 | | |BLACK |BRIGHT |BRIGHT |BRIGHT | |-@1 | | |BLACK |BRIGHT |BRIGHT |BRIGHT |
| | | | |BLUE |GREEN |CYAN | | | | | |BLUE |GREEN |CYAN |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
@@ -11835,7 +11940,7 @@ STDOUT is a: PIPE
| | | |1 |2 |3 |4 | | | | |1 |2 |3 |4 |
| | | |BLACK |BLUE |GREEN |CYAN | | | | |BLACK |BLUE |GREEN |CYAN |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
|5 |6 |7 |8 |9 |10 |11 | |5 |6 |7 |8 |9 |10 |11 |
|-@1,0 | | |BLACK |BRIGHT |BRIGHT |BRIGHT | |-@1,0 | | |BLACK |BRIGHT |BRIGHT |BRIGHT |
| | | | |BLUE |GREEN |CYAN | | | | | |BLUE |GREEN |CYAN |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
@@ -11857,7 +11962,7 @@ STDOUT is a: PIPE
| | | |1 |2 |3 |4 | | | | |1 |2 |3 |4 |
| | | |BLACK |BLUE |GREEN |CYAN | | | | |BLACK |BLUE |GREEN |CYAN |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
|5 |6 |7 |8 |9 |10 |11 | |5 |6 |7 |8 |9 |10 |11 |
|-@1,1 | | |BLACK |BRIGHT |BRIGHT |BRIGHT | |-@1,1 | | |BLACK |BRIGHT |BRIGHT |BRIGHT |
| | | | |BLUE |GREEN |CYAN | | | | | |BLUE |GREEN |CYAN |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
@@ -11879,7 +11984,7 @@ STDOUT is a: PIPE
| | | |1 |2 |3 |4 | | | | |1 |2 |3 |4 |
| | | |BLACK |BLUE |GREEN |CYAN | | | | |BLACK |BLUE |GREEN |CYAN |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
|5 |6 |7 |8 |9 |10 |11 | |5 |6 |7 |8 |9 |10 |11 |
|-@2 | | |BLACK |BRIGHT |BRIGHT |BRIGHT | |-@2 | | |BLACK |BRIGHT |BRIGHT |BRIGHT |
| | | | |BLUE |GREEN |CYAN | | | | | |BLUE |GREEN |CYAN |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
@@ -11901,7 +12006,7 @@ STDOUT is a: PIPE
| | | |1 |2 |3 |4 | | | | |1 |2 |3 |4 |
| | | |BLACK |BLUE |GREEN |CYAN | | | | |BLACK |BLUE |GREEN |CYAN |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
|5 |6 |7 |8 |9 |10 |11 | |5 |6 |7 |8 |9 |10 |11 |
|-@2,0 | | |BLACK |BRIGHT |BRIGHT |BRIGHT | |-@2,0 | | |BLACK |BRIGHT |BRIGHT |BRIGHT |
| | | | |BLUE |GREEN |CYAN | | | | | |BLUE |GREEN |CYAN |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
@@ -11923,7 +12028,7 @@ STDOUT is a: PIPE
| | | |1 |2 |3 |4 | | | | |1 |2 |3 |4 |
| | | |BLACK |BLUE |GREEN |CYAN | | | | |BLACK |BLUE |GREEN |CYAN |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
|5 |6 |7 |8 |9 |10 |11 | |5 |6 |7 |8 |9 |10 |11 |
|-@2,1 | | |BLACK |BRIGHT |BRIGHT |BRIGHT | |-@2,1 | | |BLACK |BRIGHT |BRIGHT |BRIGHT |
| | | | |BLUE |GREEN |CYAN | | | | | |BLUE |GREEN |CYAN |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
@@ -12491,7 +12596,7 @@ SECURITY: Won't read world-writable file or directory!
Error reading include_dir/ww: Can't open file Error reading include_dir/ww: Can't open file
SECURITY: Won't read world-writable file or directory! SECURITY: Won't read world-writable file or directory!
Error reading include_dir/ww: No files matching *.rem Error reading include_dir/ww: No files matching *.rem
05.00.03 05.00.05
NOTE JSONQUEUE NOTE JSONQUEUE
[{"priority":2,"eventstart":"VOLATILE","time":"23:59","nexttime":"23:59","tdelta":0,"trep":0,"rundisabled":0,"ntrig":1,"filename":"../tests/queue2.rem","lineno":1,"type":"MSG_TYPE","body":"XXXX"},{"priority":999,"eventstart":"VOLATILE","time":"23:58","nexttime":"23:58","tdelta":0,"trep":0,"rundisabled":0,"ntrig":1,"filename":"../tests/queue1.rem","lineno":5,"type":"MSG_TYPE","body":"quux"},{"priority":42,"eventstart":"VOLATILE","time":"23:57","nexttime":"23:57","tdelta":0,"trep":0,"rundisabled":0,"ntrig":1,"filename":"../tests/queue1.rem","lineno":4,"type":"MSG_TYPE","body":"bar"},{"priority":5000,"eventstart":"VOLATILE","time":"23:56","nexttime":"23:56","tdelta":0,"trep":0,"rundisabled":0,"ntrig":1,"filename":"../tests/queue1.rem","lineno":3,"type":"MSG_TYPE","body":"foo"}] [{"priority":2,"eventstart":"VOLATILE","time":"23:59","nexttime":"23:59","tdelta":0,"trep":0,"rundisabled":0,"ntrig":1,"filename":"../tests/queue2.rem","lineno":1,"type":"MSG_TYPE","body":"XXXX"},{"priority":999,"eventstart":"VOLATILE","time":"23:58","nexttime":"23:58","tdelta":0,"trep":0,"rundisabled":0,"ntrig":1,"filename":"../tests/queue1.rem","lineno":5,"type":"MSG_TYPE","body":"quux"},{"priority":42,"eventstart":"VOLATILE","time":"23:57","nexttime":"23:57","tdelta":0,"trep":0,"rundisabled":0,"ntrig":1,"filename":"../tests/queue1.rem","lineno":4,"type":"MSG_TYPE","body":"bar"},{"priority":5000,"eventstart":"VOLATILE","time":"23:56","nexttime":"23:56","tdelta":0,"trep":0,"rundisabled":0,"ntrig":1,"filename":"../tests/queue1.rem","lineno":3,"type":"MSG_TYPE","body":"foo"}]
NOTE ENDJSONQUEUE NOTE ENDJSONQUEUE
@@ -13075,11 +13180,11 @@ No reminders.
# This is a timestamp file used by Remind to track ONCE reminders. # This is a timestamp file used by Remind to track ONCE reminders.
# Do not edit or delete it. # Do not edit or delete it.
+----------------------------------------------------------------------------+ +----------------------------------------------------------------------------+
| September 2024 | | September 1990 |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
| Sunday | Monday | Tuesday |Wednesday | Thursday | Friday | Saturday | | Sunday | Monday | Tuesday |Wednesday | Thursday | Friday | Saturday |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
|1 |2 |3 |4 |5 |6 |7 | | | | | | | |1 |
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | |
@@ -13087,7 +13192,7 @@ No reminders.
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
|8 |9 |10 |11 |12 |13 |14 | |2 |3 |4 |5 |6 |7 |8 |
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | |
@@ -13095,17 +13200,7 @@ No reminders.
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
|15 |16 |17 |18 |19 |20 |21 | |9 |10 |11 |12 |13 |14 |15 |
| | | | | | | |
| |foo | | | | | |
| |bar | | | | | |
| |baz wookie| | | | | |
| |quux apple| | | | | |
| |blech | | | | | |
| | | | | | | |
| |ANOTHER | | | | | |
+----------+----------+----------+----------+----------+----------+----------+
|22 |23 |24 |25 |26 |27 |28 |
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | |
@@ -13113,7 +13208,25 @@ No reminders.
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | |
+----------+----------+----------+----------+----------+----------+----------+ +----------+----------+----------+----------+----------+----------+----------+
|29 |30 | | | | | | |16 |17 |18 |19 |20 |21 |22 |
| | | | | | | |
|foo | | | | | | |
|bar | | | | | | |
|baz wookie| | | | | | |
|quux apple| | | | | | |
|blech | | | | | | |
| | | | | | | |
|ANOTHER | | | | | | |
+----------+----------+----------+----------+----------+----------+----------+
|23 |24 |25 |26 |27 |28 |29 |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
+----------+----------+----------+----------+----------+----------+----------+
|30 | | | | | | |
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | |

View File

@@ -1031,6 +1031,14 @@ REM SATISFY $Td > 0
REM SATISFY $Tw > -1 REM SATISFY $Tw > -1
REM SATISFY [max(x, max(x, 1, 2, 3), 4, 5, 6) * max(5, $Td)] REM SATISFY [max(x, max(x, 1, 2, 3), 4, 5, 6) * max(5, $Td)]
FSET references_t(x) $T != x
REM SATISFY references_t($U)
FSET recursive_t(x) iif(x==0, recursive_t(1), references_t($U))
REM SATISFY recursive_t(0)
REM SATISFY recursive_t(2)
# These should be diagnosed # These should be diagnosed
REM SATISFY 0 REM SATISFY 0
REM SATSIFY "" REM SATSIFY ""
@@ -1101,6 +1109,16 @@ set xyz ! ""
set xyz ! "foo" set xyz ! "foo"
set xyz ! "0" set xyz ! "0"
# Test error messages for function calls with too many / too few args
set zxk version(1)
set zxk max()
fset dooby(x) 1
set zxk dooby()
set zxk dooby(1, 2)
set zxk dooby(1)
# Don't want Remind to queue reminders # Don't want Remind to queue reminders
EXIT EXIT