Compare commits

..

114 Commits

Author SHA1 Message Date
Dianne Skoll
a8607cb012 Add some terms to hunspell dictionary. 2025-11-10 12:15:34 -05:00
Dianne Skoll
6caa404e59 Prep for 06.02.01 release. 2025-11-10 12:14:28 -05:00
Dianne Skoll
13e1e19855 Add some tests; make tess pass on MUSL. 2025-11-10 12:08:58 -05:00
Dianne Skoll
96d40b81df Make early exit contingent upon ParseUntriggered. 2025-11-10 12:02:47 -05:00
Dianne Skoll
30e4a9fc50 Catch possible error 2025-11-06 21:42:57 -05:00
Dianne Skoll
6d0fbeed20 Hide font chooser if we kill .opts 2025-11-06 21:40:58 -05:00
Dianne Skoll
3f1aaeefd2 Raise .opts when font chooser is dismissed. 2025-11-06 21:39:42 -05:00
Dianne Skoll
326604fe18 Free trigger resources if we exit early because of expired reminder. 2025-11-04 17:07:09 -05:00
Dianne Skoll
57e93553bf Exit early if a reminder has expired. 2025-11-04 17:05:02 -05:00
Dianne Skoll
a5aa5d901b Prevent test failures. 2025-11-03 10:33:10 -05:00
Dianne Skoll
1e0d43b63c Tweak WHATSNEW. 2025-11-03 10:16:37 -05:00
Dianne Skoll
188efaebba Update test file. 2025-11-03 10:14:15 -05:00
Dianne Skoll
b701dc575f Prep for 06.02.00 release. 2025-11-03 10:13:16 -05:00
Dianne Skoll
c9ae1c82f0 Make all weekly boxes the same height. 2025-11-02 21:44:31 -05:00
Dianne Skoll
13cea56cce Draw moon phases left-aligned on weekly calendars. 2025-11-02 21:32:36 -05:00
Dianne Skoll
6661f32faf In weekly calendars, draw moon phases smaller and in days without moon
phases, don't leave a big gap at the top.
2025-11-02 21:28:44 -05:00
Dianne Skoll
f6ab660c5e Correct positioning of WEEK special. 2025-11-02 21:18:17 -05:00
Dianne Skoll
523cfb7bf5 Document common INFO strings. 2025-11-02 20:15:30 -05:00
Dianne Skoll
82a4ba777d Update WHATSNEW 2025-11-02 14:07:43 -05:00
Dianne Skoll
8f02868486 Refactor code. 2025-11-02 14:00:59 -05:00
Dianne Skoll
12d8e8e948 Add support for turning reminders with "URL" info strings into hyperlinks if your terminal supports it.
Use the "z" flag with -c.
2025-11-02 13:29:41 -05:00
Dianne Skoll
f5f364507b Add not about Jochen Sprickerhof's work on test-rem. 2025-11-02 12:33:36 -05:00
Dianne Skoll
d514389c39 Sort the dictionary. :) 2025-11-02 12:31:44 -05:00
Dianne Skoll
52c615ff61 Revert warning if BANNER is used after a banner has already been issued.
https://dianne.skoll.ca/pipermail/remind-fans/2025/005268.html
2025-11-02 12:21:12 -05:00
Dianne Skoll
7d3e6b3a72 Warn if we see a BANNER command when the banner has already been issued. 2025-11-02 11:28:48 -05:00
Dianne Skoll
c4e5190ec2 Add missing key bindings. 2025-11-02 10:59:39 -05:00
Dianne Skoll
f197f5ef9d Document keyboard shortcuts 2025-11-02 10:55:58 -05:00
Dianne Skoll
153cbfe276 A bunch more key bindings. 2025-11-02 10:52:39 -05:00
Dianne Skoll
2d9bea444b Add a bunch more key bindings. 2025-11-02 10:48:40 -05:00
Dianne Skoll
2ae8e51bec Style fix. 2025-11-02 09:43:13 -05:00
Dianne Skoll
05d1608081 Update man page. 2025-11-02 09:32:52 -05:00
Dianne Skoll
d093e8dea3 Make "Esc" close agenda-mode window. 2025-11-02 09:31:21 -05:00
Dianne Skoll
f9fac22bbf Bind "KeyPress-t" to ShowTodaysReminders. 2025-11-02 09:28:16 -05:00
Dianne Skoll
9ecbfbb314 Make details popup work again. 2025-11-02 09:25:29 -05:00
Dianne Skoll
612f3e7f16 Make sure .balloonhelp doesn't exist if we try to create it. 2025-11-02 09:20:07 -05:00
Dianne Skoll
d22f9979a5 Make sure .balloonhelp doesn't exist if we try to create it. 2025-11-02 09:16:23 -05:00
Dianne Skoll
291f648d2e Update WHATSNEW 2025-11-02 09:00:07 -05:00
Dianne Skoll
351088fd4b Proper key names. 2025-11-02 08:49:11 -05:00
Dianne Skoll
ed57f62911 Add navigation to the Agenda Mode window. 2025-11-02 08:48:16 -05:00
Dianne Skoll
53dcce6a91 Use a macro instead of repeating myself. 2025-11-01 21:15:24 -04:00
Dianne Skoll
d12d327e35 Include ')' in non-illegal char set. 2025-11-01 21:09:19 -04:00
Dianne Skoll
a2f760fb91 Better diagnostics for errors like: SET a 3 * * 4 2025-11-01 21:07:39 -04:00
Dianne Skoll
4a9b4ff6e4 Show errors in weekly view too; use fixd-width font for error window. 2025-11-01 20:10:22 -04:00
Dianne Skoll
ce6061a29b Add test for bug fixed in commit 878a5d9bed 2025-11-01 20:00:14 -04:00
Dianne Skoll
878a5d9bed Avoid spurious parse error if there's trailing space after the end of an expression. 2025-11-01 19:58:46 -04:00
Dianne Skoll
d1b55bae8d Add keyboard shortcuts to change view. 2025-11-01 18:46:51 -04:00
Dianne Skoll
c13817015f Allow editing and the subsequent running of (possibly edited) print command. 2025-11-01 15:46:46 -04:00
Dianne Skoll
bf74ad1eb7 Reword error message. 2025-11-01 13:07:38 -04:00
Dianne Skoll
f2eb06c752 Refresh view on date rollover. 2025-11-01 00:01:34 -04:00
Dianne Skoll
8172acf102 Tidy up print dialog to get rid of rem2ps artifacts. 2025-10-31 17:00:29 -04:00
Dianne Skoll
949e00219d Update man page to remove references to rem2ps 2025-10-31 16:54:36 -04:00
Dianne Skoll
1fd19b89e2 Remove support for rem2ps - we use rem2pdf to print. 2025-10-31 16:51:59 -04:00
Dianne Skoll
22d6c0583a Make PANGO @x,y positioning consistent between monthly and weekly calendars. 2025-10-31 16:40:07 -04:00
Dianne Skoll
12fac555b6 When printing, print the same view as what we're viewing. 2025-10-31 16:10:53 -04:00
Dianne Skoll
085b781114 Prevent segfault. 2025-10-31 12:51:05 -04:00
Dianne Skoll
c9d7fbf479 Trim reminders so we don't inadvertantly think they've been changed. 2025-10-31 12:45:42 -04:00
Dianne Skoll
42f868db07 Prep for 06.01.09 release. 2025-10-31 11:02:16 -04:00
Dianne Skoll
2996275ec4 Update man page 2025-10-31 10:56:30 -04:00
Dianne Skoll
5586198a0e Save the view in Options so if you switch views, it is remembered. 2025-10-31 10:52:29 -04:00
Dianne Skoll
d17c48e751 Implement 1-, 2- and 4-week displays in addition to monthly. 2025-10-30 22:00:28 -04:00
Dianne Skoll
e08a6370ef Proper error propagation. 2025-10-30 20:24:23 -04:00
Dianne Skoll
7a319466cf Fix error output 2025-10-30 18:00:34 -04:00
Dianne Skoll
4158ad5977 More work towards supporting weekly calendars. 2025-10-30 17:17:11 -04:00
Dianne Skoll
9b07eed26f More work towards supporting weekly calendars. 2025-10-30 16:37:02 -04:00
Dianne Skoll
05ead8c40d More helpful errors when parsing expressions. 2025-10-30 14:30:29 -04:00
Dianne Skoll
35e222967c More work on supporting weekly calendar views. 2025-10-30 13:03:40 -04:00
Dianne Skoll
83ca07d34f Start laying the groundwork for supporting weekly views in tkremind. 2025-10-30 12:25:57 -04:00
Dianne Skoll
36f4bb852b Avoid warnings on FreeBSD. 2025-10-29 13:46:41 -04:00
Dianne Skoll
9642303d05 Proper test for link-time optimizations. 2025-10-29 13:44:55 -04:00
Dianne Skoll
a6144baff7 Add -Werror so we don't enable -ffat-lto-objects on FreeBSD. 2025-10-29 13:41:34 -04:00
Dianne Skoll
17985c59c3 Bind the KP_* variations of Home, Left, Right, Prior and Next.
Start adding support for window properties.
2025-10-29 13:35:21 -04:00
Dianne Skoll
719295ccd7 Update man page to reflect new reality of hand-edited reminders. 2025-10-29 12:33:23 -04:00
Dianne Skoll
3d74389713 Remove dead code; if a reminder is hand-edited, make it non-modifiable via TkRemind. 2025-10-29 12:29:24 -04:00
Dianne Skoll
80c7244d64 Merge branch 'test_support_env' into 'master'
test-rem: support for $REMIND_CMD and $REM2PS

