mirror of
https://salsa.debian.org/dskoll/remind.git
synced 2026-04-17 23:08:40 +02:00
Compare commits
154 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
d59fe832fd | ||
|
|
88ebdf275e | ||
|
|
a7a6f8b5f0 | ||
|
|
3e248c069e | ||
|
|
65cca1fd8f | ||
|
|
5a889043ba | ||
|
|
6d1fcdf246 | ||
|
|
3476b965ef | ||
|
|
0bba2dc3b3 | ||
|
|
e5c27f19f5 | ||
|
|
f9aa53433e | ||
|
|
5323245529 | ||
|
|
deb12ac7cd | ||
|
|
a1488d93ad | ||
|
|
65add3d32e | ||
|
|
8d6f5efa7b | ||
|
|
eb996a8146 | ||
|
|
1cd6205cdd | ||
|
|
6d9ccc1522 | ||
|
|
0268020579 | ||
|
|
5803d1dd7e | ||
|
|
5dfce21af6 | ||
|
|
8ddb956f9a | ||
|
|
32421815cd | ||
|
|
dbe3bc13fa | ||
|
|
c68c716585 | ||
|
|
7a1a5abc0f | ||
|
|
53a1318306 | ||
|
|
78fecf28c4 | ||
|
|
6081d29b11 | ||
|
|
e0a5125ee0 | ||
|
|
c3f790a99b | ||
|
|
3eb507451e | ||
|
|
e9e0368418 | ||
|
|
759ae1ab80 | ||
|
|
e8602824a0 | ||
|
|
62301a88cc | ||
|
|
6b163092c7 | ||
|
|
f8ac99d22e | ||
|
|
4b7870f6b1 | ||
|
|
e11b899f7e | ||
|
|
8e4987eeba | ||
|
|
aa56d27aea | ||
|
|
b3278cd9d5 | ||
|
|
09814eac68 | ||
|
|
0e8889441d | ||
|
|
d9503bd14d | ||
|
|
a5c18f8825 | ||
|
|
f7fc9f57bd | ||
|
|
6931c81716 | ||
|
|
2eb80c4ba1 | ||
|
|
f5dbba3864 | ||
|
|
3fc57fb76e | ||
|
|
ff9d27a6ca | ||
|
|
e82767f821 | ||
|
|
772daaa877 | ||
|
|
941cb0f63e | ||
|
|
15960f7e4a | ||
|
|
f05ef363fc | ||
|
|
a22b0b8daf | ||
|
|
382ff47369 | ||
|
|
cab749b651 | ||
|
|
2dc5a7776d | ||
|
|
2723875a18 | ||
|
|
81a186607b | ||
|
|
5534bf8272 | ||
|
|
f726b09fc6 | ||
|
|
f07a6d1bed | ||
|
|
a0a362c418 | ||
|
|
0b45bc818b | ||
|
|
b6ad32749b | ||
|
|
ec36fc8cf8 | ||
|
|
2afb71b233 | ||
|
|
4bf9abc791 | ||
|
|
51d895dbb1 | ||
|
|
517251dd05 | ||
|
|
834741f91b | ||
|
|
19b33bb9bc | ||
|
|
1acb343cf3 | ||
|
|
b5b00468cc | ||
|
|
5042621073 | ||
|
|
e2152b1e82 | ||
|
|
4adfc4b20e | ||
|
|
6a4a1ab2d5 | ||
|
|
a19b79951e | ||
|
|
21f5462657 | ||
|
|
b3f03e3e0c | ||
|
|
593d367eaa |
@@ -2,7 +2,7 @@
|
||||
|
||||
Remind is a full-featured calendar/alarm program. Copying policy is
|
||||
in the file "COPYRIGHT" included with the source; Remind is licensed under
|
||||
the GNU General Public License, Vesion 2.
|
||||
the GNU General Public License, Version 2.
|
||||
|
||||
## Prerequisites:
|
||||
|
||||
|
||||
109
configure
vendored
109
configure
vendored
@@ -1,6 +1,6 @@
|
||||
#! /bin/sh
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated by GNU Autoconf 2.72 for remind 06.01.04.
|
||||
# Generated by GNU Autoconf 2.72 for remind 06.02.00.
|
||||
#
|
||||
#
|
||||
# Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation,
|
||||
@@ -601,8 +601,8 @@ MAKEFLAGS=
|
||||
# Identity of this package.
|
||||
PACKAGE_NAME='remind'
|
||||
PACKAGE_TARNAME='remind'
|
||||
PACKAGE_VERSION='06.01.04'
|
||||
PACKAGE_STRING='remind 06.01.04'
|
||||
PACKAGE_VERSION='06.02.00'
|
||||
PACKAGE_STRING='remind 06.02.00'
|
||||
PACKAGE_BUGREPORT=''
|
||||
PACKAGE_URL='https://dianne.skoll.ca/projects/remind/'
|
||||
|
||||
@@ -1258,7 +1258,7 @@ if test "$ac_init_help" = "long"; then
|
||||
# Omit some internal or obsolete options to make the list less imposing.
|
||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||
cat <<_ACEOF
|
||||
'configure' configures remind 06.01.04 to adapt to many kinds of systems.
|
||||
'configure' configures remind 06.02.00 to adapt to many kinds of systems.
|
||||
|
||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||
|
||||
@@ -1320,7 +1320,7 @@ fi
|
||||
|
||||
if test -n "$ac_init_help"; then
|
||||
case $ac_init_help in
|
||||
short | recursive ) echo "Configuration of remind 06.01.04:";;
|
||||
short | recursive ) echo "Configuration of remind 06.02.00:";;
|
||||
esac
|
||||
cat <<\_ACEOF
|
||||
|
||||
@@ -1408,7 +1408,7 @@ fi
|
||||
test -n "$ac_init_help" && exit $ac_status
|
||||
if $ac_init_version; then
|
||||
cat <<\_ACEOF
|
||||
remind configure 06.01.04
|
||||
remind configure 06.02.00
|
||||
generated by GNU Autoconf 2.72
|
||||
|
||||
Copyright (C) 2023 Free Software Foundation, Inc.
|
||||
@@ -1871,7 +1871,7 @@ cat >config.log <<_ACEOF
|
||||
This file contains any messages produced by compilers while
|
||||
running configure, to aid debugging if configure makes a mistake.
|
||||
|
||||
It was created by remind $as_me 06.01.04, which was
|
||||
It was created by remind $as_me 06.02.00, which was
|
||||
generated by GNU Autoconf 2.72. Invocation command line was
|
||||
|
||||
$ $0$ac_configure_args_raw
|
||||
@@ -2477,6 +2477,7 @@ as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
|
||||
as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
|
||||
as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"
|
||||
as_fn_append ac_header_c_list " sys/time.h sys_time_h HAVE_SYS_TIME_H"
|
||||
as_fn_append ac_header_c_list " sys/termios.h sys_termios_h HAVE_SYS_TERMIOS_H"
|
||||
as_fn_append ac_header_c_list " readline/readline.h readline_readline_h HAVE_READLINE_READLINE_H"
|
||||
as_fn_append ac_header_c_list " readline/history.h readline_history_h HAVE_READLINE_HISTORY_H"
|
||||
|
||||
@@ -2659,6 +2660,12 @@ cat <<'EOF'
|
||||
|
||||
EOF
|
||||
|
||||
ac_ext=c
|
||||
ac_cpp='$CPP $CPPFLAGS'
|
||||
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
|
||||
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
|
||||
ac_compiler_gnu=$ac_cv_c_compiler_gnu
|
||||
|
||||
ac_config_headers="$ac_config_headers src/config.h"
|
||||
|
||||
|
||||
@@ -4028,6 +4035,7 @@ fi
|
||||
|
||||
|
||||
|
||||
|
||||
# The cast to long int works around a bug in the HP C Compiler
|
||||
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
|
||||
# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
|
||||
@@ -4217,31 +4225,74 @@ printf "%s\n" "#define TM_IN_SYS_TIME 1" >>confdefs.h
|
||||
|
||||
fi
|
||||
|
||||
U="`uname -s`"
|
||||
|
||||
if test "$GCC" = yes; then
|
||||
# LTO fails on Solaris for some reason
|
||||
if test "$U" != "SunOS" -a "$GCC" = yes; then
|
||||
CFLAGS="$CFLAGS -Wall -Wextra -Wstrict-prototypes"
|
||||
# Check for link-time optimization support
|
||||
f=-flto=auto
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports $f" >&5
|
||||
printf %s "checking whether $CC supports $f... " >&6; }
|
||||
if $CC -Werror -E $f - < /dev/null > /dev/null 2>&1 ; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||
printf "%s\n" "yes" >&6; }
|
||||
CFLAGS="$CFLAGS $f"
|
||||
f=-ffat-lto-objects
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports $f" >&5
|
||||
printf %s "checking whether $CC supports $f... " >&6; }
|
||||
if $CC -Werror -E $f - < /dev/null > /dev/null 2>&1 ; then
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||
printf "%s\n" "yes" >&6; }
|
||||
CFLAGS="$CFLAGS $f"
|
||||
else
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
OLDCFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -flto=auto"
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -flto=auto" >&5
|
||||
printf %s "checking whether $CC supports -flto=auto... " >&6; }
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
int x = 1;
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_c_try_link "$LINENO"
|
||||
then :
|
||||
lto=yes
|
||||
else case e in #(
|
||||
e) lto=no
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext conftest.beam \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lto" >&5
|
||||
printf "%s\n" "$lto" >&6; }
|
||||
if test "x$lto" != "xyes" ; then
|
||||
CFLAGS="$OLDCFLAGS"
|
||||
else
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
printf "%s\n" "no" >&6; }
|
||||
{ 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; }
|
||||
OLDCFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -Werror -ffat-lto-objects"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
int x = 1;
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_c_try_link "$LINENO"
|
||||
then :
|
||||
lto=yes
|
||||
else case e in #(
|
||||
e) lto=no
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext conftest.beam \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lto" >&5
|
||||
printf "%s\n" "$lto" >&6; }
|
||||
if test "x$lto" != "xyes" ; then
|
||||
CFLAGS="$OLDCFLAGS"
|
||||
else
|
||||
CFLAGS="$OLDCFLAGS -ffat-lto-objects"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -4848,7 +4899,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
||||
# report actual input values of CONFIG_FILES etc. instead of their
|
||||
# values after options handling.
|
||||
ac_log="
|
||||
This file was extended by remind $as_me 06.01.04, which was
|
||||
This file was extended by remind $as_me 06.02.00, which was
|
||||
generated by GNU Autoconf 2.72. Invocation command line was
|
||||
|
||||
CONFIG_FILES = $CONFIG_FILES
|
||||
@@ -4913,7 +4964,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
|
||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||
ac_cs_config='$ac_cs_config_escaped'
|
||||
ac_cs_version="\\
|
||||
remind config.status 06.01.04
|
||||
remind config.status 06.02.00
|
||||
configured by $0, generated by GNU Autoconf 2.72,
|
||||
with options \\"\$ac_cs_config\\"
|
||||
|
||||
|
||||
50
configure.ac
50
configure.ac
@@ -1,6 +1,6 @@
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_INIT(remind, 06.01.04, , , https://dianne.skoll.ca/projects/remind/)
|
||||
AC_INIT(remind, 06.02.00, , , https://dianne.skoll.ca/projects/remind/)
|
||||
AC_CONFIG_SRCDIR([src/queue.c])
|
||||
|
||||
cat <<'EOF'
|
||||
@@ -13,6 +13,7 @@ cat <<'EOF'
|
||||
|
||||
EOF
|
||||
|
||||
AC_LANG([C])
|
||||
AC_CONFIG_HEADERS([src/config.h])
|
||||
|
||||
AC_ARG_ENABLE(perl-build-artifacts,
|
||||
@@ -31,7 +32,7 @@ AC_PATH_PROG([PERL], [perl])
|
||||
dnl Checks for libraries.
|
||||
AC_CHECK_LIB(m, sqrt)
|
||||
AC_CHECK_LIB(readline, readline)
|
||||
AC_CHECK_HEADERS_ONCE([sys/time.h stdint.h readline/readline.h readline/history.h])
|
||||
AC_CHECK_HEADERS_ONCE([sys/time.h sys/termios.h stdint.h readline/readline.h readline/history.h])
|
||||
|
||||
dnl Integer sizes
|
||||
AC_CHECK_SIZEOF(unsigned int)
|
||||
@@ -43,25 +44,42 @@ AC_CHECK_HEADERS(strings.h sys/types.h glob.h wctype.h locale.h langinfo.h sys/i
|
||||
|
||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_STRUCT_TM
|
||||
U="`uname -s`"
|
||||
|
||||
if test "$GCC" = yes; then
|
||||
# LTO fails on Solaris for some reason
|
||||
if test "$U" != "SunOS" -a "$GCC" = yes; then
|
||||
CFLAGS="$CFLAGS -Wall -Wextra -Wstrict-prototypes"
|
||||
# Check for link-time optimization support
|
||||
f=-flto=auto
|
||||
AC_MSG_CHECKING([whether $CC supports $f])
|
||||
if $CC -Werror -E $f - < /dev/null > /dev/null 2>&1 ; then
|
||||
AC_MSG_RESULT([yes])
|
||||
CFLAGS="$CFLAGS $f"
|
||||
f=-ffat-lto-objects
|
||||
AC_MSG_CHECKING([whether $CC supports $f])
|
||||
if $CC -Werror -E $f - < /dev/null > /dev/null 2>&1 ; then
|
||||
AC_MSG_RESULT([yes])
|
||||
CFLAGS="$CFLAGS $f"
|
||||
OLDCFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -flto=auto"
|
||||
AC_MSG_CHECKING([whether $CC supports -flto=auto])
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[[int x = 1;]],
|
||||
[[]])],
|
||||
[lto=yes],
|
||||
[lto=no]
|
||||
)
|
||||
AC_MSG_RESULT([$lto])
|
||||
if test "x$lto" != "xyes" ; then
|
||||
CFLAGS="$OLDCFLAGS"
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
AC_MSG_CHECKING([whether $CC supports -ffat-lto-object])
|
||||
OLDCFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -Werror -ffat-lto-objects"
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[[int x = 1;]],
|
||||
[[]])],
|
||||
[lto=yes],
|
||||
[lto=no]
|
||||
)
|
||||
AC_MSG_RESULT([$lto])
|
||||
if test "x$lto" != "xyes" ; then
|
||||
CFLAGS="$OLDCFLAGS"
|
||||
else
|
||||
CFLAGS="$OLDCFLAGS -ffat-lto-objects"
|
||||
fi
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
391
docs/WHATSNEW
391
docs/WHATSNEW
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
# Save variables and functions that we will mess with
|
||||
PUSH-VARS InIsrael IncludeIsraeliHolidays Reform IncludeOmer IncludeOmerCal SunCal
|
||||
PUSH-FUNCS _chan _h2 _h2I _YZ _PastSat _BackTwoSat
|
||||
PUSH-VARS InIsrael IncludeIsraeliHolidays Reform IncludeOmer IncludeOmerCal SunCal ostart yz
|
||||
PUSH-FUNCS _h2 _h2I _YZ _PastSat _BackTwoSat
|
||||
|
||||
SET InIsrael value("InIsrael", 0)
|
||||
SET IncludeIsraeliHolidays value("IncludeIsraeliHolidays", 1)
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
.TH REM 1 "@RELEASE_DATE@" "User Commands" "VERSION @VERSION@"
|
||||
.UC 4
|
||||
.TH REM 1 "@RELEASE_DATE@" "Remind" "VERSION @VERSION@"
|
||||
.SH NAME
|
||||
rem \- Invoke Remind with a default filename
|
||||
.SH SYNOPSIS
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
.TH REM2PS 1 "@RELEASE_DATE@" "User Commands" "VERSION @VERSION@"
|
||||
.UC 4
|
||||
.TH REM2PS 1 "@RELEASE_DATE@" "Remind" "VERSION @VERSION@"
|
||||
.SH NAME
|
||||
rem2ps \- draw a PostScript calendar from Remind output
|
||||
.SH SYNOPSIS
|
||||
@@ -160,7 +159,7 @@ Helvetica-BoldOblique.
|
||||
.RE
|
||||
.TP
|
||||
\fB\-s\fR[\fBthed\fR] \fIsize\fR
|
||||
Set the size (in points) of the text for the the calendar title,
|
||||
Set the size (in points) of the text for the calendar title,
|
||||
day-of-week headings, the calendar entries, and the day numbers,
|
||||
respectively. \fISize\fR must be a decimal number. The default sizes
|
||||
are equivalent to specifying:
|
||||
@@ -205,7 +204,7 @@ illustrated with examples:
|
||||
.fi
|
||||
.PP
|
||||
That example creates a blank calendar for the entire year of 1994, and
|
||||
sends it the the printer named "laser."
|
||||
sends it to the printer named "laser."
|
||||
.PP
|
||||
.nf
|
||||
remind \-p ~/.reminders | rem2ps \-l \-sd 18 > cal.ps
|
||||
@@ -581,7 +580,7 @@ If an AT clause was present, this key contains the event start time in
|
||||
the format \fIYYYY-MM-DD\fRT\fIHH:MM\fR in the \fIsystem default time zone\fR.
|
||||
.TP
|
||||
.B eventstart_in_tz \fIdt\fR
|
||||
If a TZ clause was present, this key containes the event start time in
|
||||
If a TZ clause was present, this key contains the event start time in
|
||||
the format \fIYYYY-MM-DD\fRT\fIHH:MM\fR in the \fItime zone specified
|
||||
by TZ\fR.
|
||||
.TP
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
.TH REMIND 1 "@RELEASE_DATE@" "User Commands" "VERSION @VERSION@"
|
||||
.UC 4
|
||||
.TH REMIND 1 "@RELEASE_DATE@" "Remind" "VERSION @VERSION@"
|
||||
.SH NAME
|
||||
remind \- a sophisticated reminder service
|
||||
.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
|
||||
display.
|
||||
.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'
|
||||
causes \fBRemind\fR to use VT100 escape sequences to approximate
|
||||
SPECIAL COLOR reminders. Note that this flag is kept for
|
||||
@@ -514,7 +519,7 @@ your reminders will be triggered in the future. Similarly, you can
|
||||
supply a \fItime\fR to set \fBRemind\fR's notion of "now" to a
|
||||
particular time. Supplying a \fItime\fR on the command line also
|
||||
implicitly enables the \fB\-q\fR option and disables the \fB\-z\fR
|
||||
option. The \fItime\fR may be specified in 24-hour format (eg, 13:20)
|
||||
option. The \fItime\fR may be specified in 24-hour format (e.g., 13:20)
|
||||
or common "AM/PM" format (1:20pm).
|
||||
.PP
|
||||
If you would rather specify the date more succinctly, you can supply
|
||||
@@ -1359,7 +1364,7 @@ background, and activates timed reminders when the system time reached
|
||||
the specified time. Note that if you use the \fBNOQUEUE\fR modifier
|
||||
in the \fBREM\fR command, then this queuing and background activation
|
||||
is \fInot\fR performed. \fBNOQUEUE\fR is useful if you want a time
|
||||
to be associated with a reminder (eg, in the calendar) but are not
|
||||
to be associated with a reminder (e.g., in the calendar) but are not
|
||||
interested in a popup reminder happening at the specified time.
|
||||
|
||||
.PP
|
||||
@@ -1486,6 +1491,15 @@ and description of a reminder like this:
|
||||
MSG Engineering meeting
|
||||
.fi
|
||||
.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
|
||||
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:
|
||||
@@ -1789,7 +1803,7 @@ or \fB\-ppp\fR option.
|
||||
use \fBrem2pdf\fR instead.
|
||||
.TP
|
||||
.B o
|
||||
The "simple calendar" formats (ie, \fBremind\fR's \fB\-s\fR, \fB\-n\fR and
|
||||
The "simple calendar" formats (i.e., \fBremind\fR's \fB\-s\fR, \fB\-n\fR and
|
||||
\fB\-p\fR options) convert newlines to spaces.
|
||||
.PP
|
||||
All calendar back-ends collapse multiple spaces to a single space and
|
||||
@@ -2046,7 +2060,7 @@ for the month of August and need to water plants every Wednesday:
|
||||
.PP
|
||||
Running that command on 13 Aug yields: "Plants 7 days ago." because you
|
||||
have not told \fBRemind\fR that you completed the first watering. If you finish
|
||||
your duties and add a COMMPLETE-THROUGH date of 2025-08-27, then \fBRemind\fR
|
||||
your duties and add a COMPLETE-THROUGH date of 2025-08-27, then \fBRemind\fR
|
||||
never reminds you of that task in the future.
|
||||
.PP
|
||||
In Purge Mode, \fBRemind\fR will not purge TODOs unless they have been marked
|
||||
@@ -2133,7 +2147,7 @@ For example, the following sequences are equivalent:
|
||||
.fi
|
||||
.PP
|
||||
Note that \fBRemind\fR has a compiled-in limit to the number of full
|
||||
OMITs. If you omit a range of \fIN\fR fully-specified (ie, year
|
||||
OMITs. If you omit a range of \fIN\fR fully-specified (i.e., year
|
||||
included) days, then \fIN\fR full OMITs are used up. Trying to omit a
|
||||
very large range may result in the error "Too many full OMITs"
|
||||
.PP
|
||||
@@ -2264,9 +2278,20 @@ adjusted to Thursday, 14 May 2026 at 06:59 UTC because of the
|
||||
time zone adjustment.
|
||||
.PP
|
||||
If you use an invalid time zone name after the \fBTZ\fR keyword,
|
||||
results are undefined. Unfortunately, \fBRemind\fR cannot diagnose
|
||||
this error becase the C library \fBtzset()\fR function has no
|
||||
error return.
|
||||
results are undefined. As mentioned previously, time zone names
|
||||
\fIare\fR case-sensitive; America/Toronto is valid, but
|
||||
america/toronto is not.
|
||||
.PP
|
||||
If you are on a system that stores time zone data in
|
||||
/usr/share/zoneinfo, then \fBRemind\fR will attempt to validate the
|
||||
time zone name and will warn you if it appears to be invalid. If you
|
||||
want to specify a time zone that lacks a file under
|
||||
/usr/share/zoneinfo anyway, and want to suppress the warning, prefix
|
||||
the time zone name with "!". For example:
|
||||
.PP
|
||||
.nf
|
||||
REM Thursday AT 14:45 TZ !EST+5EDT,M3.2.0/2,M11.1.0/2 MSG Old TZ format
|
||||
.fi
|
||||
.PP
|
||||
In a reminder with the \fBTZ\fR keyword, OMIT dates are evaluated in
|
||||
the specified time zone. Here's an example: Suppose the local time zone
|
||||
@@ -3420,7 +3445,7 @@ problems. See also the section "MACHINES WITH A 32-BIT TIME_T TYPE"
|
||||
.B $TodoFilter (read-only)
|
||||
If 0, then both events and TODOs are being output. If 1, then the
|
||||
\fB\-\-only-todos\fR command-line option was supplied. If 2, then
|
||||
the \fB\-\-only-events\fR command-line option was spplied.
|
||||
the \fB\-\-only-events\fR command-line option was supplied.
|
||||
.TP
|
||||
.B $UntimedFirst (read-only)
|
||||
Set to 1 if the \fB\-g\fR option is used with a fourth sort character
|
||||
@@ -4725,7 +4750,7 @@ to use \fBsoleq()\fR.
|
||||
Returns a string representing where Remind's standard output is going.
|
||||
The return values are one of the following: "TTY" if standard-output
|
||||
is a terminal, "BLOCKDEV" if it is a block device (very unlikely),
|
||||
"CHARDEV" if it is a character device (eg, /dev/null), "DIR" if it
|
||||
"CHARDEV" if it is a character device (e.g., /dev/null), "DIR" if it
|
||||
is a directory (very unlikely), "PIPE" if it is a pipe or FIFO,
|
||||
"SYMLINK" if it is a symlink (very unlikely), "SOCKET" if it is a
|
||||
socket, or "UNKNOWN" if it could not be determined.
|
||||
@@ -5074,6 +5099,7 @@ If \fBdstzone\fR is omitted or is the empty string, the default system
|
||||
time zone is used as the destination zone. The return value is a
|
||||
DATETIME. Time zone names are system-dependent; consult your
|
||||
operating system for legal values. Here is an example:
|
||||
.RS
|
||||
.PP
|
||||
.nf
|
||||
tzconvert('2007-07-08@01:14', "Canada/Eastern", "Canada/Pacific")
|
||||
@@ -5083,6 +5109,12 @@ operating system for legal values. Here is an example:
|
||||
2007-07-07@22:14
|
||||
.fi
|
||||
.PP
|
||||
If your system includes the directory /usr/share/zoneinfo, \fBRemind\fR
|
||||
will warn you if you use an invalid time zone name for \fBsrczone\fR or
|
||||
\fBdstzone\fR. To suppress these warnings, add a "!" to the beginning
|
||||
of the time zone name.
|
||||
.RE
|
||||
.PP
|
||||
.TP
|
||||
.B upper(s_string)
|
||||
Returns a \fBSTRING\fR with all lower-case characters in \fIstring\fR
|
||||
@@ -5296,8 +5328,7 @@ expressions are evaluated only once, not recursively. Thus, writing:
|
||||
.fi
|
||||
.PP
|
||||
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
|
||||
left-bracket into a reminder is to use ["["].
|
||||
this as a pasted-in expression.
|
||||
.PP
|
||||
You can use expression pasting almost anywhere. However, there are a few
|
||||
exceptions:
|
||||
@@ -5584,8 +5615,6 @@ following example:
|
||||
# FSET -f(x) 2*x
|
||||
.fi
|
||||
.PP
|
||||
to define a function and suppress any "redefined function" warning.
|
||||
.PP
|
||||
.SH SAVING AND RESTORING FUNCTIONS
|
||||
.PP
|
||||
Occasionally, it is useful to redefine a function for a specific block of
|
||||
@@ -6442,7 +6471,7 @@ the trigger. For example:
|
||||
REM 1992-01-01 MSG This will be purged after Jan 1 1992
|
||||
REM [nonconst('1992-01-01')] MSG This will never be purged
|
||||
|
||||
REM Wed UNTIL 1993-12-31 MSG THis will be purged after 1993
|
||||
REM Wed UNTIL 1993-12-31 MSG This will be purged after 1993
|
||||
REM Wed UNTIL [nonconst('1993-12-31')] MSG Never purged
|
||||
.fi
|
||||
.PP
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
.TH TKREMIND 1 "@RELEASE_DATE@" "User Commands" "VERSION @VERSION@"
|
||||
.UC 4
|
||||
.TH TKREMIND 1 "@RELEASE_DATE@" "Remind" "VERSION @VERSION@"
|
||||
.SH NAME
|
||||
tkremind \- graphical front-end to Remind calendar program
|
||||
.SH SYNOPSIS
|
||||
@@ -54,29 +53,47 @@ directory before starting \fBTkRemind\fR.
|
||||
When you start \fBTkRemind\fR, it displays a calendar for the current
|
||||
month, with today's date highlighted. Reminders are filled into each
|
||||
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
|
||||
is no specific indication of an over-full box; you'll just have to
|
||||
notice that the box appears completely full.
|
||||
it up and down by dragging mouse button 2 in the box or by using the
|
||||
scroll wheel (if your mouse has one.) Note that there is no specific
|
||||
indication of an over-full box; you'll just have to notice that the
|
||||
box appears completely full.
|
||||
|
||||
.SH NAVIGATING
|
||||
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
|
||||
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
|
||||
Home key. To go to a specific month, click \fBGo To Date...\fR. This
|
||||
pops up a dialog box which allows you to select a month and enter a
|
||||
year. Once you've done this, click \fBGo\fR to go to the date, or
|
||||
\fBCancel\fR to cancel.
|
||||
\fBHome\fR key. To go to a specific month, click \fBGo To Date...\fR
|
||||
or press \fBg\fR. This pops up a dialog box which allows you to
|
||||
select a month and enter a year. Once you've done this, click
|
||||
\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
|
||||
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 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
|
||||
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
|
||||
@@ -110,7 +127,7 @@ The seventh control specifies what \fBRemind\fR should do if a reminder
|
||||
falls on a holiday or weekend.
|
||||
|
||||
Enter the body of the reminder into the \fBSummary:\fR text entry. If
|
||||
you want, you can enter a location, a URL, and and longer description
|
||||
you want, you can enter a location, a URL, and a longer description
|
||||
in the \fBLocation:\fR, \fBURL:\fR and \fBDescription:\fR boxes. If
|
||||
you enter anything here, they will be added as \fBINFO\fR items to the
|
||||
reminder.
|
||||
@@ -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
|
||||
\fBRemind\fR. You can also use it simply to play around and discover
|
||||
\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
|
||||
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
|
||||
current date and time indicator at the bottom of the window to see today's
|
||||
reminders in Agenda Mode.
|
||||
current date and time indicator at the bottom of the calendar window
|
||||
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
|
||||
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
|
||||
To print the current month's calendar, click \fBPrint...\fR on the
|
||||
main calendar window. This brings up the print dialog. Printing
|
||||
either produces a PostScript file or sends PostScript to a UNIX command.
|
||||
(If you have \fBrem2pdf\fR installed, you can choose to produce
|
||||
PDF output rather than PostScript.)
|
||||
main calendar window or press \fBp\fR or \fBControl-p\fR. This brings
|
||||
up the print dialog. Printing either produces a PostScript or PDF
|
||||
file, or sends PostScript or PDF to a UNIX command.
|
||||
|
||||
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
|
||||
\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
|
||||
\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
|
||||
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
|
||||
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
|
||||
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
|
||||
|
||||
@@ -181,13 +218,11 @@ reminder entirely by selecting \fBDelete reminder\fR. The remaining
|
||||
buttons, \fBPreview reminder\fR and \fBCancel\fR operate identically
|
||||
to the dialog in "ADDING REMINDERS."
|
||||
|
||||
Note that if you edit a reminder (using \fBPreview reminder\fR),
|
||||
any edits you made are \fInot\fR retained in the dialog box. You
|
||||
should not attempt to edit such reminders; you have to retype them
|
||||
in the \fBPreview reminder\fR dialog.
|
||||
|
||||
If the reminder was not created with \fBTkRemind\fR, you can't edit
|
||||
it with \fBTkRemind\fR.
|
||||
Note that if you have hand-edited a reminder (using \fBPreview
|
||||
reminder\fR), or if the reminder was hand-created in the first place,
|
||||
then clicking on it will \fInot\fR pop up the TkRemind
|
||||
reminder-editing dialog. Instead, TkRemind will start up a text
|
||||
editor (if you have configured one) so you can hand-edit the reminder.
|
||||
|
||||
.SH USING A TEXT EDITOR
|
||||
|
||||
@@ -230,7 +265,8 @@ option of "turning off" the reminder for the rest of the day.
|
||||
.SH OPTIONS
|
||||
|
||||
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
|
||||
.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
|
||||
\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
|
||||
|
||||
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
|
||||
https://dianne.skoll.ca/projects/remind/
|
||||
.SH SEE ALSO
|
||||
\fBremind\fR, \fBrem2ps\fR, \fBrem2pdf\fR, \fBrem2html\fR
|
||||
\fBremind\fR, \fBrem2pdf\fR, \fBrem2html\fR
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ use ExtUtils::MakeMaker;
|
||||
sub manifypods {
|
||||
my ($self,%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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,9 +48,10 @@ my $settings = {
|
||||
entry_font => 'Sans',
|
||||
small_cal_font => 'Sans',
|
||||
|
||||
title_url => '',
|
||||
title_size => 14,
|
||||
header_size => 12,
|
||||
daynum_size => 14,
|
||||
daynum_size => -1,
|
||||
entry_size => 8,
|
||||
|
||||
border_size => 4,
|
||||
@@ -65,6 +66,12 @@ my $settings = {
|
||||
eps => 0,
|
||||
verbose => 0,
|
||||
|
||||
line_color => '000000',
|
||||
title_color => '000000',
|
||||
header_color => '000000',
|
||||
daynum_color => '000000',
|
||||
smallcal_color => '000000',
|
||||
bg_color => '',
|
||||
weeks_per_page => 1,
|
||||
};
|
||||
|
||||
@@ -110,6 +117,13 @@ Options:
|
||||
--margin-bottom=S Specify bottom margin size in 1/72nds of an inch
|
||||
--margin-left=S Specify left margin size in 1/72nds of an inch
|
||||
--margin-right=S Specify right margin size in 1/72nds of an inch
|
||||
--line-color=RRGGBB Set line color
|
||||
--title-color=RRGGBB Set title color
|
||||
--header-color=RRGGBB Set header color
|
||||
--daynum-color=RRGGBB Set day number color
|
||||
--smallcal-color=RRGGBB Set small calendar color
|
||||
--bg-color=RRGGBB Set background color
|
||||
--title-url=URL Link calendar title to URL
|
||||
--verbose, -v Print progress messages
|
||||
--help Display this help
|
||||
EOF
|
||||
@@ -130,6 +144,7 @@ my $ret = GetOptions('landscape|l' => \$settings->{landscape},
|
||||
'wrap|y' => \$settings->{wrap_calendar},
|
||||
'height|h=i' => \$settings->{height},
|
||||
'title-font=s' => \$settings->{title_font},
|
||||
'title-url=s' => \$settings->{title_url},
|
||||
'header-font=s' => \$settings->{header_font},
|
||||
'daynum-font=s' => \$settings->{daynum_font},
|
||||
'entry-font=s' => \$settings->{entry_font},
|
||||
@@ -145,6 +160,12 @@ my $ret = GetOptions('landscape|l' => \$settings->{landscape},
|
||||
'margin-left=f' => \$settings->{margin_left},
|
||||
'margin-right=f' => \$settings->{margin_right},
|
||||
'verbose|v' => \$settings->{verbose},
|
||||
'line-color=s' => \$settings->{line_color},
|
||||
'bg-color=s' => \$settings->{bg_color},
|
||||
'title-color=s' => \$settings->{title_color},
|
||||
'header-color=s' => \$settings->{header_color},
|
||||
'daynum-color=s' => \$settings->{daynum_color},
|
||||
'smallcal-color=s' => \$settings->{smallcal_color},
|
||||
'help' => \$help
|
||||
);
|
||||
if (!$ret) {
|
||||
@@ -157,6 +178,28 @@ if ($help) {
|
||||
exit(0);
|
||||
}
|
||||
|
||||
my $bad = 0;
|
||||
foreach my $setting (qw(bg_color line_color title_color header_color daynum_color smallcal_color)) {
|
||||
my $c = $settings->{$setting};
|
||||
if ($setting eq 'bg_color' && $c eq '') {
|
||||
$settings->{bg_color} = [-1, -1, -1];
|
||||
next;
|
||||
}
|
||||
my $color = Remind::PDF->get_rgb($c);
|
||||
if (!defined($color)) {
|
||||
my $s = $setting;
|
||||
$s =~ s/_/-/g;
|
||||
print STDERR "Invalid color value `$c' for option --$s\n";
|
||||
$bad = 1;
|
||||
} else {
|
||||
$settings->{$setting} = $color;
|
||||
}
|
||||
}
|
||||
|
||||
if ($bad) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if ($settings->{weeks_per_page} < 1) {
|
||||
$settings->{weeks_per_page} = 1;}
|
||||
elsif ($settings->{weeks_per_page} > 4) {
|
||||
@@ -208,7 +251,8 @@ if ($settings->{eps}) {
|
||||
# Don't read from a terminal
|
||||
if (-t STDIN) { ## no critic
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -441,7 +485,7 @@ The default media size will be marked with an asterisk.
|
||||
=item --width=I<n>, -wI<n>, --height=I<m>, -hI<m>
|
||||
|
||||
Rather than specifying a named media size, directly specify the width
|
||||
and height of the output in 1/72ths of an inch. You must specify both
|
||||
and height of the output in 1/72ndths of an inch. You must specify both
|
||||
width and height for the options to be respected.
|
||||
|
||||
=item --title-font=I<font>
|
||||
@@ -471,28 +515,30 @@ calendars. The default is Sans.
|
||||
|
||||
=item --title-size=I<n>
|
||||
|
||||
Specify the size of the title font in 1/72ths of an inch. The default
|
||||
Specify the size of the title font in 1/72ndths of an inch. The default
|
||||
is 14. This size, and indeed all following sizes, may be specified as
|
||||
floating-point numbers.
|
||||
|
||||
=item --header-size=I<n>
|
||||
|
||||
Specify the size of the header font in 1/72ths of an inch. The default is 14.
|
||||
Specify the size of the header font in 1/72ndths of an inch. The default is 14.
|
||||
|
||||
=item --daynum-size=I<n>
|
||||
|
||||
Specify the size of the day number font in 1/72ths of an inch. The
|
||||
default is 14.
|
||||
Specify the size of the day number font in 1/72ndths of an inch. The
|
||||
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>
|
||||
|
||||
Specify the size of the calendar entry font in 1/72ths of an inch.
|
||||
Specify the size of the calendar entry font in 1/72ndths of an inch.
|
||||
The default is 8.
|
||||
|
||||
=item --border-size=I<n>
|
||||
|
||||
Specify the size of the blank border between the contents of a calendar
|
||||
box and the centre of the lines surrounding it, in 1/72ths of an inch.
|
||||
box and the centre of the lines surrounding it, in 1/72ndths of an inch.
|
||||
The default is 4.
|
||||
|
||||
=item --line-thickness=I<n>
|
||||
@@ -501,24 +547,61 @@ Specify the thickness of the lines drawn on the calendar. The default is 1.
|
||||
|
||||
=item --margin-top=I<n>
|
||||
|
||||
The size of the margin at the top of the page in 1/72ths of an inch.
|
||||
The size of the margin at the top of the page in 1/72ndths of an inch.
|
||||
The default is 36.
|
||||
|
||||
=item --margin-bottom=I<n>
|
||||
|
||||
The size of the margin at the bottom of the page in 1/72ths of an inch.
|
||||
The size of the margin at the bottom of the page in 1/72ndths of an inch.
|
||||
The default is 36.
|
||||
|
||||
=item --margin-left=I<n>
|
||||
|
||||
The size of the margin at the left of the page in 1/72ths of an inch.
|
||||
The size of the margin at the left of the page in 1/72ndths of an inch.
|
||||
The default is 36.
|
||||
|
||||
=item --margin-right=I<n>
|
||||
|
||||
The size of the margin at the right of the page in 1/72ths of an inch.
|
||||
The size of the margin at the right of the page in 1/72ndths of an inch.
|
||||
The default is 36.
|
||||
|
||||
=item --line-color=RGB
|
||||
|
||||
The color of the calendar grid lines. For this option and all
|
||||
following color options, the color may be specified as either 3 or 6
|
||||
hex digits, specifying the R, G and B components respectively. For
|
||||
example, FFFFFF is white, FF0000 is a saturated red, and so on. If
|
||||
you supply 3 hex digits, then they are effectively doubled, so that
|
||||
(for example) 5AF is expanded to 55AAFF.
|
||||
|
||||
=item --title-color=RGB
|
||||
|
||||
The color of the calendar title at the top of the page.
|
||||
|
||||
=item --header-color=RGB
|
||||
|
||||
The color of the weekday names in the header row.
|
||||
|
||||
=item --daynum-color=RGB
|
||||
|
||||
The color of the day numbers (and the moon phases, if any.)
|
||||
|
||||
=item --smallcal-color=RGB
|
||||
|
||||
The color of the small monthly calendars, if any.
|
||||
|
||||
=item --bg-color=RGB
|
||||
|
||||
The color of the page background.
|
||||
|
||||
Note that all colors default to black (000) except for the
|
||||
page background, which defaults to no color at all (ie, transparent).
|
||||
|
||||
=item --title-url=URL
|
||||
|
||||
Make the calendar title a link to URL. Note that no syntax checking is
|
||||
done on the URL; it's up to you to make sure it is valid.
|
||||
|
||||
=item --wrap, -y
|
||||
|
||||
Modify the calendar so that if it would normally require 6 rows to print,
|
||||
@@ -541,7 +624,7 @@ is rendered.
|
||||
|
||||
=head1 USAGE
|
||||
|
||||
To use B<rem2df>, pipe the output of B<remind> with one of the
|
||||
To use B<rem2pdf>, pipe the output of B<remind> with one of the
|
||||
B<-p>, B<-pp> or B<-ppp> options into B<rem2pdf>. The PDF output
|
||||
will be sent to standard output. So for example, to print a 12-month
|
||||
calendar for the year 2030, use:
|
||||
@@ -602,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
|
||||
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
|
||||
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
|
||||
doesn't overlap other text; B<rem2pdf> takes no special precautions to
|
||||
@@ -611,7 +697,7 @@ prevent this.
|
||||
As an example, this places Sunrise and Sunset times at the bottom left
|
||||
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
|
||||
4800 works out to about 4.6 points.)
|
||||
|
||||
@@ -468,6 +468,9 @@ sub render
|
||||
{
|
||||
my ($self, $cr, $settings, $index, $total) = @_;
|
||||
|
||||
if ($settings->{daynum_size} < 0) {
|
||||
$settings->{daynum_size} = 14;
|
||||
}
|
||||
if ($settings->{svg} || $settings->{eps}) {
|
||||
if ($index > 1) {
|
||||
if ($index == 2) {
|
||||
@@ -476,6 +479,14 @@ sub render
|
||||
return;
|
||||
}
|
||||
}
|
||||
my ($r, $g, $b) = @{$settings->{bg_color}};
|
||||
if ($r >= 0 && $g >= 0 && $b >= 0) {
|
||||
$cr->save;
|
||||
$self->set_cr_color($cr, $settings->{bg_color});
|
||||
$cr->rectangle(0, 0, $settings->{width}, $settings->{height});
|
||||
$cr->fill();
|
||||
$cr->restore;
|
||||
}
|
||||
$self->setup_daymap($settings);
|
||||
$self->{horiz_lines} = [];
|
||||
$cr->set_line_cap('square');
|
||||
@@ -521,6 +532,10 @@ sub render
|
||||
print STDERR "WARNING: overfull calendar box\n";
|
||||
}
|
||||
# The vertical lines
|
||||
|
||||
# Set the color
|
||||
$cr->save;
|
||||
$self->set_cr_color($cr, $settings->{line_color});
|
||||
my $cell = ($settings->{width} - $settings->{margin_left} - $settings->{margin_right}) / 7;
|
||||
for (my $i=0; $i<=7; $i++) {
|
||||
$cr->move_to($settings->{margin_left} + $i * $cell, $top_line);
|
||||
@@ -535,6 +550,7 @@ sub render
|
||||
$cr->stroke();
|
||||
}
|
||||
|
||||
$cr->restore;
|
||||
if ($settings->{verbose}) {
|
||||
print STDERR "rem2pdf: Rendered " . $self->{monthname} . ' ' . $self->{year} . "\n";
|
||||
}
|
||||
@@ -542,6 +558,18 @@ sub render
|
||||
$cr->show_page();
|
||||
}
|
||||
|
||||
sub set_cr_color {
|
||||
my ($self, $cr, $color_array) = @_;
|
||||
my ($r, $g, $b) = @$color_array;
|
||||
if ($r < 0 || $g < 0 || $b < 0 ||
|
||||
$r > 255 || $g > 255 || $b > 255) {
|
||||
return;
|
||||
}
|
||||
$cr->set_source_rgb($r / 255,
|
||||
$g / 255,
|
||||
$b / 255);
|
||||
}
|
||||
|
||||
=head2 draw_row($cr, $settings, $so_far, $row, $start_day, $start_col)
|
||||
|
||||
Draw a single row in the calendar. C<$cr> is a Cairo drawing context
|
||||
@@ -603,7 +631,7 @@ sub col_box_coordinates
|
||||
$settings->{margin_left} + $cell * $col,
|
||||
$so_far,
|
||||
$settings->{margin_left} + $cell * ($col + 1),
|
||||
$so_far + $height + $settings->{border_size},
|
||||
$so_far + $height + 2* $settings->{border_size},
|
||||
);
|
||||
}
|
||||
|
||||
@@ -655,6 +683,7 @@ sub draw_day
|
||||
# Don't actually draw if we're just previewing to get the cell height
|
||||
if ($height) {
|
||||
$cr->save;
|
||||
$self->set_cr_color($cr, $settings->{daynum_color});
|
||||
if ($settings->{numbers_on_left}) {
|
||||
$cr->move_to($x1 + $settings->{border_size}, $so_far + $settings->{border_size});
|
||||
} else {
|
||||
@@ -664,7 +693,7 @@ sub draw_day
|
||||
$cr->restore();
|
||||
}
|
||||
|
||||
$so_far += $h + 2 * $settings->{border_size};
|
||||
$so_far += $h + $settings->{border_size};
|
||||
my $entry_height = 0;
|
||||
my $done = 0;
|
||||
foreach my $entry (@{$self->{entries}->[$day]}) {
|
||||
@@ -740,6 +769,7 @@ sub draw_daynames
|
||||
|
||||
my ($wid, $h) = $layout->get_pixel_size();
|
||||
$cr->save;
|
||||
$self->set_cr_color($cr, $settings->{header_color});
|
||||
$cr->move_to($settings->{margin_left} + $i * $cell + $cell/2 - $wid/2, $so_far);
|
||||
Pango::Cairo::show_layout($cr, $layout);
|
||||
$cr->restore();
|
||||
@@ -765,6 +795,8 @@ sub draw_title
|
||||
my ($self, $cr, $settings) = @_;
|
||||
my $title = $self->{monthname} . ' ' . $self->{year};
|
||||
|
||||
my $url = $settings->{title_url} // '';
|
||||
|
||||
# set_page_label not available in older versions of Cairo
|
||||
eval { $cr->get_target()->set_page_label($title); };
|
||||
my $layout = Pango::Cairo::create_layout($cr);
|
||||
@@ -775,12 +807,44 @@ sub draw_title
|
||||
|
||||
my ($w, $h) = $layout->get_pixel_size();
|
||||
$cr->save();
|
||||
$self->set_cr_color($cr, $settings->{title_color});
|
||||
$cr->move_to($settings->{width}/2 - $w/2, $settings->{margin_top});
|
||||
if ($url ne '') {
|
||||
$cr->tag_begin(Cairo::TAG_LINK, "uri='$url'");
|
||||
}
|
||||
Pango::Cairo::show_layout($cr, $layout);
|
||||
if ($url ne '') {
|
||||
$cr->tag_end(Cairo::TAG_LINK);
|
||||
}
|
||||
$cr->restore();
|
||||
return $h + $settings->{margin_top} + $settings->{border_size};
|
||||
}
|
||||
|
||||
=head2 get_rgb($color)
|
||||
|
||||
Parses a 3- or 6-hex-digit color value and returns [red, green, blue]. If
|
||||
color could not be parsed, returns undef
|
||||
|
||||
=cut
|
||||
sub get_rgb
|
||||
{
|
||||
my ($self, $color) = @_;
|
||||
my ($r, $g, $b);
|
||||
if ($color =~ /^([0-9a-f])([0-9a-f])([0-9a-f])$/i) {
|
||||
$r = hex($1);
|
||||
$g = hex($2);
|
||||
$b = hex($3);
|
||||
$r = $r * 16 + $r;
|
||||
$g = $g * 16 + $g;
|
||||
$b = $b * 16 + $b;
|
||||
return [$r, $g, $b];
|
||||
} elsif ($color =~ /^([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i) {
|
||||
return [hex($1), hex($2), hex($3)];
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
|
||||
=head2 draw_small_calendar($cr, $x, $y, $width, $height, $settings, $month, $days, $start_wkday)
|
||||
|
||||
Draw a small calendar on the Cairo context C<$cr>. The top left-hand
|
||||
@@ -828,6 +892,7 @@ sub draw_small_calendar
|
||||
$layout->set_text(Encode::decode('UTF-8', $month));
|
||||
my ($mw, $mh) = $layout->get_pixel_size();
|
||||
$cr->save();
|
||||
$self->set_cr_color($cr, $settings->{smallcal_color});
|
||||
$cr->move_to($x + $width/2 - $mw/2, $y);
|
||||
Pango::Cairo::show_layout($cr, $layout);
|
||||
$cr->restore();
|
||||
@@ -849,6 +914,7 @@ sub draw_small_calendar
|
||||
$layout->set_font_description($desc);
|
||||
$layout->set_text($l);
|
||||
$cr->save();
|
||||
$self->set_cr_color($cr, $settings->{smallcal_color});
|
||||
$cr->move_to($x + $col*$wid, $y);
|
||||
Pango::Cairo::show_layout($cr, $layout);
|
||||
$cr->restore();
|
||||
@@ -866,6 +932,7 @@ sub draw_small_calendar
|
||||
}
|
||||
$layout->set_text($dt);
|
||||
$cr->save();
|
||||
$self->set_cr_color($cr, $settings->{smallcal_color});
|
||||
$cr->move_to($x + $col*$wid, $y);
|
||||
Pango::Cairo::show_layout($cr, $layout);
|
||||
$cr->restore();
|
||||
@@ -1047,6 +1114,9 @@ Remind::PDF::Weekly - render a weekly calendar
|
||||
sub render
|
||||
{
|
||||
my ($self, $cr, $settings, $index, $total) = @_;
|
||||
if ($settings->{daynum_size} < 0) {
|
||||
$settings->{daynum_size} = 10;
|
||||
}
|
||||
if ($settings->{svg} || $settings->{eps}) {
|
||||
if ($index > $settings->{weeks_per_page}) {
|
||||
if ($index == $settings->{weeks_per_page}+1) {
|
||||
@@ -1055,8 +1125,18 @@ sub render
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ((($index-1) % $settings->{weeks_per_page}) == 0) {
|
||||
my ($r, $g, $b) = @{$settings->{bg_color}};
|
||||
if ($r >= 0 && $g >= 0 && $b >= 0) {
|
||||
$cr->save;
|
||||
$self->set_cr_color($cr, $settings->{bg_color});
|
||||
$cr->rectangle(0, 0, $settings->{width}, $settings->{height});
|
||||
$cr->fill();
|
||||
$cr->restore;
|
||||
}
|
||||
}
|
||||
|
||||
$settings->{numbers_on_left} = 1;
|
||||
$settings->{numbers_on_left} = 0;
|
||||
# Set up bounding box
|
||||
if ($settings->{weeks_per_page} == 1) {
|
||||
$self->{bounding_box} = [
|
||||
@@ -1065,22 +1145,16 @@ sub render
|
||||
$settings->{width} - $settings->{margin_right},
|
||||
$settings->{height} - $settings->{margin_bottom}]
|
||||
} else {
|
||||
my $gap = $settings->{margin_top} * 0.5;
|
||||
my $total_height = $settings->{height} - $settings->{margin_top} - $settings->{margin_bottom};
|
||||
my $week_height = $total_height / $settings->{weeks_per_page};
|
||||
my $top_offset = (($index-1) % $settings->{weeks_per_page}) * $week_height;
|
||||
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) + (($index-1) % $settings->{weeks_per_page}) * $gap;
|
||||
my $bot_offset = $top_offset + $week_height;
|
||||
$self->{bounding_box} =
|
||||
$self->{bounding_box} = [
|
||||
$settings->{margin_left},
|
||||
$settings->{margin_top} + $top_offset,
|
||||
$settings->{width} - $settings->{margin_right},
|
||||
$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);
|
||||
for (my $i=0; $i<7; $i++) {
|
||||
@@ -1117,6 +1191,7 @@ sub draw_headings
|
||||
|
||||
my ($wid, $h) = $layout->get_pixel_size();
|
||||
$cr->save;
|
||||
$self->set_cr_color($cr, $settings->{header_color});
|
||||
$cr->move_to($settings->{margin_left} + $i * $cell + $cell/2 - $wid/2, $self->{bounding_box}[1]);
|
||||
Pango::Cairo::show_layout($cr, $layout);
|
||||
$cr->restore();
|
||||
@@ -1132,6 +1207,7 @@ sub draw_headings
|
||||
|
||||
my ($wid2, $h2) = $layout->get_pixel_size();
|
||||
$cr->save;
|
||||
$self->set_cr_color($cr, $settings->{header_color});
|
||||
$cr->move_to($settings->{margin_left} + $i * $cell + $cell/2 - $wid2/2, $self->{bounding_box}[1] + $h);
|
||||
Pango::Cairo::show_layout($cr, $layout);
|
||||
$cr->restore();
|
||||
@@ -1186,7 +1262,13 @@ sub draw_entries
|
||||
$layout->set_font_description($desc);
|
||||
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 $done = 0;
|
||||
@@ -1232,6 +1314,8 @@ sub draw_lines
|
||||
{
|
||||
my ($self, $cr, $settings) = @_;
|
||||
|
||||
$cr->save;
|
||||
$self->set_cr_color($cr, $settings->{line_color});
|
||||
# Top horizonal line
|
||||
$cr->move_to($self->{bounding_box}[0], $self->{bounding_box}[1]);
|
||||
$cr->line_to($self->{bounding_box}[2], $self->{bounding_box}[1]);
|
||||
@@ -1255,6 +1339,7 @@ sub draw_lines
|
||||
$cr->line_to($x, $self->{bounding_box}[3]);
|
||||
$cr->stroke();
|
||||
}
|
||||
$cr->restore;
|
||||
}
|
||||
|
||||
sub create_from_hash
|
||||
|
||||
@@ -151,7 +151,8 @@ sub render
|
||||
my ($wid, $h) = $layout->get_pixel_size();
|
||||
|
||||
$cr->save();
|
||||
$cr->move_to($x2 - $settings->{border_size}/4 - $wid, $y2 - $settings->{border_size}/4 - $h);
|
||||
Remind::PDF->set_cr_color($cr, $settings->{daynum_color});
|
||||
$cr->move_to($x2 - $settings->{border_size}/2 - $wid, $y2 - $h);
|
||||
my $url;
|
||||
if ($self->{info} && $self->{info}->{url}) {
|
||||
$url = $self->{info}->{url};
|
||||
@@ -234,12 +235,13 @@ sub render
|
||||
if ($url) {
|
||||
$cr->tag_begin(Cairo::TAG_LINK, "uri='$url'");
|
||||
}
|
||||
$self->draw_moon($xc, $yc, $cr);
|
||||
$self->draw_moon($xc, $yc, $cr, $settings);
|
||||
if ($url) {
|
||||
$cr->tag_end(Cairo::TAG_LINK);
|
||||
}
|
||||
if ($layout) {
|
||||
$cr->save();
|
||||
Remind::PDF->set_cr_color($cr, $settings->{daynum_color});
|
||||
$cr->move_to ($xc + ($self->{size}/2) + $settings->{border_size},
|
||||
$yc + ($self->{size}/2) - $self->{fontsize} );
|
||||
if ($url) {
|
||||
@@ -255,8 +257,9 @@ sub render
|
||||
|
||||
sub draw_moon
|
||||
{
|
||||
my ($self, $xc, $yc, $cr) = @_;
|
||||
my ($self, $xc, $yc, $cr, $settings) = @_;
|
||||
$cr->save();
|
||||
Remind::PDF->set_cr_color($cr, $settings->{daynum_color});
|
||||
$cr->new_path();
|
||||
$cr->arc($xc, $yc, $self->{size}/2, 0, 2*3.1415926535);
|
||||
if ($self->{phase} == 0) {
|
||||
@@ -351,7 +354,7 @@ sub render
|
||||
$x = $x1 + $self->{atx};
|
||||
}
|
||||
if ($self->{aty} < 0) {
|
||||
$y = $y2 + $self->{aty} - $h;
|
||||
$y = $y2 + $self->{aty} - $h + $settings->{border_size};
|
||||
} else {
|
||||
$y = $y1 + $self->{aty};
|
||||
}
|
||||
|
||||
@@ -6,10 +6,11 @@ Icon=tkremind
|
||||
Terminal=false
|
||||
Name=tkremind
|
||||
Comment=TkRemind Calendar Program
|
||||
Comment[nl]=TkRemind Kalender Programma
|
||||
Categories=Office;Calendar;
|
||||
Keywords=Calendar;remind;
|
||||
Keywords[ca]=Calendari;remind;
|
||||
Keywords[de]=Kalender;remind;
|
||||
Keywords[en_GB]=Calendar;remind;
|
||||
Keywords[es]=Calendario;remind;
|
||||
|
||||
Keywords[nl]=Kalender;remind;
|
||||
|
||||
1181
scripts/tkremind.in
1181
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"
|
||||
};
|
||||
|
||||
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] */ = {
|
||||
{
|
||||
/*** DIM COLORS ***/
|
||||
@@ -301,6 +304,7 @@ static void WriteTopCalLine (void);
|
||||
static void WriteBottomCalLine (void);
|
||||
static void WriteIntermediateCalLine (void);
|
||||
static void WriteCalDays (void);
|
||||
static char const *get_url(TrigInfo *infos);
|
||||
|
||||
static int
|
||||
DayOf(int dse)
|
||||
@@ -1557,6 +1561,8 @@ static int WriteOneColLine(int col)
|
||||
int clamp = 1;
|
||||
int numwritten = 0;
|
||||
int d = ColToDay[col];
|
||||
char const *url = get_url(e->infos);
|
||||
|
||||
if (d && UseBGVTColors && bgcolor[d][0] != -1) {
|
||||
clamp = 0;
|
||||
}
|
||||
@@ -1605,6 +1611,10 @@ static int WriteOneColLine(int col)
|
||||
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 (!wspace) {
|
||||
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 */
|
||||
if (UseVTColors && e->is_color) {
|
||||
printf("%s", Decolorize());
|
||||
@@ -1870,7 +1883,9 @@ static void GenerateCalEntries(int col)
|
||||
|
||||
default:
|
||||
if (!SuppressImplicitRemWarnings) {
|
||||
Wprint("Unrecognized command; interpreting as REM");
|
||||
if (warning_level("05.00.03")) {
|
||||
Wprint(tr("Unrecognized command; interpreting as REM"));
|
||||
}
|
||||
WarnedAboutImplicit = 1;
|
||||
}
|
||||
CreateParser(CurLine, &p);
|
||||
@@ -2078,7 +2093,7 @@ static int DoCalRem(ParsePtr p, int col)
|
||||
}
|
||||
|
||||
/* Adjust trigger date/time to time zone */
|
||||
dse = AdjustTriggerForTimeZone(&trig, dse, &tim);
|
||||
dse = AdjustTriggerForTimeZone(&trig, dse, &tim, 1);
|
||||
|
||||
/* Add to global OMITs if so indicated */
|
||||
if (trig.addomit) {
|
||||
@@ -2109,7 +2124,7 @@ static int DoCalRem(ParsePtr p, int col)
|
||||
}
|
||||
|
||||
/* Save nonconst_expr flag */
|
||||
nonconst_expr = p->nonconst_expr;
|
||||
nonconst_expr = trig.nonconst_expr;
|
||||
/* Convert PS and PSF to PASSTHRU */
|
||||
if (trig.typ == PS_TYPE) {
|
||||
strcpy(trig.passthru, "PostScript");
|
||||
@@ -2460,6 +2475,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
|
||||
WriteJSONInfoChain(TrigInfo *ti)
|
||||
{
|
||||
|
||||
@@ -66,6 +66,9 @@
|
||||
/* Define to 1 if you have the <sys/inotify.h> header file. */
|
||||
#undef HAVE_SYS_INOTIFY_H
|
||||
|
||||
/* Define to 1 if you have the <sys/termios.h> header file. */
|
||||
#undef HAVE_SYS_TERMIOS_H
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#undef HAVE_SYS_STAT_H
|
||||
|
||||
|
||||
@@ -101,7 +101,7 @@ InsertDedupeEntry(int trigger_date, int trigger_time, char const *body)
|
||||
}
|
||||
e->trigger_date = trigger_date;
|
||||
e->trigger_time = trigger_time;
|
||||
e->body = strdup(body);
|
||||
e->body = StrDup(body);
|
||||
if (!e->body) {
|
||||
free(e);
|
||||
return;
|
||||
|
||||
39
src/dorem.c
39
src/dorem.c
@@ -35,7 +35,7 @@ static int ComputeTrigDuration(TimeTrig const *t);
|
||||
|
||||
static int CalledEnterTimezone = 0;
|
||||
|
||||
int AdjustTriggerForTimeZone(Trigger *trig, int dse, TimeTrig *tim)
|
||||
int AdjustTriggerForTimeZone(Trigger *trig, int dse, TimeTrig *tim, int debug_ok)
|
||||
{
|
||||
int y, m, d, hour, minute;
|
||||
int r;
|
||||
@@ -59,7 +59,7 @@ int AdjustTriggerForTimeZone(Trigger *trig, int dse, TimeTrig *tim)
|
||||
/* Adjust eventstart also */
|
||||
trig->eventstart = dse * MINUTES_PER_DAY + tim->ttime;
|
||||
SaveAllTriggerInfo(trig, tim, dse, tim->ttime, 1);
|
||||
if (DebugFlag & DB_PRTTRIG) {
|
||||
if (debug_ok && (DebugFlag & DB_PRTTRIG)) {
|
||||
fprintf(ErrFp, "%s(%s): Trig(tz_adj %s) = %s, %d %s, %d AT %02d:%02d",
|
||||
GetCurrentFilename(), line_range(LineNoStart, LineNo), trig->tz,
|
||||
get_day_name(dse % 7), tm.tm_mday, get_month_name(tm.tm_mon),
|
||||
@@ -143,6 +143,7 @@ void EnterTimezone(char const *tz)
|
||||
CurYear = tm.tm_year + 1900;
|
||||
|
||||
DSEToday = DSE(CurYear, CurMon, CurDay);
|
||||
|
||||
/* Adjust DSEToday back by a day if midnight in our time zone requires it */
|
||||
if (SysTime < LocalSysTime) {
|
||||
DSEToday--;
|
||||
@@ -533,7 +534,7 @@ int DoRem(ParsePtr p)
|
||||
}
|
||||
|
||||
/* Adjust trigger date/time to time zone */
|
||||
dse = AdjustTriggerForTimeZone(&trig, dse, &tim);
|
||||
dse = AdjustTriggerForTimeZone(&trig, dse, &tim, 1);
|
||||
|
||||
/* Add to global OMITs if so indicated */
|
||||
if (trig.addomit) {
|
||||
@@ -545,8 +546,8 @@ int DoRem(ParsePtr p)
|
||||
}
|
||||
if (PurgeMode) {
|
||||
if (trig.expired || (!trig.is_todo && dse < DSEToday)) {
|
||||
if (p->expr_happened) {
|
||||
if (p->nonconst_expr) {
|
||||
if (trig.expr_happened) {
|
||||
if (trig.nonconst_expr) {
|
||||
if (!Hush) {
|
||||
PurgeEchoLine("%s\n", "#!P: Next line may have expired, but contains non-constant expression");
|
||||
PurgeEchoLine("%s\n", "#!P: or a relative SCANFROM clause");
|
||||
@@ -631,7 +632,7 @@ int DoRem(ParsePtr p)
|
||||
PrintJSONKeyPairInt("time_in_tz", tim.ttime_orig);
|
||||
}
|
||||
}
|
||||
if (p->nonconst_expr) {
|
||||
if (trig.nonconst_expr) {
|
||||
PrintJSONKeyPairInt("nonconst_expr", 1);
|
||||
}
|
||||
if (if_depth) {
|
||||
@@ -832,6 +833,8 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
|
||||
trig->adj_for_last = 0;
|
||||
trig->infos = NULL;
|
||||
trig->tz = NULL;
|
||||
trig->nonconst_expr = 0;
|
||||
trig->expr_happened = 0;
|
||||
|
||||
int parsing = 1;
|
||||
while(parsing) {
|
||||
@@ -1096,6 +1099,7 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
|
||||
s->expr_happened = 1;
|
||||
nonconst_debug(s->nonconst_expr, tr("OMITFUNC counts as a non-constant expression"));
|
||||
s->nonconst_expr = 1;
|
||||
trig->nonconst_expr = 1;
|
||||
DBufFree(&buf);
|
||||
break;
|
||||
|
||||
@@ -1200,6 +1204,12 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
|
||||
}
|
||||
}
|
||||
|
||||
if (s->nonconst_expr) {
|
||||
trig->nonconst_expr = 1;
|
||||
}
|
||||
if (s->expr_happened) {
|
||||
trig->expr_happened = 1;
|
||||
}
|
||||
if (trig->need_wkday && trig->wd == NO_WD) {
|
||||
Eprint("Weekday name(s) required");
|
||||
return E_PARSE_ERR;
|
||||
@@ -1236,7 +1246,7 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
|
||||
}
|
||||
}
|
||||
|
||||
if (!s->nonconst_expr) {
|
||||
if (!trig->nonconst_expr) {
|
||||
if (trig->y != NO_YR && trig->m != NO_MON && trig->d != NO_DAY && trig->until != NO_UNTIL) {
|
||||
if (DSE(trig->y, trig->m, trig->d) > trig->until) {
|
||||
Wprint(tr("Warning: UNTIL/THROUGH date earlier than start date"));
|
||||
@@ -1264,6 +1274,20 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
|
||||
check_trigger_function(trig->warn, "WARN");
|
||||
check_trigger_function(trig->omitfunc, "OMITFUNC");
|
||||
}
|
||||
|
||||
/* Check that TZ looks plausible */
|
||||
if (trig->tz && (*trig->tz != '!')) {
|
||||
warn_if_timezone_bad(trig->tz);
|
||||
}
|
||||
|
||||
/* Remove leading ! from TZ spec */
|
||||
if (trig->tz && *trig->tz == '!') {
|
||||
char *stz = (char *) trig->tz;
|
||||
while (*stz) {
|
||||
*stz = *(stz+1);
|
||||
stz++;
|
||||
}
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -1482,6 +1506,7 @@ static int ParseScanFrom(ParsePtr s, Trigger *t, int type)
|
||||
s->expr_happened = 1;
|
||||
nonconst_debug(s->nonconst_expr, tr("Relative SCANFROM counts as a non-constant expression"));
|
||||
s->nonconst_expr = 1;
|
||||
t->nonconst_expr = 1;
|
||||
return OK;
|
||||
|
||||
default:
|
||||
|
||||
@@ -137,6 +137,9 @@
|
||||
#define E_NO_MB 113
|
||||
#define E_BAD_MB_SEQ 114
|
||||
#define E_EXPR_NODES_EXCEEDED 115
|
||||
#define E_EXPECTING_EOXPR 116
|
||||
#define E_EXPECTING_ATOM 117
|
||||
|
||||
#ifdef MK_GLOBALS
|
||||
#undef EXTERN
|
||||
#define EXTERN
|
||||
@@ -270,6 +273,8 @@ EXTERN char *ErrMsg[]
|
||||
/* E_NO_MB */ "C library does not support multibyte characters",
|
||||
/* E_BAD_MB_SEQ */ "Invalid multibyte sequence",
|
||||
/* 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 */
|
||||
;
|
||||
|
||||
36
src/expr.c
36
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)*/
|
||||
#define MAX_PARSE_LEVEL 2000
|
||||
|
||||
/* Legal punctuation characters in an expression */
|
||||
#define LEGAL_CHARS "+-*/%&|=<>!)"
|
||||
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)
|
||||
|
||||
@@ -2228,9 +2230,15 @@ static int set_constant_value(expr_node *atom)
|
||||
atom->u.value.v.val = val;
|
||||
return OK;
|
||||
}
|
||||
|
||||
atom->u.value.type = ERR_TYPE;
|
||||
Eprint("`%s': %s", DBufValue(&ExprBuf), GetErr(E_ILLEGAL_CHAR));
|
||||
return E_ILLEGAL_CHAR;
|
||||
if (strchr(LEGAL_CHARS, *s) != NULL) {
|
||||
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 != '\'') {
|
||||
Eprint("%s `%c'", GetErr(E_ILLEGAL_CHAR), *s);
|
||||
if (strchr(LEGAL_CHARS, *s) != NULL) {
|
||||
*r = E_EXPECTING_ATOM;
|
||||
Eprint("%s", GetErr(*r));
|
||||
} else {
|
||||
*r = E_ILLEGAL_CHAR;
|
||||
Eprint("%s `%c'", GetErr(*r), *s);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -2759,9 +2772,24 @@ expr_node *parse_expression(char const **e, int *r, Var *locals)
|
||||
print_expr_tree(node, ErrFp);
|
||||
fprintf(ErrFp, "\n");
|
||||
}
|
||||
orig = o2;
|
||||
}
|
||||
while (**e && isempty(**e)) {
|
||||
(*e)++;
|
||||
}
|
||||
if (**e && (**e != ']')) {
|
||||
if (DebugFlag & DB_PARSE_EXPR) {
|
||||
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 (*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_PARSE_ERR ||
|
||||
*r == E_EOLN ||
|
||||
*r == E_EXPECTING_EOXPR ||
|
||||
*r == E_BAD_NUMBER ||
|
||||
*r == E_BAD_DATE ||
|
||||
*r == E_BAD_TIME ||
|
||||
*r == E_EXPECTING_ATOM ||
|
||||
*r == E_ILLEGAL_CHAR) {
|
||||
end_of_expr = find_end_of_expr(orig);
|
||||
while (**e && isempty(**e)) {
|
||||
|
||||
@@ -159,7 +159,7 @@ void SetCurrentFilename(char const *fname)
|
||||
fprintf(ErrFp, "Out of Memory!\n");
|
||||
exit(1);
|
||||
}
|
||||
e->fname = strdup(fname);
|
||||
e->fname = StrDup(fname);
|
||||
if (!e->fname) {
|
||||
fprintf(ErrFp, "Out of Memory!\n");
|
||||
exit(1);
|
||||
@@ -225,8 +225,9 @@ static void OpenPurgeFile(char const *fname, char const *mode)
|
||||
if (!PurgeFP) {
|
||||
fprintf(ErrFp, tr("Cannot open `%s' for writing: %s"), DBufValue(&fname_buf), strerror(errno));
|
||||
fprintf(ErrFp, "\n");
|
||||
}
|
||||
} else {
|
||||
set_cloexec(fileno(PurgeFP));
|
||||
}
|
||||
DBufFree(&fname_buf);
|
||||
}
|
||||
|
||||
|
||||
39
src/funcs.c
39
src/funcs.c
@@ -13,6 +13,11 @@
|
||||
#include "version.h"
|
||||
#include "config.h"
|
||||
|
||||
/* Required on OpenIndiana / Solaris */
|
||||
#ifdef __sun
|
||||
#define __EXTENSIONS__
|
||||
#endif
|
||||
|
||||
#ifdef REM_USE_WCHAR
|
||||
#define _XOPEN_SOURCE 600
|
||||
#include <wctype.h>
|
||||
@@ -28,6 +33,12 @@
|
||||
#include <strings.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_TERMIOS_H
|
||||
#ifdef __sun
|
||||
#include <sys/termios.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <math.h>
|
||||
#include <sys/ioctl.h>
|
||||
@@ -1506,6 +1517,7 @@ static int FIsconst(expr_node *node, Value *locals, Value *ans, int *nonconst)
|
||||
PUT(PrintValue(ans, NULL));
|
||||
OUT();
|
||||
}
|
||||
DestroyValue(junk);
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -2767,6 +2779,7 @@ static int FIif(expr_node *node, Value *locals, Value *ans, int *nonconst)
|
||||
}
|
||||
|
||||
if (truthy(&v)) {
|
||||
DestroyValue(v);
|
||||
r = evaluate_expr_node(cur->sibling, locals, ans, nonconst);
|
||||
if (r == OK && DBGX) {
|
||||
PUT(", ");
|
||||
@@ -2782,6 +2795,8 @@ static int FIif(expr_node *node, Value *locals, Value *ans, int *nonconst)
|
||||
}
|
||||
DBG(DBufFree(&DebugBuf));
|
||||
return r;
|
||||
} else {
|
||||
DestroyValue(v);
|
||||
}
|
||||
DBG(PUT(", ?"));
|
||||
cur = cur->sibling->sibling;
|
||||
@@ -4320,6 +4335,7 @@ static int FTzconvert(func_info *info)
|
||||
{
|
||||
int year, month, day, hour, minute, r;
|
||||
int dse, tim;
|
||||
char const *src_tz, *tgt_tz;
|
||||
struct tm tm;
|
||||
|
||||
if (ARG(0).type != DATETIME_TYPE ||
|
||||
@@ -4333,11 +4349,26 @@ static int FTzconvert(func_info *info)
|
||||
minute = r % 60;
|
||||
|
||||
if (Nargs == 2) {
|
||||
src_tz = ARGSTR(1);
|
||||
warn_if_timezone_bad(src_tz);
|
||||
if (*src_tz == '!') {
|
||||
src_tz++;
|
||||
}
|
||||
r = tz_convert(year, month, day, hour, minute,
|
||||
ARGSTR(1), NULL, &tm);
|
||||
src_tz, NULL, &tm);
|
||||
} else {
|
||||
src_tz = ARGSTR(1);
|
||||
warn_if_timezone_bad(src_tz);
|
||||
if (*src_tz == '!') {
|
||||
src_tz++;
|
||||
}
|
||||
tgt_tz = ARGSTR(2);
|
||||
warn_if_timezone_bad(tgt_tz);
|
||||
if (*tgt_tz == '!') {
|
||||
tgt_tz++;
|
||||
}
|
||||
r = tz_convert(year, month, day, hour, minute,
|
||||
ARGSTR(1), ARGSTR(2), &tm);
|
||||
src_tz, tgt_tz, &tm);
|
||||
}
|
||||
|
||||
if (r == -1) return E_CANT_CONVERT_TZ;
|
||||
@@ -4605,7 +4636,7 @@ FEvalTrig(func_info *info)
|
||||
RetVal.type = DATE_TYPE;
|
||||
RETVAL = dse;
|
||||
} else {
|
||||
dse = AdjustTriggerForTimeZone(&trig, dse, &tim);
|
||||
dse = AdjustTriggerForTimeZone(&trig, dse, &tim, 1);
|
||||
RetVal.type = DATETIME_TYPE;
|
||||
RETVAL = (MINUTES_PER_DAY * dse) + tim.ttime;
|
||||
}
|
||||
@@ -4720,7 +4751,7 @@ FTrig(func_info *info)
|
||||
FreeTrig(&trig);
|
||||
continue;
|
||||
}
|
||||
dse = AdjustTriggerForTimeZone(&trig, dse, &tim);
|
||||
dse = AdjustTriggerForTimeZone(&trig, dse, &tim, 1);
|
||||
if (ShouldTriggerReminder(&trig, &tim, dse, &r)) {
|
||||
LastTrig = dse;
|
||||
RETVAL = dse;
|
||||
|
||||
@@ -106,6 +106,7 @@ EXTERN INIT( int DefaultPrio, NO_PRIORITY);
|
||||
EXTERN INIT( int SysTime, -1);
|
||||
EXTERN INIT( int LocalSysTime, -1);
|
||||
EXTERN INIT( int ParseUntriggered, 0);
|
||||
EXTERN INIT( int LinksInTerminal, 0);
|
||||
|
||||
EXTERN char const *InitialFile;
|
||||
EXTERN char const *LocalTimeZone;
|
||||
|
||||
12
src/init.c
12
src/init.c
@@ -35,6 +35,13 @@
|
||||
#include <grp.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_TERMIOS_H
|
||||
#ifdef __sun
|
||||
#include <sys/termios.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#include "types.h"
|
||||
#include "globals.h"
|
||||
#include "protos.h"
|
||||
@@ -512,6 +519,11 @@ void InitRemind(int argc, char const *argv[])
|
||||
arg++;
|
||||
continue;
|
||||
}
|
||||
if (*arg == 'z' || *arg == 'Z') {
|
||||
LinksInTerminal = 1;
|
||||
arg++;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (weeks) {
|
||||
|
||||
@@ -1307,7 +1307,7 @@ int DoIfTrig(ParsePtr p)
|
||||
push_if(0, 0);
|
||||
} else {
|
||||
if (dse >= 0) {
|
||||
dse = AdjustTriggerForTimeZone(&trig, dse, &tim);
|
||||
dse = AdjustTriggerForTimeZone(&trig, dse, &tim, 1);
|
||||
}
|
||||
if (ShouldTriggerReminder(&trig, &tim, dse, &err)) {
|
||||
push_if(1, 0);
|
||||
|
||||
@@ -300,7 +300,9 @@ int system_to_stderr(char const *cmd);
|
||||
int system1(char const *cmd);
|
||||
int tz_set_tz (char const *tz);
|
||||
int tz_convert(int year, int month, int day, int hour, int minute, char const *src_tz, char const *tgt_tz, struct tm *tm);
|
||||
int AdjustTriggerForTimeZone(Trigger *trig, int dse, TimeTrig *tim);
|
||||
int AdjustTriggerForTimeZone(Trigger *trig, int dse, TimeTrig *tim, int debug_ok);
|
||||
void EnterTimezone(char const *tz);
|
||||
void ExitTimezone(char const *tz);
|
||||
int warning_level(char const *which);
|
||||
void warn_if_timezone_bad(char const *tz);
|
||||
|
||||
|
||||
@@ -621,11 +621,15 @@ int ComputeTriggerNoAdjustDuration(int today, Trigger *trig, TimeTrig const *tim
|
||||
if (trig->tz) {
|
||||
TimeTrig copy = *tim;
|
||||
int new_result;
|
||||
int force_retry = 0;
|
||||
ExitTimezone(trig->tz);
|
||||
new_result = AdjustTriggerForTimeZone(trig, result, ©);
|
||||
new_result = AdjustTriggerForTimeZone(trig, result, ©, 0);
|
||||
if (trig->scanfrom == NO_SCANFROM && new_result < DSEToday) {
|
||||
force_retry = 1;
|
||||
}
|
||||
EnterTimezone(trig->tz);
|
||||
if (result + duration_days >= today &&
|
||||
new_result + duration_days < today) {
|
||||
if (force_retry ||
|
||||
(result + duration_days >= today &&new_result + duration_days < today)) {
|
||||
/* If we are not making progress, then give up: It's expired */
|
||||
if (nextstart <= save_nextstart) {
|
||||
trig->expired = 1;
|
||||
|
||||
@@ -143,10 +143,13 @@ typedef struct {
|
||||
int eventstart; /* Original event start (datetime) */
|
||||
int eventstart_orig; /* Original event start in TZ (datetime) */
|
||||
int eventduration; /* Original event duration (minutes) */
|
||||
int maybe_uncomputable; /* Suppress "can't compute trigger" warnings */
|
||||
int addomit; /* Add trigger date to global OMITs */
|
||||
int noqueue; /* Don't queue even if timed */
|
||||
int max_overdue; /* Stop warning if TODO is too far overdue */
|
||||
unsigned char addomit; /* Add trigger date to global OMITs */
|
||||
unsigned char maybe_uncomputable; /* Suppress "can't compute trigger" warnings */
|
||||
unsigned char nonconst_expr; /* Non-constant expression encountered */
|
||||
unsigned char expr_happened;
|
||||
|
||||
char sched[VAR_NAME_LEN+1]; /* Scheduling function */
|
||||
char warn[VAR_NAME_LEN+1]; /* Warning function */
|
||||
char omitfunc[VAR_NAME_LEN+1]; /* OMITFUNC function */
|
||||
|
||||
55
src/utils.c
55
src/utils.c
@@ -28,10 +28,31 @@ static char const DontEscapeMe[] =
|
||||
#include <ctype.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "types.h"
|
||||
#include "globals.h"
|
||||
#include "protos.h"
|
||||
|
||||
static int HaveZoneinfoDir = -1;
|
||||
|
||||
#define ZONE_DIR "/usr/share/zoneinfo"
|
||||
static int have_zoneinfo_dir(void)
|
||||
{
|
||||
struct stat sb;
|
||||
if (HaveZoneinfoDir < 0) {
|
||||
if (stat(ZONE_DIR, &sb) < 0) {
|
||||
HaveZoneinfoDir = 0;
|
||||
} else if ((sb.st_mode & S_IFMT) != S_IFDIR) {
|
||||
HaveZoneinfoDir = 0;
|
||||
} else {
|
||||
HaveZoneinfoDir = 1;
|
||||
}
|
||||
}
|
||||
return HaveZoneinfoDir;
|
||||
}
|
||||
|
||||
/* Call this instead of system() so if called ignores return code,
|
||||
we don't get a compiler warning. Also redirect stdin to /dev/null */
|
||||
int system1(char const *cmd)
|
||||
@@ -378,3 +399,37 @@ warning_level(char const *which)
|
||||
if (!WarningLevel) return 1;
|
||||
return strcmp(WarningLevel, which) >= 0;
|
||||
}
|
||||
|
||||
void
|
||||
warn_if_timezone_bad(char const *tz)
|
||||
{
|
||||
DynamicBuffer zfile;
|
||||
struct stat sb;
|
||||
int r;
|
||||
|
||||
if (!tz) {
|
||||
return;
|
||||
}
|
||||
if (!*tz) {
|
||||
return;
|
||||
}
|
||||
if (*tz == '!') {
|
||||
return;
|
||||
}
|
||||
if (!have_zoneinfo_dir()) {
|
||||
return;
|
||||
}
|
||||
DBufInit(&zfile);
|
||||
DBufPuts(&zfile, ZONE_DIR);
|
||||
DBufPuts(&zfile, "/");
|
||||
DBufPuts(&zfile, tz);
|
||||
r = stat(DBufValue(&zfile), &sb);
|
||||
DBufFree(&zfile);
|
||||
if (r < 0) {
|
||||
if (warning_level("06.01.05")) {
|
||||
Wprint(tr("No time zone file found for TZ `%s'... is it valid?"),
|
||||
tz);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
979
tests/manpage-personal-dict
Normal file
979
tests/manpage-personal-dict
Normal file
@@ -0,0 +1,979 @@
|
||||
00PM
|
||||
00am
|
||||
00pm
|
||||
00test
|
||||
0SNgvsDvx7M
|
||||
0m
|
||||
0x
|
||||
0x1F
|
||||
0xFE12
|
||||
0xfe00
|
||||
10x14
|
||||
12string7
|
||||
13ths
|
||||
15am
|
||||
1GB
|
||||
1p
|
||||
1pm
|
||||
20am
|
||||
20pm
|
||||
22AM
|
||||
2GB
|
||||
2PM
|
||||
2s
|
||||
30PM
|
||||
34am
|
||||
3pm
|
||||
3string34
|
||||
45am
|
||||
45pm
|
||||
55AAFF
|
||||
591test
|
||||
59pm
|
||||
5AF
|
||||
5EDT
|
||||
5v
|
||||
72ndths
|
||||
A3
|
||||
A4
|
||||
A5
|
||||
ADDOMIT
|
||||
AddBlankLines
|
||||
Afoo
|
||||
Aimale
|
||||
Alberani
|
||||
AmigaDOS
|
||||
ApR
|
||||
Aq
|
||||
Args
|
||||
B'Av
|
||||
B4
|
||||
B5
|
||||
BLOCKDEV
|
||||
Badros
|
||||
Bazzanini
|
||||
Bech
|
||||
Benedetto
|
||||
Bevrijdingsdag
|
||||
Bj
|
||||
Björn
|
||||
Bloois
|
||||
BoldOblique
|
||||
Borland
|
||||
BoxHeight
|
||||
BoxWidth
|
||||
Budler
|
||||
Buitléir
|
||||
Bœsch
|
||||
C99
|
||||
CDE's
|
||||
CFLAGS
|
||||
CHARDEV
|
||||
CIx
|
||||
CIy
|
||||
CLOEXEC
|
||||
COLOUR
|
||||
CONTEXTs
|
||||
CPAN
|
||||
CPP's
|
||||
CalMode
|
||||
CalType
|
||||
CalcMinsFromUTC
|
||||
CalcUTC
|
||||
Clément
|
||||
Config
|
||||
Conover
|
||||
Cottel
|
||||
Couto
|
||||
Ctrl
|
||||
D'oh
|
||||
DATETIME
|
||||
DATETIMEs
|
||||
DATEs
|
||||
DBufPutc
|
||||
DOH
|
||||
DOSes
|
||||
DOTREMINDERS
|
||||
DSE
|
||||
DUMPVARS
|
||||
DURATIONs
|
||||
Daia
|
||||
DateSep
|
||||
DateTimeSep
|
||||
Davide
|
||||
Daví
|
||||
Davíðsson
|
||||
DaySize
|
||||
DedupeReminders
|
||||
DefaultColor
|
||||
DefaultDelta
|
||||
DefaultPrio
|
||||
DefaultTDelta
|
||||
Deiconify
|
||||
DeltaOffset
|
||||
DeltaOverride
|
||||
Dershowitz
|
||||
DestroyValue
|
||||
Doggett
|
||||
Doh
|
||||
DontFork
|
||||
DontQueue
|
||||
DontTrigAts
|
||||
Dosubst
|
||||
Dov
|
||||
Duperval
|
||||
EF
|
||||
ENDIF
|
||||
EOF
|
||||
ERRMSG
|
||||
ESC
|
||||
EXPR
|
||||
Eee
|
||||
Eerste
|
||||
Eloi
|
||||
Emanuele
|
||||
EndSent
|
||||
EndSentIg
|
||||
EntrySize
|
||||
Esc
|
||||
Example2
|
||||
Expr
|
||||
ExpressionTimeLimit
|
||||
FF0000
|
||||
FFF
|
||||
FFFFFF
|
||||
FIFOs
|
||||
FRENAME
|
||||
FSET
|
||||
FSETting
|
||||
FUNCS
|
||||
FUNSET
|
||||
Feldstern
|
||||
FindToken
|
||||
FirstIndent
|
||||
Flagson
|
||||
Fname
|
||||
FoldYear
|
||||
FormWidth
|
||||
FreeBSD
|
||||
Fromnow
|
||||
GPL
|
||||
Gedalia
|
||||
Getopt
|
||||
GhostView
|
||||
Gurman
|
||||
HANKERSON
|
||||
HEBCAL
|
||||
HH
|
||||
HTMLCLASS
|
||||
Ha'atzmaut
|
||||
HaShoah
|
||||
Hankerson
|
||||
HashPJW
|
||||
HashVal
|
||||
Hashana
|
||||
Hazikaron
|
||||
HeadSize
|
||||
Helvetica
|
||||
HideCompletedTodos
|
||||
Hoeltig
|
||||
Hohl
|
||||
Hplu
|
||||
Hurray
|
||||
HushMode
|
||||
IFTRIG
|
||||
IFs
|
||||
IIF
|
||||
INCLUDECMD
|
||||
INCLUDEd
|
||||
INCLUDed
|
||||
INTs
|
||||
IRIX
|
||||
ISOLATIN1
|
||||
Iconified
|
||||
IgnoreOnce
|
||||
Img
|
||||
InBoxHeight
|
||||
InfDelta
|
||||
IntMax
|
||||
IntMin
|
||||
Ip
|
||||
JAHRZEITS
|
||||
JSON
|
||||
JSONMode
|
||||
JSONQUEUE
|
||||
JeiEl
|
||||
Jens
|
||||
Jerzy
|
||||
Jin
|
||||
Jochen
|
||||
Joop
|
||||
Kamens
|
||||
Kasdorp
|
||||
Katan
|
||||
Kiefte
|
||||
Koningsdag
|
||||
Kristian
|
||||
LANGID
|
||||
LDFLAGS
|
||||
LGBTQ
|
||||
LLM
|
||||
LOGNAME
|
||||
LRM
|
||||
Laatste
|
||||
Labour
|
||||
Lastday
|
||||
Lastworkday
|
||||
LatDeg
|
||||
LatMin
|
||||
LatSec
|
||||
LineWidth
|
||||
Liviu
|
||||
LocalToUTC
|
||||
LongDec
|
||||
LongDeg
|
||||
LongMin
|
||||
LongSec
|
||||
Lynnerup
|
||||
M11
|
||||
M3
|
||||
MD5
|
||||
MMam
|
||||
MMpm
|
||||
MSC
|
||||
MSF
|
||||
MSGPREFIX
|
||||
MSGSUFFIX
|
||||
Madsen
|
||||
Makefile
|
||||
Makefiles
|
||||
Marczykowski
|
||||
Marek
|
||||
Marinus
|
||||
MaxFullOmits
|
||||
MaxLateMinutes
|
||||
MaxPartialOmits
|
||||
MaxSatIter
|
||||
MaxStringLen
|
||||
MaxX
|
||||
MaxY
|
||||
MaybeXS
|
||||
McGlothlen
|
||||
Meeus
|
||||
Mikko
|
||||
MinX
|
||||
MinY
|
||||
MinsFromUTC
|
||||
Mogens
|
||||
Moontime
|
||||
Mplu
|
||||
Msg
|
||||
Möller
|
||||
NOQUEUE
|
||||
Nachum
|
||||
Neuhauser
|
||||
NextMode
|
||||
Niels
|
||||
Nieuwe
|
||||
Noto
|
||||
Num
|
||||
NumFullOmits
|
||||
NumPartialOmits
|
||||
NumQueued
|
||||
NumTrig
|
||||
Nx
|
||||
OMF
|
||||
OMITFUNC
|
||||
OMITs
|
||||
OMITted
|
||||
OS2
|
||||
OSC
|
||||
OnceFile
|
||||
OpenIndiana
|
||||
Oskiewicz
|
||||
PANGO
|
||||
PNG
|
||||
POSIX
|
||||
PPP
|
||||
PSCal
|
||||
PSFILE
|
||||
PSFile
|
||||
PageBoundingBox
|
||||
PageDown
|
||||
PageUp
|
||||
Pango
|
||||
ParseUntriggered
|
||||
Paulo
|
||||
Pelzl
|
||||
PgDn
|
||||
PgUp
|
||||
Philipp
|
||||
Pinard
|
||||
Plaser
|
||||
PostScript
|
||||
PreCal
|
||||
PrefixLineNo
|
||||
Puskas
|
||||
QDOS
|
||||
README
|
||||
REM2PS
|
||||
RGB
|
||||
Rafa
|
||||
Rahman
|
||||
Randen
|
||||
Readline
|
||||
Reingold
|
||||
Reißig
|
||||
Rem2HTML
|
||||
Rem2PDF
|
||||
Rem2PS
|
||||
Remind's
|
||||
Rhys
|
||||
Rickel
|
||||
Rosh
|
||||
Ruderich
|
||||
RunOff
|
||||
SAS
|
||||
SATISFied
|
||||
SCANFROM
|
||||
SCANFROMs
|
||||
SCHED
|
||||
SEGV's
|
||||
SGI
|
||||
SIGCONT
|
||||
SIGINT
|
||||
SMSQ
|
||||
SMTP
|
||||
SORTBANNER
|
||||
SPDX
|
||||
SPECIALs
|
||||
SVG
|
||||
SYMLINK
|
||||
SYSINCLUDE
|
||||
SYSV
|
||||
Sadinoff
|
||||
Sanderson
|
||||
Schleusener
|
||||
Schmitt
|
||||
Schwarz
|
||||
Shapir
|
||||
Shvat
|
||||
Siegel
|
||||
Silvonen
|
||||
Silvonen's
|
||||
SimpleCal
|
||||
SimpleCalendar
|
||||
Sipe
|
||||
Skoll
|
||||
Slusallek
|
||||
Sobczyk
|
||||
Solaris
|
||||
SortByDate
|
||||
SortByPrio
|
||||
SortByTime
|
||||
Sparc
|
||||
Spc
|
||||
Speeded
|
||||
Sprickerhof
|
||||
Strassfeld
|
||||
SubsIndent
|
||||
Sunview
|
||||
SuppressImplicitWarnings
|
||||
SuppressLRM
|
||||
SysInclude
|
||||
TAGs
|
||||
TKREMIND
|
||||
TKTAG
|
||||
TODO
|
||||
TODOS
|
||||
TODOs
|
||||
TRIGVALID
|
||||
TTY
|
||||
TZ
|
||||
Ta'anit
|
||||
Tamkin
|
||||
Tamuz
|
||||
Tavis
|
||||
Tcl
|
||||
Td
|
||||
Terbeck
|
||||
TerminalBackground
|
||||
Thronicke
|
||||
TimeSep
|
||||
TimetIs64bit
|
||||
Tishrey
|
||||
TitleSize
|
||||
Tk
|
||||
TkRemind
|
||||
TodoFilter
|
||||
Torre
|
||||
Tru64
|
||||
Trygve
|
||||
Tt
|
||||
Tw
|
||||
Tzom
|
||||
UNCOMPUTABLE
|
||||
UNIXes
|
||||
USNO
|
||||
UTCToLocal
|
||||
UTF
|
||||
Ud
|
||||
UntimedFirst
|
||||
Use256Colors
|
||||
UseBGVTColors
|
||||
UseTrueColors
|
||||
UseVTColors
|
||||
Uw
|
||||
Uy
|
||||
VT00
|
||||
VT100
|
||||
Valerio
|
||||
Vens
|
||||
Volle
|
||||
WHATSNEW
|
||||
WarningLevel
|
||||
Wehr
|
||||
Werschulz
|
||||
Wextra
|
||||
Willem
|
||||
Willmann
|
||||
XTerm
|
||||
XY
|
||||
YECH
|
||||
YYYY
|
||||
Yaffe
|
||||
Yellin
|
||||
Yom
|
||||
Ziemer
|
||||
Zoltan
|
||||
acknowledgement
|
||||
adawn
|
||||
adusk
|
||||
afOo
|
||||
aflag
|
||||
america
|
||||
amiga
|
||||
ampm
|
||||
ansi
|
||||
ansicolor
|
||||
ansitext
|
||||
ap
|
||||
aq
|
||||
aq1993
|
||||
arg
|
||||
arg1
|
||||
arg2
|
||||
argN
|
||||
args
|
||||
argv
|
||||
asc
|
||||
astro
|
||||
atime
|
||||
autoconf
|
||||
autoreconf
|
||||
b1
|
||||
backend
|
||||
backends
|
||||
backslashed
|
||||
backurl
|
||||
barbarbafoo
|
||||
baseyr
|
||||
behaviour
|
||||
bg
|
||||
c12
|
||||
c3
|
||||
cairo
|
||||
calprefix
|
||||
calsuffix
|
||||
caltype
|
||||
catcherr
|
||||
ccl
|
||||
centimetres
|
||||
centre
|
||||
cgi
|
||||
charset
|
||||
chinese
|
||||
clc
|
||||
cm2rem
|
||||
cm2trem
|
||||
cmd
|
||||
cmd1
|
||||
cmd2
|
||||
cn
|
||||
codepoint
|
||||
config
|
||||
const
|
||||
cppcheck
|
||||
cron
|
||||
csh
|
||||
css
|
||||
da
|
||||
date1
|
||||
date2
|
||||
datepart
|
||||
datetime
|
||||
datetimes
|
||||
day1
|
||||
day2
|
||||
daymap
|
||||
dayname
|
||||
daynames
|
||||
daynum
|
||||
daysinmon
|
||||
daysinmonnth
|
||||
daysinnextmonth
|
||||
daysinprevmonth
|
||||
daystart
|
||||
defs
|
||||
dev
|
||||
devel
|
||||
dfs
|
||||
dh
|
||||
dialogs
|
||||
difftime
|
||||
doesn
|
||||
dosubst
|
||||
doublequote
|
||||
dq
|
||||
dqi
|
||||
dqis
|
||||
ds
|
||||
dstzone
|
||||
dt
|
||||
dur
|
||||
dx
|
||||
easterdate
|
||||
edur
|
||||
eergisteren
|
||||
eg
|
||||
emacs
|
||||
emxomf
|
||||
encodings
|
||||
endian
|
||||
endif
|
||||
envvar
|
||||
eps
|
||||
estart
|
||||
eval
|
||||
evaltrig
|
||||
eventduration
|
||||
eventstart
|
||||
execed
|
||||
executables
|
||||
expr
|
||||
favour
|
||||
fcntl
|
||||
fd
|
||||
feb
|
||||
ffat
|
||||
fg
|
||||
fgrep
|
||||
filedate
|
||||
filedatetime
|
||||
filedir
|
||||
fileinfo
|
||||
findfont
|
||||
finnish
|
||||
firstquarter
|
||||
firstwkday
|
||||
fixups
|
||||
flagsoff
|
||||
flagson
|
||||
fname
|
||||
fontsize
|
||||
forwurl
|
||||
fri
|
||||
fset
|
||||
ftshe
|
||||
fullmoon
|
||||
func
|
||||
funcs
|
||||
gaa
|
||||
garbhol
|
||||
gcc
|
||||
getenv
|
||||
grey
|
||||
greyed
|
||||
gridline
|
||||
gridlines
|
||||
groff
|
||||
gvim
|
||||
hashref
|
||||
hasn
|
||||
hdate
|
||||
hebdate
|
||||
hebday
|
||||
hebmon
|
||||
hebyear
|
||||
hm
|
||||
hostname
|
||||
html
|
||||
htmlescape
|
||||
htmlstriptags
|
||||
hunspell
|
||||
i1
|
||||
i2
|
||||
iCal
|
||||
ical2rem
|
||||
iconified
|
||||
iconv
|
||||
idq
|
||||
ie
|
||||
ifdef
|
||||
ifelse
|
||||
ifoo
|
||||
iif
|
||||
imgbase
|
||||
initgroups
|
||||
inotify
|
||||
inotifywait
|
||||
isany
|
||||
isconst
|
||||
isdst
|
||||
isleap
|
||||
isomitted
|
||||
itkpdf
|
||||
itkprint
|
||||
itkremind
|
||||
ivar
|
||||
j2
|
||||
jahr
|
||||
jahrzeit
|
||||
jahrzeits
|
||||
jan
|
||||
jewish
|
||||
json
|
||||
kall
|
||||
kcmd1
|
||||
kcommand
|
||||
keym
|
||||
kwartier
|
||||
kxmessage
|
||||
lastquarter
|
||||
latin1
|
||||
leapyear
|
||||
leapyears
|
||||
len
|
||||
lgbtq
|
||||
libcairo
|
||||
libjson
|
||||
libpango
|
||||
libreadline
|
||||
lineno
|
||||
linux
|
||||
listbox
|
||||
localomit
|
||||
localtoutc
|
||||
lpr
|
||||
lrtb
|
||||
lt
|
||||
lto
|
||||
luni
|
||||
lz
|
||||
maan
|
||||
makefile
|
||||
maxlen
|
||||
maybexs
|
||||
mbchar
|
||||
mbindex
|
||||
mbstrlen
|
||||
mbsubstr
|
||||
md
|
||||
memcpy
|
||||
messageBox
|
||||
metacharacters
|
||||
minsfromutc
|
||||
mktime
|
||||
mmedia
|
||||
mojibake
|
||||
monday
|
||||
mondayfirst
|
||||
monnum
|
||||
month1
|
||||
month2
|
||||
monthname
|
||||
moondate
|
||||
moondatetime
|
||||
moonphase
|
||||
moonphases
|
||||
moonrisedir
|
||||
moonsetdir
|
||||
moonsize
|
||||
moontime
|
||||
moontool
|
||||
moveable
|
||||
moveto
|
||||
mr
|
||||
msg
|
||||
msgprefix
|
||||
msgsuffix
|
||||
mul
|
||||
multibyte
|
||||
multitrig
|
||||
mydate
|
||||
mydelta
|
||||
mydir
|
||||
myfunc1
|
||||
mylang
|
||||
myprolog
|
||||
myreminders
|
||||
myscript
|
||||
nF
|
||||
nHello
|
||||
nbar
|
||||
nd
|
||||
ndawn
|
||||
ndusk
|
||||
newdate
|
||||
newmoon
|
||||
nextmonthname
|
||||
nextmonthyear
|
||||
nl
|
||||
nnn
|
||||
nohup
|
||||
nonconst
|
||||
nonomitted
|
||||
noreminders
|
||||
nostripped
|
||||
nostyle
|
||||
notesize
|
||||
noto
|
||||
nqueued
|
||||
nroff
|
||||
num
|
||||
ok
|
||||
oktober
|
||||
ol
|
||||
oldstyle
|
||||
ons
|
||||
ordx
|
||||
orthodoxeaster
|
||||
os2
|
||||
ostype
|
||||
otherfunc
|
||||
overmorgen
|
||||
p12
|
||||
packlist
|
||||
padstr
|
||||
pango
|
||||
passthru
|
||||
patchlevel
|
||||
pathnames
|
||||
pdf
|
||||
perl
|
||||
perllocal
|
||||
pn
|
||||
png
|
||||
pngs
|
||||
popen
|
||||
pp12
|
||||
pp3
|
||||
ppp
|
||||
pre
|
||||
preprocessor
|
||||
prev
|
||||
prevmonthname
|
||||
prevmonthyear
|
||||
printf
|
||||
prio
|
||||
psmoon
|
||||
psshade
|
||||
qid
|
||||
queueing
|
||||
quux
|
||||
rF
|
||||
rawbody
|
||||
readline
|
||||
realcurrent
|
||||
realnow
|
||||
realtoday
|
||||
rem2html
|
||||
rem2pdf
|
||||
rem2pdf's
|
||||
rem2ps
|
||||
rem2ps2
|
||||
remind's
|
||||
rescan
|
||||
rgb
|
||||
rn
|
||||
ro
|
||||
romanian
|
||||
rwx
|
||||
sa
|
||||
saturday
|
||||
scalefont
|
||||
scanfrom
|
||||
sched
|
||||
se
|
||||
segfaulting
|
||||
setenv
|
||||
setfont
|
||||
setgray
|
||||
setpagedevice
|
||||
sfun
|
||||
sgn
|
||||
shalem
|
||||
shar
|
||||
shellescape
|
||||
shextvlfqnu
|
||||
shouldn
|
||||
smachot
|
||||
smallcal
|
||||
soleq
|
||||
somefile
|
||||
sortbanner
|
||||
spc
|
||||
spellintian
|
||||
src
|
||||
srczone
|
||||
sson
|
||||
stderr
|
||||
stdin
|
||||
stdout
|
||||
sthd
|
||||
str1
|
||||
str2
|
||||
strcasecmp
|
||||
strdup
|
||||
stringwidth
|
||||
strlen
|
||||
strncasecmp
|
||||
stylesheet
|
||||
subprocess
|
||||
subst
|
||||
substr
|
||||
sudo
|
||||
sundAy
|
||||
svg
|
||||
symlink
|
||||
sys
|
||||
sysnotify
|
||||
t1
|
||||
t2
|
||||
tThere
|
||||
tableonly
|
||||
tcl
|
||||
tcllib
|
||||
tdelta
|
||||
test1
|
||||
test2
|
||||
th
|
||||
thed
|
||||
thirdfunc
|
||||
thisyear
|
||||
thu
|
||||
timegm
|
||||
timelocal
|
||||
timepart
|
||||
tk
|
||||
tkpng
|
||||
tkremind
|
||||
tkreminders
|
||||
tkremindrc
|
||||
tm
|
||||
todo
|
||||
todos
|
||||
tokenizer
|
||||
toronto
|
||||
tq
|
||||
trep
|
||||
trepeat
|
||||
trig1
|
||||
trig2
|
||||
trigN
|
||||
trigback
|
||||
trigbase
|
||||
trigcompletethrough
|
||||
trigdate
|
||||
trigdatetime
|
||||
trigdelta
|
||||
trigduration
|
||||
trigeventduration
|
||||
trigeventstart
|
||||
trigeventstarttz
|
||||
trigfrom
|
||||
triggerable
|
||||
triginfo
|
||||
trigistodo
|
||||
trigmaxoverdue
|
||||
trigpriority
|
||||
trigrep
|
||||
trigscanfrom
|
||||
trigtags
|
||||
trigtime
|
||||
trigtimedelta
|
||||
trigtimerep
|
||||
trigtimetz
|
||||
trigtz
|
||||
triguntil
|
||||
trigvalid
|
||||
troff
|
||||
tshed
|
||||
tt
|
||||
ttime
|
||||
tty
|
||||
tue
|
||||
txt
|
||||
typeof
|
||||
tz
|
||||
tzconvert
|
||||
ubitux
|
||||
ui
|
||||
uid
|
||||
unbuffered
|
||||
undef
|
||||
undefine
|
||||
underlinefg
|
||||
uniq
|
||||
unsets
|
||||
untimed
|
||||
untriggerable
|
||||
untriggered
|
||||
uppper
|
||||
url
|
||||
userid
|
||||
utcflag
|
||||
utctolocal
|
||||
utf
|
||||
utf8
|
||||
utils
|
||||
uwhatever
|
||||
v5
|
||||
varname
|
||||
ve
|
||||
w0
|
||||
wakeups
|
||||
weekno
|
||||
wfun
|
||||
whoami
|
||||
wkday
|
||||
wkdaynum
|
||||
wkstart
|
||||
wn
|
||||
www
|
||||
x00
|
||||
x1
|
||||
x2
|
||||
xAB
|
||||
xdg
|
||||
xinitrc
|
||||
xless
|
||||
xmessage
|
||||
xsiz
|
||||
xsiz1
|
||||
y1
|
||||
y2
|
||||
year1
|
||||
year2
|
||||
yeardiff
|
||||
yrstart
|
||||
ysiz
|
||||
ysiz1
|
||||
yy
|
||||
yyyy
|
||||
z0
|
||||
zapf
|
||||
ziens
|
||||
zj
|
||||
zn
|
||||
één
|
||||
@@ -27,12 +27,27 @@ if test `id -u` = 0 ; then
|
||||
exit 1
|
||||
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"
|
||||
CMP="../tests/test.cmp"
|
||||
# Set a known timezone so moon phases show up in predictable places
|
||||
TZ=Universal
|
||||
TZ=UTC
|
||||
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
|
||||
echo TEST | grep -a TEST > /dev/null 2>&1
|
||||
if test $? = 0 ; then
|
||||
GREP_A="-a"
|
||||
else
|
||||
GREP_A=""
|
||||
fi
|
||||
|
||||
# Colorize output iff stdout is a tty
|
||||
stty <&1 > /dev/null 2>&1
|
||||
@@ -78,7 +93,7 @@ TEST_GETENV="foo bar baz" ; export TEST_GETENV
|
||||
echo "Test 1" > $OUT
|
||||
echo "" >> $OUT
|
||||
echo "Running main tests"
|
||||
$REMIND -e -dxte ../tests/test.rem 16 feb 1991 12:13 2>&1 | grep -v -a 'TimetIs64bit' >> $OUT 2>&1
|
||||
$REMIND -e -dxte ../tests/test.rem 16 feb 1991 12:13 2>&1 | grep -v $GREP_A 'TimetIs64bit' >> $OUT 2>&1
|
||||
echo "" >> $OUT
|
||||
echo "Test 2" >> $OUT
|
||||
echo "" >> $OUT
|
||||
@@ -181,8 +196,8 @@ rm -f ../tests/purge_dir/*.rem.purged >> $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 -pp ../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 | "$REM2PS" -e -l -c3 >> $OUT 2>&1
|
||||
|
||||
TZ=America/Toronto $REMIND ../tests/sunmoon.rem 1 Jan 2011 >> $OUT 2>&1
|
||||
|
||||
@@ -499,8 +514,8 @@ $REMIND --version >> $OUT 2>&1
|
||||
# Test queueing. Because eventstart depends on the actual system
|
||||
# date, we use the --test flag to fake the date and time.
|
||||
# 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 QUEUE | ../src/remind --flush --test -zj ../tests/queue1.rem >> $OUT 2>&1
|
||||
echo JSONQUEUE | "$REMIND_CMD" --flush --test -z0 ../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
|
||||
$REMIND -dte - 28 Feb 2024 <<'EOF' >> $OUT 2>&1
|
||||
@@ -638,7 +653,7 @@ $REMIND -c ../tests/dedupe.rem 1 November 2023 >> $OUT 2>&1
|
||||
$REMIND -q ../tests/dedupe.rem 8 November 2023 >> $OUT 2>&1
|
||||
|
||||
# Remove references to SysInclude, which is build-specific
|
||||
grep -F -v -a '$SysInclude' < $OUT > $OUT.1 && mv -f $OUT.1 $OUT
|
||||
grep -F -v $GREP_A '$SysInclude' < $OUT > $OUT.1 && mv -f $OUT.1 $OUT
|
||||
|
||||
# If "man" accepts the --warnings flag, test all the man pages.
|
||||
RUNMAN=0
|
||||
@@ -654,6 +669,49 @@ for i in ../man/*.1 ; do
|
||||
fi
|
||||
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
|
||||
cat <<'EOF' >> $OUT
|
||||
|
||||
If spellintian is installed, its output (if any) follows...
|
||||
|
||||
EOF
|
||||
|
||||
spellintian /dev/null < /dev/null > /dev/null 2>&1
|
||||
if test $? = 0 ; then
|
||||
echo "Linting man pages"
|
||||
# we grep out some false-positives from rem2ps
|
||||
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
|
||||
|
||||
# If we have "hunspell", run it against man pages
|
||||
cat <<'EOF' >> $OUT
|
||||
|
||||
If hunspell is installed, its output (if any) follows...
|
||||
|
||||
EOF
|
||||
|
||||
HUNSPELL="hunspell -d en_US -l -p manpage-personal-dict"
|
||||
|
||||
$HUNSPELL /dev/null < /dev/null > /dev/null 2>&1
|
||||
if test $? = 0; then
|
||||
echo "Spell-checking man pages, WHATSNEW and README.md"
|
||||
cat ../man/*.1 $PERLMANS | $HUNSPELL -n >> $OUT 2>&1
|
||||
cat ../docs/WHATSNEW | $HUNSPELL >> $OUT 2>&1
|
||||
cat ../README.md | $HUNSPELL >> $OUT 2>&1
|
||||
# If we have pod2man, check rem2pdf and rem2html man pages too
|
||||
pod2man < ../rem2html/rem2html.in > /dev/null 2>&1
|
||||
if test $? = 0 ; then
|
||||
pod2man < ../rem2html/rem2html.in | $HUNSPELL -n >> $OUT 2>&1
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "" >> $OUT
|
||||
# Test --print-tokens long option
|
||||
$REMIND --print-tokens < /dev/null >> $OUT 2>&1
|
||||
|
||||
@@ -807,7 +865,7 @@ $REMIND --json ../tests/json-redirect.rem 1 Jan 2025 > /dev/null 2>> $OUT
|
||||
|
||||
# Test %: substitution sequence in all the languages
|
||||
for i in ../include/lang/??.rem ; do
|
||||
$REMIND "-ii=\"$i\"" -p - 2025-08-13 <<'EOF' 2>&1 | grep -a 2025/ >> $OUT
|
||||
$REMIND "-ii=\"$i\"" -p - 2025-08-13 <<'EOF' 2>&1 | grep $GREP_A 2025/ >> $OUT
|
||||
DO [i]
|
||||
REM TODO 2025-08-13 MSG %(LANGID) Task1%:
|
||||
REM TODO 2025-08-13 COMPLETE-THROUGH 2025-08-12 MSG %(LANGID) Task2%:
|
||||
@@ -879,6 +937,28 @@ EOF
|
||||
# For this one, we need to force an error so we make sure the error is
|
||||
# reported in -stdin- and not cat|
|
||||
(echo 'INCLUDECMD cat'; sleep $DELAY; echo 'set a 1/0') | $REMIND - 2025-10-01 >> $OUT 2>&1
|
||||
|
||||
$REMIND --json - 2025-10-01 <<'EOF' >> $OUT 2>&1
|
||||
# Nonconst-expr in trigger
|
||||
set a nonconst(1)
|
||||
REM 2025-10-01 MSG Nonconst NOT set [today()]
|
||||
REM 2025 Oct [a] MSG Nonconst IS set [today()]
|
||||
REM 2025 Oct [a] MSG Nonconst IS set
|
||||
EOF
|
||||
|
||||
$REMIND -j - 2025-12-31 <<'EOF' >> $OUT 2>&1
|
||||
# Nonconst-expr in trigger
|
||||
set $ParseUntriggered 1
|
||||
set a nonconst(1)
|
||||
REM 2025-10-01 MSG Nonconst NOT set [today()]
|
||||
REM 2025 Oct [a] MSG Nonconst IS set [today()]
|
||||
REM 2025 Oct [a] MSG Nonconst IS set
|
||||
REM 2025 Oct [1] MSG Expr but not nonconst [today()]
|
||||
REM 2025-10-01 MSG No expr seen [1+2]
|
||||
EOF
|
||||
|
||||
# Purge mode
|
||||
|
||||
cmp -s $OUT $CMP
|
||||
if [ "$?" = "0" ]; then
|
||||
echo "Remind: Acceptance tests ${GRN}PASSED${NRM}"
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
#!/bin/sh
|
||||
export LC_ALL=C.UTF-8
|
||||
export LANG=C.UTF-8
|
||||
|
||||
DIR=`dirname $0`
|
||||
cd $DIR
|
||||
if test $? != 0 ; then
|
||||
@@ -37,7 +40,7 @@ OUT=../tests/tz.out
|
||||
CMP=../tests/tz.cmp
|
||||
|
||||
echo "Running timezone tests"
|
||||
echo -n "" > $OUT 2>&1
|
||||
cp /dev/null $OUT
|
||||
|
||||
TZ=Europe/Amsterdam $REMIND - 2025-09-03@14:00 <<'EOF' >> $OUT 2>&1
|
||||
SET $AddBlankLines=0
|
||||
@@ -143,9 +146,9 @@ TZ=America/Los_Angeles $REMIND - 2026-01-01 <<'EOF' >> $OUT 2>&1
|
||||
BANNER %
|
||||
SET $AddBlankLines 0
|
||||
|
||||
REM AT 13:33 TZ America/Los_Angeles TZ Universal MSG Whatsup? %*l %3.
|
||||
REM AT 13:33 TZ America/Los_Angeles TZ UTC MSG Whatsup? %*l %3.
|
||||
REM AT 13:33 TZ "" TZ America/Los_Angeles MSG Whatsup? %*l %3.
|
||||
REM TZ Universal MSG Borked
|
||||
REM TZ UTC MSG Borked
|
||||
EOF
|
||||
|
||||
TZ=America/Toronto $REMIND -dx - 2025-09-01@01:00 <<'EOF' >> $OUT 2>&1
|
||||
@@ -190,6 +193,68 @@ TZ=America/Toronto $REMIND -s - 2025-10-01 <<'EOF' >> $OUT 2>&1
|
||||
REM Wednesday AT 14:00 TZ Australia/Sydney MSG 2PM Sydney
|
||||
EOF
|
||||
|
||||
echo "" >> $OUT
|
||||
# Every day and a SATISFY reminder
|
||||
TZ=America/Toronto $REMIND -s - 2025-10-01 <<'EOF' >> $OUT 2>&1
|
||||
REM AT 04:44 TZ America/Los_Angeles MSG 04:44 every day in L.A.
|
||||
REM 2 AT 05:00 TZ America/Los_Angeles MSG 05:00 on 2nd in L.A.
|
||||
REM Wed AT 06:00 TZ America/Los_Angeles MSG 06:00 on Wed in L.A.
|
||||
REM Wed AT 23:00 TZ America/Los_Angeles MSG 23:00 on Wed in L.A.
|
||||
REM AT 09:00 TZ America/Los_Angeles SATISFY [!($Td % 3)] MSG 09:00 every third day in L.A.
|
||||
REM AT 22:00 TZ America/Los_Angeles SATISFY [!($Td % 3)] MSG 22:00 every third day in L.A.
|
||||
EOF
|
||||
|
||||
echo "" >> $OUT
|
||||
# And the inverse
|
||||
TZ=America/Los_Angeles $REMIND -s - 2025-10-01 <<'EOF' >> $OUT 2>&1
|
||||
REM AT 04:44 TZ America/Toronto MSG 04:44 every day in T.O.
|
||||
REM 2 AT 05:00 TZ America/Toronto MSG 05:00 on 2nd in T.O.
|
||||
REM Wed AT 06:00 TZ America/Toronto MSG 06:00 on Wed in T.O.
|
||||
REM Wed AT 01:00 TZ America/Toronto MSG 01:00 on Wed in T.O.
|
||||
REM AT 09:00 TZ America/Toronto SATISFY [!($Td % 3)] MSG 09:00 every third day in T.O.
|
||||
REM AT 02:00 TZ America/Toronto SATISFY [!($Td % 3)] MSG 02:00 every third day in T.O.
|
||||
EOF
|
||||
|
||||
# Semi-exhaustive checking...
|
||||
OFFSETS="-12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12"
|
||||
cat <<'EOF' >> $OUT
|
||||
|
||||
NOTE NOTE NOTE: The notation UTC+n denotes a time zone n hours
|
||||
WEST of UTC, and UTC-n denotes a time zone n hours EAST of
|
||||
UTC... the opposite of what you might think. The zone
|
||||
UTC+1 is two hours EARLIER than UTC-1.
|
||||
|
||||
EOF
|
||||
|
||||
for src in $OFFSETS; do
|
||||
srczone="UTC$src"
|
||||
for dst in $OFFSETS ; do
|
||||
dstzone="UTC$dst"
|
||||
(echo 'BANNER %'; echo "REM AT 00:00 TZ !$dstzone MSG 00:00 at $dstzone in [getenv(\"TZ\")] is %3, %r %m; diff=[(\$Tt-00:00)/60]") | TZ=$srczone $REMIND '-i$addblanklines=0' - 2025-10-09@12:00 >> $OUT 2>&1
|
||||
done
|
||||
done
|
||||
for src in $OFFSETS; do
|
||||
srczone="UTC$src"
|
||||
for dst in $OFFSETS ; do
|
||||
dstzone="UTC$dst"
|
||||
(echo 'BANNER %'; echo "REM AT 12:00 TZ !$dstzone MSG 12:00 at $dstzone in [getenv(\"TZ\")] is %3, %r %m; diff=[(\$Tt-12:00)/60]") | TZ=$srczone $REMIND '-i$addblanklines=0' - 2025-10-09@12:00 >> $OUT 2>&1
|
||||
done
|
||||
done
|
||||
for src in $OFFSETS; do
|
||||
srczone="UTC$src"
|
||||
for dst in $OFFSETS ; do
|
||||
dstzone="UTC$dst"
|
||||
(echo 'BANNER %'; echo "REM 11 ++10 AT 00:00 TZ !$dstzone MSG 00:00 on 11th at $dstzone in [getenv(\"TZ\")] is %3, %r %m; diff=[(trigdatetime()-'2025-10-11@00:00')/60]") | TZ=$srczone $REMIND '-i$addblanklines=0' - 2025-10-09@12:00 >> $OUT 2>&1
|
||||
done
|
||||
done
|
||||
for src in $OFFSETS; do
|
||||
srczone="UTC$src"
|
||||
for dst in $OFFSETS ; do
|
||||
dstzone="UTC$dst"
|
||||
(echo 'BANNER %'; echo "REM 11 ++10 AT 12:00 TZ !$dstzone MSG 12:00 on 11th at $dstzone in [getenv(\"TZ\")] is %3, %r %m; diff=[(trigdatetime()-'2025-10-11@12:00')/60]") | TZ=$srczone $REMIND '-i$addblanklines=0' - 2025-10-09@12:00 >> $OUT 2>&1
|
||||
done
|
||||
done
|
||||
|
||||
cmp -s $OUT $CMP
|
||||
if [ "$?" = "0" ] ; then
|
||||
echo "Remind: Time zone tests ${GRN}PASSED${NRM}"
|
||||
|
||||
124
tests/test.cmp
124
tests/test.cmp
@@ -1046,7 +1046,7 @@ set a057 value("a05"+"6")
|
||||
"a05" + "6" => "a056"
|
||||
value("a056") => "SDFJHSDF KSJDFH KJSDFH KSJDFH"
|
||||
set a058 version()
|
||||
version() => "06.01.04"
|
||||
version() => "06.02.00"
|
||||
set a059 wkday(today())
|
||||
today() => 1991-02-16
|
||||
wkday(1991-02-16) => "Saturday"
|
||||
@@ -2609,7 +2609,7 @@ a056 "SDFJHSDF KSJDFH KJSDFH KSJDFH"
|
||||
a007 "1991-02-16"
|
||||
a057 "SDFJHSDF KSJDFH KJSDFH KSJDFH"
|
||||
a008 "11:44"
|
||||
a058 "06.01.04"
|
||||
a058 "06.02.00"
|
||||
a059 "Saturday"
|
||||
a010 12
|
||||
a060 6
|
||||
@@ -5040,8 +5040,9 @@ set a 7 * "Cabbage! "
|
||||
|
||||
# Should result in errors
|
||||
set pqxya 1+2)
|
||||
1 + 2 => 3
|
||||
../tests/test.rem(1014): Expecting end-of-line
|
||||
1+2)
|
||||
^-- here
|
||||
../tests/test.rem(1014): Expecting operator or end-of-expression
|
||||
|
||||
# Should result in an error
|
||||
REM Tue OMIT 2024-01-01 MSG Wookie
|
||||
@@ -5562,8 +5563,8 @@ REM SATISFY ""
|
||||
REM SATISFY [version() > "01.00.00"]
|
||||
../tests/test.rem(1074): SATISFY: expression has no reference to trigdate() or $T...
|
||||
../tests/test.rem(1074): Trig = Saturday, 16 February, 1991
|
||||
version() => "06.01.04"
|
||||
"06.01.04" > "01.00.00" => 1
|
||||
version() => "06.02.00"
|
||||
"06.02.00" > "01.00.00" => 1
|
||||
../tests/test.rem(1074): Trig(satisfied) = Saturday, 16 February, 1991
|
||||
REM SATISFY [max(x, max(x, 1, 2, 3), 4, 5, 6) * 5]
|
||||
../tests/test.rem(1075): SATISFY: expression has no reference to trigdate() or $T...
|
||||
@@ -16426,9 +16427,14 @@ eval("1/0") => 1 / 0 => Division by zero
|
||||
../tests/test.rem(1590): `/': Division by zero
|
||||
Division by zero
|
||||
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
|
||||
^-- 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
|
||||
set a catch(eval("1 +"), 33)
|
||||
eval("1 +") => Unexpected end of line
|
||||
@@ -16438,7 +16444,10 @@ eval("1/0") => 1 / 0 => Division by zero
|
||||
Division by zero
|
||||
catch(*Division by zero*, 34) => 34
|
||||
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
|
||||
|
||||
# Ensure RUN is disabled in eval
|
||||
@@ -16446,7 +16455,7 @@ set a shell("echo foo")
|
||||
shell("echo foo") => "foo"
|
||||
set a eval("shell(\"echo foo\")")
|
||||
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
|
||||
set a shell("echo foo")
|
||||
shell("echo foo") => "foo"
|
||||
@@ -16459,8 +16468,8 @@ Leaving UserFN i() => "foo"
|
||||
set a eval("i()")
|
||||
eval("i()") => Entering UserFN i()
|
||||
shell("echo foo") => RUN disabled
|
||||
../tests/test.rem(1603): shell(): RUN disabled
|
||||
../tests/test.rem(1601): [#0] In function `i'
|
||||
../tests/test.rem(1605): shell(): RUN disabled
|
||||
../tests/test.rem(1603): [#0] In function `i'
|
||||
Leaving UserFN i() => RUN disabled
|
||||
RUN disabled
|
||||
set a i()
|
||||
@@ -16473,19 +16482,19 @@ set b eval(a)
|
||||
a => "eval(\"1\")+ shell(\"ls\")"
|
||||
eval("eval(\"1\")+ shell(\"ls\")") => eval("1") => 1
|
||||
shell("ls") => RUN disabled
|
||||
../tests/test.rem(1607): shell(): RUN disabled
|
||||
../tests/test.rem(1609): shell(): RUN disabled
|
||||
RUN disabled
|
||||
|
||||
# "value" should use lazy evaluation
|
||||
set a value(4:33)
|
||||
value(04:33) => Type mismatch
|
||||
../tests/test.rem(1610): Type mismatch
|
||||
../tests/test.rem(1612): Type mismatch
|
||||
set a value('2020-01-01', 42)
|
||||
value(2020-01-01, ?) => Type mismatch
|
||||
../tests/test.rem(1611): Type mismatch
|
||||
../tests/test.rem(1613): Type mismatch
|
||||
set a value("nosuchvar")
|
||||
value("nosuchvar") => Undefined variable
|
||||
../tests/test.rem(1612): Undefined variable
|
||||
../tests/test.rem(1614): Undefined variable
|
||||
set a value("nosuchvar", 42)
|
||||
value("nosuchvar", 42) => 42
|
||||
set a value("a", 42)
|
||||
@@ -16495,11 +16504,11 @@ value("a") => 42
|
||||
DEBUG -x
|
||||
|
||||
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
|
||||
../tests/test.rem(1630): Expired
|
||||
../tests/test.rem(1631): Expired
|
||||
../tests/test.rem(1632): Expired
|
||||
../tests/test.rem(1633): Expired
|
||||
trigvalid = 1; trigdate = 1991-01-14
|
||||
trigvalid = 0; trigdate = 0
|
||||
daysinmon(2, 2000) => 29
|
||||
@@ -16511,36 +16520,36 @@ daysinmon("Feb", 2001) => 28
|
||||
daysinmon("March", 2000) => 31
|
||||
daysinmon("March", 2001) => 31
|
||||
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(2001-02-14) => 28
|
||||
daysinmon(2000-04-14) => 30
|
||||
daysinmon(2001-04-14) => 30
|
||||
date(2020, "April", 15) => 2020-04-15
|
||||
date(2020, "Carrot", 12) => Invalid month name
|
||||
../tests/test.rem(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, 4, 44) => 2020-04-13@04:44
|
||||
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
|
||||
../tests/test.rem(1670): datetime(): Invalid month name
|
||||
../tests/test.rem(1672): datetime(): Invalid month name
|
||||
wkdaynum("Tue") => 2
|
||||
wkdaynum("Wednesday") => 3
|
||||
wkdaynum("telephone") => Invalid weekday name
|
||||
../tests/test.rem(1674): wkdaynum(): Invalid weekday name
|
||||
../tests/test.rem(1685): Cannot modify system variable: `$NumTrig'
|
||||
../tests/test.rem(1686): POP-VARS without matching PUSH-VARS
|
||||
../tests/test.rem(1676): wkdaynum(): Invalid weekday name
|
||||
../tests/test.rem(1687): Cannot modify system variable: `$NumTrig'
|
||||
../tests/test.rem(1688): POP-VARS without matching PUSH-VARS
|
||||
|
||||
FUNSET a
|
||||
FSET b(x, y) x*y
|
||||
FSET c() 33
|
||||
|
||||
set a a(2)
|
||||
../tests/test.rem(1695): Undefined function: `a'
|
||||
../tests/test.rem(1697): Undefined function: `a'
|
||||
set a b(2)
|
||||
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)
|
||||
Entering UserFN b(2, 3)
|
||||
x => 2
|
||||
@@ -16562,7 +16571,7 @@ Entering UserFN a(2)
|
||||
Leaving UserFN a(2) => 42
|
||||
set a b(2)
|
||||
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)
|
||||
Entering UserFN b(2, 3)
|
||||
x => 2
|
||||
@@ -16577,10 +16586,10 @@ Leaving UserFN c() => 66
|
||||
POP-FUNCS
|
||||
|
||||
set a a(2)
|
||||
../tests/test.rem(1713): Undefined function: `a'
|
||||
../tests/test.rem(1715): Undefined function: `a'
|
||||
set a b(2)
|
||||
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)
|
||||
Entering UserFN b(2, 3)
|
||||
x => 2
|
||||
@@ -16595,7 +16604,7 @@ DEBUG -xe
|
||||
Overridden: subst_colon subst_bang subst_question subst_at subst_hash
|
||||
bad => "ÿ"
|
||||
mbstrlen("ÿ") => Invalid multibyte sequence
|
||||
../tests/test.rem(1734): mbstrlen(): Invalid multibyte sequence
|
||||
../tests/test.rem(1736): mbstrlen(): Invalid multibyte sequence
|
||||
bad => "ÿ"
|
||||
strlen("ÿ") => 1
|
||||
faces => "🙂🙂🙂🙂🙂xyzçççéfoo"
|
||||
@@ -16609,7 +16618,7 @@ index("🙂🙂🙂🙂🙂xyzçççéfoo", "ç") => 24
|
||||
bad => "ÿ"
|
||||
bad => "ÿ"
|
||||
mbindex("ÿ", "ÿ") => Invalid multibyte sequence
|
||||
../tests/test.rem(1742): mbindex(): Invalid multibyte sequence
|
||||
../tests/test.rem(1744): mbindex(): Invalid multibyte sequence
|
||||
faces => "🙂🙂🙂🙂🙂xyzçççéfoo"
|
||||
mbindex("🙂🙂🙂🙂🙂xyzçççéfoo", "ç", 11) => 11
|
||||
faces => "🙂🙂🙂🙂🙂xyzçççéfoo"
|
||||
@@ -16628,10 +16637,10 @@ faces => "🙂🙂🙂🙂🙂xyzçççéfoo"
|
||||
mbsubstr("🙂🙂🙂🙂🙂xyzçççéfoo", 2, 9) => "🙂🙂🙂🙂xyzç"
|
||||
bad => "ÿ"
|
||||
mbsubstr("ÿ", 1) => Invalid multibyte sequence
|
||||
../tests/test.rem(1754): mbsubstr(): Invalid multibyte sequence
|
||||
../tests/test.rem(1756): mbsubstr(): Invalid multibyte sequence
|
||||
bad => "ÿ"
|
||||
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"
|
||||
substr("🙂🙂🙂🙂🙂xyzçççéfoo", 2) => "Ÿ™‚🙂🙂🙂🙂xyzçççéfoo"
|
||||
faces => "🙂🙂🙂🙂🙂xyzçççéfoo"
|
||||
@@ -16641,13 +16650,13 @@ codepoint("🙂🙂🙂🙂🙂xyzçççéfoo") => 128578
|
||||
mbchar(128578, 162, 122) => "🙂¢z"
|
||||
bad => "ÿ"
|
||||
codepoint("ÿ") => Invalid multibyte sequence
|
||||
../tests/test.rem(1762): codepoint(): Invalid multibyte sequence
|
||||
../tests/test.rem(1764): codepoint(): Invalid multibyte sequence
|
||||
codepoint("") => 0
|
||||
mbchar(0) => ""
|
||||
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
|
||||
../tests/test.rem(1766): mbchar(): Number too low
|
||||
../tests/test.rem(1768): mbchar(): Number too low
|
||||
Variable hash table statistics:
|
||||
Entries: 100146; Buckets: 87719; Non-empty Buckets: 66303
|
||||
Maxlen: 5; Minlen: 0; Avglen: 1.142; Stddev: 0.878; Avg nonempty len: 1.510
|
||||
@@ -16669,7 +16678,7 @@ Expression nodes high-water: 302076
|
||||
Expression nodes leaked: 0
|
||||
Parse level high-water: 34
|
||||
Max expr node evaluations per line: 2001
|
||||
Total expression node evaluations: 106467
|
||||
Total expression node evaluations: 106471
|
||||
|
||||
Test 2
|
||||
|
||||
@@ -23707,7 +23716,7 @@ SECURITY: Won't read world-writable file or directory!
|
||||
Error reading include_dir/ww: Can't open file
|
||||
SECURITY: Won't read world-writable file or directory!
|
||||
Error reading include_dir/ww: No files matching *.rem
|
||||
06.01.04
|
||||
06.02.00
|
||||
Enabling test mode: This is meant for the acceptance test.
|
||||
Do not use --test in production.
|
||||
In test mode, the system time is fixed at 2025-01-06@19:00
|
||||
@@ -23905,7 +23914,9 @@ Parsed expression: 1||1
|
||||
Parsed expression: 2
|
||||
=> 2
|
||||
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")
|
||||
=> (Iif 0 "foo" 0 "bar" 1 "blech" 0 "quux" 1 "borhy" "wacka")
|
||||
iif(0, ?, 0, ?, 1, "blech", ?, ?, ?, ?, ?) => "blech"
|
||||
@@ -23923,7 +23934,7 @@ max(6, 9, 50) => 50
|
||||
Parsed expression: max(1,
|
||||
=> Error: Illegal character
|
||||
Unparsed: ,1)
|
||||
,1)
|
||||
max(1,,1)
|
||||
^-- here
|
||||
Parsed expression: 5%0
|
||||
=> (% 5 0)
|
||||
@@ -24284,7 +24295,7 @@ Expression nodes high-water: 499
|
||||
Expression nodes leaked: 0
|
||||
Parse level high-water: 2001
|
||||
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): Warning: PUSH-OMIT-CONTEXT without matching POP-OMIT-CONTEXT
|
||||
No reminders.
|
||||
@@ -24458,6 +24469,13 @@ Checking ../man/rem.1...
|
||||
Checking ../man/rem2ps.1...
|
||||
Checking ../man/remind.1...
|
||||
Checking ../man/tkremind.1...
|
||||
|
||||
If spellintian is installed, its output (if any) follows...
|
||||
|
||||
|
||||
If hunspell is installed, its output (if any) follows...
|
||||
|
||||
|
||||
# Remind Tokens
|
||||
|
||||
addomit
|
||||
@@ -25056,6 +25074,8 @@ TRANSLATE "TZ specified for non-timed reminder" ""
|
||||
TRANSLATE "C library does not support multibyte characters" ""
|
||||
TRANSLATE "Invalid multibyte sequence" ""
|
||||
TRANSLATE "Maximum expression complexity exceeded" ""
|
||||
TRANSLATE "Expecting operator or end-of-expression" ""
|
||||
TRANSLATE "Expecting constant, variable, function call or (expression)" ""
|
||||
|
||||
# Other Messages
|
||||
TRANSLATE "%s function `%s' defined at %s(%s) does not use its argument" ""
|
||||
@@ -25088,6 +25108,7 @@ TRANSLATE "Invalid translation: Both original and translated must have the same
|
||||
TRANSLATE "Missing REM type; assuming MSG" ""
|
||||
TRANSLATE "No Adar A in %d" ""
|
||||
TRANSLATE "No substition function `%s' defined" ""
|
||||
TRANSLATE "No time zone file found for TZ `%s'... is it valid?" ""
|
||||
TRANSLATE "Non-constant built-in function `%s' makes expression non-constant" ""
|
||||
TRANSLATE "Non-constant expression converted to constant by `const' built-in function" ""
|
||||
TRANSLATE "Nonexistence of global variable `%s' makes value() non-constant" ""
|
||||
@@ -39917,3 +39938,22 @@ devnull test b
|
||||
|
||||
-stdin-(2): `/': Division by zero
|
||||
No reminders.
|
||||
[
|
||||
{"banner":"Reminders for Wednesday, 1st October, 2025:"},
|
||||
{"date":"2025-10-01","filename":"-stdin-","lineno":3,"d":1,"m":10,"y":2025,"is_todo":0,"trigbase":"2025-10-1 ","priority":5000,"body":"Nonconst NOT set 2025-10-01"},
|
||||
{"date":"2025-10-01","filename":"-stdin-","lineno":4,"nonconst_expr":1,"d":1,"m":10,"y":2025,"is_todo":0,"trigbase":"2025-10-1 ","priority":5000,"body":"Nonconst IS set 2025-10-01"},
|
||||
{"date":"2025-10-01","filename":"-stdin-","lineno":5,"nonconst_expr":1,"d":1,"m":10,"y":2025,"is_todo":0,"trigbase":"2025-10-1 ","priority":5000,"body":"Nonconst IS set"}
|
||||
]
|
||||
# Nonconst-expr in trigger
|
||||
set $ParseUntriggered 1
|
||||
set a nonconst(1)
|
||||
#!P: Expired: REM 2025-10-01 MSG Nonconst NOT set [today()]
|
||||
#!P: Next line may have expired, but contains non-constant expression
|
||||
#!P: or a relative SCANFROM clause
|
||||
REM 2025 Oct [a] MSG Nonconst IS set [today()]
|
||||
#!P: Next line may have expired, but contains non-constant expression
|
||||
#!P: or a relative SCANFROM clause
|
||||
REM 2025 Oct [a] MSG Nonconst IS set
|
||||
#!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-10-01 MSG No expr seen [1+2]
|
||||
|
||||
@@ -1589,9 +1589,11 @@ dump -c a
|
||||
set a eval("1 +")
|
||||
set a eval("1/0")
|
||||
set a eval("1 / / 2")
|
||||
set a eval("1 / # 2")
|
||||
set a catch(eval("1 +"), 33)
|
||||
set a catch(eval("1/0"), 34)
|
||||
set a catch(eval("1 / / 2"), 35)
|
||||
set a catch(eval("1 / # 2"), 35)
|
||||
|
||||
# Ensure RUN is disabled in eval
|
||||
set a shell("echo foo")
|
||||
@@ -1765,6 +1767,8 @@ set a mbchar(0)
|
||||
set a mbchar(0, 120)
|
||||
set a mbchar(120, 0)
|
||||
|
||||
# Make sure trailing space doesn't cause a diagnostic.
|
||||
set a "foo"
|
||||
DEBUG -x
|
||||
# Don't want Remind to queue reminders
|
||||
EXIT
|
||||
|
||||
2640
tests/tz.cmp
2640
tests/tz.cmp
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user