Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package remind for openSUSE:Factory checked 
in at 2025-07-25 17:06:37
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/remind (Old)
 and      /work/SRC/openSUSE:Factory/.remind.new.13279 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "remind"

Fri Jul 25 17:06:37 2025 rev:58 rq:1295703 version:5.4.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/remind/remind.changes    2025-06-24 
20:48:28.750638394 +0200
+++ /work/SRC/openSUSE:Factory/.remind.new.13279/remind.changes 2025-07-25 
17:07:23.630435383 +0200
@@ -1,0 +2,24 @@
+Fri Jul 18 08:07:35 UTC 2025 - Detlef Steuer <detlef.ste...@gmx.de>
+
+- VERSION 5.4 Patch 2 - 2025-07-16
+
+- MINOR CHANGE: remind: Allow daysinmon() to take a DATE or DATETIME
+  argument.
+
+- MINOR CHANGE: remind: All functions that want an integer month number
+  will now also accept a string naming the month.
+
+= UPDATE: include/holidays/chinese-new-year.rem: Add dates for Chinese
+  New Year for 2051 through 2100.
+
+- BUG FIX: remind: Set trigdate() correctly for a fully-specified
+  date, even if it's in the past, as the manual documented.  Bug
+  found by Tim Chase.
+
+- DOCUMENTATION FIX: rem2html: Document the correct Perl module
+  prerequisites.
+
+- CODE FIXES: remind: Various minor improvements to the code with
+  no user-visible changes. 
+
+-------------------------------------------------------------------

Old:
----
  remind-05.04.01.tar.gz

New:
----
  remind-05.04.02.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ remind.spec ++++++
--- /var/tmp/diff_new_pack.ob2GBD/_old  2025-07-25 17:07:25.550514935 +0200
+++ /var/tmp/diff_new_pack.ob2GBD/_new  2025-07-25 17:07:25.570515764 +0200
@@ -17,9 +17,9 @@
 
 
 Name:           remind
-Version:        5.4.1
+Version:        5.4.2
 Release:        0
-%define tar_version 05.04.01
+%define tar_version 05.04.02
 Summary:        A sophisticated calendar and alarm program
 License:        GPL-2.0-only
 Group:          Productivity/Office/Organizers

++++++ remind-05.04.01.tar.gz -> remind-05.04.02.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/remind-05.04.01/NOTE-ABOUT-AI.txt 
new/remind-05.04.02/NOTE-ABOUT-AI.txt
--- old/remind-05.04.01/NOTE-ABOUT-AI.txt       2025-06-15 15:29:36.000000000 
+0200
+++ new/remind-05.04.02/NOTE-ABOUT-AI.txt       1970-01-01 01:00:00.000000000 
+0100
@@ -1,28 +0,0 @@
-Some Notes about AI/LLMs/GPTs/etc.
-==================================
-
-1) No part of Remind was written using AI of any type.
-
-I certify that all of the C, Perl and Tcl code in Remind was written
-by a human being.  I certify that all code in .rem files other than
-ones under include/holidays was written by a human being.  The code
-under include/holidays was derived from the Python "holidays" library
-and I have no direct knowledge of the provenance of that library,
-though I suspect it's entirely or almost entirely human-written.
-
-I certify that all of the man pages and other documentation that
-ship with Remind were human-written and not generated with any sort
-of AI.
-
-2) No AI-generated patches or other sorts of contributions to Remind
-will be accepted.
-
-3) Remind's source code may not be used to train an AI model,
-including an LLM model, unless all of the output of said model is
-released under the GNU General Public License, version 2.  If you use
-any of Remind's source code to train your model, then anything that
-the model produces is a derived product of Remind and must be licensed
-under the same terms as Remind.
-
---
-Dianne Skoll
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/remind-05.04.01/README.md 
new/remind-05.04.02/README.md
--- old/remind-05.04.01/README.md       2025-06-15 15:29:36.000000000 +0200
+++ new/remind-05.04.02/README.md       2025-07-16 17:07:43.000000000 +0200
@@ -68,6 +68,26 @@
 I made a while back.  There's also a (long) [YouTube 