See merge request dskoll/remind!10
2025-10-28 09:39:24 -04:00
Jochen Sprickerhof
db27be1469 test-rem: support for $REMIND_CMD and $REM2PS 2025-10-28 09:39:24 -04:00
Dianne Skoll
d59fe832fd Update version number. 2025-10-27 10:24:11 -04:00
Dianne Skoll
88ebdf275e Avoid test failure. 2025-10-27 10:23:38 -04:00
Dianne Skoll
a7a6f8b5f0 Prep for 06.01.08 release. 2025-10-27 10:22:29 -04:00
Dianne Skoll
3e248c069e Change button color. 2025-10-26 16:46:14 -04:00
Dianne Skoll
65cca1fd8f Remove useless test. 2025-10-25 12:45:59 -04:00
Dianne Skoll
5a889043ba Remove misleading wording. 2025-10-25 12:42:58 -04:00
Dianne Skoll
6d1fcdf246 Change button color. 2025-10-25 11:04:52 -04:00
Dianne Skoll
3476b965ef Add "Show Command" option to Print dialog. 2025-10-24 16:31:27 -04:00
Dianne Skoll
0bba2dc3b3 Fix modal file browser. 2025-10-24 10:27:48 -04:00
Dianne Skoll
e5c27f19f5 Handle window raising better. 2025-10-24 08:52:59 -04:00
Dianne Skoll
f9aa53433e Raise .edit on button press. 2025-10-24 08:51:06 -04:00
Dianne Skoll
5323245529 Use wm protocol WM_DELETE_WINDOW on the .edit modal as well. 2025-10-24 08:49:14 -04:00
Dianne Skoll
deb12ac7cd Fix all modal dialogs. 2025-10-24 08:12:20 -04:00
Dianne Skoll
a1488d93ad Finally fix all the race conditions. 2025-10-23 22:00:06 -04:00
Dianne Skoll
65add3d32e Reset EditingReminder to 0 if edit window is destroyed. 2025-10-23 21:23:39 -04:00
Dianne Skoll
8d6f5efa7b Fix race conditions seen on slow computers if you double-click a day number or tagged reminder. 2025-10-23 17:54:40 -04:00
Dianne Skoll
eb996a8146 Avoid error if you click too fast on a tagged reminder. 2025-10-23 17:12:18 -04:00
Dianne Skoll
1cd6205cdd Make TkRemind work on dumb systems that use "poor-man's" bold and italic. 2025-10-23 12:08:02 -04:00
Dianne Skoll
6d9ccc1522 Make bold and italic work on stupid systems. 2025-10-23 11:49:58 -04:00
Dianne Skoll
0268020579 Bump version to 06.01.07 2025-10-23 11:23:10 -04:00
Dianne Skoll
5803d1dd7e Update changelog 2025-10-23 11:22:40 -04:00
Dianne Skoll
5dfce21af6 Add ?tkr=1 2025-10-23 11:18:37 -04:00
Dianne Skoll
8ddb956f9a Change cursor inside links 2025-10-22 23:36:58 -04:00
Dianne Skoll
32421815cd Make the version numbers in WHATSNEW match the ones in Remind. 2025-10-22 22:51:00 -04:00
Dianne Skoll
dbe3bc13fa Make links blue. 2025-10-22 16:48:05 -04:00
Dianne Skoll
c68c716585 Make URLs in man pages clickable. 2025-10-22 16:09:30 -04:00
Dianne Skoll
7a1a5abc0f Give the window an appropriate title. 2025-10-22 13:05:14 -04:00
Dianne Skoll
53a1318306 Tweak man pages to remove "4th Berkeley Distribution" 2025-10-22 12:59:23 -04:00
Dianne Skoll
78fecf28c4 More info 2025-10-22 12:40:20 -04:00
Dianne Skoll
6081d29b11 Reduce flicker. 2025-10-22 12:33:51 -04:00
Dianne Skoll
e0a5125ee0 Set focus to man page window so PgUp, etc work as expected. 2025-10-22 12:30:50 -04:00
Dianne Skoll
c3f790a99b Allow for browsing of other man pages in the "SEE ALSO" section. 2025-10-22 12:27:15 -04:00
Dianne Skoll
3eb507451e Nicely format the man page. 2025-10-22 11:33:20 -04:00
Dianne Skoll
e9e0368418 six => seven 2025-10-22 10:28:49 -04:00
Dianne Skoll
759ae1ab80 Add a "help" button that shows TkRemind's man page, positioned to a useful place. 2025-10-22 10:25:42 -04:00
Dianne Skoll
e8602824a0 Add helpful message. 2025-10-22 09:47:57 -04:00
Dianne Skoll
62301a88cc We don't use _chan any more. 2025-10-20 14:17:52 -04:00
Dianne Skoll
6b163092c7 Check spelling of Perl man pages too. 2025-10-20 13:55:33 -04:00
Dianne Skoll
f8ac99d22e Tighten up display 2025-10-20 13:43:04 -04:00
26 changed files with 1703 additions and 680 deletions

28
configure vendored
View File

@@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.72 for remind 06.01.06. # Generated by GNU Autoconf 2.72 for remind 06.02.01.
# #
# #
# Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, # Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation,
@@ -601,8 +601,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='remind' PACKAGE_NAME='remind'
PACKAGE_TARNAME='remind' PACKAGE_TARNAME='remind'
PACKAGE_VERSION='06.01.06' PACKAGE_VERSION='06.02.01'
PACKAGE_STRING='remind 06.01.06' PACKAGE_STRING='remind 06.02.01'
PACKAGE_BUGREPORT='' PACKAGE_BUGREPORT=''
PACKAGE_URL='https://dianne.skoll.ca/projects/remind/' PACKAGE_URL='https://dianne.skoll.ca/projects/remind/'
@@ -1258,7 +1258,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
'configure' configures remind 06.01.06 to adapt to many kinds of systems. 'configure' configures remind 06.02.01 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1320,7 +1320,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of remind 06.01.06:";; short | recursive ) echo "Configuration of remind 06.02.01:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@@ -1408,7 +1408,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
remind configure 06.01.06 remind configure 06.02.01
generated by GNU Autoconf 2.72 generated by GNU Autoconf 2.72
Copyright (C) 2023 Free Software Foundation, Inc. Copyright (C) 2023 Free Software Foundation, Inc.
@@ -1871,7 +1871,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by remind $as_me 06.01.06, which was It was created by remind $as_me 06.02.01, which was
generated by GNU Autoconf 2.72. Invocation command line was generated by GNU Autoconf 2.72. Invocation command line was
$ $0$ac_configure_args_raw $ $0$ac_configure_args_raw
@@ -4231,6 +4231,7 @@ U="`uname -s`"
if test "$U" != "SunOS" -a "$GCC" = yes; then if test "$U" != "SunOS" -a "$GCC" = yes; then
CFLAGS="$CFLAGS -Wall -Wextra -Wstrict-prototypes" CFLAGS="$CFLAGS -Wall -Wextra -Wstrict-prototypes"
# Check for link-time optimization support # Check for link-time optimization support
OLDCFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -flto=auto" CFLAGS="$CFLAGS -flto=auto"
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -flto=auto" >&5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -flto=auto" >&5
printf %s "checking whether $CC supports -flto=auto... " >&6; } printf %s "checking whether $CC supports -flto=auto... " >&6; }
@@ -4258,11 +4259,12 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lto" >&5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lto" >&5
printf "%s\n" "$lto" >&6; } printf "%s\n" "$lto" >&6; }
if test "x$lto" != "xyes" ; then if test "x$lto" != "xyes" ; then
CFLAGS="$CFLAGS -Wall -Wextra -Wstrict-prototypes" CFLAGS="$OLDCFLAGS"
else else
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -ffat-lto-object" >&5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -ffat-lto-object" >&5
printf %s "checking whether $CC supports -ffat-lto-object... " >&6; } printf %s "checking whether $CC supports -ffat-lto-object... " >&6; }
CFLAGS="$CFLAGS -ffat-lto-objects" OLDCFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -Werror -ffat-lto-objects"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */ /* end confdefs.h. */
int x = 1; int x = 1;
@@ -4287,7 +4289,9 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lto" >&5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lto" >&5
printf "%s\n" "$lto" >&6; } printf "%s\n" "$lto" >&6; }
if test "x$lto" != "xyes" ; then if test "x$lto" != "xyes" ; then
CFLAGS="$CFLAGS -Wall -Wextra -Wstrict-prototypes -flto=auto" CFLAGS="$OLDCFLAGS"
else
CFLAGS="$OLDCFLAGS -ffat-lto-objects"
fi fi
fi fi
fi fi
@@ -4895,7 +4899,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by remind $as_me 06.01.06, which was This file was extended by remind $as_me 06.02.01, which was
generated by GNU Autoconf 2.72. Invocation command line was generated by GNU Autoconf 2.72. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@@ -4960,7 +4964,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config='$ac_cs_config_escaped' ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\ ac_cs_version="\\
remind config.status 06.01.06 remind config.status 06.02.01
configured by $0, generated by GNU Autoconf 2.72, configured by $0, generated by GNU Autoconf 2.72,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View File

