mirror of
https://salsa.debian.org/dskoll/remind.git
synced 2026-05-02 05:47:18 +02:00
Compare commits
33 Commits
05.00.03
...
5b7d4a07ec
| Author | SHA1 | Date | |
|---|---|---|---|
| 5b7d4a07ec | |||
| 8c3d2c4003 | |||
| f485d607ff | |||
| a0effa5f0b | |||
| 7d501cda6f | |||
| 5d7f55c8d5 | |||
| 097bf92bea | |||
| b9dea59206 | |||
| 46aa144b65 | |||
| 914971308d | |||
| a22e81040f | |||
| 72f74f03cf | |||
| d0e45e727e | |||
| ce2b2e80da | |||
| 11771b7d3d | |||
| 01cb028532 | |||
| 58b6f43b9c | |||
| 1dedb667e8 | |||
| 8a96236788 | |||
| 2a13163659 | |||
| 336a9684d4 | |||
| 86945c6e18 | |||
| 684280db5e | |||
| d801408933 | |||
| 79b3da3820 | |||
| ed021d3f46 | |||
| 27d0fda280 | |||
| ef12da4ec6 | |||
| 7b098e95ad | |||
| 7d13f4b09e | |||
| cecdfe6ade | |||
| 216bbd6378 | |||
| 30e2e9c633 |
@@ -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.03.
|
# Generated by GNU Autoconf 2.71 for remind 05.00.05.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# 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.03'
|
PACKAGE_VERSION='05.00.05'
|
||||||
PACKAGE_STRING='remind 05.00.03'
|
PACKAGE_STRING='remind 05.00.05'
|
||||||
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.03 to adapt to many kinds of systems.
|
\`configure' configures remind 05.00.05 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.03:";;
|
short | recursive ) echo "Configuration of remind 05.00.05:";;
|
||||||
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.03
|
remind configure 05.00.05
|
||||||
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.03, which was
|
It was created by remind $as_me 05.00.05, 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.03, which was
|
This file was extended by remind $as_me 05.00.05, 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.03
|
remind config.status 05.00.05
|
||||||
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
-1
@@ -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.03, , , https://dianne.skoll.ca/projects/remind/)
|
AC_INIT(remind, 05.00.05, , , https://dianne.skoll.ca/projects/remind/)
|
||||||
AC_CONFIG_SRCDIR([src/queue.c])
|
AC_CONFIG_SRCDIR([src/queue.c])
|
||||||
|
|
||||||
cat <<'EOF'
|
cat <<'EOF'
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
The upstream GitHub project for ical2rem is:
|
||||||
|
|
||||||
|
https://github.com/jbalcorn/ical2rem
|
||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
|
|
||||||
@@ -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 :
|
||||||
@@ -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
|
||||||
@@ -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 :
|
||||||
@@ -111,11 +111,11 @@
|
|||||||
(sort
|
(sort
|
||||||
(list "ADDOMIT" "AFTER" "AT" "BANNER" "BEFORE"
|
(list "ADDOMIT" "AFTER" "AT" "BANNER" "BEFORE"
|
||||||
"CAL" "CLEAR-OMIT-CONTEXT" "DEBUG" "DO" "DUMPVARS"
|
"CAL" "CLEAR-OMIT-CONTEXT" "DEBUG" "DO" "DUMPVARS"
|
||||||
"DURATION" "ELSE" "ENDIF" "ERRMSG" "EXIT" "FIRST"
|
"DURATION" "ELSE" "ENDIF" "ERRMSG" "EXIT" "EXPR" "FIRST"
|
||||||
"FLUSH" "FOURTH" "FROM" "FSET" "IF" "IFTRIG" "IN"
|
"FLUSH" "FOURTH" "FROM" "FSET" "FUNSET" "IF" "IFTRIG" "IN"
|
||||||
"INCLUDE" "INCLUDECMD" "LAST" "LASTDAY"
|
"INCLUDE" "INCLUDECMD" "LAST" "LASTDAY"
|
||||||
"LASTWORKDAY" "MAYBE-UNCOMPUTABLE" "MSF"
|
"LASTWORKDAY" "MAYBE-UNCOMPUTABLE" "MSF"
|
||||||
"MSG" "OMIT" "OMITFUNC" "ONCE"
|
"MSG" "NOQUEUE" "OMIT" "OMITFUNC" "ONCE"
|
||||||
"POP-OMIT-CONTEXT" "PRESERVE" "PRIORITY" "PS" "PSFILE"
|
"POP-OMIT-CONTEXT" "PRESERVE" "PRIORITY" "PS" "PSFILE"
|
||||||
"PUSH-OMIT-CONTEXT" "REM" "RUN" "SATISFY" "SCANFROM"
|
"PUSH-OMIT-CONTEXT" "REM" "RUN" "SATISFY" "SCANFROM"
|
||||||
"SCHED" "SECOND" "SET" "SKIP" "SPECIAL"
|
"SCHED" "SECOND" "SET" "SKIP" "SPECIAL"
|
||||||
@@ -131,50 +131,58 @@
|
|||||||
|
|
||||||
(defconst remind-builtin-variables
|
(defconst remind-builtin-variables
|
||||||
(sort
|
(sort
|
||||||
(list "$Ago" "$Am" "$And" "$April" "$At" "$August" "$CalcUTC" "$CalMode" "$Daemon" "$DateSep"
|
(list
|
||||||
"$DateTimeSep" "$December" "$DefaultColor" "$DefaultPrio"
|
"$AddBlankLines" "$Ago" "$Am" "$And" "$April" "$At" "$August"
|
||||||
"$DefaultTDelta" "$DeltaOffset" "$DontFork" "$DontQueue"
|
"$CalMode" "$CalcUTC" "$Daemon" "$DateSep" "$DateTimeSep" "$December"
|
||||||
"$DontTrigAts" "$EndSent" "$EndSentIg" "$February" "$FirstIndent"
|
"$DefaultColor" "$DefaultPrio" "$DefaultTDelta" "$DeltaOverride"
|
||||||
"$FoldYear" "$FormWidth" "$Friday" "$Fromnow" "$Hour" "$Hplu" "$HushMode" "$IgnoreOnce"
|
"$DontFork" "$DontQueue" "$DontTrigAts" "$EndSent" "$EndSentIg"
|
||||||
"$InfDelta" "$IntMax" "$IntMin" "$Is" "$January" "$July" "$June" "$LatDeg"
|
"$ExpressionTimeLimit" "$February" "$FirstIndent" "$FoldYear"
|
||||||
"$Latitude" "$LatMin" "$LatSec" "$Location" "$LongDeg" "$Longitude"
|
"$FormWidth" "$Friday" "$Fromnow" "$Hour" "$Hplu" "$HushMode"
|
||||||
"$LongMin" "$LongSec" "$March" "$MaxSatIter" "$MaxStringLen" "$May"
|
"$IgnoreOnce" "$InfDelta" "$IntMax" "$IntMin" "$Is" "$January" "$July"
|
||||||
"$MinsFromUTC" "$Minute" "$Monday" "$Mplu" "$NextMode" "$November" "$Now" "$NumQueued"
|
"$June" "$LatDeg" "$LatMin" "$LatSec" "$Latitude" "$Location"
|
||||||
"$NumTrig" "$October" "$On" "$Pm" "$PrefixLineNo" "$PSCal" "$RunOff" "$Saturday"
|
"$LongDeg" "$LongMin" "$LongSec" "$Longitude" "$March" "$MaxFullOmits"
|
||||||
"$September" "$SimpleCal" "$SortByDate" "$SortByPrio" "$SortByTime"
|
"$MaxLateMinutes" "$MaxPartialOmits" "$MaxSatIter" "$MaxStringLen"
|
||||||
"$SubsIndent" "$Sunday" "$SysInclude" "$T" "$Td" "$Thursday" "$TimeSep" "$Tm"
|
"$May" "$MinsFromUTC" "$Minute" "$Monday" "$Mplu" "$NextMode"
|
||||||
"$Today" "$Tomorrow" "$Tuesday" "$Tw" "$Ty" "$U" "$Ud" "$Um" "$UntimedFirst" "$Uw" "$Uy"
|
"$November" "$Now" "$NumFullOmits" "$NumPartialOmits" "$NumQueued"
|
||||||
"$Was" "$Wednesday")
|
"$NumTrig" "$October" "$On" "$OnceFile" "$PSCal" "$ParseUntriggered"
|
||||||
|
"$Pm" "$PrefixLineNo" "$RunOff" "$Saturday" "$September" "$SimpleCal"
|
||||||
|
"$SortByDate" "$SortByPrio" "$SortByTime" "$SubsIndent" "$Sunday"
|
||||||
|
"$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
|
||||||
|
"Jan" "January" "Feb" "Mar" "Apr" "Jun" "Jul" "Aug" "Sept" "Sep" "Oct" "Nov" "Dec"
|
||||||
"February" "March" "April" "May" "June" "July" "August" "September" "October"
|
"February" "March" "April" "May" "June" "July" "August" "September" "October"
|
||||||
"November" "December" "Mon" "Monday" "Tue" "Tues" "Tuesday" "Wed" "Wednesday"
|
"November" "December" "Mon" "Monday" "Tue" "Tues" "Tuesday" "Wed" "Wednesday"
|
||||||
"Thu" "Thursday" "Thurs" "Fri" "Friday" "Saturday" "Sat" "Sun" "Sunday")
|
"Thu" "Thursday" "Thurs" "Fri" "Friday" "Saturday" "Sat" "Sun" "Sunday")
|
||||||
#'(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
|
||||||
|
|||||||
@@ -1,5 +1,46 @@
|
|||||||
CHANGES TO REMIND
|
CHANGES TO REMIND
|
||||||
|
|
||||||
|
* 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
|
||||||
|
|
||||||
|
* IMPROVEMENT: remind: When checking if a SATISFY expression refers to the
|
||||||
|
trigger date, look recursively at any user-defined functions it calls.
|
||||||
|
This reduces spurious warnings.
|
||||||
|
|
||||||
|
* CHANGE: remind: Allow any type to be used as the test argument for IIF.
|
||||||
|
|
||||||
|
* IMPROVEMENT: remind man page: Clarify how various types are treated
|
||||||
|
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
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
|
|||||||
+22
-23
@@ -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
|
||||||
|
|||||||
+13
-16
@@ -2215,11 +2215,11 @@ and time separator characters for \fBDATE\fR and \fBTIME\fR constants apply
|
|||||||
also to \fBDATETIME\fR constants.
|
also to \fBDATETIME\fR constants.
|
||||||
.RE
|
.RE
|
||||||
.PP
|
.PP
|
||||||
.B ZERO VALUES
|
.B ZERO VALUES AND TRUE/FALSE
|
||||||
.PP
|
.PP
|
||||||
All types have an associated \fIzero value\fR, which is
|
All types have an associated \fIzero value\fR, which is treated as
|
||||||
treated as \fIfalse\fR by the IF command and the logical operators. The
|
\fIfalse\fR by the IF command, the IIF function, and the logical
|
||||||
zero values are:
|
operators. The zero values are:
|
||||||
.PP
|
.PP
|
||||||
.RS
|
.RS
|
||||||
.PP
|
.PP
|
||||||
@@ -3317,14 +3317,14 @@ out. The stripping algorithm is fairly naive; the function starts
|
|||||||
stripping characters when it encounters a "<" and it stops stripping
|
stripping characters when it encounters a "<" and it stops stripping
|
||||||
when it encounters a ">".
|
when it encounters a ">".
|
||||||
.TP
|
.TP
|
||||||
.B iif(si_test1, x_arg1, [si_test2, x_arg2,...], x_default)
|
.B iif(x_test1, x_arg1, [x_test2, x_arg2,...], x_default)
|
||||||
If \fItest1\fR is not zero or the null string, returns \fIarg1\fR.
|
If \fItest1\fR is true, returns \fIarg1\fR. Otherwise, if \fItest2\fR
|
||||||
Otherwise, if \fItest2\fR is not zero or the null string, returns
|
is true, returns \fIarg2\fR, and so on. If all of the \fItest\fR
|
||||||
\fIarg2\fR, and so on. If all of the \fItest\fR arguments are false,
|
arguments are false, returns \fIdefault\fR. Note that all arguments
|
||||||
returns \fIdefault\fR. Note that all arguments are \fIalways\fR evaluated.
|
are \fIalways\fR evaluated. This function accepts an odd number of
|
||||||
This function accepts an odd number of arguments - note that prior to version
|
arguments - note that prior to version 03.00.05 of \fBRemind\fR, it
|
||||||
03.00.05 of \fBRemind\fR, it accepted 3 arguments only. The 3-argument
|
accepted 3 arguments only. The 3-argument version of \fBiif()\fR is
|
||||||
version of \fBiif()\fR is compatible with previous versions of \fBRemind\fR.
|
compatible with previous versions of \fBRemind\fR.
|
||||||
.TP
|
.TP
|
||||||
.B index(s_search, s_target [,i_start)
|
.B index(s_search, s_target [,i_start)
|
||||||
Returns an \fBINT\fR that is the location of \fItarget\fR in the
|
Returns an \fBINT\fR that is the location of \fItarget\fR in the
|
||||||
@@ -4706,10 +4706,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:
|
||||||
|
|||||||
+42
-20
@@ -338,6 +338,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 +353,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 +528,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 +544,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 +900,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);
|
||||||
@@ -1122,13 +1126,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 +1204,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 +1233,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 +1255,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 +1279,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 +1323,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 +1342,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
|
||||||
}
|
}
|
||||||
@@ -2143,7 +2163,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) {
|
||||||
|
|||||||
+38
-13
@@ -81,49 +81,74 @@ check_trigger_function(char const *fname, char const *type)
|
|||||||
Wprint("%s function `%s' defined at %s:%d does not use its argument", type, fname, f->filename, f->lineno);
|
Wprint("%s function `%s' defined at %s:%d does not use its argument", type, fname, f->filename, f->lineno);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static void
|
||||||
ensure_satnode_mentions_trigdate_aux(expr_node *node)
|
ensure_satnode_mentions_trigdate_aux(expr_node *node, int *mentioned)
|
||||||
{
|
{
|
||||||
char const *name;
|
char const *name;
|
||||||
expr_node *other;
|
expr_node *other;
|
||||||
|
UserFunc *f;
|
||||||
|
|
||||||
if (!node) {
|
if (!node) {
|
||||||
return 0;
|
return;
|
||||||
}
|
}
|
||||||
|
if (*mentioned) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (node->type == N_BUILTIN_FUNC) {
|
if (node->type == N_BUILTIN_FUNC) {
|
||||||
name = node->u.builtin_func->name;
|
name = node->u.builtin_func->name;
|
||||||
if (!strcmp(name, "trigdate") ||
|
if (!strcmp(name, "trigdate") ||
|
||||||
!strcmp(name, "trigdatetime")) {
|
!strcmp(name, "trigdatetime")) {
|
||||||
return 1;
|
*mentioned = 1;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
} else if (node->type == N_SHORT_SYSVAR || node->type == N_SYSVAR) {
|
} else if (node->type == N_SHORT_SYSVAR || node->type == N_SYSVAR) {
|
||||||
if (node->type == N_SHORT_SYSVAR) {
|
if (node->type == N_SHORT_SYSVAR) {
|
||||||
name = node->u.name;
|
name = node->u.name;
|
||||||
} else {
|
} else {
|
||||||
name = node->u.value.v.str;
|
name = node->u.value.v.str;
|
||||||
} if (!StrCmpi(name, "T") ||
|
}
|
||||||
|
if (!StrCmpi(name, "T") ||
|
||||||
!StrCmpi(name, "Td") ||
|
!StrCmpi(name, "Td") ||
|
||||||
!StrCmpi(name, "Tm") ||
|
!StrCmpi(name, "Tm") ||
|
||||||
!StrCmpi(name, "Tw") ||
|
!StrCmpi(name, "Tw") ||
|
||||||
!StrCmpi(name, "Ty")) {
|
!StrCmpi(name, "Ty")) {
|
||||||
return 1;
|
*mentioned = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (node->type == N_SHORT_USER_FUNC || node->type == N_USER_FUNC) {
|
||||||
|
if (node->type == N_SHORT_USER_FUNC) {
|
||||||
|
name = node->u.name;
|
||||||
|
} else {
|
||||||
|
name = node->u.value.v.str;
|
||||||
|
}
|
||||||
|
f = FindUserFunc(name);
|
||||||
|
if (f && !f->recurse_flag) {
|
||||||
|
f->recurse_flag = 1;
|
||||||
|
ensure_satnode_mentions_trigdate_aux(f->node, mentioned);
|
||||||
|
f->recurse_flag = 0;
|
||||||
|
if (*mentioned) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ensure_satnode_mentions_trigdate_aux(node->child)) {
|
ensure_satnode_mentions_trigdate_aux(node->child, mentioned);
|
||||||
return 1;
|
if (*mentioned) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
other = node->sibling;
|
other = node->sibling;
|
||||||
while (other) {
|
while (other) {
|
||||||
if (ensure_satnode_mentions_trigdate_aux(other)) {
|
ensure_satnode_mentions_trigdate_aux(other, mentioned);
|
||||||
return 1;
|
if (*mentioned) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
other = other->sibling;
|
other = other->sibling;
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ensure_satnode_mentions_trigdate(expr_node *node)
|
static void ensure_satnode_mentions_trigdate(expr_node *node)
|
||||||
{
|
{
|
||||||
int mentioned;
|
int mentioned = 0;
|
||||||
char const *str;
|
char const *str;
|
||||||
if (node->type == N_CONSTANT || node->type == N_SHORT_STR) {
|
if (node->type == N_CONSTANT || node->type == N_SHORT_STR) {
|
||||||
if (node->type == N_CONSTANT) {
|
if (node->type == N_CONSTANT) {
|
||||||
@@ -146,7 +171,7 @@ static void ensure_satnode_mentions_trigdate(expr_node *node)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mentioned = ensure_satnode_mentions_trigdate_aux(node);
|
ensure_satnode_mentions_trigdate_aux(node, &mentioned);
|
||||||
if (!mentioned) {
|
if (!mentioned) {
|
||||||
Wprint("SATISFY: expression has no reference to trigdate() or $T...");
|
Wprint("SATISFY: expression has no reference to trigdate() or $T...");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -204,7 +204,7 @@ EXTERN char *ErrMsg[]
|
|||||||
/* E_ERR_READING */ "Error reading",
|
/* E_ERR_READING */ "Error reading",
|
||||||
/* E_EXPECTING_EOL */ "Expecting end-of-line",
|
/* E_EXPECTING_EOL */ "Expecting end-of-line",
|
||||||
/* E_BAD_HEBDATE */ "Invalid Hebrew date",
|
/* E_BAD_HEBDATE */ "Invalid Hebrew date",
|
||||||
/* E_IIF_ODD */ "IIF needs odd number of arguments",
|
/* E_IIF_ODD */ "iif(): odd number of arguments required",
|
||||||
/* E_MISS_ENDIF */ "Warning: Missing ENDIF",
|
/* E_MISS_ENDIF */ "Warning: Missing ENDIF",
|
||||||
/* E_EXPECT_COMMA */ "Expecting comma",
|
/* E_EXPECT_COMMA */ "Expecting comma",
|
||||||
/* E_WD_TWICE */ "Weekday specified twice",
|
/* E_WD_TWICE */ "Weekday specified twice",
|
||||||
|
|||||||
+77
-41
@@ -425,8 +425,14 @@ eval_builtin(expr_node *node, Value *locals, Value *ans, int *nonconst)
|
|||||||
Value stack_args[STACK_ARGS_MAX];
|
Value stack_args[STACK_ARGS_MAX];
|
||||||
|
|
||||||
/* Check that we have the right number of argumens */
|
/* Check that we have the right number of argumens */
|
||||||
if (node->num_kids < f->minargs) return E_2FEW_ARGS;
|
if (node->num_kids < f->minargs) {
|
||||||
if (node->num_kids > f->maxargs && f->maxargs != NO_MAX) return E_2MANY_ARGS;
|
Eprint("%s(): %s", f->name, ErrMsg[E_2FEW_ARGS]);
|
||||||
|
return E_2FEW_ARGS;
|
||||||
|
}
|
||||||
|
if (node->num_kids > f->maxargs && f->maxargs != NO_MAX) {
|
||||||
|
Eprint("%s(): %s", f->name, ErrMsg[E_2MANY_ARGS]);
|
||||||
|
return E_2MANY_ARGS;
|
||||||
|
}
|
||||||
|
|
||||||
/* If this is a new-style function that knows about expr_nodes,
|
/* If this is a new-style function that knows about expr_nodes,
|
||||||
let it evaluate itself */
|
let it evaluate itself */
|
||||||
@@ -622,10 +628,12 @@ eval_userfunc(expr_node *node, Value *locals, Value *ans, int *nonconst)
|
|||||||
/* Make sure we have the right number of arguments */
|
/* Make sure we have the right number of arguments */
|
||||||
if (node->num_kids < f->nargs) {
|
if (node->num_kids < f->nargs) {
|
||||||
DBG(fprintf(ErrFp, "%s(...) => %s\n", fname, ErrMsg[E_2FEW_ARGS]));
|
DBG(fprintf(ErrFp, "%s(...) => %s\n", fname, ErrMsg[E_2FEW_ARGS]));
|
||||||
|
Eprint("%s(): %s", f->name, ErrMsg[E_2FEW_ARGS]);
|
||||||
return E_2FEW_ARGS;
|
return E_2FEW_ARGS;
|
||||||
}
|
}
|
||||||
if (node->num_kids > f->nargs) {
|
if (node->num_kids > f->nargs) {
|
||||||
DBG(fprintf(ErrFp, "%s(...) => %s\n", fname, ErrMsg[E_2MANY_ARGS]));
|
DBG(fprintf(ErrFp, "%s(...) => %s\n", fname, ErrMsg[E_2MANY_ARGS]));
|
||||||
|
Eprint("%s(): %s", f->name, ErrMsg[E_2MANY_ARGS]);
|
||||||
return E_2MANY_ARGS;
|
return E_2MANY_ARGS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1394,21 +1402,11 @@ static int logical_not(expr_node *node, Value *locals, Value *ans, int *nonconst
|
|||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
Value v1;
|
Value v1;
|
||||||
int truthy;
|
|
||||||
|
|
||||||
r = evaluate_expr_node(node->child, locals, &v1, nonconst);
|
r = evaluate_expr_node(node->child, locals, &v1, nonconst);
|
||||||
if (r != OK) return r;
|
if (r != OK) return r;
|
||||||
if (v1.type == STR_TYPE) {
|
|
||||||
if (*(v1.v.str)) {
|
|
||||||
truthy = 1;
|
|
||||||
} else {
|
|
||||||
truthy = 0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
truthy = v1.v.val;
|
|
||||||
}
|
|
||||||
ans->type = INT_TYPE;
|
ans->type = INT_TYPE;
|
||||||
ans->v.val = !(truthy);
|
ans->v.val = !truthy(&v1);
|
||||||
DBG(debug_evaluation_unop(ans, OK, &v1, "!"));
|
DBG(debug_evaluation_unop(ans, OK, &v1, "!"));
|
||||||
DestroyValue(v1);
|
DestroyValue(v1);
|
||||||
return OK;
|
return OK;
|
||||||
@@ -1452,34 +1450,22 @@ static int logical_binop(expr_node *node, Value *locals, Value *ans, int *noncon
|
|||||||
Value v;
|
Value v;
|
||||||
char const *opname = (is_and) ? "&&" : "||";
|
char const *opname = (is_and) ? "&&" : "||";
|
||||||
|
|
||||||
int truthy;
|
|
||||||
|
|
||||||
/* Evaluate first arg */
|
/* Evaluate first arg */
|
||||||
int r = evaluate_expr_node(node->child, locals, &v, nonconst);
|
int r = evaluate_expr_node(node->child, locals, &v, nonconst);
|
||||||
|
|
||||||
/* Bail on error */
|
/* Bail on error */
|
||||||
if (r != OK) return r;
|
if (r != OK) return r;
|
||||||
|
|
||||||
if (v.type == STR_TYPE) {
|
|
||||||
if (*(v.v.str)) {
|
|
||||||
truthy = 1;
|
|
||||||
} else {
|
|
||||||
truthy = 0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
truthy = v.v.val;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_and) {
|
if (is_and) {
|
||||||
/* If first arg is false, return it */
|
/* If first arg is false, return it */
|
||||||
if (!truthy) {
|
if (!truthy(&v)) {
|
||||||
*ans = v;
|
*ans = v;
|
||||||
DBG(debug_evaluation_binop(ans, OK, &v, NULL, opname));
|
DBG(debug_evaluation_binop(ans, OK, &v, NULL, opname));
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* If first arg is true, return it */
|
/* If first arg is true, return it */
|
||||||
if (truthy) {
|
if (truthy(&v)) {
|
||||||
*ans = v;
|
*ans = v;
|
||||||
DBG(debug_evaluation_binop(ans, OK, &v, NULL, opname));
|
DBG(debug_evaluation_binop(ans, OK, &v, NULL, opname));
|
||||||
return OK;
|
return OK;
|
||||||
@@ -1569,9 +1555,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'", ErrMsg[E_PARSE_ERR], c);
|
||||||
|
return E_PARSE_ERR;
|
||||||
|
}
|
||||||
|
return OK;
|
||||||
case '!':
|
case '!':
|
||||||
case '>':
|
case '>':
|
||||||
case '<':
|
case '<':
|
||||||
@@ -1792,6 +1780,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);
|
||||||
@@ -1864,6 +1853,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);
|
||||||
@@ -1872,8 +1862,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) {
|
||||||
@@ -1923,8 +1919,14 @@ 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=ParseLiteralDate(&s, &dse, &tim)) != 0) {
|
||||||
if (*s != '\'') return E_BAD_DATE;
|
Eprint("%s: %s", ErrMsg[r], DBufValue(&ExprBuf));
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
if (*s != '\'') {
|
||||||
|
Eprint("%s: %s", ErrMsg[E_BAD_DATE], DBufValue(&ExprBuf));
|
||||||
|
return E_BAD_DATE;
|
||||||
|
}
|
||||||
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;
|
||||||
@@ -1948,7 +1950,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)) {
|
||||||
@@ -1964,9 +1969,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;
|
||||||
@@ -1982,7 +1993,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;
|
||||||
@@ -2030,7 +2044,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) {
|
||||||
@@ -2516,15 +2530,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;
|
||||||
@@ -3068,3 +3090,17 @@ void print_expr_nodes_stats(void)
|
|||||||
fprintf(stderr, " Expression nodes leaked: %d\n", ExprNodesUsed);
|
fprintf(stderr, " Expression nodes leaked: %d\n", ExprNodesUsed);
|
||||||
fprintf(stderr, " Parse level high-water: %d\n", parse_level_high_water);
|
fprintf(stderr, " Parse level high-water: %d\n", parse_level_high_water);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return 1 if a value is "true" for its type, 0 if "false" */
|
||||||
|
int truthy(Value const *v)
|
||||||
|
{
|
||||||
|
if (v->type == STR_TYPE) {
|
||||||
|
if (v->v.str && *(v->v.str)) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (v->v.val != 0);
|
||||||
|
}
|
||||||
|
|||||||
+2
-20
@@ -1284,6 +1284,7 @@ static int FChoose(expr_node *node, Value *locals, Value *ans, int *nonconst)
|
|||||||
PUT(ErrMsg[E_BAD_TYPE]);
|
PUT(ErrMsg[E_BAD_TYPE]);
|
||||||
OUT();
|
OUT();
|
||||||
}
|
}
|
||||||
|
Eprint("choose(): %s", ErrMsg[E_BAD_TYPE]);
|
||||||
return E_BAD_TYPE;
|
return E_BAD_TYPE;
|
||||||
}
|
}
|
||||||
n = v.v.val;
|
n = v.v.val;
|
||||||
@@ -1974,7 +1975,6 @@ static int FIndex(func_info *info)
|
|||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
static int FIif(expr_node *node, Value *locals, Value *ans, int *nonconst)
|
static int FIif(expr_node *node, Value *locals, Value *ans, int *nonconst)
|
||||||
{
|
{
|
||||||
int istrue;
|
|
||||||
int r;
|
int r;
|
||||||
int done;
|
int done;
|
||||||
Value v;
|
Value v;
|
||||||
@@ -2014,26 +2014,8 @@ static int FIif(expr_node *node, Value *locals, Value *ans, int *nonconst)
|
|||||||
done = 1;
|
done = 1;
|
||||||
PUT(PrintValue(&v, NULL));
|
PUT(PrintValue(&v, NULL));
|
||||||
}
|
}
|
||||||
if (v.type != STR_TYPE && v.type != INT_TYPE) {
|
|
||||||
if (DebugFlag & DB_PRTEXPR) {
|
|
||||||
cur = cur->sibling;
|
|
||||||
while(cur) {
|
|
||||||
PUT(", ?");
|
|
||||||
cur = cur->sibling;
|
|
||||||
}
|
|
||||||
PUT(") => ");
|
|
||||||
PUT(ErrMsg[E_BAD_TYPE]);
|
|
||||||
OUT();
|
|
||||||
}
|
|
||||||
return E_BAD_TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (v.type == INT_TYPE) {
|
if (truthy(&v)) {
|
||||||
istrue = v.v.val;
|
|
||||||
} else {
|
|
||||||
istrue = *(v.v.str);
|
|
||||||
}
|
|
||||||
if (istrue) {
|
|
||||||
r = evaluate_expr_node(cur->sibling, locals, ans, nonconst);
|
r = evaluate_expr_node(cur->sibling, locals, ans, nonconst);
|
||||||
if (r == OK && (DebugFlag & DB_PRTEXPR)) {
|
if (r == OK && (DebugFlag & DB_PRTEXPR)) {
|
||||||
PUT(", ");
|
PUT(", ");
|
||||||
|
|||||||
@@ -1119,6 +1119,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 +1144,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 */
|
||||||
|
|||||||
@@ -61,6 +61,8 @@ expr_node *parse_expression(char const **e, int *r, Var *locals);
|
|||||||
|
|
||||||
int evaluate_expression(expr_node *node, Value *locals, Value *ans, int *nonconst);
|
int evaluate_expression(expr_node *node, Value *locals, Value *ans, int *nonconst);
|
||||||
int evaluate_expr_node(expr_node *node, Value *locals, Value *ans, int *nonconst);
|
int evaluate_expr_node(expr_node *node, Value *locals, Value *ans, int *nonconst);
|
||||||
|
int truthy(Value const *v);
|
||||||
|
|
||||||
void print_expr_tree(expr_node *node, FILE *fp);
|
void print_expr_tree(expr_node *node, FILE *fp);
|
||||||
void unlimit_execution_time(void);
|
void unlimit_execution_time(void);
|
||||||
expr_node *free_expr_tree(expr_node *node);
|
expr_node *free_expr_tree(expr_node *node);
|
||||||
|
|||||||
@@ -317,5 +317,6 @@ typedef struct udf_struct {
|
|||||||
int nargs;
|
int nargs;
|
||||||
char const *filename;
|
char const *filename;
|
||||||
int lineno;
|
int lineno;
|
||||||
|
int recurse_flag;
|
||||||
} UserFunc;
|
} UserFunc;
|
||||||
|
|
||||||
|
|||||||
+12
-1
@@ -160,6 +160,7 @@ int DoFset(ParsePtr p)
|
|||||||
return E_NO_MEM;
|
return E_NO_MEM;
|
||||||
}
|
}
|
||||||
func->lineno = LineNo;
|
func->lineno = LineNo;
|
||||||
|
func->recurse_flag = 0;
|
||||||
StrnCpy(func->name, DBufValue(&buf), VAR_NAME_LEN);
|
StrnCpy(func->name, DBufValue(&buf), VAR_NAME_LEN);
|
||||||
DBufFree(&buf);
|
DBufFree(&buf);
|
||||||
if (!Hush) {
|
if (!Hush) {
|
||||||
@@ -206,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);
|
||||||
@@ -216,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);
|
||||||
}
|
}
|
||||||
@@ -240,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
|
|||||||
+375
-262
@@ -1007,7 +1007,7 @@ a049 => 21
|
|||||||
substr(21, 2) => Type mismatch
|
substr(21, 2) => Type mismatch
|
||||||
../tests/test.rem(326): substr(): Type mismatch
|
../tests/test.rem(326): substr(): Type mismatch
|
||||||
set a051 substr(a050, 2, 6)
|
set a051 substr(a050, 2, 6)
|
||||||
../tests/test.rem(327): Undefined variable: a050
|
../tests/test.rem(327): Undefined variable: `a050'
|
||||||
a050 => Undefined variable
|
a050 => Undefined variable
|
||||||
set a052 time(1+2, 3+4)
|
set a052 time(1+2, 3+4)
|
||||||
1 + 2 => 3
|
1 + 2 => 3
|
||||||
@@ -1029,7 +1029,7 @@ set a057 value("a05"+"6")
|
|||||||
"a05" + "6" => "a056"
|
"a05" + "6" => "a056"
|
||||||
value("a056") => "SDFJHSDF KSJDFH KJSDFH KSJDFH"
|
value("a056") => "SDFJHSDF KSJDFH KJSDFH KSJDFH"
|
||||||
set a058 version()
|
set a058 version()
|
||||||
version() => "05.00.03"
|
version() => "05.00.05"
|
||||||
set a059 wkday(today())
|
set a059 wkday(today())
|
||||||
today() => 1991-02-16
|
today() => 1991-02-16
|
||||||
wkday(1991-02-16) => "Saturday"
|
wkday(1991-02-16) => "Saturday"
|
||||||
@@ -2619,7 +2619,7 @@ a086 4
|
|||||||
a109 2012-01-01
|
a109 2012-01-01
|
||||||
a128 2018-02-03@16:45
|
a128 2018-02-03@16:45
|
||||||
a039 "February"
|
a039 "February"
|
||||||
a058 "05.00.03"
|
a058 "05.00.05"
|
||||||
a077 "1992 92\n"
|
a077 "1992 92\n"
|
||||||
a096 -4
|
a096 -4
|
||||||
a119 -1
|
a119 -1
|
||||||
@@ -3486,7 +3486,7 @@ REM AT 13:00PM MSG foo 13p
|
|||||||
|
|
||||||
DEBUG +x
|
DEBUG +x
|
||||||
SET x 0:00am + 0
|
SET x 0:00am + 0
|
||||||
../tests/test.rem(625): Ill-formed time
|
../tests/test.rem(625): Ill-formed time: `0:00am'
|
||||||
SET x 1:00AM + 0
|
SET x 1:00AM + 0
|
||||||
01:00 + 0 => 01:00
|
01:00 + 0 => 01:00
|
||||||
SET x 2:00am + 0
|
SET x 2:00am + 0
|
||||||
@@ -3512,10 +3512,10 @@ SET x 11:00AM + 0
|
|||||||
SET x 12:00am + 0
|
SET x 12:00am + 0
|
||||||
00:00 + 0 => 00:00
|
00:00 + 0 => 00:00
|
||||||
SET x 13:00AM + 0
|
SET x 13:00AM + 0
|
||||||
../tests/test.rem(638): Ill-formed time
|
../tests/test.rem(638): Ill-formed time: `13:00AM'
|
||||||
|
|
||||||
SET x 0:00pm + 0
|
SET x 0:00pm + 0
|
||||||
../tests/test.rem(640): Ill-formed time
|
../tests/test.rem(640): Ill-formed time: `0:00pm'
|
||||||
SET x 1:00PM + 0
|
SET x 1:00PM + 0
|
||||||
13:00 + 0 => 13:00
|
13:00 + 0 => 13:00
|
||||||
SET x 2:00pm + 0
|
SET x 2:00pm + 0
|
||||||
@@ -3541,10 +3541,10 @@ SET x 11:00PM + 0
|
|||||||
SET x 12:00pm + 0
|
SET x 12:00pm + 0
|
||||||
12:00 + 0 => 12:00
|
12:00 + 0 => 12:00
|
||||||
SET x 13:00PM + 0
|
SET x 13:00PM + 0
|
||||||
../tests/test.rem(653): Ill-formed time
|
../tests/test.rem(653): Ill-formed time: `13:00PM'
|
||||||
|
|
||||||
SET x '2015-02-03@0:00am' + 0
|
SET x '2015-02-03@0:00am' + 0
|
||||||
../tests/test.rem(655): Ill-formed time
|
../tests/test.rem(655): Ill-formed time: '2015-02-03@0:00am'
|
||||||
SET x '2015-02-03@1:00AM' + 0
|
SET x '2015-02-03@1:00AM' + 0
|
||||||
2015-02-03@01:00 + 0 => 2015-02-03@01:00
|
2015-02-03@01:00 + 0 => 2015-02-03@01:00
|
||||||
SET x '2015-02-03@2:00am' + 0
|
SET x '2015-02-03@2:00am' + 0
|
||||||
@@ -3570,10 +3570,10 @@ SET x '2015-02-03@11:00AM' + 0
|
|||||||
SET x '2015-02-03@12:00am' + 0
|
SET x '2015-02-03@12:00am' + 0
|
||||||
2015-02-03@00:00 + 0 => 2015-02-03@00:00
|
2015-02-03@00:00 + 0 => 2015-02-03@00:00
|
||||||
SET x '2015-02-03@13:00AM' + 0
|
SET x '2015-02-03@13:00AM' + 0
|
||||||
../tests/test.rem(668): Ill-formed time
|
../tests/test.rem(668): Ill-formed time: '2015-02-03@13:00AM'
|
||||||
|
|
||||||
SET x '2015-02-03@0:00pm' + 0
|
SET x '2015-02-03@0:00pm' + 0
|
||||||
../tests/test.rem(670): Ill-formed time
|
../tests/test.rem(670): Ill-formed time: '2015-02-03@0:00pm'
|
||||||
SET x '2015-02-03@1:00PM' + 0
|
SET x '2015-02-03@1:00PM' + 0
|
||||||
2015-02-03@13:00 + 0 => 2015-02-03@13:00
|
2015-02-03@13:00 + 0 => 2015-02-03@13:00
|
||||||
SET x '2015-02-03@2:00pm' + 0
|
SET x '2015-02-03@2:00pm' + 0
|
||||||
@@ -3599,7 +3599,7 @@ SET x '2015-02-03@11:00PM' + 0
|
|||||||
SET x '2015-02-03@12:00pm' + 0
|
SET x '2015-02-03@12:00pm' + 0
|
||||||
2015-02-03@12:00 + 0 => 2015-02-03@12:00
|
2015-02-03@12:00 + 0 => 2015-02-03@12:00
|
||||||
SET x '2015-02-03@13:00PM' + 0
|
SET x '2015-02-03@13:00PM' + 0
|
||||||
../tests/test.rem(683): Ill-formed time
|
../tests/test.rem(683): Ill-formed time: '2015-02-03@13:00PM'
|
||||||
|
|
||||||
# Test the ampm function
|
# Test the ampm function
|
||||||
set x ampm(0:12) + ""
|
set x ampm(0:12) + ""
|
||||||
@@ -5212,303 +5212,386 @@ max(5, 16) => 16
|
|||||||
6 * 16 => 96
|
6 * 16 => 96
|
||||||
../tests/test.rem(1032): Trig(satisfied) = Saturday, 16 February, 1991
|
../tests/test.rem(1032): Trig(satisfied) = Saturday, 16 February, 1991
|
||||||
|
|
||||||
|
FSET references_t(x) $T != x
|
||||||
|
REM SATISFY references_t($U)
|
||||||
|
../tests/test.rem(1035): Trig = Saturday, 16 February, 1991
|
||||||
|
$U => 1991-02-16
|
||||||
|
Entering UserFN references_t(1991-02-16)
|
||||||
|
$T => 1991-02-16
|
||||||
|
x => 1991-02-16
|
||||||
|
1991-02-16 != 1991-02-16 => 0
|
||||||
|
Leaving UserFN references_t(1991-02-16) => 0
|
||||||
|
../tests/test.rem(1035): Trig = Sunday, 17 February, 1991
|
||||||
|
$U => 1991-02-16
|
||||||
|
Entering UserFN references_t(1991-02-16)
|
||||||
|
$T => 1991-02-17
|
||||||
|
x => 1991-02-16
|
||||||
|
1991-02-17 != 1991-02-16 => 1
|
||||||
|
Leaving UserFN references_t(1991-02-16) => 1
|
||||||
|
../tests/test.rem(1035): Trig(satisfied) = Sunday, 17 February, 1991
|
||||||
|
|
||||||
|
FSET recursive_t(x) iif(x==0, recursive_t(1), references_t($U))
|
||||||
|
|
||||||
|
REM SATISFY recursive_t(0)
|
||||||
|
../tests/test.rem(1039): Trig = Saturday, 16 February, 1991
|
||||||
|
Entering UserFN recursive_t(0)
|
||||||
|
x => 0
|
||||||
|
0 == 0 => 1
|
||||||
|
Entering UserFN recursive_t(1)
|
||||||
|
x => 1
|
||||||
|
1 == 0 => 0
|
||||||
|
$U => 1991-02-16
|
||||||
|
Entering UserFN references_t(1991-02-16)
|
||||||
|
$T => 1991-02-16
|
||||||
|
x => 1991-02-16
|
||||||
|
1991-02-16 != 1991-02-16 => 0
|
||||||
|
Leaving UserFN references_t(1991-02-16) => 0
|
||||||
|
iif(0, ?, 0) => 0
|
||||||
|
Leaving UserFN recursive_t(1) => 0
|
||||||
|
iif(1, 0, ?) => 0
|
||||||
|
Leaving UserFN recursive_t(0) => 0
|
||||||
|
../tests/test.rem(1039): Trig = Sunday, 17 February, 1991
|
||||||
|
Entering UserFN recursive_t(0)
|
||||||
|
x => 0
|
||||||
|
0 == 0 => 1
|
||||||
|
Entering UserFN recursive_t(1)
|
||||||
|
x => 1
|
||||||
|
1 == 0 => 0
|
||||||
|
$U => 1991-02-16
|
||||||
|
Entering UserFN references_t(1991-02-16)
|
||||||
|
$T => 1991-02-17
|
||||||
|
x => 1991-02-16
|
||||||
|
1991-02-17 != 1991-02-16 => 1
|
||||||
|
Leaving UserFN references_t(1991-02-16) => 1
|
||||||
|
iif(0, ?, 1) => 1
|
||||||
|
Leaving UserFN recursive_t(1) => 1
|
||||||
|
iif(1, 1, ?) => 1
|
||||||
|
Leaving UserFN recursive_t(0) => 1
|
||||||
|
../tests/test.rem(1039): Trig(satisfied) = Sunday, 17 February, 1991
|
||||||
|
REM SATISFY recursive_t(2)
|
||||||
|
../tests/test.rem(1040): Trig = Saturday, 16 February, 1991
|
||||||
|
Entering UserFN recursive_t(2)
|
||||||
|
x => 2
|
||||||
|
2 == 0 => 0
|
||||||
|
$U => 1991-02-16
|
||||||
|
Entering UserFN references_t(1991-02-16)
|
||||||
|
$T => 1991-02-16
|
||||||
|
x => 1991-02-16
|
||||||
|
1991-02-16 != 1991-02-16 => 0
|
||||||
|
Leaving UserFN references_t(1991-02-16) => 0
|
||||||
|
iif(0, ?, 0) => 0
|
||||||
|
Leaving UserFN recursive_t(2) => 0
|
||||||
|
../tests/test.rem(1040): Trig = Sunday, 17 February, 1991
|
||||||
|
Entering UserFN recursive_t(2)
|
||||||
|
x => 2
|
||||||
|
2 == 0 => 0
|
||||||
|
$U => 1991-02-16
|
||||||
|
Entering UserFN references_t(1991-02-16)
|
||||||
|
$T => 1991-02-17
|
||||||
|
x => 1991-02-16
|
||||||
|
1991-02-17 != 1991-02-16 => 1
|
||||||
|
Leaving UserFN references_t(1991-02-16) => 1
|
||||||
|
iif(0, ?, 1) => 1
|
||||||
|
Leaving UserFN recursive_t(2) => 1
|
||||||
|
../tests/test.rem(1040): Trig(satisfied) = Sunday, 17 February, 1991
|
||||||
|
|
||||||
# These should be diagnosed
|
# These should be diagnosed
|
||||||
REM SATISFY 0
|
REM SATISFY 0
|
||||||
../tests/test.rem(1035): SATISFY: constant 0 will never be true
|
../tests/test.rem(1043): SATISFY: constant 0 will never be true
|
||||||
../tests/test.rem(1035): Trig = Saturday, 16 February, 1991
|
../tests/test.rem(1043): Trig = Saturday, 16 February, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 17 February, 1991
|
../tests/test.rem(1043): Trig = Sunday, 17 February, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 18 February, 1991
|
../tests/test.rem(1043): Trig = Monday, 18 February, 1991
|
||||||
../tests/test.rem(1035): Trig = Tuesday, 19 February, 1991
|
../tests/test.rem(1043): Trig = Tuesday, 19 February, 1991
|
||||||
../tests/test.rem(1035): Trig = Wednesday, 20 February, 1991
|
../tests/test.rem(1043): Trig = Wednesday, 20 February, 1991
|
||||||
../tests/test.rem(1035): Trig = Thursday, 21 February, 1991
|
../tests/test.rem(1043): Trig = Thursday, 21 February, 1991
|
||||||
../tests/test.rem(1035): Trig = Friday, 22 February, 1991
|
../tests/test.rem(1043): Trig = Friday, 22 February, 1991
|
||||||
../tests/test.rem(1035): Trig = Saturday, 23 February, 1991
|
../tests/test.rem(1043): Trig = Saturday, 23 February, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 24 February, 1991
|
../tests/test.rem(1043): Trig = Sunday, 24 February, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 25 February, 1991
|
../tests/test.rem(1043): Trig = Monday, 25 February, 1991
|
||||||
../tests/test.rem(1035): Trig = Tuesday, 26 February, 1991
|
../tests/test.rem(1043): Trig = Tuesday, 26 February, 1991
|
||||||
../tests/test.rem(1035): Trig = Wednesday, 27 February, 1991
|
../tests/test.rem(1043): Trig = Wednesday, 27 February, 1991
|
||||||
../tests/test.rem(1035): Trig = Thursday, 28 February, 1991
|
../tests/test.rem(1043): Trig = Thursday, 28 February, 1991
|
||||||
../tests/test.rem(1035): Trig = Friday, 1 March, 1991
|
../tests/test.rem(1043): Trig = Friday, 1 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Saturday, 2 March, 1991
|
../tests/test.rem(1043): Trig = Saturday, 2 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 3 March, 1991
|
../tests/test.rem(1043): Trig = Sunday, 3 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 4 March, 1991
|
../tests/test.rem(1043): Trig = Monday, 4 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Tuesday, 5 March, 1991
|
../tests/test.rem(1043): Trig = Tuesday, 5 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Wednesday, 6 March, 1991
|
../tests/test.rem(1043): Trig = Wednesday, 6 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Thursday, 7 March, 1991
|
../tests/test.rem(1043): Trig = Thursday, 7 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Friday, 8 March, 1991
|
../tests/test.rem(1043): Trig = Friday, 8 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Saturday, 9 March, 1991
|
../tests/test.rem(1043): Trig = Saturday, 9 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 10 March, 1991
|
../tests/test.rem(1043): Trig = Sunday, 10 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 11 March, 1991
|
../tests/test.rem(1043): Trig = Monday, 11 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Tuesday, 12 March, 1991
|
../tests/test.rem(1043): Trig = Tuesday, 12 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Wednesday, 13 March, 1991
|
../tests/test.rem(1043): Trig = Wednesday, 13 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Thursday, 14 March, 1991
|
../tests/test.rem(1043): Trig = Thursday, 14 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Friday, 15 March, 1991
|
../tests/test.rem(1043): Trig = Friday, 15 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Saturday, 16 March, 1991
|
../tests/test.rem(1043): Trig = Saturday, 16 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 17 March, 1991
|
../tests/test.rem(1043): Trig = Sunday, 17 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 18 March, 1991
|
../tests/test.rem(1043): Trig = Monday, 18 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Tuesday, 19 March, 1991
|
../tests/test.rem(1043): Trig = Tuesday, 19 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Wednesday, 20 March, 1991
|
../tests/test.rem(1043): Trig = Wednesday, 20 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Thursday, 21 March, 1991
|
../tests/test.rem(1043): Trig = Thursday, 21 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Friday, 22 March, 1991
|
../tests/test.rem(1043): Trig = Friday, 22 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Saturday, 23 March, 1991
|
../tests/test.rem(1043): Trig = Saturday, 23 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 24 March, 1991
|
../tests/test.rem(1043): Trig = Sunday, 24 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 25 March, 1991
|
../tests/test.rem(1043): Trig = Monday, 25 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Tuesday, 26 March, 1991
|
../tests/test.rem(1043): Trig = Tuesday, 26 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Wednesday, 27 March, 1991
|
../tests/test.rem(1043): Trig = Wednesday, 27 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Thursday, 28 March, 1991
|
../tests/test.rem(1043): Trig = Thursday, 28 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Friday, 29 March, 1991
|
../tests/test.rem(1043): Trig = Friday, 29 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Saturday, 30 March, 1991
|
../tests/test.rem(1043): Trig = Saturday, 30 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 31 March, 1991
|
../tests/test.rem(1043): Trig = Sunday, 31 March, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 1 April, 1991
|
../tests/test.rem(1043): Trig = Monday, 1 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Tuesday, 2 April, 1991
|
../tests/test.rem(1043): Trig = Tuesday, 2 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Wednesday, 3 April, 1991
|
../tests/test.rem(1043): Trig = Wednesday, 3 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Thursday, 4 April, 1991
|
../tests/test.rem(1043): Trig = Thursday, 4 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Friday, 5 April, 1991
|
../tests/test.rem(1043): Trig = Friday, 5 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Saturday, 6 April, 1991
|
../tests/test.rem(1043): Trig = Saturday, 6 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 7 April, 1991
|
../tests/test.rem(1043): Trig = Sunday, 7 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 8 April, 1991
|
../tests/test.rem(1043): Trig = Monday, 8 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Tuesday, 9 April, 1991
|
../tests/test.rem(1043): Trig = Tuesday, 9 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Wednesday, 10 April, 1991
|
../tests/test.rem(1043): Trig = Wednesday, 10 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Thursday, 11 April, 1991
|
../tests/test.rem(1043): Trig = Thursday, 11 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Friday, 12 April, 1991
|
../tests/test.rem(1043): Trig = Friday, 12 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Saturday, 13 April, 1991
|
../tests/test.rem(1043): Trig = Saturday, 13 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 14 April, 1991
|
../tests/test.rem(1043): Trig = Sunday, 14 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 15 April, 1991
|
../tests/test.rem(1043): Trig = Monday, 15 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Tuesday, 16 April, 1991
|
../tests/test.rem(1043): Trig = Tuesday, 16 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Wednesday, 17 April, 1991
|
../tests/test.rem(1043): Trig = Wednesday, 17 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Thursday, 18 April, 1991
|
../tests/test.rem(1043): Trig = Thursday, 18 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Friday, 19 April, 1991
|
../tests/test.rem(1043): Trig = Friday, 19 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Saturday, 20 April, 1991
|
../tests/test.rem(1043): Trig = Saturday, 20 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 21 April, 1991
|
../tests/test.rem(1043): Trig = Sunday, 21 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 22 April, 1991
|
../tests/test.rem(1043): Trig = Monday, 22 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Tuesday, 23 April, 1991
|
../tests/test.rem(1043): Trig = Tuesday, 23 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Wednesday, 24 April, 1991
|
../tests/test.rem(1043): Trig = Wednesday, 24 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Thursday, 25 April, 1991
|
../tests/test.rem(1043): Trig = Thursday, 25 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Friday, 26 April, 1991
|
../tests/test.rem(1043): Trig = Friday, 26 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Saturday, 27 April, 1991
|
../tests/test.rem(1043): Trig = Saturday, 27 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 28 April, 1991
|
../tests/test.rem(1043): Trig = Sunday, 28 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 29 April, 1991
|
../tests/test.rem(1043): Trig = Monday, 29 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Tuesday, 30 April, 1991
|
../tests/test.rem(1043): Trig = Tuesday, 30 April, 1991
|
||||||
../tests/test.rem(1035): Trig = Wednesday, 1 May, 1991
|
../tests/test.rem(1043): Trig = Wednesday, 1 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Thursday, 2 May, 1991
|
../tests/test.rem(1043): Trig = Thursday, 2 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Friday, 3 May, 1991
|
../tests/test.rem(1043): Trig = Friday, 3 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Saturday, 4 May, 1991
|
../tests/test.rem(1043): Trig = Saturday, 4 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 5 May, 1991
|
../tests/test.rem(1043): Trig = Sunday, 5 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 6 May, 1991
|
../tests/test.rem(1043): Trig = Monday, 6 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Tuesday, 7 May, 1991
|
../tests/test.rem(1043): Trig = Tuesday, 7 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Wednesday, 8 May, 1991
|
../tests/test.rem(1043): Trig = Wednesday, 8 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Thursday, 9 May, 1991
|
../tests/test.rem(1043): Trig = Thursday, 9 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Friday, 10 May, 1991
|
../tests/test.rem(1043): Trig = Friday, 10 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Saturday, 11 May, 1991
|
../tests/test.rem(1043): Trig = Saturday, 11 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 12 May, 1991
|
../tests/test.rem(1043): Trig = Sunday, 12 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 13 May, 1991
|
../tests/test.rem(1043): Trig = Monday, 13 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Tuesday, 14 May, 1991
|
../tests/test.rem(1043): Trig = Tuesday, 14 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Wednesday, 15 May, 1991
|
../tests/test.rem(1043): Trig = Wednesday, 15 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Thursday, 16 May, 1991
|
../tests/test.rem(1043): Trig = Thursday, 16 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Friday, 17 May, 1991
|
../tests/test.rem(1043): Trig = Friday, 17 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Saturday, 18 May, 1991
|
../tests/test.rem(1043): Trig = Saturday, 18 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 19 May, 1991
|
../tests/test.rem(1043): Trig = Sunday, 19 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 20 May, 1991
|
../tests/test.rem(1043): Trig = Monday, 20 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Tuesday, 21 May, 1991
|
../tests/test.rem(1043): Trig = Tuesday, 21 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Wednesday, 22 May, 1991
|
../tests/test.rem(1043): Trig = Wednesday, 22 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Thursday, 23 May, 1991
|
../tests/test.rem(1043): Trig = Thursday, 23 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Friday, 24 May, 1991
|
../tests/test.rem(1043): Trig = Friday, 24 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Saturday, 25 May, 1991
|
../tests/test.rem(1043): Trig = Saturday, 25 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 26 May, 1991
|
../tests/test.rem(1043): Trig = Sunday, 26 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 27 May, 1991
|
../tests/test.rem(1043): Trig = Monday, 27 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Tuesday, 28 May, 1991
|
../tests/test.rem(1043): Trig = Tuesday, 28 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Wednesday, 29 May, 1991
|
../tests/test.rem(1043): Trig = Wednesday, 29 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Thursday, 30 May, 1991
|
../tests/test.rem(1043): Trig = Thursday, 30 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Friday, 31 May, 1991
|
../tests/test.rem(1043): Trig = Friday, 31 May, 1991
|
||||||
../tests/test.rem(1035): Trig = Saturday, 1 June, 1991
|
../tests/test.rem(1043): Trig = Saturday, 1 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 2 June, 1991
|
../tests/test.rem(1043): Trig = Sunday, 2 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 3 June, 1991
|
../tests/test.rem(1043): Trig = Monday, 3 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Tuesday, 4 June, 1991
|
../tests/test.rem(1043): Trig = Tuesday, 4 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Wednesday, 5 June, 1991
|
../tests/test.rem(1043): Trig = Wednesday, 5 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Thursday, 6 June, 1991
|
../tests/test.rem(1043): Trig = Thursday, 6 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Friday, 7 June, 1991
|
../tests/test.rem(1043): Trig = Friday, 7 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Saturday, 8 June, 1991
|
../tests/test.rem(1043): Trig = Saturday, 8 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 9 June, 1991
|
../tests/test.rem(1043): Trig = Sunday, 9 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 10 June, 1991
|
../tests/test.rem(1043): Trig = Monday, 10 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Tuesday, 11 June, 1991
|
../tests/test.rem(1043): Trig = Tuesday, 11 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Wednesday, 12 June, 1991
|
../tests/test.rem(1043): Trig = Wednesday, 12 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Thursday, 13 June, 1991
|
../tests/test.rem(1043): Trig = Thursday, 13 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Friday, 14 June, 1991
|
../tests/test.rem(1043): Trig = Friday, 14 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Saturday, 15 June, 1991
|
../tests/test.rem(1043): Trig = Saturday, 15 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 16 June, 1991
|
../tests/test.rem(1043): Trig = Sunday, 16 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 17 June, 1991
|
../tests/test.rem(1043): Trig = Monday, 17 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Tuesday, 18 June, 1991
|
../tests/test.rem(1043): Trig = Tuesday, 18 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Wednesday, 19 June, 1991
|
../tests/test.rem(1043): Trig = Wednesday, 19 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Thursday, 20 June, 1991
|
../tests/test.rem(1043): Trig = Thursday, 20 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Friday, 21 June, 1991
|
../tests/test.rem(1043): Trig = Friday, 21 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Saturday, 22 June, 1991
|
../tests/test.rem(1043): Trig = Saturday, 22 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 23 June, 1991
|
../tests/test.rem(1043): Trig = Sunday, 23 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 24 June, 1991
|
../tests/test.rem(1043): Trig = Monday, 24 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Tuesday, 25 June, 1991
|
../tests/test.rem(1043): Trig = Tuesday, 25 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Wednesday, 26 June, 1991
|
../tests/test.rem(1043): Trig = Wednesday, 26 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Thursday, 27 June, 1991
|
../tests/test.rem(1043): Trig = Thursday, 27 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Friday, 28 June, 1991
|
../tests/test.rem(1043): Trig = Friday, 28 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Saturday, 29 June, 1991
|
../tests/test.rem(1043): Trig = Saturday, 29 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 30 June, 1991
|
../tests/test.rem(1043): Trig = Sunday, 30 June, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 1 July, 1991
|
../tests/test.rem(1043): Trig = Monday, 1 July, 1991
|
||||||
../tests/test.rem(1035): Trig = Tuesday, 2 July, 1991
|
../tests/test.rem(1043): Trig = Tuesday, 2 July, 1991
|
||||||
../tests/test.rem(1035): Trig = Wednesday, 3 July, 1991
|
../tests/test.rem(1043): Trig = Wednesday, 3 July, 1991
|
||||||
../tests/test.rem(1035): Trig = Thursday, 4 July, 1991
|
../tests/test.rem(1043): Trig = Thursday, 4 July, 1991
|
||||||
../tests/test.rem(1035): Trig = Friday, 5 July, 1991
|
../tests/test.rem(1043): Trig = Friday, 5 July, 1991
|
||||||
../tests/test.rem(1035): Trig = Saturday, 6 July, 1991
|
../tests/test.rem(1043): Trig = Saturday, 6 July, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 7 July, 1991
|
../tests/test.rem(1043): Trig = Sunday, 7 July, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 8 July, 1991
|
../tests/test.rem(1043): Trig = Monday, 8 July, 1991
|
||||||
../tests/test.rem(1035): Trig = Tuesday, 9 July, 1991
|
../tests/test.rem(1043): Trig = Tuesday, 9 July, 1991
|
||||||
../tests/test.rem(1035): Trig = Wednesday, 10 July, 1991
|
../tests/test.rem(1043): Trig = Wednesday, 10 July, 1991
|
||||||
../tests/test.rem(1035): Trig = Thursday, 11 July, 1991
|
../tests/test.rem(1043): Trig = Thursday, 11 July, 1991
|
||||||
../tests/test.rem(1035): Trig = Friday, 12 July, 1991
|
../tests/test.rem(1043): Trig = Friday, 12 July, 1991
|
||||||
../tests/test.rem(1035): Trig = Saturday, 13 July, 1991
|
../tests/test.rem(1043): Trig = Saturday, 13 July, 1991
|
||||||
../tests/test.rem(1035): Trig = Sunday, 14 July, 1991
|
../tests/test.rem(1043): Trig = Sunday, 14 July, 1991
|
||||||
../tests/test.rem(1035): Trig = Monday, 15 July, 1991
|
../tests/test.rem(1043): Trig = Monday, 15 July, 1991
|
||||||
../tests/test.rem(1035): Can't compute trigger
|
../tests/test.rem(1043): Can't compute trigger
|
||||||
REM SATSIFY ""
|
REM SATSIFY ""
|
||||||
../tests/test.rem(1036): Missing REM type; assuming MSG
|
../tests/test.rem(1044): Missing REM type; assuming MSG
|
||||||
../tests/test.rem(1036): Trig = Saturday, 16 February, 1991
|
../tests/test.rem(1044): Trig = Saturday, 16 February, 1991
|
||||||
../tests/test.rem(1036): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1044): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
../tests/test.rem(1036): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1044): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
SATSIFY ""
|
SATSIFY ""
|
||||||
|
|
||||||
REM SATISFY [version() > "01.00.00"]
|
REM SATISFY [version() > "01.00.00"]
|
||||||
../tests/test.rem(1037): SATISFY: expression has no reference to trigdate() or $T...
|
../tests/test.rem(1045): SATISFY: expression has no reference to trigdate() or $T...
|
||||||
../tests/test.rem(1037): Trig = Saturday, 16 February, 1991
|
../tests/test.rem(1045): Trig = Saturday, 16 February, 1991
|
||||||
version() => "05.00.03"
|
version() => "05.00.05"
|
||||||
"05.00.03" > "01.00.00" => 1
|
"05.00.05" > "01.00.00" => 1
|
||||||
../tests/test.rem(1037): Trig(satisfied) = Saturday, 16 February, 1991
|
../tests/test.rem(1045): Trig(satisfied) = Saturday, 16 February, 1991
|
||||||
REM SATISFY [max(x, max(x, 1, 2, 3), 4, 5, 6) * 5]
|
REM SATISFY [max(x, max(x, 1, 2, 3), 4, 5, 6) * 5]
|
||||||
../tests/test.rem(1038): SATISFY: expression has no reference to trigdate() or $T...
|
../tests/test.rem(1046): SATISFY: expression has no reference to trigdate() or $T...
|
||||||
../tests/test.rem(1038): Trig = Saturday, 16 February, 1991
|
../tests/test.rem(1046): Trig = Saturday, 16 February, 1991
|
||||||
x => 3
|
x => 3
|
||||||
x => 3
|
x => 3
|
||||||
max(3, 1, 2, 3) => 3
|
max(3, 1, 2, 3) => 3
|
||||||
max(3, 3, 4, 5, 6) => 6
|
max(3, 3, 4, 5, 6) => 6
|
||||||
6 * 5 => 30
|
6 * 5 => 30
|
||||||
../tests/test.rem(1038): Trig(satisfied) = Saturday, 16 February, 1991
|
../tests/test.rem(1046): Trig(satisfied) = Saturday, 16 February, 1991
|
||||||
|
|
||||||
FSET gg(x) 0
|
FSET gg(x) 0
|
||||||
REM WARN gg MSG Wookie
|
REM WARN gg MSG Wookie
|
||||||
../tests/test.rem(1041): WARN function `gg' defined at ../tests/test.rem:1040 does not use its argument
|
../tests/test.rem(1049): WARN function `gg' defined at ../tests/test.rem:1048 does not use its argument
|
||||||
../tests/test.rem(1041): Trig = Saturday, 16 February, 1991
|
../tests/test.rem(1049): Trig = Saturday, 16 February, 1991
|
||||||
Entering UserFN gg(1)
|
Entering UserFN gg(1)
|
||||||
Leaving UserFN gg(1) => 0
|
Leaving UserFN gg(1) => 0
|
||||||
../tests/test.rem(1041): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1049): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
../tests/test.rem(1041): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1049): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
Wookie
|
Wookie
|
||||||
|
|
||||||
REM AT 11:00 SCHED gg MSG blork
|
REM AT 11:00 SCHED gg MSG blork
|
||||||
../tests/test.rem(1042): SCHED function `gg' defined at ../tests/test.rem:1040 does not use its argument
|
../tests/test.rem(1050): SCHED function `gg' defined at ../tests/test.rem:1048 does not use its argument
|
||||||
../tests/test.rem(1042): Trig = Saturday, 16 February, 1991 AT 11:00
|
../tests/test.rem(1050): Trig = Saturday, 16 February, 1991 AT 11:00
|
||||||
../tests/test.rem(1042): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1050): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
../tests/test.rem(1042): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1050): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
blork
|
blork
|
||||||
|
|
||||||
REM OMITFUNC gg MSG hehe
|
REM OMITFUNC gg MSG hehe
|
||||||
../tests/test.rem(1043): OMITFUNC function `gg' defined at ../tests/test.rem:1040 does not use its argument
|
../tests/test.rem(1051): OMITFUNC function `gg' defined at ../tests/test.rem:1048 does not use its argument
|
||||||
../tests/test.rem(1043): Trig = Saturday, 16 February, 1991
|
../tests/test.rem(1051): Trig = Saturday, 16 February, 1991
|
||||||
../tests/test.rem(1043): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1051): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
../tests/test.rem(1043): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1051): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
hehe
|
hehe
|
||||||
|
|
||||||
|
|
||||||
FSET gg(x,y,z) 0
|
FSET gg(x,y,z) 0
|
||||||
../tests/test.rem(1045): Function gg redefined (previously defined at ../tests/test.rem:1040)
|
../tests/test.rem(1053): Function gg redefined (previously defined at ../tests/test.rem:1048)
|
||||||
REM WARN gg MSG Wookie
|
REM WARN gg MSG Wookie
|
||||||
../tests/test.rem(1046): WARN function `gg' defined at ../tests/test.rem:1045 should take 1 argument but actually takes 3
|
../tests/test.rem(1054): WARN function `gg' defined at ../tests/test.rem:1053 should take 1 argument but actually takes 3
|
||||||
../tests/test.rem(1046): Trig = Saturday, 16 February, 1991
|
../tests/test.rem(1054): Trig = Saturday, 16 February, 1991
|
||||||
../tests/test.rem(1046): Undefined WARN function: `gg'
|
../tests/test.rem(1054): Undefined WARN function: `gg'
|
||||||
../tests/test.rem(1046): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1054): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
../tests/test.rem(1046): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1054): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
Wookie
|
Wookie
|
||||||
|
|
||||||
REM AT 11:00 SCHED gg MSG blork
|
REM AT 11:00 SCHED gg MSG blork
|
||||||
../tests/test.rem(1047): SCHED function `gg' defined at ../tests/test.rem:1045 should take 1 argument but actually takes 3
|
../tests/test.rem(1055): SCHED function `gg' defined at ../tests/test.rem:1053 should take 1 argument but actually takes 3
|
||||||
../tests/test.rem(1047): Trig = Saturday, 16 February, 1991 AT 11:00
|
../tests/test.rem(1055): Trig = Saturday, 16 February, 1991 AT 11:00
|
||||||
../tests/test.rem(1047): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1055): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
../tests/test.rem(1047): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1055): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
blork
|
blork
|
||||||
|
|
||||||
REM OMITFUNC gg MSG hehe
|
REM OMITFUNC gg MSG hehe
|
||||||
../tests/test.rem(1048): OMITFUNC function `gg' defined at ../tests/test.rem:1045 should take 1 argument but actually takes 3
|
../tests/test.rem(1056): OMITFUNC function `gg' defined at ../tests/test.rem:1053 should take 1 argument but actually takes 3
|
||||||
../tests/test.rem(1048): Trig = Saturday, 16 February, 1991
|
../tests/test.rem(1056): Trig = Saturday, 16 February, 1991
|
||||||
../tests/test.rem(1048): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1056): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
../tests/test.rem(1048): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1056): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
hehe
|
hehe
|
||||||
|
|
||||||
|
|
||||||
FSET gg() 0
|
FSET gg() 0
|
||||||
../tests/test.rem(1050): Function gg redefined (previously defined at ../tests/test.rem:1045)
|
../tests/test.rem(1058): Function gg redefined (previously defined at ../tests/test.rem:1053)
|
||||||
REM WARN gg MSG Wookie
|
REM WARN gg MSG Wookie
|
||||||
../tests/test.rem(1051): WARN function `gg' defined at ../tests/test.rem:1050 should take 1 argument but actually takes 0
|
../tests/test.rem(1059): WARN function `gg' defined at ../tests/test.rem:1058 should take 1 argument but actually takes 0
|
||||||
../tests/test.rem(1051): Trig = Saturday, 16 February, 1991
|
../tests/test.rem(1059): Trig = Saturday, 16 February, 1991
|
||||||
../tests/test.rem(1051): Undefined WARN function: `gg'
|
../tests/test.rem(1059): Undefined WARN function: `gg'
|
||||||
../tests/test.rem(1051): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1059): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
../tests/test.rem(1051): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1059): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
Wookie
|
Wookie
|
||||||
|
|
||||||
REM AT 11:00 SCHED gg MSG blork
|
REM AT 11:00 SCHED gg MSG blork
|
||||||
../tests/test.rem(1052): SCHED function `gg' defined at ../tests/test.rem:1050 should take 1 argument but actually takes 0
|
../tests/test.rem(1060): SCHED function `gg' defined at ../tests/test.rem:1058 should take 1 argument but actually takes 0
|
||||||
../tests/test.rem(1052): Trig = Saturday, 16 February, 1991 AT 11:00
|
../tests/test.rem(1060): Trig = Saturday, 16 February, 1991 AT 11:00
|
||||||
../tests/test.rem(1052): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1060): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
../tests/test.rem(1052): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1060): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
blork
|
blork
|
||||||
|
|
||||||
REM OMITFUNC gg MSG hehe
|
REM OMITFUNC gg MSG hehe
|
||||||
../tests/test.rem(1053): OMITFUNC function `gg' defined at ../tests/test.rem:1050 should take 1 argument but actually takes 0
|
../tests/test.rem(1061): OMITFUNC function `gg' defined at ../tests/test.rem:1058 should take 1 argument but actually takes 0
|
||||||
../tests/test.rem(1053): Trig = Saturday, 16 February, 1991
|
../tests/test.rem(1061): Trig = Saturday, 16 February, 1991
|
||||||
../tests/test.rem(1053): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1061): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
../tests/test.rem(1053): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1061): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
hehe
|
hehe
|
||||||
|
|
||||||
|
|
||||||
FSET gg(x) x-x
|
FSET gg(x) x-x
|
||||||
../tests/test.rem(1055): Function gg redefined (previously defined at ../tests/test.rem:1050)
|
../tests/test.rem(1063): Function gg redefined (previously defined at ../tests/test.rem:1058)
|
||||||
REM WARN gg MSG Wookie
|
REM WARN gg MSG Wookie
|
||||||
../tests/test.rem(1056): Trig = Saturday, 16 February, 1991
|
../tests/test.rem(1064): Trig = Saturday, 16 February, 1991
|
||||||
Entering UserFN gg(1)
|
Entering UserFN gg(1)
|
||||||
x => 1
|
x => 1
|
||||||
x => 1
|
x => 1
|
||||||
1 - 1 => 0
|
1 - 1 => 0
|
||||||
Leaving UserFN gg(1) => 0
|
Leaving UserFN gg(1) => 0
|
||||||
../tests/test.rem(1056): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1064): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
../tests/test.rem(1056): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1064): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
Wookie
|
Wookie
|
||||||
|
|
||||||
REM AT 11:00 SCHED gg MSG blork
|
REM AT 11:00 SCHED gg MSG blork
|
||||||
../tests/test.rem(1057): Trig = Saturday, 16 February, 1991 AT 11:00
|
../tests/test.rem(1065): Trig = Saturday, 16 February, 1991 AT 11:00
|
||||||
../tests/test.rem(1057): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1065): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
../tests/test.rem(1057): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1065): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
blork
|
blork
|
||||||
|
|
||||||
REM OMITFUNC gg MSG hehe
|
REM OMITFUNC gg MSG hehe
|
||||||
../tests/test.rem(1058): Trig = Saturday, 16 February, 1991
|
../tests/test.rem(1066): Trig = Saturday, 16 February, 1991
|
||||||
../tests/test.rem(1058): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1066): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
../tests/test.rem(1058): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1066): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
hehe
|
hehe
|
||||||
|
|
||||||
|
|
||||||
REM WARN not_defined MSG Wookie
|
REM WARN not_defined MSG Wookie
|
||||||
../tests/test.rem(1060): Trig = Saturday, 16 February, 1991
|
../tests/test.rem(1068): Trig = Saturday, 16 February, 1991
|
||||||
../tests/test.rem(1060): Undefined WARN function: `not_defined'
|
../tests/test.rem(1068): Undefined WARN function: `not_defined'
|
||||||
../tests/test.rem(1060): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1068): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
../tests/test.rem(1060): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1068): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
Wookie
|
Wookie
|
||||||
|
|
||||||
REM AT 11:00 SCHED not_defined MSG blork
|
REM AT 11:00 SCHED not_defined MSG blork
|
||||||
../tests/test.rem(1061): Undefined SCHED function: `not_defined'
|
../tests/test.rem(1069): Undefined SCHED function: `not_defined'
|
||||||
../tests/test.rem(1061): Trig = Saturday, 16 February, 1991 AT 11:00
|
../tests/test.rem(1069): Trig = Saturday, 16 February, 1991 AT 11:00
|
||||||
../tests/test.rem(1061): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1069): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
../tests/test.rem(1061): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1069): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
blork
|
blork
|
||||||
|
|
||||||
REM OMITFUNC not_defined MSG hehe
|
REM OMITFUNC not_defined MSG hehe
|
||||||
../tests/test.rem(1062): Undefined OMITFUNC function: `not_defined'
|
../tests/test.rem(1070): Undefined OMITFUNC function: `not_defined'
|
||||||
../tests/test.rem(1062): Trig = Saturday, 16 February, 1991
|
../tests/test.rem(1070): Trig = Saturday, 16 February, 1991
|
||||||
../tests/test.rem(1062): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1070): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
../tests/test.rem(1062): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
../tests/test.rem(1070): Function `subst_ampm' defined at ../tests/test.rem:931 should take 1 argument, but actually takes 7
|
||||||
hehe
|
hehe
|
||||||
|
|
||||||
|
|
||||||
@@ -5594,6 +5677,28 @@ set xyz ! "foo"
|
|||||||
set xyz ! "0"
|
set xyz ! "0"
|
||||||
! "0" => 0
|
! "0" => 0
|
||||||
|
|
||||||
|
# Test error messages for function calls with too many / too few args
|
||||||
|
|
||||||
|
set zxk version(1)
|
||||||
|
../tests/test.rem(1114): version: Too many arguments
|
||||||
|
version(1)
|
||||||
|
^-- here
|
||||||
|
set zxk max()
|
||||||
|
../tests/test.rem(1115): max: Not enough arguments
|
||||||
|
max()
|
||||||
|
^-- here
|
||||||
|
|
||||||
|
fset dooby(x) 1
|
||||||
|
set zxk dooby()
|
||||||
|
dooby(...) => Not enough arguments
|
||||||
|
../tests/test.rem(1118): dooby(): Not enough arguments
|
||||||
|
set zxk dooby(1, 2)
|
||||||
|
dooby(...) => Too many arguments
|
||||||
|
../tests/test.rem(1119): dooby(): Too many arguments
|
||||||
|
set zxk dooby(1)
|
||||||
|
Entering UserFN dooby(1)
|
||||||
|
Leaving UserFN dooby(1) => 1
|
||||||
|
|
||||||
# Don't want Remind to queue reminders
|
# Don't want Remind to queue reminders
|
||||||
EXIT
|
EXIT
|
||||||
|
|
||||||
@@ -11747,7 +11852,7 @@ STDOUT is a: PIPE
|
|||||||
| | | |1 |2 |3 |4 |
|
| | | |1 |2 |3 |4 |
|
||||||
| | | |[0;30mBLACK[0m |[0;34mBLUE[0m |[0;32mGREEN[0m |[0;36mCYAN[0m |
|
| | | |[0;30mBLACK[0m |[0;34mBLUE[0m |[0;32mGREEN[0m |[0;36mCYAN[0m |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
|5 |6 |7 |8 |9 |10 |11 |
|
|5 |[0;43m6 [0m|[0;45m7 [0m|[0;46m8 [0m|9 |10 |11 |
|
||||||
|-@0 |[0;43m [0m|[0;45m [0m|[0;46m[0;30mBLACK[0m[0;46m [0m|[34;1mBRIGHT[0m |[32;1mBRIGHT[0m |[36;1mBRIGHT[0m |
|
|-@0 |[0;43m [0m|[0;45m [0m|[0;46m[0;30mBLACK[0m[0;46m [0m|[34;1mBRIGHT[0m |[32;1mBRIGHT[0m |[36;1mBRIGHT[0m |
|
||||||
| |[0;43m [0m|[0;45m [0m|[0;46m [0m|[34;1mBLUE[0m |[32;1mGREEN[0m |[36;1mCYAN[0m |
|
| |[0;43m [0m|[0;45m [0m|[0;46m [0m|[34;1mBLUE[0m |[32;1mGREEN[0m |[36;1mCYAN[0m |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
@@ -11769,7 +11874,7 @@ STDOUT is a: PIPE
|
|||||||
| | | |1 |2 |3 |4 |
|
| | | |1 |2 |3 |4 |
|
||||||
| | | |[30;1mBLACK[0m |[0;34mBLUE[0m |[0;32mGREEN[0m |[0;36mCYAN[0m |
|
| | | |[30;1mBLACK[0m |[0;34mBLUE[0m |[0;32mGREEN[0m |[0;36mCYAN[0m |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
|5 |6 |7 |8 |9 |10 |11 |
|
|5 |[0;43m6 [0m|[0;45m7 [0m|[0;46m8 [0m|9 |10 |11 |
|
||||||
|-@0,0 |[0;43m [0m|[0;45m [0m|[0;46m[0;30mBLACK[0m[0;46m [0m|[34;1mBRIGHT[0m |[32;1mBRIGHT[0m |[36;1mBRIGHT[0m |
|
|-@0,0 |[0;43m [0m|[0;45m [0m|[0;46m[0;30mBLACK[0m[0;46m [0m|[34;1mBRIGHT[0m |[32;1mBRIGHT[0m |[36;1mBRIGHT[0m |
|
||||||
| |[0;43m [0m|[0;45m [0m|[0;46m [0m|[34;1mBLUE[0m |[32;1mGREEN[0m |[36;1mCYAN[0m |
|
| |[0;43m [0m|[0;45m [0m|[0;46m [0m|[34;1mBLUE[0m |[32;1mGREEN[0m |[36;1mCYAN[0m |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
@@ -11791,7 +11896,7 @@ STDOUT is a: PIPE
|
|||||||
| | | |1 |2 |3 |4 |
|
| | | |1 |2 |3 |4 |
|
||||||
| | | |[0;30mBLACK[0m |[0;34mBLUE[0m |[0;32mGREEN[0m |[0;36mCYAN[0m |
|
| | | |[0;30mBLACK[0m |[0;34mBLUE[0m |[0;32mGREEN[0m |[0;36mCYAN[0m |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
|5 |6 |7 |8 |9 |10 |11 |
|
|5 |[0;43m6 [0m|[0;45m7 [0m|[0;46m8 [0m|9 |10 |11 |
|
||||||
|-@0,1 |[0;43m [0m|[0;45m [0m|[0;46m[0;30mBLACK[0m[0;46m [0m|[34;1mBRIGHT[0m |[32;1mBRIGHT[0m |[36;1mBRIGHT[0m |
|
|-@0,1 |[0;43m [0m|[0;45m [0m|[0;46m[0;30mBLACK[0m[0;46m [0m|[34;1mBRIGHT[0m |[32;1mBRIGHT[0m |[36;1mBRIGHT[0m |
|
||||||
| |[0;43m [0m|[0;45m [0m|[0;46m [0m|[34;1mBLUE[0m |[32;1mGREEN[0m |[36;1mCYAN[0m |
|
| |[0;43m [0m|[0;45m [0m|[0;46m [0m|[34;1mBLUE[0m |[32;1mGREEN[0m |[36;1mCYAN[0m |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
@@ -11813,7 +11918,7 @@ STDOUT is a: PIPE
|
|||||||
| | | |1 |2 |3 |4 |
|
| | | |1 |2 |3 |4 |
|
||||||
| | | |[38;5;0mBLACK[0m |[38;5;17mBLUE[0m |[38;5;22mGREEN[0m |[38;5;23mCYAN[0m |
|
| | | |[38;5;0mBLACK[0m |[38;5;17mBLUE[0m |[38;5;22mGREEN[0m |[38;5;23mCYAN[0m |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
|5 |6 |7 |8 |9 |10 |11 |
|
|5 |[48;5;11m6 [0m|[48;5;13m7 [0m|[48;5;14m8 [0m|9 |10 |11 |
|
||||||
|-@1 |[48;5;11m [0m|[48;5;13m [0m|[48;5;14m[38;5;0mBLACK[0m[48;5;14m [0m|[38;5;20mBRIGHT[0m |[38;5;40mBRIGHT[0m |[38;5;44mBRIGHT[0m |
|
|-@1 |[48;5;11m [0m|[48;5;13m [0m|[48;5;14m[38;5;0mBLACK[0m[48;5;14m [0m|[38;5;20mBRIGHT[0m |[38;5;40mBRIGHT[0m |[38;5;44mBRIGHT[0m |
|
||||||
| |[48;5;11m [0m|[48;5;13m [0m|[48;5;14m [0m|[38;5;20mBLUE[0m |[38;5;40mGREEN[0m |[38;5;44mCYAN[0m |
|
| |[48;5;11m [0m|[48;5;13m [0m|[48;5;14m [0m|[38;5;20mBLUE[0m |[38;5;40mGREEN[0m |[38;5;44mCYAN[0m |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
@@ -11835,7 +11940,7 @@ STDOUT is a: PIPE
|
|||||||
| | | |1 |2 |3 |4 |
|
| | | |1 |2 |3 |4 |
|
||||||
| | | |[38;5;238mBLACK[0m |[38;5;17mBLUE[0m |[38;5;22mGREEN[0m |[38;5;23mCYAN[0m |
|
| | | |[38;5;238mBLACK[0m |[38;5;17mBLUE[0m |[38;5;22mGREEN[0m |[38;5;23mCYAN[0m |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
|5 |6 |7 |8 |9 |10 |11 |
|
|5 |[48;5;11m6 [0m|[48;5;13m7 [0m|[48;5;14m8 [0m|9 |10 |11 |
|
||||||
|-@1,0 |[48;5;11m [0m|[48;5;13m [0m|[48;5;14m[38;5;0mBLACK[0m[48;5;14m [0m|[38;5;20mBRIGHT[0m |[38;5;40mBRIGHT[0m |[38;5;44mBRIGHT[0m |
|
|-@1,0 |[48;5;11m [0m|[48;5;13m [0m|[48;5;14m[38;5;0mBLACK[0m[48;5;14m [0m|[38;5;20mBRIGHT[0m |[38;5;40mBRIGHT[0m |[38;5;44mBRIGHT[0m |
|
||||||
| |[48;5;11m [0m|[48;5;13m [0m|[48;5;14m [0m|[38;5;20mBLUE[0m |[38;5;40mGREEN[0m |[38;5;44mCYAN[0m |
|
| |[48;5;11m [0m|[48;5;13m [0m|[48;5;14m [0m|[38;5;20mBLUE[0m |[38;5;40mGREEN[0m |[38;5;44mCYAN[0m |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
@@ -11857,7 +11962,7 @@ STDOUT is a: PIPE
|
|||||||
| | | |1 |2 |3 |4 |
|
| | | |1 |2 |3 |4 |
|
||||||
| | | |[38;5;0mBLACK[0m |[38;5;17mBLUE[0m |[38;5;22mGREEN[0m |[38;5;23mCYAN[0m |
|
| | | |[38;5;0mBLACK[0m |[38;5;17mBLUE[0m |[38;5;22mGREEN[0m |[38;5;23mCYAN[0m |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
|5 |6 |7 |8 |9 |10 |11 |
|
|5 |[48;5;11m6 [0m|[48;5;13m7 [0m|[48;5;14m8 [0m|9 |10 |11 |
|
||||||
|-@1,1 |[48;5;11m [0m|[48;5;13m [0m|[48;5;14m[38;5;0mBLACK[0m[48;5;14m [0m|[38;5;20mBRIGHT[0m |[38;5;40mBRIGHT[0m |[38;5;44mBRIGHT[0m |
|
|-@1,1 |[48;5;11m [0m|[48;5;13m [0m|[48;5;14m[38;5;0mBLACK[0m[48;5;14m [0m|[38;5;20mBRIGHT[0m |[38;5;40mBRIGHT[0m |[38;5;44mBRIGHT[0m |
|
||||||
| |[48;5;11m [0m|[48;5;13m [0m|[48;5;14m [0m|[38;5;20mBLUE[0m |[38;5;40mGREEN[0m |[38;5;44mCYAN[0m |
|
| |[48;5;11m [0m|[48;5;13m [0m|[48;5;14m [0m|[38;5;20mBLUE[0m |[38;5;40mGREEN[0m |[38;5;44mCYAN[0m |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
@@ -11879,7 +11984,7 @@ STDOUT is a: PIPE
|
|||||||
| | | |1 |2 |3 |4 |
|
| | | |1 |2 |3 |4 |
|
||||||
| | | |[38;2;0;0;0mBLACK[0m |[38;2;0;0;65mBLUE[0m |[38;2;0;65;0mGREEN[0m |[38;2;0;65;65mCYAN[0m |
|
| | | |[38;2;0;0;0mBLACK[0m |[38;2;0;0;65mBLUE[0m |[38;2;0;65;0mGREEN[0m |[38;2;0;65;65mCYAN[0m |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
|5 |6 |7 |8 |9 |10 |11 |
|
|5 |[48;2;255;255;0m6 [0m|[48;2;255;0;255m7 [0m|[48;2;0;255;255m8 [0m|9 |10 |11 |
|
||||||
|-@2 |[48;2;255;255;0m [0m|[48;2;255;0;255m [0m|[48;2;0;255;255m[38;2;0;0;0mBLACK[0m[48;2;0;255;255m [0m|[38;2;0;0;200mBRIGHT[0m |[38;2;0;200;0mBRIGHT[0m |[38;2;0;200;200mBRIGHT[0m |
|
|-@2 |[48;2;255;255;0m [0m|[48;2;255;0;255m [0m|[48;2;0;255;255m[38;2;0;0;0mBLACK[0m[48;2;0;255;255m [0m|[38;2;0;0;200mBRIGHT[0m |[38;2;0;200;0mBRIGHT[0m |[38;2;0;200;200mBRIGHT[0m |
|
||||||
| |[48;2;255;255;0m [0m|[48;2;255;0;255m [0m|[48;2;0;255;255m [0m|[38;2;0;0;200mBLUE[0m |[38;2;0;200;0mGREEN[0m |[38;2;0;200;200mCYAN[0m |
|
| |[48;2;255;255;0m [0m|[48;2;255;0;255m [0m|[48;2;0;255;255m [0m|[38;2;0;0;200mBLUE[0m |[38;2;0;200;0mGREEN[0m |[38;2;0;200;200mCYAN[0m |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
@@ -11901,7 +12006,7 @@ STDOUT is a: PIPE
|
|||||||
| | | |1 |2 |3 |4 |
|
| | | |1 |2 |3 |4 |
|
||||||
| | | |[38;2;65;65;65mBLACK[0m |[38;2;0;0;65mBLUE[0m |[38;2;0;65;0mGREEN[0m |[38;2;0;65;65mCYAN[0m |
|
| | | |[38;2;65;65;65mBLACK[0m |[38;2;0;0;65mBLUE[0m |[38;2;0;65;0mGREEN[0m |[38;2;0;65;65mCYAN[0m |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
|5 |6 |7 |8 |9 |10 |11 |
|
|5 |[48;2;255;255;0m6 [0m|[48;2;255;0;255m7 [0m|[48;2;0;255;255m8 [0m|9 |10 |11 |
|
||||||
|-@2,0 |[48;2;255;255;0m [0m|[48;2;255;0;255m [0m|[48;2;0;255;255m[38;2;0;0;0mBLACK[0m[48;2;0;255;255m [0m|[38;2;0;0;200mBRIGHT[0m |[38;2;0;200;0mBRIGHT[0m |[38;2;0;200;200mBRIGHT[0m |
|
|-@2,0 |[48;2;255;255;0m [0m|[48;2;255;0;255m [0m|[48;2;0;255;255m[38;2;0;0;0mBLACK[0m[48;2;0;255;255m [0m|[38;2;0;0;200mBRIGHT[0m |[38;2;0;200;0mBRIGHT[0m |[38;2;0;200;200mBRIGHT[0m |
|
||||||
| |[48;2;255;255;0m [0m|[48;2;255;0;255m [0m|[48;2;0;255;255m [0m|[38;2;0;0;200mBLUE[0m |[38;2;0;200;0mGREEN[0m |[38;2;0;200;200mCYAN[0m |
|
| |[48;2;255;255;0m [0m|[48;2;255;0;255m [0m|[48;2;0;255;255m [0m|[38;2;0;0;200mBLUE[0m |[38;2;0;200;0mGREEN[0m |[38;2;0;200;200mCYAN[0m |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
@@ -11923,7 +12028,7 @@ STDOUT is a: PIPE
|
|||||||
| | | |1 |2 |3 |4 |
|
| | | |1 |2 |3 |4 |
|
||||||
| | | |[38;2;0;0;0mBLACK[0m |[38;2;0;0;65mBLUE[0m |[38;2;0;65;0mGREEN[0m |[38;2;0;65;65mCYAN[0m |
|
| | | |[38;2;0;0;0mBLACK[0m |[38;2;0;0;65mBLUE[0m |[38;2;0;65;0mGREEN[0m |[38;2;0;65;65mCYAN[0m |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
|5 |6 |7 |8 |9 |10 |11 |
|
|5 |[48;2;255;255;0m6 [0m|[48;2;255;0;255m7 [0m|[48;2;0;255;255m8 [0m|9 |10 |11 |
|
||||||
|-@2,1 |[48;2;255;255;0m [0m|[48;2;255;0;255m [0m|[48;2;0;255;255m[38;2;0;0;0mBLACK[0m[48;2;0;255;255m [0m|[38;2;0;0;200mBRIGHT[0m |[38;2;0;200;0mBRIGHT[0m |[38;2;0;200;200mBRIGHT[0m |
|
|-@2,1 |[48;2;255;255;0m [0m|[48;2;255;0;255m [0m|[48;2;0;255;255m[38;2;0;0;0mBLACK[0m[48;2;0;255;255m [0m|[38;2;0;0;200mBRIGHT[0m |[38;2;0;200;0mBRIGHT[0m |[38;2;0;200;200mBRIGHT[0m |
|
||||||
| |[48;2;255;255;0m [0m|[48;2;255;0;255m [0m|[48;2;0;255;255m [0m|[38;2;0;0;200mBLUE[0m |[38;2;0;200;0mGREEN[0m |[38;2;0;200;200mCYAN[0m |
|
| |[48;2;255;255;0m [0m|[48;2;255;0;255m [0m|[48;2;0;255;255m [0m|[38;2;0;0;200mBLUE[0m |[38;2;0;200;0mGREEN[0m |[38;2;0;200;200mCYAN[0m |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
@@ -12491,7 +12596,7 @@ SECURITY: Won't read world-writable file or directory!
|
|||||||
Error reading include_dir/ww: Can't open file
|
Error reading include_dir/ww: Can't open file
|
||||||
SECURITY: Won't read world-writable file or directory!
|
SECURITY: Won't read world-writable file or directory!
|
||||||
Error reading include_dir/ww: No files matching *.rem
|
Error reading include_dir/ww: No files matching *.rem
|
||||||
05.00.03
|
05.00.05
|
||||||
NOTE JSONQUEUE
|
NOTE JSONQUEUE
|
||||||
[{"priority":2,"eventstart":"VOLATILE","time":"23:59","nexttime":"23:59","tdelta":0,"trep":0,"rundisabled":0,"ntrig":1,"filename":"../tests/queue2.rem","lineno":1,"type":"MSG_TYPE","body":"XXXX"},{"priority":999,"eventstart":"VOLATILE","time":"23:58","nexttime":"23:58","tdelta":0,"trep":0,"rundisabled":0,"ntrig":1,"filename":"../tests/queue1.rem","lineno":5,"type":"MSG_TYPE","body":"quux"},{"priority":42,"eventstart":"VOLATILE","time":"23:57","nexttime":"23:57","tdelta":0,"trep":0,"rundisabled":0,"ntrig":1,"filename":"../tests/queue1.rem","lineno":4,"type":"MSG_TYPE","body":"bar"},{"priority":5000,"eventstart":"VOLATILE","time":"23:56","nexttime":"23:56","tdelta":0,"trep":0,"rundisabled":0,"ntrig":1,"filename":"../tests/queue1.rem","lineno":3,"type":"MSG_TYPE","body":"foo"}]
|
[{"priority":2,"eventstart":"VOLATILE","time":"23:59","nexttime":"23:59","tdelta":0,"trep":0,"rundisabled":0,"ntrig":1,"filename":"../tests/queue2.rem","lineno":1,"type":"MSG_TYPE","body":"XXXX"},{"priority":999,"eventstart":"VOLATILE","time":"23:58","nexttime":"23:58","tdelta":0,"trep":0,"rundisabled":0,"ntrig":1,"filename":"../tests/queue1.rem","lineno":5,"type":"MSG_TYPE","body":"quux"},{"priority":42,"eventstart":"VOLATILE","time":"23:57","nexttime":"23:57","tdelta":0,"trep":0,"rundisabled":0,"ntrig":1,"filename":"../tests/queue1.rem","lineno":4,"type":"MSG_TYPE","body":"bar"},{"priority":5000,"eventstart":"VOLATILE","time":"23:56","nexttime":"23:56","tdelta":0,"trep":0,"rundisabled":0,"ntrig":1,"filename":"../tests/queue1.rem","lineno":3,"type":"MSG_TYPE","body":"foo"}]
|
||||||
NOTE ENDJSONQUEUE
|
NOTE ENDJSONQUEUE
|
||||||
@@ -13075,11 +13180,11 @@ No reminders.
|
|||||||
# This is a timestamp file used by Remind to track ONCE reminders.
|
# This is a timestamp file used by Remind to track ONCE reminders.
|
||||||
# Do not edit or delete it.
|
# Do not edit or delete it.
|
||||||
+----------------------------------------------------------------------------+
|
+----------------------------------------------------------------------------+
|
||||||
| September 2024 |
|
| September 1990 |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
| Sunday | Monday | Tuesday |Wednesday | Thursday | Friday | Saturday |
|
| Sunday | Monday | Tuesday |Wednesday | Thursday | Friday | Saturday |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
|1 |2 |3 |4 |5 |6 |7 |
|
| | | | | | |1 |
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
@@ -13087,7 +13192,7 @@ No reminders.
|
|||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
|8 |9 |10 |11 |12 |13 |14 |
|
|2 |3 |4 |5 |6 |7 |8 |
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
@@ -13095,17 +13200,7 @@ No reminders.
|
|||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
|15 |16 |17 |18 |19 |20 |21 |
|
|9 |10 |11 |12 |13 |14 |15 |
|
||||||
| | | | | | | |
|
|
||||||
| |foo | | | | | |
|
|
||||||
| |bar | | | | | |
|
|
||||||
| |baz wookie| | | | | |
|
|
||||||
| |quux apple| | | | | |
|
|
||||||
| |blech | | | | | |
|
|
||||||
| | | | | | | |
|
|
||||||
| |ANOTHER | | | | | |
|
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
|
||||||
|22 |23 |24 |25 |26 |27 |28 |
|
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
@@ -13113,7 +13208,25 @@ No reminders.
|
|||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
+----------+----------+----------+----------+----------+----------+----------+
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
|29 |30 | | | | | |
|
|16 |17 |18 |19 |20 |21 |22 |
|
||||||
|
| | | | | | | |
|
||||||
|
|foo | | | | | | |
|
||||||
|
|bar | | | | | | |
|
||||||
|
|baz wookie| | | | | | |
|
||||||
|
|quux apple| | | | | | |
|
||||||
|
|blech | | | | | | |
|
||||||
|
| | | | | | | |
|
||||||
|
|ANOTHER | | | | | | |
|
||||||
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
|
|23 |24 |25 |26 |27 |28 |29 |
|
||||||
|
| | | | | | | |
|
||||||
|
| | | | | | | |
|
||||||
|
| | | | | | | |
|
||||||
|
| | | | | | | |
|
||||||
|
| | | | | | | |
|
||||||
|
| | | | | | | |
|
||||||
|
+----------+----------+----------+----------+----------+----------+----------+
|
||||||
|
|30 | | | | | | |
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
| | | | | | | |
|
| | | | | | | |
|
||||||
|
|||||||
@@ -1031,6 +1031,14 @@ REM SATISFY $Td > 0
|
|||||||
REM SATISFY $Tw > -1
|
REM SATISFY $Tw > -1
|
||||||
REM SATISFY [max(x, max(x, 1, 2, 3), 4, 5, 6) * max(5, $Td)]
|
REM SATISFY [max(x, max(x, 1, 2, 3), 4, 5, 6) * max(5, $Td)]
|
||||||
|
|
||||||
|
FSET references_t(x) $T != x
|
||||||
|
REM SATISFY references_t($U)
|
||||||
|
|
||||||
|
FSET recursive_t(x) iif(x==0, recursive_t(1), references_t($U))
|
||||||
|
|
||||||
|
REM SATISFY recursive_t(0)
|
||||||
|
REM SATISFY recursive_t(2)
|
||||||
|
|
||||||
# These should be diagnosed
|
# These should be diagnosed
|
||||||
REM SATISFY 0
|
REM SATISFY 0
|
||||||
REM SATSIFY ""
|
REM SATSIFY ""
|
||||||
@@ -1101,6 +1109,16 @@ set xyz ! ""
|
|||||||
set xyz ! "foo"
|
set xyz ! "foo"
|
||||||
set xyz ! "0"
|
set xyz ! "0"
|
||||||
|
|
||||||
|
# Test error messages for function calls with too many / too few args
|
||||||
|
|
||||||
|
set zxk version(1)
|
||||||
|
set zxk max()
|
||||||
|
|
||||||
|
fset dooby(x) 1
|
||||||
|
set zxk dooby()
|
||||||
|
set zxk dooby(1, 2)
|
||||||
|
set zxk dooby(1)
|
||||||
|
|
||||||
# Don't want Remind to queue reminders
|
# Don't want Remind to queue reminders
|
||||||
EXIT
|
EXIT
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user