mirror of
https://salsa.debian.org/dskoll/remind.git
synced 2026-05-03 06:17:09 +02:00
Compare commits
49 Commits
05.00.00
...
b3cf741d15
| Author | SHA1 | Date | |
|---|---|---|---|
| b3cf741d15 | |||
| 0b28dde9c7 | |||
| 5a3980b5b8 | |||
| a8e33118d6 | |||
| 2223277f64 | |||
| c72413e3c1 | |||
| fa1033db6f | |||
| 61e3edd2ac | |||
| 093c97ff91 | |||
| 6e64b175aa | |||
| 09dba4bc94 | |||
| 2e443ac5b7 | |||
| 59a8c88178 | |||
| 40eab03d84 | |||
| e993bf59cf | |||
| c6de5a2c8f | |||
| 51cc939d0c | |||
| c857192e6d | |||
| 4591c2b181 | |||
| 7843a1b2ba | |||
| 649481cf01 | |||
| c253bdfcbe | |||
| 1910808fd7 | |||
| 1d8cb9749e | |||
| e3f9380fcd | |||
| 326c3f59b0 | |||
| 03f1c5a047 | |||
| 02122491c3 | |||
| 735f6f5686 | |||
| ac033d75c0 | |||
| e2185e773a | |||
| d9ae417e01 | |||
| e1d0948538 | |||
| 357ddf285a | |||
| 41859fc484 | |||
| 07275e71b0 | |||
| f68521cb95 | |||
| 526610bdd2 | |||
| 973e3448ae | |||
| 9a3f28f6fc | |||
| a3e32d2dc4 | |||
| a8b78eff00 | |||
| 460db83298 | |||
| 4560712778 | |||
| ce8803dde9 | |||
| 60ca5d45e3 | |||
| 4454613d00 | |||
| 0704808500 | |||
| 166b1ac499 |
@@ -33,3 +33,4 @@ src/version.h
|
||||
tests/test.out
|
||||
www/Makefile
|
||||
gmon.out
|
||||
tests/once.timestamp
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#! /bin/sh
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated by GNU Autoconf 2.71 for remind 05.00.00.
|
||||
# Generated by GNU Autoconf 2.71 for remind 05.00.03.
|
||||
#
|
||||
#
|
||||
# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
|
||||
@@ -608,8 +608,8 @@ MAKEFLAGS=
|
||||
# Identity of this package.
|
||||
PACKAGE_NAME='remind'
|
||||
PACKAGE_TARNAME='remind'
|
||||
PACKAGE_VERSION='05.00.00'
|
||||
PACKAGE_STRING='remind 05.00.00'
|
||||
PACKAGE_VERSION='05.00.03'
|
||||
PACKAGE_STRING='remind 05.00.03'
|
||||
PACKAGE_BUGREPORT=''
|
||||
PACKAGE_URL='https://dianne.skoll.ca/projects/remind/'
|
||||
|
||||
@@ -1264,7 +1264,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 05.00.00 to adapt to many kinds of systems.
|
||||
\`configure' configures remind 05.00.03 to adapt to many kinds of systems.
|
||||
|
||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||
|
||||
@@ -1326,7 +1326,7 @@ fi
|
||||
|
||||
if test -n "$ac_init_help"; then
|
||||
case $ac_init_help in
|
||||
short | recursive ) echo "Configuration of remind 05.00.00:";;
|
||||
short | recursive ) echo "Configuration of remind 05.00.03:";;
|
||||
esac
|
||||
cat <<\_ACEOF
|
||||
|
||||
@@ -1414,7 +1414,7 @@ fi
|
||||
test -n "$ac_init_help" && exit $ac_status
|
||||
if $ac_init_version; then
|
||||
cat <<\_ACEOF
|
||||
remind configure 05.00.00
|
||||
remind configure 05.00.03
|
||||
generated by GNU Autoconf 2.71
|
||||
|
||||
Copyright (C) 2021 Free Software Foundation, Inc.
|
||||
@@ -1864,7 +1864,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 05.00.00, which was
|
||||
It was created by remind $as_me 05.00.03, which was
|
||||
generated by GNU Autoconf 2.71. Invocation command line was
|
||||
|
||||
$ $0$ac_configure_args_raw
|
||||
@@ -4703,7 +4703,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 05.00.00, which was
|
||||
This file was extended by remind $as_me 05.00.03, which was
|
||||
generated by GNU Autoconf 2.71. Invocation command line was
|
||||
|
||||
CONFIG_FILES = $CONFIG_FILES
|
||||
@@ -4768,7 +4768,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 05.00.00
|
||||
remind config.status 05.00.03
|
||||
configured by $0, generated by GNU Autoconf 2.71,
|
||||
with options \\"\$ac_cs_config\\"
|
||||
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_INIT(remind, 05.00.00, , , https://dianne.skoll.ca/projects/remind/)
|
||||
AC_INIT(remind, 05.00.03, , , https://dianne.skoll.ca/projects/remind/)
|
||||
AC_CONFIG_SRCDIR([src/queue.c])
|
||||
|
||||
cat <<'EOF'
|
||||
|
||||
@@ -1,5 +1,44 @@
|
||||
CHANGES TO REMIND
|
||||
|
||||
* VERSION 5.0 Patch 2 - 2024-07-26
|
||||
|
||||
* IMPROVEMENT: Remind: Revamp how ONCE works. You can now set a
|
||||
special variable $OnceFile to be the path to a timestamp file. The
|
||||
ONCE directive uses this timestamp file to track when it was last
|
||||
run rather than the access date of the main reminder script. This
|
||||
is more reliable because it doesn't rely on the atime of a file
|
||||
(which might not be maintained accurately) and is not affected if
|
||||
you edit your reminder script.
|
||||
|
||||
* CHANGE: Taking input from stdin no longer implies the "-o" option; ONCE can
|
||||
work if you set $OnceFile
|
||||
|
||||
* CHANGE: Any of the -c, -n, -p and -s options implicitly enable the
|
||||
-o option. As before, specifying a repeat factor *N or a date that
|
||||
is not today on the command-line also implies -o.
|
||||
|
||||
* MINOR NEW FEATURE: Rem2PDF: Add the "--svg" command-line option to produce
|
||||
SVG output rather than PDF.
|
||||
|
||||
* MINOR IMPROVEMENT: Remind: Improve the storage efficiency of short
|
||||
string constants in compiled expression trees.
|
||||
|
||||
* MINOR IMPROVEMENT: Remind: Remove some obsolete macro definitions
|
||||
|
||||
* VERSION 5.0 Patch 1 - 2024-06-08
|
||||
|
||||
* MINOR IMPROVEMENT: Add short-circuit evaluation to the isany() function,
|
||||
which now only evaluates those arguments absolutely necessary to determine
|
||||
the result.
|
||||
|
||||
* BUG FIX: Mark weekno() as a non-constant function (the zero-argument form
|
||||
depends on external conditions.)
|
||||
|
||||
* BUG FIX: Fix a couple of memory leaks.
|
||||
|
||||
* BUG FIX: Don't rely on support for unnamed function parameters; this caused
|
||||
compilation failures with older versions of gcc.
|
||||
|
||||
* VERSION 5.0 Patch 0 - 2024-06-06
|
||||
|
||||
* MAJOR CHANGE: The expression evaluation engine has been completely replaced
|
||||
|
||||
+45
-40
@@ -6,6 +6,11 @@
|
||||
# Cut and paste as desired! Also, near the end, there are a bunch of #
|
||||
# holiday definitions for the U.S. #
|
||||
# #
|
||||
# *** NOTE *** #
|
||||
# #
|
||||
# This file is simply a grab-bag of examples. It is NOT meant to be #
|
||||
# included as-is in a live reminder file. #
|
||||
# #
|
||||
# Some examples provided by George M. Sipe <gsipe@pyratl.ga.pyramid.com> #
|
||||
# #
|
||||
# U.S. holidays provided by Dave Rickel <drickel@sjc.mentorg.com> #
|
||||
@@ -305,51 +310,51 @@ FSET _PastMon(x, y) IIF(WKDAYNUM(_h2(x,y))!=1, _h2(x,y), _h2(x,y)+1)
|
||||
SET InIsrael VALUE("InIsrael", 0)
|
||||
SET Reform VALUE("Reform", 0)
|
||||
|
||||
[_h(1, "Tishrey")] ++4 MSG %"Rosh Hashana 1%" is %b.
|
||||
REM [_h(1, "Tishrey")] ++4 MSG %"Rosh Hashana 1%" is %b.
|
||||
|
||||
# No RH-2 or Tzom Gedalia in Reform
|
||||
IF !Reform
|
||||
[_h(2, "Tishrey")] ++4 MSG %"Rosh Hashana 2%" is %b.
|
||||
[_PastSat(3, "Tishrey")] ++4 MSG %"Tzom Gedalia%" is %b.
|
||||
REM [_h(2, "Tishrey")] ++4 MSG %"Rosh Hashana 2%" is %b.
|
||||
REM [_PastSat(3, "Tishrey")] ++4 MSG %"Tzom Gedalia%" is %b.
|
||||
ENDIF
|
||||
|
||||
[_h(10, "Tishrey")] ++4 MSG %"Yom Kippur%" is %b.
|
||||
[_h(15, "Tishrey")] ++4 MSG %"Sukkot 1%" is %b.
|
||||
REM [_h(10, "Tishrey")] ++4 MSG %"Yom Kippur%" is %b.
|
||||
REM [_h(15, "Tishrey")] ++4 MSG %"Sukkot 1%" is %b.
|
||||
|
||||
IF !InIsrael
|
||||
[_h(16, "Tishrey")] MSG %"Sukkot 2%"
|
||||
REM [_h(16, "Tishrey")] MSG %"Sukkot 2%"
|
||||
ENDIF
|
||||
|
||||
[_h(21, "Tishrey")] ++4 MSG %"Hoshana Rabba%" is %b.
|
||||
[_h(22, "Tishrey")] ++4 MSG %"Shemini Atzeret%" is %b.
|
||||
REM [_h(21, "Tishrey")] ++4 MSG %"Hoshana Rabba%" is %b.
|
||||
REM [_h(22, "Tishrey")] ++4 MSG %"Shemini Atzeret%" is %b.
|
||||
|
||||
IF InIsrael
|
||||
[_h(22, "Tishrey")] ++4 MSG %"Simchat Torah%" is %b.
|
||||
REM [_h(22, "Tishrey")] ++4 MSG %"Simchat Torah%" is %b.
|
||||
ELSE
|
||||
[_h(23, "Tishrey")] ++4 MSG %"Simchat Torah%" is %b.
|
||||
REM [_h(23, "Tishrey")] ++4 MSG %"Simchat Torah%" is %b.
|
||||
ENDIF
|
||||
|
||||
# Because Kislev can change length, we must be more careful about Chanukah
|
||||
FSET _chan(x) HEBDATE(24, "Kislev", $U-9)+x
|
||||
[_chan(1)] ++4 MSG %"Chanukah 1%" is %b.
|
||||
[_chan(2)] MSG %"Chanukah 2%"
|
||||
[_chan(3)] MSG %"Chanukah 3%"
|
||||
[_chan(4)] MSG %"Chanukah 4%"
|
||||
[_chan(5)] MSG %"Chanukah 5%"
|
||||
[_chan(6)] MSG %"Chanukah 6%"
|
||||
[_chan(7)] MSG %"Chanukah 7%"
|
||||
[_chan(8)] MSG %"Chanukah 8%"
|
||||
REM [_chan(1)] ++4 MSG %"Chanukah 1%" is %b.
|
||||
REM [_chan(2)] MSG %"Chanukah 2%"
|
||||
REM [_chan(3)] MSG %"Chanukah 3%"
|
||||
REM [_chan(4)] MSG %"Chanukah 4%"
|
||||
REM [_chan(5)] MSG %"Chanukah 5%"
|
||||
REM [_chan(6)] MSG %"Chanukah 6%"
|
||||
REM [_chan(7)] MSG %"Chanukah 7%"
|
||||
REM [_chan(8)] MSG %"Chanukah 8%"
|
||||
|
||||
# Not sure about Reform's position on the next one.
|
||||
IF !Reform
|
||||
# 10 Tevet will never be a Saturday, so whether or not to
|
||||
# move it is moot. (Thanks to Art Werschulz.)
|
||||
[_h(10, "Tevet")] MSG %"Tzom Tevet%" is %b.
|
||||
REM [_h(10, "Tevet")] MSG %"Tzom Tevet%" is %b.
|
||||
ENDIF
|
||||
|
||||
[_h(15, "Shvat")] ++4 MSG %"Tu B'Shvat%" is %b.
|
||||
[_h(14, "Adar A")] ++4 MSG %"Purim Katan%" is %b.
|
||||
[_h(15, "Adar A")] ++4 MSG %"Shushan Purim Katan%" is %b.
|
||||
REM [_h(15, "Shvat")] ++4 MSG %"Tu B'Shvat%" is %b.
|
||||
REM [_h(14, "Adar A")] ++4 MSG %"Purim Katan%" is %b.
|
||||
REM [_h(15, "Adar A")] ++4 MSG %"Shushan Purim Katan%" is %b.
|
||||
|
||||
# If Purim is on Sunday, then Fast of Esther is 11 Adar.
|
||||
IF WKDAYNUM(_h2(13, "Adar")) != 6
|
||||
@@ -357,18 +362,18 @@ IF WKDAYNUM(_h2(13, "Adar")) != 6
|
||||
ELSE
|
||||
REM [_h2(11, "Adar")] ++4 MSG %"Fast of Esther%" is %b.
|
||||
ENDIF
|
||||
[_h(14, "Adar")] ++4 MSG %"Purim%" is %b.
|
||||
[_h(15, "Adar")] ++4 MSG %"Shushan Purim%" is %b.
|
||||
[_h(15, "Nisan")] ++4 MSG %"Pesach%" is %b.
|
||||
REM [_h(14, "Adar")] ++4 MSG %"Purim%" is %b.
|
||||
REM [_h(15, "Adar")] ++4 MSG %"Shushan Purim%" is %b.
|
||||
REM [_h(15, "Nisan")] ++4 MSG %"Pesach%" is %b.
|
||||
|
||||
IF !InIsrael
|
||||
[_h(16, "Nisan")] MSG %"Pesach 2%"
|
||||
REM [_h(16, "Nisan")] MSG %"Pesach 2%"
|
||||
ENDIF
|
||||
|
||||
[_h(21, "Nisan")] MSG %"Pesach 7%"
|
||||
REM [_h(21, "Nisan")] MSG %"Pesach 7%"
|
||||
|
||||
IF !InIsrael && !Reform
|
||||
[_h(22, "Nisan")] MSG %"Pesach 8%"
|
||||
REM [_h(22, "Nisan")] MSG %"Pesach 8%"
|
||||
ENDIF
|
||||
|
||||
REM [_PastSun(27, "Nisan")] SATISFY 1
|
||||
@@ -384,36 +389,36 @@ ENDIF
|
||||
# Thursday. If 4 Iyar is a Sunday, then Yom Hazikaron
|
||||
# moves to 5 Iyar and Yom Ha'atzmaut to 6 Iyar.
|
||||
IF WKDAYNUM(_h2(4, "Iyar")) == 4 || WKDAYNUM(_h2(4, "Iyar")) == 5
|
||||
[_h(2, "Iyar")] ++4 MSG %"Yom Hazikaron%" is %b.
|
||||
[_h(3, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
|
||||
REM [_h(2, "Iyar")] ++4 MSG %"Yom Hazikaron%" is %b.
|
||||
REM [_h(3, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
|
||||
ELSE
|
||||
IF WKDAYNUM(_h2(4, "Iyar")) == 0
|
||||
[_h(5, "Iyar")] ++4 MSG %"Yom Hazikaron%" is %b.
|
||||
[_h(6, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
|
||||
REM [_h(5, "Iyar")] ++4 MSG %"Yom Hazikaron%" is %b.
|
||||
REM [_h(6, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
|
||||
ELSE
|
||||
[_h(4, "Iyar")] ++4 MSG %"Yom Hazikaron%" is %b.
|
||||
[_h(5, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
|
||||
REM [_h(4, "Iyar")] ++4 MSG %"Yom Hazikaron%" is %b.
|
||||
REM [_h(5, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
|
||||
ENDIF
|
||||
ENDIF
|
||||
|
||||
# Not sure about Reform's position on Lag B'Omer
|
||||
IF !Reform
|
||||
[_h(18, "Iyar")] ++4 MSG %"Lag B'Omer%" is %b.
|
||||
REM [_h(18, "Iyar")] ++4 MSG %"Lag B'Omer%" is %b.
|
||||
ENDIF
|
||||
|
||||
[_h(28, "Iyar")] ++4 MSG %"Yom Yerushalayim%" is %b.
|
||||
[_h(6, "Sivan")] ++4 MSG %"Shavuot%" is %b.
|
||||
REM [_h(28, "Iyar")] ++4 MSG %"Yom Yerushalayim%" is %b.
|
||||
REM [_h(6, "Sivan")] ++4 MSG %"Shavuot%" is %b.
|
||||
|
||||
IF !InIsrael && !Reform
|
||||
[_h(7, "Sivan")] MSG %"Shavuot 2%"
|
||||
REM [_h(7, "Sivan")] MSG %"Shavuot 2%"
|
||||
ENDIF
|
||||
|
||||
# Fairly sure Reform Jews don't observe the next two
|
||||
IF !Reform
|
||||
# Tzom Tamuz and Tish'a B'Av are moved to Sunday if they normally
|
||||
# fall on a Saturday
|
||||
[_PastSat(17, "Tamuz")] ++4 MSG %"Tzom Tammuz%" is %b.
|
||||
[_PastSat(9, "Av")] ++4 MSG %"Tish'a B'Av%" is %b.
|
||||
REM [_PastSat(17, "Tamuz")] ++4 MSG %"Tzom Tammuz%" is %b.
|
||||
REM [_PastSat(9, "Av")] ++4 MSG %"Tish'a B'Av%" is %b.
|
||||
ENDIF
|
||||
|
||||
# Counting the omer - do the whole spiel, i.e:
|
||||
|
||||
@@ -10,7 +10,7 @@ REM 28 Oct MSG ΟΧΙ
|
||||
REM 25 Dec MSG ΧΡΙΣΤΟΥΓΕΝΝΑ
|
||||
REM 26 Dec MSG ΧΡΙΣΤΟΥΓΕΝΝΑ2
|
||||
|
||||
REM [orthodoxeaster($Uy)+1] ΔΕΥΤΕΡΑ ΤΟΥ ΠΑΣΧΑ
|
||||
REM [orthodoxeaster($Uy)+1] MSG ΔΕΥΤΕΡΑ ΤΟΥ ΠΑΣΧΑ
|
||||
|
||||
|
||||
# May first is a national holiday except if Sunday, day of great week (week before easter) or Monday after easter, then
|
||||
|
||||
+35
-35
@@ -19,50 +19,50 @@ FSET _BackTwoSat(x, y) IIF(WKDAYNUM(_h2(x,y))!=6, _h2(x,y), _h2(x,y)-2)
|
||||
SET InIsrael VALUE("InIsrael", 0)
|
||||
SET Reform VALUE("Reform", 0)
|
||||
|
||||
[_h(1, "Tishrey")] ++4 MSG %"Rosh Hashana 1%" is %b.
|
||||
REM [_h(1, "Tishrey")] ++4 MSG %"Rosh Hashana 1%" is %b.
|
||||
|
||||
# No RH-2 or Tzom Gedalia in Reform
|
||||
IF !Reform
|
||||
[_h(2, "Tishrey")] ++4 MSG %"Rosh Hashana 2%" is %b.
|
||||
[_PastSat(3, "Tishrey")] ++4 MSG %"Tzom Gedalia%" is %b.
|
||||
REM [_h(2, "Tishrey")] ++4 MSG %"Rosh Hashana 2%" is %b.
|
||||
REM [_PastSat(3, "Tishrey")] ++4 MSG %"Tzom Gedalia%" is %b.
|
||||
ENDIF
|
||||
|
||||
[_h(10, "Tishrey")] ++4 MSG %"Yom Kippur%" is %b.
|
||||
[_h(15, "Tishrey")] ++4 MSG %"Sukkot 1%" is %b.
|
||||
REM [_h(10, "Tishrey")] ++4 MSG %"Yom Kippur%" is %b.
|
||||
REM [_h(15, "Tishrey")] ++4 MSG %"Sukkot 1%" is %b.
|
||||
|
||||
IF !InIsrael
|
||||
[_h(16, "Tishrey")] MSG %"Sukkot 2%"
|
||||
REM [_h(16, "Tishrey")] MSG %"Sukkot 2%"
|
||||
ENDIF
|
||||
|
||||
[_h(21, "Tishrey")] ++4 MSG %"Hoshana Rabba%" is %b.
|
||||
[_h(22, "Tishrey")] ++4 MSG %"Shemini Atzeret%" is %b.
|
||||
REM [_h(21, "Tishrey")] ++4 MSG %"Hoshana Rabba%" is %b.
|
||||
REM [_h(22, "Tishrey")] ++4 MSG %"Shemini Atzeret%" is %b.
|
||||
|
||||
IF InIsrael
|
||||
[_h(22, "Tishrey")] ++4 MSG %"Simchat Torah%" is %b.
|
||||
REM [_h(22, "Tishrey")] ++4 MSG %"Simchat Torah%" is %b.
|
||||
ELSE
|
||||
[_h(23, "Tishrey")] ++4 MSG %"Simchat Torah%" is %b.
|
||||
REM [_h(23, "Tishrey")] ++4 MSG %"Simchat Torah%" is %b.
|
||||
ENDIF
|
||||
|
||||
# Because Kislev can change length, we must be more careful about Chanukah
|
||||
FSET _chan(x) HEBDATE(24, "Kislev", $U-9)+x
|
||||
[_chan(1)] ++4 MSG %"Chanukah 1%" is %b.
|
||||
[_chan(2)] MSG %"Chanukah 2%"
|
||||
[_chan(3)] MSG %"Chanukah 3%"
|
||||
[_chan(4)] MSG %"Chanukah 4%"
|
||||
[_chan(5)] MSG %"Chanukah 5%"
|
||||
[_chan(6)] MSG %"Chanukah 6%"
|
||||
[_chan(7)] MSG %"Chanukah 7%"
|
||||
[_chan(8)] MSG %"Chanukah 8%"
|
||||
REM [_chan(1)] ++4 MSG %"Chanukah 1%" is %b.
|
||||
REM [_chan(2)] MSG %"Chanukah 2%"
|
||||
REM [_chan(3)] MSG %"Chanukah 3%"
|
||||
REM [_chan(4)] MSG %"Chanukah 4%"
|
||||
REM [_chan(5)] MSG %"Chanukah 5%"
|
||||
REM [_chan(6)] MSG %"Chanukah 6%"
|
||||
REM [_chan(7)] MSG %"Chanukah 7%"
|
||||
REM [_chan(8)] MSG %"Chanukah 8%"
|
||||
|
||||
# Not sure about Reform's position on the next one.
|
||||
IF !Reform
|
||||
# 10 Tevet will never be a Saturday, so whether or not to
|
||||
# move it is moot. (Thanks to Art Werschulz.)
|
||||
[_h(10, "Tevet")] MSG %"Tzom Tevet%" is %b.
|
||||
REM [_h(10, "Tevet")] MSG %"Tzom Tevet%" is %b.
|
||||
ENDIF
|
||||
|
||||
[_h(15, "Shvat")] ++4 MSG %"Tu B'Shvat%" is %b.
|
||||
[_h(14, "Adar A")] ++4 MSG %"Purim Katan%" is %b.
|
||||
REM [_h(15, "Shvat")] ++4 MSG %"Tu B'Shvat%" is %b.
|
||||
REM [_h(14, "Adar A")] ++4 MSG %"Purim Katan%" is %b.
|
||||
|
||||
# If Purim is on Sunday, then Fast of Esther is 11 Adar.
|
||||
IF WKDAYNUM(_h2(13, "Adar")) != 6
|
||||
@@ -70,39 +70,39 @@ IF WKDAYNUM(_h2(13, "Adar")) != 6
|
||||
ELSE
|
||||
REM [_h2(11, "Adar")] ++4 MSG %"Fast of Esther%" is %b.
|
||||
ENDIF
|
||||
[_h(14, "Adar")] ++4 MSG %"Purim%" is %b.
|
||||
[_h(15, "Nisan")] ++4 MSG %"Pesach%" is %b.
|
||||
REM [_h(14, "Adar")] ++4 MSG %"Purim%" is %b.
|
||||
REM [_h(15, "Nisan")] ++4 MSG %"Pesach%" is %b.
|
||||
|
||||
IF !InIsrael
|
||||
[_h(16, "Nisan")] MSG %"Pesach 2%"
|
||||
REM [_h(16, "Nisan")] MSG %"Pesach 2%"
|
||||
ENDIF
|
||||
|
||||
[_h(21, "Nisan")] MSG %"Pesach 7%"
|
||||
REM [_h(21, "Nisan")] MSG %"Pesach 7%"
|
||||
|
||||
IF !InIsrael && !Reform
|
||||
[_h(22, "Nisan")] MSG %"Pesach 8%"
|
||||
REM [_h(22, "Nisan")] MSG %"Pesach 8%"
|
||||
ENDIF
|
||||
|
||||
[_h(27, "Nisan")] ++4 MSG %"Yom HaShoah%" is %b.
|
||||
[_BackTwoFri(4, "Iyar")] ++4 MSG %"Yom HaZikaron%" is %b.
|
||||
[_BackTwoSat(5, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
|
||||
REM [_h(27, "Nisan")] ++4 MSG %"Yom HaShoah%" is %b.
|
||||
REM [_BackTwoFri(4, "Iyar")] ++4 MSG %"Yom HaZikaron%" is %b.
|
||||
REM [_BackTwoSat(5, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
|
||||
|
||||
# Not sure about Reform's position on Lag B'Omer
|
||||
IF !Reform
|
||||
[_h(18, "Iyar")] ++4 MSG %"Lag B'Omer%" is %b.
|
||||
REM [_h(18, "Iyar")] ++4 MSG %"Lag B'Omer%" is %b.
|
||||
ENDIF
|
||||
|
||||
[_h(28, "Iyar")] ++4 MSG %"Yom Yerushalayim%" is %b.
|
||||
[_h(6, "Sivan")] ++4 MSG %"Shavuot%" is %b.
|
||||
REM [_h(28, "Iyar")] ++4 MSG %"Yom Yerushalayim%" is %b.
|
||||
REM [_h(6, "Sivan")] ++4 MSG %"Shavuot%" is %b.
|
||||
|
||||
IF !InIsrael && !Reform
|
||||
[_h(7, "Sivan")] MSG %"Shavuot 2%"
|
||||
REM [_h(7, "Sivan")] MSG %"Shavuot 2%"
|
||||
ENDIF
|
||||
|
||||
# Fairly sure Reform Jews don't observe the next two
|
||||
IF !Reform
|
||||
# Tzom Tamuz and Tish'a B'Av are moved to Sunday if they normally
|
||||
# fall on a Saturday
|
||||
[_PastSat(17, "Tamuz")] ++4 MSG %"Tzom Tammuz%" is %b.
|
||||
[_PastSat(9, "Av")] ++4 MSG %"Tish'a B'Av%" is %b.
|
||||
REM [_PastSat(17, "Tamuz")] ++4 MSG %"Tzom Tammuz%" is %b.
|
||||
REM [_PastSat(9, "Av")] ++4 MSG %"Tish'a B'Av%" is %b.
|
||||
ENDIF
|
||||
|
||||
+3
-3
@@ -525,9 +525,9 @@ contains the back value. If the "back" value was \-n, the value will
|
||||
be positive; if it was \-\-n, the value will be negative.
|
||||
.TP
|
||||
.B delta \fIn\fR
|
||||
If the reminder contained a "delta" clause (\+n or \+\+n), this key
|
||||
contains the delta value. If the "delta" value was \+n, the value will
|
||||
be positive; if it was \+\+n, the value will be negative.
|
||||
If the reminder contained a "delta" clause (+n or ++n), this key
|
||||
contains the delta value. If the "delta" value was +n, the value will
|
||||
be positive; if it was ++n, the value will be negative.
|
||||
.TP
|
||||
.B rep \fIn\fR
|
||||
If the reminder contained a "repeat" clause (*n), this key contains
|
||||
|
||||
+88
-42
@@ -11,8 +11,8 @@ reminder or alarm can consist of a message sent to standard output, or
|
||||
a program to be executed.
|
||||
.PP
|
||||
If \fIfilename\fR is specified as a single dash '-', then \fBRemind\fR
|
||||
takes its input from standard input. This also implicitly enables
|
||||
the \fB\-o\fR option, described below.
|
||||
takes its input from standard input.
|
||||
|
||||
.PP
|
||||
If \fIfilename\fR happens to
|
||||
be a directory rather than a plain file, then \fBRemind\fR reads all of
|
||||
@@ -32,7 +32,8 @@ ignore them for now and skip to the section "REMINDER FILES".
|
||||
The \fB\-n\fR option causes \fBRemind\fR to print the \fBnext\fR occurrence
|
||||
of each reminder in a simple calendar format. You can sort this by
|
||||
date by piping the output through \fBsort(1)\fR. Note that the \fB\-n\fR
|
||||
option causes any \fB\-g\fR option to be \fIignored\fR.
|
||||
option causes any \fB\-g\fR option to be \fIignored\fR and also implicitly
|
||||
enables the \fB\-o\fR option.
|
||||
.TP
|
||||
.B \-j\fR[\fIn\fR]
|
||||
Runs \fBRemind\fR in "purge" mode to get rid of expired reminders.
|
||||
@@ -47,7 +48,7 @@ The \fB\-c\fR option causes \fBRemind\fR to produce a calendar that is
|
||||
sent to standard output. If you supply a number \fIn\fR, then a
|
||||
calendar will be generated for \fIn\fR months, starting with the
|
||||
current month. By default, a calendar for only the current month is
|
||||
produced.
|
||||
produced. This option implicitly enables the \fB\-o\fR option.
|
||||
.RS
|
||||
.PP
|
||||
You can precede \fIn\fR (if any) with a set of flags. The flags
|
||||
@@ -173,7 +174,7 @@ The \fB\-s\fR option is very similar to the \fB\-c\fR option, except
|
||||
that the output calendar is not formatted. It is listed in a "simple
|
||||
format" that can be used as input for more sophisticated calendar-drawing
|
||||
programs. If \fIn\fR starts with "+", then it is interpreted as a number
|
||||
of weeks.
|
||||
of weeks. This option also implicitly enables the \fB\-o\fR option.
|
||||
|
||||
If you immediately follow the \fBs\fR with the letter
|
||||
\fBa\fR, then \fBRemind\fR displays reminders on the calendar on the
|
||||
@@ -200,6 +201,9 @@ letter with this option, then the normal calendar-mode substitution filter
|
||||
is disabled and the %"...%" sequences are preserved in the output.
|
||||
.RS
|
||||
.PP
|
||||
The \fB\-p\fR, \fB\-pp\fR and \fB\-ppp\fR options implicitly enable
|
||||
the \fB\-o\fR option.
|
||||
.PP
|
||||
Note that the \fB\-pp\fR or \fB\-ppp\fR options also enable the \fB\-l\fR
|
||||
option.
|
||||
.RE
|
||||
@@ -223,7 +227,11 @@ error, and to print a security message if a script tests the
|
||||
$RunOff system variable.
|
||||
.TP
|
||||
.B \-o
|
||||
The \fB\-o\fR option causes \fBRemind\fR to ignore all \fBONCE\fR directives.
|
||||
The \fB\-o\fR option causes \fBRemind\fR to ignore all \fBONCE\fR
|
||||
directives. Note that \fBONCE\fR is also ignored if any of the
|
||||
\fB\-c\fR, \fB\-n\fR, \fB\-p\fR, or \fB\-s\fR options is used, if a
|
||||
repetition factor \fB*n\fR is used, or if a date other than today's
|
||||
date is specified on the command-line.
|
||||
.TP
|
||||
.B \-t
|
||||
The \fB\-t\fR option causes \fBRemind\fR to trigger all non-expired reminders,
|
||||
@@ -232,13 +240,13 @@ regardless of the \fIdelta\fR supplied for each reminder.
|
||||
.B \-t\fR\fIn\fR
|
||||
If you supply a number \fIn\fR after the \fB\-t\fR option, then
|
||||
\fBRemind\fR pretends that echo \fBREM\fR command has a delta
|
||||
of \+\+\fIn\fR, regardless of any existing delta.
|
||||
of ++\fIn\fR, regardless of any existing delta.
|
||||
.TP
|
||||
.B \-tz\fR
|
||||
If you supply the letter \fBz\fR after the \fB\-t\fR option, then
|
||||
\fBRemind\fR sets all REM statements' deltas to zero, regardless of the
|
||||
value supplied in the REM statement itself. In effect, this disables
|
||||
all deltas of the form \fB\+\fIn\fR and \fB\+\+\fIn\fR.
|
||||
all deltas of the form \fB+\fIn\fR and \fB++\fIn\fR.
|
||||
.TP
|
||||
.B \-tt\fR[\fIn\fR]
|
||||
The \fB-tt\fR option causes \fBRemind\fR to assume a default delta of
|
||||
@@ -455,7 +463,7 @@ information.
|
||||
\fBRemind\fR supports the following long options, which \fIare\fR
|
||||
case-sensitive:
|
||||
|
||||
.RP
|
||||
.PP
|
||||
.B \-\-version
|
||||
The \fB\-\-version\fR option causes \fBRemind\fR to print its version number
|
||||
to standard output and then exit.
|
||||
@@ -547,12 +555,15 @@ Its syntax is:
|
||||
The parts of the \fBREM\fR command can be specified in any order, except
|
||||
that the \fIbody\fR must come immediately after the \fBMSG\fR,
|
||||
\fBRUN\fR, \fBCAL\fR, \fBPS\fR, \fBPSFILE\fR or \fBSATISFY\fR keyword.
|
||||
The portion of the \fBREM\fR command before the \fBMSG\fR, \fBMSF\fR
|
||||
\fBRUN\fR, \fBCAL\fR or \fBSATISFY\fR clause is called a
|
||||
\fItrigger\fR.
|
||||
.PP
|
||||
The \fBREM\fR token is optional, providing that the remainder
|
||||
of the command cannot be mistaken for another \fBRemind\fR command
|
||||
such as \fBOMIT\fR or \fBRUN\fR. The portion of the \fBREM\fR command
|
||||
before the \fBMSG\fR, \fBMSF\fR \fBRUN\fR, \fBCAL\fR or \fBSATISFY\fR clause
|
||||
is called a \fItrigger\fR.
|
||||
In earlier versions of \fBRemind\fR, the \fBREM\fR token was optional
|
||||
providing that the remainder of the command cannot be mistaken for
|
||||
another \fBRemind\fR command. However, this use is deprecated and will
|
||||
now cause a warning to be issued. All of your reminder lines should
|
||||
be written to start with the REM command.
|
||||
.PP
|
||||
.B "MSG, MSF, RUN, CAL, SPECIAL, PS and PSFILE"
|
||||
.PP
|
||||
@@ -565,14 +576,16 @@ used the \fB\-k\fR command-line option, then \fBMSG\fR-type reminders are
|
||||
passed to the appropriate program. Note that the options \fB\-c\fR,
|
||||
\fB\-s\fR, \fB\-p\fR and \fB\-n\fR disable the \fB\-k\fR option.
|
||||
.PP
|
||||
Note that you can omit the reminder type, in which case it
|
||||
defaults to \fBMSG\fR. So you can write:
|
||||
Earlier versions of \fBRemind\fR let you omit the reminder type,
|
||||
in which case it defaulted to \fBMSG\fR. However, this usage is
|
||||
deprecated and will cause a warning. Something like:
|
||||
.PP
|
||||
.nf
|
||||
6 January Dianne's Birthday
|
||||
REM 6 January Dianne's Birthday
|
||||
.fi
|
||||
.PP
|
||||
although this is not recommended.
|
||||
will issue the warning "Missing REM type; assuming MSG"
|
||||
|
||||
.PP
|
||||
The \fBMSF\fR keyword is almost the same as the \fBMSG\fR keyword,
|
||||
except that the reminder is formatted to fit into a paragraph-like
|
||||
@@ -1019,26 +1032,35 @@ overrides that.
|
||||
.B THE ONCE KEYWORD
|
||||
.PP
|
||||
Sometimes, it is necessary to ensure that reminders are run only once
|
||||
on a given day. For example, if you have a reminder that makes a backup
|
||||
of your files every Friday:
|
||||
on a given day. For example, compare the following two reminders:
|
||||
.PP
|
||||
.nf
|
||||
REM Fri RUN do_backup
|
||||
REM Fri RUN do_backup
|
||||
REM Fri ONCE RUN do_backup
|
||||
.fi
|
||||
.PP
|
||||
(Here, \fIdo_backup\fR is assumed to be a program or shell script that
|
||||
does the work.) If you run \fBRemind\fR from your .login script, for
|
||||
example, and log in several times per day, the \fIdo_backup\fR program
|
||||
will be run each time you log in. If, however, you use the \fBONCE\fR
|
||||
keyword in the reminder, the \fBRemind\fR checks the last access date of
|
||||
the reminder script. If it is the same as the current date, \fBRemind\fR
|
||||
assumes that it has already been run, and will not issue reminders containing
|
||||
the \fBONCE\fR keyword.
|
||||
The first will be run every time you invoke \fBRemind\fR on a Friday,
|
||||
whereas the second will be run only the first time you invoke
|
||||
\fBRemind\fR on a given Friday.
|
||||
.PP
|
||||
If you run \fBRemind\fR from your .login script, for example, and log
|
||||
in several times per day, the \fIdo_backup\fR program in the first
|
||||
reminder will be run each time you log in. If, however, you use the
|
||||
\fBONCE\fR keyword in the reminder, the \fBRemind\fR checks the last
|
||||
access date of the reminder script. If it is the same as the current
|
||||
date, \fBRemind\fR assumes that it has already been run, and will not
|
||||
issue reminders containing the \fBONCE\fR keyword.
|
||||
.PP
|
||||
Note that if you view or edit your reminder script, the last access date
|
||||
will be updated, and the \fBONCE\fR keyword will not operate properly.
|
||||
You can fix this by setting a timestamp file for \fBRemind\fR to track
|
||||
the last-run date; see the documentation of \fB$OnceFile\fR in the
|
||||
\fBSYSTEM VARIABLES\fR section. If you use standard input as your
|
||||
\fBRemind\fR input file, then you \fImust\fR use \fB$OnceFile\fR for the
|
||||
\fBONCE\fR keyword to work properly.
|
||||
.PP
|
||||
If you start \fBRemind\fR with the \fB\-o\fR option, then the \fBONCE\fR
|
||||
keyword will be ignored.
|
||||
keyword will be ignored and any \fB$OnceFile\fR will be ignored.
|
||||
.PP
|
||||
.B LOCALLY OMITTING WEEKDAYS
|
||||
.PP
|
||||
@@ -1682,7 +1704,7 @@ or:
|
||||
The \fBOMIT\fR command is used to "globally" omit certain days
|
||||
(usually holidays). These globally-omitted days are skipped by the
|
||||
"\-" and "+" forms of \fIback\fR and \fIdelta\fR, but not by the
|
||||
"\-\-" and "\+\+" forms. Some examples:
|
||||
"\-\-" and "++" forms. Some examples:
|
||||
.PP
|
||||
.nf
|
||||
OMIT Saturday Sunday
|
||||
@@ -1978,6 +2000,10 @@ your INCLUDECMD uses expression-pasting that results in differences depending
|
||||
on the value of \fBtoday()\fR, then each \fIunique\fR version of the
|
||||
command will be executed once.
|
||||
.PP
|
||||
If a given reminder file contains more than one identical
|
||||
\fBINCLUDECMD\fR, only the first one will actually be executed. All
|
||||
subsequent identical ones will use the cached output from the first one.
|
||||
.PP
|
||||
|
||||
.SH THE BANNER COMMAND
|
||||
.PP
|
||||
@@ -2532,9 +2558,9 @@ truncated - the width limit will be ignored.
|
||||
If non-zero, then the \fB\-h\fR option was supplied on the command line.
|
||||
.TP
|
||||
.B $IgnoreOnce (read-only)
|
||||
If non-zero, then the \fB\-o\fR option was supplied on the command line,
|
||||
or a date different from today's true date was supplied. If non-zero,
|
||||
then \fBONCE\fR directives will be ignored.
|
||||
If non-zero, then the \fB\-o\fR option was supplied on the command
|
||||
line, or implicitly enabled for some other reason. In this case,
|
||||
\fBONCE\fR directives will be ignored.
|
||||
.TP
|
||||
.B $InfDelta (read-only)
|
||||
If non-zero, then the \fB\-t\fR option was supplied on the command line,
|
||||
@@ -2691,6 +2717,20 @@ by \fBREM\fR commands; triggers in \fBIFTRIG\fR commands do
|
||||
not affect it.
|
||||
.RE
|
||||
.TP
|
||||
.B $OnceFile (STRING type)
|
||||
If you set this variable to a non-empty string, then rather than using
|
||||
the file access date to determine whether or not to run a ONCE-type
|
||||
reminder, \fBRemind\fR will maintain a timestamp in the file \fB$OnceFile\fR.
|
||||
This is more reliable than using the access date of the reminder file.
|
||||
.RS
|
||||
.PP
|
||||
If \fB$OnceFile\fR does not exist, then it will be created the first time
|
||||
a \fBONCE\fR keyword is processed. The file must be writable by the
|
||||
current user. If you try to set \fB$OnceFile\fR \fIafter\fR a \fBONCE\fR
|
||||
reminder has already been processed, \fBRemind\fR will issue a warning
|
||||
and ignore the attempt to set \fB$OnceFile\fR.
|
||||
.RE
|
||||
.TP
|
||||
.B $ParseUntriggered
|
||||
A flag indicating whether or not \fBRemind\fR should fully parse \fBREM\fR
|
||||
statements that are not triggered. 0 means to skip parsing them and 1
|
||||
@@ -2869,18 +2909,25 @@ is supplied, only the date component is used.
|
||||
Returns the time of "astronomical twilight" on the specified \fIdate\fR. If
|
||||
\fIdate\fR is omitted, defaults to \fBtoday()\fR.
|
||||
.TP
|
||||
.B ampm(tq_time [,s_am [,s_pm]])
|
||||
.B ampm(tq_time [,s_am [,s_pm [,i_lz]]])
|
||||
Returns a \fBSTRING\fR that is the result of converting \fItime\fR
|
||||
(which is either a \fBTIME\fR or a \fBDATETIME\fR object) to "AM/PM"
|
||||
format. The optional arguments \fIam\fR and \fIpm\fR are the strings
|
||||
to append in the AM and PM case, respectively; they default to "AM"
|
||||
and "PM". The function obeys the system variables $DateSep,
|
||||
$TimeSep and $DateTimeSep when formatting its output. For example:
|
||||
and "PM". The optional argument \fIlz\fR specifies whether or not
|
||||
the hour should be padded to two digits with a leading zero. If \fIlz\fR is
|
||||
zero, then a leading 0 is not added; otherwise, the hour is padded out to
|
||||
two digits with a leading zero. If not supplied, \fIlz\fR defaults to zero.
|
||||
.RS
|
||||
.PP
|
||||
The function obeys the system variables $DateSep, $TimeSep and
|
||||
$DateTimeSep when formatting its output. Here are some examples of
|
||||
its output:
|
||||
.PP
|
||||
.nf
|
||||
ampm(0:22) returns "12:22AM"
|
||||
ampm(17:45, "am", "pm") returns "5:45pm"
|
||||
ampm(17:45, "am", "pm", 1) returns "05:45pm"
|
||||
ampm('2020-03-14@21:34') returns "2020-03-14@9:34PM"
|
||||
.fi
|
||||
.PP
|
||||
@@ -4462,11 +4509,10 @@ The above sequence sets y to 1, which is the global value of x.
|
||||
.TP
|
||||
o
|
||||
User-defined functions may call other functions, including other user-defined
|
||||
functions. However, recursive calls are not allowed.
|
||||
.TP
|
||||
o
|
||||
User-defined functions are not syntax-checked when they are defined; parsing
|
||||
occurs only when they are called.
|
||||
functions. Recursive calls are allowed, but they must terminate (for
|
||||
example, by using a short-circuit operator or function that breaks the
|
||||
recursion) or an error will result after a certain maximum number of
|
||||
recursive calls (by default, 1000.)
|
||||
.TP
|
||||
o
|
||||
If a user-defined function has the same name as a built-in function,
|
||||
|
||||
+1
-1
@@ -266,7 +266,7 @@ Useful strings might be "emacs +%d %s" or "gvim +%d %s"
|
||||
.TP
|
||||
.B Extra Argument for Remind
|
||||
This specifies any extra arguments that should be passed to Remind
|
||||
when \BTkRemind\fR invokes \fBremind\fR. Unless you know what
|
||||
when \fBTkRemind\fR invokes \fBremind\fR. Unless you know what
|
||||
you are doing, leave this blank.
|
||||
|
||||
.TP
|
||||
|
||||
+86
-6
@@ -60,7 +60,9 @@ my $settings = {
|
||||
margin_bottom => 36,
|
||||
margin_left => 36,
|
||||
margin_right => 36,
|
||||
|
||||
svg => 0,
|
||||
ps => 0,
|
||||
eps => 0,
|
||||
verbose => 0,
|
||||
};
|
||||
|
||||
@@ -80,6 +82,9 @@ Options:
|
||||
|
||||
--landscape, -l Print in landscape orientation
|
||||
--small-calendars=N Choose location for small calendars
|
||||
--svg Output SVG instead of PDF
|
||||
--ps Output PostScript instead of PDF
|
||||
--eps Output encapsulated PostScript instead of PDF
|
||||
-cN Synonym for --small-calendars=N
|
||||
--left-numbers, -x Print day numbers on the left
|
||||
--fill-page, -e Fill the entire page
|
||||
@@ -112,6 +117,9 @@ Getopt::Long::Configure('bundling_values');
|
||||
my $ret = GetOptions('landscape|l' => \$settings->{landscape},
|
||||
'small-calendars|c=i' => \$settings->{small_calendars},
|
||||
'left-numbers|x' => \$settings->{numbers_on_left},
|
||||
'svg' => \$settings->{svg},
|
||||
'ps' => \$settings->{ps},
|
||||
'eps' => \$settings->{eps},
|
||||
'fill-page|e' => \$settings->{fill_entire_page},
|
||||
'media|m=s' => \$settings->{media},
|
||||
'width|w=i' => \$settings->{width},
|
||||
@@ -176,6 +184,17 @@ if ($settings->{landscape}) {
|
||||
$settings->{height} = $tmp;
|
||||
}
|
||||
|
||||
if ($settings->{svg} && $settings->{ps} ||
|
||||
$settings->{svg} && $settings->{eps} ||
|
||||
$settings->{eps} && $settings->{ps}) {
|
||||
print STDERR "Only one of --eps, --ps or --svg may be used.\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if ($settings->{eps}) {
|
||||
$settings->{ps} = 1;
|
||||
}
|
||||
|
||||
# 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";
|
||||
@@ -187,8 +206,25 @@ my $done_one = 0;
|
||||
|
||||
my $errored_out = 0;
|
||||
|
||||
my $surface = Cairo::PdfSurface->create_for_stream(sub { print $_[1] unless $errored_out; }, undef,
|
||||
$settings->{width}, $settings->{height});
|
||||
my $surface;
|
||||
if ($settings->{svg}) {
|
||||
$surface = Cairo::SvgSurface->create_for_stream(sub { print $_[1] unless $errored_out; }, undef,
|
||||
$settings->{width}, $settings->{height});
|
||||
} elsif ($settings->{ps}) {
|
||||
if ($settings->{landscape}) {
|
||||
$surface = Cairo::PsSurface->create_for_stream(sub { print $_[1] unless $errored_out; }, undef,
|
||||
$settings->{height}, $settings->{width});
|
||||
} else {
|
||||
$surface = Cairo::PsSurface->create_for_stream(sub { print $_[1] unless $errored_out; }, undef,
|
||||
$settings->{width}, $settings->{height});
|
||||
}
|
||||
if ($settings->{eps}) {
|
||||
$surface->set_eps(1);
|
||||
}
|
||||
} else {
|
||||
$surface = Cairo::PdfSurface->create_for_stream(sub { print $_[1] unless $errored_out; }, undef,
|
||||
$settings->{width}, $settings->{height});
|
||||
}
|
||||
|
||||
# set_metadata not available in older versions of Cairo
|
||||
eval { $surface->set_metadata('title', 'Calendar'); };
|
||||
@@ -196,10 +232,26 @@ eval { $surface->set_metadata('author', 'Remind (https://dianne.skoll.ca/project
|
||||
eval { $surface->set_metadata('creator', 'rem2pdf (https://dianne.skoll.ca/projects/remind/)'); };
|
||||
eval { $surface->set_metadata('subject', 'Calendar'); };
|
||||
|
||||
if ($settings->{ps}) {
|
||||
$surface->dsc_comment('%%Title: Calendar');
|
||||
$surface->dsc_comment('%%Producer: rem2pdf (https://dianne.skoll.ca/projects/remind/)');
|
||||
$surface->dsc_comment('%%PageOrientation: ' . (($settings->{landscape}) ? 'Landscape' : 'Portrait'));
|
||||
$surface->dsc_begin_setup();
|
||||
}
|
||||
|
||||
my $cr = Cairo::Context->create($surface);
|
||||
$cr->set_line_width($settings->{line_thickness});
|
||||
if ($settings->{ps} && $settings->{landscape}) {
|
||||
$cr->translate(0, $settings->{width});
|
||||
$cr->rotate(-1.5707963267949); # Rotate -90 degrees
|
||||
}
|
||||
|
||||
my $warned = 0;
|
||||
while(1) {
|
||||
if ($settings->{ps}) {
|
||||
$surface->dsc_begin_page_setup();
|
||||
$surface->dsc_comment('%%PageOrientation: ' . (($settings->{landscape}) ? 'Landscape' : 'Portrait'));
|
||||
}
|
||||
my ($obj, $err) = Remind::PDF->create_from_stream(*STDIN,
|
||||
{color => 1,
|
||||
shade => 1,
|
||||
@@ -215,8 +267,15 @@ while(1) {
|
||||
}
|
||||
last;
|
||||
}
|
||||
$done_one = 1;
|
||||
if (($settings->{eps} || $settings->{svg}) && $done_one) {
|
||||
if (!$warned) {
|
||||
print STDERR "WARNING: --eps and --svg can only output one page; ignoring subsequent\nmonths in a multi-month calendar.\n";
|
||||
$warned = 1;
|
||||
}
|
||||
next;
|
||||
}
|
||||
$obj->render($cr, $settings);
|
||||
$done_one = 1;
|
||||
}
|
||||
|
||||
$surface->finish();
|
||||
@@ -273,17 +332,22 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
rem2pdf - draw a PDF calendar from Remind output
|
||||
rem2pdf - draw a PDF, SVG or PostScript calendar from Remind output
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
remind -pp [options] file | rem2pdf [options] > output.pdf
|
||||
remind -pp [options] file | rem2pdf --svg [options] > output.svg
|
||||
remind -pp [options] file | rem2pdf --ps [options] > output.ps
|
||||
remind -pp [options] file | rem2pdf --eps [options] > output.eps
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
B<rem2pdf> reads the standard input, which should be the results of
|
||||
running B<remind> with the B<-p>, B<-pp> or B<-ppp> options. It emits
|
||||
PDF code that draws a calendar to standard output.
|
||||
PDF, SVG or PostScript code that draws a calendar to standard output. (The
|
||||
addition of support for SVG and PostScript means that rem2pdf is increasingly
|
||||
misnamed...)
|
||||
|
||||
B<rem2pdf> uses the Pango text formatting library (L<https://pango.gnome.org/>)
|
||||
and the Cairo graphics library (L<https://www.cairographics.org/>) to produce
|
||||
@@ -298,6 +362,22 @@ output at all.
|
||||
|
||||
=over
|
||||
|
||||
=item --ps
|
||||
|
||||
Output PostScript instead of PDF.
|
||||
|
||||
=item --eps
|
||||
|
||||
Output Encapsulated PostScript instead of PDF. In this case, you
|
||||
should feed C<rem2pdf> only one month's worth of calendar data,
|
||||
because it cannot create a multi-page encapsulated PostScript file.
|
||||
|
||||
=item --svg
|
||||
|
||||
Output SVG instead of PDF. In this case, you should feed C<rem2pdf>
|
||||
only one month's worth of calendar data, because it cannot create
|
||||
a multi-page SVG file.
|
||||
|
||||
=item --landscape, -l
|
||||
|
||||
Print the calendar in landscape orientation. Essentially, this swaps
|
||||
|
||||
@@ -1008,7 +1008,17 @@ as were read from the C<remind -ppp> stream
|
||||
sub render
|
||||
{
|
||||
my ($self, $cr, $settings) = @_;
|
||||
my $done = 0;
|
||||
my $warned = 0;
|
||||
foreach my $e (@{$self->{entries}}) {
|
||||
if ($settings->{svg} && $done) {
|
||||
if (!$warned) {
|
||||
print STDERR "WARNING: --svg can only output one page; ignoring subsequent\nmonths in a multi-month calendar.\n";
|
||||
$warned = 1;
|
||||
}
|
||||
next;
|
||||
}
|
||||
$done = 1;
|
||||
$e->render($cr, $settings);
|
||||
}
|
||||
}
|
||||
|
||||
+9
-5
@@ -319,7 +319,7 @@ set Option(PrintMargins) 36pt
|
||||
set OptDescr(PrintSmallCalendars) "(0/1) If 1, print small calendars in PostScript output"
|
||||
set Option(PrintSmallCalendars) 1
|
||||
|
||||
set OptDescr(PrintFormat) "Print format: pdf or ps"
|
||||
set OptDescr(PrintFormat) "Print format: pdf, ps or ps1 - ps1 means PostScript using rem2pdf"
|
||||
set Option(PrintFormat) ps
|
||||
|
||||
set WarningHeaders [list "# Lines starting with REM TAG TKTAGnnn ... were created by tkremind" "# Do not edit them by hand or results may be unpredictable."]
|
||||
@@ -1333,7 +1333,8 @@ proc DoPrint {} {
|
||||
frame .p.ff -relief sunken -bd 2
|
||||
label .p.format -text "Output Format:"
|
||||
radiobutton .p.pdf -text "PDF" -variable Option(PrintFormat) -value pdf
|
||||
radiobutton .p.ps -text "PostScript" -variable Option(PrintFormat) -value ps
|
||||
radiobutton .p.ps -text "PostScript (using rem2ps)" -variable Option(PrintFormat) -value ps
|
||||
radiobutton .p.ps1 -text "PostScript (using rem2pdf)" -variable Option(PrintFormat) -value ps1
|
||||
}
|
||||
|
||||
label .p.size -text "Paper Size:"
|
||||
@@ -1350,7 +1351,7 @@ proc DoPrint {} {
|
||||
radiobutton .p.portrait -text "Portrait" -variable Option(PrintOrient) -value portrait
|
||||
|
||||
checkbutton .p.fill -text "Fill page" -variable Option(PrintFill)
|
||||
checkbutton .p.wrap -text "Use at most 5 rows (PDF only)" -variable Option(WrapCal)
|
||||
checkbutton .p.wrap -text "Use at most 5 rows (rem2pdf only)" -variable Option(WrapCal)
|
||||
checkbutton .p.right -text "Day numbers at top-right" -variable Option(PrintDaysRight)
|
||||
checkbutton .p.encoding -text "ISO 8859-1 PostScript encoding" -variable Option(PrintEncoding)
|
||||
checkbutton .p.calendars -text "Print small calendars" -variable Option(PrintSmallCalendars)
|
||||
@@ -1374,7 +1375,7 @@ proc DoPrint {} {
|
||||
pack .p.tofile .p.filename .p.browse -in .p.f11 -side left -fill none -expand 0 -anchor w
|
||||
pack .p.tocmd .p.command -in .p.f12 -side left -fill none -expand 0 -anchor w
|
||||
if { $HaveRem2PDF } {
|
||||
pack .p.format .p.pdf .p.ps -in .p.ff -side top -fill none -expand 0 -anchor w
|
||||
pack .p.format .p.pdf .p.ps .p.ps1 -in .p.ff -side top -fill none -expand 0 -anchor w
|
||||
}
|
||||
pack .p.size .p.letter .p.a4 -in .p.f2 -side top -fill none -expand 0 -anchor w
|
||||
pack .p.margin .p.24pt .p.36pt .p.48pt -in .p.f2a -side top -anchor w -fill none -expand 0
|
||||
@@ -1422,6 +1423,9 @@ proc DoPrint {} {
|
||||
if {$HaveRem2PDF && $Option(PrintFormat) == "pdf"} {
|
||||
set p [regsub @EXTRA@ $PSCmd "-itkpdf=1 $Option(ExtraRemindArgs)"]
|
||||
set cmd "$p 1 [lindex $MonthNames $CurMonth] $CurYear | $Rem2PDF"
|
||||
} elseif {$HaveRem2PDF && $Option(PrintFormat) == "ps1"} {
|
||||
set p [regsub @EXTRA@ $PSCmd "-itkpdf=1 $Option(ExtraRemindArgs)"]
|
||||
set cmd "$p 1 [lindex $MonthNames $CurMonth] $CurYear | $Rem2PDF --ps"
|
||||
} else {
|
||||
set p [regsub @EXTRA@ $PSCmd $Option(ExtraRemindArgs)]
|
||||
set cmd "$p 1 [lindex $MonthNames $CurMonth] $CurYear | $Rem2PS"
|
||||
@@ -1463,7 +1467,7 @@ proc DoPrint {} {
|
||||
}
|
||||
|
||||
if {$Option(WrapCal)} {
|
||||
if {$Option(PrintFormat) == "pdf"} {
|
||||
if {$Option(PrintFormat) == "pdf" || $Option(PrintFormat) == "ps1"} {
|
||||
append cmd " --wrap"
|
||||
}
|
||||
}
|
||||
|
||||
+4
-1
@@ -1683,7 +1683,10 @@ static void GenerateCalEntries(int col)
|
||||
/* Note: Since the parser hasn't been used yet, we don't */
|
||||
/* need to destroy it here. */
|
||||
|
||||
default: CreateParser(CurLine, &p);
|
||||
default:
|
||||
Wprint("Unrecognized command; interpreting as REM");
|
||||
WarnedAboutImplicit = 1;
|
||||
CreateParser(CurLine, &p);
|
||||
r=DoCalRem(&p, col);
|
||||
break;
|
||||
}
|
||||
|
||||
+1
-17
@@ -20,7 +20,7 @@
|
||||
/* western hemisphere. */
|
||||
/* */
|
||||
/* The default values are initially set to the city hall in Ottawa, */
|
||||
/* Ontario, Canada. */
|
||||
/* Ontario, Canada. */
|
||||
/*---------------------------------------------------------------------*/
|
||||
#define DEFAULT_LATITUDE 45.420556
|
||||
#define DEFAULT_LONGITUDE -75.689722
|
||||
@@ -68,12 +68,6 @@
|
||||
/**********************************************************************/
|
||||
/**********************************************************************/
|
||||
|
||||
/*---------------------------------------------------------------------*/
|
||||
/* WANT_SHELL_ESCAPING: Define this if you want special shell */
|
||||
/* characters to be escaped with a backslash for the -k option. */
|
||||
/*---------------------------------------------------------------------*/
|
||||
#define WANT_SHELL_ESCAPING 1
|
||||
|
||||
/*---------------------------------------------------------------------*/
|
||||
/* BASE: The base year for date calculation. NOTE! January 1 of the */
|
||||
/* base year MUST be a Monday, else Remind will not work! */
|
||||
@@ -109,16 +103,6 @@
|
||||
/*---------------------------------------------------------------------*/
|
||||
#define MAX_STR_LEN 65535
|
||||
|
||||
/*---------------------------------------------------------------------*/
|
||||
/* OP_STACK_SIZE: The size of the operator stack for expr. parsing */
|
||||
/*---------------------------------------------------------------------*/
|
||||
#define OP_STACK_SIZE 100
|
||||
|
||||
/*---------------------------------------------------------------------*/
|
||||
/* VAL_STACK_SIZE: The size of the operand stack for expr. parsing */
|
||||
/*---------------------------------------------------------------------*/
|
||||
#define VAL_STACK_SIZE 100
|
||||
|
||||
/*---------------------------------------------------------------------*/
|
||||
/* INCLUDE_NEST: How many nested INCLUDES do we handle? */
|
||||
/*---------------------------------------------------------------------*/
|
||||
|
||||
+1
-17
@@ -20,7 +20,7 @@
|
||||
/* western hemisphere. */
|
||||
/* */
|
||||
/* The default values are initially set to the city hall in Ottawa, */
|
||||
/* Ontario, Canada. */
|
||||
/* Ontario, Canada. */
|
||||
/*---------------------------------------------------------------------*/
|
||||
#define DEFAULT_LATITUDE 45.420556
|
||||
#define DEFAULT_LONGITUDE -75.689722
|
||||
@@ -68,12 +68,6 @@
|
||||
/**********************************************************************/
|
||||
/**********************************************************************/
|
||||
|
||||
/*---------------------------------------------------------------------*/
|
||||
/* WANT_SHELL_ESCAPING: Define this if you want special shell */
|
||||
/* characters to be escaped with a backslash for the -k option. */
|
||||
/*---------------------------------------------------------------------*/
|
||||
#define WANT_SHELL_ESCAPING 1
|
||||
|
||||
/*---------------------------------------------------------------------*/
|
||||
/* BASE: The base year for date calculation. NOTE! January 1 of the */
|
||||
/* base year MUST be a Monday, else Remind will not work! */
|
||||
@@ -109,16 +103,6 @@
|
||||
/*---------------------------------------------------------------------*/
|
||||
#define MAX_STR_LEN 65535
|
||||
|
||||
/*---------------------------------------------------------------------*/
|
||||
/* OP_STACK_SIZE: The size of the operator stack for expr. parsing */
|
||||
/*---------------------------------------------------------------------*/
|
||||
#define OP_STACK_SIZE 100
|
||||
|
||||
/*---------------------------------------------------------------------*/
|
||||
/* VAL_STACK_SIZE: The size of the operand stack for expr. parsing */
|
||||
/*---------------------------------------------------------------------*/
|
||||
#define VAL_STACK_SIZE 100
|
||||
|
||||
/*---------------------------------------------------------------------*/
|
||||
/* INCLUDE_NEST: How many nested INCLUDES do we handle? */
|
||||
/*---------------------------------------------------------------------*/
|
||||
|
||||
+6
-2
@@ -182,7 +182,7 @@ int DoRem(ParsePtr p)
|
||||
if (dse == DSEToday &&
|
||||
!(!IgnoreOnce &&
|
||||
trig.once != NO_ONCE &&
|
||||
FileAccessDate == DSEToday))
|
||||
GetOnceDate() == DSEToday))
|
||||
QueueReminder(p, &trig, &tim, trig.sched);
|
||||
/* If we're in daemon mode, do nothing over here */
|
||||
if (Daemon) {
|
||||
@@ -540,6 +540,10 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
|
||||
DBufFree(&buf);
|
||||
trig->typ = MSG_TYPE;
|
||||
if (s->isnested) return E_CANT_NEST_RTYPE;
|
||||
if (!WarnedAboutImplicit) {
|
||||
Wprint("Missing REM type; assuming MSG");
|
||||
WarnedAboutImplicit = 1;
|
||||
}
|
||||
parsing = 0;
|
||||
break;
|
||||
}
|
||||
@@ -1191,7 +1195,7 @@ int ShouldTriggerReminder(Trigger *t, TimeTrig *tim, int dse, int *err)
|
||||
*err = 0;
|
||||
|
||||
/* Handle the ONCE modifier in the reminder. */
|
||||
if (!IgnoreOnce && t->once !=NO_ONCE && FileAccessDate == DSEToday)
|
||||
if (!IgnoreOnce && t->once !=NO_ONCE && GetOnceDate() == DSEToday)
|
||||
return 0;
|
||||
|
||||
if (dse < DSEToday) return 0;
|
||||
|
||||
+2
-1
@@ -13,7 +13,6 @@
|
||||
|
||||
#include "config.h"
|
||||
#include "types.h"
|
||||
#define L_IN_DOSUBST
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
@@ -141,6 +140,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int dse,
|
||||
} else {
|
||||
r = -1;
|
||||
}
|
||||
DestroyValue(v);
|
||||
} else {
|
||||
Eprint("%s", ErrMsg[r]);
|
||||
}
|
||||
@@ -165,6 +165,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int dse,
|
||||
} else {
|
||||
r = -1;
|
||||
}
|
||||
DestroyValue(v);
|
||||
} else {
|
||||
Eprint("%s", ErrMsg[r]);
|
||||
}
|
||||
|
||||
+34
-7
@@ -39,6 +39,7 @@
|
||||
6) N_USER_FUNC: A reference to a user-defined function
|
||||
7) N_OPERATOR: A reference to an operator such as "+" or "&&"
|
||||
8) N_ERROR: A node resulting from a parse error
|
||||
9) N_SHORT_STR: A string constant short enough to store in u.name
|
||||
|
||||
Additional types are N_SHORT_VAR, N_SHORT_SYSVAR, and N_SHORT_USER_FUNC
|
||||
which behave identically to N_VARIABLE, N_SYSVAR and N_USER_FUNC
|
||||
@@ -167,8 +168,8 @@ static expr_node *expr_node_free_list = NULL;
|
||||
#define STACK_ARGS_MAX 5
|
||||
|
||||
/* Maximum parse level before we bail (to avoid SEGV from filling stack)*/
|
||||
|
||||
#define MAX_PARSE_LEVEL 2000
|
||||
|
||||
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)
|
||||
|
||||
@@ -198,7 +199,6 @@ static UserFunc *CurrentUserFunc = NULL;
|
||||
/* How many expr_node objects to allocate at a time */
|
||||
#define ALLOC_CHUNK 64
|
||||
|
||||
|
||||
/***************************************************************/
|
||||
/* */
|
||||
/* alloc_expr_node - allocate an expr_node object */
|
||||
@@ -585,7 +585,7 @@ debug_exit_userfunc(expr_node *node, Value *ans, int r, Value *locals, int nargs
|
||||
/* eval_userfunc - evaluate a user-defined function */
|
||||
/* */
|
||||
/* This function sets up a local value array by evaluating */
|
||||
/* all of its children, and then evaluated the expr_node */
|
||||
/* all of its children, and then evaluates the expr_node */
|
||||
/* tree associated with the user-defined function. */
|
||||
/* */
|
||||
/***************************************************************/
|
||||
@@ -729,10 +729,26 @@ evaluate_expression(expr_node *node, Value *locals, Value *ans, int *nonconst)
|
||||
alarm(ExpressionEvaluationTimeLimit);
|
||||
}
|
||||
r = evaluate_expr_node(node, locals, ans, nonconst);
|
||||
alarm(0);
|
||||
if (ExpressionEvaluationTimeLimit > 0) {
|
||||
alarm(0);
|
||||
ExpressionTimeLimitExceeded = 0;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
static int CopyShortStr(Value *ans, expr_node *node)
|
||||
{
|
||||
size_t len = strlen(node->u.name);
|
||||
ans->v.str = malloc(len+1);
|
||||
if (!ans->v.str) {
|
||||
ans->type = ERR_TYPE;
|
||||
return E_NO_MEM;
|
||||
}
|
||||
strcpy(ans->v.str, node->u.name);
|
||||
ans->type = STR_TYPE;
|
||||
return OK;
|
||||
}
|
||||
|
||||
/***************************************************************/
|
||||
/* */
|
||||
/* evaluate_expr_node - evaluate an expression */
|
||||
@@ -773,6 +789,9 @@ evaluate_expr_node(expr_node *node, Value *locals, Value *ans, int *nonconst)
|
||||
ans->type = ERR_TYPE;
|
||||
return E_SWERR;
|
||||
|
||||
case N_SHORT_STR:
|
||||
return CopyShortStr(ans, node);
|
||||
|
||||
case N_CONSTANT:
|
||||
/* Constant node? Just return a copy of the constant */
|
||||
return CopyValue(ans, &(node->u.value));
|
||||
@@ -1870,6 +1889,7 @@ static int set_constant_value(expr_node *atom)
|
||||
size_t len;
|
||||
char const *s = DBufValue(&ExprBuf);
|
||||
atom->u.value.type = ERR_TYPE;
|
||||
atom->type = N_CONSTANT;
|
||||
|
||||
if (!*s) {
|
||||
Eprint("%s", ErrMsg[E_EOLN]);
|
||||
@@ -1878,6 +1898,12 @@ static int set_constant_value(expr_node *atom)
|
||||
ampm = 0;
|
||||
if (*s == '\"') { /* It's a literal string "*/
|
||||
len = strlen(s)-1;
|
||||
if (len <= SHORT_NAME_BUF) {
|
||||
atom->type = N_SHORT_STR;
|
||||
strncpy(atom->u.name, s+1, len-1);
|
||||
atom->u.name[len-1] = 0;
|
||||
return OK;
|
||||
}
|
||||
atom->u.value.type = STR_TYPE;
|
||||
atom->u.value.v.str = malloc(len);
|
||||
if (! atom->u.value.v.str) {
|
||||
@@ -2013,9 +2039,7 @@ static int make_atom(expr_node *atom, Var *locals)
|
||||
|
||||
/* Constant */
|
||||
r = set_constant_value(atom);
|
||||
if (r == OK) {
|
||||
atom->type = N_CONSTANT;
|
||||
} else {
|
||||
if (r != OK) {
|
||||
atom->type = N_ERROR;
|
||||
}
|
||||
return r;
|
||||
@@ -2557,6 +2581,9 @@ void print_expr_tree(expr_node *node, FILE *fp)
|
||||
case N_CONSTANT:
|
||||
PrintValue(&(node->u.value), fp);
|
||||
return;
|
||||
case N_SHORT_STR:
|
||||
fprintf(fp, "\"%s\"", node->u.name);
|
||||
return;
|
||||
case N_SHORT_VAR:
|
||||
fprintf(fp, "%s", node->u.name);
|
||||
return;
|
||||
|
||||
+11
-4
@@ -102,6 +102,13 @@ static int CheckSafetyAux (struct stat *statbuf);
|
||||
static int PopFile (void);
|
||||
static int IncludeCmd(char const *);
|
||||
|
||||
static void
|
||||
got_a_fresh_line(void)
|
||||
{
|
||||
FreshLine = 1;
|
||||
WarnedAboutImplicit = 0;
|
||||
}
|
||||
|
||||
void set_cloexec(FILE *fp)
|
||||
{
|
||||
int flags;
|
||||
@@ -182,7 +189,7 @@ int ReadLine(void)
|
||||
CurLine = CLine->text;
|
||||
LineNo = CLine->LineNo;
|
||||
CLine = CLine->next;
|
||||
FreshLine = 1;
|
||||
got_a_fresh_line();
|
||||
clear_callstack();
|
||||
if (DebugFlag & DB_ECHO_LINE) OutputLine(ErrFp);
|
||||
return OK;
|
||||
@@ -283,7 +290,7 @@ static int ReadLineFromFile(int use_pclose)
|
||||
CurLine = DBufValue(&LineBuffer);
|
||||
}
|
||||
|
||||
FreshLine = 1;
|
||||
got_a_fresh_line();
|
||||
clear_callstack();
|
||||
if (DebugFlag & DB_ECHO_LINE) OutputLine(ErrFp);
|
||||
return OK;
|
||||
@@ -849,7 +856,7 @@ static int IncludeCmd(char const *cmd)
|
||||
char const *fname;
|
||||
int old_flag;
|
||||
|
||||
FreshLine = 1;
|
||||
got_a_fresh_line();
|
||||
clear_callstack();
|
||||
if (IStackPtr+1 >= INCLUDE_NEST) return E_NESTED_INCLUDE;
|
||||
i = &IStack[IStackPtr];
|
||||
@@ -968,7 +975,7 @@ int IncludeFile(char const *fname)
|
||||
int oldRunDisabled;
|
||||
struct stat statbuf;
|
||||
|
||||
FreshLine = 1;
|
||||
got_a_fresh_line();
|
||||
clear_callstack();
|
||||
if (IStackPtr+1 >= INCLUDE_NEST) return E_NESTED_INCLUDE;
|
||||
i = &IStack[IStackPtr];
|
||||
|
||||
+95
-33
@@ -60,6 +60,9 @@
|
||||
#define RetVal (info->retval)
|
||||
|
||||
#define DBG(x) do { if (DebugFlag & DB_PRTEXPR) { x; } } while(0)
|
||||
/* Debugging helpers for "choose()", "iif(), etc. */
|
||||
#define PUT(x) DBufPuts(&DebugBuf, x)
|
||||
#define OUT() do { fprintf(ErrFp, "%s\n", DBufValue(&DebugBuf)); DBufFree(&DebugBuf); } while(0)
|
||||
|
||||
static int
|
||||
solstice_equinox_for_year(int y, int which);
|
||||
@@ -104,7 +107,7 @@ static int FHtmlEscape (func_info *);
|
||||
static int FHtmlStriptags (func_info *);
|
||||
static int FIif (expr_node *, Value *, Value *, int *);
|
||||
static int FIndex (func_info *);
|
||||
static int FIsAny (func_info *);
|
||||
static int FIsAny (expr_node *, Value *, Value *, int *);
|
||||
static int FIsdst (func_info *);
|
||||
static int FIsleap (func_info *);
|
||||
static int FIsomitted (func_info *);
|
||||
@@ -228,7 +231,7 @@ BuiltinFunc Func[] = {
|
||||
{ "access", 2, 2, 0, FAccess, NULL },
|
||||
{ "adawn", 0, 1, 0, FADawn, NULL},
|
||||
{ "adusk", 0, 1, 0, FADusk, NULL},
|
||||
{ "ampm", 1, 3, 1, FAmpm, NULL },
|
||||
{ "ampm", 1, 4, 1, FAmpm, NULL },
|
||||
{ "ansicolor", 1, 5, 1, FAnsicolor, NULL },
|
||||
{ "args", 1, 1, 0, FArgs, NULL },
|
||||
{ "asc", 1, 1, 1, FAsc, NULL },
|
||||
@@ -263,7 +266,7 @@ BuiltinFunc Func[] = {
|
||||
{ "htmlstriptags",1, 1, 1, FHtmlStriptags, NULL },
|
||||
{ "iif", 1, NO_MAX, 1, NULL, FIif }, /*NEW-STYLE*/
|
||||
{ "index", 2, 3, 1, FIndex, NULL },
|
||||
{ "isany", 1, NO_MAX, 1, FIsAny, NULL },
|
||||
{ "isany", 1, NO_MAX, 1, NULL, FIsAny }, /*NEW-STYLE*/
|
||||
{ "isdst", 0, 2, 0, FIsdst, NULL },
|
||||
{ "isleap", 1, 1, 1, FIsleap, NULL },
|
||||
{ "isomitted", 1, 1, 0, FIsomitted, NULL },
|
||||
@@ -335,7 +338,7 @@ BuiltinFunc Func[] = {
|
||||
{ "utctolocal", 1, 1, 1, FUTCToLocal, NULL },
|
||||
{ "value", 1, 2, 0, FValue, NULL },
|
||||
{ "version", 0, 0, 1, FVersion, NULL },
|
||||
{ "weekno", 0, 3, 1, FWeekno, NULL },
|
||||
{ "weekno", 0, 3, 0, FWeekno, NULL },
|
||||
{ "wkday", 1, 1, 1, FWkday, NULL },
|
||||
{ "wkdaynum", 1, 1, 1, FWkdaynum, NULL },
|
||||
{ "year", 1, 1, 1, FYear, NULL }
|
||||
@@ -376,10 +379,9 @@ static int RetStrVal(char const *s, func_info *info)
|
||||
/***************************************************************/
|
||||
static int FStrlen(func_info *info)
|
||||
{
|
||||
Value *v = &ARG(0);
|
||||
if (v->type != STR_TYPE) return E_BAD_TYPE;
|
||||
ASSERT_TYPE(0, STR_TYPE);
|
||||
RetVal.type = INT_TYPE;
|
||||
size_t l = strlen(v->v.str);
|
||||
size_t l = strlen(ARGSTR(0));
|
||||
if (l > INT_MAX) return E_2HIGH;
|
||||
RETVAL = (int) l;
|
||||
return OK;
|
||||
@@ -943,6 +945,8 @@ static int FAmpm(func_info *info)
|
||||
char const *pm = "PM";
|
||||
char const *ampm = NULL;
|
||||
|
||||
int include_leading_zero = 0;
|
||||
|
||||
char outbuf[128];
|
||||
|
||||
if (ARG(0).type != DATETIME_TYPE && ARG(0).type != TIME_TYPE) {
|
||||
@@ -957,6 +961,10 @@ static int FAmpm(func_info *info)
|
||||
if (Nargs >= 3) {
|
||||
ASSERT_TYPE(2, STR_TYPE);
|
||||
pm = ARGSTR(2);
|
||||
if (Nargs >= 4) {
|
||||
ASSERT_TYPE(3, INT_TYPE);
|
||||
include_leading_zero = ARGV(3);
|
||||
}
|
||||
}
|
||||
}
|
||||
h = TIMEPART(ARG(0)) / 60;
|
||||
@@ -971,9 +979,17 @@ static int FAmpm(func_info *info)
|
||||
}
|
||||
} else {
|
||||
if (ARG(0).type == DATETIME_TYPE) {
|
||||
snprintf(outbuf, sizeof(outbuf), "%04d%c%02d%c%02d%c%d%c%02d", yr, DateSep, mo+1, DateSep, da, DateTimeSep, h, TimeSep, m);
|
||||
if (include_leading_zero) {
|
||||
snprintf(outbuf, sizeof(outbuf), "%04d%c%02d%c%02d%c%02d%c%02d", yr, DateSep, mo+1, DateSep, da, DateTimeSep, h, TimeSep, m);
|
||||
} else {
|
||||
snprintf(outbuf, sizeof(outbuf), "%04d%c%02d%c%02d%c%d%c%02d", yr, DateSep, mo+1, DateSep, da, DateTimeSep, h, TimeSep, m);
|
||||
}
|
||||
} else {
|
||||
snprintf(outbuf, sizeof(outbuf), "%d%c%02d", h, TimeSep, m);
|
||||
if (include_leading_zero) {
|
||||
snprintf(outbuf, sizeof(outbuf), "%02d%c%02d", h, TimeSep, m);
|
||||
} else {
|
||||
snprintf(outbuf, sizeof(outbuf), "%d%c%02d", h, TimeSep, m);
|
||||
}
|
||||
}
|
||||
}
|
||||
ampm = am;
|
||||
@@ -982,9 +998,17 @@ static int FAmpm(func_info *info)
|
||||
h -= 12;
|
||||
}
|
||||
if (ARG(0).type == DATETIME_TYPE) {
|
||||
snprintf(outbuf, sizeof(outbuf), "%04d%c%02d%c%02d%c%d%c%02d", yr, DateSep, mo+1, DateSep, da, DateTimeSep, h, TimeSep, m);
|
||||
if (include_leading_zero) {
|
||||
snprintf(outbuf, sizeof(outbuf), "%04d%c%02d%c%02d%c%02d%c%02d", yr, DateSep, mo+1, DateSep, da, DateTimeSep, h, TimeSep, m);
|
||||
} else {
|
||||
snprintf(outbuf, sizeof(outbuf), "%04d%c%02d%c%02d%c%d%c%02d", yr, DateSep, mo+1, DateSep, da, DateTimeSep, h, TimeSep, m);
|
||||
}
|
||||
} else {
|
||||
snprintf(outbuf, sizeof(outbuf), "%d%c%02d", h, TimeSep, m);
|
||||
if (include_leading_zero) {
|
||||
snprintf(outbuf, sizeof(outbuf), "%02d%c%02d", h, TimeSep, m);
|
||||
} else {
|
||||
snprintf(outbuf, sizeof(outbuf), "%d%c%02d", h, TimeSep, m);
|
||||
}
|
||||
}
|
||||
ampm = pm;
|
||||
}
|
||||
@@ -1034,8 +1058,8 @@ static int FOrd(func_info *info)
|
||||
/* */
|
||||
/* FPad - Pad a string to min length */
|
||||
/* */
|
||||
/* pad("1", "0", 4) --> "0004" */
|
||||
/* pad("1", "0", 4, 1) --> "4000" */
|
||||
/* pad("1", "0", 4) --> "0001" */
|
||||
/* pad("1", "0", 4, 1) --> "1000" */
|
||||
/* pad("foo", "bar", 7) -> "barbfoo" */
|
||||
/* */
|
||||
/***************************************************************/
|
||||
@@ -1159,32 +1183,70 @@ static int FPlural(func_info *info)
|
||||
/* otherwise. */
|
||||
/* */
|
||||
/***************************************************************/
|
||||
static int FIsAny(func_info *info)
|
||||
static int FIsAny(expr_node *node, Value *locals, Value *ans, int *nonconst)
|
||||
{
|
||||
int i;
|
||||
RetVal.type = INT_TYPE;
|
||||
RETVAL = 0;
|
||||
for (i=1; i<Nargs; i++) {
|
||||
if (ARG(0).type == ARG(i).type) {
|
||||
if (ARG(0).type == STR_TYPE) {
|
||||
if (!strcmp(ARGSTR(0), ARGSTR(i))) {
|
||||
RETVAL = 1;
|
||||
return OK;
|
||||
}
|
||||
} else {
|
||||
if (ARGV(0) == ARGV(i)) {
|
||||
RETVAL = 1;
|
||||
return OK;
|
||||
}
|
||||
DynamicBuffer DebugBuf;
|
||||
expr_node *cur;
|
||||
int r;
|
||||
|
||||
Value v;
|
||||
Value candidate;
|
||||
|
||||
ans->type = INT_TYPE;
|
||||
ans->v.val = 0;
|
||||
|
||||
DBG(DBufInit(&DebugBuf));
|
||||
DBG(PUT("isany("));
|
||||
|
||||
cur = node->child;
|
||||
r = evaluate_expr_node(cur, locals, &v, nonconst);
|
||||
if (r != OK) {
|
||||
DBG(DBufFree(&DebugBuf));
|
||||
return r;
|
||||
}
|
||||
DBG(PUT(PrintValue(&v, NULL)));
|
||||
while(cur->sibling) {
|
||||
cur = cur->sibling;
|
||||
r = evaluate_expr_node(cur, locals, &candidate, nonconst);
|
||||
if (r != OK) {
|
||||
DestroyValue(v);
|
||||
DBG(DBufFree(&DebugBuf));
|
||||
return r;
|
||||
}
|
||||
DBG(PUT(", "));
|
||||
DBG(PUT(PrintValue(&candidate, NULL)));
|
||||
if (candidate.type != v.type) {
|
||||
DestroyValue(candidate);
|
||||
continue;
|
||||
}
|
||||
if (v.type == STR_TYPE) {
|
||||
if (strcmp(v.v.str, candidate.v.str)) {
|
||||
DestroyValue(candidate);
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
if (v.v.val != candidate.v.val) {
|
||||
DestroyValue(candidate);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
DestroyValue(candidate);
|
||||
ans->v.val = 1;
|
||||
break;
|
||||
}
|
||||
DestroyValue(v);
|
||||
if (DebugFlag & DB_PRTEXPR) {
|
||||
while(cur->sibling) {
|
||||
cur = cur->sibling;
|
||||
PUT(", ?");
|
||||
}
|
||||
PUT(") => ");
|
||||
PUT(PrintValue(ans, NULL));
|
||||
OUT();
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
/* Debugging helpers for "choose()" and "iif() */
|
||||
#define PUT(x) DBufPuts(&DebugBuf, x)
|
||||
#define OUT() do { fprintf(ErrFp, "%s\n", DBufValue(&DebugBuf)); DBufFree(&DebugBuf); } while(0)
|
||||
/***************************************************************/
|
||||
/* */
|
||||
/* FChoose */
|
||||
@@ -1200,7 +1262,7 @@ static int FChoose(expr_node *node, Value *locals, Value *ans, int *nonconst)
|
||||
int r;
|
||||
int n;
|
||||
int nargs = node->num_kids;
|
||||
Value(v);
|
||||
Value v;
|
||||
DBG(DBufInit(&DebugBuf));
|
||||
DBG(PUT("choose("));
|
||||
|
||||
|
||||
+7
-3
@@ -49,6 +49,7 @@ EXTERN int CurMon;
|
||||
EXTERN int CurYear;
|
||||
EXTERN int LineNo;
|
||||
EXTERN int FreshLine;
|
||||
EXTERN int WarnedAboutImplicit;
|
||||
EXTERN uid_t TrustedUsers[MAX_TRUSTED_USERS];
|
||||
|
||||
EXTERN INIT( int MaxLateMinutes, 0);
|
||||
@@ -78,9 +79,12 @@ EXTERN INIT( int ExpressionEvaluationDisabled, 0);
|
||||
EXTERN INIT( int ExpressionEvaluationTimeLimit, 0);
|
||||
EXTERN INIT( volatile sig_atomic_t ExpressionTimeLimitExceeded, 0);
|
||||
EXTERN INIT( int IgnoreOnce, 0);
|
||||
EXTERN INIT( int SortByTime, 0);
|
||||
EXTERN INIT( int SortByDate, 0);
|
||||
EXTERN INIT( int SortByPrio, 0);
|
||||
EXTERN INIT( char const *OnceFile, NULL);
|
||||
EXTERN INIT( int OnceDate, -1);
|
||||
EXTERN INIT( int ProcessedOnce, 0);
|
||||
EXTERN INIT( int SortByTime, SORT_NONE);
|
||||
EXTERN INIT( int SortByDate, SORT_NONE);
|
||||
EXTERN INIT( int SortByPrio, SORT_NONE);
|
||||
EXTERN INIT( int UntimedBeforeTimed, 0);
|
||||
EXTERN INIT( int DefaultPrio, NO_PRIORITY);
|
||||
EXTERN INIT( int SysTime, -1);
|
||||
|
||||
+5
-1
@@ -241,7 +241,6 @@ void InitRemind(int argc, char const *argv[])
|
||||
arg++;
|
||||
if (!*arg) {
|
||||
UseStdin = 1;
|
||||
IgnoreOnce = 1;
|
||||
i--;
|
||||
break;
|
||||
}
|
||||
@@ -324,6 +323,7 @@ void InitRemind(int argc, char const *argv[])
|
||||
NextMode = 1;
|
||||
DontQueue = 1;
|
||||
Daemon = 0;
|
||||
IgnoreOnce = 1;
|
||||
break;
|
||||
|
||||
case 'r':
|
||||
@@ -457,6 +457,7 @@ void InitRemind(int argc, char const *argv[])
|
||||
break;
|
||||
case 'c':
|
||||
case 'C':
|
||||
IgnoreOnce = 1;
|
||||
DoCalendar = 1;
|
||||
weeks = 0;
|
||||
/* Parse the flags */
|
||||
@@ -501,6 +502,7 @@ void InitRemind(int argc, char const *argv[])
|
||||
case 's':
|
||||
case 'S':
|
||||
DoSimpleCalendar = 1;
|
||||
IgnoreOnce = 1;
|
||||
weeks = 0;
|
||||
while(*arg) {
|
||||
if (*arg == 'a' || *arg == 'A') {
|
||||
@@ -527,6 +529,7 @@ void InitRemind(int argc, char const *argv[])
|
||||
case 'p':
|
||||
case 'P':
|
||||
DoSimpleCalendar = 1;
|
||||
IgnoreOnce = 1;
|
||||
PsCal = PSCAL_LEVEL1;
|
||||
while (*arg == 'a' || *arg == 'A' ||
|
||||
*arg == 'q' || *arg == 'Q' ||
|
||||
@@ -720,6 +723,7 @@ void InitRemind(int argc, char const *argv[])
|
||||
|
||||
if (rep > 0) {
|
||||
Iterations = rep;
|
||||
IgnoreOnce = 1;
|
||||
DontQueue = 1;
|
||||
Daemon = 0;
|
||||
}
|
||||
|
||||
+59
-7
@@ -68,17 +68,24 @@ exitfunc(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void sigalrm(int)
|
||||
static void sigalrm(int sig)
|
||||
{
|
||||
UNUSED(sig);
|
||||
if (ExpressionEvaluationTimeLimit) {
|
||||
ExpressionTimeLimitExceeded = 1;
|
||||
}
|
||||
}
|
||||
|
||||
static void sigxcpu(int)
|
||||
static void sigxcpu(int sig)
|
||||
{
|
||||
write(STDERR_FILENO, "\n\nmax-execution-time exceeded.\n\n", 32);
|
||||
_exit(1);
|
||||
|
||||
UNUSED(sig);
|
||||
int r = write(STDERR_FILENO, "\n\nmax-execution-time exceeded.\n\n", 32);
|
||||
|
||||
/* Pretend to use r to avoid compiler warning */
|
||||
/* cppcheck-suppress duplicateExpression */
|
||||
/* cppcheck-suppress knownArgument */
|
||||
_exit(1 + (r-r));
|
||||
}
|
||||
|
||||
/***************************************************************/
|
||||
@@ -235,7 +242,8 @@ static void DoReminders(void)
|
||||
if (!UseStdin) {
|
||||
FileAccessDate = GetAccessDate(InitialFile);
|
||||
} else {
|
||||
FileAccessDate = DSEToday;
|
||||
FileAccessDate = DSEToday - 1;
|
||||
if (FileAccessDate < 0) FileAccessDate = 0;
|
||||
}
|
||||
|
||||
if (FileAccessDate < 0) {
|
||||
@@ -345,9 +353,16 @@ static void DoReminders(void)
|
||||
break;
|
||||
|
||||
|
||||
/* If we don't recognize the command, do a REM by default */
|
||||
/* If we don't recognize the command, do a REM by default, but warn */
|
||||
|
||||
default: DestroyParser(&p); CreateParser(CurLine, &p); purge_handled = 1; r=DoRem(&p); break;
|
||||
default:
|
||||
Wprint("Unrecognized command; interpreting as REM");
|
||||
WarnedAboutImplicit = 1;
|
||||
DestroyParser(&p);
|
||||
CreateParser(CurLine, &p);
|
||||
purge_handled = 1;
|
||||
r=DoRem(&p);
|
||||
break;
|
||||
|
||||
}
|
||||
if (r && (!Hush || r != E_RUN_DISABLED)) {
|
||||
@@ -1886,3 +1901,40 @@ get_month_name(int mon)
|
||||
if (DynamicMonthName[mon]) return DynamicMonthName[mon];
|
||||
return MonthName[mon];
|
||||
}
|
||||
|
||||
static int GetOnceDateFromFile(void)
|
||||
{
|
||||
FILE *fp;
|
||||
|
||||
int once_date = 0;
|
||||
|
||||
fp = fopen(OnceFile, "r");
|
||||
if (fp) {
|
||||
if (fscanf(fp, "%d", &once_date) != 1) {
|
||||
once_date = 0;
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
/* Save today to file */
|
||||
fp = fopen(OnceFile, "w");
|
||||
if (!fp) {
|
||||
Wprint("Warning: Unable to save ONCE timestamp to %s: %s",
|
||||
OnceFile, strerror(errno));
|
||||
return once_date;
|
||||
}
|
||||
fprintf(fp, "%d\n# This is a timestamp file used by Remind to track ONCE reminders.\n# Do not edit or delete it.\n", DSEToday);
|
||||
fclose(fp);
|
||||
return once_date;
|
||||
}
|
||||
|
||||
int GetOnceDate(void)
|
||||
{
|
||||
ProcessedOnce = 1;
|
||||
if (IgnoreOnce || !OnceFile || !*OnceFile) {
|
||||
return FileAccessDate;
|
||||
}
|
||||
if (OnceDate < 0) {
|
||||
OnceDate = GetOnceDateFromFile();
|
||||
}
|
||||
return OnceDate;
|
||||
}
|
||||
|
||||
-14
@@ -100,21 +100,12 @@ static double phase (double, double *, double *, double *, double *, double *, d
|
||||
#define mmlong 64.975464 /* Moon's mean lonigitude at the epoch */
|
||||
#define mmlongp 349.383063 /* Mean longitude of the perigee at the
|
||||
epoch */
|
||||
#define mlnode 151.950429 /* Mean longitude of the node at the
|
||||
epoch */
|
||||
#define minc 5.145396 /* Inclination of the Moon's orbit */
|
||||
#define mecc 0.054900 /* Eccentricity of the Moon's orbit */
|
||||
#define mangsiz 0.5181 /* Moon's angular size at distance a
|
||||
from Earth */
|
||||
#define msmax 384401.0 /* Semi-major axis of Moon's orbit in km */
|
||||
#define mparallax 0.9507 /* Parallax at distance a from Earth */
|
||||
#define synmonth 29.53058868 /* Synodic month (new Moon to new Moon) */
|
||||
#define lunatbase 2423436.0 /* Base date for E. W. Brown's numbered
|
||||
series of lunations (1923 January 16) */
|
||||
|
||||
/* Properties of the Earth */
|
||||
|
||||
#define earthrad 6378.16 /* Radius of Earth in kilometres */
|
||||
#ifdef PI
|
||||
#undef PI
|
||||
#endif
|
||||
@@ -123,11 +114,6 @@ static double phase (double, double *, double *, double *, double *, double *, d
|
||||
|
||||
/* Handy mathematical functions */
|
||||
|
||||
#ifdef sgn
|
||||
#undef sgn
|
||||
#endif
|
||||
#define sgn(x) (((x) < 0) ? -1 : ((x) > 0 ? 1 : 0)) /* Extract sign */
|
||||
|
||||
#ifdef abs
|
||||
#undef abs
|
||||
#endif
|
||||
|
||||
@@ -225,6 +225,7 @@ void pop_call(void);
|
||||
void FixSpecialType(Trigger *trig);
|
||||
void WriteJSONTrigger(Trigger const *t, int include_tags, int today);
|
||||
void WriteJSONTimeTrigger(TimeTrig const *tt);
|
||||
int GetOnceDate(void);
|
||||
#ifdef REM_USE_WCHAR
|
||||
#define _XOPEN_SOURCE 600
|
||||
#include <wctype.h>
|
||||
|
||||
@@ -44,6 +44,7 @@ enum expr_node_type
|
||||
N_FREE,
|
||||
N_ERROR,
|
||||
N_CONSTANT,
|
||||
N_SHORT_STR,
|
||||
N_LOCAL_VAR,
|
||||
N_SHORT_VAR,
|
||||
N_VARIABLE,
|
||||
|
||||
+13
-12
@@ -115,17 +115,6 @@ int DoFset(ParsePtr p)
|
||||
}
|
||||
orig_namelen = buf.len;
|
||||
|
||||
/* Should be followed by '(' */
|
||||
c = ParseNonSpaceChar(p, &r, 0);
|
||||
if (r) {
|
||||
DBufFree(&buf);
|
||||
return r;
|
||||
}
|
||||
if (c != '(') {
|
||||
DBufFree(&buf);
|
||||
return E_PARSE_ERR;
|
||||
}
|
||||
|
||||
/* Convert to lower-case */
|
||||
strtolower(DBufValue(&buf));
|
||||
|
||||
@@ -141,6 +130,18 @@ int DoFset(ParsePtr p)
|
||||
return OK;
|
||||
}
|
||||
}
|
||||
|
||||
/* Should be followed by '(' */
|
||||
c = ParseNonSpaceChar(p, &r, 0);
|
||||
if (r) {
|
||||
DBufFree(&buf);
|
||||
return r;
|
||||
}
|
||||
if (c != '(') {
|
||||
DBufFree(&buf);
|
||||
return E_PARSE_ERR;
|
||||
}
|
||||
|
||||
func = NEW(UserFunc);
|
||||
if (!func) {
|
||||
DBufFree(&buf);
|
||||
@@ -243,7 +244,7 @@ int DoFset(ParsePtr p)
|
||||
|
||||
/* Save the argument names */
|
||||
if (func->nargs) {
|
||||
func->args = calloc(sizeof(char *), func->nargs);
|
||||
func->args = calloc(func->nargs, sizeof(char *));
|
||||
for (i=0; i<func->nargs; i++) {
|
||||
func->args[i] = StrDup(local_array[i].name);
|
||||
if (!func->args[i]) {
|
||||
|
||||
@@ -164,6 +164,40 @@ static int latitude_func(int do_set, Value *val)
|
||||
return latitude_longitude_func(do_set, val, &Latitude, -90.0, 90.0);
|
||||
}
|
||||
|
||||
static int oncefile_func(int do_set, Value *val)
|
||||
{
|
||||
if (do_set) {
|
||||
if (val->type != STR_TYPE) return E_BAD_TYPE;
|
||||
if (! (*val->v.str) && (!OnceFile || !*OnceFile)) {
|
||||
/* Trying to set already-empty string to empty string */
|
||||
return OK;
|
||||
}
|
||||
if (OnceFile && !strcmp(OnceFile, val->v.str)) {
|
||||
/* Trying to set to the exact same value */
|
||||
return OK;
|
||||
}
|
||||
|
||||
if (ProcessedOnce) {
|
||||
Wprint("Not setting $OnceFile: Already processed a reminder with a ONCE clause");
|
||||
return OK;
|
||||
}
|
||||
if (OnceFile) {
|
||||
free( (void *) OnceFile);
|
||||
}
|
||||
OnceFile = StrDup(val->v.str);
|
||||
if (!OnceFile) return E_NO_MEM;
|
||||
return OK;
|
||||
}
|
||||
if (!OnceFile) {
|
||||
val->v.str = StrDup("");
|
||||
} else {
|
||||
val->v.str = StrDup(OnceFile);
|
||||
}
|
||||
if (!val->v.str) return E_NO_MEM;
|
||||
val->type = STR_TYPE;
|
||||
return OK;
|
||||
|
||||
}
|
||||
static int terminal_bg_func(int do_set, Value *val)
|
||||
{
|
||||
UNUSED(do_set);
|
||||
@@ -883,6 +917,7 @@ static SysVar SysVarArr[] = {
|
||||
{"NumTrig", 0, INT_TYPE, &NumTriggered, 0, 0 },
|
||||
{"October", 1, STR_TYPE, &DynamicMonthName[9], 0, 0 },
|
||||
{"On", 1, STR_TYPE, &DynamicOn, 0, 0 },
|
||||
{"OnceFile", 1, SPECIAL_TYPE, oncefile_func, 0, 0 },
|
||||
{"ParseUntriggered", 1, INT_TYPE, &ParseUntriggered, 0, 1 },
|
||||
{"Pm", 1, STR_TYPE, &DynamicPm, 0, 0 },
|
||||
{"PrefixLineNo", 0, INT_TYPE, &DoPrefixLineNo, 0, 0 },
|
||||
|
||||
@@ -49,3 +49,7 @@ set a 15:00 - 14:44
|
||||
set a (1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+1))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
|
||||
|
||||
set a (1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
|
||||
|
||||
set a isany(1)
|
||||
set a isany(1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6)
|
||||
set a isany("foo", 1 + 1, 2:00 + 1, '2021-01-01' + 1, '2021-01-01@14:00' + 1, "f" + "oo", "fo" + "o")
|
||||
|
||||
+1
-1
@@ -2,5 +2,5 @@ FSET msgprefix(x) "Priority: " + x + "; Filename: " + filename() + ": "
|
||||
|
||||
REM at 23:56 MSG foo
|
||||
REM PRIORITY 42 at 23:57 MSG bar
|
||||
REM PRIORITY 999 at 23:58 MSQ quux
|
||||
REM PRIORITY 999 at 23:58 MSG quux
|
||||
DO queue2.rem
|
||||
|
||||
+4
-4
@@ -9,10 +9,10 @@ set $LatMin 24
|
||||
set $LatSec 0
|
||||
|
||||
IF $PSCAL
|
||||
[trigger(moondate(0))] SPECIAL MOON 0 -1 -1 [moontime(0)]
|
||||
[trigger(moondate(1))] SPECIAL MOON 1 -1 -1 [moontime(1)]
|
||||
[trigger(moondate(2))] SPECIAL MOON 2 -1 -1 [moontime(2)]
|
||||
[trigger(moondate(3))] SPECIAL MOON 3 -1 -1 [moontime(3)]
|
||||
REM [trigger(moondate(0))] SPECIAL MOON 0 -1 -1 [moontime(0)]
|
||||
REM [trigger(moondate(1))] SPECIAL MOON 1 -1 -1 [moontime(1)]
|
||||
REM [trigger(moondate(2))] SPECIAL MOON 2 -1 -1 [moontime(2)]
|
||||
REM [trigger(moondate(3))] SPECIAL MOON 3 -1 -1 [moontime(3)]
|
||||
ENDIF
|
||||
|
||||
REM 4 PS (First-Bit-Of-PS)
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
BANNER %
|
||||
SET $OnceFile "../tests/once.timestamp"
|
||||
|
||||
REM ONCE MSG This should only be issued once per day.
|
||||
|
||||
SET $OnceFile "../tests/once.timestamp"
|
||||
SET $OnceFile "../tests/once-again.timestamp"
|
||||
@@ -569,8 +569,31 @@ EOF
|
||||
|
||||
../src/remind ../tests/if1.rem 2020-03-03 >> ../tests/test.out 2>&1
|
||||
|
||||
# Test ONCE with a timestamp file
|
||||
rm -f ../tests/once.timestamp
|
||||
../src/remind ../tests/test-once.rem >> ../tests/test.out 2>&1
|
||||
../src/remind ../tests/test-once.rem >> ../tests/test.out 2>&1
|
||||
../src/remind ../tests/test-once.rem >> ../tests/test.out 2>&1
|
||||
tail +2 ../tests/once.timestamp >> ../tests/test.out 2>&1
|
||||
rm -f ../tests/once.timestamp
|
||||
|
||||
../src/remind - < ../tests/test-once.rem >> ../tests/test.out 2>&1
|
||||
../src/remind - < ../tests/test-once.rem >> ../tests/test.out 2>&1
|
||||
../src/remind - < ../tests/test-once.rem >> ../tests/test.out 2>&1
|
||||
tail +2 ../tests/once.timestamp >> ../tests/test.out 2>&1
|
||||
rm -f ../tests/once.timestamp
|
||||
|
||||
# Remove references to SysInclude, which is build-specific
|
||||
grep -F -v '$SysInclude' < ../tests/test.out > ../tests/test.out.1 && mv -f ../tests/test.out.1 ../tests/test.out
|
||||
|
||||
# If "man" accepts the --warnings flag, test all the man pages.
|
||||
man man | grep -e --warnings > /dev/null 2>&1
|
||||
if test $? = 0 ; then
|
||||
for i in ../man/*.1 ; do
|
||||
man --warnings=w $i 2>>../tests/test.out 1>/dev/null
|
||||
done
|
||||
fi
|
||||
|
||||
cmp -s ../tests/test.out ../tests/test.cmp
|
||||
if [ "$?" = "0" ]; then
|
||||
echo "Remind: Acceptance test PASSED"
|
||||
|
||||
+368
-181
File diff suppressed because one or more lines are too long
+89
-36
@@ -33,7 +33,7 @@ fset _h(x, y) trigger(hebdate(x,y))
|
||||
|
||||
# Test case from Remind mailing list
|
||||
set mltest "a b"
|
||||
INCLUDECMD printf 'REM %s\n' [mltest]
|
||||
INCLUDECMD printf 'REM MSG %s\n' [mltest]
|
||||
|
||||
# Disabling RUN in an !includecmd
|
||||
INCLUDECMD !echo MSG foo
|
||||
@@ -49,38 +49,38 @@ INCLUDECMD echo MSG foo
|
||||
RUN ON
|
||||
INCLUDECMD echo MSG foo
|
||||
|
||||
[_h(1, "Tishrey")] MSG Rosh Hashana 1
|
||||
[_h(2, "Tishrey")] MSG Rosh Hashana 2
|
||||
[_h(3, "Tishrey")] MSG Tzom Gedalia
|
||||
[_h(10, "Tishrey")] MSG Yom Kippur
|
||||
[_h(15, "Tishrey")] MSG Sukkot 1
|
||||
[_h(25, "Kislev")] MSG Channuka
|
||||
[_h(10, "Tevet")] MSG Asara B'Tevet
|
||||
[_h(15, "Shvat")] MSG Tu B'Shvat
|
||||
[_h(15, "Adar A")] MSG Purim Katan
|
||||
[_h(14, "Adar")] MSG Purim
|
||||
[_h(15, "Nisan")] MSG Pesach
|
||||
[_h(27, "Nisan")] MSG Yom HaShoah
|
||||
[_h(4, "Iyar")] MSG Yom HaZikaron
|
||||
[_h(5, "Iyar")] MSG Yom Ha'atzmaut
|
||||
[_h(28, "Iyar")] MSG Yom Yerushalayim
|
||||
[_h(6, "Sivan")] MSG Shavuot
|
||||
[_h(9, "Av")] MSG Tish'a B'Av
|
||||
REM [_h(1, "Tishrey")] MSG Rosh Hashana 1
|
||||
REM [_h(2, "Tishrey")] MSG Rosh Hashana 2
|
||||
REM [_h(3, "Tishrey")] MSG Tzom Gedalia
|
||||
REM [_h(10, "Tishrey")] MSG Yom Kippur
|
||||
REM [_h(15, "Tishrey")] MSG Sukkot 1
|
||||
REM [_h(25, "Kislev")] MSG Channuka
|
||||
REM [_h(10, "Tevet")] MSG Asara B'Tevet
|
||||
REM [_h(15, "Shvat")] MSG Tu B'Shvat
|
||||
REM [_h(15, "Adar A")] MSG Purim Katan
|
||||
REM [_h(14, "Adar")] MSG Purim
|
||||
REM [_h(15, "Nisan")] MSG Pesach
|
||||
REM [_h(27, "Nisan")] MSG Yom HaShoah
|
||||
REM [_h(4, "Iyar")] MSG Yom HaZikaron
|
||||
REM [_h(5, "Iyar")] MSG Yom Ha'atzmaut
|
||||
REM [_h(28, "Iyar")] MSG Yom Yerushalayim
|
||||
REM [_h(6, "Sivan")] MSG Shavuot
|
||||
REM [_h(9, "Av")] MSG Tish'a B'Av
|
||||
|
||||
# Test some jahrzeit cases
|
||||
fset _i(x,y,z,a) trigger(hebdate(x,y,z,a))
|
||||
[_i(30, "Heshvan", today(), 5759)] MSG Complete-Complete
|
||||
[_i(30, "Heshvan", today(), 5760)] MSG Complete-Defective
|
||||
[_i(30, "Heshvan", today(), 5761)] MSG Illegal
|
||||
REM [_i(30, "Heshvan", today(), 5759)] MSG Complete-Complete
|
||||
REM [_i(30, "Heshvan", today(), 5760)] MSG Complete-Defective
|
||||
REM [_i(30, "Heshvan", today(), 5761)] MSG Illegal
|
||||
|
||||
[_i(30, "Kislev", today(), 5759)] MSG Complete-Complete
|
||||
[_i(30, "Kislev", today(), 5760)] MSG Complete-Defective
|
||||
[_i(30, "Kislev", today(), 5761)] MSG Illegal
|
||||
REM [_i(30, "Kislev", today(), 5759)] MSG Complete-Complete
|
||||
REM [_i(30, "Kislev", today(), 5760)] MSG Complete-Defective
|
||||
REM [_i(30, "Kislev", today(), 5761)] MSG Illegal
|
||||
|
||||
[_i(30, "Adar A", today(), 5755)] MSG Leap
|
||||
[_i(30, "Adar A", today(), 5756)] MSG Illegal
|
||||
[_i(29, "Adar A", today(), 5755)] MSG Leap
|
||||
[_i(29, "Adar A", today(), 5756)] MSG Illegal
|
||||
REM [_i(30, "Adar A", today(), 5755)] MSG Leap
|
||||
REM [_i(30, "Adar A", today(), 5756)] MSG Illegal
|
||||
REM [_i(29, "Adar A", today(), 5755)] MSG Leap
|
||||
REM [_i(29, "Adar A", today(), 5756)] MSG Illegal
|
||||
|
||||
# This causes a parse error on version 03.01.01
|
||||
REM 1990-01-01 SATISFY 1
|
||||
@@ -238,8 +238,8 @@ CLEAR-OMIT-CONTEXT
|
||||
|
||||
REM tag ill,egal MSG bad tag
|
||||
REM MSG The tags are: [trigtags()]
|
||||
REM TAG foo The tags are: [trigtags()]
|
||||
REM TAG foo TAG bar TAG quux TAG znort TAG cabbage The tags are: [trigtags()]
|
||||
REM TAG foo MSG The tags are: [trigtags()]
|
||||
REM TAG foo TAG bar TAG quux TAG znort TAG cabbage MSG The tags are: [trigtags()]
|
||||
REM MSG The tags are: [trigtags()]
|
||||
|
||||
# Test ADDOMIT
|
||||
@@ -559,11 +559,11 @@ REM 1992-01-01 *1 UNTIL 1991-12-31 MSG Diagnosed
|
||||
set x '1992-01-01'
|
||||
REM [x] *1 UNTIL 1991-12-31 MSG Not diagnosed - nonconst expression
|
||||
|
||||
REM MON FROM 1992-01-01 UNTIL 1991-12-31 Diagnosed
|
||||
REM MON SCANFROM 1992-01-01 UNTIL 1991-12-31 Diagnosed
|
||||
REM MON FROM 1992-01-01 UNTIL 1991-12-31 MSG Diagnosed
|
||||
REM MON SCANFROM 1992-01-01 UNTIL 1991-12-31 MSG Diagnosed
|
||||
|
||||
REM MON FROM [x] UNTIL 1991-12-31 Not diagnosed
|
||||
REM MON SCANFROM [x] UNTIL 1991-12-31 Not diagnosed
|
||||
REM MON FROM [x] UNTIL 1991-12-31 MSG Not diagnosed
|
||||
REM MON SCANFROM [x] UNTIL 1991-12-31 MSG Not diagnosed
|
||||
|
||||
REM 1992-01-01 UNTIL 1992-02-02 MSG Diagnosed
|
||||
REM [x] UNTIL 1992-02-02 MSG Diagnosed
|
||||
@@ -575,7 +575,7 @@ OMIT December 25 MSG X
|
||||
OMIT 26 Dec 2010 THROUGH 27 Dec 2010 MSG This is not legal
|
||||
OMIT DUMP
|
||||
# Regression test for bugfix in Hebrew calendar Adar jahrzeit
|
||||
[_i(14, "Adar", today(), 5761)] MSG Purim
|
||||
REM [_i(14, "Adar", today(), 5761)] MSG Purim
|
||||
|
||||
# Regression test for bug found by Larry Hynes
|
||||
REM SATISFY [day(trigdate()-25) == 14] MSG Foo
|
||||
@@ -708,6 +708,56 @@ set x ampm(21:12) + ""
|
||||
set x ampm(22:12) + ""
|
||||
set x ampm(23:12) + ""
|
||||
|
||||
set x ampm(0:12,"AM", "PM", 1) + ""
|
||||
set x ampm(1:12,"AM", "PM", 1) + ""
|
||||
set x ampm(2:12,"AM", "PM", 1) + ""
|
||||
set x ampm(3:12,"AM", "PM", 1) + ""
|
||||
set x ampm(4:12,"AM", "PM", 1) + ""
|
||||
set x ampm(5:12,"AM", "PM", 1) + ""
|
||||
set x ampm(6:12,"AM", "PM", 1) + ""
|
||||
set x ampm(7:12,"AM", "PM", 1) + ""
|
||||
set x ampm(8:12,"AM", "PM", 1) + ""
|
||||
set x ampm(9:12,"AM", "PM", 1) + ""
|
||||
set x ampm(10:12,"AM", "PM", 1) + ""
|
||||
set x ampm(11:12,"AM", "PM", 1) + ""
|
||||
set x ampm(12:12,"AM", "PM", 1) + ""
|
||||
set x ampm(13:12,"AM", "PM", 1) + ""
|
||||
set x ampm(14:12,"AM", "PM", 1) + ""
|
||||
set x ampm(15:12,"AM", "PM", 1) + ""
|
||||
set x ampm(16:12,"AM", "PM", 1) + ""
|
||||
set x ampm(17:12,"AM", "PM", 1) + ""
|
||||
set x ampm(18:12,"AM", "PM", 1) + ""
|
||||
set x ampm(19:12,"AM", "PM", 1) + ""
|
||||
set x ampm(20:12,"AM", "PM", 1) + ""
|
||||
set x ampm(21:12,"AM", "PM", 1) + ""
|
||||
set x ampm(22:12,"AM", "PM", 1) + ""
|
||||
set x ampm(23:12,"AM", "PM", 1) + ""
|
||||
|
||||
set x ampm(0:02,"AM", "PM", 0) + ""
|
||||
set x ampm(0:02,"AM", "PM", 0) + ""
|
||||
set x ampm(2:02,"AM", "PM", 0) + ""
|
||||
set x ampm(3:02,"AM", "PM", 0) + ""
|
||||
set x ampm(4:02,"AM", "PM", 0) + ""
|
||||
set x ampm(5:02,"AM", "PM", 0) + ""
|
||||
set x ampm(6:02,"AM", "PM", 0) + ""
|
||||
set x ampm(7:02,"AM", "PM", 0) + ""
|
||||
set x ampm(8:02,"AM", "PM", 0) + ""
|
||||
set x ampm(9:02,"AM", "PM", 0) + ""
|
||||
set x ampm(00:02,"AM", "PM", 0) + ""
|
||||
set x ampm(00:02,"AM", "PM", 0) + ""
|
||||
set x ampm(02:02,"AM", "PM", 0) + ""
|
||||
set x ampm(03:02,"AM", "PM", 0) + ""
|
||||
set x ampm(04:02,"AM", "PM", 0) + ""
|
||||
set x ampm(05:02,"AM", "PM", 0) + ""
|
||||
set x ampm(06:02,"AM", "PM", 0) + ""
|
||||
set x ampm(07:02,"AM", "PM", 0) + ""
|
||||
set x ampm(08:02,"AM", "PM", 0) + ""
|
||||
set x ampm(09:02,"AM", "PM", 0) + ""
|
||||
set x ampm(20:02,"AM", "PM", 0) + ""
|
||||
set x ampm(20:02,"AM", "PM", 0) + ""
|
||||
set x ampm(22:02,"AM", "PM", 0) + ""
|
||||
set x ampm(23:02,"AM", "PM", 0) + ""
|
||||
|
||||
# Coerce with am/pm
|
||||
set x coerce("TIME", "12:45am")
|
||||
set x coerce("TIME", "12:45")
|
||||
@@ -777,7 +827,7 @@ ENDIF
|
||||
# Trig with a good warnfunc
|
||||
FSET w(x) choose(x, 5, 3, 1, 0)
|
||||
|
||||
Short-circuit operators
|
||||
# Short-circuit operators
|
||||
IF trig("sun warn w") || trig("thu warn w")
|
||||
REM [trig()] +5 MSG Foo %b
|
||||
ENDIF
|
||||
@@ -945,6 +995,9 @@ REM Tue AT 10:00 DURATION [trigtime()] MSG blort
|
||||
# Make sure shellescape does not mangle UTF-8 characters
|
||||
msg [shellescape("😆")]
|
||||
|
||||
This should be diagnosed as implicitly being REM
|
||||
REM This should be diganosed as implicitly being MSG-type
|
||||
|
||||
# Don't want Remind to queue reminders
|
||||
EXIT
|
||||
|
||||
|
||||
+3
-3
@@ -1,7 +1,7 @@
|
||||
MSG ру́сский ру́сский ру́сский ру́сский ру́сский ру́сский ру́сский ру́сский
|
||||
MSG עִבְרִית עִבְרִית עִבְרִית עִבְרִית עִבְרִית עִבְרִית עִבְרִית עִבְרִית עִבְרִית
|
||||
REM MSG ру́сский ру́сский ру́сский ру́сский ру́сский ру́сский ру́сский ру́сский
|
||||
REM MSG עִבְרִית עִבְרִית עִבְרִית עִבְרִית עִבְרִית עִבְרִית עִבְרִית עִבְרִית עִבְרִית
|
||||
|
||||
Wed MSG With tabs and spaces
|
||||
REM Wed MSG With tabs and spaces
|
||||
|
||||
REM [moondate(0)] MSG 🌑
|
||||
REM [moondate(1)] MSG 🌓 woo
|
||||
|
||||
+4
-4
@@ -1,5 +1,5 @@
|
||||
[moondate(0)] SPECIAL MOON 0
|
||||
[moondate(1)] SPECIAL MOON 1
|
||||
[moondate(2)] SPECIAL MOON 2
|
||||
[moondate(3)] SPECIAL MOON 3
|
||||
REM [moondate(0)] SPECIAL MOON 0
|
||||
REM [moondate(1)] SPECIAL MOON 1
|
||||
REM [moondate(2)] SPECIAL MOON 2
|
||||
REM [moondate(3)] SPECIAL MOON 3
|
||||
REM Monday SPECIAL WEEK (W[weekno()])
|
||||
|
||||
+36
-36
@@ -9,8 +9,8 @@ IF !$PSCAL
|
||||
|
||||
FSET msgsuffix(x) "<P>"
|
||||
|
||||
MSG The Hebrew date for today, %d %m, %y, is [_hstr(today())]. %
|
||||
MSG And the Hebrew date for tomorrow is [_hstr(today()+1)]. %
|
||||
REM MSG The Hebrew date for today, %d %m, %y, is [_hstr(today())]. %
|
||||
REM MSG And the Hebrew date for tomorrow is [_hstr(today()+1)]. %
|
||||
|
||||
fset msgprefix(x) iif($NumTrig==OldTrig, "<H2>Upcoming Holidays</H2>"+char(13,10),"")
|
||||
set oldtrig $numtrig
|
||||
@@ -51,40 +51,40 @@ FSET _PastSat(x, y) IIF(WKDAYNUM(_h2(x,y))!=6, \
|
||||
SET InIsrael VALUE("InIsrael", 0)
|
||||
SET Reform VALUE("Reform", 0)
|
||||
|
||||
[_h(1, "Tishrey")] ++12 MSG %"Rosh Hashana 1%" is %b.
|
||||
REM [_h(1, "Tishrey")] ++12 MSG %"Rosh Hashana 1%" is %b.
|
||||
|
||||
# No RH-2 or Tzom Gedalia in Reform
|
||||
IF !Reform
|
||||
[_h(2, "Tishrey")] ++12 MSG %"Rosh Hashana 2%" is %b.
|
||||
[_PastSat(3, "Tishrey")] ++12 MSG %"Tzom Gedalia%" is %b.
|
||||
REM [_h(2, "Tishrey")] ++12 MSG %"Rosh Hashana 2%" is %b.
|
||||
REM [_PastSat(3, "Tishrey")] ++12 MSG %"Tzom Gedalia%" is %b.
|
||||
ENDIF
|
||||
|
||||
[_h(10, "Tishrey")] ++12 MSG %"Yom Kippur%" is %b.
|
||||
[_h(15, "Tishrey")] ++12 MSG %"Sukkot 1%" is %b.
|
||||
REM [_h(10, "Tishrey")] ++12 MSG %"Yom Kippur%" is %b.
|
||||
REM [_h(15, "Tishrey")] ++12 MSG %"Sukkot 1%" is %b.
|
||||
|
||||
IF !InIsrael
|
||||
[_h(16, "Tishrey")] MSG %"Sukkot 2%"
|
||||
REM [_h(16, "Tishrey")] MSG %"Sukkot 2%"
|
||||
ENDIF
|
||||
|
||||
[_h(21, "Tishrey")] ++12 MSG %"Hoshana Rabba%" is %b.
|
||||
[_h(22, "Tishrey")] ++12 MSG %"Shemini Atzeret%" is %b.
|
||||
REM [_h(21, "Tishrey")] ++12 MSG %"Hoshana Rabba%" is %b.
|
||||
REM [_h(22, "Tishrey")] ++12 MSG %"Shemini Atzeret%" is %b.
|
||||
|
||||
IF InIsrael
|
||||
[_h(22, "Tishrey")] ++12 MSG %"Simchat Torah%" is %b.
|
||||
REM [_h(22, "Tishrey")] ++12 MSG %"Simchat Torah%" is %b.
|
||||
ELSE
|
||||
[_h(23, "Tishrey")] ++12 MSG %"Simchat Torah%" is %b.
|
||||
REM [_h(23, "Tishrey")] ++12 MSG %"Simchat Torah%" is %b.
|
||||
ENDIF
|
||||
|
||||
# Because Kislev can change length, we must be more careful about Chanukah
|
||||
FSET _chan(x) TRIGGER(HEBDATE(24, "Kislev", today()-9)+x)
|
||||
[_chan(1)] ++12 MSG %"Chanukah 1%" is %b.
|
||||
[_chan(2)] MSG %"Chanukah 2%"
|
||||
[_chan(3)] MSG %"Chanukah 3%"
|
||||
[_chan(4)] MSG %"Chanukah 4%"
|
||||
[_chan(5)] MSG %"Chanukah 5%"
|
||||
[_chan(6)] MSG %"Chanukah 6%"
|
||||
[_chan(7)] MSG %"Chanukah 7%"
|
||||
[_chan(8)] MSG %"Chanukah 8%"
|
||||
REM [_chan(1)] ++12 MSG %"Chanukah 1%" is %b.
|
||||
REM [_chan(2)] MSG %"Chanukah 2%"
|
||||
REM [_chan(3)] MSG %"Chanukah 3%"
|
||||
REM [_chan(4)] MSG %"Chanukah 4%"
|
||||
REM [_chan(5)] MSG %"Chanukah 5%"
|
||||
REM [_chan(6)] MSG %"Chanukah 6%"
|
||||
REM [_chan(7)] MSG %"Chanukah 7%"
|
||||
REM [_chan(8)] MSG %"Chanukah 8%"
|
||||
|
||||
# Not sure about Reform's position on the next one.
|
||||
IF !Reform
|
||||
@@ -92,8 +92,8 @@ IF !Reform
|
||||
REM [_PastSat(10, "Tevet")] MSG %"Tzom Tevet%" is %b.
|
||||
ENDIF
|
||||
|
||||
[_h(15, "Shvat")] ++12 MSG %"Tu B'Shvat%" is %b.
|
||||
[_h(15, "Adar A")] ++12 MSG %"Purim Katan%" is %b.
|
||||
REM [_h(15, "Shvat")] ++12 MSG %"Tu B'Shvat%" is %b.
|
||||
REM [_h(15, "Adar A")] ++12 MSG %"Purim Katan%" is %b.
|
||||
|
||||
# If Purim is on Sunday, then Fast of Esther is 11 Adar.
|
||||
IF WKDAYNUM(_h2(13, "Adar")) != 6
|
||||
@@ -101,41 +101,41 @@ IF WKDAYNUM(_h2(13, "Adar")) != 6
|
||||
ELSE
|
||||
REM [TRIGGER(_h2(11, "Adar"))] ++12 MSG %"Fast of Esther%" is %b.
|
||||
ENDIF
|
||||
[_h(14, "Adar")] ++12 MSG %"Purim%" is %b.
|
||||
[_h(15, "Nisan")] ++12 MSG %"Pesach%" is %b.
|
||||
REM [_h(14, "Adar")] ++12 MSG %"Purim%" is %b.
|
||||
REM [_h(15, "Nisan")] ++12 MSG %"Pesach%" is %b.
|
||||
|
||||
IF !InIsrael
|
||||
[_h(16, "Nisan")] MSG %"Pesach 2%" is %b.
|
||||
REM [_h(16, "Nisan")] MSG %"Pesach 2%" is %b.
|
||||
ENDIF
|
||||
|
||||
[_h(21, "Nisan")] MSG %"Pesach 7%" is %b.
|
||||
REM [_h(21, "Nisan")] MSG %"Pesach 7%" is %b.
|
||||
|
||||
IF !InIsrael && !Reform
|
||||
[_h(22, "Nisan")] MSG %"Pesach 8%" is %b.
|
||||
REM [_h(22, "Nisan")] MSG %"Pesach 8%" is %b.
|
||||
ENDIF
|
||||
|
||||
[_h(27, "Nisan")] ++12 MSG %"Yom HaShoah%" is %b.
|
||||
[_h(4, "Iyar")] ++12 MSG %"Yom HaZikaron%" is %b.
|
||||
[_h(5, "Iyar")] ++12 MSG %"Yom Ha'atzmaut%" is %b.
|
||||
REM [_h(27, "Nisan")] ++12 MSG %"Yom HaShoah%" is %b.
|
||||
REM [_h(4, "Iyar")] ++12 MSG %"Yom HaZikaron%" is %b.
|
||||
REM [_h(5, "Iyar")] ++12 MSG %"Yom Ha'atzmaut%" is %b.
|
||||
|
||||
# Not sure about Reform's position on Lag B'Omer
|
||||
IF !Reform
|
||||
[_h(18, "Iyar")] ++12 MSG %"Lag B'Omer%" is %b.
|
||||
REM [_h(18, "Iyar")] ++12 MSG %"Lag B'Omer%" is %b.
|
||||
ENDIF
|
||||
|
||||
[_h(28, "Iyar")] ++12 MSG %"Yom Yerushalayim%" is %b.
|
||||
[_h(6, "Sivan")] ++12 MSG %"Shavuot%" is %b.
|
||||
REM [_h(28, "Iyar")] ++12 MSG %"Yom Yerushalayim%" is %b.
|
||||
REM [_h(6, "Sivan")] ++12 MSG %"Shavuot%" is %b.
|
||||
|
||||
IF !InIsrael && !Reform
|
||||
[_h(7, "Sivan")] MSG %"Shavuot 2%" is %b.
|
||||
REM [_h(7, "Sivan")] MSG %"Shavuot 2%" is %b.
|
||||
ENDIF
|
||||
|
||||
# Fairly sure Reform Jews don't observe the next two
|
||||
IF !Reform
|
||||
# Tzom Tamuz and Tish'a B'Av are moved to Sunday if they normally
|
||||
# fall on a Saturday
|
||||
[_PastSat(17, "Tamuz")] ++12 MSG %"Tzom Tammuz%" is %b.
|
||||
[_PastSat(9, "Av")] ++12 MSG %"Tish'a B'Av%" is %b.
|
||||
REM [_PastSat(17, "Tamuz")] ++12 MSG %"Tzom Tammuz%" is %b.
|
||||
REM [_PastSat(9, "Av")] ++12 MSG %"Tish'a B'Av%" is %b.
|
||||
ENDIF
|
||||
|
||||
fset msgprefix(x) ""
|
||||
|
||||
Reference in New Issue
Block a user