@@ -1,6 +1,6 @@
dnl Process this file with autoconf to produce a configure script. dnl Process this file with autoconf to produce a configure script.
AC_INIT(remind, 06.01.06, , , https://dianne.skoll.ca/projects/remind/) AC_INIT(remind, 06.02.01, , , https://dianne.skoll.ca/projects/remind/)
AC_CONFIG_SRCDIR([src/queue.c]) AC_CONFIG_SRCDIR([src/queue.c])
cat <<'EOF' cat <<'EOF'
@@ -50,6 +50,7 @@ U="`uname -s`"
if test "$U" != "SunOS" -a "$GCC" = yes; then if test "$U" != "SunOS" -a "$GCC" = yes; then
CFLAGS="$CFLAGS -Wall -Wextra -Wstrict-prototypes" CFLAGS="$CFLAGS -Wall -Wextra -Wstrict-prototypes"
# Check for link-time optimization support # Check for link-time optimization support
OLDCFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -flto=auto" CFLAGS="$CFLAGS -flto=auto"
AC_MSG_CHECKING([whether $CC supports -flto=auto]) AC_MSG_CHECKING([whether $CC supports -flto=auto])
AC_LINK_IFELSE( AC_LINK_IFELSE(
@@ -61,10 +62,11 @@ if test "$U" != "SunOS" -a "$GCC" = yes; then
) )
AC_MSG_RESULT([$lto]) AC_MSG_RESULT([$lto])
if test "x$lto" != "xyes" ; then if test "x$lto" != "xyes" ; then
CFLAGS="$CFLAGS -Wall -Wextra -Wstrict-prototypes" CFLAGS="$OLDCFLAGS"
else else
AC_MSG_CHECKING([whether $CC supports -ffat-lto-object]) AC_MSG_CHECKING([whether $CC supports -ffat-lto-object])
CFLAGS="$CFLAGS -ffat-lto-objects" OLDCFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -Werror -ffat-lto-objects"
AC_LINK_IFELSE( AC_LINK_IFELSE(
[AC_LANG_PROGRAM( [AC_LANG_PROGRAM(
[[int x = 1;]], [[int x = 1;]],
@@ -74,7 +76,9 @@ if test "$U" != "SunOS" -a "$GCC" = yes; then
) )
AC_MSG_RESULT([$lto]) AC_MSG_RESULT([$lto])
if test "x$lto" != "xyes" ; then if test "x$lto" != "xyes" ; then
CFLAGS="$CFLAGS -Wall -Wextra -Wstrict-prototypes -flto=auto" CFLAGS="$OLDCFLAGS"
else
CFLAGS="$OLDCFLAGS -ffat-lto-objects"
fi fi
fi fi
fi fi

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
# Save variables and functions that we will mess with # Save variables and functions that we will mess with
PUSH-VARS InIsrael IncludeIsraeliHolidays Reform IncludeOmer IncludeOmerCal SunCal ostart yz PUSH-VARS InIsrael IncludeIsraeliHolidays Reform IncludeOmer IncludeOmerCal SunCal ostart yz
PUSH-FUNCS _chan _h2 _h2I _YZ _PastSat _BackTwoSat PUSH-FUNCS _h2 _h2I _YZ _PastSat _BackTwoSat
SET InIsrael value("InIsrael", 0) SET InIsrael value("InIsrael", 0)
SET IncludeIsraeliHolidays value("IncludeIsraeliHolidays", 1) SET IncludeIsraeliHolidays value("IncludeIsraeliHolidays", 1)

View File

@@ -1,5 +1,4 @@
.TH REM 1 "@RELEASE_DATE@" "User Commands" "VERSION @VERSION@" .TH REM 1 "@RELEASE_DATE@" "Remind" "VERSION @VERSION@"
.UC 4
.SH NAME .SH NAME
rem \- Invoke Remind with a default filename rem \- Invoke Remind with a default filename
.SH SYNOPSIS .SH SYNOPSIS

View File

@@ -1,5 +1,4 @@
.TH REM2PS 1 "@RELEASE_DATE@" "User Commands" "VERSION @VERSION@" .TH REM2PS 1 "@RELEASE_DATE@" "Remind" "VERSION @VERSION@"
.UC 4
.SH NAME .SH NAME
rem2ps \- draw a PostScript calendar from Remind output rem2ps \- draw a PostScript calendar from Remind output
.SH SYNOPSIS .SH SYNOPSIS

View File

@@ -1,5 +1,4 @@
.TH REMIND 1 "@RELEASE_DATE@" "User Commands" "VERSION @VERSION@" .TH REMIND 1 "@RELEASE_DATE@" "Remind" "VERSION @VERSION@"
.UC 4
.SH NAME .SH NAME
remind \- a sophisticated reminder service remind \- a sophisticated reminder service
.SH SYNOPSIS .SH SYNOPSIS
@@ -103,6 +102,12 @@ flag also enables the use of the UNICODE "left-to-right" mark that
can fix up formatting problems with right-to-left languages in the calendar can fix up formatting problems with right-to-left languages in the calendar
display. display.
.TP .TP
.B 'z'
causes \fBRemind\fR to use escape sequences to turn reminders with a
"URL" info string into hyperlinks. In order to work, your terminal
must support the escape sequences documented at
https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda
.TP
.B 'c' .B 'c'
causes \fBRemind\fR to use VT100 escape sequences to approximate causes \fBRemind\fR to use VT100 escape sequences to approximate
SPECIAL COLOR reminders. Note that this flag is kept for SPECIAL COLOR reminders. Note that this flag is kept for
@@ -1486,6 +1491,15 @@ and description of a reminder like this:
MSG Engineering meeting MSG Engineering meeting
.fi .fi
.PP .PP
While back-ends can choose which INFO strings to support, all back-ends
should endeavor to support three standard ones: \fBLocation:\fR,
\fBDescription:\fR and \fBUrl:\fR. TkRemind supports all three of these,
turning reminders with a \fBUrl:\fR INFO string into hyper-links, and
popping up information windows for the \fBLocation:\fR and \fBDescription:\fR
INFO strings. \fBLocation:\fR and \fBUrl:\fR are self-explanatory;
\fBDescription:\fR is meant for a longer, more in-depth description
of the reminder than the summary that is normally displayed.
.PP
The \fBDURATION\fR keyword makes sense only for timed reminders; it The \fBDURATION\fR keyword makes sense only for timed reminders; it
specifies the duration of an event. For example, if you have a specifies the duration of an event. For example, if you have a
90-minute meeting starting at 1:00pm, you could use any of the following: 90-minute meeting starting at 1:00pm, you could use any of the following:
@@ -5314,8 +5328,7 @@ expressions are evaluated only once, not recursively. Thus, writing:
.fi .fi
.PP .PP
causes \fBRemind\fR to read the token "[a+b]". It does not interpret causes \fBRemind\fR to read the token "[a+b]". It does not interpret
this as a pasted-in expression. In fact, the only way to get a literal this as a pasted-in expression.
left-bracket into a reminder is to use ["["].
.PP .PP
You can use expression pasting almost anywhere. However, there are a few You can use expression pasting almost anywhere. However, there are a few
exceptions: exceptions:
@@ -5602,8 +5615,6 @@ following example:
# FSET -f(x) 2*x # FSET -f(x) 2*x
.fi .fi
.PP .PP
to define a function and suppress any "redefined function" warning.
.PP
.SH SAVING AND RESTORING FUNCTIONS .SH SAVING AND RESTORING FUNCTIONS
.PP .PP
Occasionally, it is useful to redefine a function for a specific block of Occasionally, it is useful to redefine a function for a specific block of

View File

@@ -1,5 +1,4 @@
.TH TKREMIND 1 "@RELEASE_DATE@" "User Commands" "VERSION @VERSION@" .TH TKREMIND 1 "@RELEASE_DATE@" "Remind" "VERSION @VERSION@"
.UC 4
.SH NAME .SH NAME
tkremind \- graphical front-end to Remind calendar program tkremind \- graphical front-end to Remind calendar program
.SH SYNOPSIS .SH SYNOPSIS
@@ -54,29 +53,47 @@ directory before starting \fBTkRemind\fR.
When you start \fBTkRemind\fR, it displays a calendar for the current When you start \fBTkRemind\fR, it displays a calendar for the current
month, with today's date highlighted. Reminders are filled into each month, with today's date highlighted. Reminders are filled into each
box on the calendar. If a box contains many reminders, you can scroll box on the calendar. If a box contains many reminders, you can scroll
it up and down by dragging mouse button 2 in the box. Note that there it up and down by dragging mouse button 2 in the box or by using the
is no specific indication of an over-full box; you'll just have to scroll wheel (if your mouse has one.) Note that there is no specific
notice that the box appears completely full. indication of an over-full box; you'll just have to notice that the
box appears completely full.
.SH NAVIGATING .SH NAVIGATING
To change to the previous or next month, click the \fB<\-\fR To change to the previous or next month, click the \fB<\-\fR
or \fB\->\fR button, respectively. You can also use the left/right arrow or \fB\->\fR button, respectively. You can also use the left/right arrow
keys or PageUp/PageDown to navigate. keys or \fBPgUp\fR/\fBPgDn\fR to navigate.
To change back to the current month, click \fBToday\fR or press the To change back to the current month, click \fBToday\fR or press the
Home key. To go to a specific month, click \fBGo To Date...\fR. This \fBHome\fR key. To go to a specific month, click \fBGo To Date...\fR
pops up a dialog box which allows you to select a month and enter a or press \fBg\fR. This pops up a dialog box which allows you to
year. Once you've done this, click \fBGo\fR to go to the date, or select a month and enter a year. Once you've done this, click
\fBCancel\fR to cancel. \fBGo\fR to go to the date, or \fBCancel\fR to cancel. Note also that
all pop-up windows in \fBTkRemind\fR can be dismissed by pressing
\fBEsc\fR or \fBControl-w\fR.
To exit \fBTkRemind\fR, click \fBQuit\fR. To exit \fBTkRemind\fR, click \fBQuit\fR or press \fBControl-q\fR..
.SH CHANGING THE VIEW
By default, \fBTkRemind\fR shows the calendar for an entire month.
The \fBView...\fR menu lets you pick from the following choices: Display
an entire month, or display one, two or four weeks' worth of reminders.
If you change the view, \fBTkRemind\fR remembers the change and that
view becomes the default view next time you start \fBTkRemind\fR
In the monthly view, the Next and Previous navigation buttons and keyboard
shortcuts move by one month. In all other views, they move by one week.
This is true even for views that display multiple weeks.
You can press the keys \fB1\fR, \fB2\fR, \fB4\fR or \fBm\fR over the
main calendar window to change the view to one week, two weeks, four weeks
or one month, respectively.
.SH ADDING REMINDERS .SH ADDING REMINDERS
To add a reminder, click button 1 in any day number in the calendar. To add a reminder, click button 1 in any day number in the calendar.
The \fBAdd Reminder...\fR dialog will pop up, with values preselected for The \fBAdd Reminder...\fR dialog will pop up, with values preselected for
the day you clicked. the day you clicked.
The dialog has six basic groups of controls. The first three lines The dialog has seven basic groups of controls. The first three lines
select one of three types of reminders. Choose the type of reminder select one of three types of reminders. Choose the type of reminder
with the radio buttons, and choose the values of the days, months, and with the radio buttons, and choose the values of the days, months, and
years by selecting values from pull-down menus. The pull-down menus years by selecting values from pull-down menus. The pull-down menus
@@ -127,23 +144,37 @@ reminder you entered using the \fBAdd Reminder...\fR dialog. You can
edit the reminder, thereby gaining access to advanced features of edit the reminder, thereby gaining access to advanced features of
\fBRemind\fR. You can also use it simply to play around and discover \fBRemind\fR. You can also use it simply to play around and discover
\fBRemind\fR's idioms for expressing different types of reminders. \fBRemind\fR's idioms for expressing different types of reminders.
.PP
\fBNOTE\fR: If you hand-edit a reminder, then that reminder will
\fInot\fR be editable in TkRemind's graphical reminder dialog any more.
You will have to hand-edit it to change it.
.SH SEEING A SINGLE DAY'S REMINDERS .SH SEEING A SINGLE DAY'S REMINDERS
Right-click on any day number in the calendar to pop up a window with Right-click on any day number in the calendar to pop up a window with
that day's reminders in Agenda Mode. You can left- or right-click the that day's reminders in Agenda Mode. You can left- or right-click the
current date and time indicator at the bottom of the window to see today's current date and time indicator at the bottom of the calendar window
reminders in Agenda Mode. to see today's reminders in Agenda Mode. You can also press \fBt\fR
over the main calendar window to see today's reminders in Agenda Mode.
In the Agenda Mode display, hovering over a reminder will show ancillary In the Agenda Mode display, hovering over a reminder will show ancillary
information such as a Location, URL or Description. Clicking on a reminder information such as a Location, URL or Description. Clicking on a reminder
will open an editor on the REM command that created the reminder. will open an editor on the REM command that created the reminder. You can
also navigate in the Agenda Mode window one day at a time using the
forward and back arrow buttons or left/right arrow keys or \fBPgUp\fR/\fBPgDn\fR.
You can get back to today by clicking \fBToday\fR or pressing the
\fBHome\fR key.
You can dismiss the Agenda Mode window by clicking \fBOK\fR or pressing
the \fBEsc\fR key.
.SH PRINTING .SH PRINTING
To print the current month's calendar, click \fBPrint...\fR on the To print the current month's calendar, click \fBPrint...\fR on the
main calendar window. This brings up the print dialog. Printing main calendar window or press \fBp\fR or \fBControl-p\fR. This brings
either produces a PostScript file or sends PostScript to a UNIX command. up the print dialog. Printing either produces a PostScript or PDF
(If you have \fBrem2pdf\fR installed, you can choose to produce file, or sends PostScript or PDF to a UNIX command.
PDF output rather than PostScript.)
Note that you must have \fBrem2pdf\fR installed in order to be
able to print.
Select the print destination by choosing either \fBTo file:\fR or Select the print destination by choosing either \fBTo file:\fR or
\fBTo command:\fR in the print dialog. Press \fBBrowse...\fR to bring \fBTo command:\fR in the print dialog. Press \fBBrowse...\fR to bring
@@ -160,7 +191,7 @@ the directory.
Select the appropriate paper size and orientation. Activate Select the appropriate paper size and orientation. Activate
\fBFill page\fR if you want the calendar to fill the page. This should \fBFill page\fR if you want the calendar to fill the page. This should
be the normal case unless you have many reminders in a particular be the normal case unless you have many reminders in a particular
day. (See the \fBRem2PS\fR or \fBrem2pdf\fR documentation.) day. (See the \fBrem2pdf\fR documentation.)
Finally, click \fBPrint\fR to print or \fBCancel\fR to cancel. Note Finally, click \fBPrint\fR to print or \fBCancel\fR to cancel. Note
that during printing, \fBRemind\fR is called with the that during printing, \fBRemind\fR is called with the
@@ -168,6 +199,12 @@ that during printing, \fBRemind\fR is called with the
option. If you are producing PDF output, then the option \fB-itkpdf=1\fR option. If you are producing PDF output, then the option \fB-itkpdf=1\fR
is also supplied to \fBRemind\fR. is also supplied to \fBRemind\fR.
If you click on \fBShow Command\fR rather than \fBPrint\fR, then
\fBTkRemind\fR won't actually print anything. Instead, it will pop
up a text window with the command that it \fIwould have used\fR to print
the calendar. You can adjust the command as needed and then click \fBRun\fR
to run the modified command. This lets you specify \fBrem2pdf\fR options
that are not directly supported by \fBTkRemind\fR.
.SH EDITING REMINDERS .SH EDITING REMINDERS
@@ -181,13 +218,11 @@ reminder entirely by selecting \fBDelete reminder\fR. The remaining
buttons, \fBPreview reminder\fR and \fBCancel\fR operate identically buttons, \fBPreview reminder\fR and \fBCancel\fR operate identically
to the dialog in "ADDING REMINDERS." to the dialog in "ADDING REMINDERS."
Note that if you edit a reminder (using \fBPreview reminder\fR), Note that if you have hand-edited a reminder (using \fBPreview
any edits you made are \fInot\fR retained in the dialog box. You reminder\fR), or if the reminder was hand-created in the first place,
should not attempt to edit such reminders; you have to retype them then clicking on it will \fInot\fR pop up the TkRemind
in the \fBPreview reminder\fR dialog. reminder-editing dialog. Instead, TkRemind will start up a text
editor (if you have configured one) so you can hand-edit the reminder.
If the reminder was not created with \fBTkRemind\fR, you can't edit
it with \fBTkRemind\fR.
.SH USING A TEXT EDITOR .SH USING A TEXT EDITOR
@@ -230,7 +265,8 @@ option of "turning off" the reminder for the rest of the day.
.SH OPTIONS .SH OPTIONS
The final button on the calendar window, \fBOptions\fR, lets you configure The final button on the calendar window, \fBOptions\fR, lets you configure
certain aspects of \fBTkRemind\fR. The configuration options are: certain aspects of \fBTkRemind\fR. You can also pop up the options
window by pressing \fBo\fR. The configuration options are:
.TP .TP
.B Start up Iconified .B Start up Iconified
@@ -323,22 +359,6 @@ press \fBApply Options\fR to put them into effect, \fBSave Options\fR
to put them into effect and save them in $HOME/.config/tkremindrc, or to put them into effect and save them in $HOME/.config/tkremindrc, or
\fBCancel\fR to cancel any changes you made. \fBCancel\fR to cancel any changes you made.
.SH KEYBOARD SHORTCUTS
\fBTkRemind\fR's main window includes the following keyboard shortcuts:
.TP
.B Ctrl-Q
Quit
.TP
.B Left Arrow
Previous Month
.TP
.B Right Arrow
Next Month
.TP
.B Home
Today
.SH IMMEDIATE UPDATES .SH IMMEDIATE UPDATES
If you are running \fBTkRemind\fR on Linux and \fBRemind\fR has been If you are running \fBTkRemind\fR on Linux and \fBRemind\fR has been
@@ -553,5 +573,5 @@ $HOME/.config/tkremindrc -- \fBTkRemind\fR saved options.
.SH HOME PAGE .SH HOME PAGE
https://dianne.skoll.ca/projects/remind/ https://dianne.skoll.ca/projects/remind/
.SH SEE ALSO .SH SEE ALSO
\fBremind\fR, \fBrem2ps\fR, \fBrem2pdf\fR, \fBrem2html\fR \fBremind\fR, \fBrem2pdf\fR, \fBrem2html\fR

View File

@@ -5,7 +5,7 @@ use ExtUtils::MakeMaker;
sub manifypods { sub manifypods {
my ($self,%attribs) = @_; my ($self,%attribs) = @_;
my $result = $self->SUPER::manifypods(%attribs); my $result = $self->SUPER::manifypods(%attribs);
$result =~ s/^(POD2MAN_EXE\s*=\s*)(.+)$/$1$2 --center 'VERSION @VERSION@' --date '@RELEASE_DATE@'/m; $result =~ s/^(POD2MAN_EXE\s*=\s*)(.+)$/$1$2 --center 'VERSION @VERSION@' --date '@RELEASE_DATE@' --release Remind/m;
return $result; return $result;
} }
} }

View File

@@ -51,7 +51,7 @@ my $settings = {
title_url => '', title_url => '',
title_size => 14, title_size => 14,
header_size => 12, header_size => 12,
daynum_size => 14, daynum_size => -1,
entry_size => 8, entry_size => 8,
border_size => 4, border_size => 4,
@@ -251,7 +251,8 @@ if ($settings->{eps}) {
# Don't read from a terminal # Don't read from a terminal
if (-t STDIN) { ## no critic if (-t STDIN) { ## no critic
print STDERR "I can't read data from a terminal. Please run like this:\n"; print STDERR "I can't read data from a terminal. Please run like this:\n";
print STDERR " remind -pp [options] filename | $me [options] > out.pdf\n"; print STDERR " remind -pp [options] filename | $me [options] > out.pdf\n\n";
print STDERR "For help, run: $me --help\n";
exit(1); exit(1);
} }
@@ -525,7 +526,9 @@ Specify the size of the header font in 1/72ndths of an inch. The default is 14.
=item --daynum-size=I<n> =item --daynum-size=I<n>
Specify the size of the day number font in 1/72ndths of an inch. The Specify the size of the day number font in 1/72ndths of an inch. The
default is 14. default is 14 for monthly calendars or 10 for weekly calendars. (Weekly
calendars don't have day numbers in the calendar boxes, but this setting
is used to scale the size of moon phase indicators.)
=item --entry-size=I<n> =item --entry-size=I<n>
@@ -682,7 +685,10 @@ of the right side of the calendar box.
A positive I<y> value positions the top edge of the text I<y> points A positive I<y> value positions the top edge of the text I<y> points
below the top of the calendar box, while a negative I<y> value below the top of the calendar box, while a negative I<y> value
positions the bottom edge of the text I<y> points above the bottom of positions the bottom edge of the text I<y> points above the bottom of
the calendar box. the calendar box. Note that the coordinates are relative to the center
of the lines that delineate the boxes; you should use an I<x> value
whose absolute value is at least 2 and a I<y> value whose absolute
value is at least 4 to avoid colliding with the lines.
If you use absolutely-positioned text, it's up to you to make sure it If you use absolutely-positioned text, it's up to you to make sure it
doesn't overlap other text; B<rem2pdf> takes no special precautions to doesn't overlap other text; B<rem2pdf> takes no special precautions to
@@ -691,7 +697,7 @@ prevent this.
As an example, this places Sunrise and Sunset times at the bottom left As an example, this places Sunrise and Sunset times at the bottom left
of each calendar box: of each calendar box:
REM SPECIAL PANGO @1,-1 <span size="4800"><i>Rise [sunrise($U)] Set [sunset($U)]</i></span> REM SPECIAL PANGO @2,-4 <span size="4800"><i>Rise [sunrise($U)] Set [sunset($U)]</i></span>
(Note that Pango expresses font sizes in 1024's of a point, so a size of (Note that Pango expresses font sizes in 1024's of a point, so a size of
4800 works out to about 4.6 points.) 4800 works out to about 4.6 points.)

View File

@@ -468,6 +468,9 @@ sub render
{ {
my ($self, $cr, $settings, $index, $total) = @_; my ($self, $cr, $settings, $index, $total) = @_;
if ($settings->{daynum_size} < 0) {
$settings->{daynum_size} = 14;
}
if ($settings->{svg} || $settings->{eps}) { if ($settings->{svg} || $settings->{eps}) {
if ($index > 1) { if ($index > 1) {
if ($index == 2) { if ($index == 2) {
@@ -628,7 +631,7 @@ sub col_box_coordinates
$settings->{margin_left} + $cell * $col, $settings->{margin_left} + $cell * $col,
$so_far, $so_far,
$settings->{margin_left} + $cell * ($col + 1), $settings->{margin_left} + $cell * ($col + 1),
$so_far + $height + $settings->{border_size}, $so_far + $height + 2* $settings->{border_size},
); );
} }
@@ -663,7 +666,7 @@ sub draw_day
$cr->set_source_rgb($shade->{r} / 255, $cr->set_source_rgb($shade->{r} / 255,
$shade->{g} / 255, $shade->{g} / 255,
$shade->{b} / 255); $shade->{b} / 255);
$cr->rectangle($x1, $y1, $x2 - $x1, $y2 - $y1 + $settings->{border_size}); $cr->rectangle($x1, $y1, $x2 - $x1, $y2 - $y1);
$cr->fill(); $cr->fill();
$cr->restore; $cr->restore;
} }
@@ -690,7 +693,7 @@ sub draw_day
$cr->restore(); $cr->restore();
} }
$so_far += $h + 2 * $settings->{border_size}; $so_far += $h + $settings->{border_size};
my $entry_height = 0; my $entry_height = 0;
my $done = 0; my $done = 0;
foreach my $entry (@{$self->{entries}->[$day]}) { foreach my $entry (@{$self->{entries}->[$day]}) {
@@ -819,7 +822,7 @@ sub draw_title
=head2 get_rgb($color) =head2 get_rgb($color)
Parses a 3- or 6-hex-digit color value and returs [red, green, blue]. If Parses a 3- or 6-hex-digit color value and returns [red, green, blue]. If
color could not be parsed, returns undef color could not be parsed, returns undef
=cut =cut
@@ -1111,6 +1114,9 @@ Remind::PDF::Weekly - render a weekly calendar
sub render sub render
{ {
my ($self, $cr, $settings, $index, $total) = @_; my ($self, $cr, $settings, $index, $total) = @_;
if ($settings->{daynum_size} < 0) {
$settings->{daynum_size} = 10;
}
if ($settings->{svg} || $settings->{eps}) { if ($settings->{svg} || $settings->{eps}) {
if ($index > $settings->{weeks_per_page}) { if ($index > $settings->{weeks_per_page}) {
if ($index == $settings->{weeks_per_page}+1) { if ($index == $settings->{weeks_per_page}+1) {
@@ -1130,7 +1136,7 @@ sub render
} }
} }
$settings->{numbers_on_left} = 1; $settings->{numbers_on_left} = 0;
# Set up bounding box # Set up bounding box
if ($settings->{weeks_per_page} == 1) { if ($settings->{weeks_per_page} == 1) {
$self->{bounding_box} = [ $self->{bounding_box} = [
@@ -1139,22 +1145,16 @@ sub render
$settings->{width} - $settings->{margin_right}, $settings->{width} - $settings->{margin_right},
$settings->{height} - $settings->{margin_bottom}] $settings->{height} - $settings->{margin_bottom}]
} else { } else {
my $gap = $settings->{margin_top} * 0.5;
my $total_height = $settings->{height} - $settings->{margin_top} - $settings->{margin_bottom}; my $total_height = $settings->{height} - $settings->{margin_top} - $settings->{margin_bottom};
my $week_height = $total_height / $settings->{weeks_per_page}; my $week_height = ($total_height - $gap * ($settings->{weeks_per_page}-1)) / $settings->{weeks_per_page};
my $top_offset = (($index-1) % $settings->{weeks_per_page}) * $week_height; my $top_offset = ((($index-1) % $settings->{weeks_per_page}) * $week_height) + (($index-1) % $settings->{weeks_per_page}) * $gap;
my $bot_offset = $top_offset + $week_height; my $bot_offset = $top_offset + $week_height;
$self->{bounding_box} = $self->{bounding_box} = [
$self->{bounding_box} = [ $settings->{margin_left},
$settings->{margin_left}, $settings->{margin_top} + $top_offset,
$settings->{margin_top} + $top_offset, $settings->{width} - $settings->{margin_right},
$settings->{width} - $settings->{margin_right}, $settings->{margin_top} + $bot_offset];
$settings->{margin_top} + $bot_offset];
if ($index != 1) {
$self->{bounding_box}[1] += 0.25 * $settings->{margin_top};
}
if ($index != $settings->{weeks_per_page}) {
$self->{bounding_box}[3] -= 0.25 * $settings->{margin_top};
}
} }
$self->draw_headings($cr, $settings); $self->draw_headings($cr, $settings);
for (my $i=0; $i<7; $i++) { for (my $i=0; $i<7; $i++) {
@@ -1262,7 +1262,13 @@ sub draw_entries
$layout->set_font_description($desc); $layout->set_font_description($desc);
my ($wid, $h) = $layout->get_pixel_size(); my ($wid, $h) = $layout->get_pixel_size();
my $so_far = $box->[1] + $h + $settings->{border_size}; my $so_far = $box->[1] + $settings->{border_size};
foreach my $entry (@{$self->{entries}->[$i]}) {
if ($entry->isa('Remind::PDF::Entry::moon')) {
$so_far = $box->[1] + $h + $settings->{border_size};
last;
}
}
my $box_height = $box->[3] - $box->[1]; my $box_height = $box->[3] - $box->[1];
my $done = 0; my $done = 0;

View File

@@ -152,7 +152,7 @@ sub render
$cr->save(); $cr->save();
Remind::PDF->set_cr_color($cr, $settings->{daynum_color}); Remind::PDF->set_cr_color($cr, $settings->{daynum_color});
$cr->move_to($x2 - $settings->{border_size}/2 - $wid, $y2 + $settings->{border_size} - $h); $cr->move_to($x2 - $settings->{border_size}/2 - $wid, $y2 - $h);
my $url; my $url;
if ($self->{info} && $self->{info}->{url}) { if ($self->{info} && $self->{info}->{url}) {
$url = $self->{info}->{url}; $url = $self->{info}->{url};

File diff suppressed because it is too large Load Diff

View File

@@ -99,6 +99,9 @@ static struct line_drawing UTF8Drawing = {
"\xe2\x94\x80" "\xe2\x94\x80"
}; };
static char const *start_link = "\x1B]8;;";
static char const *end_link = "\x1B]8;;\x1B\\";
static char *VT100Colors[2][2][2][2] /* [Br][R][G][B] */ = { static char *VT100Colors[2][2][2][2] /* [Br][R][G][B] */ = {
{ {
/*** DIM COLORS ***/ /*** DIM COLORS ***/
@@ -301,6 +304,7 @@ static void WriteTopCalLine (void);
static void WriteBottomCalLine (void); static void WriteBottomCalLine (void);
static void WriteIntermediateCalLine (void); static void WriteIntermediateCalLine (void);
static void WriteCalDays (void); static void WriteCalDays (void);
static char const *get_url(TrigInfo *infos);
static int static int
DayOf(int dse) DayOf(int dse)
@@ -1557,6 +1561,8 @@ static int WriteOneColLine(int col)
int clamp = 1; int clamp = 1;
int numwritten = 0; int numwritten = 0;
int d = ColToDay[col]; int d = ColToDay[col];
char const *url = get_url(e->infos);
if (d && UseBGVTColors && bgcolor[d][0] != -1) { if (d && UseBGVTColors && bgcolor[d][0] != -1) {
clamp = 0; clamp = 0;
} }
@@ -1605,6 +1611,10 @@ static int WriteOneColLine(int col)
ColorizeEntry(e, clamp); ColorizeEntry(e, clamp);
} }
if (url) {
printf("%s", start_link);
printf("%s\x1B\\", url);
}
/* If we couldn't find a space char, print what we have. */ /* If we couldn't find a space char, print what we have. */
if (!wspace) { if (!wspace) {
for (ws = e->wc_pos; numwritten < ColSpaces; ws++) { for (ws = e->wc_pos; numwritten < ColSpaces; ws++) {
@@ -1639,6 +1649,9 @@ static int WriteOneColLine(int col)
} }
} }
if (url) {
printf("%s", end_link);
}
/* Decolorize reminder if necessary, but keep any SHADE */ /* Decolorize reminder if necessary, but keep any SHADE */
if (UseVTColors && e->is_color) { if (UseVTColors && e->is_color) {
printf("%s", Decolorize()); printf("%s", Decolorize());
@@ -2065,6 +2078,11 @@ static int DoCalRem(ParsePtr p, int col)
FreeTrig(&trig); FreeTrig(&trig);
return OK; return OK;
} }
if (dse < 0 && !ParseUntriggered) {
/* Expired */
FreeTrig(&trig);
return OK;
}
} else { } else {
/* Calculate the trigger date */ /* Calculate the trigger date */
EnterTimezone(trig.tz); EnterTimezone(trig.tz);
@@ -2077,6 +2095,11 @@ static int DoCalRem(ParsePtr p, int col)
FreeTrig(&trig); FreeTrig(&trig);
return r; return r;
} }
if (dse < 0 && !ParseUntriggered) {
/* Expired */
FreeTrig(&trig);
return OK;
}
} }
/* Adjust trigger date/time to time zone */ /* Adjust trigger date/time to time zone */
@@ -2462,6 +2485,34 @@ void WriteJSONTimeTrigger(TimeTrig const *tt)
} }
} }
static char const *
get_url(TrigInfo *infos)
{
TrigInfo *ti = infos;
char const *url;
if (!LinksInTerminal) {
/* Nope, not doing links in terminal */
return NULL;
}
while (ti) {
char const *colon = strchr(ti->info, ':');
if (!colon) {
ti = ti->next;
continue;
}
if (!strncasecmp(ti->info, "url", colon-ti->info)) {
url = colon+1;
while (*url && isspace(*url)) {
url++;
}
if (!*url) return NULL;
return url;
}
ti = ti->next;
}
return NULL;
}
void void
WriteJSONInfoChain(TrigInfo *ti) WriteJSONInfoChain(TrigInfo *ti)
{ {

View File

@@ -137,6 +137,9 @@
#define E_NO_MB 113 #define E_NO_MB 113
#define E_BAD_MB_SEQ 114 #define E_BAD_MB_SEQ 114
#define E_EXPR_NODES_EXCEEDED 115 #define E_EXPR_NODES_EXCEEDED 115
#define E_EXPECTING_EOXPR 116
#define E_EXPECTING_ATOM 117
#ifdef MK_GLOBALS #ifdef MK_GLOBALS
#undef EXTERN #undef EXTERN
#define EXTERN #define EXTERN
@@ -270,6 +273,8 @@ EXTERN char *ErrMsg[]
/* E_NO_MB */ "C library does not support multibyte characters", /* E_NO_MB */ "C library does not support multibyte characters",
/* E_BAD_MB_SEQ */ "Invalid multibyte sequence", /* E_BAD_MB_SEQ */ "Invalid multibyte sequence",
/* E_EXPR_NODES_EXCEEDED */ "Maximum expression complexity exceeded", /* E_EXPR_NODES_EXCEEDED */ "Maximum expression complexity exceeded",
/* E_EXPECTING_EOXPR */ "Expecting operator or end-of-expression",
/* E_EXPECTING_ATOM */ "Expecting constant, variable, function call or (expression)",
} }
#endif /* MK_GLOBALS */ #endif /* MK_GLOBALS */
; ;

View File

@@ -170,6 +170,8 @@ static expr_node *expr_node_free_list = NULL;
/* Maximum parse level before we bail (to avoid SEGV from filling stack)*/ /* Maximum parse level before we bail (to avoid SEGV from filling stack)*/
#define MAX_PARSE_LEVEL 2000 #define MAX_PARSE_LEVEL 2000
/* Legal punctuation characters in an expression */
#define LEGAL_CHARS "+-*/%&|=<>!)"
static int parse_level_high_water = 0; static int parse_level_high_water = 0;
#define CHECK_PARSE_LEVEL() do { if (level > parse_level_high_water) { parse_level_high_water = level; if (level > MAX_PARSE_LEVEL) { *r = E_OP_STK_OVER; return NULL; } } } while(0) #define CHECK_PARSE_LEVEL() do { if (level > parse_level_high_water) { parse_level_high_water = level; if (level > MAX_PARSE_LEVEL) { *r = E_OP_STK_OVER; return NULL; } } } while(0)
@@ -2228,9 +2230,15 @@ static int set_constant_value(expr_node *atom)
atom->u.value.v.val = val; atom->u.value.v.val = val;
return OK; return OK;
} }
atom->u.value.type = ERR_TYPE; atom->u.value.type = ERR_TYPE;
Eprint("`%s': %s", DBufValue(&ExprBuf), GetErr(E_ILLEGAL_CHAR)); if (strchr(LEGAL_CHARS, *s) != NULL) {
return E_ILLEGAL_CHAR; r = E_EXPECTING_ATOM;
} else {
r = E_ILLEGAL_CHAR;
}
Eprint("`%s': %s", DBufValue(&ExprBuf), GetErr(r));
return r;
} }
/***************************************************************/ /***************************************************************/
@@ -2346,8 +2354,13 @@ static expr_node *parse_atom(char const **e, int *r, Var *locals, int level)
*s != '$' && *s != '$' &&
*s != '"' && *s != '"' &&
*s != '\'') { *s != '\'') {
Eprint("%s `%c'", GetErr(E_ILLEGAL_CHAR), *s); if (strchr(LEGAL_CHARS, *s) != NULL) {
*r = E_ILLEGAL_CHAR; *r = E_EXPECTING_ATOM;
Eprint("%s", GetErr(*r));
} else {
*r = E_ILLEGAL_CHAR;
Eprint("%s `%c'", GetErr(*r), *s);
}
return NULL; return NULL;
} }
@@ -2759,9 +2772,24 @@ expr_node *parse_expression(char const **e, int *r, Var *locals)
print_expr_tree(node, ErrFp); print_expr_tree(node, ErrFp);
fprintf(ErrFp, "\n"); fprintf(ErrFp, "\n");
} }
if (**e && (**e != ']')) { orig = o2;
}
while (**e && isempty(**e)) {
(*e)++;
}
if (**e && (**e != ']')) {
if (DebugFlag & DB_PARSE_EXPR) {
fprintf(ErrFp, " Unparsed: %s\n", *e); fprintf(ErrFp, " Unparsed: %s\n", *e);
} }
if (*r == OK) {
*r = E_EXPECTING_EOXPR;
}
}
if (*r != OK) {
if (node) {
free_expr_tree(node);
node = NULL;
}
} }
if (!SuppressErrorOutputInCatch) { if (!SuppressErrorOutputInCatch) {
if (*r == E_EXPECT_COMMA || if (*r == E_EXPECT_COMMA ||
@@ -2771,9 +2799,11 @@ expr_node *parse_expression(char const **e, int *r, Var *locals)
*r == E_2FEW_ARGS || *r == E_2FEW_ARGS ||
*r == E_PARSE_ERR || *r == E_PARSE_ERR ||
*r == E_EOLN || *r == E_EOLN ||
*r == E_EXPECTING_EOXPR ||
*r == E_BAD_NUMBER || *r == E_BAD_NUMBER ||
*r == E_BAD_DATE || *r == E_BAD_DATE ||
*r == E_BAD_TIME || *r == E_BAD_TIME ||
*r == E_EXPECTING_ATOM ||
*r == E_ILLEGAL_CHAR) { *r == E_ILLEGAL_CHAR) {
end_of_expr = find_end_of_expr(orig); end_of_expr = find_end_of_expr(orig);
while (**e && isempty(**e)) { while (**e && isempty(**e)) {

View File

@@ -225,8 +225,9 @@ static void OpenPurgeFile(char const *fname, char const *mode)
if (!PurgeFP) { if (!PurgeFP) {
fprintf(ErrFp, tr("Cannot open `%s' for writing: %s"), DBufValue(&fname_buf), strerror(errno)); fprintf(ErrFp, tr("Cannot open `%s' for writing: %s"), DBufValue(&fname_buf), strerror(errno));
fprintf(ErrFp, "\n"); fprintf(ErrFp, "\n");
} else {
set_cloexec(fileno(PurgeFP));
} }
set_cloexec(fileno(PurgeFP));
DBufFree(&fname_buf); DBufFree(&fname_buf);
} }

View File

@@ -34,8 +34,10 @@
#endif #endif
#ifdef HAVE_SYS_TERMIOS_H #ifdef HAVE_SYS_TERMIOS_H
#ifdef __sun
#include <sys/termios.h> #include <sys/termios.h>
#endif #endif
#endif
#include <ctype.h> #include <ctype.h>
#include <math.h> #include <math.h>

View File

@@ -106,6 +106,7 @@ EXTERN INIT( int DefaultPrio, NO_PRIORITY);
EXTERN INIT( int SysTime, -1); EXTERN INIT( int SysTime, -1);
EXTERN INIT( int LocalSysTime, -1); EXTERN INIT( int LocalSysTime, -1);
EXTERN INIT( int ParseUntriggered, 0); EXTERN INIT( int ParseUntriggered, 0);
EXTERN INIT( int LinksInTerminal, 0);
EXTERN char const *InitialFile; EXTERN char const *InitialFile;
EXTERN char const *LocalTimeZone; EXTERN char const *LocalTimeZone;

View File

@@ -36,8 +36,10 @@
#endif #endif
#ifdef HAVE_SYS_TERMIOS_H #ifdef HAVE_SYS_TERMIOS_H
#ifdef __sun
#include <sys/termios.h> #include <sys/termios.h>
#endif #endif
#endif
#include "types.h" #include "types.h"
@@ -517,6 +519,11 @@ void InitRemind(int argc, char const *argv[])
arg++; arg++;
continue; continue;
} }
if (*arg == 'z' || *arg == 'Z') {
LinksInTerminal = 1;
arg++;
continue;
}
break; break;
} }
if (weeks) { if (weeks) {

View File

@@ -501,6 +501,9 @@ int DoOmit(ParsePtr p)
int int
AddGlobalOmit(int dse) AddGlobalOmit(int dse)
{ {
if (dse < 0) {
return OK;
}
if (NumFullOmits == MAX_FULL_OMITS) return E_2MANY_FULL; if (NumFullOmits == MAX_FULL_OMITS) return E_2MANY_FULL;
if (!BexistsIntArray(FullOmitArray, NumFullOmits, dse)) { if (!BexistsIntArray(FullOmitArray, NumFullOmits, dse)) {
InsertIntoSortedArray(FullOmitArray, NumFullOmits, dse); InsertIntoSortedArray(FullOmitArray, NumFullOmits, dse);

View File

@@ -13,6 +13,7 @@
13ths 13ths
15am 15am
1GB 1GB
1p
1pm 1pm
20am 20am
20pm 20pm
@@ -22,6 +23,7 @@
2s 2s
30PM 30PM
34am 34am
3pm
3string34 3string34
45am 45am
45pm 45pm
@@ -133,6 +135,7 @@ Emanuele
EndSent EndSent
EndSentIg EndSentIg
EntrySize EntrySize
Esc
Example2 Example2
Expr Expr
ExpressionTimeLimit ExpressionTimeLimit
@@ -241,6 +244,9 @@ MSC
MSF MSF
MSGPREFIX MSGPREFIX
MSGSUFFIX MSGSUFFIX
MUSL
MUSL
MUSL's
Madsen Madsen
Makefile Makefile
Makefiles Makefiles
@@ -302,6 +308,8 @@ Pango
ParseUntriggered ParseUntriggered
Paulo Paulo
Pelzl Pelzl
PgDn
PgUp
Philipp Philipp
Pinard Pinard
Plaser Plaser
@@ -510,6 +518,7 @@ datetime
datetimes datetimes
day1 day1
day2 day2
daymap
dayname dayname
daynames daynames
daynum daynum
@@ -523,6 +532,7 @@ dev
devel devel
dfs dfs
dh dh
dialogs
difftime difftime
doesn doesn
dosubst dosubst
@@ -585,12 +595,14 @@ gaa
garbhol garbhol
gcc gcc
getenv getenv
glibc's
grey grey
greyed greyed
gridline gridline
gridlines gridlines
groff groff
gvim gvim
hashref
hasn hasn
hdate hdate
hebdate hebdate
@@ -736,6 +748,7 @@ num
ok ok
oktober oktober
ol ol
oldstyle
ons ons
ordx ordx
orthodoxeaster orthodoxeaster
@@ -785,6 +798,7 @@ rem2ps
rem2ps2 rem2ps2
remind's remind's
rescan rescan
rgb
rn rn
ro ro
romanian romanian
@@ -911,6 +925,7 @@ ubitux
ui ui
uid uid
unbuffered unbuffered
undef
undefine undefine
underlinefg underlinefg
uniq uniq
@@ -941,6 +956,8 @@ wkstart
wn wn
www www
x00 x00
x1
x2
xAB xAB
xdg xdg
xinitrc xinitrc
@@ -948,6 +965,8 @@ xless
xmessage xmessage
xsiz xsiz
xsiz1 xsiz1
y1
y2
year1 year1
year2 year2
yeardiff yeardiff

View File

@@ -27,12 +27,19 @@ if test `id -u` = 0 ; then
exit 1 exit 1
fi fi
REMIND="../src/remind --flush -q" REMIND_CMD=${REMIND_CMD:-../src/remind}
REM2PS=${REM2PS:-../src/rem2ps}
REMIND="$REMIND_CMD --flush -q"
OUT="../tests/test.out" OUT="../tests/test.out"
CMP="../tests/test.cmp" CMP="../tests/test.cmp"
# Set a known timezone so moon phases show up in predictable places # Set a known timezone so moon phases show up in predictable places
TZ=UTC TZ=UTC
export TZ export TZ
LANG=C.UTF-8
export LANG
LC_ALL=C.UTF-8
export LC_ALL
unset LC_PAPER
# Check if "grep" accepts "-a" flag # Check if "grep" accepts "-a" flag
echo TEST | grep -a TEST > /dev/null 2>&1 echo TEST | grep -a TEST > /dev/null 2>&1
@@ -189,8 +196,8 @@ rm -f ../tests/purge_dir/*.rem.purged >> $OUT 2>&1
$REMIND ../tests/runtest.rem >> $OUT 2>&1 $REMIND ../tests/runtest.rem >> $OUT 2>&1
$REMIND -p ../tests/shade.rem 1 August 2009 | ../src/rem2ps -e -l -c3 >> $OUT 2>&1 $REMIND -p ../tests/shade.rem 1 August 2009 | "$REM2PS" -e -l -c3 >> $OUT 2>&1
$REMIND -pp ../tests/shade.rem 1 August 2009 | ../src/rem2ps -e -l -c3 >> $OUT 2>&1 $REMIND -pp ../tests/shade.rem 1 August 2009 | "$REM2PS" -e -l -c3 >> $OUT 2>&1
TZ=America/Toronto $REMIND ../tests/sunmoon.rem 1 Jan 2011 >> $OUT 2>&1 TZ=America/Toronto $REMIND ../tests/sunmoon.rem 1 Jan 2011 >> $OUT 2>&1
@@ -507,8 +514,8 @@ $REMIND --version >> $OUT 2>&1
# Test queueing. Because eventstart depends on the actual system # Test queueing. Because eventstart depends on the actual system
# date, we use the --test flag to fake the date and time. # date, we use the --test flag to fake the date and time.
# We can't use $REMIND here because it includes the -q flag. # We can't use $REMIND here because it includes the -q flag.
echo JSONQUEUE | ../src/remind --flush --test -z0 ../tests/queue1.rem >> $OUT 2>&1 echo JSONQUEUE | "$REMIND_CMD" --flush --test -z0 ../tests/queue1.rem >> $OUT 2>&1
echo QUEUE | ../src/remind --flush --test -zj ../tests/queue1.rem >> $OUT 2>&1 echo QUEUE | "$REMIND_CMD" --flush --test -zj ../tests/queue1.rem >> $OUT 2>&1
# Test for leap year bug that was fixed # Test for leap year bug that was fixed
$REMIND -dte - 28 Feb 2024 <<'EOF' >> $OUT 2>&1 $REMIND -dte - 28 Feb 2024 <<'EOF' >> $OUT 2>&1
@@ -662,6 +669,12 @@ for i in ../man/*.1 ; do
fi fi
done done
if test -d ../rem2pdf/blib ; then
PERLMANS=`find ../rem2pdf/blib -name '*.1p' -o -name '*.3pm'`
else
PERLMANS=""
fi
# If we have "spellintian", run it against man pages # If we have "spellintian", run it against man pages
cat <<'EOF' >> $OUT cat <<'EOF' >> $OUT
@@ -673,7 +686,7 @@ spellintian /dev/null < /dev/null > /dev/null 2>&1
if test $? = 0 ; then if test $? = 0 ; then
echo "Linting man pages" echo "Linting man pages"
# we grep out some false-positives from rem2ps # we grep out some false-positives from rem2ps
spellintian --picky ../man/*.1 2>&1 | grep -v -F 'MinX MinX (duplicate word)' | grep -v -F 'MinY MinY (duplicate word)' | grep -v -F 'show show (duplicate word)' >> $OUT 2>&1 spellintian --picky $PERLMANS ../man/*.1 2>&1 | grep -v -F 'MinX MinX (duplicate word)' | grep -v -F 'MinY MinY (duplicate word)' | grep -v -F 'show show (duplicate word)' >> $OUT 2>&1
fi fi
# If we have "hunspell", run it against man pages # If we have "hunspell", run it against man pages
@@ -688,14 +701,13 @@ HUNSPELL="hunspell -d en_US -l -p manpage-personal-dict"
$HUNSPELL /dev/null < /dev/null > /dev/null 2>&1 $HUNSPELL /dev/null < /dev/null > /dev/null 2>&1
if test $? = 0; then if test $? = 0; then
echo "Spell-checking man pages, WHATSNEW and README.md" echo "Spell-checking man pages, WHATSNEW and README.md"
cat ../man/*.1 | $HUNSPELL -n >> $OUT 2>&1 cat ../man/*.1 $PERLMANS | $HUNSPELL -n >> $OUT 2>&1
cat ../docs/WHATSNEW | $HUNSPELL >> $OUT 2>&1 cat ../docs/WHATSNEW | $HUNSPELL >> $OUT 2>&1
cat ../README.md | $HUNSPELL >> $OUT 2>&1 cat ../README.md | $HUNSPELL >> $OUT 2>&1
# If we have pod2man, check rem2pdf and rem2html man pages too # If we have pod2man, check rem2pdf and rem2html man pages too
pod2man < ../rem2html/rem2html.in > /dev/null 2>&1 pod2man < ../rem2html/rem2html.in > /dev/null 2>&1
if test $? = 0 ; then if test $? = 0 ; then
pod2man < ../rem2html/rem2html.in | $HUNSPELL -n >> $OUT 2>&1 pod2man < ../rem2html/rem2html.in | $HUNSPELL -n >> $OUT 2>&1
pod2man < ../rem2pdf/bin/rem2pdf.in | $HUNSPELL -n >> $OUT 2>&1
fi fi
fi fi
@@ -945,7 +957,16 @@ REM 2025 Oct [1] MSG Expr but not nonconst [today()]
REM 2025-10-01 MSG No expr seen [1+2] REM 2025-10-01 MSG No expr seen [1+2]
EOF EOF
# Purge mode # Early exit from calendar processing
$REMIND -p - 2026-01-01 <<'EOF' >> $OUT 2>&1
REM 1 Jan 1994 MSG 1/0 = [1/0]
EOF
# No early exit from calendar processing
$REMIND -p - 2026-01-01 <<'EOF' >> $OUT 2>&1
SET $ParseUntriggered 1
REM 1 Jan 1994 MSG 1/0 = [1/0]
EOF
cmp -s $OUT $CMP cmp -s $OUT $CMP
if [ "$?" = "0" ]; then if [ "$?" = "0" ]; then

View File

@@ -1046,7 +1046,7 @@ set a057 value("a05"+"6")
"a05" + "6" => "a056" "a05" + "6" => "a056"
value("a056") => "SDFJHSDF KSJDFH KJSDFH KSJDFH" value("a056") => "SDFJHSDF KSJDFH KJSDFH KSJDFH"
set a058 version() set a058 version()
version() => "06.01.06" version() => "06.02.01"
set a059 wkday(today()) set a059 wkday(today())
today() => 1991-02-16 today() => 1991-02-16
wkday(1991-02-16) => "Saturday" wkday(1991-02-16) => "Saturday"
@@ -2609,7 +2609,7 @@ a056 "SDFJHSDF KSJDFH KJSDFH KSJDFH"
a007 "1991-02-16" a007 "1991-02-16"
a057 "SDFJHSDF KSJDFH KJSDFH KSJDFH" a057 "SDFJHSDF KSJDFH KJSDFH KSJDFH"
a008 "11:44" a008 "11:44"
a058 "06.01.06" a058 "06.02.01"
a059 "Saturday" a059 "Saturday"
a010 12 a010 12
a060 6 a060 6
@@ -5040,8 +5040,9 @@ set a 7 * "Cabbage! "
# Should result in errors # Should result in errors
set pqxya 1+2) set pqxya 1+2)
1 + 2 => 3 1+2)
../tests/test.rem(1014): Expecting end-of-line ^-- here
../tests/test.rem(1014): Expecting operator or end-of-expression
# Should result in an error # Should result in an error
REM Tue OMIT 2024-01-01 MSG Wookie REM Tue OMIT 2024-01-01 MSG Wookie
@@ -5562,8 +5563,8 @@ REM SATISFY ""
REM SATISFY [version() > "01.00.00"] REM SATISFY [version() > "01.00.00"]
../tests/test.rem(1074): SATISFY: expression has no reference to trigdate() or $T... ../tests/test.rem(1074): SATISFY: expression has no reference to trigdate() or $T...
../tests/test.rem(1074): Trig = Saturday, 16 February, 1991 ../tests/test.rem(1074): Trig = Saturday, 16 February, 1991
version() => "06.01.06" version() => "06.02.01"
"06.01.06" > "01.00.00" => 1 "06.02.01" > "01.00.00" => 1
../tests/test.rem(1074): Trig(satisfied) = Saturday, 16 February, 1991 ../tests/test.rem(1074): Trig(satisfied) = Saturday, 16 February, 1991
REM SATISFY [max(x, max(x, 1, 2, 3), 4, 5, 6) * 5] REM SATISFY [max(x, max(x, 1, 2, 3), 4, 5, 6) * 5]
../tests/test.rem(1075): SATISFY: expression has no reference to trigdate() or $T... ../tests/test.rem(1075): SATISFY: expression has no reference to trigdate() or $T...
@@ -16426,9 +16427,14 @@ eval("1/0") => 1 / 0 => Division by zero
../tests/test.rem(1590): `/': Division by zero ../tests/test.rem(1590): `/': Division by zero
Division by zero Division by zero
set a eval("1 / / 2") set a eval("1 / / 2")
eval("1 / / 2") => ../tests/test.rem(1591): Illegal character `/' eval("1 / / 2") => ../tests/test.rem(1591): Expecting constant, variable, function call or (expression)
1 / / 2 1 / / 2
^-- here ^-- here
Expecting constant, variable, function call or (expression)
set a eval("1 / # 2")
eval("1 / # 2") => ../tests/test.rem(1592): Illegal character `#'
1 / # 2
^-- here
Illegal character Illegal character
set a catch(eval("1 +"), 33) set a catch(eval("1 +"), 33)
eval("1 +") => Unexpected end of line eval("1 +") => Unexpected end of line
@@ -16438,7 +16444,10 @@ eval("1/0") => 1 / 0 => Division by zero
Division by zero Division by zero
catch(*Division by zero*, 34) => 34 catch(*Division by zero*, 34) => 34
set a catch(eval("1 / / 2"), 35) set a catch(eval("1 / / 2"), 35)
eval("1 / / 2") => Illegal character eval("1 / / 2") => Expecting constant, variable, function call or (expression)
catch(*Expecting constant, variable, function call or (expression)*, 35) => 35
set a catch(eval("1 / # 2"), 35)
eval("1 / # 2") => Illegal character
catch(*Illegal character*, 35) => 35 catch(*Illegal character*, 35) => 35
# Ensure RUN is disabled in eval # Ensure RUN is disabled in eval
@@ -16446,7 +16455,7 @@ set a shell("echo foo")
shell("echo foo") => "foo" shell("echo foo") => "foo"
set a eval("shell(\"echo foo\")") set a eval("shell(\"echo foo\")")
eval("shell(\"echo foo\")") => shell("echo foo") => RUN disabled eval("shell(\"echo foo\")") => shell("echo foo") => RUN disabled
../tests/test.rem(1598): shell(): RUN disabled ../tests/test.rem(1600): shell(): RUN disabled
RUN disabled RUN disabled
set a shell("echo foo") set a shell("echo foo")
shell("echo foo") => "foo" shell("echo foo") => "foo"
@@ -16459,8 +16468,8 @@ Leaving UserFN i() => "foo"
set a eval("i()") set a eval("i()")
eval("i()") => Entering UserFN i() eval("i()") => Entering UserFN i()
shell("echo foo") => RUN disabled shell("echo foo") => RUN disabled
../tests/test.rem(1603): shell(): RUN disabled ../tests/test.rem(1605): shell(): RUN disabled
../tests/test.rem(1601): [#0] In function `i' ../tests/test.rem(1603): [#0] In function `i'
Leaving UserFN i() => RUN disabled Leaving UserFN i() => RUN disabled
RUN disabled RUN disabled
set a i() set a i()
@@ -16473,19 +16482,19 @@ set b eval(a)
a => "eval(\"1\")+ shell(\"ls\")" a => "eval(\"1\")+ shell(\"ls\")"
eval("eval(\"1\")+ shell(\"ls\")") => eval("1") => 1 eval("eval(\"1\")+ shell(\"ls\")") => eval("1") => 1
shell("ls") => RUN disabled shell("ls") => RUN disabled
../tests/test.rem(1607): shell(): RUN disabled ../tests/test.rem(1609): shell(): RUN disabled
RUN disabled RUN disabled
# "value" should use lazy evaluation # "value" should use lazy evaluation
set a value(4:33) set a value(4:33)
value(04:33) => Type mismatch value(04:33) => Type mismatch
../tests/test.rem(1610): Type mismatch ../tests/test.rem(1612): Type mismatch
set a value('2020-01-01', 42) set a value('2020-01-01', 42)
value(2020-01-01, ?) => Type mismatch value(2020-01-01, ?) => Type mismatch
../tests/test.rem(1611): Type mismatch ../tests/test.rem(1613): Type mismatch
set a value("nosuchvar") set a value("nosuchvar")
value("nosuchvar") => Undefined variable value("nosuchvar") => Undefined variable
../tests/test.rem(1612): Undefined variable ../tests/test.rem(1614): Undefined variable
set a value("nosuchvar", 42) set a value("nosuchvar", 42)
value("nosuchvar", 42) => 42 value("nosuchvar", 42) => 42
set a value("a", 42) set a value("a", 42)
@@ -16495,11 +16504,11 @@ value("a") => 42
DEBUG -x DEBUG -x
DEBUG -e DEBUG -e
../tests/test.rem(1622): eval(): Too many recursive function calls ../tests/test.rem(1624): eval(): Too many recursive function calls
Base: 1991-02-09 Base: 1991-02-09
Base: 1991-02-09 Base: 1991-02-09
../tests/test.rem(1630): Expired ../tests/test.rem(1632): Expired
../tests/test.rem(1631): Expired ../tests/test.rem(1633): Expired
trigvalid = 1; trigdate = 1991-01-14 trigvalid = 1; trigdate = 1991-01-14
trigvalid = 0; trigdate = 0 trigvalid = 0; trigdate = 0
daysinmon(2, 2000) => 29 daysinmon(2, 2000) => 29
@@ -16511,36 +16520,36 @@ daysinmon("Feb", 2001) => 28
daysinmon("March", 2000) => 31 daysinmon("March", 2000) => 31
daysinmon("March", 2001) => 31 daysinmon("March", 2001) => 31
daysinmon("Cabbage", 2001) => Invalid month name daysinmon("Cabbage", 2001) => Invalid month name
../tests/test.rem(1658): daysinmon(): Invalid month name ../tests/test.rem(1660): daysinmon(): Invalid month name
daysinmon(2000-02-14) => 29 daysinmon(2000-02-14) => 29
daysinmon(2001-02-14) => 28 daysinmon(2001-02-14) => 28
daysinmon(2000-04-14) => 30 daysinmon(2000-04-14) => 30
daysinmon(2001-04-14) => 30 daysinmon(2001-04-14) => 30
date(2020, "April", 15) => 2020-04-15 date(2020, "April", 15) => 2020-04-15
date(2020, "Carrot", 12) => Invalid month name date(2020, "Carrot", 12) => Invalid month name
../tests/test.rem(1666): date(): Invalid month name ../tests/test.rem(1668): date(): Invalid month name
datetime(2020, "April", 13, 04:44) => 2020-04-13@04:44 datetime(2020, "April", 13, 04:44) => 2020-04-13@04:44
datetime(2020, "April", 13, 4, 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 datetime(2020, "Lettuce", 13, 04:44) => Invalid month name
../tests/test.rem(1669): datetime(): Invalid month name ../tests/test.rem(1671): datetime(): Invalid month name
datetime(2020, "Lettuce", 13, 4, 44) => Invalid month name datetime(2020, "Lettuce", 13, 4, 44) => Invalid month name
../tests/test.rem(1670): datetime(): Invalid month name ../tests/test.rem(1672): datetime(): Invalid month name
wkdaynum("Tue") => 2 wkdaynum("Tue") => 2
wkdaynum("Wednesday") => 3 wkdaynum("Wednesday") => 3
wkdaynum("telephone") => Invalid weekday name wkdaynum("telephone") => Invalid weekday name
../tests/test.rem(1674): wkdaynum(): Invalid weekday name ../tests/test.rem(1676): wkdaynum(): Invalid weekday name
../tests/test.rem(1685): Cannot modify system variable: `$NumTrig' ../tests/test.rem(1687): Cannot modify system variable: `$NumTrig'
../tests/test.rem(1686): POP-VARS without matching PUSH-VARS ../tests/test.rem(1688): POP-VARS without matching PUSH-VARS
FUNSET a FUNSET a
FSET b(x, y) x*y FSET b(x, y) x*y
FSET c() 33 FSET c() 33
set a a(2) set a a(2)
../tests/test.rem(1695): Undefined function: `a' ../tests/test.rem(1697): Undefined function: `a'
set a b(2) set a b(2)
b(?) => Not enough arguments b(?) => Not enough arguments
../tests/test.rem(1696): b(): Not enough arguments ../tests/test.rem(1698): b(): Not enough arguments
set a b(2, 3) set a b(2, 3)
Entering UserFN b(2, 3) Entering UserFN b(2, 3)
x => 2 x => 2
@@ -16562,7 +16571,7 @@ Entering UserFN a(2)
Leaving UserFN a(2) => 42 Leaving UserFN a(2) => 42
set a b(2) set a b(2)
b(?) => Not enough arguments b(?) => Not enough arguments
../tests/test.rem(1707): b(): Not enough arguments ../tests/test.rem(1709): b(): Not enough arguments
set a b(2, 3) set a b(2, 3)
Entering UserFN b(2, 3) Entering UserFN b(2, 3)
x => 2 x => 2
@@ -16577,10 +16586,10 @@ Leaving UserFN c() => 66
POP-FUNCS POP-FUNCS
set a a(2) set a a(2)
../tests/test.rem(1713): Undefined function: `a' ../tests/test.rem(1715): Undefined function: `a'
set a b(2) set a b(2)
b(?) => Not enough arguments b(?) => Not enough arguments
../tests/test.rem(1714): b(): Not enough arguments ../tests/test.rem(1716): b(): Not enough arguments
set a b(2, 3) set a b(2, 3)
Entering UserFN b(2, 3) Entering UserFN b(2, 3)
x => 2 x => 2
@@ -16595,7 +16604,7 @@ DEBUG -xe
Overridden: subst_colon subst_bang subst_question subst_at subst_hash Overridden: subst_colon subst_bang subst_question subst_at subst_hash
bad => "ÿ" bad => "ÿ"
mbstrlen("ÿ") => Invalid multibyte sequence mbstrlen("ÿ") => Invalid multibyte sequence
../tests/test.rem(1734): mbstrlen(): Invalid multibyte sequence ../tests/test.rem(1736): mbstrlen(): Invalid multibyte sequence
bad => "ÿ" bad => "ÿ"
strlen("ÿ") => 1 strlen("ÿ") => 1
faces => "ðŸ™ðŸ™ðŸ™ðŸ™ðŸ™xyzçççéfoo" faces => "ðŸ™ðŸ™ðŸ™ðŸ™ðŸ™xyzçççéfoo"
@@ -16609,7 +16618,7 @@ index("🙂🙂🙂🙂🙂xyzçççéfoo", "ç") => 24
bad => "ÿ" bad => "ÿ"
bad => "ÿ" bad => "ÿ"
mbindex("ÿ", "ÿ") => Invalid multibyte sequence mbindex("ÿ", "ÿ") => Invalid multibyte sequence
../tests/test.rem(1742): mbindex(): Invalid multibyte sequence ../tests/test.rem(1744): mbindex(): Invalid multibyte sequence
faces => "ðŸ™ðŸ™ðŸ™ðŸ™ðŸ™xyzçççéfoo" faces => "ðŸ™ðŸ™ðŸ™ðŸ™ðŸ™xyzçççéfoo"
mbindex("ðŸ™ðŸ™ðŸ™ðŸ™ðŸ™xyzçççéfoo", "ç", 11) => 11 mbindex("ðŸ™ðŸ™ðŸ™ðŸ™ðŸ™xyzçççéfoo", "ç", 11) => 11
faces => "ðŸ™ðŸ™ðŸ™ðŸ™ðŸ™xyzçççéfoo" faces => "ðŸ™ðŸ™ðŸ™ðŸ™ðŸ™xyzçççéfoo"
@@ -16628,10 +16637,10 @@ faces => "🙂🙂🙂🙂🙂xyzçççéfoo"
mbsubstr("ðŸ™ðŸ™ðŸ™ðŸ™ðŸ™xyzçççéfoo", 2, 9) => "ðŸ™ðŸ™ðŸ™ðŸ™xyzç" mbsubstr("ðŸ™ðŸ™ðŸ™ðŸ™ðŸ™xyzçççéfoo", 2, 9) => "ðŸ™ðŸ™ðŸ™ðŸ™xyzç"
bad => "ÿ" bad => "ÿ"
mbsubstr("ÿ", 1) => Invalid multibyte sequence mbsubstr("ÿ", 1) => Invalid multibyte sequence
../tests/test.rem(1754): mbsubstr(): Invalid multibyte sequence ../tests/test.rem(1756): mbsubstr(): Invalid multibyte sequence
bad => "ÿ" bad => "ÿ"
mbsubstr("ÿ", 1, 20) => Invalid multibyte sequence mbsubstr("ÿ", 1, 20) => Invalid multibyte sequence
../tests/test.rem(1755): mbsubstr(): Invalid multibyte sequence ../tests/test.rem(1757): mbsubstr(): Invalid multibyte sequence
faces => "ðŸ™ðŸ™ðŸ™ðŸ™ðŸ™xyzçççéfoo" faces => "ðŸ™ðŸ™ðŸ™ðŸ™ðŸ™xyzçççéfoo"
substr("ðŸ™ðŸ™ðŸ™ðŸ™ðŸ™xyzçççéfoo", 2) => "Ÿ™ðŸ™ðŸ™ðŸ™ðŸ™xyzçççéfoo" substr("ðŸ™ðŸ™ðŸ™ðŸ™ðŸ™xyzçççéfoo", 2) => "Ÿ™ðŸ™ðŸ™ðŸ™ðŸ™xyzçççéfoo"
faces => "ðŸ™ðŸ™ðŸ™ðŸ™ðŸ™xyzçççéfoo" faces => "ðŸ™ðŸ™ðŸ™ðŸ™ðŸ™xyzçççéfoo"
@@ -16641,13 +16650,13 @@ codepoint("🙂🙂🙂🙂🙂xyzçççéfoo") => 128578
mbchar(128578, 162, 122) => "ðŸ™Â¢z" mbchar(128578, 162, 122) => "ðŸ™Â¢z"
bad => "ÿ" bad => "ÿ"
codepoint("ÿ") => Invalid multibyte sequence codepoint("ÿ") => Invalid multibyte sequence
../tests/test.rem(1762): codepoint(): Invalid multibyte sequence ../tests/test.rem(1764): codepoint(): Invalid multibyte sequence
codepoint("") => 0 codepoint("") => 0
mbchar(0) => "" mbchar(0) => ""
mbchar(0, 120) => Number too low mbchar(0, 120) => Number too low
../tests/test.rem(1765): mbchar(): Number too low ../tests/test.rem(1767): mbchar(): Number too low
mbchar(120, 0) => Number too low mbchar(120, 0) => Number too low
../tests/test.rem(1766): mbchar(): Number too low ../tests/test.rem(1768): mbchar(): Number too low
Variable hash table statistics: Variable hash table statistics:
Entries: 100146; Buckets: 87719; Non-empty Buckets: 66303 Entries: 100146; Buckets: 87719; Non-empty Buckets: 66303
Maxlen: 5; Minlen: 0; Avglen: 1.142; Stddev: 0.878; Avg nonempty len: 1.510 Maxlen: 5; Minlen: 0; Avglen: 1.142; Stddev: 0.878; Avg nonempty len: 1.510
@@ -16669,7 +16678,7 @@ Expression nodes high-water: 302076
Expression nodes leaked: 0 Expression nodes leaked: 0
Parse level high-water: 34 Parse level high-water: 34
Max expr node evaluations per line: 2001 Max expr node evaluations per line: 2001
Total expression node evaluations: 106467 Total expression node evaluations: 106471
Test 2 Test 2
@@ -23707,7 +23716,7 @@ SECURITY: Won't read world-writable file or directory!
Error reading include_dir/ww: Can't open file Error reading include_dir/ww: Can't open file
SECURITY: Won't read world-writable file or directory! SECURITY: Won't read world-writable file or directory!
Error reading include_dir/ww: No files matching *.rem Error reading include_dir/ww: No files matching *.rem
06.01.06 06.02.01
Enabling test mode: This is meant for the acceptance test. Enabling test mode: This is meant for the acceptance test.
Do not use --test in production. Do not use --test in production.
In test mode, the system time is fixed at 2025-01-06@19:00 In test mode, the system time is fixed at 2025-01-06@19:00
@@ -23905,7 +23914,9 @@ Parsed expression: 1||1
Parsed expression: 2 Parsed expression: 2
=> 2 => 2
Unparsed: , 3 Unparsed: , 3
../tests/expr.rem(15): Expecting end-of-line 2, 3
^-- here
../tests/expr.rem(15): Expecting operator or end-of-expression
Parsed expression: iif(0, "foo", 0, "bar", 1, "blech", 0, "quux", 1, "borhy", "wacka") Parsed expression: iif(0, "foo", 0, "bar", 1, "blech", 0, "quux", 1, "borhy", "wacka")
=> (Iif 0 "foo" 0 "bar" 1 "blech" 0 "quux" 1 "borhy" "wacka") => (Iif 0 "foo" 0 "bar" 1 "blech" 0 "quux" 1 "borhy" "wacka")
iif(0, ?, 0, ?, 1, "blech", ?, ?, ?, ?, ?) => "blech" iif(0, ?, 0, ?, 1, "blech", ?, ?, ?, ?, ?) => "blech"
@@ -23923,7 +23934,7 @@ max(6, 9, 50) => 50
Parsed expression: max(1, Parsed expression: max(1,
=> Error: Illegal character => Error: Illegal character
Unparsed: ,1) Unparsed: ,1)
,1) max(1,,1)
^-- here ^-- here
Parsed expression: 5%0 Parsed expression: 5%0
=> (% 5 0) => (% 5 0)
@@ -24284,7 +24295,7 @@ Expression nodes high-water: 499
Expression nodes leaked: 0 Expression nodes leaked: 0
Parse level high-water: 2001 Parse level high-water: 2001
Max expr node evaluations per line: 499 Max expr node evaluations per line: 499
Total expression node evaluations: 632 Total expression node evaluations: 631
-stdin-(14): Unmatched PUSH-OMIT-CONTEXT at -stdin-(7) -stdin-(14): Unmatched PUSH-OMIT-CONTEXT at -stdin-(7)
-stdin-(14): Warning: PUSH-OMIT-CONTEXT without matching POP-OMIT-CONTEXT -stdin-(14): Warning: PUSH-OMIT-CONTEXT without matching POP-OMIT-CONTEXT
No reminders. No reminders.
@@ -25063,6 +25074,8 @@ TRANSLATE "TZ specified for non-timed reminder" ""
TRANSLATE "C library does not support multibyte characters" "" TRANSLATE "C library does not support multibyte characters" ""
TRANSLATE "Invalid multibyte sequence" "" TRANSLATE "Invalid multibyte sequence" ""
TRANSLATE "Maximum expression complexity exceeded" "" TRANSLATE "Maximum expression complexity exceeded" ""
TRANSLATE "Expecting operator or end-of-expression" ""
TRANSLATE "Expecting constant, variable, function call or (expression)" ""
# Other Messages # Other Messages
TRANSLATE "%s function `%s' defined at %s(%s) does not use its argument" "" TRANSLATE "%s function `%s' defined at %s(%s) does not use its argument" ""
@@ -39546,7 +39559,6 @@ trigger(2060-08-01@23:55, 1) => "1 August 2060 AT 19:55"
utctolocal(2050-01-01@01:00) => 2049-12-31@20:00 utctolocal(2050-01-01@01:00) => 2049-12-31@20:00
localtoutc(2050-12-31@23:44) => 2051-01-01@04:44 localtoutc(2050-12-31@23:44) => 2051-01-01@04:44
localtoutc(2050-03-13@00:00) => 2050-03-13@05:00 localtoutc(2050-03-13@00:00) => 2050-03-13@05:00
localtoutc(2050-03-13@02:00) => 2050-03-13@07:00
localtoutc(2050-11-06@00:00) => 2050-11-06@04:00 localtoutc(2050-11-06@00:00) => 2050-11-06@04:00
localtoutc(2050-11-06@02:00) => 2050-11-06@07:00 localtoutc(2050-11-06@02:00) => 2050-11-06@07:00
utctolocal(2051-01-01@04:44) => 2050-12-31@23:44 utctolocal(2051-01-01@04:44) => 2050-12-31@23:44
@@ -39944,3 +39956,50 @@ REM 2025 Oct [a] MSG Nonconst IS set
#!P: Next line has expired, but contains expression... please verify #!P: Next line has expired, but contains expression... please verify
#!P: Expired: REM 2025 Oct [1] MSG Expr but not nonconst [today()] #!P: Expired: REM 2025 Oct [1] MSG Expr but not nonconst [today()]
#!P: Expired: REM 2025-10-01 MSG No expr seen [1+2] #!P: Expired: REM 2025-10-01 MSG No expr seen [1+2]
# translations
{"LANGID":"en"}
# rem2ps begin
January 2026 31 4 0
Sunday Monday Tuesday Wednesday Thursday Friday Saturday
December 31
February 28
# rem2ps end
# translations
{"LANGID":"en"}
# rem2ps begin
January 2026 31 4 0
Sunday Monday Tuesday Wednesday Thursday Friday Saturday
December 31
February 28
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
-stdin-(2): `/': Division by zero
# rem2ps end

View File

@@ -1589,9 +1589,11 @@ dump -c a
set a eval("1 +") set a eval("1 +")
set a eval("1/0") set a eval("1/0")
set a eval("1 / / 2") set a eval("1 / / 2")
set a eval("1 / # 2")
set a catch(eval("1 +"), 33) set a catch(eval("1 +"), 33)
set a catch(eval("1/0"), 34) set a catch(eval("1/0"), 34)
set a catch(eval("1 / / 2"), 35) set a catch(eval("1 / / 2"), 35)
set a catch(eval("1 / # 2"), 35)
# Ensure RUN is disabled in eval # Ensure RUN is disabled in eval
set a shell("echo foo") set a shell("echo foo")
@@ -1765,6 +1767,8 @@ set a mbchar(0)
set a mbchar(0, 120) set a mbchar(0, 120)
set a mbchar(120, 0) set a mbchar(120, 0)
# Make sure trailing space doesn't cause a diagnostic.
set a "foo"
DEBUG -x DEBUG -x
# Don't want Remind to queue reminders # Don't want Remind to queue reminders
EXIT EXIT

View File

@@ -26,7 +26,9 @@ set a utctolocal('2050-01-01@01:00')
set a localtoutc('2050-12-31@23:44') set a localtoutc('2050-12-31@23:44')
set a localtoutc('2050-03-13@00:00') set a localtoutc('2050-03-13@00:00')
set a localtoutc('2050-03-13@02:00') # This next one fails on MUSL, so it's commented out.
# We expect 2050-03-13@07:00 but MUSL gives 2050-03-13@06:00
#set a localtoutc('2050-03-13@02:00')
set a localtoutc('2050-11-06@00:00') set a localtoutc('2050-11-06@00:00')
set a localtoutc('2050-11-06@02:00') set a localtoutc('2050-11-06@02:00')