Compare commits

...

53 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
Dianne Skoll de03d0c02a Prep for 06.02.05 release. 2026-03-02 10:47:07 -05:00
Dianne Skoll 3e6e3b6a34 Use original font size for MOON and WEEK specials. 2026-03-02 10:21:21 -05:00
Dianne Skoll bf48e31335 Add --entry-spacing option to rem2pdf. 2026-03-02 10:15:55 -05:00
Dianne Skoll 77c0beffb3 Make inter-entry spacing 0.5 * border size. 2026-02-28 11:53:51 -05:00
Dianne Skoll 9a724d7618 Scale entry spacing as well as font size if we use --avoid-overfull. 2026-02-27 23:47:19 -05:00
Dianne Skoll 1c20f54edb Fix typo 2026-02-27 23:33:33 -05:00
Dianne Skoll 52b36d4503 Link the Fill page and Avoid over-full boxes checkbuttons. 2026-02-27 16:46:16 -05:00
Dianne Skoll 0a82eadea6 Update TkRemind man page. 2026-02-27 16:36:42 -05:00
Dianne Skoll 0cd4fe67d1 Fix typo 2026-02-27 16:33:59 -05:00
Dianne Skoll 9c31004b62 Add --avoid-overfull option to rem2pdf 2026-02-27 16:27:57 -05:00
Dianne Skoll 3431833be2 Another wording tweak. 2026-02-20 16:48:32 -05:00
Dianne Skoll a98a4b9f72 Another update to README.md. 2026-02-20 16:33:31 -05:00
Dianne Skoll 4aaba4da88 Update README 2026-02-20 11:11:49 -05:00
Dianne Skoll 98e37d8c54 Put reference to book in man page. 2026-02-17 10:08:18 -05:00
Dianne Skoll 4335aac7b2 Fix spelling of "Auckland"; add Matariki.
Fixes courtesy of Bart Joy.
2026-02-16 10:45:52 -05:00
Dianne Skoll 695a2a3c2d Add "dp" to hunspell dictionary. 2026-02-15 16:46:51 -05:00
Dianne Skoll 47aa542d4f Update WHATSNEW 2026-02-15 16:45:28 -05:00
Dianne Skoll 5b4d1ae264 Bump version to 06.02.04 2026-02-15 11:09:26 -05:00
Dianne Skoll 721ccb9af9 Add explicit dates to most Remind invocations in test-rem 2026-02-15 11:03:28 -05:00
Dianne Skoll ab1a6c412a Add tests for push/pop in different files warnings. 2026-02-15 10:57:31 -05:00
Dianne Skoll c3a555942b Don't warn if a POP... is in a different file from a PUSH... unless the -dp flag is used. 2026-02-15 10:53:08 -05:00
Dianne Skoll 0d15977875 Tweak man pages. 2026-02-05 22:47:28 -05:00
Dianne Skoll 0a7e6ee219 Fix wording. 2026-02-05 22:42:15 -05:00
Dianne Skoll baf049662f Fix typo 2026-02-05 22:40:16 -05:00
Dianne Skoll fd5d9a479d *sigh* don't put an extra period after the version in "rem2html --version" 2026-02-05 22:33:43 -05:00
Dianne Skoll 01d3081f19 Make TkRemind support --version 2026-02-05 22:29:53 -05:00
Dianne Skoll 7841077fc6 Make all programs support --version 2026-02-05 22:25:10 -05:00
Dianne Skoll 2003c7a703 Add --version option to rem2pdf. 2026-02-05 22:18:17 -05:00
Dianne Skoll 4a603ce60d Tweak the CSS. 2026-02-05 19:25:39 -05:00
Dianne Skoll caad7f5aa3 Add the $Shaded system variable. 2026-02-05 13:14:22 -05:00
Dianne Skoll ea2312c0b2 Add mblower and mbupper functions.
These are Unicode-safe versions of lower() and upper()
2026-02-05 12:41:36 -05:00
53 changed files with 1015 additions and 216 deletions
+6 -13
View File
@@ -95,16 +95,9 @@ 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: dianne@skoll.ca
Home page: [https://dianne.skoll.ca/projects/remind/](https://dianne.skoll.ca/projects/remind/)
3. It is not yet settled whether, if you train an AI model on this
source code, the resulting model, and/or any outputs it produces, are
derivative works of the code. But if they are, and do not fall under
"fair use" or equivalent in your jurisdiction, then as with any other
derivative work you may only distribute them under the terms of the
GNU General Public License, version 2.
@@ -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
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.72 for remind 06.02.03.
# Generated by GNU Autoconf 2.72 for remind 06.02.06.
#
#
# Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation,
@@ -601,8 +601,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='remind'
PACKAGE_TARNAME='remind'
PACKAGE_VERSION='06.02.03'
PACKAGE_STRING='remind 06.02.03'
PACKAGE_VERSION='06.02.06'
PACKAGE_STRING='remind 06.02.06'
PACKAGE_BUGREPORT=''
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.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
'configure' configures remind 06.02.03 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]...
@@ -1320,7 +1320,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
short | recursive ) echo "Configuration of remind 06.02.03:";;
short | recursive ) echo "Configuration of remind 06.02.06:";;
esac
cat <<\_ACEOF
@@ -1408,7 +1408,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
remind configure 06.02.03
remind configure 06.02.06
generated by GNU Autoconf 2.72
Copyright (C) 2023 Free Software Foundation, Inc.
@@ -1871,7 +1871,7 @@ cat >config.log <<_ACEOF
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 06.02.03, which was
It was created by remind $as_me 06.02.06, which was
generated by GNU Autoconf 2.72. Invocation command line was
$ $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
# values after options handling.
ac_log="
This file was extended by remind $as_me 06.02.03, 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
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
ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
remind config.status 06.02.03
remind config.status 06.02.06
configured by $0, generated by GNU Autoconf 2.72,
with options \\"\$ac_cs_config\\"
+1 -1
View File
@@ -1,6 +1,6 @@
dnl Process this file with autoconf to produce a configure script.
AC_INIT(remind, 06.02.03, , , https://dianne.skoll.ca/projects/remind/)
AC_INIT(remind, 06.02.06, , , https://dianne.skoll.ca/projects/remind/)
AC_CONFIG_SRCDIR([src/queue.c])
cat <<'EOF'
+146 -21
View File
@@ -147,7 +147,7 @@
"$May" "$MinsFromUTC" "$Minute" "$Monday" "$Mplu" "$NextMode"
"$November" "$Now" "$NumFullOmits" "$NumPartialOmits" "$NumQueued"
"$NumTrig" "$October" "$On" "$OnceFile" "$ParseUntriggered" "$Pm"
"$PrefixLineNo" "$PSCal" "$RunOff" "$Saturday" "$September"
"$PrefixLineNo" "$PSCal" "$Repeat" "$RunOff" "$Saturday" "$September" "$Shaded"
"$SimpleCal" "$SortByDate" "$SortByPrio" "$SortByTime" "$SubsIndent"
"$Sunday" "$SuppressImplicitWarnings" "$SuppressLRM" "$SysInclude" "$T" "$Tb" "$Td"
"$TerminalBackground" "$TerminalHyperlinks" "$Thursday" "$TimeSep" "$TimetIs64bit" "$Tm" "$Today" "$TodoFilter"
@@ -167,26 +167,151 @@
(defconst remind-builtin-functions
(sort
(list "_" "abs" "access" "adawn" "adusk" "ampm" "ansicolor" "args" "asc"
"baseyr" "catch" "catcherr" "char" "choose" "codepoint" "coerce" "columns" "const" "current" "date"
"datepart" "datetime" "dawn" "day" "daysinmon" "defined" "dosubst"
"dusk" "easterdate" "escape" "eval" "evaltrig" "filedate" "filedatetime"
"filedir" "filename" "getenv" "hebdate" "hebday" "hebmon" "hebyear" "hex"
"hour" "htmlescape" "htmlstriptags" "iif" "index" "isany" "isconst" "isdst"
"isleap" "isomitted" "ivritmon" "language" "localtoutc" "lower" "max"
"mbasc" "mbindex" "mbstrlen" "mbsubstr" "min"
"minsfromutc" "minute" "mon" "monnum" "moondate" "moondatetime"
"moonphase" "moonrise" "moonrisedir" "moonset" "moonsetdir" "moontime"
"multitrig" "ndawn" "ndusk" "nonconst" "nonomitted" "now" "ord" "orthodoxeaster"
"ostype" "pad" "plural" "psmoon" "psshade" "realcurrent" "realnow"
"realtoday" "rows" "sgn" "shell" "shellescape" "slide" "soleq"
"stdout" "strlen" "substr" "sunrise" "sunset" "time" "timepart"
"timezone" "today" "trig" "trigback" "trigbase" "trigcompletethrough" "trigdate" "trigdatetime"
"trigdelta" "trigduration" "trigeventduration" "trigeventstart" "trigeventstarttz"
"trigfrom" "trigger" "triginfo" "trigistodo" "trigmaxoverdue" "trigpriority" "trigrep"
"trigscanfrom" "trigtags" "trigtime" "trigtimedelta" "trigtimerep" "trigtimetz" "trigtz"
"triguntil" "trigvalid" "typeof" "tzconvert" "upper" "utctolocal"
"value" "version" "weekno" "wkday" "wkdaynum" "year"
(list
"_"
"abs"
"access"
"adawn"
"adusk"
"ampm"
"ansicolor"
"args"
"asc"
"baseyr"
"catch"
"catcherr"
"char"
"choose"
"codepoint"
"coerce"
"columns"
"const"
"current"
"date"
"datepart"
"datetime"
"dawn"
"day"
"daysinmon"
"defined"
"dosubst"
"dusk"
"easterdate"
"escape"
"eval"
"evaltrig"
"filedate"
"filedatetime"
"filedir"
"filename"
"getenv"
"hebdate"
"hebday"
"hebmon"
"hebyear"
"hex"
"hour"
"htmlescape"
"htmlstriptags"
"iif"
"index"
"isany"
"isconst"
"isdst"
"isleap"
"isomitted"
"ivritmon"
"language"
"localtoutc"
"lower"
"max"
"mbasc"
"mbindex"
"mblower"
"mbstrlen"
"mbsubstr"
"mbupper"
"min"
"minsfromutc"
"minute"
"mon"
"monnum"
"moondate"
"moondatetime"
"moonphase"
"moonrise"
"moonrisedir"
"moonset"
"moonsetdir"
"moontime"
"multitrig"
"ndawn"
"ndusk"
"nonconst"
"nonomitted"
"now"
"ord"
"orthodoxeaster"
"ostype"
"pad"
"plural"
"psmoon"
"psshade"
"realcurrent"
"realnow"
"realtoday"
"rows"
"sgn"
"shell"
"shellescape"
"slide"
"soleq"
"stdout"
"strlen"
"substr"
"sunrise"
"sunset"
"time"
"timepart"
"timezone"
"today"
"trig"
"trigback"
"trigbase"
"trigcompletethrough"
"trigdate"
"trigdatetime"
"trigdelta"
"trigduration"
"trigeventduration"
"trigeventstart"
"trigeventstarttz"
"trigfrom"
"trigger"
"triginfo"
"trigistodo"
"trigmaxoverdue"
"trigpriority"
"trigrep"
"trigscanfrom"
"trigtags"
"trigtime"
"trigtimedelta"
"trigtimerep"
"trigtimetz"
"trigtz"
"triguntil"
"trigvalid"
"typeof"
"tzconvert"
"upper"
"utctolocal"
"value"
"version"
"weekno"
"wkday"
"wkdaynum"
"year"
)
#'(lambda (a b) (> (length a) (length b)))))
+71
View File
@@ -1,5 +1,76 @@
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
- NEW FEATURE: rem2pdf: Add --avoid-overfull option. This makes the
font size in a calendar box with many reminders smaller in an effort
to fit everything neatly into the box.
- NEW FEATURE: rem2pdf: Add --entry-spacing option. This lets you
adjust the spacing between entries in a calendar box. It defaults
to one-half of the --border-size option. NOTE: In previous
releases, --entry-spacing defaulted to the SAME size as
--border-size, so unless you supply an --entry-spacing value to set
it back, the PDF calendars produced by this version of rem2pdf will
be slightly more compact than previous versions.
- DOCUMENTATION UPDATE: Clarify rules around use of Remind source code
for training AI models.
- FIX: include/holidays/nz.rem: Fix spelling of "Auckland" and add
Matariki. Fixes courtesy of Bart Joy.
* VERSION 06.02.04 - 2026-02-15
- IMPROVEMENT: remind: Add the mblower and mbupper functions, which are
multibyte counterparts to lower and upper.
- MINOR NEW FEATURE: remind: Add the $Shaded system variable that counts
how many times a "SPECIAL SHADE" reminder has triggered. See the
man page for an example of how this can be useful.
- MINOR IMPROVEMENT: Make all programs that ship with Remind (remind,
rem2ps, rem2pdf, rem2html and tkremind) accept a --version long option.
- CHANGE: remind: Remind used to warn if the POP-OMIT-CONTEXT, POP-VARS
or POP-FUNCS command corresponding to the relevant PUSH command was
in a different file than the PUSH command. But there are valid use
cases for this, so Remind no longer emits the warning unless you use
the "-dp" debugging flag.
* VERSION 06.02.03 - 2026-02-05
- NEW FEATURE: rem2html: Add a new --yaag option to produce a calendar
+8 -8
View File
@@ -1,5 +1,5 @@
# 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
SET InIsrael value("InIsrael", 0)
@@ -105,22 +105,22 @@ IF !Reform
ENDIF
IF IncludeOmer || IncludeOmerCal
SET ostart HEBDATE(16, "Nisan", TODAY()-50)
IF ostart <= TODAY() && (TODAY() - ostart < 49)
SET odays TODAY()-ostart+1
SET ostart HEBDATE(16, "Nisan", $U-50)
IF ostart <= $U && ($U - ostart < 49)
SET odays $U-ostart+1
IF IncludeOmer
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
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
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
IF IncludeOmerCal
REM CAL [ORD(odays)] of Omer
REM [$U] CAL [ORD(odays)] of Omer
ENDIF
ENDIF
ENDIF
+33
View File
@@ -34,3 +34,36 @@ REM 27 December ADDOMIT SCANFROM -28 SATISFY [wkdaynum($T-2) == 0] MSG %"Christm
REM 27 December ADDOMIT SCANFROM -28 SATISFY [wkdaynum($T-2) == 6] MSG %"Christmas Day (observed)%" %! %b.
REM 28 December ADDOMIT SCANFROM -28 SATISFY [wkdaynum($T-2) == 0] MSG %"Boxing Day (observed)%" %! %b.
REM 28 December ADDOMIT SCANFROM -28 SATISFY [wkdaynum($T-2) == 6] MSG %"Boxing Day (observed)%" %! %b.
# Matariki. Source:
# https://www.legislation.govt.nz/act/public/2022/0014/23.0/LMS557893.html#LMS557893
OMIT 2022-06-24 MSG Matariki
OMIT 2023-07-14 MSG Matariki
OMIT 2024-06-28 MSG Matariki
OMIT 2025-06-20 MSG Matariki
OMIT 2026-07-10 MSG Matariki
OMIT 2027-06-25 MSG Matariki
OMIT 2028-07-14 MSG Matariki
OMIT 2029-07-06 MSG Matariki
OMIT 2030-06-21 MSG Matariki
OMIT 2031-07-11 MSG Matariki
OMIT 2032-07-02 MSG Matariki
OMIT 2033-06-24 MSG Matariki
OMIT 2034-07-07 MSG Matariki
OMIT 2035-06-29 MSG Matariki
OMIT 2036-07-18 MSG Matariki
OMIT 2037-07-10 MSG Matariki
OMIT 2038-06-25 MSG Matariki
OMIT 2039-07-15 MSG Matariki
OMIT 2040-07-06 MSG Matariki
OMIT 2041-07-19 MSG Matariki
OMIT 2042-07-11 MSG Matariki
OMIT 2043-07-03 MSG Matariki
OMIT 2044-06-24 MSG Matariki
OMIT 2045-07-07 MSG Matariki
OMIT 2046-06-29 MSG Matariki
OMIT 2047-07-19 MSG Matariki
OMIT 2048-07-03 MSG Matariki
OMIT 2049-06-25 MSG Matariki
OMIT 2050-07-15 MSG Matariki
OMIT 2051-06-30 MSG Matariki
+1 -1
View File
@@ -10,4 +10,4 @@
# If you want the national holidays as well, you must
# also SYSINCLUDE holidays/nz.rem
REM Monday 26 January ADDOMIT SCANFROM -28 MSG %"Aukland Anniversary Day%" %! %b.
REM Monday 26 January ADDOMIT SCANFROM -28 MSG %"Auckland Anniversary Day%" %! %b.
+1 -1
View File
@@ -10,4 +10,4 @@
# If you want the national holidays as well, you must
# also SYSINCLUDE holidays/nz.rem
REM Monday 26 January ADDOMIT SCANFROM -28 MSG %"Aukland Anniversary Day%" %! %b.
REM Monday 26 January ADDOMIT SCANFROM -28 MSG %"Auckland Anniversary Day%" %! %b.
+1 -1
View File
@@ -33,7 +33,7 @@ TRANSLATE "are" "són"
TRANSLATE "were" "eren"
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.
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 - 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 - 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_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_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_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_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_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
+1 -1
View File
@@ -52,4 +52,4 @@ SET $And "y"
SET $Hplu "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_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_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_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_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), \
"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_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 $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 - ordx(d) 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 $Mplu "r"
FSET - subst_bx(a, d, t) iif(d >= today(), "eftir " + (d - today()) + " daga", "fyrir " + (today()-d) + " dögum")
FSET - subst_p(a, d, t) iif(d == today()+1, "", "a")
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 == $U+1, "", "a")
+3 -3
View File
@@ -53,9 +53,9 @@ SET $And "e"
SET $Hplu "a"
SET $Mplu "i"
FSET - subst_bx(a, d, t) iif(d >= today(), "fra " + (d-today()) + " giorni", (today()-d) + " giorni fa")
FSET - subst_p(a, d, t) iif(d==today()+1, "o", "i")
FSET - subst_q(a, d, t) iif(d==today()+1, "a", "e")
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==$U+1, "o", "i")
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_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_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")
+2 -2
View File
@@ -53,7 +53,7 @@ SET $And "og"
SET $Hplu "r"
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 - 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_ux(a, d, t) subst_ax(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_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_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)
+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_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_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))
+2 -2
View File
@@ -53,7 +53,7 @@ SET $Mplu "e"
SET $Hplu "e"
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_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_ux(a, d, t) subst_ax(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_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
IF $CalMode || $PsCal
REM [moondate(0)] INFO "Url: https://en.wikipedia.org/wiki/New_moon" SPECIAL MOON 0 -1 -1 [moontime(0)]
REM [moondate(1)] INFO "Url: https://en.wikipedia.org/wiki/Lunar_phase" SPECIAL MOON 1 -1 -1 [moontime(1)]
REM [moondate(2)] INFO "Url: https://en.wikipedia.org/wiki/Full_moon" SPECIAL MOON 2 -1 -1 [moontime(2)]
REM [moondate(3)] INFO "Url: https://en.wikipedia.org/wiki/Lunar_phase" SPECIAL MOON 3 -1 -1 [moontime(3)]
REM NOQUEUE [moondatetime(0)] INFO "Url: https://en.wikipedia.org/wiki/New_moon" SPECIAL MOON 0 -1 -1 %*3
REM NOQUEUE [moondatetime(1)] INFO "Url: https://en.wikipedia.org/wiki/Lunar_phase" SPECIAL MOON 1 -1 -1 %*3
REM NOQUEUE [moondatetime(2)] INFO "Url: https://en.wikipedia.org/wiki/Full_moon" SPECIAL MOON 2 -1 -1 %*3
REM NOQUEUE [moondatetime(3)] INFO "Url: https://en.wikipedia.org/wiki/Lunar_phase" SPECIAL MOON 3 -1 -1 %*3
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/Lunar_phase" [moondatetime(1)] MSG %"%(First Quarter) (%2)%" %! %b.
+3
View File
@@ -21,6 +21,9 @@ render characters outside the ASCII character set, see
.SH OPTIONS
.TP
.B \-\-version
Print the version of \fBrem2ps\fR and exit.
.TP
.B \-v
Be more verbose. This causes \fBrem2ps\fR to print progress messages
to the standard error stream. Normally, it is silent.
+92 -16
View File
@@ -1,6 +1,14 @@
.TH REMIND 1 "@RELEASE_DATE@" "Remind" "VERSION @VERSION@"
.SH NAME
remind \- a sophisticated reminder service
.SH THE BOOK OF REMIND
This man page is a good \fIreference\fR for Remind. However, if you
are a novice wishing to \fIlearn\fR Remind, I suggest downloading
"The Book of Remind" from the Remind home page at the following URL:
.PP
.nf
https://dianne.skoll.ca/projects/remind/
.fi
.SH SYNOPSIS
.B remind [\fIoptions\fR] \fIfilename\fR [\fIdate\fR] [\fI*rep\fR] [\fItime\fR]
.SH DESCRIPTION
@@ -349,6 +357,10 @@ Echo lines when displaying error messages
.B f
Trace the reading of reminder files
.TP
.B p
Issue warnings if a POP-OMIT-CONTEXT, POP-VARS or POP-FUNCS matches
a corresponding PUSH that is in a different file.
.TP
.B s
Trace expression parsing and display the internal expression node
tree. This is unlikely to be useful unless you are working on
@@ -507,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.
.PP
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
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.
If you leave out the year, then it defaults to the current year. You
cannot leave out the \fImonth\fR.
.PP
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."
@@ -526,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
time on the command line as one argument: YYYY-MM-DD@HH:MM.
.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
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
@@ -2588,16 +2624,13 @@ a sequence of more than one byte. For example, in a UTF-8 environment,
the string "🙂" contains one character but four bytes. And the string
"één" contains three characters but five bytes.
.PP
\fBRemind\fR has a set of functions
that work on \fIbytes\fR, namely \fBindex\fR, \fBstrlen\fR and \fBsubstr\fR.
These are not safe to use on multi-byte strings; instead use
\fBmbindex\fR, \fBmbstrlen\fR and \fBmbsubstr\fR. If you know \fIfor sure\fR
that a string contains only single-byte characters, then the byte-oriented
versions may be used and are faster than the multi-byte versions.
.PP
Some ancient or embedded systems may lack the C library functions needed
to deal with multi-byte strings. In that case, the \fBmb\fIxxx\fR functions
all return an error.
\fBRemind\fR has a set of functions that work on \fIbytes\fR, namely
\fBindex\fR, \fBstrlen\fR and \fBsubstr\fR, and several more. These
are not safe to use on multi-byte strings; instead use \fBmbindex\fR,
\fBmbstrlen\fR and \fBmbsubstr\fR, and the \fBmb\fR variants of the
others. If you know \fIfor sure\fR that a string contains only
single-byte characters, then the byte-oriented versions may be used
and are faster than the multi-byte versions.
.RE
.TP
.B TIME
@@ -2638,7 +2671,7 @@ The following examples illustrate constants in \fBRemind\fR expressions:
12, 36, \-10, 0, 1209, 0x1F, 0xfe00 (the last two demonstrate the use of hexadecimal constants)
.TP
.B STRING constants
"Hello there", "This is a test", "\\nHello\\tThere", ""
"Hello there", "This is a test", "\\nHello\\tThere", "", "π is Cool! 🙂"
.PP
.RS
Note that the empty string is represented by "". \fBRemind\fR supports
@@ -3358,9 +3391,37 @@ If non-zero, then the \fB\-l\fR option was supplied on the command line.
.B $PSCal (read-only)
If non-zero, then the \fB\-p\fR option was supplied on the command line.
.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)
If non-zero, the \fBRUN\fR directives are disabled.
.TP
.B $Shaded (read-only)
Returns the number of times a \fBSHADE\fR special reminder has triggered.
\fIThis variable is set only in calendar mode, not agenda mode\fR. You
can use this variable to avoid shading a calendar day that has already
been shaded.
.RS
.PP
For example, suppose you want to shade all calendar boxes yellow
\fIif\fR any reminders have triggered on that day. But if a box has
been explicitly shaded, you don't want to overwrite that shading.
You could use something like this:
.PP
.nf
SET n $NumTrig
# Do all your reminders here...
# If anything has triggered and the box is
# not already shaded, then shade it yellow
IF $NumTrig > n && !$Shaded
REM SPECIAL SHADE 255 255 128
ENDIF
.fi
.RE
.TP
.B $SimpleCal (read-only)
Set to a non-zero value if \fIeither\fR of the \fB\-p\fR or \fB\-s\fR
command-line options was supplied.
@@ -4223,8 +4284,15 @@ Given a \fBDATETIME\fR object interpreted in the local time zone, return
a \fBDATETIME\fR object that expresses the same time in UTC.
.TP
.B lower(s_string)
Returns a \fBSTRING\fR with all upper-case bytes in \fIstring\fR
converted to lower-case. \fBNote:\fR This function works correctly
only for ASCII strings. If you are using Unicode characters outside
the ASCII set, use \fBmblower\fR instead.
.TP
.B mblower(s_string)
Returns a \fBSTRING\fR with all upper-case characters in \fIstring\fR
converted to lower-case.
converted to lower-case. This function works correctly on any
Unicode string.
.TP
.B max(x_arg1 [,x_arg2...)
Can take any number of arguments, and returns the maximum. The arguments
@@ -5133,8 +5201,15 @@ of the time zone name.
.PP
.TP
.B upper(s_string)
Returns a \fBSTRING\fR with all lower-case bytes in \fIstring\fR
converted to upper-case. \fBNote:\fR This function works correctly
only for ASCII strings. If you are using Unicode characters outside
the ASCII set, use \fBmbupper\fR instead.
.TP
.B mbupper(s_string)
Returns a \fBSTRING\fR with all lower-case characters in \fIstring\fR
converted to upper-case.
converted to upper-case. This function works correctly on any
Unicode string.
.TP
.B utctolocal(q_datetime)
Given a \fBDATETIME\fR object interpreted in UTC, return a
@@ -6124,10 +6199,11 @@ For example, suppose you set the variables "me" and "hostname" as follows:
.fi
.PP
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
\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:
.PP
.nf
+12 -4
View File
@@ -18,10 +18,12 @@ binary. If you are using Tcl/Tk 8.5, you may also need either the Img
or the tkpng extension to handle PNG images.
.SH COMMAND-LINE OPTIONS
\fBTkRemind\fR itself has no command-line options. However, it passes
any command-line argument starting with \fB\-\fR to \fBRemind\fR as an
option. In addition, \fBTkRemind\fR will respect the \fB\-m\fR and
\fB\-b1\fR options and adjust its appearance accordingly.
\fBTkRemind\fR itself has only one command-line option:
\fB\-\-version\fR, which makes it print the version of \fBTkRemind\fR
and exit. Any other command-line argument starting with \fB\-\fR to
\fBRemind\fR as an option. In addition, \fBTkRemind\fR will respect
the \fB\-m\fR and \fB\-b1\fR options and adjust its appearance
accordingly.
.PP
\fIRead_file\fR is the file from which \fBTkRemind\fR reads reminders.
It is in standard \fBRemind\fR format. \fIWrite_file\fR is the file
@@ -193,6 +195,12 @@ Select the appropriate paper size and orientation. Activate
be the normal case unless you have many reminders in a particular
day. (See the \fBrem2pdf\fR documentation.)
If you activate \fBAvoid over-full boxes\fR, then \fBTkRemind\fR
will pass the \fB\-\-avoid\-overfull\fR option to \fBrem2pdf\fR. This
will make it try to fit many reminders into a calendar box by shrinking
the font. This option, if activated, also automatically activates
\fBFill page\fR.
Finally, click \fBPrint\fR to print or \fBCancel\fR to cancel. Note
that during printing, \fBRemind\fR is called with the
\fB-itkremind=1\fR option and also an additional \fB-itkprint=1\fR
+2 -2
View File
@@ -1119,7 +1119,7 @@ if ($Options{help}) {
system("perldoc $0");
exit(0);
} elsif ($Options{version}) {
print "rem2html version $rem2html_version.\n";
print "rem2html version $rem2html_version\n";
exit(0);
}
@@ -1258,7 +1258,7 @@ td.rem-yaag-end-of-week {
}
th.rem-yaag-end-of-week {
border-right: 2px solid #4B4B4B;
border-right-width: 3;
}
th.rem-yaag-cal-hdr {
+46 -1
View File
@@ -31,6 +31,7 @@ my $media_to_size = {
};
my $help = 0;
my $version = 0;
my $settings = {
landscape => 0,
@@ -41,7 +42,7 @@ my $settings = {
media => 'Letter',
width => 0,
height => 0,
avoid_overfull_boxes => 0,
title_font => 'Sans',
header_font => 'Sans',
daynum_font => 'Sans Bold Oblique',
@@ -55,6 +56,7 @@ my $settings = {
entry_size => 8,
border_size => 4,
entry_spacing => -1,
line_thickness => 1,
margin_top => 36,
@@ -95,6 +97,7 @@ Options:
--ps Output PostScript instead of PDF
--eps Output encapsulated PostScript instead of PDF
-cN Synonym for --small-calendars=N
--avoid-overfull Shrink font size to avoid over-full boxes. Implies -e
--left-numbers, -x Print day numbers on the left (monthly calendars only)
--fill-page, -e Fill the entire page (monthly calendars only)
--media=MEDIA, -mMEDIA Size for specified media
@@ -111,6 +114,7 @@ Options:
--header-size=S Specify size of font for weekday names
--daynum-size=S Specify size of font for day numbers
--entry-size=S Specify size of font for calendar entries
--entry-spacing=S Specify extra spacing between calendar entries
--border-size=S Specify size of gaps between items in 1/72nds of an inch
--line-thickness=S Specify line thickness in 1/72nds of an inch
--margin-top=S Specify top margin size in 1/72nds of an inch
@@ -126,6 +130,7 @@ Options:
--title-url=URL Link calendar title to URL
--verbose, -v Print progress messages
--help Display this help
--version Print version and exit
EOF
}
@@ -137,6 +142,7 @@ my $ret = GetOptions('landscape|l' => \$settings->{landscape},
'svg' => \$settings->{svg},
'ps' => \$settings->{ps},
'eps' => \$settings->{eps},
'avoid-overfull' => \$settings->{avoid_overfull_boxes},
'fill-page|e' => \$settings->{fill_entire_page},
'weeks-per-page|p=i' => \$settings->{weeks_per_page},
'media|m=s' => \$settings->{media},
@@ -153,6 +159,7 @@ my $ret = GetOptions('landscape|l' => \$settings->{landscape},
'header-size=f' => \$settings->{header_size},
'daynum-size=f' => \$settings->{daynum_size},
'entry-size=f' => \$settings->{entry_size},
'entry-spacing=f' => \$settings->{entry_spacing},
'border-size=f' => \$settings->{border_size},
'line-thickness=f' => \$settings->{line_thickness},
'margin-top=f' => \$settings->{margin_top},
@@ -166,6 +173,7 @@ my $ret = GetOptions('landscape|l' => \$settings->{landscape},
'header-color=s' => \$settings->{header_color},
'daynum-color=s' => \$settings->{daynum_color},
'smallcal-color=s' => \$settings->{smallcal_color},
'version' => \$version,
'help' => \$help
);
if (!$ret) {
@@ -178,6 +186,20 @@ if ($help) {
exit(0);
}
if ($version) {
print "rem2pdf version $VERSION\n";
exit(0);
}
if ($settings->{entry_spacing} < 0) {
$settings->{entry_spacing} = 0.5 * $settings->{border_size};
}
if ($settings->{avoid_overfull_boxes}) {
$settings->{fill_entire_page} = 1;
}
my $bad = 0;
foreach my $setting (qw(bg_color line_color title_color header_color daynum_color smallcal_color)) {
my $c = $settings->{$setting};
@@ -280,6 +302,9 @@ if ($settings->{svg}) {
$settings->{width}, $settings->{height});
}
# Save original entry size
$settings->{original_entry_size} = $settings->{entry_size};
# set_metadata not available in older versions of Cairo
eval { $surface->set_metadata('title', 'Calendar'); };
eval { $surface->set_metadata('author', 'Remind (https://dianne.skoll.ca/projects/remind/)'); };
@@ -473,6 +498,12 @@ the default top-right.
Make the calendar fill the available space on the page.
=item --avoid-overfull
If a calendar box is going to overflow, try to make the entries fit by
decreasing the font size. Using the --avoid-overfull option automatically
enables the --fill-page option.
=item --media=I<media>, -mI<media>
Specify the paper size (Letter, A4, etc.) For a list of valid media sizes,
@@ -541,6 +572,12 @@ Specify the size of the blank border between the contents of a calendar
box and the centre of the lines surrounding it, in 1/72ndths of an inch.
The default is 4.
=item --entry-spacing=I<n>
Specify the amount of extra space, in 1/72ndths of an inch, to leave
between calendar entries in a given calendar box. The default is
one-half of the --border-size value.
=item --line-thickness=I<n>
Specify the thickness of the lines drawn on the calendar. The default is 1.
@@ -620,6 +657,14 @@ to print per page; it is an integer that can range from 1 to 4.
Print (on STDERR) the name of the month and year for each month that
is rendered.
=item --version
Print the version of rem2pdf and exit.
=item --help
Print a brief summary of rem2pdf usage.
=back
=head1 USAGE
+24 -3
View File
@@ -608,7 +608,28 @@ sub draw_row
for (my $col=0; $col<7; $col++) {
my $day = $self->{daymap}->[$row]->[$col];
next if ($day < 1);
$self->draw_day($cr, $settings, $so_far, $day, $col, $height);
if ($settings->{avoid_overfull_boxes}) {
my $old_entry_size = $settings->{entry_size};
my $old_spacing = $settings->{entry_spacing};
my $drawn = 0;
while ($settings->{entry_size} >= 2.0) {
my $h = $self->draw_day($cr, $settings, $so_far, $day, $col, 0);
if ($h <= $height) {
$self->draw_day($cr, $settings, $so_far, $day, $col, $height);
$drawn = 1;
last;
}
$settings->{entry_size} -= 0.125;
$settings->{entry_spacing} = $old_spacing * $settings->{entry_size} / $old_entry_size;
}
if (!$drawn) {
$self->draw_day($cr, $settings, $so_far, $day, $col, $height);
}
$settings->{entry_size} = $old_entry_size;
$settings->{entry_spacing} = $old_spacing;
} else {
$self->draw_day($cr, $settings, $so_far, $day, $col, $height);
}
}
return $so_far + $height + $settings->{border_size} * 2;
@@ -717,8 +738,8 @@ sub draw_day
next;
}
if ($done) {
$so_far += $settings->{border_size};
$entry_height += $settings->{border_size};
$so_far += $settings->{entry_spacing};
$entry_height += $settings->{entry_spacing};
}
$done = 1;
my $h2 = $entry->render($self, $cr, $settings, $so_far, $day, $col, $height);
+2 -2
View File
@@ -146,7 +146,7 @@ sub render
my $layout = Pango::Cairo::create_layout($cr);
$layout->set_text(Encode::decode('UTF-8', $self->{body}));
my $desc = Pango::FontDescription->from_string($settings->{entry_font} . ' ' . int(0.75 * $settings->{entry_size}) . 'px');
my $desc = Pango::FontDescription->from_string($settings->{entry_font} . ' ' . int(0.75 * $settings->{original_entry_size}) . 'px');
$layout->set_font_description($desc);
my ($wid, $h) = $layout->get_pixel_size();
@@ -197,7 +197,7 @@ sub render
my $layout;
my $bodywidth = 0;
if ($self->{fontsize} <= 0) {
$self->{fontsize} = $settings->{entry_size};
$self->{fontsize} = $settings->{original_entry_size};
}
if ($self->{size} <= 0) {
$self->{size} = $settings->{daynum_size};
+28 -4
View File
@@ -342,6 +342,9 @@ set Option(PrintOrient) landscape
set OptDescr(PrintFill) "(0/1) If 1, fill entire page when printing"
set Option(PrintFill) 1
set OptDescr(PrintAvoidOverfull) "(0/1) If 1, avoid over-full calendar boxes if possible"
set Option(PrintAvoidOverfull) 0
set OptDescr(WrapCal) "(0/1) If 1, make printed calendars occupy at most 5 rows"
set Option(WrapCal) 0
@@ -442,6 +445,10 @@ proc Initialize {} {
set PSCmd "$Remind -itkremind=1 -itkprint=1 -pp%WEEKS% -l %EXTRA%"
set i 0
while {$i < $argc} {
if {"[lindex $argv $i]" == "--version"} {
puts "tkremind version @VERSION@"
exit 0
}
if {[regexp -- {-[bgxim].*} [lindex $argv $i]]} {
append CommandLine " [lindex $argv $i]"
append PSCmd " [lindex $argv $i]"
@@ -1754,7 +1761,8 @@ proc DoPrintHelper {} {
radiobutton .p.landscape -text "Landscape" -variable Option(PrintOrient) -value landscape
radiobutton .p.portrait -text "Portrait" -variable Option(PrintOrient) -value portrait
checkbutton .p.fill -text "Fill page" -variable Option(PrintFill)
checkbutton .p.fill -text "Fill page" -variable Option(PrintFill) -command PrintFillButtonPressed
checkbutton .p.avoid -text "Avoid over-full boxes" -variable Option(PrintAvoidOverfull) -command PrintAvoidOverfullButtonPressed
checkbutton .p.wrap -text "Use at most 5 rows" -variable Option(WrapCal)
checkbutton .p.right -text "Day numbers at top-right" -variable Option(PrintDaysRight)
checkbutton .p.calendars -text "Print small calendars" -variable Option(PrintSmallCalendars)
@@ -1766,7 +1774,7 @@ proc DoPrintHelper {} {
wm protocol .p WM_DELETE_WINDOW { .p.cancel flash; .p.cancel invoke }
pack .p.f1 .p.ff .p.f2 .p.f2a .p.f3 .p.f3a \
-side top -fill both -expand 1 -anchor w
pack .p.fill .p.wrap .p.right .p.calendars -in .p.f3a \
pack .p.fill .p.avoid .p.wrap .p.right .p.calendars -in .p.f3a \
-side top -anchor w -fill none -expand 0
pack .p.f4 -side top -fill both -expand 1 -anchor w
pack .p.f11 .p.f12 -in .p.f1 -side top -fill none -expand 0 -anchor w
@@ -1857,6 +1865,9 @@ proc DoPrintHelper {} {
append cmd " -e"
}
if {$Option(PrintAvoidOverfull)} {
append cmd " --avoid-overfull"
}
if {!$Option(PrintDaysRight)} {
append cmd " -x"
}
@@ -1879,6 +1890,19 @@ proc DoPrintHelper {} {
}
}
proc PrintFillButtonPressed {} {
global Option
if { ! $Option(PrintFill) && $Option(PrintAvoidOverfull) } {
set Option(PrintAvoidOverfull) 0
}
}
proc PrintAvoidOverfullButtonPressed {} {
global Option
if { ! $Option(PrintFill) && $Option(PrintAvoidOverfull) } {
set Option(PrintFill) 1
}
}
proc ShowPrintCommand { cmd } {
global Option
catch { destroy .pc }
@@ -3602,11 +3626,11 @@ proc main {} {
font create BoldFont {*}[font actual TkDefaultFont] -weight bold
global AppendFile HighestTagSoFar DayNames
catch { SetFonts }
Initialize
catch {
puts "\nTkRemind Copyright (C) 1996-2026 Dianne Skoll"
}
catch { SetFonts }
Initialize
# If no $ConfigFile file, create an empty one
if {![file exists $ConfigFile]} {
+2
View File
@@ -80,6 +80,8 @@ install: all
$(INSTALL_DATA) $$man $(DESTDIR)$(mandir)/man1 || exit 1; \
done
-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
chmod -R a+rX $(DESTDIR)$(datarootdir)/remind
-mkdir -p $(DESTDIR)$(prefix)/share/pixmaps
+3 -2
View File
@@ -2123,8 +2123,9 @@ static int DoCalRem(ParsePtr p, int col)
}
}
if (trig.typ == PASSTHRU_TYPE) {
if (!PsCal && !strcasecmp(trig.passthru, "SHADE")) {
if (dse == DSEToday) {
if (!strcasecmp(trig.passthru, "SHADE") && dse == DSEToday) {
Shaded++;
if (!PsCal) {
DBufInit(&obuf);
r = DoSubst(p, &obuf, &trig, &tim, dse, CAL_MODE);
if (r) {
+6 -3
View File
@@ -68,7 +68,7 @@
as a REM statement, also. */
#define E_CANT_MODIFY 45
#define E_MKTIME_PROBLEM 46
#define E_REDEF_FUNC 47
#define E_REDEF_BUILTIN_FUNC 47
#define E_CANTNEST_FDEF 48
#define E_REP_FULSPEC 49
#define E_YR_TWICE 50
@@ -139,7 +139,8 @@
#define E_EXPECTING_EOXPR 115
#define E_EXPECTING_ATOM 116
#define E_BAD_VAL_FOR_SYSVAR 117
#define E_UNSET_BUILTIN_FUNC 118
#define E_PUSH_BUILTIN_FUNC 119
#ifdef MK_GLOBALS
#undef EXTERN
#define EXTERN
@@ -203,7 +204,7 @@ EXTERN char *ErrMsg[]
/* E_PARSE_AS_REM */ "",
/* E_CANT_MODIFY */ "Cannot modify system variable",
/* 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_REP_FULSPEC */ "Must fully specify date to use repeat factor",
/* E_YR_TWICE */ "Year specified twice",
@@ -274,6 +275,8 @@ EXTERN char *ErrMsg[]
/* E_EXPECTING_EOXPR */ "Expecting operator or end-of-expression",
/* E_EXPECTING_ATOM */ "Expecting constant, variable, function call or (expression)",
/* 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 */
;
+56 -1
View File
@@ -140,9 +140,11 @@ static int FLower (func_info *);
static int FMax (func_info *);
static int FMbchar (func_info *);
static int FMbindex (func_info *);
static int FMblower (func_info *);
static int FMbpad (func_info *);
static int FMbstrlen (func_info *);
static int FMbsubstr (func_info *);
static int FMbupper (func_info *);
static int FMin (func_info *);
static int FMinsfromutc (func_info *);
static int FMinute (func_info *);
@@ -327,9 +329,11 @@ BuiltinFunc Func[] = {
{ "max", 1, NO_MAX, 1, FMax, NULL },
{ "mbchar", 1, NO_MAX, 1, FMbchar, NULL },
{ "mbindex", 2, 3, 1, FMbindex, NULL },
{ "mblower", 1, 1, 1, FMblower, NULL },
{ "mbpad", 3, 4, 1, FMbpad, NULL },
{ "mbstrlen", 1, 1, 1, FMbstrlen, NULL },
{ "mbsubstr", 2, 3, 1, FMbsubstr, NULL },
{ "mbupper", 1, 1, 1, FMbupper, NULL },
{ "min", 1, NO_MAX, 1, FMin, NULL },
{ "minsfromutc", 0, 2, 0, FMinsfromutc, NULL },
{ "minute", 1, 1, 1, FMinute, NULL },
@@ -4723,6 +4727,7 @@ FEvalTrig(func_info *info)
return r;
}
if (trig.tz != NULL && tim.ttime == NO_TIME) {
DestroyParser(&p);
FreeTrig(&trig);
return E_TZ_NO_AT;
}
@@ -4749,7 +4754,10 @@ FEvalTrig(func_info *info)
dse = -1;
}
DestroyParser(&p);
if (r) return r;
if (r) {
FreeTrig(&trig);
return r;
}
if (dse < 0) {
RetVal.type = INT_TYPE;
RETVAL = dse;
@@ -5173,3 +5181,50 @@ print_builtinfunc_tokens(void)
printf("%s\n", Func[i].name);
}
}
static int mbupper_lower(func_info *info, int upper)
{
wchar_t *ws;
char *s;
size_t i, len;
int r;
ASSERT_TYPE(0, STR_TYPE);
len = mbstowcs(NULL, ARGSTR(0), 0);
if (len == (size_t) -1) {
return E_BAD_MB_SEQ;
}
ws = calloc(len+1, sizeof(wchar_t));
if (!ws) {
return E_NO_MEM;
}
(void) mbstowcs(ws, ARGSTR(0), len+1);
for (i=0; i<len; i++) {
if (upper) {
ws[i] = towupper(ws[i]);
} else {
ws[i] = towlower(ws[i]);
}
}
len = wcstombs(NULL, ws, 0);
s = calloc(len+1, 1);
if (!s) {
free(ws);
return E_NO_MEM;
}
(void) wcstombs(s, ws, len+1);
r = RetStrVal(s, info);
free(s);
free(ws);
return r;
}
static int FMblower(func_info *info)
{
return mbupper_lower(info, 0);
}
static int FMbupper(func_info *info)
{
return mbupper_lower(info, 1);
}
+2
View File
@@ -74,6 +74,7 @@ EXTERN INIT( int DoPrefixLineNo, 0);
EXTERN INIT( int MondayFirst, 0);
EXTERN INIT( int AddBlankLines, 1);
EXTERN INIT( int Iterations, 1);
EXTERN INIT( int OrigIterations, 0);
EXTERN INIT( int PsCal, 0);
EXTERN INIT( int CalWidth, 80);
EXTERN INIT( int CalWeeks, 0);
@@ -106,6 +107,7 @@ EXTERN INIT( int DefaultPrio, NO_PRIORITY);
EXTERN INIT( int SysTime, -1);
EXTERN INIT( int LocalSysTime, -1);
EXTERN INIT( int ParseUntriggered, 0);
EXTERN INIT( int Shaded, 0);
EXTERN char const *InitialFile;
EXTERN char const *LocalTimeZone;
+124 -33
View File
@@ -54,6 +54,9 @@ static int tty_init(int fd);
static void tty_raw(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);
/***************************************************************
*
@@ -183,6 +186,7 @@ void InitRemind(int argc, char const *argv[])
int x;
int dse;
int ttyfd;
int r;
/* Make sure remind is not installed set-uid or set-gid */
if (getgid() != getegid() ||
@@ -668,6 +672,7 @@ void InitRemind(int argc, char const *argv[])
case 'D':
while (*arg) {
switch(*arg++) {
case 'p': case 'P': DebugFlag |= DB_PUSHPOP; break;
case 's': case 'S': DebugFlag |= DB_PARSE_EXPR; break;
case 'h': case 'H': DebugFlag |= DB_HASHSTATS; break;
case 'e': case 'E': DebugFlag |= DB_ECHO_LINE; break;
@@ -739,10 +744,27 @@ void InitRemind(int argc, char const *argv[])
if (i < argc) {
while (i < argc) {
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);
switch (tok.type) {
case T_Time:
if (SysTime != -1L) Usage();
if (SysTime != -1) Usage();
else {
SysTime = (long) tok.val * 60L;
LocalSysTime = SysTime;
@@ -752,7 +774,7 @@ void InitRemind(int argc, char const *argv[])
break;
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();
SysTime = (tok.val % MINUTES_PER_DAY) * 60;
LocalSysTime = SysTime;
@@ -797,42 +819,13 @@ void InitRemind(int argc, char const *argv[])
if (rep > 0) {
Iterations = rep;
OrigIterations = rep;
IgnoreOnce = 1;
DontQueue = 1;
Daemon = 0;
}
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 (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;
}
SetTodayFromCmdlineArgs(dse, y, m, d);
}
/* JSON mode turns off sorting */
@@ -1400,3 +1393,101 @@ GetTerminalBackground(void)
}
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;
}
}
+7
View File
@@ -295,6 +295,7 @@ PerIterationInit(void)
DefaultColorG = -1;
DefaultColorB = -1;
NumTriggered = 0;
Shaded = 0;
JSONLinesEmitted = 0;
ClearLastTriggers();
ClearDedupeTable();
@@ -1388,6 +1389,12 @@ static int DoDebug(ParsePtr p)
val = 0;
break;
case 'p':
case 'P':
if (val) DebugFlag |= DB_PUSHPOP;
else DebugFlag &= ~DB_PUSHPOP;
break;
case 'e':
case 'E':
if (val) DebugFlag |= DB_ECHO_LINE;
+4 -2
View File
@@ -176,8 +176,10 @@ int PopOmitContext(ParsePtr p)
/* Remove the context from the stack */
SavedOmitContexts = c->next;
if (c->filename && fname && strcmp(c->filename, fname)) {
Wprint(tr("POP-OMIT-CONTEXT at %s:%d matches PUSH-OMIT-CONTEXT in different file: %s:%d"), fname, LineNo, c->filename, c->lineno);
if (DebugFlag & DB_PUSHPOP) {
if (c->filename && fname && strcmp(c->filename, fname)) {
Wprint(tr("POP-OMIT-CONTEXT at %s:%d matches PUSH-OMIT-CONTEXT in different file: %s:%d"), fname, LineNo, c->filename, c->lineno);
}
}
/* Free memory used by the saved context */
if (c->partsave) free(c->partsave);
+9
View File
@@ -985,6 +985,14 @@ static void Init(int argc, char const *argv[])
case 'e': FillPage = 1; break;
case '-':
if (!strcmp(s, "version")) {
printf("rem2ps version %s\n", VERSION);
exit(0);
}
Usage("Unrecognized option");
break;
default: Usage("Unrecognized option");
}
}
@@ -1016,6 +1024,7 @@ void Usage(char const *s)
fprintf(stderr, "-e Make calendar fill entire page\n");
fprintf(stderr, "-x Put day numbers on left instead of right\n");
fprintf(stderr, "-o[lrtb] marg Specify left, right, top and bottom margins\n");
fprintf(stderr, "--version Print the version of rem2ps and exit\n");
exit(EXIT_FAILURE);
}
+13 -12
View File
@@ -221,18 +221,19 @@ typedef Parser *ParsePtr; /* Pointer to parser structure */
#define NO_MAX 127
/* DEFINES for debugging flags */
#define DB_PRTLINE 0x001
#define DB_PRTEXPR 0x002
#define DB_PRTTRIG 0x004
#define DB_DUMP_VARS 0x008
#define DB_ECHO_LINE 0x010
#define DB_TRACE_FILES 0x020
#define DB_PARSE_EXPR 0x040
#define DB_HASHSTATS 0x080
#define DB_TRANSLATE 0x100
#define DB_NONCONST 0x200
#define DB_UNUSED_VARS 0x400
#define DB_SWITCH_ZONE 0x800
#define DB_PRTLINE 0x0001
#define DB_PRTEXPR 0x0002
#define DB_PRTTRIG 0x0004
#define DB_DUMP_VARS 0x0008
#define DB_ECHO_LINE 0x0010
#define DB_TRACE_FILES 0x0020
#define DB_PARSE_EXPR 0x0040
#define DB_HASHSTATS 0x0080
#define DB_TRANSLATE 0x0100
#define DB_NONCONST 0x0200
#define DB_UNUSED_VARS 0x0400
#define DB_SWITCH_ZONE 0x0800
#define DB_PUSHPOP 0x1000
/* Enumeration of the tokens */
enum TokTypes
+41 -16
View File
@@ -117,16 +117,16 @@ int DoFrename(ParsePtr p)
return r;
}
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(&newbuf);
return E_REDEF_FUNC;
return E_REDEF_BUILTIN_FUNC;
}
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(&newbuf);
return E_REDEF_FUNC;
return E_REDEF_BUILTIN_FUNC;
}
RenameUserFunc(DBufValue(&oldbuf), DBufValue(&newbuf));
DBufFree(&oldbuf);
@@ -288,23 +288,29 @@ int DoFset(ParsePtr p)
nonconst_debug(0, tr("Function definition considered non-constant because of context"));
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->nargs = 0;
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 */
c=ParseNonSpaceChar(p, &r, 1);
if (r) return r;
if (r) {
DestroyUserFunc(func);
return r;
}
if (c == ')') {
(void) ParseNonSpaceChar(p, &r, 0);
} else {
@@ -449,6 +455,13 @@ static void DestroyUserFunc(UserFunc *f)
/***************************************************************/
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);
if (f) {
hash_table_delete(&FuncHash, f);
@@ -715,6 +728,16 @@ int PushUserFuncs(ParsePtr p)
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);
DBufFree(&buf);
@@ -744,8 +767,10 @@ int PopUserFuncs(ParsePtr p)
return E_POPF_NO_PUSH;
}
UserFuncStack = UserFuncStack->next;
if (strcmp(pf->filename, GetCurrentFilename())) {
Wprint(tr("POP-FUNCS at %s:%d matches PUSH-FUNCS in different file: %s:%d"), GetCurrentFilename(), LineNo, pf->filename, pf->lineno);
if (DebugFlag & DB_PUSHPOP) {
if (strcmp(pf->filename, GetCurrentFilename())) {
Wprint(tr("POP-FUNCS at %s:%d matches PUSH-FUNCS in different file: %s:%d"), GetCurrentFilename(), LineNo, pf->filename, pf->lineno);
}
}
for (i=0; i<pf->num_funcs; i++) {
UserFunc *clone = pf->funcs[i];
+12 -2
View File
@@ -850,6 +850,9 @@ int DoDump(ParsePtr p)
else {
fprintf(ErrFp, "%s ", v->name);
PrintValue(&(v->v), ErrFp);
if (v->preserve) {
fprintf(ErrFp, " <preserved>");
}
if (dump_constness) {
if (v->is_constant) {
fprintf(ErrFp, " <const>");
@@ -885,6 +888,9 @@ void DumpVarTable(int dump_constness)
hash_table_for_each(v, &VHashTbl) {
fprintf(ErrFp, "%s ", v->name);
PrintValue(&(v->v), ErrFp);
if (v->preserve) {
fprintf(ErrFp, " <preserved>");
}
if (dump_constness) {
if (v->is_constant) {
fprintf(ErrFp, " <const>");
@@ -1098,9 +1104,11 @@ static SysVar SysVarArr[] = {
{"Pm", 1, TRANS_TYPE, "pm", 0, 0 },
{"PrefixLineNo", 0, INT_TYPE, &DoPrefixLineNo, 0, 0 },
{"PSCal", 0, INT_TYPE, &PsCal, 0, 0 },
{"Repeat", 0, INT_TYPE, &OrigIterations, 0, 0 },
{"RunOff", 0, INT_TYPE, &RunDisabled, 0, 0 },
{"Saturday", 1, TRANS_TYPE, "Saturday", 0, 0 },
{"September", 1, TRANS_TYPE, "September", 0, 0 },
{"Shaded" , 0, INT_TYPE, &Shaded, 0, 0 },
{"SimpleCal", 0, INT_TYPE, &DoSimpleCalendar, 0, 0 },
{"SortByDate", 0, INT_TYPE, &SortByDate, 0, 0 },
{"SortByPrio", 0, INT_TYPE, &SortByPrio, 0, 0 },
@@ -1343,8 +1351,10 @@ PopVars(ParsePtr p)
return E_POPV_NO_PUSH;
}
VarStack = VarStack->next;
if (strcmp(pv->filename, GetCurrentFilename())) {
Wprint(tr("POP-VARS at %s:%d matches PUSH-VARS in different file: %s:%d"), GetCurrentFilename(), LineNo, pv->filename, pv->lineno);
if (DebugFlag & DB_PUSHPOP) {
if (strcmp(pv->filename, GetCurrentFilename())) {
Wprint(tr("POP-VARS at %s:%d matches PUSH-VARS in different file: %s:%d"), GetCurrentFilename(), LineNo, pv->filename, pv->lineno);
}
}
/* Pop the sysvars */
+7
View File
@@ -184,6 +184,7 @@ Hohl
Hplu
Hurray
HushMode
ICS
IFTRIG
IFs
IIF
@@ -257,6 +258,7 @@ Makefiles
Marczykowski
Marek
Marinus
Matariki
MaxFullOmits
MaxLateMinutes
MaxPartialOmits
@@ -543,6 +545,7 @@ difftime
doesn
dosubst
doublequote
dp
dq
dqi
dqis
@@ -687,10 +690,12 @@ maxlen
maybexs
mbchar
mbindex
mblower
mbpad
mbstowcs
mbstrlen
mbsubstr
mbupper
md
memcpy
messageBox
@@ -754,6 +759,7 @@ noto
nqueued
nroff
num
nz
ok
oktober
ol
@@ -995,6 +1001,7 @@ ziens
zj
zn
één
π
א
אב
אדר
+3 -3
View File
@@ -59,11 +59,11 @@ OMIT 2 Jan 1992
# Complicated expressions
SET a 3
FSET const(x) x+3
FSET is_const(x) x+3
FSET not_const(x) x+nonconst(a)
REM [const(5)] Jan 1992 MSG expired... should be commented out
REM [const(a)] Jan 1992 MSG expired... should be commented out
REM [is_const(5)] 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 [value("a")] Jan 1992 MSG constant expression
REM [value("__cabbage", 1)] Jan 1992 MSG non-constant expression
+15
View File
@@ -0,0 +1,15 @@
REM Wed SPECIAL SHADE 255 0 0
IF !$Shaded
REM 15 SPECIAL SHADE 0 255 0
ENDIF
IF !$Shaded
REM SATISFY [$Td % 4 == 0] SPECIAL SHADE 0 0 255
ENDIF
IF !$Shaded
REM Sunday SPECIAL SHADE 0 255 255
ENDIF
IF !$Shaded
REM SPECIAL SHADE 255 255 0
ENDIF
+4
View File
@@ -0,0 +1,4 @@
PUSH-OMIT-CONTEXT
PUSH-FUNCS a b c
PUSH-VARS a b c
DO test-pushpop2.rem
+4
View File
@@ -0,0 +1,4 @@
POP-VARS
POP-FUNCS
POP-OMIT-CONTEXT
+30 -12
View File
@@ -455,8 +455,8 @@ $REMIND -c ../tests/test-addomit.rem 1 Sep 2021 >> $OUT
$REMIND -cu ../tests/utf-8.rem 1 Nov 2019 >> $OUT
$REMIND -cu '-i$SuppressLRM=1' ../tests/utf-8.rem 1 Nov 2019 >> $OUT
TZ=America/Toronto $REMIND -dxe ../tests/tz.rem >> $OUT 2>&1
TZ=Europe/Berlin $REMIND -dxe ../tests/tz.rem >> $OUT 2>&1
TZ=America/Toronto $REMIND -dxe ../tests/tz.rem 2026-02-01 >> $OUT 2>&1
TZ=Europe/Berlin $REMIND -dxe ../tests/tz.rem 2026-02-01 >> $OUT 2>&1
$REMIND ../tests/soleq.rem 1 April 2044 >> $OUT 2>&1
@@ -479,18 +479,18 @@ echo "REM May 22 +10 MSG Bar %b" | $REMIND -tz - 2023-05-21 >> $OUT 2>&1
rm -rf include_dir/ww
touch include_dir/ww
chmod 0666 include_dir/ww
$REMIND include_dir/ww >> $OUT 2>&1
$REMIND include_dir/ww 2026-02-01 >> $OUT 2>&1
rm -rf include_dir/ww
# World-writable directory
mkdir -p include_dir/ww
touch include_dir/ww/0.rem
chmod 0777 include_dir/ww
$REMIND include_dir/ww >> $OUT 2>&1
$REMIND include_dir/ww 2026-02-01 >> $OUT 2>&1
rm -rf include_dir/ww
# This segfaulted in 04.02.03
$REMIND -h '-imsgprefix(x)="foo"' /dev/null >> $OUT 2>&1
$REMIND -h '-imsgprefix(x)="foo"' /dev/null 2026-02-01 >> $OUT 2>&1
# Test --version long option
$REMIND --version >> $OUT 2>&1
@@ -585,19 +585,19 @@ EOF
(echo 'BANNER %'; echo 'REM 29 MSG No bug') | $REMIND -dt - 29 Feb 2024 >> $OUT 2>&1
$REMIND -ifoo - <<'EOF' >> $OUT 2>&1
$REMIND -ifoo - 2026-02-01 <<'EOF' >> $OUT 2>&1
BANNER %
DUMP
EOF
$REMIND '-i$AddBlankLines' - <<'EOF' >> $OUT 2>&1
$REMIND '-i$AddBlankLines' - 2026-02-01 <<'EOF' >> $OUT 2>&1
BANNER %
DUMP $AddBlankLines
EOF
$REMIND ../tests/expr.rem >> $OUT 2>&1
$REMIND ../tests/expr.rem 2026-02-01 >> $OUT 2>&1
$REMIND - <<'EOF' >> $OUT 2>&1
$REMIND - 2026-02-01 <<'EOF' >> $OUT 2>&1
PUSH
POP
PUSH
@@ -709,7 +709,7 @@ echo "" >> $OUT
$REMIND --print-tokens < /dev/null >> $OUT 2>&1
# Torture test #2
$REMIND ../tests/torture2.rem >> $OUT 2>&1
$REMIND ../tests/torture2.rem 2026-02-01 >> $OUT 2>&1
# Expression error-reporting
$REMIND -de - 1 Feb 2024 <<'EOF' >> $OUT 2>&1
@@ -810,10 +810,10 @@ REM Wed MSG Wookie
EOF
# Test year-folding
TZ=America/Toronto $REMIND -dx ../tests/yearfold.rem >> $OUT 2>&1
TZ=America/Toronto $REMIND -dx ../tests/yearfold.rem 2026-02-01 >> $OUT 2>&1
# Test unused-variable debugging
$REMIND -du - <<'EOF' >> $OUT 2>&1
$REMIND -du - 2026-02-01 <<'EOF' >> $OUT 2>&1
set a 1
set b a*2
set c "What"
@@ -987,6 +987,24 @@ REM 15 INFO "Url: https://dianne.skoll.ca" CAL Hello, linky 3!
REM 15 INFO "Url: https://dianne.skoll.ca" SPECIAL COLOR 255 0 0 Hello, linky 4!
EOF
# Test the $Shaded system variable
$REMIND -pp ../tests/shaded.rem 2026-02-01 >> $OUT 2>&1
# Test the push/pop warnings
$REMIND ../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
if [ "$?" = "0" ]; then
echo "Remind: Acceptance tests ${GRN}PASSED${NRM}"
+108 -18
View File
@@ -1046,7 +1046,7 @@ set a057 value("a05"+"6")
"a05" + "6" => "a056"
value("a056") => "SDFJHSDF KSJDFH KJSDFH KSJDFH"
set a058 version()
version() => "06.02.03"
version() => "06.02.06"
set a059 wkday(today())
today() => 1991-02-16
wkday(1991-02-16) => "Saturday"
@@ -2609,7 +2609,7 @@ a056 "SDFJHSDF KSJDFH KJSDFH KSJDFH"
a007 "1991-02-16"
a057 "SDFJHSDF KSJDFH KJSDFH KSJDFH"
a008 "11:44"
a058 "06.02.03"
a058 "06.02.06"
a059 "Saturday"
a010 12
a060 6
@@ -5563,8 +5563,8 @@ REM SATISFY ""
REM SATISFY [version() > "01.00.00"]
../tests/test.rem(1074): SATISFY: expression has no reference to trigdate() or $T...
../tests/test.rem(1074): Trig = Saturday, 16 February, 1991
version() => "06.02.03"
"06.02.03" > "01.00.00" => 1
version() => "06.02.06"
"06.02.06" > "01.00.00" => 1
../tests/test.rem(1074): Trig(satisfied) = Saturday, 16 February, 1991
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...
@@ -16767,13 +16767,20 @@ mbpad("
../tests/test.rem(1902): Invalid value for system variable
../tests/test.rem(1903): Invalid value for system variable
../tests/test.rem(1904): Invalid value for system variable
DynBuf Mallocs: 1124 mallocs; 31872896 bytes
mbupper("öÖçÇéôñÑÉÊ") => "ÖÖÇÇÉÔÑÑÉÊ"
mblower("öÖçÇéôñÑÉÊ") => "ööççéôññéê"
upper("öÖçÇéôñÑÉÊ") => "öÖçÇéôñÑÉÊ"
lower("öÖçÇéôñÑÉÊ") => "öÖçÇéôñÑÉÊ"
../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:
Entries: 100146; Buckets: 87719; Non-empty Buckets: 66303
Maxlen: 5; Minlen: 0; Avglen: 1.142; Stddev: 0.878; Avg nonempty len: 1.510
Growths: 13; Shrinks: 0
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
Growths: 13; Shrinks: 0
Dedupe hash table statistics:
@@ -16785,11 +16792,11 @@ Translation hash table statistics:
Maxlen: 1; Minlen: 0; Avglen: 0.143; Stddev: 0.350; Avg nonempty len: 1.000
Growths: 0; Shrinks: 0
Expression nodes allocated: 302080
Expression nodes high-water: 302076
Expression nodes high-water: 302075
Expression nodes leaked: 0
Parse level high-water: 34
Max expr node evaluations per line: 2001
Total expression node evaluations: 106738
Total expression node evaluations: 106746
Test 2
@@ -20503,7 +20510,6 @@ Timed
Untimed
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
F1
@@ -20599,13 +20605,13 @@ OMIT 2 Jan 1992
# Complicated expressions
SET a 3
FSET const(x) x+3
FSET is_const(x) x+3
FSET not_const(x) x+nonconst(a)
#!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: 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: or a relative SCANFROM clause
REM [not_const(5)] Jan 1992 MSG nonconstant expression
@@ -20723,11 +20729,11 @@ OMIT 2 Jan 1992
# Complicated expressions
SET a 3
FSET const(x) x+3
FSET is_const(x) x+3
FSET not_const(x) x+nonconst(a)
#!P: Expired: REM [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(5)] 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
#!P: Expired: REM [value("a")] Jan 1992 MSG constant expression
REM [value("__cabbage", 1)] Jan 1992 MSG non-constant expression
@@ -23827,7 +23833,7 @@ SECURITY: Won't read world-writable file or directory!
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
06.02.03
06.02.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
@@ -23990,7 +23996,7 @@ No bug
Variable Value
foo 0
foo 0 <preserved>
No reminders.
Variable Value
@@ -24776,9 +24782,11 @@ lower
max
mbchar
mbindex
mblower
mbpad
mbstrlen
mbsubstr
mbupper
min
minsfromutc
minute
@@ -24942,9 +24950,11 @@ $ParseUntriggered
$Pm
$PrefixLineNo
$PSCal
$Repeat
$RunOff
$Saturday
$September
$Shaded
$SimpleCal
$SortByDate
$SortByPrio
@@ -25193,6 +25203,8 @@ TRANSLATE "Maximum expression complexity exceeded" ""
TRANSLATE "Expecting operator or end-of-expression" ""
TRANSLATE "Expecting constant, variable, function call or (expression)" ""
TRANSLATE "Invalid value for system variable" ""
TRANSLATE "Attempt to unset built-in function" ""
TRANSLATE "Attempt to PUSH built-in function" ""
# Other Messages
TRANSLATE "%s function `%s' defined at %s(%s) does not use its argument" ""
@@ -40230,4 +40242,82 @@ February 28
+----------+----------+----------+----------+----------+----------+----------+
|26 |27 |28 |29 |30 |31 | |
+----------+----------+----------+----------+----------+----------+----------+
# translations
{"LANGID":"en"}
# rem2ps2 begin
February 2026 28 0 0
Sunday Monday Tuesday Wednesday Thursday Friday Saturday
January 31
March 31
{"date":"2026-02-01","filename":"../tests/shaded.rem","lineno":10,"passthru":"SHADE","wd":["Sunday"],"is_todo":0,"priority":5000,"if_depth":1,"r":0,"g":255,"b":255,"body":"0 255 255"}
{"date":"2026-02-02","filename":"../tests/shaded.rem","lineno":14,"passthru":"SHADE","is_todo":0,"priority":5000,"if_depth":1,"r":255,"g":255,"b":0,"body":"255 255 0"}
{"date":"2026-02-03","filename":"../tests/shaded.rem","lineno":14,"passthru":"SHADE","is_todo":0,"priority":5000,"if_depth":1,"r":255,"g":255,"b":0,"body":"255 255 0"}
{"date":"2026-02-04","filename":"../tests/shaded.rem","lineno":1,"passthru":"SHADE","wd":["Wednesday"],"is_todo":0,"priority":5000,"r":255,"g":0,"b":0,"body":"255 0 0"}
{"date":"2026-02-05","filename":"../tests/shaded.rem","lineno":14,"passthru":"SHADE","is_todo":0,"priority":5000,"if_depth":1,"r":255,"g":255,"b":0,"body":"255 255 0"}
{"date":"2026-02-06","filename":"../tests/shaded.rem","lineno":14,"passthru":"SHADE","is_todo":0,"priority":5000,"if_depth":1,"r":255,"g":255,"b":0,"body":"255 255 0"}
{"date":"2026-02-07","filename":"../tests/shaded.rem","lineno":14,"passthru":"SHADE","is_todo":0,"priority":5000,"if_depth":1,"r":255,"g":255,"b":0,"body":"255 255 0"}
{"date":"2026-02-08","filename":"../tests/shaded.rem","lineno":6,"passthru":"SHADE","is_todo":0,"priority":5000,"if_depth":1,"r":0,"g":0,"b":255,"body":"0 0 255"}
{"date":"2026-02-09","filename":"../tests/shaded.rem","lineno":14,"passthru":"SHADE","is_todo":0,"priority":5000,"if_depth":1,"r":255,"g":255,"b":0,"body":"255 255 0"}
{"date":"2026-02-10","filename":"../tests/shaded.rem","lineno":14,"passthru":"SHADE","is_todo":0,"priority":5000,"if_depth":1,"r":255,"g":255,"b":0,"body":"255 255 0"}
{"date":"2026-02-11","filename":"../tests/shaded.rem","lineno":1,"passthru":"SHADE","wd":["Wednesday"],"is_todo":0,"priority":5000,"r":255,"g":0,"b":0,"body":"255 0 0"}
{"date":"2026-02-12","filename":"../tests/shaded.rem","lineno":6,"passthru":"SHADE","is_todo":0,"priority":5000,"if_depth":1,"r":0,"g":0,"b":255,"body":"0 0 255"}
{"date":"2026-02-13","filename":"../tests/shaded.rem","lineno":14,"passthru":"SHADE","is_todo":0,"priority":5000,"if_depth":1,"r":255,"g":255,"b":0,"body":"255 255 0"}
{"date":"2026-02-14","filename":"../tests/shaded.rem","lineno":14,"passthru":"SHADE","is_todo":0,"priority":5000,"if_depth":1,"r":255,"g":255,"b":0,"body":"255 255 0"}
{"date":"2026-02-15","filename":"../tests/shaded.rem","lineno":3,"passthru":"SHADE","d":15,"is_todo":0,"priority":5000,"if_depth":1,"r":0,"g":255,"b":0,"body":"0 255 0"}
{"date":"2026-02-16","filename":"../tests/shaded.rem","lineno":6,"passthru":"SHADE","is_todo":0,"priority":5000,"if_depth":1,"r":0,"g":0,"b":255,"body":"0 0 255"}
{"date":"2026-02-17","filename":"../tests/shaded.rem","lineno":14,"passthru":"SHADE","is_todo":0,"priority":5000,"if_depth":1,"r":255,"g":255,"b":0,"body":"255 255 0"}
{"date":"2026-02-18","filename":"../tests/shaded.rem","lineno":1,"passthru":"SHADE","wd":["Wednesday"],"is_todo":0,"priority":5000,"r":255,"g":0,"b":0,"body":"255 0 0"}
{"date":"2026-02-19","filename":"../tests/shaded.rem","lineno":14,"passthru":"SHADE","is_todo":0,"priority":5000,"if_depth":1,"r":255,"g":255,"b":0,"body":"255 255 0"}
{"date":"2026-02-20","filename":"../tests/shaded.rem","lineno":6,"passthru":"SHADE","is_todo":0,"priority":5000,"if_depth":1,"r":0,"g":0,"b":255,"body":"0 0 255"}
{"date":"2026-02-21","filename":"../tests/shaded.rem","lineno":14,"passthru":"SHADE","is_todo":0,"priority":5000,"if_depth":1,"r":255,"g":255,"b":0,"body":"255 255 0"}
{"date":"2026-02-22","filename":"../tests/shaded.rem","lineno":10,"passthru":"SHADE","wd":["Sunday"],"is_todo":0,"priority":5000,"if_depth":1,"r":0,"g":255,"b":255,"body":"0 255 255"}
{"date":"2026-02-23","filename":"../tests/shaded.rem","lineno":14,"passthru":"SHADE","is_todo":0,"priority":5000,"if_depth":1,"r":255,"g":255,"b":0,"body":"255 255 0"}
{"date":"2026-02-24","filename":"../tests/shaded.rem","lineno":6,"passthru":"SHADE","is_todo":0,"priority":5000,"if_depth":1,"r":0,"g":0,"b":255,"body":"0 0 255"}
{"date":"2026-02-25","filename":"../tests/shaded.rem","lineno":1,"passthru":"SHADE","wd":["Wednesday"],"is_todo":0,"priority":5000,"r":255,"g":0,"b":0,"body":"255 0 0"}
{"date":"2026-02-26","filename":"../tests/shaded.rem","lineno":14,"passthru":"SHADE","is_todo":0,"priority":5000,"if_depth":1,"r":255,"g":255,"b":0,"body":"255 255 0"}
{"date":"2026-02-27","filename":"../tests/shaded.rem","lineno":14,"passthru":"SHADE","is_todo":0,"priority":5000,"if_depth":1,"r":255,"g":255,"b":0,"body":"255 255 0"}
{"date":"2026-02-28","filename":"../tests/shaded.rem","lineno":6,"passthru":"SHADE","is_todo":0,"priority":5000,"if_depth":1,"r":0,"g":0,"b":255,"body":"0 0 255"}
# rem2ps2 end
No reminders.
../tests/test-pushpop2.rem(1): POP-VARS at ../tests/test-pushpop2.rem:1 matches PUSH-VARS in different file: ../tests/test-pushpop1.rem:3
../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
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
+14
View File
@@ -1903,6 +1903,20 @@ SET $TimeSep "FOO"
SET $DateSep "BAR"
SET $DefaultColor "My oh my, what lovely eyes!"
# mbupper and mblower
DEBUG +x
SET a mbupper("öÖçÇéôñÑÉÊ")
SET a mblower("öÖçÇéôñÑÉÊ")
SET a upper("öÖçÇéôñÑÉÊ")
SET a lower("öÖçÇéôñÑÉÊ")
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
EXIT