video](https://www.youtube.com/watch?v=0SNgvsDvx7M) that serves as an
 introduction to Remind.
 
+## A Note about AI
+
+1. No part of Remind was written using AI of any type.<br><br>
+I certify that all of the C, Perl and Tcl code in Remind was written
+by a human being.  I certify that all code in `.rem` files other than
+ones under `include/holidays` was written by a human being.  The code
+under `include/holidays` was derived from the Python "holidays" library
+and I have no direct knowledge of the provenance of that library,
+though I suspect it's entirely or almost entirely human-written.
+
+2. No AI-generated patches or other sorts of contributions to Remind
+will be accepted.
+
+3. Remind's source code may not be used to train an AI model,
+including an LLM model, unless all of the output of said model is
+released under the GNU General Public License, version 2.  If you use
+any of Remind's source code to train your model, then anything that
+the model produces is a derived product of Remind and must be licensed
+under the same terms as Remind.
+
 ---
 
 Contact info: dia...@skoll.ca
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/remind-05.04.01/configure 
new/remind-05.04.02/configure
--- old/remind-05.04.01/configure       2025-06-15 15:29:36.000000000 +0200
+++ new/remind-05.04.02/configure       2025-07-16 17:07:43.000000000 +0200
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for remind 05.04.01.
+# Generated by GNU Autoconf 2.71 for remind 05.04.02.
 #
 #
 # Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
@@ -608,8 +608,8 @@
 # Identity of this package.
 PACKAGE_NAME='remind'
 PACKAGE_TARNAME='remind'
-PACKAGE_VERSION='05.04.01'
-PACKAGE_STRING='remind 05.04.01'
+PACKAGE_VERSION='05.04.02'
+PACKAGE_STRING='remind 05.04.02'
 PACKAGE_BUGREPORT=''
 PACKAGE_URL='https://dianne.skoll.ca/projects/remind/'
 
@@ -1265,7 +1265,7 @@
   # 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.
   cat <<_ACEOF
-\`configure' configures remind 05.04.01 to adapt to many kinds of systems.
+\`configure' configures remind 05.04.02 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1327,7 +1327,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of remind 05.04.01:";;
+     short | recursive ) echo "Configuration of remind 05.04.02:";;
    esac
   cat <<\_ACEOF
 
@@ -1415,7 +1415,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-remind configure 05.04.01
+remind configure 05.04.02
 generated by GNU Autoconf 2.71
 
 Copyright (C) 2021 Free Software Foundation, Inc.
@@ -1865,7 +1865,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by remind $as_me 05.04.01, which was
+It was created by remind $as_me 05.04.02, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -4710,7 +4710,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by remind $as_me 05.04.01, which was
+This file was extended by remind $as_me 05.04.02, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -4775,7 +4775,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-remind config.status 05.04.01
+remind config.status 05.04.02
 configured by $0, generated by GNU Autoconf 2.71,
   with options \\"\$ac_cs_config\\"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/remind-05.04.01/configure.ac 
new/remind-05.04.02/configure.ac
--- old/remind-05.04.01/configure.ac    2025-06-15 15:29:36.000000000 +0200
+++ new/remind-05.04.02/configure.ac    2025-07-16 17:07:43.000000000 +0200
@@ -1,6 +1,6 @@
 dnl Process this file with autoconf to produce a configure script.
 
-AC_INIT(remind, 05.04.01, , , https://dianne.skoll.ca/projects/remind/)
+AC_INIT(remind, 05.04.02, , , https://dianne.skoll.ca/projects/remind/)
 AC_CONFIG_SRCDIR([src/queue.c])
 
 cat <<'EOF'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/remind-05.04.01/docs/WHATSNEW 
new/remind-05.04.02/docs/WHATSNEW
--- old/remind-05.04.01/docs/WHATSNEW   2025-06-15 15:29:36.000000000 +0200
+++ new/remind-05.04.02/docs/WHATSNEW   2025-07-16 17:07:43.000000000 +0200
@@ -1,5 +1,26 @@
 CHANGES TO REMIND
 
+* VERSION 5,4 Patch 2 - 2025-07-16
+
+- MINOR CHANGE: remind: Allow daysinmon() to take a DATE or DATETIME
+  argument.
+
+- MINOR CHANGE: remind: All functions that want an integer month number
+  will now also accept a string naming the month.
+
+= UPDATE: include/holidays/chinese-new-year.rem: Add dates for Chinese
+  New Year for 2051 through 2100.
+
+- BUG FIX: remind: Set trigdate() correctly for a fully-specified
+  date, even if it's in the past, as the manual documnented.  Bug
+  found by Tim Chase.
+
+- DOCUMENTATION FIX: rem2html: Document the correct Perl module
+  prerequisites.
+
+- CODE FIXES: remind: Various minor improvements to the code with
+  no user-visible changes.
+
 * VERSION 5.4 Patch 1 - 2025-06-15
 
 - MAJOR BUG FIX: remind: In some circumstances, a REM command could
@@ -1528,10 +1549,10 @@
 - NEW FEATURE: Add "-u+username" variant to tell Remind to switch users to
   "username" without disabling RUN directives.  Idea courtesy of Ian! D. Allen
 
-- CHANGE: rem2html: rem2html has been moved out of the www/ directory into
-  its own rem2html/ directory.  If your system has the prerequisites
-  (namely Perl, Getopt::Long and JSON::Any) then rem2html will be installed
-  by "make install".
+- CHANGE: rem2html: rem2html has been moved out of the www/ directory
+  into its own rem2html/ directory.  If your system has the
+  prerequisites (namely Perl, Getopt::Long and JSON::MaybeXS) then
+  rem2html will be installed by "make install".
 
 - CHANGE: Remove "cm2rem".  It was about 20 years obsolete.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/remind-05.04.01/include/holidays/chinese-new-year.rem 
new/remind-05.04.02/include/holidays/chinese-new-year.rem
--- old/remind-05.04.01/include/holidays/chinese-new-year.rem   2025-06-15 
15:29:36.000000000 +0200
+++ new/remind-05.04.02/include/holidays/chinese-new-year.rem   2025-07-16 
17:07:43.000000000 +0200
@@ -28,3 +28,53 @@
 REM 14 Feb 2048 INFO "Url: https://en.wikipedia.org/wiki/Dragon_(zodiac)"  MSG 
%(Chinese New Year) (%(Dragon))
 REM  2 Feb 2049 INFO "Url: https://en.wikipedia.org/wiki/Snake_(zodiac)"   MSG 
%(Chinese New Year) (%(Snake))
 REM 23 Jan 2050 INFO "Url: https://en.wikipedia.org/wiki/Horse_(zodiac)"   MSG 
%(Chinese New Year) (%(Horse))
+REM 11 Feb 2051 INFO "Url: https://en.wikipedia.org/wiki/Goat_(zodiac)"    MSG 
%(Chinese New Year) (%(Goat))
+REM  1 Feb 2052 INFO "Url: https://en.wikipedia.org/wiki/Monkey_(zodiac)"  MSG 
%(Chinese New Year) (%(Monkey))
+REM 19 Feb 2053 INFO "Url: https://en.wikipedia.org/wiki/Rooster_(zodiac)" MSG 
%(Chinese New Year) (%(Rooster))
+REM  8 Feb 2054 INFO "Url: https://en.wikipedia.org/wiki/Dog_(zodiac)"     MSG 
%(Chinese New Year) (%(Dog))
+REM 28 Jan 2055 INFO "Url: https://en.wikipedia.org/wiki/Pig_(zodiac)"     MSG 
%(Chinese New Year) (%(Pig))
+REM 15 Feb 2056 INFO "Url: https://en.wikipedia.org/wiki/Rat_(zodiac)"     MSG 
%(Chinese New Year) (%(Rat))
+REM  4 Feb 2057 INFO "Url: https://en.wikipedia.org/wiki/Ox_(zodiac)"      MSG 
%(Chinese New Year) (%(Ox))
+REM 24 Jan 2058 INFO "Url: https://en.wikipedia.org/wiki/Tiger_(zodiac)"   MSG 
%(Chinese New Year) (%(Tiger))
+REM 12 Feb 2059 INFO "Url: https://en.wikipedia.org/wiki/Rabbit_(zodiac)"  MSG 
%(Chinese New Year) (%(Rabbit))
+REM  2 Feb 2060 INFO "Url: https://en.wikipedia.org/wiki/Dragon_(zodiac)"  MSG 
%(Chinese New Year) (%(Dragon))
+REM 21 Jan 2061 INFO "Url: https://en.wikipedia.org/wiki/Snake_(zodiac)"   MSG 
%(Chinese New Year) (%(Snake))
+REM  9 Feb 2062 INFO "Url: https://en.wikipedia.org/wiki/Horse_(zodiac)"   MSG 
%(Chinese New Year) (%(Horse))
+REM 29 Jan 2063 INFO "Url: https://en.wikipedia.org/wiki/Goat_(zodiac)"    MSG 
%(Chinese New Year) (%(Goat))
+REM 17 Feb 2064 INFO "Url: https://en.wikipedia.org/wiki/Monkey_(zodiac)"  MSG 
%(Chinese New Year) (%(Monkey))
+REM  5 Feb 2065 INFO "Url: https://en.wikipedia.org/wiki/Rooster_(zodiac)" MSG 
%(Chinese New Year) (%(Rooster))
+REM 26 Jan 2066 INFO "Url: https://en.wikipedia.org/wiki/Dog_(zodiac)"     MSG 
%(Chinese New Year) (%(Dog))
+REM 14 Feb 2067 INFO "Url: https://en.wikipedia.org/wiki/Pig_(zodiac)"     MSG 
%(Chinese New Year) (%(Pig))
+REM  3 Feb 2068 INFO "Url: https://en.wikipedia.org/wiki/Rat_(zodiac)"     MSG 
%(Chinese New Year) (%(Rat))
+REM 23 Jan 2069 INFO "Url: https://en.wikipedia.org/wiki/Ox_(zodiac)"      MSG 
%(Chinese New Year) (%(Ox))
+REM 11 Feb 2070 INFO "Url: https://en.wikipedia.org/wiki/Tiger_(zodiac)"   MSG 
%(Chinese New Year) (%(Tiger))
+REM 31 Jan 2071 INFO "Url: https://en.wikipedia.org/wiki/Rabbit_(zodiac)"  MSG 
%(Chinese New Year) (%(Rabbit))
+REM 19 Feb 2072 INFO "Url: https://en.wikipedia.org/wiki/Dragon_(zodiac)"  MSG 
%(Chinese New Year) (%(Dragon))
+REM  7 Feb 2073 INFO "Url: https://en.wikipedia.org/wiki/Snake_(zodiac)"   MSG 
%(Chinese New Year) (%(Snake))
+REM 27 Jan 2074 INFO "Url: https://en.wikipedia.org/wiki/Horse_(zodiac)"   MSG 
%(Chinese New Year) (%(Horse))
+REM 15 Feb 2075 INFO "Url: https://en.wikipedia.org/wiki/Goat_(zodiac)"    MSG 
%(Chinese New Year) (%(Goat))
+REM  5 Feb 2076 INFO "Url: https://en.wikipedia.org/wiki/Monkey_(zodiac)"  MSG 
%(Chinese New Year) (%(Monkey))
+REM 24 Jan 2077 INFO "Url: https://en.wikipedia.org/wiki/Rooster_(zodiac)" MSG 
%(Chinese New Year) (%(Rooster))
+REM 12 Feb 2078 INFO "Url: https://en.wikipedia.org/wiki/Dog_(zodiac)"     MSG 
%(Chinese New Year) (%(Dog))
+REM  2 Feb 2079 INFO "Url: https://en.wikipedia.org/wiki/Pig_(zodiac)"     MSG 
%(Chinese New Year) (%(Pig))
+REM 22 Jan 2080 INFO "Url: https://en.wikipedia.org/wiki/Rat_(zodiac)"     MSG 
%(Chinese New Year) (%(Rat))
+REM  9 Feb 2081 INFO "Url: https://en.wikipedia.org/wiki/Ox_(zodiac)"      MSG 
%(Chinese New Year) (%(Ox))
+REM 29 Jan 2082 INFO "Url: https://en.wikipedia.org/wiki/Tiger_(zodiac)"   MSG 
%(Chinese New Year) (%(Tiger))
+REM 17 Feb 2083 INFO "Url: https://en.wikipedia.org/wiki/Rabbit_(zodiac)"  MSG 
%(Chinese New Year) (%(Rabbit))
+REM  6 Feb 2084 INFO "Url: https://en.wikipedia.org/wiki/Dragon_(zodiac)"  MSG 
%(Chinese New Year) (%(Dragon))
+REM 26 Jan 2085 INFO "Url: https://en.wikipedia.org/wiki/Snake_(zodiac)"   MSG 
%(Chinese New Year) (%(Snake))
+REM 14 Feb 2086 INFO "Url: https://en.wikipedia.org/wiki/Horse_(zodiac)"   MSG 
%(Chinese New Year) (%(Horse))
+REM  3 Feb 2087 INFO "Url: https://en.wikipedia.org/wiki/Goat_(zodiac)"    MSG 
%(Chinese New Year) (%(Goat))
+REM 24 Jan 2088 INFO "Url: https://en.wikipedia.org/wiki/Monkey_(zodiac)"  MSG 
%(Chinese New Year) (%(Monkey))
+REM 10 Feb 2089 INFO "Url: https://en.wikipedia.org/wiki/Rooster_(zodiac)" MSG 
%(Chinese New Year) (%(Rooster))
+REM 30 Jan 2090 INFO "Url: https://en.wikipedia.org/wiki/Dog_(zodiac)"     MSG 
%(Chinese New Year) (%(Dog))
+REM 18 Feb 2091 INFO "Url: https://en.wikipedia.org/wiki/Pig_(zodiac)"     MSG 
%(Chinese New Year) (%(Pig))
+REM  7 Feb 2092 INFO "Url: https://en.wikipedia.org/wiki/Rat_(zodiac)"     MSG 
%(Chinese New Year) (%(Rat))
+REM 27 Jan 2093 INFO "Url: https://en.wikipedia.org/wiki/Ox_(zodiac)"      MSG 
%(Chinese New Year) (%(Ox))
+REM 15 Feb 2094 INFO "Url: https://en.wikipedia.org/wiki/Tiger_(zodiac)"   MSG 
%(Chinese New Year) (%(Tiger))
+REM  5 Feb 2095 INFO "Url: https://en.wikipedia.org/wiki/Rabbit_(zodiac)"  MSG 
%(Chinese New Year) (%(Rabbit))
+REM 25 Jan 2096 INFO "Url: https://en.wikipedia.org/wiki/Dragon_(zodiac)"  MSG 
%(Chinese New Year) (%(Dragon))
+REM 12 Feb 2097 INFO "Url: https://en.wikipedia.org/wiki/Snake_(zodiac)"   MSG 
%(Chinese New Year) (%(Snake))
+REM  1 Feb 2098 INFO "Url: https://en.wikipedia.org/wiki/Horse_(zodiac)"   MSG 
%(Chinese New Year) (%(Horse))
+REM 21 Jan 2099 INFO "Url: https://en.wikipedia.org/wiki/Goat_(zodiac)"    MSG 
%(Chinese New Year) (%(Goat))
+REM  9 Feb 2100 INFO "Url: https://en.wikipedia.org/wiki/Monkey_(zodiac)"  MSG 
%(Chinese New Year) (%(Monkey))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/remind-05.04.01/man/remind.1.in 
new/remind-05.04.02/man/remind.1.in
--- old/remind-05.04.01/man/remind.1.in 2025-06-15 15:29:36.000000000 +0200
+++ new/remind-05.04.02/man/remind.1.in 2025-07-16 17:07:43.000000000 +0200
@@ -3431,9 +3431,11 @@
 Returns the current date and time as a DATETIME object.  This may be the
 actual date and time, or may be the date and time supplied on the command line.
 .TP
-.B date(i_y, i_m, i_d)
+.B date(i_y, si_m, i_d)
 The \fBdate()\fR function returns a \fBDATE\fR object with the year,
 month and day components specified by \fIy\fR, \fIm\fR and \fId\fR.
+The month can be specified as an integer from 1 to 12, or a string
+that is the name of a month.
 .TP
 .B datepart(dq_datetime)
 Returns a \fBDATE\fR object representing the date portion of
@@ -3450,11 +3452,13 @@
 must be a DATE and the second and third must be INTs.  The second and
 third arguments are interpreted as hours and minutes and converted to a TIME.
 .PP
-If you supply four arguments, the first three must be INTs, interpreted
-as the year, month and day.  The fourth argument must be a TIME.
+If you supply four arguments, they are interpreted as year, month, day
+and time.  Year and day must be INTs.  Month may be an INT from 0 to 12
+or a string naming a month.  Time must be a TIME.
 .PP
 Finally, if you supply five arguments, they must all be INTs and are
-interpreted as year, month, day, hour and minute.
+interpreted as year, month, day, hour and minute.  (Actually, month
+can also be a string that is the name of a month.)
 .RE
 .TP
 .B dawn([dq_date])
@@ -3467,8 +3471,12 @@
 returns an \fBINT\fR that is the day-of-month component of
 \fIdate\fR.
 .TP
-.B daysinmon(i_m, i_y)
-Returns the number of days in month \fIm\fR (1-12) of the year \fIy\fR.
+.B daysinmon(si_m, i_y)\fR or \fB daysinmon(dq_date)\fR
+Returns the number of days in month \fIm\fR (1-12) of the year
+\fIy\fR.  The first argument can either be an integer from 1 to 12, or
+a string that is the name of a month.  If given a single DATE or
+DATETIME argument, returns the number of days in the month containing
+the argument.
 .TP
 .B defined(s_var)
 Returns 1 if the variable named by \fIvar\fR is defined, or 0 if it is not.
@@ -3774,10 +3782,20 @@
 .B minute(tq_time)
 Returns the minute component of \fItime\fR.
 .TP
-.B mon(dqi_arg)
+.B mon(dqis_arg)
 If \fIarg\fR is of \fBDATE\fR or \fBDATETIME\fR type, returns a string
 that names the month component of the date.  If \fIarg\fR is an
-\fBINT\fR from 1 to 12, returns a string that names the month.
+\fBINT\fR from 1 to 12, returns a string that names the month.  If \fIarg\fR
+is a \fBSTRING\fR, returns the name of the month.  This last case might
+sound silly, but for example:
+.RS
+.PP
+.nf
+             mon("Mar")
+.fi
+.PP
+will return "March", the full name of the month.
+.RE
 .TP
 .B monnum(dq_date)\fR or \fBmonnum(s_str)\fR
 Returns an \fBINT\fR from 1 to 12, representing the month component of
@@ -6773,12 +6791,13 @@
 satisfies the trigger.  In addition, there is one special case in which
 \fBtrigvalid()\fR returns 1 and \fBtrigdate()\fR returns a meaningful result:
 .PP
-If the \fBREM\fR or \fBIFTRIG\fR command did not contain an \fBUNTIL\fR
-clause, and contained all of the \fIday\fR, \fImonth\fR and \fIyear\fR
-components, then \fBRemind\fR will correctly compute a trigger date, even
-if it happens to be before the start of scanning.
-Note that this behaviour is not true for
+If the \fBREM\fR or \fBIFTRIG\fR command did not contain an
+\fBUNTIL\fR or \fBSATISFY\fR clause, and contained all of the
+\fIday\fR, \fImonth\fR and \fIyear\fR components, then \fBRemind\fR
+will correctly compute a trigger date, even if it happens to be before
+the start of scanning.  Note that this behaviour is not true for
 versions of \fBRemind\fR prior to 03.00.01.
+
 .SH FILES
 .PP
 The traditional location of your reminders file or directory is:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/remind-05.04.01/rem2html/README.rem2html 
new/remind-05.04.02/rem2html/README.rem2html
--- old/remind-05.04.01/rem2html/README.rem2html        2025-06-15 
15:29:36.000000000 +0200
+++ new/remind-05.04.02/rem2html/README.rem2html        2025-07-16 
17:07:43.000000000 +0200
@@ -4,7 +4,7 @@
 rem2html is a Perl script that transforms the output of `remind -pp
 ...' to HTML.  Type `perl rem2html --help' for usage information.
 
-rem2html requires the Perl modules `JSON::Any' and `Getopt::Long'.  It
+rem2html requires the Perl modules `JSON::MaybeXS' and `Getopt::Long'.  It
 will not be installed unless you have those modules as well as Perl
 itself.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/remind-05.04.01/src/calendar.c 
new/remind-05.04.02/src/calendar.c
--- old/remind-05.04.01/src/calendar.c  2025-06-15 15:29:36.000000000 +0200
+++ new/remind-05.04.02/src/calendar.c  2025-07-16 17:07:43.000000000 +0200
@@ -757,7 +757,7 @@
 static void
 SetShadeEntry(int dse, char const *shade)
 {
-    int y, m, d;
+    int d;
     int r, g, b;
     /* Don't bother if we're not doing SHADE specials */
     if (!UseBGVTColors) {
@@ -774,7 +774,7 @@
     if (r < 0 || g < 0 || b < 0 || r > 255 || g > 255 || b > 255) {
         return;
     }
-    FromDSE(dse, &y, &m, &d);
+    FromDSE(dse, NULL, NULL, &d);
     bgcolor[d][0] = r;
     bgcolor[d][1] = g;
     bgcolor[d][2] = b;
@@ -784,7 +784,7 @@
 SetMoonEntry(int dse, char const *moon)
 {
     int phase;
-    int y, m, d;
+    int d;
     char msg[28];
 
     /* Don't bother unless it's utf-8 */
@@ -803,7 +803,7 @@
         /* Bad phase */
         return;
     }
-    FromDSE(dse, &y, &m, &d);
+    FromDSE(dse, NULL, NULL, &d);
     if (msg[0]) {
         snprintf(moons[d], sizeof(moons[d]), "%s %s", moonphase_emojis[phase], 
msg);
     } else {
@@ -1476,13 +1476,13 @@
 static int WriteOneCalLine(int start_dse, int wd)
 {
     int done = 1, i;
-    int y, m, d;
+    int d;
 
     gon();
     DRAW(tb);
     goff();
     for (i=0; i<7; i++) {
-        FromDSE(start_dse+i, &y, &m, &d);
+        FromDSE(start_dse+i, NULL, NULL, &d);
         d -= wd;
         if (CalColumn[i]) {
             Backgroundize(ColToDay[i]);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/remind-05.04.01/src/dorem.c 
new/remind-05.04.02/src/dorem.c
--- old/remind-05.04.01/src/dorem.c     2025-06-15 15:29:36.000000000 +0200
+++ new/remind-05.04.02/src/dorem.c     2025-07-16 17:07:43.000000000 +0200
@@ -1554,6 +1554,8 @@
         }
         if (dse == -1) {
             free_expr_tree(sat_node);
+            LastTrigValid = 0;
+            LastTriggerDate = -1;
             return E_EXPIRED;
         }
         r = evaluate_expression(sat_node, NULL, &v, &nonconst);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/remind-05.04.01/src/err.h 
new/remind-05.04.02/src/err.h
--- old/remind-05.04.01/src/err.h       2025-06-15 15:29:36.000000000 +0200
+++ new/remind-05.04.02/src/err.h       2025-07-16 17:07:43.000000000 +0200
@@ -23,11 +23,11 @@
 #define E_MISS_END            1
 #define E_MISS_QUOTE          2
 #define E_OP_STK_OVER         3
-/* #define E_VA_STK_OVER         4 */
+#define E_CANT_PARSE_MONTH    4
 #define E_MISS_RIGHT_PAREN    5
 #define E_UNDEF_FUNC          6
 #define E_ILLEGAL_CHAR        7
-/* #define E_EXPECTING_BINOP     8 */
+#define E_CANT_PARSE_WKDAY    8
 #define E_NO_MEM              9
 #define E_BAD_NUMBER         10
 /* #define E_OP_STK_UNDER       11 */
@@ -151,11 +151,11 @@
 /* E_MISS_END */          "Missing ']'",
 /* E_MISS_QUOTE */        "Missing quote",
 /* E_OP_STK_OVER */       "Expression too complex",
-/* E_VA_STK_OVER */       "",
+/* E_CANT_PARSE_MONTH */  "Invalid month name",
 /* E_MISS_RIGHT_PAREN */  "Missing ')'",
 /* E_UNDEF_FUNC */        "Undefined function",
 /* E_ILLEGAL_CHAR */      "Illegal character",
-/* E_EXPECTING_BINOP */   "Expecting binary operator",
+/* E_CANT_PARSE_WKDAY*/   "Invalid weekday name",
 /* E_NO_MEM */            "Out of memory",
 /* E_BAD_NUMBER */        "Ill-formed number",
 /* E_OP_STK_UNDER */      "",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/remind-05.04.01/src/funcs.c 
new/remind-05.04.02/src/funcs.c
--- old/remind-05.04.01/src/funcs.c     2025-06-15 15:29:36.000000000 +0200
+++ new/remind-05.04.02/src/funcs.c     2025-07-16 17:07:43.000000000 +0200
@@ -231,6 +231,8 @@
 #define HASDATE(x) ((x).type & DATE_TYPE)
 #define HASTIME(x) ((x).type & TIME_TYPE)
 
+#define GETMON(x) get_month(&(ARG(x)))
+
 /* Macro for copying a value while destroying original copy */
 #define DCOPYVAL(x, y) ( (x) = (y), (y).type = ERR_TYPE )
 
@@ -267,7 +269,7 @@
     {   "datetime",     2,      5,      1,          FDateTime, NULL },
     {   "dawn",         0,      1,      0,          FDawn, NULL },
     {   "day",          1,      1,      1,          FDay, NULL },
-    {   "daysinmon",    2,      2,      1,          FDaysinmon, NULL },
+    {   "daysinmon",    1,      2,      1,          FDaysinmon, NULL },
     {   "defined",      1,      1,      0,          FDefined, NULL },
     {   "dosubst",      1,      3,      0,          FDosubst, NULL },
     {   "dusk",         0,      1,      0,          FDusk, NULL },
@@ -378,6 +380,26 @@
 /* Need a variable here - Func[] array not really visible to outside. */
 int NumFuncs = sizeof(Func) / sizeof(BuiltinFunc) ;
 
+static int get_month(Value *v)
+{
+    Token tok;
+
+    if (v->type == INT_TYPE) {
+        if (v->v.val < 1) return -E_2LOW;
+        if (v->v.val > 12) return -E_2HIGH;
+        return v->v.val - 1;
+    }
+    if (v->type == STR_TYPE) {
+        FindToken(v->v.str, &tok);
+        if (tok.type != T_Month) {
+            return -E_CANT_PARSE_MONTH;
+        }
+        return tok.val;
+    }
+    return -E_BAD_TYPE;
+}
+
+
 /***************************************************************/
 /*                                                             */
 /*  RetStrVal                                                  */
@@ -463,29 +485,27 @@
 static int FDate(func_info *info)
 {
     int y, m, d;
-    int ytemp, mtemp, dtemp;
 
     /* Any arg can be a date (in which case we use the corresponding
        component) or an integer */
     if (HASDATE(ARG(0))) {
-        FromDSE(DATEPART(ARG(0)), &ytemp, &mtemp, &dtemp);
-        y = ytemp;
+        FromDSE(DATEPART(ARG(0)), &y, NULL, NULL);
     } else {
         ASSERT_TYPE(0, INT_TYPE);
         y = ARGV(0);
     }
 
     if (HASDATE(ARG(1))) {
-        FromDSE(DATEPART(ARG(1)), &ytemp, &mtemp, &dtemp);
-        m = mtemp;
+        FromDSE(DATEPART(ARG(1)), NULL, &m, NULL);
     } else {
-        ASSERT_TYPE(1, INT_TYPE);
-        m = ARGV(1) - 1;
+        m = GETMON(1);
+        if (m < 0) {
+            return -m;
+        }
     }
 
     if (HASDATE(ARG(2))) {
-        FromDSE(DATEPART(ARG(2)), &ytemp, &mtemp, &dtemp);
-        d = dtemp;
+        FromDSE(DATEPART(ARG(2)), NULL, NULL, &d);
     } else {
         ASSERT_TYPE(2, INT_TYPE);
         d = ARGV(2);
@@ -530,11 +550,11 @@
         return OK;
     case 4:
         if (ARG(0).type != INT_TYPE ||
-            ARG(1).type != INT_TYPE ||
             ARG(2).type != INT_TYPE ||
             ARG(3).type != TIME_TYPE) return E_BAD_TYPE;
         y = ARGV(0);
-        m = ARGV(1) - 1;
+        m = GETMON(1);
+        if (m < 0) return -m;
         d = ARGV(2);
 
         if (!DateOK(y, m, d)) return E_BAD_DATE;
@@ -542,13 +562,13 @@
         return OK;
     case 5:
         if (ARG(0).type != INT_TYPE ||
-            ARG(1).type != INT_TYPE ||
             ARG(2).type != INT_TYPE ||
             ARG(3).type != INT_TYPE ||
             ARG(4).type != INT_TYPE) return E_BAD_TYPE;
 
         y = ARGV(0);
-        m = ARGV(1) - 1;
+        m = GETMON(1);
+        if (m < 0) return -m;
         d = ARGV(2);
         if (!DateOK(y, m, d)) return E_BAD_DATE;
 
@@ -759,7 +779,7 @@
         /* Convert a month name to a month number */
         FindToken(ARG(0).v.str, &tok);
         if (tok.type != T_Month) {
-            return E_BAD_TYPE;
+            return E_CANT_PARSE_MONTH;
         }
         RetVal.type = INT_TYPE;
         RETVAL = tok.val + 1;
@@ -811,7 +831,7 @@
         /* Convert a day name to a day number */
         FindToken(ARG(0).v.str, &tok);
         if (tok.type != T_WkDay) {
-            return E_BAD_TYPE;
+            return E_CANT_PARSE_WKDAY;
         }
         RetVal.type = INT_TYPE;
         RETVAL = (tok.val + 1) % 7;
@@ -848,12 +868,11 @@
     char const *s;
     int y, m, d, v;
 
-    if (!HASDATE(ARG(0)) && ARG(0).type != INT_TYPE) return E_BAD_TYPE;
+    if (!HASDATE(ARG(0)) && ARG(0).type != INT_TYPE && ARG(0).type != 
STR_TYPE) return E_BAD_TYPE;
 
-    if (ARG(0).type == INT_TYPE) {
-        m = ARGV(0) - 1;
-        if (m < 0) return E_2LOW;
-        if (m > 11) return E_2HIGH;
+    if (ARG(0).type == INT_TYPE || ARG(0).type == STR_TYPE) {
+        m = GETMON(0);
+        if (m < 0) return -m;
     } else {
         v = DATEPART(ARG(0));
         if (v == CacheDse)
@@ -2008,19 +2027,29 @@
 /*                                                             */
 /*  FDaysinmon                                                 */
 /*                                                             */
-/*  Returns the number of days in mon,yr                       */
+/*  Returns the number of days in mon,yr OR month containing   */
+/*  given date.                                                */
 /*                                                             */
 /***************************************************************/
 static int FDaysinmon(func_info *info)
 {
-    if (ARG(0).type != INT_TYPE || ARG(1).type != INT_TYPE) return E_BAD_TYPE;
+    int y, m;
 
-    if (ARGV(0) > 12 || ARGV(0) < 1 ||
-        ARGV(1) < BASE || ARGV(1) > BASE+YR_RANGE)
-        return E_DOMAIN_ERR;
+    if (Nargs == 1) {
+        if (!HASDATE(ARG(0))) return E_BAD_TYPE;
+        FromDSE(DATEPART(ARG(0)), &y, &m, NULL);
+    } else {
+        if (ARG(1).type != INT_TYPE) return E_BAD_TYPE;
+
+        m = GETMON(0);
+        if (m < 0) return -m;
+        y = ARGV(1);
+        if (y < BASE) return E_2LOW;
+        if (y > BASE + YR_RANGE) return E_2HIGH;
+    }
 
     RetVal.type = INT_TYPE;
-    RETVAL = DaysInMonth(ARGV(0)-1, ARGV(1));
+    RETVAL = DaysInMonth(m, y);
     return OK;
 }
 
@@ -2033,13 +2062,13 @@
 /***************************************************************/
 static int FIsleap(func_info *info)
 {
-    int y, m, d;
+    int y;
 
     if (ARG(0).type != INT_TYPE && !HASDATE(ARG(0))) return E_BAD_TYPE;
 
     /* If it's a date, extract the year */
     if (HASDATE(ARG(0)))
-        FromDSE(DATEPART(ARG(0)), &y, &m, &d);
+        FromDSE(DATEPART(ARG(0)), &y, NULL, NULL);
     else
         y = ARGV(0);
 
@@ -2825,7 +2854,7 @@
     int base;
     if (Nargs == 0) {
         base = DSEToday;
-        FromDSE(DSEToday, &y, &m, &d);
+        FromDSE(DSEToday, &y, NULL, NULL);
     } else {
         if (ARG(0).type == INT_TYPE) {
             base = -1;
@@ -2834,7 +2863,7 @@
             else if (y > BASE+YR_RANGE) return E_2HIGH;
         } else if (HASDATE(ARG(0))) {
             base = DATEPART(ARG(0));
-            FromDSE(DATEPART(ARG(0)), &y, &m, &d);  /* We just want the year */
+            FromDSE(DATEPART(ARG(0)), &y, NULL, NULL);  /* We just want the 
year */
         } else return E_BAD_TYPE;
     }
 
@@ -2878,7 +2907,7 @@
     int base = -1;
     if (Nargs == 0) {
         base = DSEToday;
-        FromDSE(DSEToday, &y, &m, &d);
+        FromDSE(DSEToday, &y, NULL, NULL);
     } else {
         if (ARG(0).type == INT_TYPE) {
             y = ARGV(0);
@@ -2886,7 +2915,7 @@
             else if (y > BASE+YR_RANGE) return E_2HIGH;
         } else if (HASDATE(ARG(0))) {
             base = DATEPART(ARG(0));
-            FromDSE(DATEPART(ARG(0)), &y, &m, &d);  /* We just want the year */
+            FromDSE(DATEPART(ARG(0)), &y, NULL, NULL);  /* We just want the 
year */
         } else return E_BAD_TYPE;
     }
 
@@ -3914,7 +3943,7 @@
     for (i=localargs; i<Nargs; i++) {
         if (ARG(i).type != STR_TYPE) return E_BAD_TYPE;
         FindToken(ARG(i).v.str, &tok);
-        if (tok.type != T_WkDay) return E_UNKNOWN_TOKEN;
+        if (tok.type != T_WkDay) return E_CANT_PARSE_WKDAY;
         localomit |= (1 << tok.val);
     }
 
@@ -3972,7 +4001,7 @@
     for (i=localargs; i<Nargs; i++) {
         if (ARG(i).type != STR_TYPE) return E_BAD_TYPE;
         FindToken(ARG(i).v.str, &tok);
-        if (tok.type != T_WkDay) return E_UNKNOWN_TOKEN;
+        if (tok.type != T_WkDay) return E_CANT_PARSE_WKDAY;
         localomit |= (1 << tok.val);
     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/remind-05.04.01/src/main.c 
new/remind-05.04.02/src/main.c
--- old/remind-05.04.01/src/main.c      2025-06-15 15:29:36.000000000 +0200
+++ new/remind-05.04.02/src/main.c      2025-07-16 17:07:43.000000000 +0200
@@ -459,6 +459,15 @@
         try_yr--;
         try_dse -= DaysInYear(try_yr);
     }
+    if (y) {
+        *y = try_yr;
+    }
+
+    /* If all we want is the year, we can quit here */
+    if (!d && !m) {
+        return;
+    }
+
     dse -= try_dse;
 
     t = DaysInMonth(try_mon, try_yr);
@@ -467,9 +476,6 @@
         try_mon++;
         t = DaysInMonth(try_mon, try_yr);
     }
-    if (y) {
-        *y = try_yr;
-    }
     if (m) {
         *m = try_mon;
     }
@@ -1994,9 +2000,11 @@
 {
     SaveLastTrigger(t);
     SaveLastTimeTrig(tt);
-    LastTriggerDate = trigdate;
+    if (trigdate != -1) {
+        LastTriggerDate = trigdate;
+        LastTrigValid = valid;
+    }
     LastTriggerTime = trigtime;
-    LastTrigValid = valid;
 }
 
 void
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/remind-05.04.01/src/omit.c 
new/remind-05.04.02/src/omit.c
--- old/remind-05.04.01/src/omit.c      2025-06-15 15:29:36.000000000 +0200
+++ new/remind-05.04.02/src/omit.c      2025-07-16 17:07:43.000000000 +0200
@@ -242,7 +242,7 @@
         return OK;
     }
 
-    FromDSE(dse, &y, &m, &d);
+    FromDSE(dse, NULL, &m, &d);
     if (BexistsIntArray(PartialOmitArray, NumPartialOmits, (m << 5) + d)) {
         *omit = 1;
         return OK;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/remind-05.04.01/src/token.c 
new/remind-05.04.02/src/token.c
--- old/remind-05.04.01/src/token.c     2025-06-15 15:29:36.000000000 +0200
+++ new/remind-05.04.02/src/token.c     2025-07-16 17:07:43.000000000 +0200
@@ -27,11 +27,11 @@
    executes 'return' if an initial non-numeric char is found. */
 #define PARSENUM(var, string) \
 if (!isdigit(*(string))) return; \
-var = 0; \
+(var) = 0;                       \
 while (isdigit(*(string))) { \
-    var *= 10; \
-    var += *(string) - '0'; \
-    string++; \
+    (var) *= 10;             \
+    (var) += *(string) - '0';                   \
+    (string)++;                                 \
 }
 
 /* The big array holding all recognized (literal) tokens in reminder file.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/remind-05.04.01/src/trigger.c 
new/remind-05.04.02/src/trigger.c
--- old/remind-05.04.01/src/trigger.c   2025-06-15 15:29:36.000000000 +0200
+++ new/remind-05.04.02/src/trigger.c   2025-07-16 17:07:43.000000000 +0200
@@ -541,6 +541,7 @@
     trig->expired = 0;
     if (save_in_globals) {
         LastTrigValid = 0;
+        LastTriggerDate = -1;
     }
 
     /* Assume everything works */
@@ -579,7 +580,6 @@
 
     while (nattempts++ < TRIG_ATTEMPTS) {
         result = GetNextTriggerDate(trig, start, err, &nextstart);
-
         /* If there's an error, die immediately */
         if (*err) return -1;
         if (result == -1) {
@@ -635,8 +635,9 @@
             trig->rep == NO_REP) {
             trig->expired = 1;
             if (DebugFlag & DB_PRTTRIG) {
-                fprintf(ErrFp, "%s(%s): %s\n",
-                        GetCurrentFilename(), line_range(LineNoStart, LineNo), 
GetErr(E_EXPIRED));
+                FromDSE(result, &y, &m, &d);
+                fprintf(ErrFp, "%s(%s): %s: %04d-%02d-%02d\n",
+                        GetCurrentFilename(), line_range(LineNoStart, LineNo), 
GetErr(E_EXPIRED), y, m+1, d);
             }
             if (save_in_globals) {
                 LastTriggerDate = result;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/remind-05.04.01/src/var.c 
new/remind-05.04.02/src/var.c
--- old/remind-05.04.01/src/var.c       2025-06-15 15:29:36.000000000 +0200
+++ new/remind-05.04.02/src/var.c       2025-07-16 17:07:43.000000000 +0200
@@ -285,7 +285,7 @@
 
 static int trig_day_func(int do_set, Value *val)
 {
-    int y, m, d;
+    int d;
     UNUSED(do_set);
     val->type = INT_TYPE;
     if (!LastTrigValid) {
@@ -293,7 +293,7 @@
         return OK;
     }
 
-    FromDSE(LastTriggerDate, &y, &m, &d);
+    FromDSE(LastTriggerDate, NULL, NULL, &d);
     val->v.val = d;
     return OK;
 }
@@ -312,7 +312,7 @@
 
 static int trig_mon_func(int do_set, Value *val)
 {
-    int y, m, d;
+    int m;
     UNUSED(do_set);
     val->type = INT_TYPE;
     if (!LastTrigValid) {
@@ -320,14 +320,14 @@
         return OK;
     }
 
-    FromDSE(LastTriggerDate, &y, &m, &d);
+    FromDSE(LastTriggerDate, NULL, &m, NULL);
     val->v.val = m+1;
     return OK;
 }
 
 static int trig_year_func(int do_set, Value *val)
 {
-    int y, m, d;
+    int y;
     UNUSED(do_set);
     val->type = INT_TYPE;
     if (!LastTrigValid) {
@@ -335,7 +335,7 @@
         return OK;
     }
 
-    FromDSE(LastTriggerDate, &y, &m, &d);
+    FromDSE(LastTriggerDate, &y, NULL, NULL);
     val->v.val = y;
     return OK;
 }
@@ -362,30 +362,30 @@
 }
 static int today_day_func(int do_set, Value *val)
 {
-    int y, m, d;
+    int d;
     UNUSED(do_set);
     val->type = INT_TYPE;
-    FromDSE(DSEToday, &y, &m, &d);
+    FromDSE(DSEToday, NULL, NULL, &d);
     val->v.val = d;
     return OK;
 }
 
 static int today_mon_func(int do_set, Value *val)
 {
-    int y, m, d;
+    int m;
     UNUSED(do_set);
     val->type = INT_TYPE;
-    FromDSE(DSEToday, &y, &m, &d);
+    FromDSE(DSEToday, NULL, &m, NULL);
     val->v.val = m+1;
     return OK;
 }
 
 static int today_year_func(int do_set, Value *val)
 {
-    int y, m, d;
+    int y;
     UNUSED(do_set);
     val->type = INT_TYPE;
-    FromDSE(DSEToday, &y, &m, &d);
+    FromDSE(DSEToday, &y, NULL, NULL);
     val->v.val = y;
     return OK;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/remind-05.04.01/tests/test.cmp 
new/remind-05.04.02/tests/test.cmp
--- old/remind-05.04.01/tests/test.cmp  2025-06-15 15:29:36.000000000 +0200
+++ new/remind-05.04.02/tests/test.cmp  2025-07-16 17:07:43.000000000 +0200
@@ -428,7 +428,7 @@
 
 # This causes a parse error on version 03.01.01
 REM 1990-01-01 SATISFY 1
-../tests/test.rem(90): Expired
+../tests/test.rem(90): Expired: 1990-01-01
 
 # Test each possible case of the basic reminders.
 
@@ -494,7 +494,7 @@
 ../tests/test.rem(121): Trig = Friday, 1 May, 1992
 
 REM 1 Jan 1991 MSG 1 Jan 1991
-../tests/test.rem(123): Expired
+../tests/test.rem(123): Expired: 1991-01-01
 REM 16 Feb 1991 MSG 16 Feb 1991
 ../tests/test.rem(124): Trig = Saturday, 16 February, 1991
 16 Feb 1991
@@ -1042,7 +1042,7 @@
 "a05" + "6" => "a056"
 value("a056") => "SDFJHSDF KSJDFH KJSDFH KSJDFH"
 set a058 version()
-version() => "05.04.01"
+version() => "05.04.02"
 set a059 wkday(today())
 today() => 1991-02-16
 wkday(1991-02-16) => "Saturday"
@@ -2605,7 +2605,7 @@
 a007  "1991-02-16"
 a057  "SDFJHSDF KSJDFH KJSDFH KSJDFH"
 a008  "11:44"
-a058  "05.04.01"
+a058  "05.04.02"
 a059  "Saturday"
 a010  12
 a060  6
@@ -4115,7 +4115,7 @@
 ../tests/test.rem(849): Trig = Tuesday, 19 February, 1991
 ../tests/test.rem(849): Trig = Wednesday, 20 February, 1991
 1990-01-01
-../tests/test.rem(849): Expired
+../tests/test.rem(849): Expired: 1990-01-01
 
 # Multitrig
 REM [multitrig("10", "17")] MSG multitrig-1
@@ -4151,7 +4151,7 @@
 multitrig("15 SCANFROM -7", "14 SCANFROM -7") => ../tests/test.rem(857): Trig 
= Friday, 15 February, 1991
 ../tests/test.rem(857): Trig = Thursday, 14 February, 1991
 1991-02-14
-../tests/test.rem(857): Expired
+../tests/test.rem(857): Expired: 1991-02-14
 REM [multitrig("15 SCANFROM -7", "14 SCANFROM -7")] SCANFROM -7 MSG multitrig-7
 multitrig("15 SCANFROM -7", "14 SCANFROM -7") => ../tests/test.rem(858): Trig 
= Friday, 15 February, 1991
 ../tests/test.rem(858): Trig = Thursday, 14 February, 1991
@@ -5075,12 +5075,12 @@
 
 # $ParseUntriggered
 REM 2 Jan 1990 MSG ["bad_expr" / 2]
-../tests/test.rem(971): Expired
+../tests/test.rem(971): Expired: 1990-01-02
 "bad_expr" / 2 => Type mismatch
 ../tests/test.rem(971): `/': Type mismatch
 SET $ParseUntriggered 0
 REM 2 Jan 1990 MSG ["bad_expr" / 2]
-../tests/test.rem(973): Expired
+../tests/test.rem(973): Expired: 1990-01-02
 SET $ParseUntriggered 1
 
 # String multiplication
@@ -5639,8 +5639,8 @@
 REM SATISFY [version() > "01.00.00"]
 ../tests/test.rem(1055): SATISFY: expression has no reference to trigdate() or 
$T...
 ../tests/test.rem(1055): Trig = Saturday, 16 February, 1991
-version() => "05.04.01"
-"05.04.01" > "01.00.00" => 1
+version() => "05.04.02"
+"05.04.02" > "01.00.00" => 1
 ../tests/test.rem(1055): Trig(satisfied) = Saturday, 16 February, 1991
 REM SATISFY [max(x, max(x, 1, 2, 3), 4, 5, 6) * 5]
 ../tests/test.rem(1056): SATISFY: expression has no reference to trigdate() or 
$T...
@@ -16362,8 +16362,8 @@
 monnum("Dec") => 12
 
 set a monnum("not a month")
-monnum("not a month") => Type mismatch
-../tests/test.rem(1491): monnum(): Type mismatch
+monnum("not a month") => Invalid month name
+../tests/test.rem(1491): monnum(): Invalid month name
 
 # Test wkdaynum("string")
 set a wkdaynum("Sun")
@@ -16397,8 +16397,8 @@
 wkdaynum("saturday") => 6
 
 set a wkdaynum("cabbage")
-wkdaynum("cabbage") => Type mismatch
-../tests/test.rem(1510): wkdaynum(): Type mismatch
+wkdaynum("cabbage") => Invalid weekday name
+../tests/test.rem(1510): wkdaynum(): Invalid weekday name
 
 # Test non-constant debugging
 DEBUG +n
@@ -16577,6 +16577,35 @@
 Base: 1991-02-09
 ../tests/test.rem(1611): Expired
 ../tests/test.rem(1612): Expired
+trigvalid = 1; trigdate = 1991-01-14
+trigvalid = 0; trigdate = 0
+daysinmon(2, 2000) => 29
+daysinmon(2, 2001) => 28
+daysinmon(3, 2000) => 31
+daysinmon(3, 2001) => 31
+daysinmon("Feb", 2000) => 29
+daysinmon("Feb", 2001) => 28
+daysinmon("March", 2000) => 31
+daysinmon("March", 2001) => 31
+daysinmon("Cabbage", 2001) => Invalid month name
+../tests/test.rem(1639): daysinmon(): Invalid month name
+daysinmon(2000-02-14) => 29
+daysinmon(2001-02-14) => 28
+daysinmon(2000-04-14) => 30
+daysinmon(2001-04-14) => 30
+date(2020, "April", 15) => 2020-04-15
+date(2020, "Carrot", 12) => Invalid month name
+../tests/test.rem(1647): date(): Invalid month name
+datetime(2020, "April", 13, 04:44) => 2020-04-13@04:44
+datetime(2020, "April", 13, 4, 44) => 2020-04-13@04:44
+datetime(2020, "Lettuce", 13, 04:44) => Invalid month name
+../tests/test.rem(1650): datetime(): Invalid month name
+datetime(2020, "Lettuce", 13, 4, 44) => Invalid month name
+../tests/test.rem(1651): datetime(): Invalid month name
+wkdaynum("Tue") => 2
+wkdaynum("Wednesday") => 3
+wkdaynum("telephone") => Invalid weekday name
+../tests/test.rem(1655): wkdaynum(): Invalid weekday name
 Variable hash table statistics:
   Entries: 100143; Buckets: 87719; Non-empty Buckets: 66301
   Maxlen: 5; Minlen: 0; Avglen: 1.142; Stddev: 0.878; Avg nonempty len: 1.510
@@ -23639,7 +23668,7 @@
 Error reading include_dir/ww: Can't open file
 SECURITY: Won't read world-writable file or directory!
 Error reading include_dir/ww: No files matching *.rem
-05.04.01
+05.04.02
 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
@@ -23693,7 +23722,7 @@
 REM 29 2024 MSG three
 -stdin-(4): Trig = Friday, 29 March, 2024
 REM 29 Feb 2024 MSG four
--stdin-(5): Expired
+-stdin-(5): Expired: 2024-02-29
 REM Thursday 29 MSG One
 -stdin-(6): Trig = Thursday, 4 April, 2024
 REM Thursday 29 Feb MSG two
@@ -23701,7 +23730,7 @@
 REM Thursday 29 2024 MSG three
 -stdin-(8): Trig = Thursday, 4 April, 2024
 REM Thursday 29 Feb 2024 MSG four
--stdin-(9): Expired
+-stdin-(9): Expired: 2024-02-29
 REM Wednesday 29 MSG One
 -stdin-(10): Trig = Wednesday, 6 March, 2024
 REM Wednesday 29 Feb MSG two
@@ -24844,10 +24873,11 @@
 TRANSLATE "Missing ']'" ""
 TRANSLATE "Missing quote" ""
 TRANSLATE "Expression too complex" ""
+TRANSLATE "Invalid month name" ""
 TRANSLATE "Missing ')'" ""
 TRANSLATE "Undefined function" ""
 TRANSLATE "Illegal character" ""
-TRANSLATE "Expecting binary operator" ""
+TRANSLATE "Invalid weekday name" ""
 TRANSLATE "Out of memory" ""
 TRANSLATE "Ill-formed number" ""
 TRANSLATE "Can't coerce" ""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/remind-05.04.01/tests/test.rem 
new/remind-05.04.02/tests/test.rem
--- old/remind-05.04.01/tests/test.rem  2025-06-15 15:29:36.000000000 +0200
+++ new/remind-05.04.02/tests/test.rem  2025-07-16 17:07:43.000000000 +0200
@@ -1612,6 +1612,49 @@
 REM SECOND SATURDAY +300 UNTIL 1991-02-16 MSG [$T]
 DEBUG -t
 
+# Fully-specified trigger date in the past
+REM 14 Jan 1991 MSG In the past
+set a trigvalid()
+set b trigdate()
+
+REM MSG trigvalid = [a]; trigdate = [b]
+
+# SATISFY clause that's never satisfied...
+REM 14 Jan 1991 SATISFY [$Ty == 2022] MSG I can't get no satisfaction
+set a trigvalid()
+set b trigdate()
+
+REM MSG trigvalid = [a]; trigdate = [b]
+
+DEBUG +x
+set a daysinmon(2, 2000)
+set a daysinmon(2, 2001)
+set a daysinmon(3, 2000)
+set a daysinmon(3, 2001)
+
+set a daysinmon("Feb", 2000)
+set a daysinmon("Feb", 2001)
+set a daysinmon("March", 2000)
+set a daysinmon("March", 2001)
+set a daysinmon("Cabbage", 2001)
+
+set a daysinmon('2000-02-14')
+set a daysinmon('2001-02-14')
+set a daysinmon('2000-04-14')
+set a daysinmon('2001-04-14')
+
+set a date(2020, "April", 15)
+set a date(2020, "Carrot", 12)
+set a datetime(2020, "April", 13, 4:44)
+set a datetime(2020, "April", 13, 4, 44)
+set a datetime(2020, "Lettuce", 13, 4:44)
+set a datetime(2020, "Lettuce", 13, 4, 44)
+
+set a wkdaynum("Tue")
+set a wkdaynum("Wednesday")
+set a wkdaynum("telephone")
+
+DEBUG -x
 # Output expression-node stats
 DEBUG +h
 

Reply via email to