Compare commits

..

22 Commits

Author SHA1 Message Date
Dianne Skoll 08a6eef73d Update release notes for 06.02.06 release. 2026-05-15 11:52:48 -04:00
Dianne Skoll 3ae1a565ce Allow combining of a command-line datespec with a command-line trigger. 2026-05-15 11:21:33 -04:00
Dianne Skoll aee054281e Better error-reporting. 2026-05-14 10:21:07 -04:00
Dianne Skoll 6c9d685eca Fix test bug. 2026-05-14 10:20:57 -04:00
Dianne Skoll b742303c94 Add warnings if we try to PUSH or FUNSET a built-in function. 2026-05-14 10:08:23 -04:00
Dianne Skoll 64d7872038 Bump version to 06.02.06 2026-05-05 12:29:54 -04:00
Dianne Skoll c48a67ba88 Don't leak "odays" variable. 2026-05-04 12:08:51 -04:00
Dianne Skoll 365b25e606 When dumping variables, indicate preserved ones with <preserved> 2026-05-04 11:19:31 -04:00
Dianne Skoll 19fd401b5b Clarify use of PRESERVE with '*N' 2026-04-30 14:06:48 -04:00
Dianne Skoll 08b2ce87ed Better formatting for janky tkremind man parser. 2026-04-30 00:08:02 -04:00
Dianne Skoll 6eea7e7996 Add "$Repeat" read-only system variable. 2026-04-29 22:03:32 -04:00
Dianne Skoll fc4012c01e Document @trigger command-line parameter. 2026-04-28 12:05:53 -04:00
Dianne Skoll b6a26dcf04 Simplify moonphases.rem 2026-04-22 19:05:26 -04:00
Dianne Skoll 83db92ecba Add another test for '@trigger' command-line option. 2026-04-20 11:28:17 -04:00
Dianne Skoll 1fdf85431a Add tests for the '@trigger' command-line argument. 2026-04-18 14:24:37 -04:00
Dianne Skoll 845c41c867 Use $U instead of today() 2026-04-16 15:22:56 -04:00
Dianne Skoll bf83ce6c98 Make calendar a bit more export-to-ics-friendly. 2026-04-16 15:18:31 -04:00
Dianne Skoll 861d268448 Allow SATISFY on command-line. 2026-04-03 15:52:58 -04:00
Dianne Skoll 02cf32c739 Permit use of "@ trigger" to specify now. 2026-04-03 10:57:31 -04:00
Dianne Skoll 1f960039a1 When you supply the date on the command-line, permit leaving out the year, which defaults to this year in that case. 2026-04-02 14:48:18 -04:00
Dianne Skoll dcf55e0fba Add April Fool's announcement. 2026-04-02 14:34:24 -04:00
Dianne Skoll aa8f5a9731 Remove old /usr/[local/]share/remind/holidays to avoid problems with old symlinks 2026-03-04 17:28:12 -05:00
34 changed files with 416 additions and 119 deletions
@@ -0,0 +1,40 @@
Hi, all,
As you know, Remind has been around for a long time---over 36 years.
It's written in C, and I think it's high time to rewrite it in a
memory-safe language. After all, one CVE in 36 years is simply
unacceptable.
I was looking at writing it in Rust, but decided that Rust isn't quite
mature enough yet. So I decided to do it in FORTAN-77. I chose
FORTRAN-77 over the more obvious choice of COBOL because I studied
engineering and not business.
The rewrite will have the following implications:
o Remind will henceforth be known as REMIND.
o Sadly, I have to drop UTF-8 support. Your choices are ASCII or
EBCDIC.
o All statements must begin in column 7. That means you might need to
edit your existing scripts to add 6 spaces at the beginning of the
line.
o Variables whose names begin with "I" through "N" can only hold INTs.
o I will be setting up a store on my web site to sell punched cards.
(Yes; those will be needed to run REMIND.)
Now, I confess I haven't programmed in FORTRAN-77 in several decades,
so I plan on using AI to assist me. After all, it has been trained on
the mountains of open-source FORTRAN-77 code on the Internet.
I anticipate the rewrite will take about 9 years. You can use this
reminder to alert yourself to when it's ready:
REM 1 APRIL 2035 MSG REMIND IN FORTRAN-77 READY. STOP.
Regards,
Dianne.
Vendored
+9 -9
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.72 for remind 06.02.05. # Generated by GNU Autoconf 2.72 for remind 06.02.06.
# #
# #
# Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, # Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation,
@@ -601,8 +601,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='remind' PACKAGE_NAME='remind'
PACKAGE_TARNAME='remind' PACKAGE_TARNAME='remind'
PACKAGE_VERSION='06.02.05' PACKAGE_VERSION='06.02.06'
PACKAGE_STRING='remind 06.02.05' PACKAGE_STRING='remind 06.02.06'
PACKAGE_BUGREPORT='' PACKAGE_BUGREPORT=''
PACKAGE_URL='https://dianne.skoll.ca/projects/remind/' PACKAGE_URL='https://dianne.skoll.ca/projects/remind/'
@@ -1258,7 +1258,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 06.02.05 to adapt to many kinds of systems. 'configure' configures remind 06.02.06 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1320,7 +1320,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 06.02.05:";; short | recursive ) echo "Configuration of remind 06.02.06:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@@ -1408,7 +1408,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 06.02.05 remind configure 06.02.06
generated by GNU Autoconf 2.72 generated by GNU Autoconf 2.72
Copyright (C) 2023 Free Software Foundation, Inc. Copyright (C) 2023 Free Software Foundation, Inc.
@@ -1871,7 +1871,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 06.02.05, which was It was created by remind $as_me 06.02.06, which was
generated by GNU Autoconf 2.72. Invocation command line was generated by GNU Autoconf 2.72. Invocation command line was
$ $0$ac_configure_args_raw $ $0$ac_configure_args_raw
@@ -4892,7 +4892,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 06.02.05, which was This file was extended by remind $as_me 06.02.06, which was
generated by GNU Autoconf 2.72. Invocation command line was generated by GNU Autoconf 2.72. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@@ -4957,7 +4957,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 06.02.05 remind config.status 06.02.06
configured by $0, generated by GNU Autoconf 2.72, configured by $0, generated by GNU Autoconf 2.72,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"
+1 -1
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, 06.02.05, , , https://dianne.skoll.ca/projects/remind/) AC_INIT(remind, 06.02.06, , , https://dianne.skoll.ca/projects/remind/)
AC_CONFIG_SRCDIR([src/queue.c]) AC_CONFIG_SRCDIR([src/queue.c])
cat <<'EOF' cat <<'EOF'
+1 -1
View File
@@ -147,7 +147,7 @@
"$May" "$MinsFromUTC" "$Minute" "$Monday" "$Mplu" "$NextMode" "$May" "$MinsFromUTC" "$Minute" "$Monday" "$Mplu" "$NextMode"
"$November" "$Now" "$NumFullOmits" "$NumPartialOmits" "$NumQueued" "$November" "$Now" "$NumFullOmits" "$NumPartialOmits" "$NumQueued"
"$NumTrig" "$October" "$On" "$OnceFile" "$ParseUntriggered" "$Pm" "$NumTrig" "$October" "$On" "$OnceFile" "$ParseUntriggered" "$Pm"
"$PrefixLineNo" "$PSCal" "$RunOff" "$Saturday" "$September" "$Shaded" "$PrefixLineNo" "$PSCal" "$Repeat" "$RunOff" "$Saturday" "$September" "$Shaded"
"$SimpleCal" "$SortByDate" "$SortByPrio" "$SortByTime" "$SubsIndent" "$SimpleCal" "$SortByDate" "$SortByPrio" "$SortByTime" "$SubsIndent"
"$Sunday" "$SuppressImplicitWarnings" "$SuppressLRM" "$SysInclude" "$T" "$Tb" "$Td" "$Sunday" "$SuppressImplicitWarnings" "$SuppressLRM" "$SysInclude" "$T" "$Tb" "$Td"
"$TerminalBackground" "$TerminalHyperlinks" "$Thursday" "$TimeSep" "$TimetIs64bit" "$Tm" "$Today" "$TodoFilter" "$TerminalBackground" "$TerminalHyperlinks" "$Thursday" "$TimeSep" "$TimetIs64bit" "$Tm" "$Today" "$TodoFilter"
+33
View File
@@ -1,5 +1,38 @@
CHANGES TO REMIND CHANGES TO REMIND
* VERSION 06.02.06 - 2026-05-15
- NEW FEATURE: remind: Add $Repeat read-only system variable which is
set to N if a command-line repeat of '*N' is supplied.
- NEW FEATURE: remind: You can use a command-line argument of the form
'@trigger' to set the current date. Remind evaluates the trigger
and sets today() to the result. For example, the following command
runs Remind in Agenda Mode on the next upcoming Friday the 13th:
remind filename.rem '@13 SATISFY [$Tw == 5]'
and the next command runs it on 2026-11-13, the first Friday the 13th
on or after 2026-08-01:
remind filename.rem 2026-08-01 '@13 SATISFY [$Tw == 5]'
- MINOR CHANGE: remind: When you supply the date on the command-line,
you can leave out the year, which defaults to the current year in
that case.
- MINOR CHANGE: remind: When dumping variables, indicate preserved
variables with a <preserved> tag.
- MINOR CHANGE: remind: Issue warnings if we try to FUNSET or
PUSH-FUNCS a built-in function.
- BUG FIX: include/holidays/jewish.rem: Rearrange code to improve ICS
export.
- BUG FIX: "make install": Remove old holidays files to avoid installation
failure because of change in symlink setup.
* VERSION 06.02.05 - 2026-03-02 * VERSION 06.02.05 - 2026-03-02
- NEW FEATURE: rem2pdf: Add --avoid-overfull option. This makes the - NEW FEATURE: rem2pdf: Add --avoid-overfull option. This makes the
+8 -8
View File
@@ -1,5 +1,5 @@
# Save variables and functions that we will mess with # Save variables and functions that we will mess with
PUSH-VARS InIsrael IncludeIsraeliHolidays Reform IncludeOmer IncludeOmerCal SunCal ostart yz PUSH-VARS InIsrael IncludeIsraeliHolidays Reform IncludeOmer IncludeOmerCal SunCal ostart yz odays
PUSH-FUNCS _h2 _h2I _YZ _PastSat _BackTwoSat PUSH-FUNCS _h2 _h2I _YZ _PastSat _BackTwoSat
SET InIsrael value("InIsrael", 0) SET InIsrael value("InIsrael", 0)
@@ -105,22 +105,22 @@ IF !Reform
ENDIF ENDIF
IF IncludeOmer || IncludeOmerCal IF IncludeOmer || IncludeOmerCal
SET ostart HEBDATE(16, "Nisan", TODAY()-50) SET ostart HEBDATE(16, "Nisan", $U-50)
IF ostart <= TODAY() && (TODAY() - ostart < 49) IF ostart <= $U && ($U - ostart < 49)
SET odays TODAY()-ostart+1 SET odays $U-ostart+1
IF IncludeOmer IF IncludeOmer
IF odays < 7 IF odays < 7
REM MSG %"%"Today is the [ORD(odays)] day of the Omer. REM [$U] MSG %"%"Today is the [ORD(odays)] day of the Omer.
ELSE ELSE
IF !(odays % 7) IF !(odays % 7)
REM MSG %"%"Today is the [ORD(odays)] day of the Omer, being [odays / 7] [PLURAL(odays/7, "week")] of the Omer. REM [$U] MSG %"%"Today is the [ORD(odays)] day of the Omer, being [odays / 7] [PLURAL(odays/7, "week")] of the Omer.
ELSE ELSE
REM MSG %"%"Today is the [ORD(odays)] day of the Omer, being [odays/7] [PLURAL(odays/7, "week")] and [odays%7] [PLURAL(odays%7, "day")] of the Omer. REM [$U] MSG %"%"Today is the [ORD(odays)] day of the Omer, being [odays/7] [PLURAL(odays/7, "week")] and [odays%7] [PLURAL(odays%7, "day")] of the Omer.
ENDIF ENDIF
ENDIF ENDIF
ENDIF ENDIF
IF IncludeOmerCal IF IncludeOmerCal
REM CAL [ORD(odays)] of Omer REM [$U] CAL [ORD(odays)] of Omer
ENDIF ENDIF
ENDIF ENDIF
ENDIF ENDIF
+1 -1
View File
@@ -33,7 +33,7 @@ TRANSLATE "are" "són"
TRANSLATE "were" "eren" TRANSLATE "were" "eren"
TRANSLATE "done" "completada" TRANSLATE "done" "completada"
FSET - subst_bx(a,d,t) iif(d==today()+2, "demà passat", d >= today(), "d'aquí " + (d-today()) + " dies", "fa " + (today()-d) + " dies") FSET - subst_bx(a,d,t) iif(d==$U+2, "demà passat", d >= $U, "d'aquí " + (d-$U) + " dies", "fa " + ($U-d) + " dies")
# 1 d'abril vs 1 de maig. # 1 d'abril vs 1 de maig.
FSET - subst_sx(a,d,t) iif(isany(substr(mon(d), 1, 1), "a", "o") , "d'", "de") FSET - subst_sx(a,d,t) iif(isany(substr(mon(d), 1, 1), "a", "o") , "d'", "de")
+2 -2
View File
@@ -58,12 +58,12 @@ FSET - subst_ampm(h) iif(h<5, " om natten", h < 12, " om formiddagen", h < 18, "
FSET - subst_ordinal(d) "." FSET - subst_ordinal(d) "."
FSET - ordx(n) n + "." FSET - ordx(n) n + "."
FSET - subst_p(alt, d, t) iif(d==today()+1, "", "e") FSET - subst_p(alt, d, t) iif(d==$U+1, "", "e")
FSET - zeropad(s, len) pad(s, "0", len) FSET - zeropad(s, len) pad(s, "0", len)
FSET - subst_a_alt(d) wkday(d) + ", den " + day(d) + ". " + mon(d) + " " + year(d) FSET - subst_a_alt(d) wkday(d) + ", den " + day(d) + ". " + mon(d) + " " + year(d)
FSET - subst_ax(alt, d, t) iif(alt, subst_a_alt(d), $On + " " + subst_a_alt(d)) FSET - subst_ax(alt, d, t) iif(alt, subst_a_alt(d), $On + " " + subst_a_alt(d))
FSET - subst_bx(a, d, t) iif(d >= today(), "om " + (d-today()) + " dage", "for " + (today()-d) + " dage siden") FSET - subst_bx(a, d, t) iif(d >= $U, "om " + (d-$U) + " dage", "for " + ($U-d) + " dage siden")
FSET - subst_ex(alt, d, t) "den " + zeropad(day(d), 2) + $DateSep + zeropad(monnum(d), 2) + $DateSep + zeropad(year(d), 4) FSET - subst_ex(alt, d, t) "den " + zeropad(day(d), 2) + $DateSep + zeropad(monnum(d), 2) + $DateSep + zeropad(year(d), 4)
FSET - subst_fx(alt, d, t) "den " + zeropad(monnum(d), 2) + $DateSep + zeropad(day(d), 2) + $DateSep + zeropad(year(d), 4) FSET - subst_fx(alt, d, t) "den " + zeropad(monnum(d), 2) + $DateSep + zeropad(day(d), 2) + $DateSep + zeropad(year(d), 4)
+2 -2
View File
@@ -61,14 +61,14 @@ FSET - ordx(n) n + "."
FSET - subst_a_alt(d) wkday(d) + ", den " + day(d) + ". " + mon(d) + " " + year(d) FSET - subst_a_alt(d) wkday(d) + ", den " + day(d) + ". " + mon(d) + " " + year(d)
FSET - subst_ax(alt, d, t) iif(alt, subst_a_alt(d), $On + " " + subst_a_alt(d)) FSET - subst_ax(alt, d, t) iif(alt, subst_a_alt(d), $On + " " + subst_a_alt(d))
FSET - subst_bx(a, d, t) iif(d >= today(), "in " + (d-today()) + " Tagen", "vor " + (today()-d) + " Tagen") FSET - subst_bx(a, d, t) iif(d >= $U, "in " + (d-$U) + " Tagen", "vor " + ($U-d) + " Tagen")
FSET - subst_g_alt(d) wkday(d) + ", den " + day(d) + ". " + mon(d) FSET - subst_g_alt(d) wkday(d) + ", den " + day(d) + ". " + mon(d)
FSET - subst_gx(alt, d, t) iif(alt, subst_g_alt(d), $On + " " + subst_g_alt(d)) FSET - subst_gx(alt, d, t) iif(alt, subst_g_alt(d), $On + " " + subst_g_alt(d))
FSET - subst_ux(alt, d, t) subst_ax(alt, d, t) FSET - subst_ux(alt, d, t) subst_ax(alt, d, t)
FSET - subst_vx(alt, d, t) subst_gx(alt, d, t) FSET - subst_vx(alt, d, t) subst_gx(alt, d, t)
FSET - subst_p(alt, d, t) iif(d == today()+1, "", "en") FSET - subst_p(alt, d, t) iif(d == $U+1, "", "en")
# Localization of various astronomical events # Localization of various astronomical events
+1 -1
View File
@@ -52,4 +52,4 @@ SET $And "y"
SET $Hplu "s" SET $Hplu "s"
SET $Mplu "s" SET $Mplu "s"
FSET - subst_bx(a, d, t) iif(d >= today(), "dentro de " + (d-today()) + " días", "hace " + (today()-d) + " dias") FSET - subst_bx(a, d, t) iif(d >= $U, "dentro de " + (d-$U) + " días", "hace " + ($U-d) + " dias")
+2 -2
View File
@@ -62,7 +62,7 @@ FSET - ordx(d) d + subst_ordinal(d)
FSET - subst_a_alt(d, o, p) wkday(d) + o + " " + day(d) + ". " + mon(d) + p + " " + year(d) FSET - subst_a_alt(d, o, p) wkday(d) + o + " " + day(d) + ". " + mon(d) + p + " " + year(d)
FSET - subst_ax(a, d, t) iif(a, subst_a_alt(d, "", ""), subst_a_alt(d, $On, "ta")) FSET - subst_ax(a, d, t) iif(a, subst_a_alt(d, "", ""), subst_a_alt(d, $On, "ta"))
FSET - subst_bx(a, d, t) iif(d >= today(), (d-today()) + " päivän kuluttua", (today()-d) + " päivää sitten") FSET - subst_bx(a, d, t) iif(d >= $U, (d-$U) + " päivän kuluttua", ($U-d) + " päivää sitten")
FSET - subst_cx(a, d, t) iif(a, wkday(d), wkday(d) + $On) FSET - subst_cx(a, d, t) iif(a, wkday(d), wkday(d) + $On)
FSET - subst_ex(a, d, t) zeropad(day(d), 2) + $DateSep + zeropad(monnum(d), 2) + $DateSep + zeropad(year(d), 4) FSET - subst_ex(a, d, t) zeropad(day(d), 2) + $DateSep + zeropad(monnum(d), 2) + $DateSep + zeropad(year(d), 4)
@@ -81,7 +81,7 @@ FSET - subst_k_alt(d, o) wkday(d) + o + " " + mon(d) + "n " + day(d) + subst_ord
FSET - subst_kx(a, d, t) iif(a, subst_k_alt(d, ""), subst_k_alt(d, $On)) FSET - subst_kx(a, d, t) iif(a, subst_k_alt(d, ""), subst_k_alt(d, $On))
FSET - subst_lx(a, d, t) zeropad(year(d), 4) + $DateSep + zeropad(monnum(d), 2) + $DateSep + zeropad(day(d), 2) FSET - subst_lx(a, d, t) zeropad(year(d), 4) + $DateSep + zeropad(monnum(d), 2) + $DateSep + zeropad(day(d), 2)
FSET - subst_p(a, d, t) iif(d==today()+1, "", "ä") FSET - subst_p(a, d, t) iif(d==$U+1, "", "ä")
FSET - subst_qx(a, d, t) "n" FSET - subst_qx(a, d, t) "n"
FSET - subst_u_alt(d, o, p) wkday(d) + o + " " + day(d) + subst_ordinal(day(d)) + " " + mon(d) + p + " " + year(d) FSET - subst_u_alt(d, o, p) wkday(d) + o + " " + day(d) + subst_ordinal(day(d)) + " " + mon(d) + p + " " + year(d)
+1 -1
View File
@@ -63,7 +63,7 @@ FSET - subst_1(alt, date, time) iif(time == now(), "maintenant", \
time > now(), "dans " + subst_tdiff((time-now())/60, (time-now())%60), \ time > now(), "dans " + subst_tdiff((time-now())/60, (time-now())%60), \
"il y a " + subst_tdiff ((now()-time)/60, (now()-time)%60)) "il y a " + subst_tdiff ((now()-time)/60, (now()-time)%60))
FSET - subst_bx(alt, date, time) iif(date >= today(), "dans " + (date-today()) + " jours", "il y a " + (today()-date) + " jours") FSET - subst_bx(alt, date, time) iif(date >= $U, "dans " + (date-$U) + " jours", "il y a " + ($U-date) + " jours")
FSET - subst_j_alt(date) wkday(date) + ", " + day(date) + subst_ordinal(day(date)) + " " + mon(date) + ", " + year(date) FSET - subst_j_alt(date) wkday(date) + ", " + day(date) + subst_ordinal(day(date)) + " " + mon(date) + ", " + year(date)
FSET - subst_jx(alt, date, time) iif(alt, subst_j_alt(date), $On + " " + subst_j_alt(date)) FSET - subst_jx(alt, date, time) iif(alt, subst_j_alt(date), $On + " " + subst_j_alt(date))
+1 -1
View File
@@ -54,7 +54,7 @@ SET $And "και"
SET $Hplu "" SET $Hplu ""
SET $Mplu "" SET $Mplu ""
FSET - subst_bx(a, d, t) iif(d >= today(), "σε " + (d - today()) + " ημέρες", "πριν από " + (today()-d) + " ημέρες") FSET - subst_bx(a, d, t) iif(d >= $U, "σε " + (d - $U) + " ημέρες", "πριν από " + ($U-d) + " ημέρες")
FSET - subst_ordinal(d) "." FSET - subst_ordinal(d) "."
FSET - ordx(d) d + "." FSET - ordx(d) d + "."
FSET - subst_a_alt(d) wkday(d) + ", " + day(d) + ". " + mon(d) + " " + year(d) FSET - subst_a_alt(d) wkday(d) + ", " + day(d) + ". " + mon(d) + " " + year(d)
+2 -2
View File
@@ -54,5 +54,5 @@ SET $And "og"
SET $Hplu "ir" SET $Hplu "ir"
SET $Mplu "r" SET $Mplu "r"
FSET - subst_bx(a, d, t) iif(d >= today(), "eftir " + (d - today()) + " daga", "fyrir " + (today()-d) + " dögum") FSET - subst_bx(a, d, t) iif(d >= $U, "eftir " + (d - $U) + " daga", "fyrir " + ($U-d) + " dögum")
FSET - subst_p(a, d, t) iif(d == today()+1, "", "a") FSET - subst_p(a, d, t) iif(d == $U+1, "", "a")
+3 -3
View File
@@ -53,9 +53,9 @@ SET $And "e"
SET $Hplu "a" SET $Hplu "a"
SET $Mplu "i" SET $Mplu "i"
FSET - subst_bx(a, d, t) iif(d >= today(), "fra " + (d-today()) + " giorni", (today()-d) + " giorni fa") FSET - subst_bx(a, d, t) iif(d >= $U, "fra " + (d-$U) + " giorni", ($U-d) + " giorni fa")
FSET - subst_p(a, d, t) iif(d==today()+1, "o", "i") FSET - subst_p(a, d, t) iif(d==$U+1, "o", "i")
FSET - subst_q(a, d, t) iif(d==today()+1, "a", "e") FSET - subst_q(a, d, t) iif(d==$U+1, "a", "e")
FSET - subst_ax(a, d, t) wkday(d) + ", " + day(d) + " " + mon(d) + " " + year(d) FSET - subst_ax(a, d, t) wkday(d) + ", " + day(d) + " " + mon(d) + " " + year(d)
FSET - subst_jx(a, d, t) subst_ax(a, d, t) FSET - subst_jx(a, d, t) subst_ax(a, d, t)
+1 -1
View File
@@ -59,7 +59,7 @@ FSET - subst_1b(hdiff, mdiff) iif(hdiff==0, subst_minutes(mdiff), mdiff==0, subs
FSET - subst_minutes(m) iif(m==1, "1 minuut", m + " minuten") FSET - subst_minutes(m) iif(m==1, "1 minuut", m + " minuten")
FSET - subst_hours(h) iif(h==1, "1 uur", h + " uren") FSET - subst_hours(h) iif(h==1, "1 uur", h + " uren")
FSET - subst_bx(a, d, t) iif (d == today()+2, "overmorgen", d+2 == today(), "eergisteren", d >= today(), "over " + (d-today()) + " dagen", (today()-d) + " dagen geleden") FSET - subst_bx(a, d, t) iif (d == $U+2, "overmorgen", d+2 == $U, "eergisteren", d >= $U, "over " + (d-$U) + " dagen", ($U-d) + " dagen geleden")
FSET - subst_s(a, d, t) iif(day(d) == 1 || day(d) == 8, "e", day(d) < 20, "de", "te") FSET - subst_s(a, d, t) iif(day(d) == 1 || day(d) == 8, "e", day(d) < 20, "de", "te")
+2 -2
View File
@@ -53,7 +53,7 @@ SET $And "og"
SET $Hplu "r" SET $Hplu "r"
SET $Mplu "er" SET $Mplu "er"
FSET - subst_bx(a, d, t) iif(d >= today(), "om " + (d-today()) + " dager", "for " + (today()-d) + " dager siden") FSET - subst_bx(a, d, t) iif(d >= $U, "om " + (d-$U) + " dager", "for " + ($U-d) + " dager siden")
FSET - subst_ordinal(d) "." FSET - subst_ordinal(d) "."
FSET - ordx(n) n + "." FSET - ordx(n) n + "."
@@ -63,4 +63,4 @@ FSET - subst_gx(a, d, t) iif(a, subst_g_alt(d), $On + " " + subst_g_alt(d))
FSET - subst_g_alt(d) wkday(d) + ", den " + day(d) + ". " + mon(d) FSET - subst_g_alt(d) wkday(d) + ", den " + day(d) + ". " + mon(d)
FSET - subst_ux(a, d, t) subst_ax(a, d, t) FSET - subst_ux(a, d, t) subst_ax(a, d, t)
FSET - subst_vx(a, d, t) subst_gx(a, d, t) FSET - subst_vx(a, d, t) subst_gx(a, d, t)
FSET - subst_p(a, d, t) iif(d==today()+1, "", "er") FSET - subst_p(a, d, t) iif(d==$U+1, "", "er")
+1 -1
View File
@@ -58,7 +58,7 @@ FSET - subst_ordinal(d) ""
FSET - subst_a_alt(d) wkday(d) + ", " + day(d) + ". " + mon(d) + " " + year(d) FSET - subst_a_alt(d) wkday(d) + ", " + day(d) + ". " + mon(d) + " " + year(d)
FSET - subst_ax(a, d, t) iif(a, subst_a_alt(d), $On + " " + subst_a_alt(d)) FSET - subst_ax(a, d, t) iif(a, subst_a_alt(d), $On + " " + subst_a_alt(d))
FSET - subst_bx(a, d, t) iif(d >= today(), "za " + (d-today()) + " dni", (today()-d) + " dni temu") FSET - subst_bx(a, d, t) iif(d >= $U, "za " + (d-$U) + " dni", ($U-d) + " dni temu")
FSET - subst_g_alt(d) wkday(d) + ", " + day(d) + ". " + mon(d) FSET - subst_g_alt(d) wkday(d) + ", " + day(d) + ". " + mon(d)
FSET - subst_gx(a, d, t) iif(a, subst_g_alt(d), $On + " " + subst_g_alt(d)) FSET - subst_gx(a, d, t) iif(a, subst_g_alt(d), $On + " " + subst_g_alt(d))
FSET - subst_ux(a, d, t) subst_ax(a, d, t) FSET - subst_ux(a, d, t) subst_ax(a, d, t)
+1 -1
View File
@@ -58,7 +58,7 @@ FSET - subst_ordinal(d) ""
FSET - subst_on_wd(d) iif(wkdaynum(d) == 1 || wkdaynum(d) == 2, "no", "na") FSET - subst_on_wd(d) iif(wkdaynum(d) == 1 || wkdaynum(d) == 2, "no", "na")
FSET - subst_a_alt(d) wkday(d) + ", " + day(d) + " de " + mon(d) + " de " + year(d) FSET - subst_a_alt(d) wkday(d) + ", " + day(d) + " de " + mon(d) + " de " + year(d)
FSET - subst_bx(a, d, t) iif(d >= today(), "em " + (d-today()) + " dias", "há " + (today()-d) + " dias") FSET - subst_bx(a, d, t) iif(d >= $U, "em " + (d-$U) + " dias", "há " + ($U-d) + " dias")
FSET - subst_c_alt(d) wkday(d) FSET - subst_c_alt(d) wkday(d)
FSET - subst_g_alt(d) wkday(d) + ", " + day(d) + " " + mon(d) FSET - subst_g_alt(d) wkday(d) + ", " + day(d) + " " + mon(d)
FSET - subst_ax(a, d, t) iif(a, subst_a_alt(d), subst_on_wd(d) + " " + subst_a_alt(d)) FSET - subst_ax(a, d, t) iif(a, subst_a_alt(d), subst_on_wd(d) + " " + subst_a_alt(d))
+2 -2
View File
@@ -53,7 +53,7 @@ SET $Mplu "e"
SET $Hplu "e" SET $Hplu "e"
SET $And "şi" SET $And "şi"
FSET - subst_bx(a, d, t) iif(d >= today(), "peste " + (d-today()) + " zile", "acume " + (today()-d) + " zile") FSET - subst_bx(a, d, t) iif(d >= $U, "peste " + (d-$U) + " zile", "acume " + ($U-d) + " zile")
FSET - subst_ampm(h) iif(h<4, " noaptea", h<12, " dimineaţa", h<18, " după-amiaza", " seara") FSET - subst_ampm(h) iif(h<4, " noaptea", h<12, " dimineaţa", h<18, " după-amiaza", " seara")
FSET - subst_ordinal(d) "" FSET - subst_ordinal(d) ""
@@ -65,7 +65,7 @@ FSET - subst_jx(a, d, t) wkday(d) + ", " + mon(d) + " " + day(d) + ", " + year(d
FSET - subst_kx(a, d, t) wkday(d) + ", " + mon(d) + " " + day(d) FSET - subst_kx(a, d, t) wkday(d) + ", " + mon(d) + " " + day(d)
FSET - subst_ux(a, d, t) subst_ax(a, d, t) FSET - subst_ux(a, d, t) subst_ax(a, d, t)
FSET - subst_vx(a, d, t) subst_gx(a, d, t) FSET - subst_vx(a, d, t) subst_gx(a, d, t)
FSET - subst_p(a, d, t) iif(d==today()+1, "", "le") FSET - subst_p(a, d, t) iif(d==$U+1, "", "le")
FSET - subst_1(a, d, t) iif(t==now(), $Now, t<now(), subst_1helper(now()-t, "acum "), subst_1helper(t-now(), "peste ")) FSET - subst_1(a, d, t) iif(t==now(), $Now, t<now(), subst_1helper(now()-t, "acum "), subst_1helper(t-now(), "peste "))
FSET - subst_1helper(diff, when) when + iif(diff%60==0, subst_1h(diff/60), diff/60==0, subst_1m(diff%60), subst_1h(diff/60) + " " + $And + " " + subst_1m(diff%60)) FSET - subst_1helper(diff, when) when + iif(diff%60==0, subst_1h(diff/60), diff/60==0, subst_1m(diff%60), subst_1h(diff/60) + " " + $And + " " + subst_1m(diff%60))
+4 -4
View File
@@ -7,10 +7,10 @@ IF access($SysInclude + "/translations/" + _("LANGID") + "/moonphases.rem", "r")
ENDIF ENDIF
IF $CalMode || $PsCal IF $CalMode || $PsCal
REM [moondate(0)] INFO "Url: https://en.wikipedia.org/wiki/New_moon" SPECIAL MOON 0 -1 -1 [moontime(0)] REM NOQUEUE [moondatetime(0)] INFO "Url: https://en.wikipedia.org/wiki/New_moon" SPECIAL MOON 0 -1 -1 %*3
REM [moondate(1)] INFO "Url: https://en.wikipedia.org/wiki/Lunar_phase" SPECIAL MOON 1 -1 -1 [moontime(1)] REM NOQUEUE [moondatetime(1)] INFO "Url: https://en.wikipedia.org/wiki/Lunar_phase" SPECIAL MOON 1 -1 -1 %*3
REM [moondate(2)] INFO "Url: https://en.wikipedia.org/wiki/Full_moon" SPECIAL MOON 2 -1 -1 [moontime(2)] REM NOQUEUE [moondatetime(2)] INFO "Url: https://en.wikipedia.org/wiki/Full_moon" SPECIAL MOON 2 -1 -1 %*3
REM [moondate(3)] INFO "Url: https://en.wikipedia.org/wiki/Lunar_phase" SPECIAL MOON 3 -1 -1 [moontime(3)] REM NOQUEUE [moondatetime(3)] INFO "Url: https://en.wikipedia.org/wiki/Lunar_phase" SPECIAL MOON 3 -1 -1 %*3
ELSE ELSE
REM NOQUEUE INFO "Url: https://en.wikipedia.org/wiki/New_moon" [moondatetime(0)] MSG %"%(New Moon) (%2)%" %! %b. REM NOQUEUE INFO "Url: https://en.wikipedia.org/wiki/New_moon" [moondatetime(0)] MSG %"%(New Moon) (%2)%" %! %b.
REM NOQUEUE INFO "Url: https://en.wikipedia.org/wiki/Lunar_phase" [moondatetime(1)] MSG %"%(First Quarter) (%2)%" %! %b. REM NOQUEUE INFO "Url: https://en.wikipedia.org/wiki/Lunar_phase" [moondatetime(1)] MSG %"%(First Quarter) (%2)%" %! %b.
+37 -4
View File
@@ -4,7 +4,11 @@ remind \- a sophisticated reminder service
.SH THE BOOK OF REMIND .SH THE BOOK OF REMIND
This man page is a good \fIreference\fR for Remind. However, if you This man page is a good \fIreference\fR for Remind. However, if you
are a novice wishing to \fIlearn\fR Remind, I suggest downloading are a novice wishing to \fIlearn\fR Remind, I suggest downloading
"The Book of Remind" from the Remind home page at https://dianne.skoll.ca/projects/remind/ "The Book of Remind" from the Remind home page at the following URL:
.PP
.nf
https://dianne.skoll.ca/projects/remind/
.fi
.SH SYNOPSIS .SH SYNOPSIS
.B remind [\fIoptions\fR] \fIfilename\fR [\fIdate\fR] [\fI*rep\fR] [\fItime\fR] .B remind [\fIoptions\fR] \fIfilename\fR [\fIdate\fR] [\fI*rep\fR] [\fItime\fR]
.SH DESCRIPTION .SH DESCRIPTION
@@ -515,10 +519,12 @@ In other words, \fB\-i\fIvar\fR is exactly the same as \fB\-i\fIvar\fR\fB=\fR0.
Allows you to define a function on the command line. Allows you to define a function on the command line.
.PP .PP
If you supply a \fIdate\fR on the command line, it must consist of If you supply a \fIdate\fR on the command line, it must consist of
\fIday month year\fR, where \fIday\fR is the day of the month, [\fIday\fR] \fImonth\fR [\fIyear\fR], where \fIday\fR is the day of the month,
\fImonth\fR is at least the first three letters of the English name \fImonth\fR is at least the first three letters of the English name
of the month, and \fIyear\fR is a year (all 4 digits) from 1990 to of the month, and \fIyear\fR is a year (all 4 digits) from 1990 to
about 2075. You can leave out the \fIday\fR, which then defaults to 1. about 2075. You can leave out the \fIday\fR, which then defaults to 1.
If you leave out the year, then it defaults to the current year. You
cannot leave out the \fImonth\fR.
.PP .PP
If you do supply a \fIdate\fR on the command line, then \fBRemind\fR If you do supply a \fIdate\fR on the command line, then \fBRemind\fR
uses it, rather than the actual system date, as its notion of "today." uses it, rather than the actual system date, as its notion of "today."
@@ -534,6 +540,28 @@ If you would rather specify the date more succinctly, you can supply
it as YYYY-MM-DD or YYYY/MM/DD. You can even supply a date and it as YYYY-MM-DD or YYYY/MM/DD. You can even supply a date and
time on the command line as one argument: YYYY-MM-DD@HH:MM. time on the command line as one argument: YYYY-MM-DD@HH:MM.
.PP .PP
You can also specify the date as a \fItrigger\fR by prefixing it
with the at symbol, "@". You might need to quote the argument. In this
case, Remind evaluates everything after the "@" as a trigger and the
resulting trigger date is used as the effective date. For example,
if you want to see what reminders will trigger on the next Friday
the 13th, you could use this:
.PP
.nf
remind .reminders '@13 SATISFY [$Tw == 5]'
.fi
.PP
You can also specify the date directly \fIand\fR use an "@" trigger
argument; in this case, Remind uses the specified date as the starting
point for the trigger calculation. As an example:
.PP
.nf
remind .reminders 2026-07-01 '@13 SATISFY [$Tw == 5]'
.fi
.PP
will set \fBRemind\fR's notion of "today" to 2026-11-13 because that
is the first Friday the 13th on or after 2026-07-01.
.PP
In addition, you can supply a \fIrepeat\fR parameter, which has the In addition, you can supply a \fIrepeat\fR parameter, which has the
form *\fIrep\fR. This causes \fBRemind\fR to be run \fIrep\fR times, form *\fIrep\fR. This causes \fBRemind\fR to be run \fIrep\fR times,
with the date incrementing on each iteration. You may have to enclose with the date incrementing on each iteration. You may have to enclose
@@ -3363,6 +3391,10 @@ If non-zero, then the \fB\-l\fR option was supplied on the command line.
.B $PSCal (read-only) .B $PSCal (read-only)
If non-zero, then the \fB\-p\fR option was supplied on the command line. If non-zero, then the \fB\-p\fR option was supplied on the command line.
.TP .TP
.B $Repeat (read-only)
If this variable holds a non-zero value \fIn\fR, then a command-line
argument of *\fIn\fR was supplied to specify repeated runs of \fBRemind\fR..
.TP
.B $RunOff (read-only) .B $RunOff (read-only)
If non-zero, the \fBRUN\fR directives are disabled. If non-zero, the \fBRUN\fR directives are disabled.
.TP .TP
@@ -6167,10 +6199,11 @@ For example, suppose you set the variables "me" and "hostname" as follows:
.fi .fi
.PP .PP
Normally, \fBRemind\fR clears all variables between iterations in calendar Normally, \fBRemind\fR clears all variables between iterations in calendar
mode. However, if certain variables are slow to compute, and will mode and between iterations if a '*N' parameter was supplied on the
command-line. However, if certain variables are slow to compute, and will
not change between iterations, you can "preserve" their values with the not change between iterations, you can "preserve" their values with the
\fBPRESERVE\fR command. Also, since function definitions are preserved \fBPRESERVE\fR command. Also, since function definitions are preserved
between calendar iterations, there is no need to redefine them on each between iterations, there is no need to redefine them on each
iteration. Thus, you could use the following sequence: iteration. Thus, you could use the following sequence:
.PP .PP
.nf .nf
+2
View File
@@ -80,6 +80,8 @@ install: all
$(INSTALL_DATA) $$man $(DESTDIR)$(mandir)/man1 || exit 1; \ $(INSTALL_DATA) $$man $(DESTDIR)$(mandir)/man1 || exit 1; \
done done
-mkdir -p $(DESTDIR)$(datarootdir)/remind || true -mkdir -p $(DESTDIR)$(datarootdir)/remind || true
# Avoid problems with symlinks under holidays/
-rm -rf $(DESTDIR)$(datarootdir)/remind/holidays > /dev/null 2>&1 || true
cp -R ../include/* $(DESTDIR)$(datarootdir)/remind cp -R ../include/* $(DESTDIR)$(datarootdir)/remind
chmod -R a+rX $(DESTDIR)$(datarootdir)/remind chmod -R a+rX $(DESTDIR)$(datarootdir)/remind
-mkdir -p $(DESTDIR)$(prefix)/share/pixmaps -mkdir -p $(DESTDIR)$(prefix)/share/pixmaps
+6 -3
View File
@@ -68,7 +68,7 @@
as a REM statement, also. */ as a REM statement, also. */
#define E_CANT_MODIFY 45 #define E_CANT_MODIFY 45
#define E_MKTIME_PROBLEM 46 #define E_MKTIME_PROBLEM 46
#define E_REDEF_FUNC 47 #define E_REDEF_BUILTIN_FUNC 47
#define E_CANTNEST_FDEF 48 #define E_CANTNEST_FDEF 48
#define E_REP_FULSPEC 49 #define E_REP_FULSPEC 49
#define E_YR_TWICE 50 #define E_YR_TWICE 50
@@ -139,7 +139,8 @@
#define E_EXPECTING_EOXPR 115 #define E_EXPECTING_EOXPR 115
#define E_EXPECTING_ATOM 116 #define E_EXPECTING_ATOM 116
#define E_BAD_VAL_FOR_SYSVAR 117 #define E_BAD_VAL_FOR_SYSVAR 117
#define E_UNSET_BUILTIN_FUNC 118
#define E_PUSH_BUILTIN_FUNC 119
#ifdef MK_GLOBALS #ifdef MK_GLOBALS
#undef EXTERN #undef EXTERN
#define EXTERN #define EXTERN
@@ -203,7 +204,7 @@ EXTERN char *ErrMsg[]
/* E_PARSE_AS_REM */ "", /* E_PARSE_AS_REM */ "",
/* E_CANT_MODIFY */ "Cannot modify system variable", /* E_CANT_MODIFY */ "Cannot modify system variable",
/* E_MKTIME_PROBLEM */ "C library function can't represent date/time", /* E_MKTIME_PROBLEM */ "C library function can't represent date/time",
/* E_REDEF_FUNC */ "Attempt to redefine built-in function", /* E_REDEF_BUILTIN_FUNC */ "Attempt to redefine built-in function",
/* E_CANTNEST_FDEF */ "Can't nest function definition in expression", /* E_CANTNEST_FDEF */ "Can't nest function definition in expression",
/* E_REP_FULSPEC */ "Must fully specify date to use repeat factor", /* E_REP_FULSPEC */ "Must fully specify date to use repeat factor",
/* E_YR_TWICE */ "Year specified twice", /* E_YR_TWICE */ "Year specified twice",
@@ -274,6 +275,8 @@ EXTERN char *ErrMsg[]
/* E_EXPECTING_EOXPR */ "Expecting operator or end-of-expression", /* E_EXPECTING_EOXPR */ "Expecting operator or end-of-expression",
/* E_EXPECTING_ATOM */ "Expecting constant, variable, function call or (expression)", /* E_EXPECTING_ATOM */ "Expecting constant, variable, function call or (expression)",
/* E_BAD_VAL_FOR_SYSVAR */ "Invalid value for system variable", /* E_BAD_VAL_FOR_SYSVAR */ "Invalid value for system variable",
/* E_UNSET_BUILTIN_FUNC */ "Attempt to unset built-in function",
/* E_PUSH_BUILTIN_FUNC */ "Attempt to PUSH built-in function",
} }
#endif /* MK_GLOBALS */ #endif /* MK_GLOBALS */
; ;
+5 -1
View File
@@ -4727,6 +4727,7 @@ FEvalTrig(func_info *info)
return r; return r;
} }
if (trig.tz != NULL && tim.ttime == NO_TIME) { if (trig.tz != NULL && tim.ttime == NO_TIME) {
DestroyParser(&p);
FreeTrig(&trig); FreeTrig(&trig);
return E_TZ_NO_AT; return E_TZ_NO_AT;
} }
@@ -4753,7 +4754,10 @@ FEvalTrig(func_info *info)
dse = -1; dse = -1;
} }
DestroyParser(&p); DestroyParser(&p);
if (r) return r; if (r) {
FreeTrig(&trig);
return r;
}
if (dse < 0) { if (dse < 0) {
RetVal.type = INT_TYPE; RetVal.type = INT_TYPE;
RETVAL = dse; RETVAL = dse;
+1
View File
@@ -74,6 +74,7 @@ EXTERN INIT( int DoPrefixLineNo, 0);
EXTERN INIT( int MondayFirst, 0); EXTERN INIT( int MondayFirst, 0);
EXTERN INIT( int AddBlankLines, 1); EXTERN INIT( int AddBlankLines, 1);
EXTERN INIT( int Iterations, 1); EXTERN INIT( int Iterations, 1);
EXTERN INIT( int OrigIterations, 0);
EXTERN INIT( int PsCal, 0); EXTERN INIT( int PsCal, 0);
EXTERN INIT( int CalWidth, 80); EXTERN INIT( int CalWidth, 80);
EXTERN INIT( int CalWeeks, 0); EXTERN INIT( int CalWeeks, 0);
+123 -33
View File
@@ -54,6 +54,9 @@ static int tty_init(int fd);
static void tty_raw(int fd); static void tty_raw(int fd);
static void tty_reset(int fd); static void tty_reset(int fd);
static int GetInitDateFromTrigger(char const *s, int *y, int *m, int *d, int *systime);
static void SetTodayFromCmdlineArgs(int dse, int y, int m, int d);
static void ProcessLongOption(char const *arg); static void ProcessLongOption(char const *arg);
/*************************************************************** /***************************************************************
* *
@@ -183,6 +186,7 @@ void InitRemind(int argc, char const *argv[])
int x; int x;
int dse; int dse;
int ttyfd; int ttyfd;
int r;
/* Make sure remind is not installed set-uid or set-gid */ /* Make sure remind is not installed set-uid or set-gid */
if (getgid() != getegid() || if (getgid() != getegid() ||
@@ -740,10 +744,27 @@ void InitRemind(int argc, char const *argv[])
if (i < argc) { if (i < argc) {
while (i < argc) { while (i < argc) {
arg = argv[i++]; arg = argv[i++];
/* If it begins with '@' then it's a trigger spec */
if (*arg == '@') {
SetTodayFromCmdlineArgs(dse, y, m, d);
r = GetInitDateFromTrigger(arg+1, &y, &m, &d, &SysTime);
if (r == OK) {
dse = NO_DATE; /* Date is in y/m/d */
if (SysTime != -1) {
DontQueue = 1;
Daemon = 0;
LocalSysTime = SysTime;
}
} else {
fprintf(stderr, "Could not evaluate command-line trigger: %s\n", GetErr(r));
exit(1);
}
continue;
}
FindToken(arg, &tok); FindToken(arg, &tok);
switch (tok.type) { switch (tok.type) {
case T_Time: case T_Time:
if (SysTime != -1L) Usage(); if (SysTime != -1) Usage();
else { else {
SysTime = (long) tok.val * 60L; SysTime = (long) tok.val * 60L;
LocalSysTime = SysTime; LocalSysTime = SysTime;
@@ -753,7 +774,7 @@ void InitRemind(int argc, char const *argv[])
break; break;
case T_DateTime: case T_DateTime:
if (SysTime != -1L) Usage(); if (SysTime != -1) Usage();
if (m != NO_MON || d != NO_DAY || y != NO_YR || dse != NO_DATE) Usage(); if (m != NO_MON || d != NO_DAY || y != NO_YR || dse != NO_DATE) Usage();
SysTime = (tok.val % MINUTES_PER_DAY) * 60; SysTime = (tok.val % MINUTES_PER_DAY) * 60;
LocalSysTime = SysTime; LocalSysTime = SysTime;
@@ -798,42 +819,13 @@ void InitRemind(int argc, char const *argv[])
if (rep > 0) { if (rep > 0) {
Iterations = rep; Iterations = rep;
OrigIterations = rep;
IgnoreOnce = 1; IgnoreOnce = 1;
DontQueue = 1; DontQueue = 1;
Daemon = 0; Daemon = 0;
} }
if (dse != NO_DATE) { SetTodayFromCmdlineArgs(dse, y, m, d);
FromDSE(dse, &y, &m, &d);
}
/* Must supply date in the form: day, mon, yr OR mon, yr */
if (m != NO_MON || y != NO_YR || d != NO_DAY) {
if (m == NO_MON || y == NO_YR) {
if (rep == NO_REP) Usage();
else if (m != NO_MON || y != NO_YR) Usage();
else {
m = CurMon;
y = CurYear;
if (d == NO_DAY) d = CurDay;
}
}
if (d == NO_DAY) d=1;
if (d > DaysInMonth(m, y)) {
fprintf(ErrFp, "%s", BadDate);
Usage();
}
DSEToday = DSE(y, m, d);
if (DSEToday == -1) {
fprintf(ErrFp, "%s", BadDate);
Usage();
}
LocalDSEToday = DSEToday;
CurYear = y;
CurMon = m;
CurDay = d;
if (DSEToday != RealToday) IgnoreOnce = 1;
}
} }
/* JSON mode turns off sorting */ /* JSON mode turns off sorting */
@@ -1401,3 +1393,101 @@ GetTerminalBackground(void)
} }
return TerminalBackground; return TerminalBackground;
} }
static int
GetInitDateFromTrigger(char const *s, int *y, int *m, int *d, int *systime)
{
Parser p;
Trigger trig;
TimeTrig tim;
int dse;
int r;
CreateParser(s, &p);
r = ParseRem(&p, &trig, &tim);
if (r) {
DestroyParser(&p);
return r;
}
if (trig.tz != NULL && tim.ttime == NO_TIME) {
DestroyParser(&p);
FreeTrig(&trig);
return E_TZ_NO_AT;
}
if (trig.typ == SAT_TYPE) {
EnterTimezone(trig.tz);
r=DoSatRemind(&trig, &tim, &p);
ExitTimezone(trig.tz);
if (r) {
DestroyParser(&p);
FreeTrig(&trig);
return r;
}
dse = LastTriggerDate;
} else if (trig.typ == NO_TYPE) {
EnterTimezone(trig.tz);
dse = ComputeTrigger(get_scanfrom(&trig), &trig, &tim, &r, 0);
ExitTimezone(trig.tz);
} else {
DestroyParser(&p);
FreeTrig(&trig);
return E_PARSE_ERR;
}
DestroyParser(&p);
if (r) {
FreeTrig(&trig);
return r;
}
if (dse < 0) {
FreeTrig(&trig);
return E_CANT_TRIG;
}
if (dse >= 0) {
if (tim.ttime != NO_TIME) {
if (*systime != -1) {
Usage();
}
dse=AdjustTriggerForTimeZone(&trig, dse, &tim, 1);
*systime = tim.ttime * 60;
}
FromDSE(dse, y, m, d);
if (dse != RealToday) {
IgnoreOnce = 1;
}
}
FreeTrig(&trig);
return OK;
}
static void
SetTodayFromCmdlineArgs(int dse, int y, int m, int d)
{
if (dse != NO_DATE) {
FromDSE(dse, &y, &m, &d);
}
/* Must supply date in the form: day, mon, yr OR mon, yr */
if (m != NO_MON || y != NO_YR || d != NO_DAY) {
if (y == NO_YR) {
y = CurYear;
}
if (m == NO_MON) {
Usage();
}
if (d == NO_DAY) d=1;
if (d > DaysInMonth(m, y)) {
fprintf(ErrFp, "%s", BadDate);
Usage();
}
DSEToday = DSE(y, m, d);
if (DSEToday == -1) {
fprintf(ErrFp, "%s", BadDate);
Usage();
}
LocalDSEToday = DSEToday;
CurYear = y;
CurMon = m;
CurDay = d;
if (DSEToday != RealToday) IgnoreOnce = 1;
}
}
+37 -14
View File
@@ -117,16 +117,16 @@ int DoFrename(ParsePtr p)
return r; return r;
} }
if (FindBuiltinFunc(DBufValue(&newbuf))) { if (FindBuiltinFunc(DBufValue(&newbuf))) {
Eprint("%s: `%s'", GetErr(E_REDEF_FUNC), DBufValue(&newbuf)); Eprint("%s: `%s'", GetErr(E_REDEF_BUILTIN_FUNC), DBufValue(&newbuf));
DBufFree(&oldbuf); DBufFree(&oldbuf);
DBufFree(&newbuf); DBufFree(&newbuf);
return E_REDEF_FUNC; return E_REDEF_BUILTIN_FUNC;
} }
if (FindBuiltinFunc(DBufValue(&oldbuf))) { if (FindBuiltinFunc(DBufValue(&oldbuf))) {
Eprint("%s: `%s'", GetErr(E_REDEF_FUNC), DBufValue(&oldbuf)); Eprint("%s: `%s'", GetErr(E_REDEF_BUILTIN_FUNC), DBufValue(&oldbuf));
DBufFree(&oldbuf); DBufFree(&oldbuf);
DBufFree(&newbuf); DBufFree(&newbuf);
return E_REDEF_FUNC; return E_REDEF_BUILTIN_FUNC;
} }
RenameUserFunc(DBufValue(&oldbuf), DBufValue(&newbuf)); RenameUserFunc(DBufValue(&oldbuf), DBufValue(&newbuf));
DBufFree(&oldbuf); DBufFree(&oldbuf);
@@ -288,23 +288,29 @@ int DoFset(ParsePtr p)
nonconst_debug(0, tr("Function definition considered non-constant because of context")); nonconst_debug(0, tr("Function definition considered non-constant because of context"));
func->is_constant = 0; func->is_constant = 0;
} }
StrnCpy(func->name, DBufValue(&buf), VAR_NAME_LEN);
DBufFree(&buf);
if (!Hush) {
if (FindBuiltinFunc(func->name)) {
if (warning_level("03.00.04")) {
Eprint("%s: `%s'", GetErr(E_REDEF_FUNC), func->name);
}
}
}
func->node = NULL; func->node = NULL;
func->nargs = 0; func->nargs = 0;
func->args = NULL; func->args = NULL;
StrnCpy(func->name, DBufValue(&buf), VAR_NAME_LEN);
DBufFree(&buf);
if (FindBuiltinFunc(func->name)) {
if (!Hush) {
if (warning_level("03.00.04")) {
Eprint("%s: `%s'", GetErr(E_REDEF_BUILTIN_FUNC), func->name);
}
}
DestroyUserFunc(func);
return E_REDEF_BUILTIN_FUNC;
}
/* Get the local variables */ /* Get the local variables */
c=ParseNonSpaceChar(p, &r, 1); c=ParseNonSpaceChar(p, &r, 1);
if (r) return r; if (r) {
DestroyUserFunc(func);
return r;
}
if (c == ')') { if (c == ')') {
(void) ParseNonSpaceChar(p, &r, 0); (void) ParseNonSpaceChar(p, &r, 0);
} else { } else {
@@ -449,6 +455,13 @@ static void DestroyUserFunc(UserFunc *f)
/***************************************************************/ /***************************************************************/
static void FUnset(char const *name) static void FUnset(char const *name)
{ {
if (!Hush) {
if (FindBuiltinFunc(name)) {
if (warning_level("06.02.06")) {
Eprint("%s: `%s'", GetErr(E_UNSET_BUILTIN_FUNC), name);
}
}
}
UserFunc *f = FindUserFunc(name); UserFunc *f = FindUserFunc(name);
if (f) { if (f) {
hash_table_delete(&FuncHash, f); hash_table_delete(&FuncHash, f);
@@ -715,6 +728,16 @@ int PushUserFuncs(ParsePtr p)
return E_BAD_ID; return E_BAD_ID;
} }
if (FindBuiltinFunc(name)) {
if (!Hush) {
if (warning_level("06.02.06")) {
Eprint("%s: `%s'", GetErr(E_PUSH_BUILTIN_FUNC), name);
FreshLine = 1;
}
}
DBufFree(&buf);
continue;
}
r = add_func_to_push(name, pf); r = add_func_to_push(name, pf);
DBufFree(&buf); DBufFree(&buf);
+7
View File
@@ -850,6 +850,9 @@ int DoDump(ParsePtr p)
else { else {
fprintf(ErrFp, "%s ", v->name); fprintf(ErrFp, "%s ", v->name);
PrintValue(&(v->v), ErrFp); PrintValue(&(v->v), ErrFp);
if (v->preserve) {
fprintf(ErrFp, " <preserved>");
}
if (dump_constness) { if (dump_constness) {
if (v->is_constant) { if (v->is_constant) {
fprintf(ErrFp, " <const>"); fprintf(ErrFp, " <const>");
@@ -885,6 +888,9 @@ void DumpVarTable(int dump_constness)
hash_table_for_each(v, &VHashTbl) { hash_table_for_each(v, &VHashTbl) {
fprintf(ErrFp, "%s ", v->name); fprintf(ErrFp, "%s ", v->name);
PrintValue(&(v->v), ErrFp); PrintValue(&(v->v), ErrFp);
if (v->preserve) {
fprintf(ErrFp, " <preserved>");
}
if (dump_constness) { if (dump_constness) {
if (v->is_constant) { if (v->is_constant) {
fprintf(ErrFp, " <const>"); fprintf(ErrFp, " <const>");
@@ -1098,6 +1104,7 @@ static SysVar SysVarArr[] = {
{"Pm", 1, TRANS_TYPE, "pm", 0, 0 }, {"Pm", 1, TRANS_TYPE, "pm", 0, 0 },
{"PrefixLineNo", 0, INT_TYPE, &DoPrefixLineNo, 0, 0 }, {"PrefixLineNo", 0, INT_TYPE, &DoPrefixLineNo, 0, 0 },
{"PSCal", 0, INT_TYPE, &PsCal, 0, 0 }, {"PSCal", 0, INT_TYPE, &PsCal, 0, 0 },
{"Repeat", 0, INT_TYPE, &OrigIterations, 0, 0 },
{"RunOff", 0, INT_TYPE, &RunDisabled, 0, 0 }, {"RunOff", 0, INT_TYPE, &RunDisabled, 0, 0 },
{"Saturday", 1, TRANS_TYPE, "Saturday", 0, 0 }, {"Saturday", 1, TRANS_TYPE, "Saturday", 0, 0 },
{"September", 1, TRANS_TYPE, "September", 0, 0 }, {"September", 1, TRANS_TYPE, "September", 0, 0 },
+1
View File
@@ -184,6 +184,7 @@ Hohl
Hplu Hplu
Hurray Hurray
HushMode HushMode
ICS
IFTRIG IFTRIG
IFs IFs
IIF IIF
+3 -3
View File
@@ -59,11 +59,11 @@ OMIT 2 Jan 1992
# Complicated expressions # Complicated expressions
SET a 3 SET a 3
FSET const(x) x+3 FSET is_const(x) x+3
FSET not_const(x) x+nonconst(a) FSET not_const(x) x+nonconst(a)
REM [const(5)] Jan 1992 MSG expired... should be commented out REM [is_const(5)] Jan 1992 MSG expired... should be commented out
REM [const(a)] Jan 1992 MSG expired... should be commented out REM [is_const(a)] Jan 1992 MSG expired... should be commented out
REM [not_const(5)] Jan 1992 MSG nonconstant expression REM [not_const(5)] Jan 1992 MSG nonconstant expression
REM [value("a")] Jan 1992 MSG constant expression REM [value("a")] Jan 1992 MSG constant expression
REM [value("__cabbage", 1)] Jan 1992 MSG non-constant expression REM [value("__cabbage", 1)] Jan 1992 MSG non-constant expression
+11
View File
@@ -994,6 +994,17 @@ $REMIND -pp ../tests/shaded.rem 2026-02-01 >> $OUT 2>&1
$REMIND ../tests/test-pushpop1.rem 2026-01-01 >> $OUT 2>&1 $REMIND ../tests/test-pushpop1.rem 2026-01-01 >> $OUT 2>&1
$REMIND -dp ../tests/test-pushpop1.rem 2026-01-01 >> $OUT 2>&1 $REMIND -dp ../tests/test-pushpop1.rem 2026-01-01 >> $OUT 2>&1
# Test the '@trigger" command-line parameter
echo "REM MSG %y-%t-%r" | $REMIND --test - '@13 SATISFY [$Tw == 5]' >> $OUT 2>&1
echo "REM MSG %y-%t-%r" | $REMIND --test - '@January' >> $OUT 2>&1
echo "REM MSG %y-%t-%r" | $REMIND --test - '@Dec SATISFY [$Tw == 6]' >> $OUT 2>&1
echo "REM MSG %y-%t-%r" | $REMIND --test - '@Dec 1990' >> $OUT 2>&1
echo "REM MSG %y-%t-%r" | $REMIND - 2026-08-01 '@13 SATISFY [$Tw == 5]' >> $OUT 2>&1
echo "REM MSG %y-%t-%r" | $REMIND - 2026-08-01 '@January' >> $OUT 2>&1
echo "REM MSG %y-%t-%r" | $REMIND - 2026-08-01 '@Dec SATISFY [$Tw == 6]' >> $OUT 2>&1
echo "REM MSG %y-%t-%r" | $REMIND - 2026-08-01 '@Dec 1990' >> $OUT 2>&1
cmp -s $OUT $CMP cmp -s $OUT $CMP
if [ "$?" = "0" ]; then if [ "$?" = "0" ]; then
echo "Remind: Acceptance tests ${GRN}PASSED${NRM}" echo "Remind: Acceptance tests ${GRN}PASSED${NRM}"
+59 -16
View File
@@ -1046,7 +1046,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() => "06.02.05" version() => "06.02.06"
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"
@@ -2609,7 +2609,7 @@ a056 "SDFJHSDF KSJDFH KJSDFH KSJDFH"
a007 "1991-02-16" a007 "1991-02-16"
a057 "SDFJHSDF KSJDFH KJSDFH KSJDFH" a057 "SDFJHSDF KSJDFH KJSDFH KSJDFH"
a008 "11:44" a008 "11:44"
a058 "06.02.05" a058 "06.02.06"
a059 "Saturday" a059 "Saturday"
a010 12 a010 12
a060 6 a060 6
@@ -5563,8 +5563,8 @@ REM SATISFY ""
REM SATISFY [version() > "01.00.00"] REM SATISFY [version() > "01.00.00"]
../tests/test.rem(1074): SATISFY: expression has no reference to trigdate() or $T... ../tests/test.rem(1074): SATISFY: expression has no reference to trigdate() or $T...
../tests/test.rem(1074): Trig = Saturday, 16 February, 1991 ../tests/test.rem(1074): Trig = Saturday, 16 February, 1991
version() => "06.02.05" version() => "06.02.06"
"06.02.05" > "01.00.00" => 1 "06.02.06" > "01.00.00" => 1
../tests/test.rem(1074): Trig(satisfied) = Saturday, 16 February, 1991 ../tests/test.rem(1074): 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(1075): SATISFY: expression has no reference to trigdate() or $T... ../tests/test.rem(1075): SATISFY: expression has no reference to trigdate() or $T...
@@ -16771,13 +16771,16 @@ mbupper("öÖçÇéôñÑÉÊ") => "ÖÖÇÇÉÔÑÑÉÊ"
mblower("öÖçÇéôñÑÉÊ") => "ööççéôññéê" mblower("öÖçÇéôñÑÉÊ") => "ööççéôññéê"
upper("öÖçÇéôñÑÉÊ") => "öÖçÇéôñÑÉÊ" upper("öÖçÇéôñÑÉÊ") => "öÖçÇéôñÑÉÊ"
lower("öÖçÇéôñÑÉÊ") => "öÖçÇéôñÑÉÊ" lower("öÖçÇéôñÑÉÊ") => "öÖçÇéôñÑÉÊ"
DynBuf Mallocs: 1132 mallocs; 31873408 bytes ../tests/test.rem(1915): Attempt to redefine built-in function: `max'
../tests/test.rem(1916): Attempt to unset built-in function: `max'
../tests/test.rem(1917): Attempt to PUSH built-in function: `max'
DynBuf Mallocs: 1134 mallocs; 31873536 bytes
Variable hash table statistics: Variable hash table statistics:
Entries: 100146; Buckets: 87719; Non-empty Buckets: 66303 Entries: 100146; Buckets: 87719; Non-empty Buckets: 66303
Maxlen: 5; Minlen: 0; Avglen: 1.142; Stddev: 0.878; Avg nonempty len: 1.510 Maxlen: 5; Minlen: 0; Avglen: 1.142; Stddev: 0.878; Avg nonempty len: 1.510
Growths: 13; Shrinks: 0 Growths: 13; Shrinks: 0
Function hash table statistics: Function hash table statistics:
Entries: 100023; Buckets: 87719; Non-empty Buckets: 63576 Entries: 100022; Buckets: 87719; Non-empty Buckets: 63575
Maxlen: 5; Minlen: 0; Avglen: 1.140; Stddev: 0.934; Avg nonempty len: 1.573 Maxlen: 5; Minlen: 0; Avglen: 1.140; Stddev: 0.934; Avg nonempty len: 1.573
Growths: 13; Shrinks: 0 Growths: 13; Shrinks: 0
Dedupe hash table statistics: Dedupe hash table statistics:
@@ -16789,7 +16792,7 @@ Translation hash table statistics:
Maxlen: 1; Minlen: 0; Avglen: 0.143; Stddev: 0.350; Avg nonempty len: 1.000 Maxlen: 1; Minlen: 0; Avglen: 0.143; Stddev: 0.350; Avg nonempty len: 1.000
Growths: 0; Shrinks: 0 Growths: 0; Shrinks: 0
Expression nodes allocated: 302080 Expression nodes allocated: 302080
Expression nodes high-water: 302076 Expression nodes high-water: 302075
Expression nodes leaked: 0 Expression nodes leaked: 0
Parse level high-water: 34 Parse level high-water: 34
Max expr node evaluations per line: 2001 Max expr node evaluations per line: 2001
@@ -20507,7 +20510,6 @@ Timed
Untimed Untimed
Purge Test Purge Test
../tests/purge_dir/f3.rem(62): Attempt to redefine built-in function: `const'
../tests/purge_dir/f3.rem(76): `/': Division by zero ../tests/purge_dir/f3.rem(76): `/': Division by zero
../tests/purge_dir/f3.rem(76): `/': Division by zero ../tests/purge_dir/f3.rem(76): `/': Division by zero
F1 F1
@@ -20603,13 +20605,13 @@ OMIT 2 Jan 1992
# Complicated expressions # Complicated expressions
SET a 3 SET a 3
FSET const(x) x+3 FSET is_const(x) x+3
FSET not_const(x) x+nonconst(a) FSET not_const(x) x+nonconst(a)
#!P: Next line has expired, but contains expression... please verify #!P: Next line has expired, but contains expression... please verify
#!P: Expired: REM [const(5)] Jan 1992 MSG expired... should be commented out #!P: Expired: REM [is_const(5)] Jan 1992 MSG expired... should be commented out
#!P: Next line has expired, but contains expression... please verify #!P: Next line has expired, but contains expression... please verify
#!P: Expired: REM [const(a)] Jan 1992 MSG expired... should be commented out #!P: Expired: REM [is_const(a)] Jan 1992 MSG expired... should be commented out
#!P: Next line may have expired, but contains non-constant expression #!P: Next line may have expired, but contains non-constant expression
#!P: or a relative SCANFROM clause #!P: or a relative SCANFROM clause
REM [not_const(5)] Jan 1992 MSG nonconstant expression REM [not_const(5)] Jan 1992 MSG nonconstant expression
@@ -20727,11 +20729,11 @@ OMIT 2 Jan 1992
# Complicated expressions # Complicated expressions
SET a 3 SET a 3
FSET const(x) x+3 FSET is_const(x) x+3
FSET not_const(x) x+nonconst(a) FSET not_const(x) x+nonconst(a)
#!P: Expired: REM [const(5)] Jan 1992 MSG expired... should be commented out #!P: Expired: REM [is_const(5)] Jan 1992 MSG expired... should be commented out
#!P: Expired: REM [const(a)] Jan 1992 MSG expired... should be commented out #!P: Expired: REM [is_const(a)] Jan 1992 MSG expired... should be commented out
REM [not_const(5)] Jan 1992 MSG nonconstant expression REM [not_const(5)] Jan 1992 MSG nonconstant expression
#!P: Expired: REM [value("a")] Jan 1992 MSG constant expression #!P: Expired: REM [value("a")] Jan 1992 MSG constant expression
REM [value("__cabbage", 1)] Jan 1992 MSG non-constant expression REM [value("__cabbage", 1)] Jan 1992 MSG non-constant expression
@@ -23831,7 +23833,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
06.02.05 06.02.06
Enabling test mode: This is meant for the acceptance test. Enabling test mode: This is meant for the acceptance test.
Do not use --test in production. Do not use --test in production.
In test mode, the system time is fixed at 2025-01-06@19:00 In test mode, the system time is fixed at 2025-01-06@19:00
@@ -23994,7 +23996,7 @@ No bug
Variable Value Variable Value
foo 0 foo 0 <preserved>
No reminders. No reminders.
Variable Value Variable Value
@@ -24948,6 +24950,7 @@ $ParseUntriggered
$Pm $Pm
$PrefixLineNo $PrefixLineNo
$PSCal $PSCal
$Repeat
$RunOff $RunOff
$Saturday $Saturday
$September $September
@@ -25200,6 +25203,8 @@ TRANSLATE "Maximum expression complexity exceeded" ""
TRANSLATE "Expecting operator or end-of-expression" "" TRANSLATE "Expecting operator or end-of-expression" ""
TRANSLATE "Expecting constant, variable, function call or (expression)" "" TRANSLATE "Expecting constant, variable, function call or (expression)" ""
TRANSLATE "Invalid value for system variable" "" TRANSLATE "Invalid value for system variable" ""
TRANSLATE "Attempt to unset built-in function" ""
TRANSLATE "Attempt to PUSH built-in function" ""
# Other Messages # Other Messages
TRANSLATE "%s function `%s' defined at %s(%s) does not use its argument" "" TRANSLATE "%s function `%s' defined at %s(%s) does not use its argument" ""
@@ -40278,3 +40283,41 @@ No reminders.
../tests/test-pushpop2.rem(2): POP-FUNCS at ../tests/test-pushpop2.rem:2 matches PUSH-FUNCS in different file: ../tests/test-pushpop1.rem:2 ../tests/test-pushpop2.rem(2): POP-FUNCS at ../tests/test-pushpop2.rem:2 matches PUSH-FUNCS in different file: ../tests/test-pushpop1.rem:2
../tests/test-pushpop2.rem(3): POP-OMIT-CONTEXT at ../tests/test-pushpop2.rem:3 matches PUSH-OMIT-CONTEXT in different file: ../tests/test-pushpop1.rem:1 ../tests/test-pushpop2.rem(3): POP-OMIT-CONTEXT at ../tests/test-pushpop2.rem:3 matches PUSH-OMIT-CONTEXT in different file: ../tests/test-pushpop1.rem:1
No reminders. No reminders.
Enabling test mode: This is meant for the acceptance test.
Do not use --test in production.
In test mode, the system time is fixed at 2025-01-06@19:00
Reminders for Friday, 13th June, 2025:
2025-06-13
Enabling test mode: This is meant for the acceptance test.
Do not use --test in production.
In test mode, the system time is fixed at 2025-01-06@19:00
Reminders for Monday, 6th January, 2025 (today):
2025-01-06
Enabling test mode: This is meant for the acceptance test.
Do not use --test in production.
In test mode, the system time is fixed at 2025-01-06@19:00
Reminders for Saturday, 6th December, 2025:
2025-12-06
Enabling test mode: This is meant for the acceptance test.
Do not use --test in production.
In test mode, the system time is fixed at 2025-01-06@19:00
Could not evaluate command-line trigger: Can't compute trigger
Reminders for Friday, 13th November, 2026:
2026-11-13
Reminders for Friday, 1st January, 2027:
2027-01-01
Reminders for Saturday, 5th December, 2026:
2026-12-05
Could not evaluate command-line trigger: Can't compute trigger
+6
View File
@@ -1911,6 +1911,12 @@ SET a upper("öÖçÇéôñÑÉÊ")
SET a lower("öÖçÇéôñÑÉÊ") SET a lower("öÖçÇéôñÑÉÊ")
DEBUG -x DEBUG -x
# Warnings about defining/unsetting/pushing built-in functions
FSET max(x) x*2
FUNSET max
PUSH-FUNCS max a b c
POP-FUNCS
# Don't want Remind to queue reminders # Don't want Remind to queue reminders
EXIT EXIT