mirror of
https://salsa.debian.org/dskoll/remind.git
synced 2026-04-17 14:59:20 +02:00
Compare commits
75 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a8607cb012 | ||
|
|
6caa404e59 | ||
|
|
13e1e19855 | ||
|
|
96d40b81df | ||
|
|
30e4a9fc50 | ||
|
|
6d0fbeed20 | ||
|
|
3f1aaeefd2 | ||
|
|
326604fe18 | ||
|
|
57e93553bf | ||
|
|
a5aa5d901b | ||
|
|
1e0d43b63c | ||
|
|
188efaebba | ||
|
|
b701dc575f | ||
|
|
c9ae1c82f0 | ||
|
|
13cea56cce | ||
|
|
6661f32faf | ||
|
|
f6ab660c5e | ||
|
|
523cfb7bf5 | ||
|
|
82a4ba777d | ||
|
|
8f02868486 | ||
|
|
12d8e8e948 | ||
|
|
f5f364507b | ||
|
|
d514389c39 | ||
|
|
52c615ff61 | ||
|
|
7d3e6b3a72 | ||
|
|
c4e5190ec2 | ||
|
|
f197f5ef9d | ||
|
|
153cbfe276 | ||
|
|
2d9bea444b | ||
|
|
2ae8e51bec | ||
|
|
05d1608081 | ||
|
|
d093e8dea3 | ||
|
|
f9fac22bbf | ||
|
|
9ecbfbb314 | ||
|
|
612f3e7f16 | ||
|
|
d22f9979a5 | ||
|
|
291f648d2e | ||
|
|
351088fd4b | ||
|
|
ed57f62911 | ||
|
|
53dcce6a91 | ||
|
|
d12d327e35 | ||
|
|
a2f760fb91 | ||
|
|
4a9b4ff6e4 | ||
|
|
ce6061a29b | ||
|
|
878a5d9bed | ||
|
|
d1b55bae8d | ||
|
|
c13817015f | ||
|
|
bf74ad1eb7 | ||
|
|
f2eb06c752 | ||
|
|
8172acf102 | ||
|
|
949e00219d | ||
|
|
1fd19b89e2 | ||
|
|
22d6c0583a | ||
|
|
12fac555b6 | ||
|
|
085b781114 | ||
|
|
c9d7fbf479 | ||
|
|
42f868db07 | ||
|
|
2996275ec4 | ||
|
|
5586198a0e | ||
|
|
d17c48e751 | ||
|
|
e08a6370ef | ||
|
|
7a319466cf | ||
|
|
4158ad5977 | ||
|
|
9b07eed26f | ||
|
|
05ead8c40d | ||
|
|
35e222967c | ||
|
|
83ca07d34f | ||
|
|
36f4bb852b | ||
|
|
9642303d05 | ||
|
|
a6144baff7 | ||
|
|
17985c59c3 | ||
|
|
719295ccd7 | ||
|
|
3d74389713 | ||
|
|
80c7244d64 | ||
|
|
db27be1469 |
28
configure
vendored
28
configure
vendored
@@ -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.08.
|
# 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.08'
|
PACKAGE_VERSION='06.02.01'
|
||||||
PACKAGE_STRING='remind 06.01.08'
|
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.08 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.08:";;
|
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.08
|
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.08, 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.08, 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.08
|
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\\"
|
||||||
|
|
||||||
|
|||||||
12
configure.ac
12
configure.ac
@@ -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.08, , , 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
|
||||||
|
|||||||
@@ -1,5 +1,79 @@
|
|||||||
CHANGES TO REMIND
|
CHANGES TO REMIND
|
||||||
|
|
||||||
|
* VERSION 06.02.01 - 2025-11-10
|
||||||
|
|
||||||
|
- BUG FIX: remind: Obey $ParseUntriggered in Calendar Mode. Before,
|
||||||
|
$ParseUntriggered was always being treated as 1 in Calendar Mode.
|
||||||
|
|
||||||
|
- BUG FIX: TkRemind: Fix some buggy interactions between the Options
|
||||||
|
dialog and the font chooser.
|
||||||
|
|
||||||
|
- TEST FIX: One test was consistently failing under MUSL, and it is
|
||||||
|
not clear whether MUSL's or glibc's interpretation is correct.
|
||||||
|
Remove that test so all tests pass under MUSL.
|
||||||
|
|
||||||
|
* VERSION 06.02.00 - 2025-11-03
|
||||||
|
|
||||||
|
- MAJOR NEW FEATURE: TkRemind: A new "View..." menu lets you choose a
|
||||||
|
calendar view from the following choices: Entire month, 1 week, 2
|
||||||
|
weeks or 4 weeks.
|
||||||
|
|
||||||
|
- NEW FEATURE: remind: The "z" flag for the "-c" option makes Remind
|
||||||
|
turn reminders with a "Url:" INFO string into clickable hyperlinks.
|
||||||
|
Note that your terminal must support the escape sequences at
|
||||||
|
https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda
|
||||||
|
for this feature to work.
|
||||||
|
|
||||||
|
- IMPROVEMENT: TkRemind: The Print dialog now allows you to preview
|
||||||
|
(and if you wish, adjust) the command used to print a calendar.
|
||||||
|
|
||||||
|
- IMPROVEMENT: TkRemind: The Agenda Mode window ("Show Today's
|
||||||
|
Reminders") has navigation buttons for moving back or forward one
|
||||||
|
day at a time.
|
||||||
|
|
||||||
|
- IMPROVEMENT: TkRemind: Add many keyboard shortcuts. All pop-up
|
||||||
|
windows can be closed with Esc or Control-W. Other shortcuts are
|
||||||
|
documented in the tkremind man page.
|
||||||
|
|
||||||
|
- CHANGE: TkRemind: If you hand-edit a reminder in the "Preview
|
||||||
|
Reminder" dialog box, it is marked as non-editable by TkRemind.
|
||||||
|
|
||||||
|
- CHANGE: TkRemind: Remove support for rem2ps. All printing is now
|
||||||
|
done using rem2pdf.
|
||||||
|
|
||||||
|
- IMPROVEMENT: remind: Improve error reporting if there's extraneous
|
||||||
|
content after an expression.
|
||||||
|
|
||||||
|
- IMPROVEMENT: tests: test-rem was tweaked to allow testing of an
|
||||||
|
installed Remind installation. This work was done by Jochen
|
||||||
|
Sprickerhof.
|
||||||
|
|
||||||
|
- IMPROVEMENT: rem2pdf: When rendering weekly calendars, reduce the
|
||||||
|
default size when drawing moons; if a day does not have a moon
|
||||||
|
indicator, don't leave a big gap before the first reminder entry.
|
||||||
|
|
||||||
|
- IMPROVEMENT: rem2pdf: Draw moon phases left-aligned.
|
||||||
|
|
||||||
|
- IMPROVEMENT: rem2pdf: For weekly calendars with 4 weeks per page,
|
||||||
|
make all of the boxes the same height.
|
||||||
|
|
||||||
|
- DOCUMENTATION IMPROVEMENT: remind: Document the INFO strings that
|
||||||
|
back-ends should strive to support (Url:, Location: and
|
||||||
|
Description:)
|
||||||
|
|
||||||
|
- BUG FIX: TkRemind: Bind the Home/End/PgUp/PgDn keys on the numeric
|
||||||
|
keyboard for navigation.
|
||||||
|
|
||||||
|
- FIX: Don't enable -ffat-lto-objects on FreeBSD.
|
||||||
|
|
||||||
|
- BUG FIX: remind: Don't segfault if we can't open a .purged output
|
||||||
|
file in purge mode.
|
||||||
|
|
||||||
|
- BUG FIX: rem2pdf: Make PANGO @x,y positioning consistent between
|
||||||
|
weekly and monthly calendars. NOTE: If you use absolute PANGO
|
||||||
|
positioning, you might need to adjust your script because positions
|
||||||
|
are now relative to the centers of the grid lines.
|
||||||
|
|
||||||
* VERSION 06.01.08 - 2025-10-27
|
* VERSION 06.01.08 - 2025-10-27
|
||||||
|
|
||||||
- BUG FIXES: tkremind: Fix many bugs with modal dialogs: Clicking too fast
|
- BUG FIXES: tkremind: Fix many bugs with modal dialogs: Clicking too fast
|
||||||
|
|||||||
@@ -102,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
|
||||||
@@ -1485,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:
|
||||||
|
|||||||
@@ -61,15 +61,32 @@ 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.
|
||||||
@@ -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
|
||||||
@@ -171,9 +202,9 @@ is also supplied to \fBRemind\fR.
|
|||||||
If you click on \fBShow Command\fR rather than \fBPrint\fR, then
|
If you click on \fBShow Command\fR rather than \fBPrint\fR, then
|
||||||
\fBTkRemind\fR won't actually print anything. Instead, it will pop
|
\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
|
up a text window with the command that it \fIwould have used\fR to print
|
||||||
the calendar. You can cut-and-paste the command into a shell prompt and
|
the calendar. You can adjust the command as needed and then click \fBRun\fR
|
||||||
adjust as needed if you want to use any \fBrem2pdf\fR or \fBrem2ps\fR
|
to run the modified command. This lets you specify \fBrem2pdf\fR options
|
||||||
options that are not directly supported by \fBTkRemind\fR.
|
that are not directly supported by \fBTkRemind\fR.
|
||||||
|
|
||||||
.SH EDITING REMINDERS
|
.SH EDITING REMINDERS
|
||||||
|
|
||||||
@@ -187,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
|
||||||
|
|
||||||
@@ -236,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
|
||||||
@@ -329,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
|
||||||
@@ -559,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
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
@@ -526,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>
|
||||||
|
|
||||||
@@ -683,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
|
||||||
@@ -692,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.)
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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};
|
||||||
|
|||||||
1158
scripts/tkremind.in
1158
scripts/tkremind.in
File diff suppressed because it is too large
Load Diff
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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 */
|
||||||
;
|
;
|
||||||
|
|||||||
40
src/expr.c
40
src/expr.c
@@ -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)) {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ Emanuele
|
|||||||
EndSent
|
EndSent
|
||||||
EndSentIg
|
EndSentIg
|
||||||
EntrySize
|
EntrySize
|
||||||
|
Esc
|
||||||
Example2
|
Example2
|
||||||
Expr
|
Expr
|
||||||
ExpressionTimeLimit
|
ExpressionTimeLimit
|
||||||
@@ -243,6 +244,9 @@ MSC
|
|||||||
MSF
|
MSF
|
||||||
MSGPREFIX
|
MSGPREFIX
|
||||||
MSGSUFFIX
|
MSGSUFFIX
|
||||||
|
MUSL
|
||||||
|
MUSL
|
||||||
|
MUSL's
|
||||||
Madsen
|
Madsen
|
||||||
Makefile
|
Makefile
|
||||||
Makefiles
|
Makefiles
|
||||||
@@ -304,6 +308,8 @@ Pango
|
|||||||
ParseUntriggered
|
ParseUntriggered
|
||||||
Paulo
|
Paulo
|
||||||
Pelzl
|
Pelzl
|
||||||
|
PgDn
|
||||||
|
PgUp
|
||||||
Philipp
|
Philipp
|
||||||
Pinard
|
Pinard
|
||||||
Plaser
|
Plaser
|
||||||
@@ -589,6 +595,7 @@ gaa
|
|||||||
garbhol
|
garbhol
|
||||||
gcc
|
gcc
|
||||||
getenv
|
getenv
|
||||||
|
glibc's
|
||||||
grey
|
grey
|
||||||
greyed
|
greyed
|
||||||
gridline
|
gridline
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -950,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
|
||||||
|
|||||||
145
tests/test.cmp
145
tests/test.cmp
@@ -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.08"
|
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.08"
|
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.08"
|
version() => "06.02.01"
|
||||||
"06.01.08" > "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.08
|
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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user