mirror of
https://salsa.debian.org/dskoll/remind.git
synced 2026-04-17 23:08:40 +02:00
Compare commits
57 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a6c166ae0c | ||
|
|
e9c89b770f | ||
|
|
df6298bd63 | ||
|
|
739d285e36 | ||
|
|
ee1c931932 | ||
|
|
0806b6738f | ||
|
|
020e82d575 | ||
|
|
a20f2b588e | ||
|
|
631e721a96 | ||
|
|
8453e17c6c | ||
|
|
76c1e2abb3 | ||
|
|
3389f1c91b | ||
|
|
b2d47ae979 | ||
|
|
e2c615f310 | ||
|
|
e8492a4303 | ||
|
|
4695efaabd | ||
|
|
c433f42587 | ||
|
|
4708e59a43 | ||
|
|
d56ac6332a | ||
|
|
b054baf590 | ||
|
|
42f5e3467d | ||
|
|
97013ae89b | ||
|
|
2acead9118 | ||
|
|
a53a80acb4 | ||
|
|
56e62b1b4d | ||
|
|
c645db5ede | ||
|
|
ef6b9c3783 | ||
|
|
019bee26cb | ||
|
|
152cd4090b | ||
|
|
b7fc2b5776 | ||
|
|
723aba9b7c | ||
|
|
8a5b88338b | ||
|
|
7236441e02 | ||
|
|
e4bab0dda4 | ||
|
|
5b7d4a07ec | ||
|
|
8c3d2c4003 | ||
|
|
f485d607ff | ||
|
|
a0effa5f0b | ||
|
|
7d501cda6f | ||
|
|
5d7f55c8d5 | ||
|
|
097bf92bea | ||
|
|
b9dea59206 | ||
|
|
46aa144b65 | ||
|
|
914971308d | ||
|
|
a22e81040f | ||
|
|
72f74f03cf | ||
|
|
d0e45e727e | ||
|
|
ce2b2e80da | ||
|
|
11771b7d3d | ||
|
|
01cb028532 | ||
|
|
58b6f43b9c | ||
|
|
1dedb667e8 | ||
|
|
8a96236788 | ||
|
|
2a13163659 | ||
|
|
336a9684d4 | ||
|
|
86945c6e18 | ||
|
|
684280db5e |
18
configure
vendored
18
configure
vendored
@@ -1,6 +1,6 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Guess values for system-dependent variables and create Makefiles.
|
# Guess values for system-dependent variables and create Makefiles.
|
||||||
# Generated by GNU Autoconf 2.71 for remind 05.00.04.
|
# Generated by GNU Autoconf 2.71 for remind 05.00.06.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
|
# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
|
||||||
@@ -608,8 +608,8 @@ MAKEFLAGS=
|
|||||||
# Identity of this package.
|
# Identity of this package.
|
||||||
PACKAGE_NAME='remind'
|
PACKAGE_NAME='remind'
|
||||||
PACKAGE_TARNAME='remind'
|
PACKAGE_TARNAME='remind'
|
||||||
PACKAGE_VERSION='05.00.04'
|
PACKAGE_VERSION='05.00.06'
|
||||||
PACKAGE_STRING='remind 05.00.04'
|
PACKAGE_STRING='remind 05.00.06'
|
||||||
PACKAGE_BUGREPORT=''
|
PACKAGE_BUGREPORT=''
|
||||||
PACKAGE_URL='https://dianne.skoll.ca/projects/remind/'
|
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.
|
# Omit some internal or obsolete options to make the list less imposing.
|
||||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||||
cat <<_ACEOF
|
cat <<_ACEOF
|
||||||
\`configure' configures remind 05.00.04 to adapt to many kinds of systems.
|
\`configure' configures remind 05.00.06 to adapt to many kinds of systems.
|
||||||
|
|
||||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||||
|
|
||||||
@@ -1326,7 +1326,7 @@ fi
|
|||||||
|
|
||||||
if test -n "$ac_init_help"; then
|
if test -n "$ac_init_help"; then
|
||||||
case $ac_init_help in
|
case $ac_init_help in
|
||||||
short | recursive ) echo "Configuration of remind 05.00.04:";;
|
short | recursive ) echo "Configuration of remind 05.00.06:";;
|
||||||
esac
|
esac
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
|
|
||||||
@@ -1414,7 +1414,7 @@ fi
|
|||||||
test -n "$ac_init_help" && exit $ac_status
|
test -n "$ac_init_help" && exit $ac_status
|
||||||
if $ac_init_version; then
|
if $ac_init_version; then
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
remind configure 05.00.04
|
remind configure 05.00.06
|
||||||
generated by GNU Autoconf 2.71
|
generated by GNU Autoconf 2.71
|
||||||
|
|
||||||
Copyright (C) 2021 Free Software Foundation, Inc.
|
Copyright (C) 2021 Free Software Foundation, Inc.
|
||||||
@@ -1864,7 +1864,7 @@ cat >config.log <<_ACEOF
|
|||||||
This file contains any messages produced by compilers while
|
This file contains any messages produced by compilers while
|
||||||
running configure, to aid debugging if configure makes a mistake.
|
running configure, to aid debugging if configure makes a mistake.
|
||||||
|
|
||||||
It was created by remind $as_me 05.00.04, which was
|
It was created by remind $as_me 05.00.06, which was
|
||||||
generated by GNU Autoconf 2.71. Invocation command line was
|
generated by GNU Autoconf 2.71. Invocation command line was
|
||||||
|
|
||||||
$ $0$ac_configure_args_raw
|
$ $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
|
# report actual input values of CONFIG_FILES etc. instead of their
|
||||||
# values after options handling.
|
# values after options handling.
|
||||||
ac_log="
|
ac_log="
|
||||||
This file was extended by remind $as_me 05.00.04, which was
|
This file was extended by remind $as_me 05.00.06, which was
|
||||||
generated by GNU Autoconf 2.71. Invocation command line was
|
generated by GNU Autoconf 2.71. Invocation command line was
|
||||||
|
|
||||||
CONFIG_FILES = $CONFIG_FILES
|
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
|
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||||
ac_cs_config='$ac_cs_config_escaped'
|
ac_cs_config='$ac_cs_config_escaped'
|
||||||
ac_cs_version="\\
|
ac_cs_version="\\
|
||||||
remind config.status 05.00.04
|
remind config.status 05.00.06
|
||||||
configured by $0, generated by GNU Autoconf 2.71,
|
configured by $0, generated by GNU Autoconf 2.71,
|
||||||
with options \\"\$ac_cs_config\\"
|
with options \\"\$ac_cs_config\\"
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
dnl Process this file with autoconf to produce a configure script.
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
AC_INIT(remind, 05.00.04, , , https://dianne.skoll.ca/projects/remind/)
|
AC_INIT(remind, 05.00.06, , , https://dianne.skoll.ca/projects/remind/)
|
||||||
AC_CONFIG_SRCDIR([src/queue.c])
|
AC_CONFIG_SRCDIR([src/queue.c])
|
||||||
|
|
||||||
cat <<'EOF'
|
cat <<'EOF'
|
||||||
|
|||||||
3
contrib/ical2rem-0.7/GITHUB
Normal file
3
contrib/ical2rem-0.7/GITHUB
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
The upstream GitHub project for ical2rem is:
|
||||||
|
|
||||||
|
https://github.com/jbalcorn/ical2rem
|
||||||
21
contrib/ical2rem-0.7/LICENSE
Normal file
21
contrib/ical2rem-0.7/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2019 Justin B. Alcorn
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
103
contrib/ical2rem-0.7/README.md
Normal file
103
contrib/ical2rem-0.7/README.md
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
# ical2rem
|
||||||
|
The original iCal to Remind script, first released in 2005.
|
||||||
|
|
||||||
|
Reads iCal files and outputs remind-compatible files. Tested ONLY with
|
||||||
|
calendar files created by Mozilla Calendar/Sunbird. Use at your own risk.
|
||||||
|
|
||||||
|
## License
|
||||||
|
In 2005, this was released with the Gnu Public License V2. However, I am changing it to the MIT License, since that provides greater freedom to do with this code what you want.
|
||||||
|
|
||||||
|
Copyright (c) 2005, 2007, 2019 Justin B. Alcorn
|
||||||
|
|
||||||
|
## How I use Remind and Google Calendar together
|
||||||
|
|
||||||
|
- My family has a Google Email domain, and our email addresses all end in the same domain. We all use Google Calendars and I want to mail reminders to each of the family members containing both Google Calendar and .reminder information.
|
||||||
|
- Under my ~/.rem/ directory each family member has a directory. Each directory contains a standard remind file called 'reminders' that at the very least has the line "INCLUDE /home/jalcorn/.rem/<username>/ical2rem" and flag files indicating whether they want Daily or Weekly reminders. My reminders files references my standard .reminders file, and I also have a flag so if I run a Test run I'll get it. There's actually a lot more files (I have a big family).
|
||||||
|
````
|
||||||
|
./rem
|
||||||
|
./son1:
|
||||||
|
drwxrwxr-x 2 jalcorn jalcorn 4096 Dec 12 14:02 .
|
||||||
|
drwxr-xr-x 12 jalcorn jalcorn 4096 Dec 12 14:13 ..
|
||||||
|
-rw-rw-r-- 1 jalcorn jalcorn 51 Mar 3 06:10 ical2rem
|
||||||
|
lrwxrwxrwx 1 jalcorn jalcorn 33 Oct 27 2016 son1.ics -> /home/jalcorn/calendars/son1.ics
|
||||||
|
-rw-rw-r-- 1 jalcorn jalcorn 976 Dec 12 14:02 reminders
|
||||||
|
-rw-rw-r-- 1 jalcorn jalcorn 0 Oct 27 2016 Weekly
|
||||||
|
|
||||||
|
./justin:
|
||||||
|
drwxrwxr-x 2 jalcorn jalcorn 4096 Feb 27 08:29 .
|
||||||
|
drwxr-xr-x 12 jalcorn jalcorn 4096 Dec 12 14:13 ..
|
||||||
|
lrwxrwxrwx 1 jalcorn jalcorn 32 Oct 27 2016 son1.ics -> /home/jalcorn/calendars/son1.ics
|
||||||
|
-rw-rw-r-- 1 jalcorn jalcorn 0 Nov 7 2016 Daily
|
||||||
|
lrwxrwxrwx 1 jalcorn jalcorn 34 Oct 27 2016 family.ics -> /home/jalcorn/calendars/family.ics
|
||||||
|
-rw-rw-r-- 1 jalcorn jalcorn 37320 Mar 3 06:10 ical2rem
|
||||||
|
lrwxrwxrwx 1 jalcorn jalcorn 34 Oct 27 2016 justin.ics -> /home/jalcorn/calendars/justin.ics
|
||||||
|
lrwxrwxrwx 1 jalcorn jalcorn 24 Nov 7 2016 reminders -> /home/jalcorn/.reminders
|
||||||
|
lrwxrwxrwx 1 jalcorn jalcorn 34 Oct 27 2016 vmd.ics -> /home/jalcorn/calendars/vmd.ics
|
||||||
|
-rw-rw-r-- 1 jalcorn jalcorn 0 Oct 27 2016 Test
|
||||||
|
-rw-rw-r-- 1 jalcorn jalcorn 0 Nov 7 2016 Weekly
|
||||||
|
````
|
||||||
|
- bin/getgooglecals.sh runs out of crontab and downloads whatever calendars I want. Note that we can also download organization calendars, I've included a public one here (Cleveland Heights Vocal Music Department calendar).
|
||||||
|
- dailyreminders.sh is linked to weeklyreminders.sh and testreminders.sh so I can run it in different modes. The concatenate the various calendar outputs as a single remind file then send the reminders via email.
|
||||||
|
### Example: .rem/son1/reminders file:
|
||||||
|
````
|
||||||
|
INCLUDE /home/jalcorn/.rem/defs.rem
|
||||||
|
INCLUDE /home/jalcorn/.rem/float
|
||||||
|
INCLUDE /home/jalcorn/.rem/son1/ical2rem
|
||||||
|
fset _weeks() coerce("STRING", (trigdate()-today())/7) + plural((trigdate()-today())/7, " week")
|
||||||
|
FSET _sfun(x) choose(x, -60, 30, 5, 0)
|
||||||
|
FSET oldfloat(y,m,d) trigger(MAX(realtoday(), date(y,m,d)))
|
||||||
|
FSET due(y,m,d) "(" + (date(y,m,d)-trigdate()) + ")"
|
||||||
|
SET fullmoon moondate(2)
|
||||||
|
REM [trigger(realtoday())] SPECIAL SHADE 145 70 100 %
|
||||||
|
REM [float(2019,4,15,105)] MSG File tax return [due(2017,4,15)]%
|
||||||
|
REM PRIORITY 9999 MSG %"%"%
|
||||||
|
INCLUDE /home/jalcorn/.rem/bdays
|
||||||
|
SET $LongDeg 81
|
||||||
|
SET $LongMin 11
|
||||||
|
SET $LongSec 11
|
||||||
|
SET $LatDeg 41
|
||||||
|
SET $LatMin 11
|
||||||
|
SET $LatSec 11
|
||||||
|
REM [trigger(moondate(2))] +1 MSG %"Full Moon%" %b%
|
||||||
|
fset _srtd() coerce("STRING", _no_lz(_am_pm(sunrise(today()))))
|
||||||
|
fset _sstd() coerce("STRING", _no_lz(_am_pm(sunset(today()))))
|
||||||
|
MSG Sun is up today from [_srtd()] to [_sstd()].%"%"%
|
||||||
|
````
|
||||||
|
## Revision History
|
||||||
|
### Version 0.7 2024-09-04
|
||||||
|
- ISSUE 8: New version of remind complains if _sfun isn't defined. Output a header
|
||||||
|
to define a function that does nothing if the function doesn't exist.
|
||||||
|
### Version 0.6 2019-03-01
|
||||||
|
- Publish on GitHub and change license to MIT License
|
||||||
|
- Add supporting files and explanation of how I use it
|
||||||
|
### version 0.5.2 2007-03-23
|
||||||
|
- BUG: leadtime for recurring events had a max of 4 instead of DEFAULT_LEAD_TIME
|
||||||
|
- remove project-lead-time, since Category was a non-standard attribute
|
||||||
|
- NOTE: There is a bug in iCal::Parser v1.14 that causes multiple calendars to
|
||||||
|
fail if a calendar with recurring events is followed by a calendar with no
|
||||||
|
recurring events. This has been reported to the iCal::Parser author.
|
||||||
|
### version 0.5.1 2007-03-21
|
||||||
|
- BUG: Handle multiple calendars on STDIN
|
||||||
|
- add --heading option for priority on section headers
|
||||||
|
### version 0.5 2007-03-21
|
||||||
|
- Add more help options
|
||||||
|
- --project-lead-time option
|
||||||
|
- Supress printing of heading if there are no todos to print
|
||||||
|
### version 0.4
|
||||||
|
- Version 0.4 changes all written or inspired by, and thanks to Mark Stosberg
|
||||||
|
- Change to GetOptions
|
||||||
|
- Change to pipe
|
||||||
|
- Add --label, --help options
|
||||||
|
- Add Help Text
|
||||||
|
- Change to subroutines
|
||||||
|
- Efficiency and Cleanup
|
||||||
|
### version 0.3
|
||||||
|
- Convert to GPL (Thanks to Mark Stosberg)
|
||||||
|
- Add usage
|
||||||
|
### version 0.2
|
||||||
|
- add command line switches
|
||||||
|
- add debug code
|
||||||
|
- add SCHED _sfun keyword
|
||||||
|
- fix typos
|
||||||
|
### version 0.1 - ALPHA CODE.
|
||||||
|
|
||||||
82
contrib/ical2rem-0.7/cal_futureonly.pl
Normal file
82
contrib/ical2rem-0.7/cal_futureonly.pl
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
#
|
||||||
|
# cal_futureonly.pl -
|
||||||
|
# Reads iCal files and outputs events between 1 month ago and 1 year from now.
|
||||||
|
# Copyright (c) 2005, 2007, 2019 Justin B. Alcorn
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
cal_futureonly.pl --file=filname.ics > output.ics
|
||||||
|
|
||||||
|
--help Usage
|
||||||
|
--man Complete man page
|
||||||
|
--infile (REQUIRED) name of input calendar file
|
||||||
|
--file (REQUIRED) name of output calendar file
|
||||||
|
|
||||||
|
Expects an ICAL stream on STDIN. Converts it to the format
|
||||||
|
used by the C<remind> script and prints it to STDOUT.
|
||||||
|
|
||||||
|
=head2 --infile
|
||||||
|
|
||||||
|
Input file
|
||||||
|
|
||||||
|
=head2 --file
|
||||||
|
|
||||||
|
Output File
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Data::ICal;
|
||||||
|
use Data::ICal::Entry;
|
||||||
|
use DateTime::Span;
|
||||||
|
use Data::ICal::DateTime;
|
||||||
|
use DateTime;
|
||||||
|
use Getopt::Long 2.24 qw':config auto_help';
|
||||||
|
use Pod::Usage;
|
||||||
|
use Data::Dumper;
|
||||||
|
use vars '$VERSION';
|
||||||
|
$VERSION = "0.1";
|
||||||
|
|
||||||
|
my $help;
|
||||||
|
my $man;
|
||||||
|
my $infile;
|
||||||
|
my $file;
|
||||||
|
my $debug = 0;
|
||||||
|
|
||||||
|
GetOptions (
|
||||||
|
"help|?" => \$help,
|
||||||
|
"man" => \$man,
|
||||||
|
"debug" => \$debug,
|
||||||
|
"infile=s" => \$infile,
|
||||||
|
"file=s" => \$file
|
||||||
|
);
|
||||||
|
pod2usage(1) if $help;
|
||||||
|
pod2usage(1) if (! $file);
|
||||||
|
pod2usage(-verbose => 2) if $man;
|
||||||
|
|
||||||
|
my $limit = DateTime->now();
|
||||||
|
$limit->subtract( months => 1);
|
||||||
|
my $endlimit = DateTime->now()->add(years =>1);
|
||||||
|
print STDERR "including events from: ",$limit->ymd," to: ".$endlimit->ymd,"\n" if $debug;
|
||||||
|
my $span = DateTime::Span->from_datetimes( start => $limit, end => $endlimit );
|
||||||
|
print STDERR "Parsing $infile\n" if $debug;
|
||||||
|
my $cal = Data::ICal->new(filename => $infile);
|
||||||
|
if (! $cal) {
|
||||||
|
die "Died Trying to read $infile :".$cal->error_message;
|
||||||
|
}
|
||||||
|
#my $archive = Data::ICal->new(filename => 'archive.ics');
|
||||||
|
print "Output = $file\n" if $debug;
|
||||||
|
my $new = Data::ICal->new();
|
||||||
|
if (! $new) {
|
||||||
|
die $new->error_message;
|
||||||
|
}
|
||||||
|
|
||||||
|
my @events = $cal->events($span);
|
||||||
|
$new->add_entries(@events);
|
||||||
|
|
||||||
|
open(NEW, ">$file");
|
||||||
|
print NEW $new->as_string;
|
||||||
|
close NEW;
|
||||||
|
exit 0;
|
||||||
|
#:vim set ft=perl ts=4 sts=4 expandtab :
|
||||||
45
contrib/ical2rem-0.7/dailyreminders.sh
Normal file
45
contrib/ical2rem-0.7/dailyreminders.sh
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
r=`basename $0`
|
||||||
|
|
||||||
|
if [ $r == 'weeklyreminders.sh' ];
|
||||||
|
then
|
||||||
|
t=14;
|
||||||
|
w=Weekly;
|
||||||
|
elif [ $r == 'dailyreminders.sh' ];
|
||||||
|
then
|
||||||
|
t=3;
|
||||||
|
w=Daily;
|
||||||
|
else
|
||||||
|
t=5
|
||||||
|
w=Test;
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd .rem
|
||||||
|
for d in * ;
|
||||||
|
do
|
||||||
|
if [ "$( ls -A $d/$w 2>/dev/null )" ];
|
||||||
|
then
|
||||||
|
echo "Sending a $w reminder to $d"
|
||||||
|
ft=/tmp/$d-t-$$.txt
|
||||||
|
f=/tmp/$d-$$.txt
|
||||||
|
echo "Reminders for next $t days:" >> $f
|
||||||
|
cat /dev/null > $d/ical2rem
|
||||||
|
for c in $d/*.ics
|
||||||
|
do
|
||||||
|
calname=`basename $c .ics | tr a-z A-Z`
|
||||||
|
cat $c 2>/dev/null | sed -e "s/^SUMMARY:/SUMMARY: {${calname}} /" \
|
||||||
|
| sed -e 's/DT\([A-Z]*\);TZID=UTC:\([0-9T]*\)/DT\1:\2Z/' >> $ft
|
||||||
|
done
|
||||||
|
cat $ft | ~/bin/ical2rem.pl --label "Online Calendar" --heading "PRIORITY 9999" --lead-time $t >> $d/ical2rem
|
||||||
|
if [ -e $d/reminders ];then r="${d}/reminders"; else r="${d}/ical2rem";fi
|
||||||
|
/usr/bin/remind -q -iplain=1 $r >> $f
|
||||||
|
echo "
|
||||||
|
All calendars can be accessed by logging into https://calendar.google.com/ as $d@jalcorn.net
|
||||||
|
" >> $f
|
||||||
|
cat $f | mail -s "$w Reminders for $d" $d@jalcorn.net;
|
||||||
|
cat $f
|
||||||
|
rm $f
|
||||||
|
rm $ft
|
||||||
|
fi;
|
||||||
|
done
|
||||||
21
contrib/ical2rem-0.7/getgooglecals.sh
Normal file
21
contrib/ical2rem-0.7/getgooglecals.sh
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Get google calendars, fix issues caused by changes in Google calendars, and remove all past events.
|
||||||
|
#
|
||||||
|
# Obviously, I've removed the private hashes from private calendars.
|
||||||
|
#
|
||||||
|
cd ~/calendars
|
||||||
|
wget -q -O full/justin.ics --no-check-certificate https://www.google.com/calendar/ical/jbalcorn\%40gmail.com/private-aaaaaaaaaaaaaaaaaaaaaaaaaa/basic.ics
|
||||||
|
wget -q -O full/family.ics --no-check-certificate https://www.google.com/calendar/ical/jalcorn.net_aaaaaaaaaaaaaaaaaaaaaaaaaa\%40group.calendar.google.com/private-6c42a79dec0b3b3bb7b9b0ebf9776bc1/basic.ics
|
||||||
|
wget -q -O full/son1.ics --no-check-certificate https://www.google.com/calendar/ical/son1\%40jalcorn.net/private-aaaaaaaaaaaaaaaaaaaaaaaaaa/basic.ics
|
||||||
|
wget -q -O full/vmd.ics --no-check-certificate https://calendar.google.com/calendar/ical/chuh.org_0pmkefjkiqc4snoel7occlslh8%40group.calendar.google.com/public/basic.ics
|
||||||
|
|
||||||
|
for i in full/*.ics;do
|
||||||
|
cat $i 2>/dev/null | sed -e 's/DT\([A-Z]*\);TZID=UTC:\([0-9T]*\)/DT\1:\2Z/' > /tmp/temp.ics
|
||||||
|
cp /tmp/temp.ics $i
|
||||||
|
done
|
||||||
|
|
||||||
|
~/bin/cal_futureonly.pl --infile=full/justin.ics --file=justin.ics
|
||||||
|
~/bin/cal_futureonly.pl --infile=full/family.ics --file=family.ics
|
||||||
|
~/bin/cal_futureonly.pl --infile=full/son1.ics --file=son1.ics
|
||||||
|
~/bin/cal_futureonly.pl --infile=full/vmd.ics --file=vmd.ics
|
||||||
@@ -19,7 +19,8 @@
|
|||||||
# along with this program; if not, write to the Free Software
|
# along with this program; if not, write to the Free Software
|
||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#
|
#
|
||||||
#
|
# version 0.6 2019-03-01
|
||||||
|
# - Updates to put on GitHub
|
||||||
# version 0.5.2 2007-03-23
|
# version 0.5.2 2007-03-23
|
||||||
# - BUG: leadtime for recurring events had a max of 4 instead of DEFAULT_LEAD_TIME
|
# - BUG: leadtime for recurring events had a max of 4 instead of DEFAULT_LEAD_TIME
|
||||||
# - remove project-lead-time, since Category was a non-standard attribute
|
# - remove project-lead-time, since Category was a non-standard attribute
|
||||||
@@ -32,7 +33,7 @@
|
|||||||
# version 0.5 2007-03-21
|
# version 0.5 2007-03-21
|
||||||
# - Add more help options
|
# - Add more help options
|
||||||
# - --project-lead-time option
|
# - --project-lead-time option
|
||||||
# - Suppress printing of heading if there are no todos to print
|
# - Supress printing of heading if there are no todos to print
|
||||||
# version 0.4
|
# version 0.4
|
||||||
# - Version 0.4 changes all written or inspired by, and thanks to Mark Stosberg
|
# - Version 0.4 changes all written or inspired by, and thanks to Mark Stosberg
|
||||||
# - Change to GetOptions
|
# - Change to GetOptions
|
||||||
@@ -56,12 +57,19 @@
|
|||||||
cat /path/to/file*.ics | ical2rem.pl > ~/.ical2rem
|
cat /path/to/file*.ics | ical2rem.pl > ~/.ical2rem
|
||||||
|
|
||||||
All options have reasonable defaults:
|
All options have reasonable defaults:
|
||||||
--label Calendar name (Default: Calendar)
|
--label Calendar name (Default: Calendar)
|
||||||
|
--start Start of time period to parse (parsed by str2time)
|
||||||
|
--end End of time period to parse
|
||||||
--lead-time Advance days to start reminders (Default: 3)
|
--lead-time Advance days to start reminders (Default: 3)
|
||||||
--todos, --no-todos Process Todos? (Default: Yes)
|
--todos, --no-todos Process Todos? (Default: Yes)
|
||||||
--heading Define a priority for static entries
|
--iso8601 Use YYYY-MM-DD date format
|
||||||
--help Usage
|
--locations, --no-locations Include location? (Default: Yes)
|
||||||
--man Complete man page
|
--end-times, --no-end-times Include event end times in reminder text
|
||||||
|
(Default: No)
|
||||||
|
--heading Define a priority for static entries
|
||||||
|
--help Usage
|
||||||
|
--debug Enable debug output
|
||||||
|
--man Complete man page
|
||||||
|
|
||||||
Expects an ICAL stream on STDIN. Converts it to the format
|
Expects an ICAL stream on STDIN. Converts it to the format
|
||||||
used by the C<remind> script and prints it to STDOUT.
|
used by the C<remind> script and prints it to STDOUT.
|
||||||
@@ -74,6 +82,14 @@ The syntax generated includes a label for the calendar parsed.
|
|||||||
By default this is "Calendar". You can customize this with
|
By default this is "Calendar". You can customize this with
|
||||||
the "--label" option.
|
the "--label" option.
|
||||||
|
|
||||||
|
=head2 --iso8601
|
||||||
|
|
||||||
|
Use YYYY-MM-DD date format in output instead of Mmm DD YYYY
|
||||||
|
|
||||||
|
=head2 --locations, --no-locations
|
||||||
|
|
||||||
|
Whether or not to include locations in events
|
||||||
|
|
||||||
=head2 --lead-time
|
=head2 --lead-time
|
||||||
|
|
||||||
ical2rem.pl --lead-time 3
|
ical2rem.pl --lead-time 3
|
||||||
@@ -84,7 +100,7 @@ How may days in advance to start getting reminders about the events. Defaults to
|
|||||||
|
|
||||||
ical2rem.pl --no-todos
|
ical2rem.pl --no-todos
|
||||||
|
|
||||||
If you don't care about the ToDos the calendar, this will suppress
|
If you don't care about the ToDos the calendar, this will surpress
|
||||||
printing of the ToDo heading, as well as skipping ToDo processing.
|
printing of the ToDo heading, as well as skipping ToDo processing.
|
||||||
|
|
||||||
=head2 --heading
|
=head2 --heading
|
||||||
@@ -98,6 +114,7 @@ the calendar entries. See the file defs.rem from the remind distribution for mo
|
|||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use iCal::Parser;
|
use iCal::Parser;
|
||||||
|
use Date::Parse;
|
||||||
use DateTime;
|
use DateTime;
|
||||||
use Getopt::Long 2.24 qw':config auto_help';
|
use Getopt::Long 2.24 qw':config auto_help';
|
||||||
use Pod::Usage;
|
use Pod::Usage;
|
||||||
@@ -108,19 +125,31 @@ $VERSION = "0.5.2";
|
|||||||
# Declare how many days in advance to remind
|
# Declare how many days in advance to remind
|
||||||
my $DEFAULT_LEAD_TIME = 3;
|
my $DEFAULT_LEAD_TIME = 3;
|
||||||
my $PROCESS_TODOS = 1;
|
my $PROCESS_TODOS = 1;
|
||||||
my $HEADING = "";
|
my $HEADING = "";
|
||||||
my $help;
|
my $help;
|
||||||
|
my $debug;
|
||||||
my $man;
|
my $man;
|
||||||
|
my $iso8601;
|
||||||
|
my $do_location = 1;
|
||||||
|
my $do_end_times;
|
||||||
|
my $start;
|
||||||
|
my $end;
|
||||||
|
|
||||||
my $label = 'Calendar';
|
my $label = 'Calendar';
|
||||||
GetOptions (
|
GetOptions (
|
||||||
"label=s" => \$label,
|
"label=s" => \$label,
|
||||||
|
"start=s" => \$start,
|
||||||
|
"end=s" => \$end,
|
||||||
"lead-time=i" => \$DEFAULT_LEAD_TIME,
|
"lead-time=i" => \$DEFAULT_LEAD_TIME,
|
||||||
"todos!" => \$PROCESS_TODOS,
|
"todos!" => \$PROCESS_TODOS,
|
||||||
|
"iso8601!" => \$iso8601,
|
||||||
|
"locations!" => \$do_location,
|
||||||
|
"end-times!" => \$do_end_times,
|
||||||
"heading=s" => \$HEADING,
|
"heading=s" => \$HEADING,
|
||||||
"help|?" => \$help,
|
"help|?" => \$help,
|
||||||
|
"debug" => \$debug,
|
||||||
"man" => \$man
|
"man" => \$man
|
||||||
);
|
) or pod2usage(1);
|
||||||
pod2usage(1) if $help;
|
pod2usage(1) if $help;
|
||||||
pod2usage(-verbose => 2) if $man;
|
pod2usage(-verbose => 2) if $man;
|
||||||
|
|
||||||
@@ -136,8 +165,22 @@ while (<>) {
|
|||||||
$in = "";
|
$in = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
my $parser = iCal::Parser->new();
|
print STDERR "Read all calendars\n" if $debug;
|
||||||
|
my(%parser_opts) = ("debug" => $debug);
|
||||||
|
if ($start) {
|
||||||
|
my $t = str2time($start);
|
||||||
|
die "Invalid time $start\n" if (! $t);
|
||||||
|
$parser_opts{'start'} = DateTime->from_epoch(epoch => $t);
|
||||||
|
}
|
||||||
|
if ($end) {
|
||||||
|
my $t = str2time($end);
|
||||||
|
die "Invalid time $end\n" if (! $t);
|
||||||
|
$parser_opts{'end'} = DateTime->from_epoch(epoch => $t);
|
||||||
|
}
|
||||||
|
print STDERR "About to parse calendars\n" if $debug;
|
||||||
|
my $parser = iCal::Parser->new(%parser_opts);
|
||||||
my $hash = $parser->parse_strings(@calendars);
|
my $hash = $parser->parse_strings(@calendars);
|
||||||
|
print STDERR "Calendars parsed\n" if $debug;
|
||||||
|
|
||||||
##############################################################
|
##############################################################
|
||||||
#
|
#
|
||||||
@@ -209,6 +252,13 @@ sub _process_todos {
|
|||||||
#
|
#
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
|
# Issue 8 https://github.com/jbalcorn/ical2rem/issues/8
|
||||||
|
# Make sure there is a _sfun function declared in the reminder file. We'll just make it do nothing here.
|
||||||
|
print 'IF args("_sfun") < 1
|
||||||
|
FSET _sfun(x) choose(x,0)
|
||||||
|
ENDIF
|
||||||
|
';
|
||||||
|
|
||||||
print _process_todos($hash->{'todos'}) if $PROCESS_TODOS;
|
print _process_todos($hash->{'todos'}) if $PROCESS_TODOS;
|
||||||
|
|
||||||
my ($leadtime, $yearkey, $monkey, $daykey,$uid,%eventsbyuid);
|
my ($leadtime, $yearkey, $monkey, $daykey,$uid,%eventsbyuid);
|
||||||
@@ -260,20 +310,67 @@ foreach $yearkey (sort keys %{$events} ) {
|
|||||||
$leadtime = "+".$DEFAULT_LEAD_TIME;
|
$leadtime = "+".$DEFAULT_LEAD_TIME;
|
||||||
}
|
}
|
||||||
my $start = $event->{'DTSTART'};
|
my $start = $event->{'DTSTART'};
|
||||||
print "REM ".$start->month_abbr." ".$start->day." ".$start->year." $leadtime ";
|
my $end = $event->{'DTEND'};
|
||||||
if ($start->hour > 0) {
|
my $duration = "";
|
||||||
print " AT ";
|
if ($end and ($start->hour or $start->minute or $end->hour or $end->minute)) {
|
||||||
print $start->strftime("%H:%M");
|
# We need both an HH:MM version of the delta, to put in the
|
||||||
print " SCHED _sfun MSG %a %2 ";
|
# DURATION specifier, and a human-readable version of the
|
||||||
} else {
|
# delta, to put in the message if the user requested it.
|
||||||
print " MSG %a ";
|
my $seconds = $end->epoch - $start->epoch;
|
||||||
|
my $minutes = int($seconds / 60);
|
||||||
|
my $hours = int($minutes / 60);
|
||||||
|
$minutes -= $hours * 60;
|
||||||
|
$duration = sprintf("DURATION %d:%02d ", $hours, $minutes);
|
||||||
}
|
}
|
||||||
print "%\"$event->{'SUMMARY'}";
|
print "REM ";
|
||||||
print " at $event->{'LOCATION'}" if $event->{'LOCATION'};
|
if ($iso8601) {
|
||||||
print "\%\"%\n";
|
print $start->strftime("%F ");
|
||||||
|
} else {
|
||||||
|
print $start->month_abbr." ".$start->day." ".$start->year." ";
|
||||||
|
}
|
||||||
|
print "$leadtime ";
|
||||||
|
if ($duration or $start->hour > 0 or $start->minute > 0) {
|
||||||
|
print "AT ";
|
||||||
|
print $start->strftime("%H:%M");
|
||||||
|
print " SCHED _sfun ${duration}MSG %a %2 ";
|
||||||
|
} else {
|
||||||
|
print "MSG %a ";
|
||||||
|
}
|
||||||
|
print "%\"", "e($event->{'SUMMARY'});
|
||||||
|
print(" at ", "e($event->{'LOCATION'}))
|
||||||
|
if ($do_location and $event->{'LOCATION'});
|
||||||
|
print "\%\"";
|
||||||
|
if ($do_end_times and ($start->hour or $start->minute or
|
||||||
|
$end->hour or $end->minute)) {
|
||||||
|
my $start_date = $start->strftime("%F");
|
||||||
|
my $start_time = $start->strftime("%k:%M");
|
||||||
|
my $end_date = $end->strftime("%F");
|
||||||
|
my $end_time = $end->strftime("%k:%M");
|
||||||
|
# We don't want leading whitespace; some strftime's support
|
||||||
|
# disabling the pdding in the format string, but not all,
|
||||||
|
# so for maximum portability we do it ourselves.
|
||||||
|
$start_time =~ s/^\s+//;
|
||||||
|
$end_time =~ s/^\s+//;
|
||||||
|
my(@pieces);
|
||||||
|
if ($start_date ne $end_date) {
|
||||||
|
push(@pieces, $end_date);
|
||||||
|
}
|
||||||
|
if ($start_time ne $end_time) {
|
||||||
|
push(@pieces, $end_time);
|
||||||
|
}
|
||||||
|
print " (-", join(" ", @pieces), ")";
|
||||||
|
}
|
||||||
|
print "%\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub quote {
|
||||||
|
local($_) = @_;
|
||||||
|
s/\[/["["]/g;
|
||||||
|
return $_;
|
||||||
|
}
|
||||||
|
|
||||||
exit 0;
|
exit 0;
|
||||||
#:vim set ft=perl ts=4 sts=4 expandtab :
|
#:vim set ft=perl ts=4 sts=4 expandtab :
|
||||||
@@ -109,18 +109,15 @@
|
|||||||
|
|
||||||
(defconst remind-keywords
|
(defconst remind-keywords
|
||||||
(sort
|
(sort
|
||||||
(list "ADDOMIT" "AFTER" "AT" "BANNER" "BEFORE"
|
(list "ADDOMIT" "AFTER" "AT" "BAN" "BANNER" "BEFORE" "CAL" "CLEAR"
|
||||||
"CAL" "CLEAR-OMIT-CONTEXT" "DEBUG" "DO" "DUMPVARS"
|
"CLEAR-OMIT-CONTEXT" "DEBUG" "DO" "DUMP" "DUMPVARS" "DURATION" "ELSE"
|
||||||
"DURATION" "ELSE" "ENDIF" "ERRMSG" "EXIT" "FIRST"
|
"ENDIF" "ERRMSG" "EXIT" "EXPR" "FIRST" "FLUSH" "FOURTH" "FROM" "FSET"
|
||||||
"FLUSH" "FOURTH" "FROM" "FSET" "IF" "IFTRIG" "IN"
|
"FUNSET" "IF" "IFTRIG" "IN" "INC" "INCLUDE" "INCLUDECMD" "LAST"
|
||||||
"INCLUDE" "INCLUDECMD" "LAST" "LASTDAY"
|
"LASTDAY" "LASTWORKDAY" "MAYBE" "MAYBE-UNCOMPUTABLE" "MSF" "MSG"
|
||||||
"LASTWORKDAY" "MAYBE-UNCOMPUTABLE" "MSF"
|
"NOQUEUE" "OMIT" "OMITFUNC" "ONCE" "POP" "POP-OMIT-CONTEXT" "PRESERVE"
|
||||||
"MSG" "OMIT" "OMITFUNC" "ONCE"
|
"PRIORITY" "PS" "PSFILE" "PUSH" "PUSH-OMIT-CONTEXT" "REM" "RUN"
|
||||||
"POP-OMIT-CONTEXT" "PRESERVE" "PRIORITY" "PS" "PSFILE"
|
"SATISFY" "SCAN" "SCANFROM" "SCHED" "SECOND" "SET" "SKIP" "SPECIAL"
|
||||||
"PUSH-OMIT-CONTEXT" "REM" "RUN" "SATISFY" "SCANFROM"
|
"TAG" "THIRD" "THROUGH" "UNSET" "UNTIL" "WARN")
|
||||||
"SCHED" "SECOND" "SET" "SKIP" "SPECIAL"
|
|
||||||
"TAG" "THIRD" "THROUGH" "UNSET" "UNTIL"
|
|
||||||
"WARN")
|
|
||||||
#'(lambda (a b) (> (length a) (length b)))))
|
#'(lambda (a b) (> (length a) (length b)))))
|
||||||
|
|
||||||
|
|
||||||
@@ -131,50 +128,57 @@
|
|||||||
|
|
||||||
(defconst remind-builtin-variables
|
(defconst remind-builtin-variables
|
||||||
(sort
|
(sort
|
||||||
(list "$Ago" "$Am" "$And" "$April" "$At" "$August" "$CalcUTC" "$CalMode" "$Daemon" "$DateSep"
|
(list "$AddBlankLines" "$Ago" "$Am" "$And" "$April" "$At" "$August"
|
||||||
"$DateTimeSep" "$December" "$DefaultColor" "$DefaultPrio"
|
"$CalcUTC" "$CalMode" "$Daemon" "$DateSep" "$DateTimeSep" "$December"
|
||||||
"$DefaultTDelta" "$DeltaOffset" "$DontFork" "$DontQueue"
|
"$DefaultColor" "$DefaultPrio" "$DefaultTDelta" "$DeltaOverride"
|
||||||
"$DontTrigAts" "$EndSent" "$EndSentIg" "$February" "$FirstIndent"
|
"$DontFork" "$DontQueue" "$DontTrigAts" "$EndSent" "$EndSentIg"
|
||||||
"$FoldYear" "$FormWidth" "$Friday" "$Fromnow" "$Hour" "$Hplu" "$HushMode" "$IgnoreOnce"
|
"$ExpressionTimeLimit" "$February" "$FirstIndent" "$FoldYear"
|
||||||
"$InfDelta" "$IntMax" "$IntMin" "$Is" "$January" "$July" "$June" "$LatDeg"
|
"$FormWidth" "$Friday" "$Fromnow" "$Hour" "$Hplu" "$HushMode"
|
||||||
"$Latitude" "$LatMin" "$LatSec" "$Location" "$LongDeg" "$Longitude"
|
"$IgnoreOnce" "$InfDelta" "$IntMax" "$IntMin" "$Is" "$January" "$July"
|
||||||
"$LongMin" "$LongSec" "$March" "$MaxSatIter" "$MaxStringLen" "$May"
|
"$June" "$LatDeg" "$Latitude" "$LatMin" "$LatSec" "$Location"
|
||||||
"$MinsFromUTC" "$Minute" "$Monday" "$Mplu" "$NextMode" "$November" "$Now" "$NumQueued"
|
"$LongDeg" "$Longitude" "$LongMin" "$LongSec" "$March" "$MaxFullOmits"
|
||||||
"$NumTrig" "$October" "$On" "$Pm" "$PrefixLineNo" "$PSCal" "$RunOff" "$Saturday"
|
"$MaxLateMinutes" "$MaxPartialOmits" "$MaxSatIter" "$MaxStringLen"
|
||||||
"$September" "$SimpleCal" "$SortByDate" "$SortByPrio" "$SortByTime"
|
"$May" "$MinsFromUTC" "$Minute" "$Monday" "$Mplu" "$NextMode"
|
||||||
"$SubsIndent" "$Sunday" "$SysInclude" "$T" "$Td" "$Thursday" "$TimeSep" "$Tm"
|
"$November" "$Now" "$NumFullOmits" "$NumPartialOmits" "$NumQueued"
|
||||||
"$Today" "$Tomorrow" "$Tuesday" "$Tw" "$Ty" "$U" "$Ud" "$Um" "$UntimedFirst" "$Uw" "$Uy"
|
"$NumTrig" "$October" "$On" "$OnceFile" "$ParseUntriggered" "$Pm"
|
||||||
"$Was" "$Wednesday")
|
"$PrefixLineNo" "$PSCal" "$RunOff" "$Saturday" "$September"
|
||||||
|
"$SimpleCal" "$SortByDate" "$SortByPrio" "$SortByTime" "$SubsIndent"
|
||||||
|
"$Sunday" "$SuppressImplicitWarnings" "$SuppressLRM" "$SysInclude" "$T" "$Td"
|
||||||
|
"$TerminalBackground" "$Thursday" "$TimeSep" "$Tm" "$Today"
|
||||||
|
"$Tomorrow" "$Tt" "$Tuesday" "$Tw" "$Ty" "$U" "$Ud" "$Um"
|
||||||
|
"$UntimedFirst" "$Use256Colors" "$UseBGVTColors" "$UseTrueColors"
|
||||||
|
"$UseVTColors" "$Uw" "$Uy" "$Was" "$Wednesday")
|
||||||
#'(lambda (a b) (> (length a) (length b)))))
|
#'(lambda (a b) (> (length a) (length b)))))
|
||||||
|
|
||||||
|
|
||||||
(defconst remind-time-words
|
(defconst remind-time-words
|
||||||
(sort
|
(sort
|
||||||
(list "Jan" "January" "Feb" "Mar" "Apr" "Jun" "Jul" "Aug" "Sept" "Sep" "Oct" "Nov" "Dec"
|
(list "Apr" "April" "Aug" "August" "Dec" "December" "Feb" "February"
|
||||||
"February" "March" "April" "May" "June" "July" "August" "September" "October"
|
"Jan" "January" "Jul" "July" "Jun" "June" "Mar" "March" "May"
|
||||||
"November" "December" "Mon" "Monday" "Tue" "Tues" "Tuesday" "Wed" "Wednesday"
|
"Nov" "November" "Oct" "October" "Sep" "September" "Fri"
|
||||||
"Thu" "Thursday" "Thurs" "Fri" "Friday" "Saturday" "Sat" "Sun" "Sunday")
|
"Friday" "Mon" "Monday" "Sat" "Saturday" "Sun" "Sunday" "Thu"
|
||||||
|
"Thursday" "Tue" "Tuesday" "Wed" "Wednesday")
|
||||||
#'(lambda (a b) (> (length a) (length b)))))
|
#'(lambda (a b) (> (length a) (length b)))))
|
||||||
|
|
||||||
|
|
||||||
(defconst remind-builtin-functions
|
(defconst remind-builtin-functions
|
||||||
(sort
|
(sort
|
||||||
(list "abs" "access" "adawn" "adusk" "ampm" "args" "asc" "baseyr" "char"
|
(list "abs" "access" "adawn" "adusk" "ampm" "ansicolor" "args" "asc"
|
||||||
"choose" "coerce" "current" "date" "datepart" "datetime" "dawn" "day"
|
"baseyr" "char" "choose" "coerce" "columns" "current" "date"
|
||||||
"daysinmon" "defined" "dosubst" "dusk" "easterdate" "evaltrig"
|
"datepart" "datetime" "dawn" "day" "daysinmon" "defined" "dosubst"
|
||||||
"filedate" "filedatetime" "filedir" "filename" "getenv" "hebdate"
|
"dusk" "easterdate" "evaltrig" "filedate" "filedatetime" "filedir"
|
||||||
"hebday" "hebmon" "hebyear" "hour" "iif" "index" "isany" "isdst"
|
"filename" "getenv" "hebdate" "hebday" "hebmon" "hebyear" "hour"
|
||||||
"isleap" "isomitted" "language" "lower" "max" "min" "minsfromutc"
|
"htmlescape" "htmlstriptags" "iif" "index" "isany" "isdst" "isleap"
|
||||||
|
"isomitted" "language" "localtoutc" "lower" "max" "min" "minsfromutc"
|
||||||
"minute" "mon" "monnum" "moondate" "moondatetime" "moonphase"
|
"minute" "mon" "monnum" "moondate" "moondatetime" "moonphase"
|
||||||
"moontime" "ndawn" "ndusk" "nonomitted" "now" "ord" "ostype" "pad" "plural"
|
"moontime" "multitrig" "ndawn" "ndusk" "nonomitted" "now" "ord"
|
||||||
"psmoon" "psshade" "realcurrent" "realnow" "realtoday" "sgn" "shell"
|
"orthodoxeaster" "ostype" "pad" "plural" "psmoon" "psshade"
|
||||||
"shellescape" "slide" "strlen" "substr" "sunrise" "sunset" "time"
|
"realcurrent" "realnow" "realtoday" "rows" "sgn" "shell" "shellescape"
|
||||||
"timepart" "today" "trig" "trigback" "trigdate" "trigdatetime"
|
"slide" "soleq" "stdout" "strlen" "substr" "sunrise" "sunset" "time"
|
||||||
"trigdelta" "trigduration" "trigeventduration" "trigeventstart"
|
"timepart" "timezone" "today" "trig" "trigback" "trigdate"
|
||||||
"trigfrom" "trigger" "trigpriority" "trigrep" "trigscanfrom"
|
"trigdatetime" "trigdelta" "trigduration" "trigeventduration"
|
||||||
"trigtime" "trigtimedelta" "trigtimerep" "triguntil" "trigvalid"
|
"trigeventstart" "trigfrom" "trigger" "trigpriority" "trigrep"
|
||||||
"typeof" "tzconvert" "upper" "value" "version" "weekno" "wkday"
|
"trigscanfrom" "trigtags" "trigtime" "trigtimedelta" "trigtimerep"
|
||||||
"wkdaynum" "year")
|
"triguntil" "trigvalid" "typeof" "tzconvert" "upper" "utctolocal"
|
||||||
|
"value" "version" "weekno" "wkday" "wkdaynum" "year")
|
||||||
#'(lambda (a b) (> (length a) (length b)))))
|
#'(lambda (a b) (> (length a) (length b)))))
|
||||||
|
|
||||||
;;; faces
|
;;; faces
|
||||||
@@ -290,7 +294,7 @@
|
|||||||
|
|
||||||
(defconst remind-conf-font-lock-keywords-1
|
(defconst remind-conf-font-lock-keywords-1
|
||||||
(list
|
(list
|
||||||
'("^[\;\#]\\s-+.*$" . remind-comment-face)
|
'("^\s*[\;\#].*$" . remind-comment-face)
|
||||||
'(remind-keywords-matcher . remind-conf-keyword-face)
|
'(remind-keywords-matcher . remind-conf-keyword-face)
|
||||||
'("%[\"_]" . font-lock-warning-face)
|
'("%[\"_]" . font-lock-warning-face)
|
||||||
'("\\(%[a-mops-w]\\)" . remind-conf-substitutes-face)
|
'("\\(%[a-mops-w]\\)" . remind-conf-substitutes-face)
|
||||||
|
|||||||
308
docs/WHATSNEW
308
docs/WHATSNEW
@@ -1,59 +1,117 @@
|
|||||||
CHANGES TO REMIND
|
CHANGES TO REMIND
|
||||||
|
|
||||||
|
* VERSION 5.0 Patch 6 - 2024-09-16
|
||||||
|
|
||||||
|
- NEW FEATURE: remind: Include a file containing the dates of Chinese
|
||||||
|
New Year through 2050.
|
||||||
|
|
||||||
|
- NEW FEATURE: remind: Add $SuppressImplicitWarnings system variable.
|
||||||
|
Setting this to 1 suppresses the warnings "Unrecognized command;
|
||||||
|
interpreting as REM" and "Missing REM type; assuming MSG"
|
||||||
|
|
||||||
|
- NEW FEATURE: remind: Add --print-tokens command-line argument. This
|
||||||
|
simply prints all of Remind's built-in tokens, functions, and system
|
||||||
|
variables. It's designed to help people who are writing editor
|
||||||
|
add-ons for syntax highlighting.
|
||||||
|
|
||||||
|
- CHANGE: remind: allow '12:34' to be parsed as a TIME constant. This
|
||||||
|
matches DATEs and DATETIMEs which are enclosed in single-quotes.
|
||||||
|
(The quotes are optional for TIME constants, however.)
|
||||||
|
|
||||||
|
- IMPROVEMENT: Improve many error emssages and warnings.
|
||||||
|
|
||||||
|
- UPDATE: contrib/ical2rem: Update to upstream version 0.7
|
||||||
|
|
||||||
|
- IMPROVEMENT: contrib/remind-conf-mode: Improve the Emacs
|
||||||
|
remind-conf-mode package. Add new keywords and make comment
|
||||||
|
highlighting correct.
|
||||||
|
|
||||||
|
- FIX: remind man page: Remove note saying REM can be omitted.
|
||||||
|
|
||||||
|
* VERSION 5.0 Patch 5 - 2024-09-02
|
||||||
|
|
||||||
|
- CHANGE: remind: When using the "-c" option and with the SHADE special
|
||||||
|
enabled, shade the entire calendar box including the line containing the
|
||||||
|
day number.
|
||||||
|
|
||||||
|
- IMPROVEMENT: remind: Better error messages when diagnosing certain
|
||||||
|
errors in expressions.
|
||||||
|
|
||||||
|
- IMPROVEMENT: include/holidays/jewish.rem: Remove unnecessary _h()
|
||||||
|
function definition.
|
||||||
|
|
||||||
|
- BUG FIX: remind: In a couple of spots when we parsed a character, we did
|
||||||
|
not check for an error return. This has been fixed.
|
||||||
|
|
||||||
|
- BUG FIX: remind: Fix edge-case bugs in "remind -c" output formatting.
|
||||||
|
|
||||||
|
- BUG FIX: make test: Fix a test that was broken for all of September 2024.
|
||||||
|
|
||||||
|
- BUG FIX: remind: Fix a couple of potential file-descriptor leaks.
|
||||||
|
|
||||||
|
- BUG FIX: contrib/ical2rem.pl: Replace "SCHED _sfun" with "+15" to
|
||||||
|
hard-code 15-minutes advance warning rather than using an undefined
|
||||||
|
scheduling function. If this is not what you want, you should edit
|
||||||
|
ical2rem.pl to suit your taste; it's not officially part of Remind and
|
||||||
|
is meant more as a starting point for you to customize than a finished
|
||||||
|
product.
|
||||||
|
|
||||||
|
- DOCUMENTATION FIX: Remove obsolete info from Remind man page.
|
||||||
|
|
||||||
* VERSION 5.0 Patch 4 - 2024-08-29
|
* VERSION 5.0 Patch 4 - 2024-08-29
|
||||||
|
|
||||||
* IMPROVEMENT: remind: When checking if a SATISFY expression refers to the
|
- IMPROVEMENT: remind: When checking if a SATISFY expression refers to the
|
||||||
trigger date, look recursively at any user-defined functions it calls.
|
trigger date, look recursively at any user-defined functions it calls.
|
||||||
This reduces spurious warnings.
|
This reduces spurious warnings.
|
||||||
|
|
||||||
* CHANGE: remind: Allow any type to be used as the test argument for IIF.
|
- CHANGE: remind: Allow any type to be used as the test argument for IIF.
|
||||||
|
|
||||||
* IMPROVEMENT: remind man page: Clarify how various types are treated
|
- IMPROVEMENT: remind man page: Clarify how various types are treated
|
||||||
in boolean context.
|
in boolean context.
|
||||||
|
|
||||||
* VERSION 5.0 Patch 3 - 2024-08-28
|
* VERSION 5.0 Patch 3 - 2024-08-28
|
||||||
|
|
||||||
* IMPROVEMENT: remind: Preserve newlines ("%_" sequences) in calendar
|
- IMPROVEMENT: remind: Preserve newlines ("%_" sequences) in calendar
|
||||||
mode in most cases. See the remind man page for details.
|
mode in most cases. See the remind man page for details.
|
||||||
|
|
||||||
* IMPROVEMENT: rem2pdf: rem2pdf can now produce PostScript and
|
- IMPROVEMENT: rem2pdf: rem2pdf can now produce PostScript and
|
||||||
Encapsulated PostScript output in addition to PDF and SVG.
|
Encapsulated PostScript output in addition to PDF and SVG.
|
||||||
|
|
||||||
* IMPROVEMENT: remind: Emit warnings if a subst_XXX function takes the
|
- IMPROVEMENT: remind: Emit warnings if a subst_XXX function takes the
|
||||||
wrong number of arguments, or for custom sequences, if the function
|
wrong number of arguments, or for custom sequences, if the function
|
||||||
is not defined.
|
is not defined.
|
||||||
|
|
||||||
* IMPROVEMENT: remind: Emit warnings if WARN/SCHED/OMITFUNC functions
|
- IMPROVEMENT: remind: Emit warnings if WARN/SCHED/OMITFUNC functions
|
||||||
do not reference their argument.
|
do not reference their argument.
|
||||||
|
|
||||||
* IMPROVEMENT: remind: Allow strings to be used with logical
|
- IMPROVEMENT: remind: Allow strings to be used with logical
|
||||||
operators. The empty string "" is considered false and all other
|
operators. The empty string "" is considered false and all other
|
||||||
strings are considered true.
|
strings are considered true.
|
||||||
|
|
||||||
* IMPROVEMENT: remind: Emit warnings for lines that are implicitly
|
- IMPROVEMENT: remind: Emit warnings for lines that are implicitly
|
||||||
treated as REM commands; add warnings for REM commands that are
|
treated as REM commands; add warnings for REM commands that are
|
||||||
implicitly treated as MSG-type reminders.
|
implicitly treated as MSG-type reminders.
|
||||||
|
|
||||||
* IMPROVEMENT: remind: Add an optional fourth argument to the built-in
|
- IMPROVEMENT: remind: Add an optional fourth argument to the built-in
|
||||||
ampm() function that specifies not to suppress a leading zero in the
|
ampm() function that specifies not to suppress a leading zero in the
|
||||||
hour component.
|
hour component.
|
||||||
|
|
||||||
* IMPROVEMENT: remind: If a SATISFY expression is not constant and
|
- IMPROVEMENT: remind: If a SATISFY expression is not constant and
|
||||||
doesn't reference the trigger date somehow, issue a warning.
|
doesn't reference the trigger date somehow, issue a warning.
|
||||||
|
|
||||||
* IMPROVEMENT: remind: Add a warning if a user-defined function is
|
- IMPROVEMENT: remind: Add a warning if a user-defined function is
|
||||||
redefined. If you do have a use-case that requires you to redefine
|
redefined. If you do have a use-case that requires you to redefine
|
||||||
a function, simply FUNSET it first before FSETting it for the second
|
a function, simply FUNSET it first before FSETting it for the second
|
||||||
time.
|
time.
|
||||||
|
|
||||||
* DOCUMENTATION FIX: Clarify man pages and remove some information that
|
- DOCUMENTATION FIX: Clarify man pages and remove some information that
|
||||||
has become incorrect as Remind has evolved.
|
has become incorrect as Remind has evolved.
|
||||||
|
|
||||||
* BUG FIX: Fix typos in man pages
|
- BUG FIX: Fix typos in man pages
|
||||||
|
|
||||||
* VERSION 5.0 Patch 2 - 2024-07-26
|
* VERSION 5.0 Patch 2 - 2024-07-26
|
||||||
|
|
||||||
* IMPROVEMENT: Remind: Revamp how ONCE works. You can now set a
|
- IMPROVEMENT: Remind: Revamp how ONCE works. You can now set a
|
||||||
special variable $OnceFile to be the path to a timestamp file. The
|
special variable $OnceFile to be the path to a timestamp file. The
|
||||||
ONCE directive uses this timestamp file to track when it was last
|
ONCE directive uses this timestamp file to track when it was last
|
||||||
run rather than the access date of the main reminder script. This
|
run rather than the access date of the main reminder script. This
|
||||||
@@ -61,38 +119,38 @@ CHANGES TO REMIND
|
|||||||
(which might not be maintained accurately) and is not affected if
|
(which might not be maintained accurately) and is not affected if
|
||||||
you edit your reminder script.
|
you edit your reminder script.
|
||||||
|
|
||||||
* CHANGE: Taking input from stdin no longer implies the "-o" option; ONCE can
|
- CHANGE: Taking input from stdin no longer implies the "-o" option; ONCE can
|
||||||
work if you set $OnceFile
|
work if you set $OnceFile
|
||||||
|
|
||||||
* CHANGE: Any of the -c, -n, -p and -s options implicitly enable the
|
- 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
|
-o option. As before, specifying a repeat factor *N or a date that
|
||||||
is not today on the command-line also implies -o.
|
is not today on the command-line also implies -o.
|
||||||
|
|
||||||
* MINOR NEW FEATURE: Rem2PDF: Add the "--svg" command-line option to produce
|
- MINOR NEW FEATURE: Rem2PDF: Add the "--svg" command-line option to produce
|
||||||
SVG output rather than PDF.
|
SVG output rather than PDF.
|
||||||
|
|
||||||
* MINOR IMPROVEMENT: Remind: Improve the storage efficiency of short
|
- MINOR IMPROVEMENT: Remind: Improve the storage efficiency of short
|
||||||
string constants in compiled expression trees.
|
string constants in compiled expression trees.
|
||||||
|
|
||||||
* MINOR IMPROVEMENT: Remind: Remove some obsolete macro definitions
|
- MINOR IMPROVEMENT: Remind: Remove some obsolete macro definitions
|
||||||
|
|
||||||
* VERSION 5.0 Patch 1 - 2024-06-08
|
* VERSION 5.0 Patch 1 - 2024-06-08
|
||||||
|
|
||||||
* MINOR IMPROVEMENT: Add short-circuit evaluation to the isany() function,
|
- MINOR IMPROVEMENT: Add short-circuit evaluation to the isany() function,
|
||||||
which now only evaluates those arguments absolutely necessary to determine
|
which now only evaluates those arguments absolutely necessary to determine
|
||||||
the result.
|
the result.
|
||||||
|
|
||||||
* BUG FIX: Mark weekno() as a non-constant function (the zero-argument form
|
- BUG FIX: Mark weekno() as a non-constant function (the zero-argument form
|
||||||
depends on external conditions.)
|
depends on external conditions.)
|
||||||
|
|
||||||
* BUG FIX: Fix a couple of memory leaks.
|
- BUG FIX: Fix a couple of memory leaks.
|
||||||
|
|
||||||
* BUG FIX: Don't rely on support for unnamed function parameters; this caused
|
- BUG FIX: Don't rely on support for unnamed function parameters; this caused
|
||||||
compilation failures with older versions of gcc.
|
compilation failures with older versions of gcc.
|
||||||
|
|
||||||
* VERSION 5.0 Patch 0 - 2024-06-06
|
* VERSION 5.0 Patch 0 - 2024-06-06
|
||||||
|
|
||||||
* MAJOR CHANGE: The expression evaluation engine has been completely replaced
|
- MAJOR CHANGE: The expression evaluation engine has been completely replaced
|
||||||
with a new one that splits parsing and evaluating into two separate steps.
|
with a new one that splits parsing and evaluating into two separate steps.
|
||||||
It also features short-circuit evaluation of &&, ||, iif() and choose().
|
It also features short-circuit evaluation of &&, ||, iif() and choose().
|
||||||
This should speed up expression-heavy reminder files.
|
This should speed up expression-heavy reminder files.
|
||||||
@@ -123,56 +181,56 @@ CHANGES TO REMIND
|
|||||||
|
|
||||||
and it will work for values of n that don't cause integer overflow.
|
and it will work for values of n that don't cause integer overflow.
|
||||||
|
|
||||||
* IMPROVEMENT: If there's an unmatched PUSH-OMIT-CONTEXT, print the
|
- IMPROVEMENT: If there's an unmatched PUSH-OMIT-CONTEXT, print the
|
||||||
filename and line number containing it.
|
filename and line number containing it.
|
||||||
|
|
||||||
* IMPROVEMENT: If there's an IF with a missing ENDIF, print the filename
|
- IMPROVEMENT: If there's an IF with a missing ENDIF, print the filename
|
||||||
and line number of the IF statement.
|
and line number of the IF statement.
|
||||||
|
|
||||||
* NEW FEATURE: Add EXPR OFF command to completely disable expression
|
- NEW FEATURE: Add EXPR OFF command to completely disable expression
|
||||||
evaluation. Useful if you INCLUDE files that you don't expect to
|
evaluation. Useful if you INCLUDE files that you don't expect to
|
||||||
contain expressions and may come from slightly untrustworthy sources.
|
contain expressions and may come from slightly untrustworthy sources.
|
||||||
|
|
||||||
* NEW FEATURE: Add $ExpressionTimeLimit system variable to enforce a
|
- NEW FEATURE: Add $ExpressionTimeLimit system variable to enforce a
|
||||||
maximum limit on how long evaluating an expression is allowed to take.
|
maximum limit on how long evaluating an expression is allowed to take.
|
||||||
|
|
||||||
* NEW FEATURE: Add --max-execution-time=n command-line option to terminate
|
- NEW FEATURE: Add --max-execution-time=n command-line option to terminate
|
||||||
Remind if it runs for more than n seconds.
|
Remind if it runs for more than n seconds.
|
||||||
|
|
||||||
* CHANGE: Make the command-line option "-ifoo" equivalent to "-ifoo=0"
|
- CHANGE: Make the command-line option "-ifoo" equivalent to "-ifoo=0"
|
||||||
|
|
||||||
* CHANGE: Permit a literal [ in a reminder by using the sequence [[
|
- CHANGE: Permit a literal [ in a reminder by using the sequence [[
|
||||||
The old ["["] still works.
|
The old ["["] still works.
|
||||||
|
|
||||||
* BUG FIX: In "purge" mode, Remind would sometimes purge reminders with
|
- BUG FIX: In "purge" mode, Remind would sometimes purge reminders with
|
||||||
a relative "SCANFROM" which haven't actually expired. This has been fixed.
|
a relative "SCANFROM" which haven't actually expired. This has been fixed.
|
||||||
|
|
||||||
* BUG FIX: Disallow something like: FSET func(x, x) expr
|
- BUG FIX: Disallow something like: FSET func(x, x) expr
|
||||||
which shouldn't have been allowed in the first place.
|
which shouldn't have been allowed in the first place.
|
||||||
|
|
||||||
* BUG FIX: Replace leading spaces with tabs in Makefiles (per Emanuele Torre
|
- BUG FIX: Replace leading spaces with tabs in Makefiles (per Emanuele Torre
|
||||||
and Tim Chase)
|
and Tim Chase)
|
||||||
|
|
||||||
* VERSION 4.3 Patch 7 - 2024-04-29
|
* VERSION 4.3 Patch 7 - 2024-04-29
|
||||||
|
|
||||||
* IMPROVEMENT: build.tk: Add a note if build.tk obtains default settings
|
- IMPROVEMENT: build.tk: Add a note if build.tk obtains default settings
|
||||||
from an existing Remind installation.
|
from an existing Remind installation.
|
||||||
|
|
||||||
* IMPROVEMENT: configure: Pass all args to AC_INIT including the Remind
|
- IMPROVEMENT: configure: Pass all args to AC_INIT including the Remind
|
||||||
home page. Remove some unused autoconf cruft.
|
home page. Remove some unused autoconf cruft.
|
||||||
|
|
||||||
* IMPROVEMENT: Use standard C library versions of strdup, strcasecmp and
|
- IMPROVEMENT: Use standard C library versions of strdup, strcasecmp and
|
||||||
strncasecmp where available, rather than using our own versions.
|
strncasecmp where available, rather than using our own versions.
|
||||||
|
|
||||||
* MINOR FEATURE: remind: Make $Tt a synonym for trigtime().
|
- MINOR FEATURE: remind: Make $Tt a synonym for trigtime().
|
||||||
|
|
||||||
* BUG FIX: remind: Make sure shellescape() doesn't mangle UTF-8 characters
|
- BUG FIX: remind: Make sure shellescape() doesn't mangle UTF-8 characters
|
||||||
with high-bits set.
|
with high-bits set.
|
||||||
|
|
||||||
* BUG FIX: remind: Don't rely on undefined behavior of "%" operator in
|
- BUG FIX: remind: Don't rely on undefined behavior of "%" operator in
|
||||||
the ord() built-in function.
|
the ord() built-in function.
|
||||||
|
|
||||||
* BUG FIX: remind: Do not clear out trigtime() unnecessarily. Before,
|
- BUG FIX: remind: Do not clear out trigtime() unnecessarily. Before,
|
||||||
you could not write things like the following; now you can:
|
you could not write things like the following; now you can:
|
||||||
|
|
||||||
REM Tue AT 11:30 DURATION 0:30 MSG Thing 1
|
REM Tue AT 11:30 DURATION 0:30 MSG Thing 1
|
||||||
@@ -182,90 +240,90 @@ CHANGES TO REMIND
|
|||||||
for successive reminders that should be moved as a block if the time of
|
for successive reminders that should be moved as a block if the time of
|
||||||
the first one changes.
|
the first one changes.
|
||||||
|
|
||||||
* BUG FIX: Don't update trigdate() or trigtime() while parsing a REM
|
- BUG FIX: Don't update trigdate() or trigtime() while parsing a REM
|
||||||
statement... only when actually computing the trigger.
|
statement... only when actually computing the trigger.
|
||||||
|
|
||||||
* VERSION 4.3 Patch 6 - 2024-04-02
|
* VERSION 4.3 Patch 6 - 2024-04-02
|
||||||
|
|
||||||
* NEW FILE: Add [$SysInclude]/holidays/pt.rem - Portuguese holidays, courtesy
|
- NEW FILE: Add [$SysInclude]/holidays/pt.rem - Portuguese holidays, courtesy
|
||||||
of Joop Kiefte.
|
of Joop Kiefte.
|
||||||
|
|
||||||
* BUG FIX: remind: Fix compile error on systems that don't support inotify(7).
|
- BUG FIX: remind: Fix compile error on systems that don't support inotify(7).
|
||||||
|
|
||||||
* BUG FIX: remind: Fix test failures on FreeBSD. On FreeBSD, you have to copy
|
- BUG FIX: remind: Fix test failures on FreeBSD. On FreeBSD, you have to copy
|
||||||
the result of getenv() or else a subsequent setenv() can change the stored
|
the result of getenv() or else a subsequent setenv() can change the stored
|
||||||
value.
|
value.
|
||||||
|
|
||||||
* VERSION 4.3 Patch 5 - 2024-04-01
|
* VERSION 4.3 Patch 5 - 2024-04-01
|
||||||
|
|
||||||
* IMPROVEMENT: remind: Use inotify to detect reminder file changes
|
- IMPROVEMENT: remind: Use inotify to detect reminder file changes
|
||||||
even in regular daemon mode (-zn where n>0).
|
even in regular daemon mode (-zn where n>0).
|
||||||
|
|
||||||
* INTERNAL IMPROVEMENTS: Rearrange and refactor some code.
|
- INTERNAL IMPROVEMENTS: Rearrange and refactor some code.
|
||||||
|
|
||||||
* FIXES: Various fixes and improvements to man pages.
|
- FIXES: Various fixes and improvements to man pages.
|
||||||
|
|
||||||
* BUG FIX: remind: Handle queued "SPECIAL COLOR" reminders correctly.
|
- BUG FIX: remind: Handle queued "SPECIAL COLOR" reminders correctly.
|
||||||
|
|
||||||
* BUG FIX: remind: Preserve the value of $DefaultColor that was in effect
|
- BUG FIX: remind: Preserve the value of $DefaultColor that was in effect
|
||||||
when a reminder was queued; restore it before issuing the queued reminder.
|
when a reminder was queued; restore it before issuing the queued reminder.
|
||||||
|
|
||||||
* VERSION 4.3 Patch 4 - 2024-03-25
|
* VERSION 4.3 Patch 4 - 2024-03-25
|
||||||
|
|
||||||
* NEW FEATURE: remind: Add the new "multitrig" function, which is how "trig"
|
- NEW FEATURE: remind: Add the new "multitrig" function, which is how "trig"
|
||||||
should have worked in the first place. See man page for details.
|
should have worked in the first place. See man page for details.
|
||||||
|
|
||||||
* IMPROVEMENT: tkremind: Make errors in your reminders file stand out more
|
- IMPROVEMENT: tkremind: Make errors in your reminders file stand out more
|
||||||
prominently.
|
prominently.
|
||||||
|
|
||||||
* IMPROVEMENT: tkremind: If you click on an error in the "Errors..." popup,
|
- IMPROVEMENT: tkremind: If you click on an error in the "Errors..." popup,
|
||||||
tkremind will open a text editor on the offending file and line.
|
tkremind will open a text editor on the offending file and line.
|
||||||
|
|
||||||
* IMPROVEMENT: tkremind: Format the "Queue..." output better and make queue
|
- IMPROVEMENT: tkremind: Format the "Queue..." output better and make queue
|
||||||
items clickable; clicking on a queue item opens a text editor on the
|
items clickable; clicking on a queue item opens a text editor on the
|
||||||
corresponding file and line.
|
corresponding file and line.
|
||||||
|
|
||||||
* IMPROVEMENT: Add a standard [$SysInclude]/moonphases.rem file to display
|
- IMPROVEMENT: Add a standard [$SysInclude]/moonphases.rem file to display
|
||||||
moon phases on your calendar.
|
moon phases on your calendar.
|
||||||
|
|
||||||
* IMPROVEMENT: Clean up the demo code in www/ and add PDF output.
|
- IMPROVEMENT: Clean up the demo code in www/ and add PDF output.
|
||||||
|
|
||||||
* BUG FIX: tkremind: Correctly handle filenames containing spaces and other
|
- BUG FIX: tkremind: Correctly handle filenames containing spaces and other
|
||||||
characters that tend to confuse the shell.
|
characters that tend to confuse the shell.
|
||||||
|
|
||||||
* BUG FIX: tkremind: Raise dialog boxes after errors so that they
|
- BUG FIX: tkremind: Raise dialog boxes after errors so that they
|
||||||
remain visible.
|
remain visible.
|
||||||
|
|
||||||
* CLEANUP: tkremind: Remove some dead code.
|
- CLEANUP: tkremind: Remove some dead code.
|
||||||
|
|
||||||
* VERSION 4.3 Patch 3 - 2024-03-18
|
* VERSION 4.3 Patch 3 - 2024-03-18
|
||||||
|
|
||||||
* IMPROVEMENT: tkremind: Update icon to include a white border so it shows
|
- IMPROVEMENT: tkremind: Update icon to include a white border so it shows
|
||||||
up better on dark backgrounds.
|
up better on dark backgrounds.
|
||||||
|
|
||||||
* IMPROVEMENT: C code: Fix a number of cppcheck static-analysis warnings.
|
- IMPROVEMENT: C code: Fix a number of cppcheck static-analysis warnings.
|
||||||
|
|
||||||
* IMPROVEMENT: remind: Update the "-zj" protocol to include a queue-id for
|
- IMPROVEMENT: remind: Update the "-zj" protocol to include a queue-id for
|
||||||
each queued reminder and add the DEL client command to delete a specific
|
each queued reminder and add the DEL client command to delete a specific
|
||||||
item from the queue. Used by tkremind to implement "don't remind me about
|
item from the queue. Used by tkremind to implement "don't remind me about
|
||||||
this again today."
|
this again today."
|
||||||
|
|
||||||
* MINOR NEW FEATURE: Add a "-ds" debugging flag to print out expression-parsing
|
- MINOR NEW FEATURE: Add a "-ds" debugging flag to print out expression-parsing
|
||||||
stack high-water marks on exit. This esoteric feature is of no use to
|
stack high-water marks on exit. This esoteric feature is of no use to
|
||||||
anyone but the Remind author.
|
anyone but the Remind author.
|
||||||
|
|
||||||
* IMPROVEMENT: tkremind: Stop using the deprecated tk_dialog command in favor
|
- IMPROVEMENT: tkremind: Stop using the deprecated tk_dialog command in favor
|
||||||
of the newer tk_messageBox command.
|
of the newer tk_messageBox command.
|
||||||
|
|
||||||
* IMPROVEMENT: remind: In server mode, try to minimize redraws by
|
- IMPROVEMENT: remind: In server mode, try to minimize redraws by
|
||||||
consuming inotify events until at least 0.2s elapses without an
|
consuming inotify events until at least 0.2s elapses without an
|
||||||
event appearing.
|
event appearing.
|
||||||
|
|
||||||
* BUG FIX: tkremind: The "Don't remind me about this again today" feature
|
- BUG FIX: tkremind: The "Don't remind me about this again today" feature
|
||||||
was unreliable and only worked for reminders created with TkRemind itself.
|
was unreliable and only worked for reminders created with TkRemind itself.
|
||||||
It has been made more reliable and works with any reminder.
|
It has been made more reliable and works with any reminder.
|
||||||
|
|
||||||
* BUG FIX: remind: Make it a syntax error if a local OMIT in a REM statement
|
- BUG FIX: remind: Make it a syntax error if a local OMIT in a REM statement
|
||||||
is not followed by at least one weekday name.
|
is not followed by at least one weekday name.
|
||||||
|
|
||||||
* VERSION 4.3 Patch 2 - 2024-03-01
|
* VERSION 4.3 Patch 2 - 2024-03-01
|
||||||
@@ -1238,7 +1296,7 @@ CHANGES TO REMIND
|
|||||||
|
|
||||||
- MINOR IMPROVEMENT: Add the "ampm()" built-in function.
|
- MINOR IMPROVEMENT: Add the "ampm()" built-in function.
|
||||||
|
|
||||||
* Version 3.3 Patch 0 - 2020-01-31
|
* VERSION 3.3 Patch 0 - 2020-01-31
|
||||||
|
|
||||||
- FIX: rem2ps: Add a %%PageBoundingBox: document structuring convention
|
- FIX: rem2ps: Add a %%PageBoundingBox: document structuring convention
|
||||||
comment.
|
comment.
|
||||||
@@ -1273,7 +1331,7 @@ CHANGES TO REMIND
|
|||||||
- CHANGE: SPECIALs are now case-insensitive. Before, only SPECIAL COLOR
|
- CHANGE: SPECIALs are now case-insensitive. Before, only SPECIAL COLOR
|
||||||
would work. Now you can use Special Color, special color, etc.
|
would work. Now you can use Special Color, special color, etc.
|
||||||
|
|
||||||
* Version 3.2 Patch 0 - 2020-01-03
|
* VERSION 3.2 Patch 0 - 2020-01-03
|
||||||
|
|
||||||
- IMPROVEMENT: Add support for events spanning multiple days (with AT
|
- IMPROVEMENT: Add support for events spanning multiple days (with AT
|
||||||
and DURATION). Add trigeventstart() and trigeventduration()
|
and DURATION). Add trigeventstart() and trigeventduration()
|
||||||
@@ -1315,7 +1373,7 @@ CHANGES TO REMIND
|
|||||||
- BUG FIX: TkRemind: Fix startup failure of TkRemind if options are at
|
- BUG FIX: TkRemind: Fix startup failure of TkRemind if options are at
|
||||||
default. :(
|
default. :(
|
||||||
|
|
||||||
* Version 3.1 Patch 17 - 2019-11-15
|
* VERSION 3.1 Patch 17 - 2019-11-15
|
||||||
|
|
||||||
- IMPROVEMENT: Add "Extra Remind Options" setting to TkRemind.
|
- IMPROVEMENT: Add "Extra Remind Options" setting to TkRemind.
|
||||||
|
|
||||||
@@ -1332,7 +1390,7 @@ CHANGES TO REMIND
|
|||||||
|
|
||||||
- BUG FIX: Fix various documentation errors and update man page.
|
- BUG FIX: Fix various documentation errors and update man page.
|
||||||
|
|
||||||
* Version 3.1 Patch 16 - 2018-11-09
|
* VERSION 3.1 Patch 16 - 2018-11-09
|
||||||
|
|
||||||
- IMPROVEMENT: Add patch from Stephen Morgan to calculate astronomical and
|
- IMPROVEMENT: Add patch from Stephen Morgan to calculate astronomical and
|
||||||
nautical twilight in addition to civil twilight.
|
nautical twilight in addition to civil twilight.
|
||||||
@@ -1362,7 +1420,7 @@ CHANGES TO REMIND
|
|||||||
- BUG FIX: In "remind -z0" mode, remind wakes up exactly on the minute instead
|
- BUG FIX: In "remind -z0" mode, remind wakes up exactly on the minute instead
|
||||||
of sleeping for 60 seconds each time, which could cause it to fall behind.
|
of sleeping for 60 seconds each time, which could cause it to fall behind.
|
||||||
|
|
||||||
* Version 3.1 Patch 15 - 2015-07-27
|
* VERSION 3.1 Patch 15 - 2015-07-27
|
||||||
|
|
||||||
- BUG FIX: Fix a buffer overflow found by Alexander Keller
|
- BUG FIX: Fix a buffer overflow found by Alexander Keller
|
||||||
|
|
||||||
@@ -1372,7 +1430,7 @@ CHANGES TO REMIND
|
|||||||
|
|
||||||
- BUG FIX: Make parser reject repeated delta or *repeat values.
|
- BUG FIX: Make parser reject repeated delta or *repeat values.
|
||||||
|
|
||||||
* Version 3.1 Patch 14 - 2015-04-24
|
* VERSION 3.1 Patch 14 - 2015-04-24
|
||||||
|
|
||||||
- NEW FEATURE: Putting the line __EOF__ in a .rem file causes Remind
|
- NEW FEATURE: Putting the line __EOF__ in a .rem file causes Remind
|
||||||
to treat it as end-of-file.
|
to treat it as end-of-file.
|
||||||
@@ -1389,7 +1447,7 @@ CHANGES TO REMIND
|
|||||||
|
|
||||||
- BUG FIX: Typo in Spanish translation was fixed.
|
- BUG FIX: Typo in Spanish translation was fixed.
|
||||||
|
|
||||||
* Version 3.1 Patch 13 - 2013-03-22
|
* VERSION 3.1 Patch 13 - 2013-03-22
|
||||||
|
|
||||||
- BUG FIX: Sunrise/Sunset calculations greatly improved thanks to John
|
- BUG FIX: Sunrise/Sunset calculations greatly improved thanks to John
|
||||||
McGowan. Accuracy should now be within a couple of minutes in most
|
McGowan. Accuracy should now be within a couple of minutes in most
|
||||||
@@ -1406,7 +1464,7 @@ CHANGES TO REMIND
|
|||||||
|
|
||||||
- BUG FIX: Spurious test harness failure was fixed.
|
- BUG FIX: Spurious test harness failure was fixed.
|
||||||
|
|
||||||
* Version 3.1 Patch 12 - 2012-01-23
|
* VERSION 3.1 Patch 12 - 2012-01-23
|
||||||
|
|
||||||
- NEW FEATURE: Many substitution sequences "%x" have an alternate mode
|
- NEW FEATURE: Many substitution sequences "%x" have an alternate mode
|
||||||
denoted by "%*x". This alternate mode leaves out prepositions. For
|
denoted by "%*x". This alternate mode leaves out prepositions. For
|
||||||
@@ -1418,7 +1476,7 @@ CHANGES TO REMIND
|
|||||||
so the results may be off by a minute or two compared to previous versions
|
so the results may be off by a minute or two compared to previous versions
|
||||||
of Remind.
|
of Remind.
|
||||||
|
|
||||||
* Version 3.1 Patch 11 - 2011-12-16
|
* VERSION 3.1 Patch 11 - 2011-12-16
|
||||||
|
|
||||||
- BUG FIX: For some inexplicable reason, dawn was considered to happen when
|
- BUG FIX: For some inexplicable reason, dawn was considered to happen when
|
||||||
the sun was 14 degrees below the horizon instead of the standard 6
|
the sun was 14 degrees below the horizon instead of the standard 6
|
||||||
@@ -1432,7 +1490,7 @@ CHANGES TO REMIND
|
|||||||
|
|
||||||
- BUG FIX: Apply minor Debian cleanups reported by Kurt B. Kaiser.
|
- BUG FIX: Apply minor Debian cleanups reported by Kurt B. Kaiser.
|
||||||
|
|
||||||
* Version 3.1 Patch 10 - 2010-11-01
|
* VERSION 3.1 Patch 10 - 2010-11-01
|
||||||
|
|
||||||
- NOTE: This is the 20th anniversary of Remind's first public release.
|
- NOTE: This is the 20th anniversary of Remind's first public release.
|
||||||
|
|
||||||
@@ -1456,7 +1514,7 @@ CHANGES TO REMIND
|
|||||||
- BUG FIX: Don't declare variables in the middle of statements (old C
|
- BUG FIX: Don't declare variables in the middle of statements (old C
|
||||||
compilers choke.)
|
compilers choke.)
|
||||||
|
|
||||||
* Version 3.1 Patch 9 - 2010-06-20
|
* VERSION 3.1 Patch 9 - 2010-06-20
|
||||||
|
|
||||||
- MAJOR ENHANCEMENT: New "purge mode" to delete expired reminders. See
|
- MAJOR ENHANCEMENT: New "purge mode" to delete expired reminders. See
|
||||||
the PURGE MODE section of the remind man page.
|
the PURGE MODE section of the remind man page.
|
||||||
@@ -1472,7 +1530,7 @@ CHANGES TO REMIND
|
|||||||
- BUG FIX: Yom HaShoah is moved to Thursday if it would normally fall on
|
- BUG FIX: Yom HaShoah is moved to Thursday if it would normally fall on
|
||||||
a Friday. Thanks to Jonathan Kamens for pointing this out.
|
a Friday. Thanks to Jonathan Kamens for pointing this out.
|
||||||
|
|
||||||
* Version 3.1 Patch 8 - 2010-03-09
|
* VERSION 3.1 Patch 8 - 2010-03-09
|
||||||
|
|
||||||
- ENHANCEMENT: Include some useful scripts in contrib/
|
- ENHANCEMENT: Include some useful scripts in contrib/
|
||||||
|
|
||||||
@@ -1492,7 +1550,7 @@ CHANGES TO REMIND
|
|||||||
- BUG FIX: Fix bug in SCHED calculations if Remind is started in the middle
|
- BUG FIX: Fix bug in SCHED calculations if Remind is started in the middle
|
||||||
of a SCHED interval.
|
of a SCHED interval.
|
||||||
|
|
||||||
* Version 3.1 Patch 7 - 2009-05-31
|
* VERSION 3.1 Patch 7 - 2009-05-31
|
||||||
|
|
||||||
- ENHANCEMENT: Wherever you could write "day Mon year", the parser now
|
- ENHANCEMENT: Wherever you could write "day Mon year", the parser now
|
||||||
accepts "YYYY-MM-DD". This applies on the command-line and to the
|
accepts "YYYY-MM-DD". This applies on the command-line and to the
|
||||||
@@ -1501,7 +1559,7 @@ CHANGES TO REMIND
|
|||||||
|
|
||||||
- ENHANCEMENT: New slide() built-in function eases some complicated reminders.
|
- ENHANCEMENT: New slide() built-in function eases some complicated reminders.
|
||||||
|
|
||||||
* Version 3.1 Patch 6 - 2008-11-16
|
* VERSION 3.1 Patch 6 - 2008-11-16
|
||||||
|
|
||||||
- MAJOR ENHANCEMENT: A new OMITFUNC clause gives you additional
|
- MAJOR ENHANCEMENT: A new OMITFUNC clause gives you additional
|
||||||
control and flexibility over "omitted days" calculations. This is
|
control and flexibility over "omitted days" calculations. This is
|
||||||
@@ -1529,7 +1587,7 @@ CHANGES TO REMIND
|
|||||||
weekday would fail if it needed to cross a year boundary. This has
|
weekday would fail if it needed to cross a year boundary. This has
|
||||||
been fixed.
|
been fixed.
|
||||||
|
|
||||||
* Version 3.1 Patch 5 - 2008-04-15
|
* VERSION 3.1 Patch 5 - 2008-04-15
|
||||||
|
|
||||||
- MAJOR ENHANCEMENT: If you supply a directory name on the command line
|
- MAJOR ENHANCEMENT: If you supply a directory name on the command line
|
||||||
or for an INCLUDE command, then Remind reads all *.rem file in that
|
or for an INCLUDE command, then Remind reads all *.rem file in that
|
||||||
@@ -1559,7 +1617,7 @@ CHANGES TO REMIND
|
|||||||
|
|
||||||
- BUG FIX: Parse error in calendar mode was fixed.
|
- BUG FIX: Parse error in calendar mode was fixed.
|
||||||
|
|
||||||
* Version 3.1 Patch 4 - 2008-02-03
|
* VERSION 3.1 Patch 4 - 2008-02-03
|
||||||
|
|
||||||
- ENHANCEMENT: tkremind respects the "-b1" option and operates in 24-hour
|
- ENHANCEMENT: tkremind respects the "-b1" option and operates in 24-hour
|
||||||
clock mode if the option is supplied.
|
clock mode if the option is supplied.
|
||||||
@@ -1581,7 +1639,7 @@ CHANGES TO REMIND
|
|||||||
- BUG FIX: The "-ivar=value" command-line option failed if Remind re-execed
|
- BUG FIX: The "-ivar=value" command-line option failed if Remind re-execed
|
||||||
itself because we overwrote argv[]. This has been fixed.
|
itself because we overwrote argv[]. This has been fixed.
|
||||||
|
|
||||||
* Version 3.1 Patch 3 - 2007-10-15
|
* VERSION 3.1 Patch 3 - 2007-10-15
|
||||||
|
|
||||||
+ MINOR ENHANCEMENTS
|
+ MINOR ENHANCEMENTS
|
||||||
|
|
||||||
@@ -1600,7 +1658,7 @@ CHANGES TO REMIND
|
|||||||
is not evaluated. This helps avoid spurious error messages in some
|
is not evaluated. This helps avoid spurious error messages in some
|
||||||
reminders.
|
reminders.
|
||||||
|
|
||||||
* Version 3.1 Patch 2 - 2007-09-12
|
* VERSION 3.1 Patch 2 - 2007-09-12
|
||||||
|
|
||||||
+ MINOR ENHANCEMENTS
|
+ MINOR ENHANCEMENTS
|
||||||
|
|
||||||
@@ -1654,7 +1712,7 @@ CHANGES TO REMIND
|
|||||||
- Using the psshade() or psmoon() functions emits a warning on stderr. You
|
- Using the psshade() or psmoon() functions emits a warning on stderr. You
|
||||||
should use SPECIAL SHADE or SPECIAL MOON instead.
|
should use SPECIAL SHADE or SPECIAL MOON instead.
|
||||||
|
|
||||||
* Version 3.1 Patch 1 - 2007-08-23
|
* VERSION 3.1 Patch 1 - 2007-08-23
|
||||||
|
|
||||||
+ MAJOR ENHANCEMENTS
|
+ MAJOR ENHANCEMENTS
|
||||||
|
|
||||||
@@ -1684,7 +1742,7 @@ CHANGES TO REMIND
|
|||||||
|
|
||||||
- Various man-page fixes.
|
- Various man-page fixes.
|
||||||
|
|
||||||
* Version 3.1 Patch 0 - 2007-07-14
|
* VERSION 3.1 Patch 0 - 2007-07-14
|
||||||
|
|
||||||
+ MAJOR ENHANCEMENTS
|
+ MAJOR ENHANCEMENTS
|
||||||
|
|
||||||
@@ -1747,7 +1805,7 @@ CHANGES TO REMIND
|
|||||||
- rem2ps would produce invalid PostScript in some rare cases
|
- rem2ps would produce invalid PostScript in some rare cases
|
||||||
(eg, for February 2007). This has been fixed.
|
(eg, for February 2007). This has been fixed.
|
||||||
|
|
||||||
* Version 3.0 Patch 24 - 2005-11-19
|
* VERSION 3.0 Patch 24 - 2005-11-19
|
||||||
|
|
||||||
+ MINOR ENHANCEMENTS
|
+ MINOR ENHANCEMENTS
|
||||||
|
|
||||||
@@ -1770,7 +1828,7 @@ CHANGES TO REMIND
|
|||||||
- Fixed a bug in the tokenizer that could make Remind segfault. Fix courtesy
|
- Fixed a bug in the tokenizer that could make Remind segfault. Fix courtesy
|
||||||
of Stan Tobias.
|
of Stan Tobias.
|
||||||
|
|
||||||
* Version 3.0 Patch 23 - 2005-04-14
|
* VERSION 3.0 Patch 23 - 2005-04-14
|
||||||
|
|
||||||
+ MINOR ENHANCEMENTS
|
+ MINOR ENHANCEMENTS
|
||||||
|
|
||||||
@@ -1794,7 +1852,7 @@ CHANGES TO REMIND
|
|||||||
|
|
||||||
- Fixed parser error for unterminated date constant: '2005/01/01
|
- Fixed parser error for unterminated date constant: '2005/01/01
|
||||||
|
|
||||||
* Version 3.0 Patch 22 - 2000-06-16
|
* VERSION 3.0 Patch 22 - 2000-06-16
|
||||||
|
|
||||||
+ MINOR ENHANCEMENTS
|
+ MINOR ENHANCEMENTS
|
||||||
|
|
||||||
@@ -1816,7 +1874,7 @@ CHANGES TO REMIND
|
|||||||
- Fixed serious bug in which background queued reminders were ignored and
|
- Fixed serious bug in which background queued reminders were ignored and
|
||||||
Remind simply exited. Doh! Sorry about that.
|
Remind simply exited. Doh! Sorry about that.
|
||||||
|
|
||||||
* Version 3.0 Patch 21 - 2000-03-15
|
* VERSION 3.0 Patch 21 - 2000-03-15
|
||||||
|
|
||||||
+ MINOR ENHANCEMENTS
|
+ MINOR ENHANCEMENTS
|
||||||
|
|
||||||
@@ -1847,7 +1905,7 @@ CHANGES TO REMIND
|
|||||||
|
|
||||||
- Fixed compilation problem on FreeBSD, IRIX, Tru64 and other UNIXes.
|
- Fixed compilation problem on FreeBSD, IRIX, Tru64 and other UNIXes.
|
||||||
|
|
||||||
* Version 3.0 Patch 20 - 1999-04-12
|
* VERSION 3.0 Patch 20 - 1999-04-12
|
||||||
|
|
||||||
+ LICENSE CHANGE
|
+ LICENSE CHANGE
|
||||||
|
|
||||||
@@ -1869,7 +1927,7 @@ CHANGES TO REMIND
|
|||||||
|
|
||||||
- Fixed a typo in danish.h, courtesy of Niels Kristian Bech Jensen.
|
- Fixed a typo in danish.h, courtesy of Niels Kristian Bech Jensen.
|
||||||
|
|
||||||
* Version 3.0 Patch 19 - 1998-05-09
|
* VERSION 3.0 Patch 19 - 1998-05-09
|
||||||
|
|
||||||
+ MAJOR ENHANCEMENTS
|
+ MAJOR ENHANCEMENTS
|
||||||
|
|
||||||
@@ -1911,7 +1969,7 @@ CHANGES TO REMIND
|
|||||||
- Lots more silly little bugs squashed -- too many to go into in
|
- Lots more silly little bugs squashed -- too many to go into in
|
||||||
detail.
|
detail.
|
||||||
|
|
||||||
* Version 3.0 Patch 18 - 1998-02-15
|
* VERSION 3.0 Patch 18 - 1998-02-15
|
||||||
|
|
||||||
+ MAJOR ENHANCEMENTS
|
+ MAJOR ENHANCEMENTS
|
||||||
|
|
||||||
@@ -1975,7 +2033,7 @@ CHANGES TO REMIND
|
|||||||
- Getting rid of fixed-sized buffers meant lots of changes to code.
|
- Getting rid of fixed-sized buffers meant lots of changes to code.
|
||||||
No doubt, I missed a few regression tests.
|
No doubt, I missed a few regression tests.
|
||||||
|
|
||||||
* Version 3.0 Patch 17 - 1997-09-07
|
* VERSION 3.0 Patch 17 - 1997-09-07
|
||||||
|
|
||||||
+ MINOR ENHANCEMENTS
|
+ MINOR ENHANCEMENTS
|
||||||
|
|
||||||
@@ -2016,7 +2074,7 @@ CHANGES TO REMIND
|
|||||||
library. All three of these fixes are courtesy of Christopher
|
library. All three of these fixes are courtesy of Christopher
|
||||||
J. Madsen <madsen@iglobal.net>. Thanks, Christopher.
|
J. Madsen <madsen@iglobal.net>. Thanks, Christopher.
|
||||||
|
|
||||||
* Version 3.0 Patch 16 - 1997-02-11
|
* VERSION 3.0 Patch 16 - 1997-02-11
|
||||||
|
|
||||||
+ MINOR ENHANCEMENTS
|
+ MINOR ENHANCEMENTS
|
||||||
|
|
||||||
@@ -2044,7 +2102,7 @@ CHANGES TO REMIND
|
|||||||
- Fixed a problem under Solaris 2.5 whereby rem2ps was skipping some
|
- Fixed a problem under Solaris 2.5 whereby rem2ps was skipping some
|
||||||
latin1 characters which it interpreted as white space.
|
latin1 characters which it interpreted as white space.
|
||||||
|
|
||||||
* Version 3.0 Patch 15 - 1996-10-27
|
* VERSION 3.0 Patch 15 - 1996-10-27
|
||||||
|
|
||||||
+ IMPORTANT NOTES
|
+ IMPORTANT NOTES
|
||||||
|
|
||||||
@@ -2074,7 +2132,7 @@ CHANGES TO REMIND
|
|||||||
- Fixed bug in TkRemind which caused a crash if the "-m" option was used
|
- Fixed bug in TkRemind which caused a crash if the "-m" option was used
|
||||||
for a month beginning on Sunday. Doh!!!
|
for a month beginning on Sunday. Doh!!!
|
||||||
|
|
||||||
* Version 3.0 Patch 14 - 1996-05-25
|
* VERSION 3.0 Patch 14 - 1996-05-25
|
||||||
|
|
||||||
+ CHANGE IN COPYING POLICY
|
+ CHANGE IN COPYING POLICY
|
||||||
|
|
||||||
@@ -2133,7 +2191,7 @@ CHANGES TO REMIND
|
|||||||
_not_ support MS Windows, and in fact do not allow Remind to run
|
_not_ support MS Windows, and in fact do not allow Remind to run
|
||||||
under Windows (see COPYRIGHT).
|
under Windows (see COPYRIGHT).
|
||||||
|
|
||||||
* Version 3.0 Patch 13 - 1994-05-06
|
* VERSION 3.0 Patch 13 - 1994-05-06
|
||||||
|
|
||||||
+ MINOR ENHANCEMENTS
|
+ MINOR ENHANCEMENTS
|
||||||
|
|
||||||
@@ -2168,7 +2226,7 @@ CHANGES TO REMIND
|
|||||||
|
|
||||||
- Updated the copyright notices everywhere.
|
- Updated the copyright notices everywhere.
|
||||||
|
|
||||||
* Version 3.0 Patch 12 - 1994-02-01
|
* VERSION 3.0 Patch 12 - 1994-02-01
|
||||||
|
|
||||||
+ MINOR ENHANCEMENTS
|
+ MINOR ENHANCEMENTS
|
||||||
|
|
||||||
@@ -2187,7 +2245,7 @@ CHANGES TO REMIND
|
|||||||
- Fixed a problem with the '-k' option which resulted in a newline being
|
- Fixed a problem with the '-k' option which resulted in a newline being
|
||||||
placed after the message text. This was giving sh(1) heartburn...
|
placed after the message text. This was giving sh(1) heartburn...
|
||||||
|
|
||||||
* Version 3.0 Patch 11 - 1993-11-26
|
* VERSION 3.0 Patch 11 - 1993-11-26
|
||||||
|
|
||||||
+ MINOR ENHANCEMENTS
|
+ MINOR ENHANCEMENTS
|
||||||
|
|
||||||
@@ -2219,7 +2277,7 @@ CHANGES TO REMIND
|
|||||||
|
|
||||||
- Fixed typos in french.h
|
- Fixed typos in french.h
|
||||||
|
|
||||||
* Version 3.0 Patch 10
|
* VERSION 3.0 Patch 10
|
||||||
|
|
||||||
+ MAJOR ENHANCEMENT
|
+ MAJOR ENHANCEMENT
|
||||||
|
|
||||||
@@ -2267,7 +2325,7 @@ CHANGES TO REMIND
|
|||||||
|
|
||||||
- Fixed the Finnish language support which was missing a few newlines.
|
- Fixed the Finnish language support which was missing a few newlines.
|
||||||
|
|
||||||
* Version 3.0 Patch 9 - 1993-10-04
|
* VERSION 3.0 Patch 9 - 1993-10-04
|
||||||
|
|
||||||
+ NOTES
|
+ NOTES
|
||||||
|
|
||||||
@@ -2324,7 +2382,7 @@ CHANGES TO REMIND
|
|||||||
so that newlines in the body start new paragraphs, rather than being
|
so that newlines in the body start new paragraphs, rather than being
|
||||||
swallowed as white-space.
|
swallowed as white-space.
|
||||||
|
|
||||||
* Version 3.0 Patch 8 - 1993-09-08
|
* VERSION 3.0 Patch 8 - 1993-09-08
|
||||||
|
|
||||||
+ MAJOR ENHANCEMENTS
|
+ MAJOR ENHANCEMENTS
|
||||||
|
|
||||||
@@ -2376,7 +2434,7 @@ CHANGES TO REMIND
|
|||||||
range [-128, 255] (but not 0) so that char(asc(s)) works even
|
range [-128, 255] (but not 0) so that char(asc(s)) works even
|
||||||
on machines with signed char types.
|
on machines with signed char types.
|
||||||
|
|
||||||
* Version 3.0 Patch 7 - 1993-07-22
|
* VERSION 3.0 Patch 7 - 1993-07-22
|
||||||
|
|
||||||
+ MAJOR ENHANCEMENTS
|
+ MAJOR ENHANCEMENTS
|
||||||
|
|
||||||
@@ -2419,7 +2477,7 @@ CHANGES TO REMIND
|
|||||||
- Changed kall so that "kall sh" doesn't commit suicide - patch courtesy
|
- Changed kall so that "kall sh" doesn't commit suicide - patch courtesy
|
||||||
of Michael Salmon.
|
of Michael Salmon.
|
||||||
|
|
||||||
* Version 3.0 Patch 6 - 1993-05-05
|
* VERSION 3.0 Patch 6 - 1993-05-05
|
||||||
|
|
||||||
+ MINOR ENHANCEMENTS
|
+ MINOR ENHANCEMENTS
|
||||||
|
|
||||||
@@ -2442,7 +2500,7 @@ CHANGES TO REMIND
|
|||||||
- Fixed a bug in the -u option which sometimes caused a core dump
|
- Fixed a bug in the -u option which sometimes caused a core dump
|
||||||
(embarrassed grin!) The fix is due to Tina Hoeltig. Thanks, Tina!
|
(embarrassed grin!) The fix is due to Tina Hoeltig. Thanks, Tina!
|
||||||
|
|
||||||
* Version 3.0 Patch 5 - 1993-04-27
|
* VERSION 3.0 Patch 5 - 1993-04-27
|
||||||
|
|
||||||
+ MAJOR ENHANCEMENTS:
|
+ MAJOR ENHANCEMENTS:
|
||||||
|
|
||||||
@@ -2477,7 +2535,7 @@ CHANGES TO REMIND
|
|||||||
|
|
||||||
- Fixed a bug in the man page - thanks to Ed Oskiewicz.
|
- Fixed a bug in the man page - thanks to Ed Oskiewicz.
|
||||||
|
|
||||||
* Version 3.0 Patch 4 - 1993-03-08
|
* VERSION 3.0 Patch 4 - 1993-03-08
|
||||||
|
|
||||||
- Added the -g option - this sorts reminders by date/time before
|
- Added the -g option - this sorts reminders by date/time before
|
||||||
issuing them. (You can see I'm running out of letters to
|
issuing them. (You can see I'm running out of letters to
|
||||||
@@ -2536,13 +2594,13 @@ CHANGES TO REMIND
|
|||||||
|
|
||||||
- Put my new mailing address in the README files.
|
- Put my new mailing address in the README files.
|
||||||
|
|
||||||
* Version 3.0 Patch 3 - 1993-02-21
|
* VERSION 3.0 Patch 3 - 1993-02-21
|
||||||
|
|
||||||
- Corrected bugs in Remind and Rem2PS. No new features added. You
|
- Corrected bugs in Remind and Rem2PS. No new features added. You
|
||||||
should NOT use patch level 2 - either stick to 3.0.1 or upgrade to
|
should NOT use patch level 2 - either stick to 3.0.1 or upgrade to
|
||||||
3.0.3.
|
3.0.3.
|
||||||
|
|
||||||
* Version 3.0 Patch 2 - 1993-02-04
|
* VERSION 3.0 Patch 2 - 1993-02-04
|
||||||
|
|
||||||
- Added the -u option to Remind so that root can run it as any user.
|
- Added the -u option to Remind so that root can run it as any user.
|
||||||
This simplifies the remind-all scripts, and makes them more efficient.
|
This simplifies the remind-all scripts, and makes them more efficient.
|
||||||
@@ -2582,7 +2640,7 @@ CHANGES TO REMIND
|
|||||||
- Changed Remind so that supplying the -a option causes timed reminders
|
- Changed Remind so that supplying the -a option causes timed reminders
|
||||||
not to be placed into the calendar in calendar mode.
|
not to be placed into the calendar in calendar mode.
|
||||||
|
|
||||||
* Version 3.0 Patch 1 - 1992-12-18
|
* VERSION 3.0 Patch 1 - 1992-12-18
|
||||||
|
|
||||||
- Wrote the Rem2ps program to produce PostScript calendars
|
- Wrote the Rem2ps program to produce PostScript calendars
|
||||||
|
|
||||||
@@ -2622,7 +2680,7 @@ CHANGES TO REMIND
|
|||||||
|
|
||||||
- Re-formatted the WHATSNEW.30 file.
|
- Re-formatted the WHATSNEW.30 file.
|
||||||
|
|
||||||
* Version 3.0 - 1992-11-09
|
* VERSION 3.0 - 1992-11-09
|
||||||
|
|
||||||
- Total rewrite from previous versions
|
- Total rewrite from previous versions
|
||||||
|
|
||||||
@@ -2643,23 +2701,23 @@ CHANGES TO REMIND
|
|||||||
- Fixed a lurking bug in trigger date calculation which, amazingly, had not
|
- Fixed a lurking bug in trigger date calculation which, amazingly, had not
|
||||||
been caught in the couple of years that Remind has been out!
|
been caught in the couple of years that Remind has been out!
|
||||||
|
|
||||||
* Version 2.3 Patch 5 - 1992-04-11
|
* VERSION 2.3 Patch 5 - 1992-04-11
|
||||||
|
|
||||||
- Added the "c+n" option for printing a calendar by
|
- Added the "c+n" option for printing a calendar by
|
||||||
weeks instead of months, courtesy Dennis Cottel (dennis@peanuts.nosc.mil).
|
weeks instead of months, courtesy Dennis Cottel (dennis@peanuts.nosc.mil).
|
||||||
|
|
||||||
* Version 2.3 Patch 4 - 1991-11-06
|
* VERSION 2.3 Patch 4 - 1991-11-06
|
||||||
|
|
||||||
- Made the init.c file nicer. Made the Makefile
|
- Made the init.c file nicer. Made the Makefile
|
||||||
prettier. Added "make test", "make tar" and "make shar" Makefile targets.
|
prettier. Added "make test", "make tar" and "make shar" Makefile targets.
|
||||||
|
|
||||||
* Version 2.3 Patch 3 - 1991-09-11
|
* VERSION 2.3 Patch 3 - 1991-09-11
|
||||||
|
|
||||||
- Added a command-line option for Remind to process
|
- Added a command-line option for Remind to process
|
||||||
queued reminders in the foreground. This makes automatic termination
|
queued reminders in the foreground. This makes automatic termination
|
||||||
of Remind processes from within X-Windows and Sunview easier.
|
of Remind processes from within X-Windows and Sunview easier.
|
||||||
|
|
||||||
* Version 2.3 Patch 2 - 1991-07-19
|
* VERSION 2.3 Patch 2 - 1991-07-19
|
||||||
|
|
||||||
- Fixed up a problem with timed reminders which resulted
|
- Fixed up a problem with timed reminders which resulted
|
||||||
in cursor not starting from left side of screen on some systems.
|
in cursor not starting from left side of screen on some systems.
|
||||||
@@ -2676,7 +2734,7 @@ CHANGES TO REMIND
|
|||||||
|
|
||||||
- Made the Makefile more portable
|
- Made the Makefile more portable
|
||||||
|
|
||||||
* Version 2.3 Patch 1 - 1991-03-08
|
* VERSION 2.3 Patch 1 - 1991-03-08
|
||||||
|
|
||||||
- Added the "-t" command-line option to get Remind
|
- Added the "-t" command-line option to get Remind
|
||||||
to trigger all non-expired reminders.
|
to trigger all non-expired reminders.
|
||||||
@@ -2690,7 +2748,7 @@ CHANGES TO REMIND
|
|||||||
|
|
||||||
- Added manual pages for "kall" and "rem".
|
- Added manual pages for "kall" and "rem".
|
||||||
|
|
||||||
* Version 2.3 - 1991-02-20
|
* VERSION 2.3 - 1991-02-20
|
||||||
|
|
||||||
- Added the UNTIL keyword for forcing reminders to expire.
|
- Added the UNTIL keyword for forcing reminders to expire.
|
||||||
|
|
||||||
@@ -2712,32 +2770,32 @@ CHANGES TO REMIND
|
|||||||
- Modified the calendar and SimpleCalendar formats so that the % escape
|
- Modified the calendar and SimpleCalendar formats so that the % escape
|
||||||
substitutions ARE performed.
|
substitutions ARE performed.
|
||||||
|
|
||||||
* Version 2.2 - Patch 5 - 1990-12-03
|
* VERSION 2.2 - Patch 5 - 1990-12-03
|
||||||
|
|
||||||
- Added the BEFORE, AFTER and SKIP tokens to make the
|
- Added the BEFORE, AFTER and SKIP tokens to make the
|
||||||
handling of holidays more sensible. Also corrected a few more bugs.
|
handling of holidays more sensible. Also corrected a few more bugs.
|
||||||
|
|
||||||
* Version 2.2 - Patch 3 - 1990-11-28
|
* VERSION 2.2 - Patch 3 - 1990-11-28
|
||||||
|
|
||||||
- Added the MSG or RUN tokens in an OMIT command; also
|
- Added the MSG or RUN tokens in an OMIT command; also
|
||||||
allowed RUN-type reminders to be explicitly included in the calendar by
|
allowed RUN-type reminders to be explicitly included in the calendar by
|
||||||
using the %" escape sequence.
|
using the %" escape sequence.
|
||||||
|
|
||||||
* Version 2.2 - 1990-11-16
|
* VERSION 2.2 - 1990-11-16
|
||||||
|
|
||||||
- Added the AT keyword, the timed reminders daemon, and the
|
- Added the AT keyword, the timed reminders daemon, and the
|
||||||
calendar facility.
|
calendar facility.
|
||||||
|
|
||||||
* Version 2.1 - 1990-11-06
|
* VERSION 2.1 - 1990-11-06
|
||||||
|
|
||||||
- Added the "repeat" token for repeating reminders with a period
|
- Added the "repeat" token for repeating reminders with a period
|
||||||
other than 7 days. Also fixed some bugs from version 2.0
|
other than 7 days. Also fixed some bugs from version 2.0
|
||||||
|
|
||||||
* Version 2.0 - 1990-11-01
|
* VERSION 2.0 - 1990-11-01
|
||||||
|
|
||||||
- first public release. Included advanced date specifications,
|
- first public release. Included advanced date specifications,
|
||||||
character substitution, and the RUN keyword.
|
character substitution, and the RUN keyword.
|
||||||
|
|
||||||
* Version 1.0
|
* VERSION 1.0
|
||||||
|
|
||||||
- never publicly released.
|
- never publicly released.
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ RUN OFF
|
|||||||
# Ensure required version of remind is used... #
|
# Ensure required version of remind is used... #
|
||||||
################################################
|
################################################
|
||||||
IF version() < "03.04.02"
|
IF version() < "03.04.02"
|
||||||
ERRMSG This file requires at least version 03.01.10 of Remind.%
|
ERRMSG This file requires at least version 03.04.02 of Remind.%
|
||||||
ERRMSG This version is version [version()].
|
ERRMSG This version is version [version()].
|
||||||
EXIT
|
EXIT
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|||||||
29
include/holidays/chinese-new-year.rem
Normal file
29
include/holidays/chinese-new-year.rem
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
REM 1 Feb 2022 MSG Chinese New Year (Tiger)
|
||||||
|
REM 22 Jan 2023 MSG Chinese New Year (Rabbit)
|
||||||
|
REM 10 Feb 2024 MSG Chinese New Year (Dragon)
|
||||||
|
REM 29 Jan 2025 MSG Chinese New Year (Snake)
|
||||||
|
REM 17 Feb 2026 MSG Chinese New Year (Horse)
|
||||||
|
REM 6 Feb 2027 MSG Chinese New Year (Goat)
|
||||||
|
REM 26 Jan 2028 MSG Chinese New Year (Monkey)
|
||||||
|
REM 13 Feb 2029 MSG Chinese New Year (Rooster)
|
||||||
|
REM 3 Feb 2030 MSG Chinese New Year (Dog)
|
||||||
|
REM 23 Jan 2031 MSG Chinese New Year (Pig)
|
||||||
|
REM 11 Feb 2032 MSG Chinese New Year (Rat)
|
||||||
|
REM 31 Jan 2033 MSG Chinese New Year (Ox)
|
||||||
|
REM 19 Feb 2034 MSG Chinese New Year (Tiger)
|
||||||
|
REM 8 Feb 2035 MSG Chinese New Year (Rabbit)
|
||||||
|
REM 28 Jan 2036 MSG Chinese New Year (Dragon)
|
||||||
|
REM 15 Feb 2037 MSG Chinese New Year (Snake)
|
||||||
|
REM 4 Feb 2038 MSG Chinese New Year (Horse)
|
||||||
|
REM 24 Jan 2039 MSG Chinese New Year (Goat)
|
||||||
|
REM 12 Feb 2040 MSG Chinese New Year (Monkey)
|
||||||
|
REM 1 Feb 2041 MSG Chinese New Year (Rooster)
|
||||||
|
REM 22 Jan 2042 MSG Chinese New Year (Dog)
|
||||||
|
REM 10 Feb 2043 MSG Chinese New Year (Pig)
|
||||||
|
REM 30 Jan 2044 MSG Chinese New Year (Rat)
|
||||||
|
REM 17 Feb 2045 MSG Chinese New Year (Ox)
|
||||||
|
REM 6 Feb 2046 MSG Chinese New Year (Tiger)
|
||||||
|
REM 26 Jan 2047 MSG Chinese New Year (Rabbit)
|
||||||
|
REM 14 Feb 2048 MSG Chinese New Year (Dragon)
|
||||||
|
REM 2 Feb 2049 MSG Chinese New Year (Snake)
|
||||||
|
REM 23 Jan 2050 MSG Chinese New Year (Horse)
|
||||||
@@ -10,7 +10,6 @@ SET InIsrael value("InIsrael", 0)
|
|||||||
SET Reform value("Reform", 0)
|
SET Reform value("Reform", 0)
|
||||||
|
|
||||||
# Convenient function definition to save typing
|
# Convenient function definition to save typing
|
||||||
FSET _h(x, y) HEBDATE(x,y)
|
|
||||||
FSET _h2(x, y) HEBDATE(x, y, $U-7)
|
FSET _h2(x, y) HEBDATE(x, y, $U-7)
|
||||||
FSET _PastSat(x, y) IIF(WKDAYNUM(_h2(x,y))!=6, _h2(x,y), _h2(x,y)+1)
|
FSET _PastSat(x, y) IIF(WKDAYNUM(_h2(x,y))!=6, _h2(x,y), _h2(x,y)+1)
|
||||||
FSET _BackTwoFri(x, y) IIF(WKDAYNUM(_h2(x,y))!=5, _h2(x,y), _h2(x,y)-2)
|
FSET _BackTwoFri(x, y) IIF(WKDAYNUM(_h2(x,y))!=5, _h2(x,y), _h2(x,y)-2)
|
||||||
@@ -19,28 +18,28 @@ FSET _BackTwoSat(x, y) IIF(WKDAYNUM(_h2(x,y))!=6, _h2(x,y), _h2(x,y)-2)
|
|||||||
SET InIsrael VALUE("InIsrael", 0)
|
SET InIsrael VALUE("InIsrael", 0)
|
||||||
SET Reform VALUE("Reform", 0)
|
SET Reform VALUE("Reform", 0)
|
||||||
|
|
||||||
REM [_h(1, "Tishrey")] ++4 MSG %"Rosh Hashana 1%" is %b.
|
REM [hebdate(1, "Tishrey")] ++4 MSG %"Rosh Hashana 1%" is %b.
|
||||||
|
|
||||||
# No RH-2 or Tzom Gedalia in Reform
|
# No RH-2 or Tzom Gedalia in Reform
|
||||||
IF !Reform
|
IF !Reform
|
||||||
REM [_h(2, "Tishrey")] ++4 MSG %"Rosh Hashana 2%" is %b.
|
REM [hebdate(2, "Tishrey")] ++4 MSG %"Rosh Hashana 2%" is %b.
|
||||||
REM [_PastSat(3, "Tishrey")] ++4 MSG %"Tzom Gedalia%" is %b.
|
REM [_PastSat(3, "Tishrey")] ++4 MSG %"Tzom Gedalia%" is %b.
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
REM [_h(10, "Tishrey")] ++4 MSG %"Yom Kippur%" is %b.
|
REM [hebdate(10, "Tishrey")] ++4 MSG %"Yom Kippur%" is %b.
|
||||||
REM [_h(15, "Tishrey")] ++4 MSG %"Sukkot 1%" is %b.
|
REM [hebdate(15, "Tishrey")] ++4 MSG %"Sukkot 1%" is %b.
|
||||||
|
|
||||||
IF !InIsrael
|
IF !InIsrael
|
||||||
REM [_h(16, "Tishrey")] MSG %"Sukkot 2%"
|
REM [hebdate(16, "Tishrey")] MSG %"Sukkot 2%"
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
REM [_h(21, "Tishrey")] ++4 MSG %"Hoshana Rabba%" is %b.
|
REM [hebdate(21, "Tishrey")] ++4 MSG %"Hoshana Rabba%" is %b.
|
||||||
REM [_h(22, "Tishrey")] ++4 MSG %"Shemini Atzeret%" is %b.
|
REM [hebdate(22, "Tishrey")] ++4 MSG %"Shemini Atzeret%" is %b.
|
||||||
|
|
||||||
IF InIsrael
|
IF InIsrael
|
||||||
REM [_h(22, "Tishrey")] ++4 MSG %"Simchat Torah%" is %b.
|
REM [hebdate(22, "Tishrey")] ++4 MSG %"Simchat Torah%" is %b.
|
||||||
ELSE
|
ELSE
|
||||||
REM [_h(23, "Tishrey")] ++4 MSG %"Simchat Torah%" is %b.
|
REM [hebdate(23, "Tishrey")] ++4 MSG %"Simchat Torah%" is %b.
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
# Because Kislev can change length, we must be more careful about Chanukah
|
# Because Kislev can change length, we must be more careful about Chanukah
|
||||||
@@ -58,11 +57,11 @@ REM [_chan(8)] MSG %"Chanukah 8%"
|
|||||||
IF !Reform
|
IF !Reform
|
||||||
# 10 Tevet will never be a Saturday, so whether or not to
|
# 10 Tevet will never be a Saturday, so whether or not to
|
||||||
# move it is moot. (Thanks to Art Werschulz.)
|
# move it is moot. (Thanks to Art Werschulz.)
|
||||||
REM [_h(10, "Tevet")] MSG %"Tzom Tevet%" is %b.
|
REM [hebdate(10, "Tevet")] MSG %"Tzom Tevet%" is %b.
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
REM [_h(15, "Shvat")] ++4 MSG %"Tu B'Shvat%" is %b.
|
REM [hebdate(15, "Shvat")] ++4 MSG %"Tu B'Shvat%" is %b.
|
||||||
REM [_h(14, "Adar A")] ++4 MSG %"Purim Katan%" is %b.
|
REM [hebdate(14, "Adar A")] ++4 MSG %"Purim Katan%" is %b.
|
||||||
|
|
||||||
# If Purim is on Sunday, then Fast of Esther is 11 Adar.
|
# If Purim is on Sunday, then Fast of Esther is 11 Adar.
|
||||||
IF WKDAYNUM(_h2(13, "Adar")) != 6
|
IF WKDAYNUM(_h2(13, "Adar")) != 6
|
||||||
@@ -70,33 +69,33 @@ IF WKDAYNUM(_h2(13, "Adar")) != 6
|
|||||||
ELSE
|
ELSE
|
||||||
REM [_h2(11, "Adar")] ++4 MSG %"Fast of Esther%" is %b.
|
REM [_h2(11, "Adar")] ++4 MSG %"Fast of Esther%" is %b.
|
||||||
ENDIF
|
ENDIF
|
||||||
REM [_h(14, "Adar")] ++4 MSG %"Purim%" is %b.
|
REM [hebdate(14, "Adar")] ++4 MSG %"Purim%" is %b.
|
||||||
REM [_h(15, "Nisan")] ++4 MSG %"Pesach%" is %b.
|
REM [hebdate(15, "Nisan")] ++4 MSG %"Pesach%" is %b.
|
||||||
|
|
||||||
IF !InIsrael
|
IF !InIsrael
|
||||||
REM [_h(16, "Nisan")] MSG %"Pesach 2%"
|
REM [hebdate(16, "Nisan")] MSG %"Pesach 2%"
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
REM [_h(21, "Nisan")] MSG %"Pesach 7%"
|
REM [hebdate(21, "Nisan")] MSG %"Pesach 7%"
|
||||||
|
|
||||||
IF !InIsrael && !Reform
|
IF !InIsrael && !Reform
|
||||||
REM [_h(22, "Nisan")] MSG %"Pesach 8%"
|
REM [hebdate(22, "Nisan")] MSG %"Pesach 8%"
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
REM [_h(27, "Nisan")] ++4 MSG %"Yom HaShoah%" is %b.
|
REM [hebdate(27, "Nisan")] ++4 MSG %"Yom HaShoah%" is %b.
|
||||||
REM [_BackTwoFri(4, "Iyar")] ++4 MSG %"Yom HaZikaron%" is %b.
|
REM [_BackTwoFri(4, "Iyar")] ++4 MSG %"Yom HaZikaron%" is %b.
|
||||||
REM [_BackTwoSat(5, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
|
REM [_BackTwoSat(5, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
|
||||||
|
|
||||||
# Not sure about Reform's position on Lag B'Omer
|
# Not sure about Reform's position on Lag B'Omer
|
||||||
IF !Reform
|
IF !Reform
|
||||||
REM [_h(18, "Iyar")] ++4 MSG %"Lag B'Omer%" is %b.
|
REM [hebdate(18, "Iyar")] ++4 MSG %"Lag B'Omer%" is %b.
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
REM [_h(28, "Iyar")] ++4 MSG %"Yom Yerushalayim%" is %b.
|
REM [hebdate(28, "Iyar")] ++4 MSG %"Yom Yerushalayim%" is %b.
|
||||||
REM [_h(6, "Sivan")] ++4 MSG %"Shavuot%" is %b.
|
REM [hebdate(6, "Sivan")] ++4 MSG %"Shavuot%" is %b.
|
||||||
|
|
||||||
IF !InIsrael && !Reform
|
IF !InIsrael && !Reform
|
||||||
REM [_h(7, "Sivan")] MSG %"Shavuot 2%"
|
REM [hebdate(7, "Sivan")] MSG %"Shavuot 2%"
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
# Fairly sure Reform Jews don't observe the next two
|
# Fairly sure Reform Jews don't observe the next two
|
||||||
|
|||||||
@@ -468,6 +468,14 @@ case-sensitive:
|
|||||||
The \fB\-\-version\fR option causes \fBRemind\fR to print its version number
|
The \fB\-\-version\fR option causes \fBRemind\fR to print its version number
|
||||||
to standard output and then exit.
|
to standard output and then exit.
|
||||||
.TP
|
.TP
|
||||||
|
.B \-\-print-tokens
|
||||||
|
The \fB\-\-print-tokens\fR option causes \fBRemind\fR to print the tokens
|
||||||
|
used by the parser, built-in function names, and system variable names
|
||||||
|
to standard output and then exit. This output is designed to make it easy
|
||||||
|
to create a syntax-highlighting file for various text editors. The output
|
||||||
|
can be modified by hand or by a script into a syntax-highlighting file
|
||||||
|
with relative ease.
|
||||||
|
.TP
|
||||||
.B \-\-max-execution-time\fR=\fIn\fR
|
.B \-\-max-execution-time\fR=\fIn\fR
|
||||||
Limit the total execution time (as measured by the wall clock) to
|
Limit the total execution time (as measured by the wall clock) to
|
||||||
\fIn\fR seconds. This is useful if \fBRemind\fR is invoked on
|
\fIn\fR seconds. This is useful if \fBRemind\fR is invoked on
|
||||||
@@ -2181,6 +2189,11 @@ If the \fBTIME\fR is used where \fBRemind\fR expects a time-of-day
|
|||||||
\fIpm\fR suffix and the hour can be as large as you want, so long
|
\fIpm\fR suffix and the hour can be as large as you want, so long
|
||||||
as the total number of minutes in the duration fits in a signed integer
|
as the total number of minutes in the duration fits in a signed integer
|
||||||
variable.
|
variable.
|
||||||
|
.PP
|
||||||
|
For convenience, a \fBTIME\fR constant may be surrounded by single
|
||||||
|
quotes to match \fBDATE\fR and \fBDATETIME\fR constants, but these
|
||||||
|
quotes are optional. That is, 12:56 and '12:56' represent the same
|
||||||
|
\fBTIME\fR constant.
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
.B DATE constants
|
.B DATE constants
|
||||||
@@ -2812,8 +2825,15 @@ order, or 2 if sorting by time in descending order.
|
|||||||
The number of spaces by which all lines (except the first) of an
|
The number of spaces by which all lines (except the first) of an
|
||||||
\fBMSF\fR-type reminder should be indented. The default is 0.
|
\fBMSF\fR-type reminder should be indented. The default is 0.
|
||||||
.TP
|
.TP
|
||||||
|
.B $SuppressImplicitWarnings
|
||||||
|
Normally, \fBRemind\fR issues a warning if a line begins with an unknown
|
||||||
|
token and is treated as a \fBREM\fR command, or if a \fBREM\fR command
|
||||||
|
is missing a type and is treated as a \fBMSG\fR-type reminder. Setting
|
||||||
|
\fB$SuppressImplicitWarnings\fR to 1 suppresses these warnings. The default
|
||||||
|
is 0 and we do not recommend disabling the warnings.
|
||||||
|
.TP
|
||||||
.B $SuppressLRM
|
.B $SuppressLRM
|
||||||
Normally, when Remind is run with the \fB\-c\fR option in a UTF-8 locale,
|
Normally, when \fBRemind\fR is run with the \fB\-c\fR option in a UTF-8 locale,
|
||||||
it emits a left-to-right mark sequence after printing day names or
|
it emits a left-to-right mark sequence after printing day names or
|
||||||
reminders. Some terminals render this incorrectly, so you can use:
|
reminders. Some terminals render this incorrectly, so you can use:
|
||||||
.RS
|
.RS
|
||||||
@@ -4706,10 +4726,7 @@ This is really useful only if \fIexpr\fR involves a call to the
|
|||||||
\fIexpr\fR will not change as \fBRemind\fR iterates. In fact, if
|
\fIexpr\fR will not change as \fBRemind\fR iterates. In fact, if
|
||||||
\fIexpr\fR is not a constant and does not call \fBtrigdate()\fR or
|
\fIexpr\fR is not a constant and does not call \fBtrigdate()\fR or
|
||||||
related functions or system variables, then \fBRemind\fR will issue a
|
related functions or system variables, then \fBRemind\fR will issue a
|
||||||
warning. If you have a user-defined function that calls
|
warning.
|
||||||
\fBtrigdate()\fR, this can result in an unwanted warning. In that
|
|
||||||
case, pass \fBtrigdate()\fR or some related function or system
|
|
||||||
variable into your user-defined function from the SATISFY expression.
|
|
||||||
.PP
|
.PP
|
||||||
An example of the usefulness of \fBSATISFY\fR: Suppose you wish to
|
An example of the usefulness of \fBSATISFY\fR: Suppose you wish to
|
||||||
be warned of every Friday the 13th. Your first attempt may be:
|
be warned of every Friday the 13th. Your first attempt may be:
|
||||||
@@ -5840,10 +5857,6 @@ after the WEEK keyword.
|
|||||||
The following tokens can be abbreviated:
|
The following tokens can be abbreviated:
|
||||||
.TP
|
.TP
|
||||||
o
|
o
|
||||||
\fBREM\fR can be omitted - it is implied if no other valid command
|
|
||||||
is present.
|
|
||||||
.TP
|
|
||||||
o
|
|
||||||
\fBCLEAR-OMIT-CONTEXT\fR --> \fBCLEAR\fR
|
\fBCLEAR-OMIT-CONTEXT\fR --> \fBCLEAR\fR
|
||||||
.TP
|
.TP
|
||||||
o
|
o
|
||||||
|
|||||||
106
src/calendar.c
106
src/calendar.c
@@ -281,6 +281,7 @@ static void ColorizeEntry(CalEntry const *e, int clamp);
|
|||||||
static void SortCol (CalEntry **col);
|
static void SortCol (CalEntry **col);
|
||||||
static void DoCalendarOneWeek (int nleft);
|
static void DoCalendarOneWeek (int nleft);
|
||||||
static void DoCalendarOneMonth (void);
|
static void DoCalendarOneMonth (void);
|
||||||
|
static void DoSimpleCalendarOneMonth (void);
|
||||||
static int WriteCalendarRow (void);
|
static int WriteCalendarRow (void);
|
||||||
static void WriteWeekHeaderLine (void);
|
static void WriteWeekHeaderLine (void);
|
||||||
static void WritePostHeaderLine (void);
|
static void WritePostHeaderLine (void);
|
||||||
@@ -338,6 +339,7 @@ UnBackgroundize(int d)
|
|||||||
printf("%s", Decolorize());
|
printf("%s", Decolorize());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef REM_USE_WCHAR
|
||||||
static void
|
static void
|
||||||
send_lrm(void)
|
send_lrm(void)
|
||||||
{
|
{
|
||||||
@@ -352,6 +354,7 @@ send_lrm(void)
|
|||||||
printf("\xE2\x80\x8E");
|
printf("\xE2\x80\x8E");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static char const *
|
static char const *
|
||||||
despace(char const *s)
|
despace(char const *s)
|
||||||
@@ -526,9 +529,9 @@ get_month_abbrev(char const *mon)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef REM_USE_WCHAR
|
||||||
static int make_wchar_versions(CalEntry *e)
|
static int make_wchar_versions(CalEntry *e)
|
||||||
{
|
{
|
||||||
#ifdef REM_USE_WCHAR
|
|
||||||
size_t len;
|
size_t len;
|
||||||
wchar_t *buf;
|
wchar_t *buf;
|
||||||
len = mbstowcs(NULL, e->text, 0);
|
len = mbstowcs(NULL, e->text, 0);
|
||||||
@@ -542,10 +545,8 @@ static int make_wchar_versions(CalEntry *e)
|
|||||||
e->wc_text = buf;
|
e->wc_text = buf;
|
||||||
e->wc_pos = buf;
|
e->wc_pos = buf;
|
||||||
return 1;
|
return 1;
|
||||||
#else
|
|
||||||
return 1;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void gon(void)
|
static void gon(void)
|
||||||
{
|
{
|
||||||
@@ -900,13 +901,17 @@ static void DoCalendarOneWeek(int nleft)
|
|||||||
if (UseVTColors) {
|
if (UseVTColors) {
|
||||||
printf("\x1B[1m"); /* Bold */
|
printf("\x1B[1m"); /* Bold */
|
||||||
}
|
}
|
||||||
|
Backgroundize(d);
|
||||||
PrintLeft(buf, ColSpaces-1, '*');
|
PrintLeft(buf, ColSpaces-1, '*');
|
||||||
|
putchar(' ');
|
||||||
|
UnBackgroundize(d);
|
||||||
if (UseVTColors) {
|
if (UseVTColors) {
|
||||||
printf("\x1B[0m"); /* Normal */
|
printf("\x1B[0m"); /* Normal */
|
||||||
}
|
}
|
||||||
putchar(' ');
|
|
||||||
} else {
|
} else {
|
||||||
|
Backgroundize(d);
|
||||||
PrintLeft(buf, ColSpaces, ' ');
|
PrintLeft(buf, ColSpaces, ' ');
|
||||||
|
UnBackgroundize(d);
|
||||||
}
|
}
|
||||||
gon();
|
gon();
|
||||||
DRAW(tb);
|
DRAW(tb);
|
||||||
@@ -963,21 +968,20 @@ static void DoCalendarOneWeek(int nleft)
|
|||||||
|
|
||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
/* */
|
/* */
|
||||||
/* DoCalendarOneMonth */
|
/* DoSimpleCalendarOneMonth */
|
||||||
/* */
|
/* */
|
||||||
/* Produce a calendar for the current month. */
|
/* Produce a "simple" calendar for the current month. */
|
||||||
|
/* */
|
||||||
|
/* A simple calendar is produced if the -s or -p option */
|
||||||
|
/* was used. */
|
||||||
/* */
|
/* */
|
||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
static void DoCalendarOneMonth(void)
|
static void DoSimpleCalendarOneMonth(void)
|
||||||
{
|
{
|
||||||
int y, m, d, mm, yy, i, j;
|
int y, m, d, mm, yy, i, j;
|
||||||
|
|
||||||
InitMoonsAndShades();
|
InitMoonsAndShades();
|
||||||
|
|
||||||
if (!DoSimpleCalendar) WriteCalHeader();
|
|
||||||
|
|
||||||
DidADay = 0;
|
DidADay = 0;
|
||||||
|
|
||||||
if (PsCal) {
|
if (PsCal) {
|
||||||
FromDSE(DSEToday, &y, &m, &d);
|
FromDSE(DSEToday, &y, &m, &d);
|
||||||
if (PsCal == PSCAL_LEVEL1) {
|
if (PsCal == PSCAL_LEVEL1) {
|
||||||
@@ -1050,7 +1054,29 @@ static void DoCalendarOneMonth(void)
|
|||||||
}
|
}
|
||||||
printf("]\n}");
|
printf("]\n}");
|
||||||
}
|
}
|
||||||
if (!DoSimpleCalendar) WriteCalTrailer();
|
}
|
||||||
|
|
||||||
|
/***************************************************************/
|
||||||
|
/* */
|
||||||
|
/* DoCalendarOneMonth */
|
||||||
|
/* */
|
||||||
|
/* Produce a calendar for the current month. */
|
||||||
|
/* */
|
||||||
|
/***************************************************************/
|
||||||
|
static void DoCalendarOneMonth(void)
|
||||||
|
{
|
||||||
|
InitMoonsAndShades();
|
||||||
|
|
||||||
|
if (DoSimpleCalendar) {
|
||||||
|
DoSimpleCalendarOneMonth();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
WriteCalHeader();
|
||||||
|
|
||||||
|
while (WriteCalendarRow()) /* continue */;
|
||||||
|
|
||||||
|
WriteCalTrailer();
|
||||||
}
|
}
|
||||||
|
|
||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
@@ -1122,13 +1148,17 @@ static int WriteCalendarRow(void)
|
|||||||
if (UseVTColors) {
|
if (UseVTColors) {
|
||||||
printf("\x1B[1m"); /* Bold */
|
printf("\x1B[1m"); /* Bold */
|
||||||
}
|
}
|
||||||
|
Backgroundize(d+i-wd);
|
||||||
PrintLeft(buf, ColSpaces-1, '*');
|
PrintLeft(buf, ColSpaces-1, '*');
|
||||||
|
putchar(' ');
|
||||||
if (UseVTColors) {
|
if (UseVTColors) {
|
||||||
printf("\x1B[0m"); /* Normal */
|
printf("\x1B[0m"); /* Normal */
|
||||||
}
|
}
|
||||||
putchar(' ');
|
UnBackgroundize(d+i-wd);
|
||||||
} else {
|
} else {
|
||||||
|
Backgroundize(d+i-wd);
|
||||||
PrintLeft(buf, ColSpaces, ' ');
|
PrintLeft(buf, ColSpaces, ' ');
|
||||||
|
UnBackgroundize(d+i-wd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
gon();
|
gon();
|
||||||
@@ -1196,15 +1226,17 @@ static void PrintLeft(char const *s, int width, char pad)
|
|||||||
{
|
{
|
||||||
#ifndef REM_USE_WCHAR
|
#ifndef REM_USE_WCHAR
|
||||||
int len = strlen(s);
|
int len = strlen(s);
|
||||||
printf("%s", s);
|
int i;
|
||||||
while (len++ < width) putchar(pad);
|
for (i=0; i<len && i<width; i++) {
|
||||||
|
fputc(*(s+i), stdout);
|
||||||
|
}
|
||||||
|
while (i++ < width) putchar(pad);
|
||||||
#else
|
#else
|
||||||
size_t len = mbstowcs(NULL, s, 0);
|
size_t len = mbstowcs(NULL, s, 0);
|
||||||
int i;
|
int i;
|
||||||
wchar_t static_buf[128];
|
wchar_t static_buf[128];
|
||||||
wchar_t *buf;
|
wchar_t *buf;
|
||||||
wchar_t *ws;
|
wchar_t *ws;
|
||||||
int display_len;
|
|
||||||
|
|
||||||
if (!len) {
|
if (!len) {
|
||||||
for (i=0; i<width; i++) {
|
for (i=0; i<width; i++) {
|
||||||
@@ -1223,13 +1255,16 @@ static void PrintLeft(char const *s, int width, char pad)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
(void) mbstowcs(buf, s, len+1);
|
(void) mbstowcs(buf, s, len+1);
|
||||||
display_len = wcswidth(buf, len+1);
|
|
||||||
|
|
||||||
ws = buf;
|
ws = buf;
|
||||||
for (i=0; i<width;) {
|
i=0;
|
||||||
|
while (i<width) {
|
||||||
if (*ws) {
|
if (*ws) {
|
||||||
|
if (i + wcwidth(*ws) > width) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i += wcwidth(*ws);
|
||||||
PutWideChar(*ws++, NULL);
|
PutWideChar(*ws++, NULL);
|
||||||
i+= wcwidth(*ws);
|
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1242,7 +1277,10 @@ static void PrintLeft(char const *s, int width, char pad)
|
|||||||
/* Possibly send lrm control sequence */
|
/* Possibly send lrm control sequence */
|
||||||
send_lrm();
|
send_lrm();
|
||||||
|
|
||||||
for (i=display_len; i<width; i++) fputc(pad, stdout);
|
while (i<width) {
|
||||||
|
fputc(pad, stdout);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
if (buf != static_buf) free(buf);
|
if (buf != static_buf) free(buf);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1263,7 +1301,7 @@ static void PrintCentered(char const *s, int width, char *pad)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i=0; i<d; i++) fputs(pad, stdout);
|
for (i=0; i<d; i++) fputs(pad, stdout);
|
||||||
for (i=0; i<width; i++) {
|
for (i=0; i<width-d; i++) {
|
||||||
if (*s) {
|
if (*s) {
|
||||||
if (isspace(*s)) {
|
if (isspace(*s)) {
|
||||||
putchar(' ');
|
putchar(' ');
|
||||||
@@ -1307,13 +1345,14 @@ static void PrintCentered(char const *s, int width, char *pad)
|
|||||||
if (d < 0) d = 0;
|
if (d < 0) d = 0;
|
||||||
ws = buf;
|
ws = buf;
|
||||||
for (i=0; i<d; i++) fputs(pad, stdout);
|
for (i=0; i<d; i++) fputs(pad, stdout);
|
||||||
for (i=0; i<width; i++) {
|
i=0;
|
||||||
|
while (i+d < width) {
|
||||||
if (*ws) {
|
if (*ws) {
|
||||||
PutWideChar(*ws++, NULL);
|
if (i+d + wcwidth(*ws) > width) {
|
||||||
if (wcwidth(*ws) == 0) {
|
break;
|
||||||
/* Don't count this character... it's zero-width */
|
|
||||||
i--;
|
|
||||||
}
|
}
|
||||||
|
i += wcwidth(*ws);
|
||||||
|
PutWideChar(*ws++, NULL);
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1325,7 +1364,10 @@ static void PrintCentered(char const *s, int width, char *pad)
|
|||||||
/* Possibly send lrm control sequence */
|
/* Possibly send lrm control sequence */
|
||||||
send_lrm();
|
send_lrm();
|
||||||
|
|
||||||
for (i=d+display_len; i<width; i++) fputs(pad, stdout);
|
while (i+d<width) {
|
||||||
|
fputs(pad, stdout);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
if (buf != static_buf) free(buf);
|
if (buf != static_buf) free(buf);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -1682,8 +1724,10 @@ static void GenerateCalEntries(int col)
|
|||||||
/* need to destroy it here. */
|
/* need to destroy it here. */
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Wprint("Unrecognized command; interpreting as REM");
|
if (!SuppressImplicitRemWarnings) {
|
||||||
WarnedAboutImplicit = 1;
|
Wprint("Unrecognized command; interpreting as REM");
|
||||||
|
WarnedAboutImplicit = 1;
|
||||||
|
}
|
||||||
CreateParser(CurLine, &p);
|
CreateParser(CurLine, &p);
|
||||||
r=DoCalRem(&p, col);
|
r=DoCalRem(&p, col);
|
||||||
break;
|
break;
|
||||||
@@ -2143,7 +2187,9 @@ static int DoCalRem(ParsePtr p, int col)
|
|||||||
FreeTrig(&trig);
|
FreeTrig(&trig);
|
||||||
return E_NO_MEM;
|
return E_NO_MEM;
|
||||||
}
|
}
|
||||||
|
#ifdef REM_USE_WCHAR
|
||||||
make_wchar_versions(e);
|
make_wchar_versions(e);
|
||||||
|
#endif
|
||||||
DBufInit(&(e->tags));
|
DBufInit(&(e->tags));
|
||||||
DBufPuts(&(e->tags), DBufValue(&(trig.tags)));
|
DBufPuts(&(e->tags), DBufValue(&(trig.tags)));
|
||||||
if (SynthesizeTags) {
|
if (SynthesizeTags) {
|
||||||
|
|||||||
45
src/dorem.c
45
src/dorem.c
@@ -208,7 +208,7 @@ int DoRem(ParsePtr p)
|
|||||||
DBufInit(&buf);
|
DBufInit(&buf);
|
||||||
|
|
||||||
/* Parse the trigger date and time */
|
/* Parse the trigger date and time */
|
||||||
if ( (r=ParseRem(p, &trig, &tim)) ) {
|
if ( (r=ParseRem(p, &trig, &tim)) != OK ) {
|
||||||
FreeTrig(&trig);
|
FreeTrig(&trig);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
@@ -437,10 +437,17 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case T_Date:
|
case T_Date:
|
||||||
DBufFree(&buf);
|
DBufFree(&buf);
|
||||||
if (trig->d != NO_DAY) return E_DAY_TWICE;
|
if (trig->d != NO_DAY) {
|
||||||
if (trig->m != NO_MON) return E_MON_TWICE;
|
return E_DAY_TWICE;
|
||||||
if (trig->y != NO_YR) return E_YR_TWICE;
|
}
|
||||||
|
if (trig->m != NO_MON) {
|
||||||
|
return E_MON_TWICE;
|
||||||
|
}
|
||||||
|
if (trig->y != NO_YR) {
|
||||||
|
return E_YR_TWICE;
|
||||||
|
}
|
||||||
|
|
||||||
FromDSE(tok.val, &y, &m, &d);
|
FromDSE(tok.val, &y, &m, &d);
|
||||||
trig->y = y;
|
trig->y = y;
|
||||||
trig->m = m;
|
trig->m = m;
|
||||||
@@ -542,6 +549,12 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
|
|||||||
if (r) return r;
|
if (r) return r;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case T_Number:
|
||||||
|
DBufFree(&buf);
|
||||||
|
Eprint("`%d' is not recognized as a year (%d-%d) or a day number (1-31)",
|
||||||
|
tok.val, BASE, BASE+YR_RANGE);
|
||||||
|
return E_PARSE_ERR;
|
||||||
|
|
||||||
case T_Year:
|
case T_Year:
|
||||||
DBufFree(&buf);
|
DBufFree(&buf);
|
||||||
if (trig->y != NO_YR) return E_YR_TWICE;
|
if (trig->y != NO_YR) return E_YR_TWICE;
|
||||||
@@ -682,11 +695,16 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
if (tok.type == T_Illegal && tok.val < 0) {
|
||||||
|
Eprint("%s: `%s'", ErrMsg[-tok.val], DBufValue(&buf));
|
||||||
|
DBufFree(&buf);
|
||||||
|
return -tok.val;
|
||||||
|
}
|
||||||
PushToken(DBufValue(&buf), s);
|
PushToken(DBufValue(&buf), s);
|
||||||
DBufFree(&buf);
|
DBufFree(&buf);
|
||||||
trig->typ = MSG_TYPE;
|
trig->typ = MSG_TYPE;
|
||||||
if (s->isnested) return E_CANT_NEST_RTYPE;
|
if (s->isnested) return E_CANT_NEST_RTYPE;
|
||||||
if (!WarnedAboutImplicit) {
|
if (!WarnedAboutImplicit && !SuppressImplicitRemWarnings) {
|
||||||
Wprint("Missing REM type; assuming MSG");
|
Wprint("Missing REM type; assuming MSG");
|
||||||
WarnedAboutImplicit = 1;
|
WarnedAboutImplicit = 1;
|
||||||
}
|
}
|
||||||
@@ -787,6 +805,11 @@ static int ParseTimeTrig(ParsePtr s, TimeTrig *tim)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
if (tok.type == T_Illegal && tok.val < 0) {
|
||||||
|
Eprint("%s: `%s'", ErrMsg[-tok.val], DBufValue(&buf));
|
||||||
|
DBufFree(&buf);
|
||||||
|
return -tok.val;
|
||||||
|
}
|
||||||
if (tim->ttime == NO_TIME) return E_EXPECT_TIME;
|
if (tim->ttime == NO_TIME) return E_EXPECT_TIME;
|
||||||
|
|
||||||
PushToken(DBufValue(&buf), s);
|
PushToken(DBufValue(&buf), s);
|
||||||
@@ -904,6 +927,11 @@ static int ParseUntil(ParsePtr s, Trigger *t, int type)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
if (tok.type == T_Illegal && tok.val < 0) {
|
||||||
|
Eprint("%s: `%s'", ErrMsg[-tok.val], DBufValue(&buf));
|
||||||
|
DBufFree(&buf);
|
||||||
|
return -tok.val;
|
||||||
|
}
|
||||||
if (y == NO_YR || m == NO_MON || d == NO_DAY) {
|
if (y == NO_YR || m == NO_MON || d == NO_DAY) {
|
||||||
Eprint("%s: %s", which, ErrMsg[E_INCOMPLETE]);
|
Eprint("%s: %s", which, ErrMsg[E_INCOMPLETE]);
|
||||||
DBufFree(&buf);
|
DBufFree(&buf);
|
||||||
@@ -1023,6 +1051,11 @@ static int ParseScanFrom(ParsePtr s, Trigger *t, int type)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
if (tok.type == T_Illegal && tok.val < 0) {
|
||||||
|
Eprint("%s: `%s'", ErrMsg[-tok.val], DBufValue(&buf));
|
||||||
|
DBufFree(&buf);
|
||||||
|
return -tok.val;
|
||||||
|
}
|
||||||
if (y == NO_YR || m == NO_MON || d == NO_DAY) {
|
if (y == NO_YR || m == NO_MON || d == NO_DAY) {
|
||||||
Eprint("%s: %s", word, ErrMsg[E_INCOMPLETE]);
|
Eprint("%s: %s", word, ErrMsg[E_INCOMPLETE]);
|
||||||
DBufFree(&buf);
|
DBufFree(&buf);
|
||||||
|
|||||||
@@ -152,7 +152,6 @@ int DBufGets(DynamicBuffer *dbuf, FILE *fp)
|
|||||||
/* Try reading the first few bytes right into the buffer --
|
/* Try reading the first few bytes right into the buffer --
|
||||||
we can usually save some unnecessary copying */
|
we can usually save some unnecessary copying */
|
||||||
|
|
||||||
*(dbuf->buffer) = 0;
|
|
||||||
if (fgets(dbuf->buffer, dbuf->allocatedLen, fp) == NULL) {
|
if (fgets(dbuf->buffer, dbuf->allocatedLen, fp) == NULL) {
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|||||||
111
src/expr.c
111
src/expr.c
@@ -685,16 +685,12 @@ eval_userfunc(expr_node *node, Value *locals, Value *ans, int *nonconst)
|
|||||||
/* Add a call to the call stack for better error messages */
|
/* Add a call to the call stack for better error messages */
|
||||||
pushed = push_call(f->filename, f->name, f->lineno);
|
pushed = push_call(f->filename, f->name, f->lineno);
|
||||||
|
|
||||||
if (DebugFlag & DB_PRTEXPR) {
|
DBG(debug_enter_userfunc(node, new_locals, f->nargs));
|
||||||
debug_enter_userfunc(node, new_locals, f->nargs);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Evaluate the function's expr_node tree */
|
/* Evaluate the function's expr_node tree */
|
||||||
r = evaluate_expr_node(f->node, new_locals, ans, nonconst);
|
r = evaluate_expr_node(f->node, new_locals, ans, nonconst);
|
||||||
|
|
||||||
if (DebugFlag & DB_PRTEXPR) {
|
DBG(debug_exit_userfunc(node, ans, r, new_locals, f->nargs));
|
||||||
debug_exit_userfunc(node, ans, r, new_locals, f->nargs);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (r != OK) {
|
if (r != OK) {
|
||||||
/* We print the error here in order to get the call stack trace */
|
/* We print the error here in order to get the call stack trace */
|
||||||
@@ -1506,18 +1502,7 @@ static int logical_and(expr_node *node, Value *locals, Value *ans, int *nonconst
|
|||||||
/* Read a token. */
|
/* Read a token. */
|
||||||
/* */
|
/* */
|
||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
static int parse_expr_token_aux(DynamicBuffer *buf, char const **in);
|
|
||||||
static int parse_expr_token(DynamicBuffer *buf, char const **in)
|
static int parse_expr_token(DynamicBuffer *buf, char const **in)
|
||||||
{
|
|
||||||
int r = parse_expr_token_aux(buf, in);
|
|
||||||
|
|
||||||
/* Munch any following whitespace */
|
|
||||||
while (**in && isempty(**in)) (*in)++;
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int parse_expr_token_aux(DynamicBuffer *buf, char const **in)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
char c;
|
char c;
|
||||||
@@ -1555,9 +1540,11 @@ static int parse_expr_token_aux(DynamicBuffer *buf, char const **in)
|
|||||||
return E_NO_MEM;
|
return E_NO_MEM;
|
||||||
}
|
}
|
||||||
(*in)++;
|
(*in)++;
|
||||||
}
|
} else {
|
||||||
return OK;
|
Eprint("%s `%c' (did you mean `%c%c'?)", ErrMsg[E_PARSE_ERR], c, c, c);
|
||||||
|
return E_PARSE_ERR;
|
||||||
|
}
|
||||||
|
return OK;
|
||||||
case '!':
|
case '!':
|
||||||
case '>':
|
case '>':
|
||||||
case '<':
|
case '<':
|
||||||
@@ -1698,7 +1685,7 @@ static int parse_expr_token_aux(DynamicBuffer *buf, char const **in)
|
|||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
static int peek_expr_token(DynamicBuffer *buf, char const *in)
|
static int peek_expr_token(DynamicBuffer *buf, char const *in)
|
||||||
{
|
{
|
||||||
return parse_expr_token_aux(buf, &in);
|
return parse_expr_token(buf, &in);
|
||||||
}
|
}
|
||||||
|
|
||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
@@ -1778,6 +1765,7 @@ static expr_node * parse_function_call(char const **e, int *r, Var *locals, int
|
|||||||
expr_node *node;
|
expr_node *node;
|
||||||
expr_node *arg;
|
expr_node *arg;
|
||||||
char *s;
|
char *s;
|
||||||
|
char const *ptr;
|
||||||
CHECK_PARSE_LEVEL();
|
CHECK_PARSE_LEVEL();
|
||||||
|
|
||||||
node = alloc_expr_node(r);
|
node = alloc_expr_node(r);
|
||||||
@@ -1850,6 +1838,7 @@ static expr_node * parse_function_call(char const **e, int *r, Var *locals, int
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (TOKEN_IS(")")) {
|
if (TOKEN_IS(")")) {
|
||||||
|
ptr = *e;
|
||||||
*r = GET_TOKEN();
|
*r = GET_TOKEN();
|
||||||
if (*r != OK) {
|
if (*r != OK) {
|
||||||
return free_expr_tree(node);
|
return free_expr_tree(node);
|
||||||
@@ -1858,8 +1847,14 @@ static expr_node * parse_function_call(char const **e, int *r, Var *locals, int
|
|||||||
/* Check args for builtin funcs */
|
/* Check args for builtin funcs */
|
||||||
if (node->type == N_BUILTIN_FUNC) {
|
if (node->type == N_BUILTIN_FUNC) {
|
||||||
f = node->u.builtin_func;
|
f = node->u.builtin_func;
|
||||||
if (node->num_kids < f->minargs) *r = E_2FEW_ARGS;
|
if (node->num_kids < f->minargs) {
|
||||||
if (node->num_kids > f->maxargs && f->maxargs != NO_MAX) *r = E_2MANY_ARGS;
|
*e = ptr;
|
||||||
|
*r = E_2FEW_ARGS;
|
||||||
|
}
|
||||||
|
if (node->num_kids > f->maxargs && f->maxargs != NO_MAX) {
|
||||||
|
*e = ptr;
|
||||||
|
*r = E_2MANY_ARGS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (*r != OK) {
|
if (*r != OK) {
|
||||||
if (node->type == N_BUILTIN_FUNC) {
|
if (node->type == N_BUILTIN_FUNC) {
|
||||||
@@ -1909,11 +1904,25 @@ static int set_constant_value(expr_node *atom)
|
|||||||
return OK;
|
return OK;
|
||||||
} else if (*s == '\'') { /* It's a literal date */
|
} else if (*s == '\'') { /* It's a literal date */
|
||||||
s++;
|
s++;
|
||||||
if ((r=ParseLiteralDate(&s, &dse, &tim)) != 0) return r;
|
if ((r=ParseLiteralDateOrTime(&s, &dse, &tim)) != 0) {
|
||||||
if (*s != '\'') return E_BAD_DATE;
|
Eprint("%s: %s", ErrMsg[r], DBufValue(&ExprBuf));
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
if (*s != '\'') {
|
||||||
|
if (dse != NO_DATE) {
|
||||||
|
Eprint("%s: %s", ErrMsg[E_BAD_DATE], DBufValue(&ExprBuf));
|
||||||
|
return E_BAD_DATE;
|
||||||
|
} else {
|
||||||
|
Eprint("%s: %s", ErrMsg[E_BAD_TIME], DBufValue(&ExprBuf));
|
||||||
|
return E_BAD_TIME;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (tim == NO_TIME) {
|
if (tim == NO_TIME) {
|
||||||
atom->u.value.type = DATE_TYPE;
|
atom->u.value.type = DATE_TYPE;
|
||||||
atom->u.value.v.val = dse;
|
atom->u.value.v.val = dse;
|
||||||
|
} else if (dse == NO_DATE) {
|
||||||
|
atom->u.value.type = TIME_TYPE;
|
||||||
|
atom->u.value.v.val = tim;
|
||||||
} else {
|
} else {
|
||||||
atom->u.value.type = DATETIME_TYPE;
|
atom->u.value.type = DATETIME_TYPE;
|
||||||
atom->u.value.v.val = (dse * MINUTES_PER_DAY) + tim;
|
atom->u.value.v.val = (dse * MINUTES_PER_DAY) + tim;
|
||||||
@@ -1934,7 +1943,10 @@ static int set_constant_value(expr_node *atom)
|
|||||||
}
|
}
|
||||||
if (*s == ':' || *s == '.' || *s == TimeSep) { /* Must be a literal time */
|
if (*s == ':' || *s == '.' || *s == TimeSep) { /* Must be a literal time */
|
||||||
s++;
|
s++;
|
||||||
if (!isdigit(*s)) return E_BAD_TIME;
|
if (!isdigit(*s)) {
|
||||||
|
Eprint("%s: `%s'", ErrMsg[E_BAD_TIME], DBufValue(&ExprBuf));
|
||||||
|
return E_BAD_TIME;
|
||||||
|
}
|
||||||
h = val;
|
h = val;
|
||||||
m = 0;
|
m = 0;
|
||||||
while (isdigit(*s)) {
|
while (isdigit(*s)) {
|
||||||
@@ -1950,9 +1962,15 @@ static int set_constant_value(expr_node *atom)
|
|||||||
s++;
|
s++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (*s || h>23 || m>59) return E_BAD_TIME;
|
if (*s || h>23 || m>59) {
|
||||||
|
Eprint("%s: `%s'", ErrMsg[E_BAD_TIME], DBufValue(&ExprBuf));
|
||||||
|
return E_BAD_TIME;
|
||||||
|
}
|
||||||
if (ampm) {
|
if (ampm) {
|
||||||
if (h < 1 || h > 12) return E_BAD_TIME;
|
if (h < 1 || h > 12) {
|
||||||
|
Eprint("%s: `%s'", ErrMsg[E_BAD_TIME], DBufValue(&ExprBuf));
|
||||||
|
return E_BAD_TIME;
|
||||||
|
}
|
||||||
if (ampm == 'a') {
|
if (ampm == 'a') {
|
||||||
if (h == 12) {
|
if (h == 12) {
|
||||||
h = 0;
|
h = 0;
|
||||||
@@ -1968,7 +1986,10 @@ static int set_constant_value(expr_node *atom)
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
/* Not a time - must be a number */
|
/* Not a time - must be a number */
|
||||||
if (*s) return E_BAD_NUMBER;
|
if (*s) {
|
||||||
|
Eprint("%s: `%s'", ErrMsg[E_BAD_NUMBER], DBufValue(&ExprBuf));
|
||||||
|
return E_BAD_NUMBER;
|
||||||
|
}
|
||||||
atom->u.value.type = INT_TYPE;
|
atom->u.value.type = INT_TYPE;
|
||||||
atom->u.value.v.val = val;
|
atom->u.value.v.val = val;
|
||||||
return OK;
|
return OK;
|
||||||
@@ -2016,7 +2037,7 @@ static int make_atom(expr_node *atom, Var *locals)
|
|||||||
/* System Variable */
|
/* System Variable */
|
||||||
if (*(s) == '$' && isalpha(*(s+1))) {
|
if (*(s) == '$' && isalpha(*(s+1))) {
|
||||||
if (!FindSysVar(s+1)) {
|
if (!FindSysVar(s+1)) {
|
||||||
Eprint("`%s': %s", s, ErrMsg[E_NOSUCH_VAR]);
|
Eprint("%s: `%s'", ErrMsg[E_NOSUCH_VAR], s);
|
||||||
return E_NOSUCH_VAR;
|
return E_NOSUCH_VAR;
|
||||||
}
|
}
|
||||||
if (strlen(s+1) < SHORT_NAME_BUF) {
|
if (strlen(s+1) < SHORT_NAME_BUF) {
|
||||||
@@ -2502,15 +2523,23 @@ expr_node *parse_expression(char const **e, int *r, Var *locals)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (*r == E_EXPECT_COMMA ||
|
if (*r == E_EXPECT_COMMA ||
|
||||||
*r == E_PARSE_ERR ||
|
|
||||||
*r == E_MISS_RIGHT_PAREN ||
|
*r == E_MISS_RIGHT_PAREN ||
|
||||||
*r == E_EXPECTING_EOL ||
|
*r == E_EXPECTING_EOL ||
|
||||||
|
*r == E_2MANY_ARGS ||
|
||||||
|
*r == E_2FEW_ARGS ||
|
||||||
*r == E_PARSE_ERR ||
|
*r == E_PARSE_ERR ||
|
||||||
*r == E_EOLN ||
|
*r == E_EOLN ||
|
||||||
*r == E_ILLEGAL_CHAR) {
|
*r == E_ILLEGAL_CHAR) {
|
||||||
orig = o2;
|
orig = o2;
|
||||||
while (*orig) {
|
while (*orig) {
|
||||||
fprintf(ErrFp, "%c", *orig++);
|
if (*orig == '\n') {
|
||||||
|
fprintf(ErrFp, " ");
|
||||||
|
orig++;
|
||||||
|
} else if (*orig == ']' && ! *(orig+1)) {
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
fprintf(ErrFp, "%c", *orig++);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fprintf(ErrFp, "\n");
|
fprintf(ErrFp, "\n");
|
||||||
orig = o2;
|
orig = o2;
|
||||||
@@ -2843,25 +2872,32 @@ int ParseLiteralTime(char const **s, int *tim)
|
|||||||
|
|
||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
/* */
|
/* */
|
||||||
/* ParseLiteralDate */
|
/* ParseLiteralDateOrTime */
|
||||||
/* */
|
/* */
|
||||||
/* Parse a literal date or datetime. Return result in dse */
|
/* Parse a literal date or datetime. Return result in dse */
|
||||||
/* and tim; update s. */
|
/* and tim; update s. */
|
||||||
/* */
|
/* */
|
||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
int ParseLiteralDate(char const **s, int *dse, int *tim)
|
int ParseLiteralDateOrTime(char const **s, int *dse, int *tim)
|
||||||
{
|
{
|
||||||
int y, m, d;
|
int y, m, d;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
char const *orig_s = *s;
|
||||||
|
|
||||||
y=0; m=0; d=0;
|
y=0; m=0; d=0;
|
||||||
|
|
||||||
*tim = NO_TIME;
|
*tim = NO_TIME;
|
||||||
|
*dse = NO_DATE;
|
||||||
if (!isdigit(**s)) return E_BAD_DATE;
|
if (!isdigit(**s)) return E_BAD_DATE;
|
||||||
while (isdigit(**s)) {
|
while (isdigit(**s)) {
|
||||||
y *= 10;
|
y *= 10;
|
||||||
y += *(*s)++ - '0';
|
y += *(*s)++ - '0';
|
||||||
}
|
}
|
||||||
|
if (**s == ':' || **s == '.' || **s == TimeSep) {
|
||||||
|
*s = orig_s;
|
||||||
|
return ParseLiteralTime(s, tim);
|
||||||
|
}
|
||||||
if (**s != '/' && **s != '-' && **s != DateSep) return E_BAD_DATE;
|
if (**s != '/' && **s != '-' && **s != DateSep) return E_BAD_DATE;
|
||||||
(*s)++;
|
(*s)++;
|
||||||
if (!isdigit(**s)) return E_BAD_DATE;
|
if (!isdigit(**s)) return E_BAD_DATE;
|
||||||
@@ -2917,7 +2953,8 @@ int DoCoerce(char type, Value *v)
|
|||||||
return OK;
|
return OK;
|
||||||
case STR_TYPE:
|
case STR_TYPE:
|
||||||
s = v->v.str;
|
s = v->v.str;
|
||||||
if (ParseLiteralDate(&s, &i, &m)) return E_CANT_COERCE;
|
if (ParseLiteralDateOrTime(&s, &i, &m)) return E_CANT_COERCE;
|
||||||
|
if (i == NO_DATE) return E_CANT_COERCE;
|
||||||
if (*s) return E_CANT_COERCE;
|
if (*s) return E_CANT_COERCE;
|
||||||
v->type = DATETIME_TYPE;
|
v->type = DATETIME_TYPE;
|
||||||
free(v->v.str);
|
free(v->v.str);
|
||||||
@@ -2999,7 +3036,8 @@ int DoCoerce(char type, Value *v)
|
|||||||
|
|
||||||
case STR_TYPE:
|
case STR_TYPE:
|
||||||
s = v->v.str;
|
s = v->v.str;
|
||||||
if (ParseLiteralDate(&s, &i, &m)) return E_CANT_COERCE;
|
if (ParseLiteralDateOrTime(&s, &i, &m)) return E_CANT_COERCE;
|
||||||
|
if (i == NO_DATE) return E_CANT_COERCE;
|
||||||
if (*s) return E_CANT_COERCE;
|
if (*s) return E_CANT_COERCE;
|
||||||
v->type = DATE_TYPE;
|
v->type = DATE_TYPE;
|
||||||
free(v->v.str);
|
free(v->v.str);
|
||||||
@@ -3025,6 +3063,7 @@ int DoCoerce(char type, Value *v)
|
|||||||
|
|
||||||
case STR_TYPE:
|
case STR_TYPE:
|
||||||
s = v->v.str;
|
s = v->v.str;
|
||||||
|
i=0; /* Avoid compiler warning */
|
||||||
if (ParseLiteralTime(&s, &i)) return E_CANT_COERCE;
|
if (ParseLiteralTime(&s, &i)) return E_CANT_COERCE;
|
||||||
if (*s) return E_CANT_COERCE;
|
if (*s) return E_CANT_COERCE;
|
||||||
v->type = TIME_TYPE;
|
v->type = TIME_TYPE;
|
||||||
|
|||||||
10
src/funcs.c
10
src/funcs.c
@@ -4005,3 +4005,13 @@ BuiltinFunc *FindBuiltinFunc(char const *name)
|
|||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
print_builtinfunc_tokens(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
printf("\n# Built-in Functions\n\n");
|
||||||
|
for (i=0; i<NumFuncs; i++) {
|
||||||
|
printf("%s\n", Func[i].name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -171,6 +171,9 @@ EXTERN DynamicBuffer ExprBuf;
|
|||||||
/* User-func recursion level */
|
/* User-func recursion level */
|
||||||
EXTERN INIT( unsigned int FuncRecursionLevel, 0);
|
EXTERN INIT( unsigned int FuncRecursionLevel, 0);
|
||||||
|
|
||||||
|
/* Suppress warnings about implicit REM and MSG */
|
||||||
|
EXTERN INIT( int SuppressImplicitRemWarnings, 0);
|
||||||
|
|
||||||
extern int NumFullOmits, NumPartialOmits;
|
extern int NumFullOmits, NumPartialOmits;
|
||||||
|
|
||||||
/* List of months */
|
/* List of months */
|
||||||
|
|||||||
13
src/init.c
13
src/init.c
@@ -717,6 +717,10 @@ void InitRemind(int argc, char const *argv[])
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
if (tok.type == T_Illegal && tok.val < 0) {
|
||||||
|
fprintf(stderr, "%s: `%s'\n", ErrMsg[-tok.val], arg);
|
||||||
|
Usage();
|
||||||
|
}
|
||||||
Usage();
|
Usage();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1067,6 +1071,12 @@ ProcessLongOption(char const *arg)
|
|||||||
printf("%s\n", VERSION);
|
printf("%s\n", VERSION);
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
if (!strcmp(arg, "print-tokens")) {
|
||||||
|
print_remind_tokens();
|
||||||
|
print_builtinfunc_tokens();
|
||||||
|
print_sysvar_tokens();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
if (sscanf(arg, "max-execution-time=%d", &t) == 1) {
|
if (sscanf(arg, "max-execution-time=%d", &t) == 1) {
|
||||||
if (t < 0) {
|
if (t < 0) {
|
||||||
fprintf(ErrFp, "%s: --max-execution-time must be non-negative\n", ArgV[0]);
|
fprintf(ErrFp, "%s: --max-execution-time must be non-negative\n", ArgV[0]);
|
||||||
@@ -1119,6 +1129,8 @@ guess_terminal_background(int *r, int *g, int *b)
|
|||||||
|
|
||||||
if (n != 8) {
|
if (n != 8) {
|
||||||
/* write failed... WTF? Not much we can do */
|
/* write failed... WTF? Not much we can do */
|
||||||
|
tty_reset(ttyfd);
|
||||||
|
close(ttyfd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1142,6 +1154,7 @@ guess_terminal_background(int *r, int *g, int *b)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
tty_reset(ttyfd);
|
tty_reset(ttyfd);
|
||||||
|
close(ttyfd);
|
||||||
buf[n+1] = 0;
|
buf[n+1] = 0;
|
||||||
if (n < 25) {
|
if (n < 25) {
|
||||||
/* Too short */
|
/* Too short */
|
||||||
|
|||||||
@@ -356,8 +356,10 @@ static void DoReminders(void)
|
|||||||
/* If we don't recognize the command, do a REM by default, but warn */
|
/* If we don't recognize the command, do a REM by default, but warn */
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Wprint("Unrecognized command; interpreting as REM");
|
if (!SuppressImplicitRemWarnings) {
|
||||||
WarnedAboutImplicit = 1;
|
Wprint("Unrecognized command; interpreting as REM");
|
||||||
|
WarnedAboutImplicit = 1;
|
||||||
|
}
|
||||||
DestroyParser(&p);
|
DestroyParser(&p);
|
||||||
CreateParser(CurLine, &p);
|
CreateParser(CurLine, &p);
|
||||||
purge_handled = 1;
|
purge_handled = 1;
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ static double phase (double, double *, double *, double *, double *, double *, d
|
|||||||
/* */
|
/* */
|
||||||
/* jdate */
|
/* jdate */
|
||||||
/* */
|
/* */
|
||||||
/* Convert a date and time to DSE day and fraction. */
|
/* Convert a date and time to Julian day and fraction. */
|
||||||
/* */
|
/* */
|
||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
static long jdate(int y, int mon, int day)
|
static long jdate(int y, int mon, int day)
|
||||||
|
|||||||
@@ -145,7 +145,9 @@ int PushOmitContext(ParsePtr p)
|
|||||||
context->partsave = malloc(NumPartialOmits * sizeof(int));
|
context->partsave = malloc(NumPartialOmits * sizeof(int));
|
||||||
if (NumPartialOmits && !context->partsave) {
|
if (NumPartialOmits && !context->partsave) {
|
||||||
free(context->filename);
|
free(context->filename);
|
||||||
free(context->fullsave);
|
if (context->fullsave) {
|
||||||
|
free(context->fullsave);
|
||||||
|
}
|
||||||
free(context);
|
free(context);
|
||||||
return E_NO_MEM;
|
return E_NO_MEM;
|
||||||
}
|
}
|
||||||
@@ -399,6 +401,8 @@ int DoOmit(ParsePtr p)
|
|||||||
default:
|
default:
|
||||||
if (tok.type == T_Until) {
|
if (tok.type == T_Until) {
|
||||||
Eprint("OMIT: UNTIL not allowed; did you mean THROUGH?");
|
Eprint("OMIT: UNTIL not allowed; did you mean THROUGH?");
|
||||||
|
} else if (tok.type == T_Illegal && tok.val < 0) {
|
||||||
|
Eprint("%s: `%s'", ErrMsg[-tok.val], DBufValue(&buf));
|
||||||
} else {
|
} else {
|
||||||
Eprint("%s: `%s' (OMIT)", ErrMsg[E_UNKNOWN_TOKEN],
|
Eprint("%s: `%s' (OMIT)", ErrMsg[E_UNKNOWN_TOKEN],
|
||||||
DBufValue(&buf));
|
DBufValue(&buf));
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ int TriggerReminder (ParsePtr p, Trigger *t, TimeTrig *tim, int dse, int is_queu
|
|||||||
int ShouldTriggerReminder (Trigger *t, TimeTrig *tim, int dse, int *err);
|
int ShouldTriggerReminder (Trigger *t, TimeTrig *tim, int dse, int *err);
|
||||||
int DoSubst (ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int dse, int mode);
|
int DoSubst (ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int dse, int mode);
|
||||||
int DoSubstFromString (char const *source, DynamicBuffer *dbuf, int dse, int tim);
|
int DoSubstFromString (char const *source, DynamicBuffer *dbuf, int dse, int tim);
|
||||||
int ParseLiteralDate (char const **s, int *dse, int *tim);
|
int ParseLiteralDateOrTime (char const **s, int *dse, int *tim);
|
||||||
int ParseLiteralTime (char const **s, int *tim);
|
int ParseLiteralTime (char const **s, int *tim);
|
||||||
expr_node *parse_expression(char const **e, int *r, Var *locals);
|
expr_node *parse_expression(char const **e, int *r, Var *locals);
|
||||||
|
|
||||||
@@ -242,3 +242,8 @@ void PutWideChar(wchar_t const wc, DynamicBuffer *output);
|
|||||||
extern int _private_mul_overflow(int a, int b);
|
extern int _private_mul_overflow(int a, int b);
|
||||||
extern int _private_add_overflow(int a, int b);
|
extern int _private_add_overflow(int a, int b);
|
||||||
extern int _private_sub_overflow(int a, int b);
|
extern int _private_sub_overflow(int a, int b);
|
||||||
|
|
||||||
|
/* Utility functions for dumping tokens */
|
||||||
|
void print_sysvar_tokens(void);
|
||||||
|
void print_builtinfunc_tokens(void);
|
||||||
|
void print_remind_tokens(void);
|
||||||
|
|||||||
165
src/token.c
165
src/token.c
@@ -39,19 +39,19 @@ while (isdigit(*(string))) { \
|
|||||||
Token TokArray[] = {
|
Token TokArray[] = {
|
||||||
/* NAME MINLEN TYPE VALUE */
|
/* NAME MINLEN TYPE VALUE */
|
||||||
{ "addomit", 7, T_AddOmit, 0 },
|
{ "addomit", 7, T_AddOmit, 0 },
|
||||||
{ "after", 3, T_Skip, AFTER_SKIP },
|
{ "after", 5, T_Skip, AFTER_SKIP },
|
||||||
{ "april", 3, T_Month, 3 },
|
{ "april", 3, T_Month, 3 },
|
||||||
{ "at", 2, T_At, 0 },
|
{ "at", 2, T_At, 0 },
|
||||||
{ "august", 3, T_Month, 7 },
|
{ "august", 3, T_Month, 7 },
|
||||||
{ "banner", 3, T_Banner, 0 },
|
{ "banner", 3, T_Banner, 0 },
|
||||||
{ "before", 3, T_Skip, BEFORE_SKIP },
|
{ "before", 6, T_Skip, BEFORE_SKIP },
|
||||||
{ "cal", 3, T_RemType, CAL_TYPE },
|
{ "cal", 3, T_RemType, CAL_TYPE },
|
||||||
{ "clear-omit-context", 5, T_Clr, 0 },
|
{ "clear-omit-context", 5, T_Clr, 0 },
|
||||||
{ "debug", 5, T_Debug, 0 },
|
{ "debug", 5, T_Debug, 0 },
|
||||||
{ "december", 3, T_Month, 11 },
|
{ "december", 3, T_Month, 11 },
|
||||||
{ "do", 2, T_IncludeR, 0 },
|
{ "do", 2, T_IncludeR, 0 },
|
||||||
{ "dumpvars", 4, T_Dumpvars, 0 },
|
{ "dumpvars", 4, T_Dumpvars, 0 },
|
||||||
{ "duration", 3, T_Duration, 0 },
|
{ "duration", 8, T_Duration, 0 },
|
||||||
{ "else", 4, T_Else, 0 },
|
{ "else", 4, T_Else, 0 },
|
||||||
{ "endif", 5, T_EndIf, 0 },
|
{ "endif", 5, T_EndIf, 0 },
|
||||||
{ "errmsg", 6, T_ErrMsg, 0 },
|
{ "errmsg", 6, T_ErrMsg, 0 },
|
||||||
@@ -85,9 +85,9 @@ Token TokArray[] = {
|
|||||||
{ "noqueue", 7, T_NoQueue, 0 },
|
{ "noqueue", 7, T_NoQueue, 0 },
|
||||||
{ "november", 3, T_Month, 10 },
|
{ "november", 3, T_Month, 10 },
|
||||||
{ "october", 3, T_Month, 9 },
|
{ "october", 3, T_Month, 9 },
|
||||||
{ "omit", 3, T_Omit, 0 },
|
{ "omit", 4, T_Omit, 0 },
|
||||||
{ "omitfunc", 8, T_OmitFunc, 0 },
|
{ "omitfunc", 8, T_OmitFunc, 0 },
|
||||||
{ "once", 3, T_Once, 0 },
|
{ "once", 4, T_Once, 0 },
|
||||||
{ "pop-omit-context", 3, T_Pop, 0 },
|
{ "pop-omit-context", 3, T_Pop, 0 },
|
||||||
{ "preserve", 8, T_Preserve, 0 },
|
{ "preserve", 8, T_Preserve, 0 },
|
||||||
{ "priority", 8, T_Priority, 0 },
|
{ "priority", 8, T_Priority, 0 },
|
||||||
@@ -103,7 +103,7 @@ Token TokArray[] = {
|
|||||||
{ "second", 6, T_Ordinal, 1 },
|
{ "second", 6, T_Ordinal, 1 },
|
||||||
{ "september", 3, T_Month, 8 },
|
{ "september", 3, T_Month, 8 },
|
||||||
{ "set", 3, T_Set, 0 },
|
{ "set", 3, T_Set, 0 },
|
||||||
{ "skip", 3, T_Skip, SKIP_SKIP },
|
{ "skip", 4, T_Skip, SKIP_SKIP },
|
||||||
{ "special", 7, T_RemType, PASSTHRU_TYPE },
|
{ "special", 7, T_RemType, PASSTHRU_TYPE },
|
||||||
{ "sunday", 3, T_WkDay, 6 },
|
{ "sunday", 3, T_WkDay, 6 },
|
||||||
{ "tag", 3, T_Tag, 0 },
|
{ "tag", 3, T_Tag, 0 },
|
||||||
@@ -112,13 +112,28 @@ Token TokArray[] = {
|
|||||||
{ "thursday", 3, T_WkDay, 3 },
|
{ "thursday", 3, T_WkDay, 3 },
|
||||||
{ "tuesday", 3, T_WkDay, 1 },
|
{ "tuesday", 3, T_WkDay, 1 },
|
||||||
{ "unset", 5, T_UnSet, 0 },
|
{ "unset", 5, T_UnSet, 0 },
|
||||||
{ "until", 3, T_Until, 0 },
|
{ "until", 5, T_Until, 0 },
|
||||||
{ "warn", 4, T_Warn, 0 },
|
{ "warn", 4, T_Warn, 0 },
|
||||||
{ "wednesday", 3, T_WkDay, 2 }
|
{ "wednesday", 3, T_WkDay, 2 }
|
||||||
};
|
};
|
||||||
|
|
||||||
static int TokStrCmp (Token const *t, char const *s);
|
static int TokStrCmp (Token const *t, char const *s);
|
||||||
|
|
||||||
|
static void
|
||||||
|
init_token(Token *t)
|
||||||
|
{
|
||||||
|
t->name = NULL;
|
||||||
|
t->type = T_Illegal;
|
||||||
|
t->val = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
token_error(Token *t, int errcode)
|
||||||
|
{
|
||||||
|
t->type = T_Illegal;
|
||||||
|
t->val = -errcode;
|
||||||
|
}
|
||||||
|
|
||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
/* */
|
/* */
|
||||||
/* FindInitialToken */
|
/* FindInitialToken */
|
||||||
@@ -132,7 +147,7 @@ char const *FindInitialToken(Token *tok, char const *s)
|
|||||||
DynamicBuffer buf;
|
DynamicBuffer buf;
|
||||||
DBufInit(&buf);
|
DBufInit(&buf);
|
||||||
|
|
||||||
tok->type = T_Illegal;
|
init_token(tok);
|
||||||
|
|
||||||
while (isempty(*s)) s++;
|
while (isempty(*s)) s++;
|
||||||
|
|
||||||
@@ -159,7 +174,7 @@ void FindToken(char const *s, Token *tok)
|
|||||||
int top, bot, mid, r, max;
|
int top, bot, mid, r, max;
|
||||||
int l;
|
int l;
|
||||||
|
|
||||||
tok->type = T_Illegal;
|
init_token(tok);
|
||||||
if (! *s) {
|
if (! *s) {
|
||||||
tok->type = T_Empty;
|
tok->type = T_Empty;
|
||||||
return;
|
return;
|
||||||
@@ -233,9 +248,9 @@ void FindNumericToken(char const *s, Token *t)
|
|||||||
int mult = 1, hour, min;
|
int mult = 1, hour, min;
|
||||||
char const *s_orig = s;
|
char const *s_orig = s;
|
||||||
int ampm = 0;
|
int ampm = 0;
|
||||||
|
int r;
|
||||||
|
|
||||||
t->type = T_Illegal;
|
init_token(t);
|
||||||
t->val = 0;
|
|
||||||
if (isdigit(*s)) {
|
if (isdigit(*s)) {
|
||||||
PARSENUM(t->val, s);
|
PARSENUM(t->val, s);
|
||||||
|
|
||||||
@@ -243,22 +258,37 @@ void FindNumericToken(char const *s, Token *t)
|
|||||||
if (*s == '-' || *s == '/') {
|
if (*s == '-' || *s == '/') {
|
||||||
char const *p = s_orig;
|
char const *p = s_orig;
|
||||||
int dse, tim;
|
int dse, tim;
|
||||||
if (ParseLiteralDate(&p, &dse, &tim) == OK) {
|
r = ParseLiteralDateOrTime(&p, &dse, &tim);
|
||||||
if (*p) return;
|
if (r == OK) {
|
||||||
|
if (*p) {
|
||||||
|
if (tim == NO_TIME) {
|
||||||
|
t->val = -E_BAD_DATE;
|
||||||
|
} else {
|
||||||
|
t->val = -E_BAD_TIME;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (tim == NO_TIME) {
|
if (tim == NO_TIME) {
|
||||||
t->type = T_Date;
|
t->type = T_Date;
|
||||||
t->val = dse;
|
t->val = dse;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (dse == NO_DATE) {
|
||||||
|
t->type = T_Time;
|
||||||
|
t->val = tim;
|
||||||
|
return;
|
||||||
|
}
|
||||||
t->type = T_DateTime;
|
t->type = T_DateTime;
|
||||||
t->val = MINUTES_PER_DAY * dse + tim;
|
t->val = MINUTES_PER_DAY * dse + tim;
|
||||||
}
|
} else {
|
||||||
|
token_error(t, r);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we hit a comma, swallow it. This allows stuff
|
/* If we hit a comma, swallow it. This allows stuff
|
||||||
like Jan 6, 1998 */
|
like Jan 6, 1998 */
|
||||||
if (*s == ',') {
|
if (*s == ',' && *(s+1) == 0) {
|
||||||
/* Classify the number we've got */
|
/* Classify the number we've got */
|
||||||
if (t->val >= BASE && t->val <= BASE+YR_RANGE) t->type = T_Year;
|
if (t->val >= BASE && t->val <= BASE+YR_RANGE) t->type = T_Year;
|
||||||
else if (t->val >= 1 && t->val <= 31) t->type = T_Day;
|
else if (t->val >= 1 && t->val <= 31) t->type = T_Day;
|
||||||
@@ -269,8 +299,16 @@ void FindNumericToken(char const *s, Token *t)
|
|||||||
if (*s == ':' || *s == '.' || *s == TimeSep) {
|
if (*s == ':' || *s == '.' || *s == TimeSep) {
|
||||||
s++;
|
s++;
|
||||||
hour = t->val;
|
hour = t->val;
|
||||||
|
if (!isdigit(*s)) {
|
||||||
|
token_error(t, E_BAD_TIME);
|
||||||
|
return;
|
||||||
|
}
|
||||||
PARSENUM(min, s);
|
PARSENUM(min, s);
|
||||||
if (min > 59) return; /* Illegal time */
|
if (min > 59) {
|
||||||
|
/* Illegal time */
|
||||||
|
token_error(t, E_BAD_TIME);
|
||||||
|
return;
|
||||||
|
}
|
||||||
/* Check for p[m] or a[m] */
|
/* Check for p[m] or a[m] */
|
||||||
if (*s == 'A' || *s == 'a' || *s == 'P' || *s == 'p') {
|
if (*s == 'A' || *s == 'a' || *s == 'P' || *s == 'p') {
|
||||||
ampm = tolower(*s);
|
ampm = tolower(*s);
|
||||||
@@ -279,9 +317,15 @@ void FindNumericToken(char const *s, Token *t)
|
|||||||
s++;
|
s++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (*s) return; /* Illegal time */
|
if (*s) {
|
||||||
|
token_error(t, E_BAD_TIME);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (ampm) {
|
if (ampm) {
|
||||||
if (hour < 1 || hour > 12) return;
|
if (hour < 1 || hour > 12) {
|
||||||
|
token_error(t, E_BAD_TIME);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (ampm == 'a') {
|
if (ampm == 'a') {
|
||||||
if (hour == 12) {
|
if (hour == 12) {
|
||||||
hour = 0;
|
hour = 0;
|
||||||
@@ -303,45 +347,70 @@ void FindNumericToken(char const *s, Token *t)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* If we hit a non-digit, error! */
|
/* If we hit a non-digit, error! */
|
||||||
if (*s) return;
|
if (*s) {
|
||||||
|
token_error(t, E_BAD_NUMBER);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Classify the number we've got */
|
/* Classify the number we've got */
|
||||||
if (t->val >= BASE && t->val <= BASE+YR_RANGE) t->type = T_Year;
|
if (t->val >= BASE && t->val <= BASE+YR_RANGE) t->type = T_Year;
|
||||||
else if (t->val >= 1 && t->val <= 31) t->type = T_Day;
|
else if (t->val >= 1 && t->val <= 31) t->type = T_Day;
|
||||||
else t->type = T_Number;
|
else t->type = T_Number;
|
||||||
return;
|
return;
|
||||||
} else if (*s == '*') {
|
}
|
||||||
|
|
||||||
|
switch (*s) {
|
||||||
|
case '*':
|
||||||
s++;
|
s++;
|
||||||
PARSENUM(t->val, s);
|
PARSENUM(t->val, s);
|
||||||
if (*s) return; /* Illegal token if followed by non-numeric char */
|
if (*s) {
|
||||||
|
/* Illegal token if followed by non-numeric char */
|
||||||
|
token_error(t, E_BAD_NUMBER);
|
||||||
|
return;
|
||||||
|
}
|
||||||
t->type = T_Rep;
|
t->type = T_Rep;
|
||||||
return;
|
return;
|
||||||
} else if (*s == '+') {
|
|
||||||
|
case '+':
|
||||||
s++;
|
s++;
|
||||||
if (*s == '+') { mult = -1; s++; }
|
if (*s == '+') { mult = -1; s++; }
|
||||||
PARSENUM(t->val, s);
|
PARSENUM(t->val, s);
|
||||||
if (*s) return; /* Illegal token if followed by non-numeric char */
|
if (*s) {
|
||||||
|
/* Illegal token if followed by non-numeric char */
|
||||||
|
token_error(t, E_BAD_NUMBER);
|
||||||
|
return;
|
||||||
|
}
|
||||||
t->type = T_Delta;
|
t->type = T_Delta;
|
||||||
t->val *= mult;
|
t->val *= mult;
|
||||||
return;
|
return;
|
||||||
} else if (*s == '-') {
|
case '-':
|
||||||
s++;
|
s++;
|
||||||
if (*s == '-') { mult = -1; s++; }
|
if (*s == '-') { mult = -1; s++; }
|
||||||
PARSENUM(t->val, s);
|
PARSENUM(t->val, s);
|
||||||
if (*s) return; /* Illegal token if followed by non-numeric char */
|
if (*s) {
|
||||||
|
/* Illegal token if followed by non-numeric char */
|
||||||
|
token_error(t, E_BAD_NUMBER);
|
||||||
|
return;
|
||||||
|
}
|
||||||
t->type = T_Back;
|
t->type = T_Back;
|
||||||
t->val *= mult;
|
t->val *= mult;
|
||||||
return;
|
return;
|
||||||
} else if (*s == '~') {
|
|
||||||
|
case '~':
|
||||||
s++;
|
s++;
|
||||||
if (*s == '~') { mult = -1; s++; }
|
if (*s == '~') { mult = -1; s++; }
|
||||||
PARSENUM(t->val, s);
|
PARSENUM(t->val, s);
|
||||||
if (*s) return; /* Illegal token if followed by non-numeric char */
|
if (*s) {
|
||||||
|
/* Illegal token if followed by non-numeric char */
|
||||||
|
token_error(t, E_BAD_NUMBER);
|
||||||
|
return;
|
||||||
|
}
|
||||||
t->type = T_BackAdj;
|
t->type = T_BackAdj;
|
||||||
t->val *= mult;
|
t->val *= mult;
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
default: return;
|
||||||
}
|
}
|
||||||
return; /* Unknown token type */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -368,3 +437,43 @@ static int TokStrCmp(Token const *t, char const *s)
|
|||||||
if (!*s || (*s == ',' && !*(s+1))) return 0;
|
if (!*s || (*s == ',' && !*(s+1))) return 0;
|
||||||
return (*tk - tolower(*s));
|
return (*tk - tolower(*s));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_token(Token *tok)
|
||||||
|
{
|
||||||
|
if (tok->MinLen < (int) strlen(tok->name)) {
|
||||||
|
printf("%.*s\n", tok->MinLen, tok->name);
|
||||||
|
}
|
||||||
|
printf("%s\n", tok->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
print_remind_tokens(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
Token *tok;
|
||||||
|
int num = (int) (sizeof(TokArray) / sizeof(TokArray[0]));
|
||||||
|
printf("# Remind Tokens\n\n");
|
||||||
|
for (i=0; i<num; i++) {
|
||||||
|
tok = &TokArray[i];
|
||||||
|
if (tok->type != T_Month && tok->type != T_WkDay) {
|
||||||
|
print_token(tok);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\n# Month Names\n\n");
|
||||||
|
for (i=0; i<num; i++) {
|
||||||
|
tok = &TokArray[i];
|
||||||
|
if (tok->type == T_Month) {
|
||||||
|
print_token(tok);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\n# Weekdays\n\n");
|
||||||
|
for (i=0; i<num; i++) {
|
||||||
|
tok = &TokArray[i];
|
||||||
|
if (tok->type == T_WkDay) {
|
||||||
|
print_token(tok);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -207,6 +207,11 @@ int DoFset(ParsePtr p)
|
|||||||
local_array[i+1].next = NULL;
|
local_array[i+1].next = NULL;
|
||||||
func->nargs++;
|
func->nargs++;
|
||||||
c = ParseNonSpaceChar(p, &r, 0);
|
c = ParseNonSpaceChar(p, &r, 0);
|
||||||
|
if (r) {
|
||||||
|
DBufFree(&buf);
|
||||||
|
DestroyUserFunc(func);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
if (c == ')') break;
|
if (c == ')') break;
|
||||||
else if (c != ',') {
|
else if (c != ',') {
|
||||||
DestroyUserFunc(func);
|
DestroyUserFunc(func);
|
||||||
@@ -217,6 +222,10 @@ int DoFset(ParsePtr p)
|
|||||||
|
|
||||||
/* Allow an optional = sign: FSET f(x) = x*x */
|
/* Allow an optional = sign: FSET f(x) = x*x */
|
||||||
c = ParseNonSpaceChar(p, &r, 1);
|
c = ParseNonSpaceChar(p, &r, 1);
|
||||||
|
if (r) {
|
||||||
|
DestroyUserFunc(func);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
if (c == '=') {
|
if (c == '=') {
|
||||||
(void) ParseNonSpaceChar(p, &r, 0);
|
(void) ParseNonSpaceChar(p, &r, 0);
|
||||||
}
|
}
|
||||||
@@ -241,8 +250,9 @@ int DoFset(ParsePtr p)
|
|||||||
}
|
}
|
||||||
|
|
||||||
c = ParseNonSpaceChar(p, &r, 1);
|
c = ParseNonSpaceChar(p, &r, 1);
|
||||||
if (c != 0) {
|
if (c != 0 || r != 0) {
|
||||||
DestroyUserFunc(func);
|
DestroyUserFunc(func);
|
||||||
|
if (r != 0) return r;
|
||||||
return E_EXPECTING_EOL;
|
return E_EXPECTING_EOL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
21
src/var.c
21
src/var.c
@@ -572,7 +572,7 @@ int GetVarValue(char const *str, Value *val)
|
|||||||
v=FindVar(str, 0);
|
v=FindVar(str, 0);
|
||||||
|
|
||||||
if (!v) {
|
if (!v) {
|
||||||
Eprint("%s: %s", ErrMsg[E_NOSUCH_VAR], str);
|
Eprint("%s: `%s'", ErrMsg[E_NOSUCH_VAR], str);
|
||||||
return E_NOSUCH_VAR;
|
return E_NOSUCH_VAR;
|
||||||
}
|
}
|
||||||
return CopyValue(val, &v->v);
|
return CopyValue(val, &v->v);
|
||||||
@@ -587,7 +587,7 @@ int DoSet (Parser *p)
|
|||||||
{
|
{
|
||||||
Value v;
|
Value v;
|
||||||
int r;
|
int r;
|
||||||
|
int ch;
|
||||||
DynamicBuffer buf;
|
DynamicBuffer buf;
|
||||||
DynamicBuffer buf2;
|
DynamicBuffer buf2;
|
||||||
DBufInit(&buf);
|
DBufInit(&buf);
|
||||||
@@ -597,8 +597,11 @@ int DoSet (Parser *p)
|
|||||||
if (r) return r;
|
if (r) return r;
|
||||||
|
|
||||||
/* Allow optional equals-sign: SET var = value */
|
/* Allow optional equals-sign: SET var = value */
|
||||||
if (ParseNonSpaceChar(p, &r, 1) == '=') {
|
ch = ParseNonSpaceChar(p, &r, 1);
|
||||||
|
if (r) return r;
|
||||||
|
if (ch == '=') {
|
||||||
ParseNonSpaceChar(p, &r, 0);
|
ParseNonSpaceChar(p, &r, 0);
|
||||||
|
if (r) return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p->isnested) {
|
if (p->isnested) {
|
||||||
@@ -931,6 +934,7 @@ static SysVar SysVarArr[] = {
|
|||||||
{"SortByTime", 0, INT_TYPE, &SortByTime, 0, 0 },
|
{"SortByTime", 0, INT_TYPE, &SortByTime, 0, 0 },
|
||||||
{"SubsIndent", 1, INT_TYPE, &SubsIndent, 0, 132 },
|
{"SubsIndent", 1, INT_TYPE, &SubsIndent, 0, 132 },
|
||||||
{"Sunday", 1, STR_TYPE, &DynamicDayName[6], 0, 0 },
|
{"Sunday", 1, STR_TYPE, &DynamicDayName[6], 0, 0 },
|
||||||
|
{"SuppressImplicitWarnings", 1, INT_TYPE, &SuppressImplicitRemWarnings, 0, 1},
|
||||||
{"SuppressLRM", 1, INT_TYPE, &SuppressLRM, 0, 1 },
|
{"SuppressLRM", 1, INT_TYPE, &SuppressLRM, 0, 1 },
|
||||||
{"SysInclude", 0, STR_TYPE, &SysDir, 0, 0 },
|
{"SysInclude", 0, STR_TYPE, &SysDir, 0, 0 },
|
||||||
{"T", 0, SPECIAL_TYPE, trig_date_func, 0, 0 },
|
{"T", 0, SPECIAL_TYPE, trig_date_func, 0, 0 },
|
||||||
@@ -1116,7 +1120,7 @@ static void DumpSysVar(char const *name, const SysVar *v)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (name) strcat(buffer, name); else strcat(buffer, v->name);
|
if (name) strcat(buffer, name); else strcat(buffer, v->name);
|
||||||
fprintf(ErrFp, "%16s ", buffer);
|
fprintf(ErrFp, "%25s ", buffer);
|
||||||
if (v) {
|
if (v) {
|
||||||
if (v->type == CONST_INT_TYPE) {
|
if (v->type == CONST_INT_TYPE) {
|
||||||
fprintf(ErrFp, "%d\n", v->constval);
|
fprintf(ErrFp, "%d\n", v->constval);
|
||||||
@@ -1195,3 +1199,12 @@ set_components_from_lat_and_long(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
print_sysvar_tokens(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
printf("\n# System Variables\n\n");
|
||||||
|
for (i=0; i< (int) NUMSYSVARS; i++) {
|
||||||
|
printf("$%s\n", SysVarArr[i].name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -584,7 +584,7 @@ tail +2 ../tests/once.timestamp >> ../tests/test.out 2>&1
|
|||||||
rm -f ../tests/once.timestamp
|
rm -f ../tests/once.timestamp
|
||||||
|
|
||||||
# Newlines in calendar output
|
# Newlines in calendar output
|
||||||
(echo 'REM 16 MSG foo%_bar%_baz wookie quux apple %_ %_ %_ blech'; echo "REM 16 MSG ANOTHER") | ../src/remind -c -w80 - 1 sep 2024 >> ../tests/test.out 2>&1
|
(echo 'REM 16 MSG foo%_bar%_baz wookie quux apple %_ %_ %_ blech'; echo "REM 16 MSG ANOTHER") | ../src/remind -c -w80 - 1 sep 1990 >> ../tests/test.out 2>&1
|
||||||
|
|
||||||
# Remove references to SysInclude, which is build-specific
|
# 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
|
grep -F -v '$SysInclude' < ../tests/test.out > ../tests/test.out.1 && mv -f ../tests/test.out.1 ../tests/test.out
|
||||||
@@ -597,6 +597,9 @@ if test $? = 0 ; then
|
|||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Test --print-tokens long option
|
||||||
|
../src/remind --print-tokens < /dev/null >> ../tests/test.out 2>&1
|
||||||
|
|
||||||
cmp -s ../tests/test.out ../tests/test.cmp
|
cmp -s ../tests/test.out ../tests/test.cmp
|
||||||
if [ "$?" = "0" ]; then
|
if [ "$?" = "0" ]; then
|
||||||
echo "Remind: Acceptance test PASSED"
|
echo "Remind: Acceptance test PASSED"
|
||||||
|
|||||||
1235
tests/test.cmp
1235
tests/test.cmp
File diff suppressed because it is too large
Load Diff
@@ -450,7 +450,7 @@ set a125 trigduration()
|
|||||||
|
|
||||||
# Test adding TIME+TIME and DATETIME+TIME
|
# Test adding TIME+TIME and DATETIME+TIME
|
||||||
set a126 11:00 + 3:00
|
set a126 11:00 + 3:00
|
||||||
set a127 23:00 + 5:30
|
set a127 '23:00' + 5:30
|
||||||
set a128 '2018-02-03@10:00' + 6:45
|
set a128 '2018-02-03@10:00' + 6:45
|
||||||
set a129 23:30 + '2019-02-02@16:44'
|
set a129 23:30 + '2019-02-02@16:44'
|
||||||
|
|
||||||
@@ -931,6 +931,7 @@ REM MSG %{bad}
|
|||||||
FSET subst_ampm(a, b, c, d, e, f, g) "wookie"
|
FSET subst_ampm(a, b, c, d, e, f, g) "wookie"
|
||||||
|
|
||||||
REM AT 11:00 MSG %2
|
REM AT 11:00 MSG %2
|
||||||
|
FUNSET subst_ampm
|
||||||
|
|
||||||
# Test FUNSET
|
# Test FUNSET
|
||||||
FSET square(x) x*x
|
FSET square(x) x*x
|
||||||
@@ -1119,6 +1120,17 @@ set zxk dooby()
|
|||||||
set zxk dooby(1, 2)
|
set zxk dooby(1, 2)
|
||||||
set zxk dooby(1)
|
set zxk dooby(1)
|
||||||
|
|
||||||
|
REM 1 Jan 1873 MSG This should fail
|
||||||
|
REM 1873-12-11 MSG Also bad.
|
||||||
|
|
||||||
|
# Test $SuppressImplicitWarnings
|
||||||
|
REM wookie
|
||||||
|
Barf
|
||||||
|
|
||||||
|
set $SuppressImplicitWarnings 1
|
||||||
|
REM wookie
|
||||||
|
Barf
|
||||||
|
|
||||||
# Don't want Remind to queue reminders
|
# Don't want Remind to queue reminders
|
||||||
EXIT
|
EXIT
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user