mirror of
https://salsa.debian.org/dskoll/remind.git
synced 2026-04-16 06:18:47 +02:00
Compare commits
31 Commits
04.00.00-B
...
04.00.02
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1d6ca51bf9 | ||
|
|
e662d0b3dd | ||
|
|
b910d557d1 | ||
|
|
a4ad0a9e97 | ||
|
|
07f67e7dd7 | ||
|
|
d6575773fb | ||
|
|
ac1303886e | ||
|
|
1569992184 | ||
|
|
55a1f1d746 | ||
|
|
ef7742a3cc | ||
|
|
ef48c2020b | ||
|
|
6dcb25073b | ||
|
|
4824b07ec8 | ||
|
|
a8f1228fb7 | ||
|
|
80e51d1d0f | ||
|
|
80e30638a5 | ||
|
|
dd2fc30364 | ||
|
|
a5865fb5fe | ||
|
|
aca2f28341 | ||
|
|
7a3f5f7ac9 | ||
|
|
1731710ef2 | ||
|
|
dc2a8f48bf | ||
|
|
5e16179bfa | ||
|
|
a7c1bc81b2 | ||
|
|
5f5ec8ef19 | ||
|
|
712ff56792 | ||
|
|
99af1f964c | ||
|
|
de5d1347e5 | ||
|
|
5e07fbde6d | ||
|
|
c523c7f3b3 | ||
|
|
6b3c6b0ec7 |
2
.github/FUNDING.yml
vendored
Normal file
2
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
|
||||
liberapay: dskoll
|
||||
7
.github/README.md
vendored
Normal file
7
.github/README.md
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
# Remind has moved
|
||||
|
||||
For various reasons, I have decided to move Remind off GitHub. This repo
|
||||
will be archived. To create merge requests or issues, please visit
|
||||
Remind's new home at https://salsa.debian.org/dskoll/remind
|
||||
|
||||
-- Dianne Skoll
|
||||
29
.github/workflows/github-action.yml
vendored
Normal file
29
.github/workflows/github-action.yml
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
# language: bash
|
||||
---
|
||||
|
||||
name: Remind unit tests
|
||||
|
||||
on:
|
||||
push
|
||||
|
||||
jobs:
|
||||
tests:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Remind
|
||||
uses: actions/checkout@v2
|
||||
- name: Add test user
|
||||
run: |
|
||||
sudo adduser --home /home/testuser --gecos 'Test User' --disabled-password testuser
|
||||
- name: Fix ownership
|
||||
run: |
|
||||
sudo chown -R testuser .
|
||||
- name: Build
|
||||
run: |
|
||||
sudo su -c './configure && make' testuser
|
||||
- name: Run Tests
|
||||
run: |
|
||||
sudo su -c 'make test' testuser
|
||||
- name: Fix up permissions so GitHub does not complain
|
||||
run: |
|
||||
sudo chmod -R a+rwX .
|
||||
2
configure
vendored
2
configure
vendored
@@ -4006,7 +4006,7 @@ _ACEOF
|
||||
fi
|
||||
done
|
||||
|
||||
VERSION=04.00.00
|
||||
VERSION=04.00.02
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ else
|
||||
fi
|
||||
|
||||
AC_CHECK_FUNCS(setenv unsetenv glob mbstowcs setlocale initgroups)
|
||||
VERSION=04.00.00
|
||||
VERSION=04.00.02
|
||||
AC_SUBST(VERSION)
|
||||
AC_SUBST(PERL)
|
||||
AC_SUBST(PERLARTIFACTS)
|
||||
|
||||
@@ -1,6 +1,29 @@
|
||||
CHANGES TO REMIND
|
||||
|
||||
* VERSION 4.0 Patch 0 - 2022-??-??
|
||||
* VERSION 4.0 Patch 2 - 2022-08-02
|
||||
|
||||
- IMPROVEMENT: remind: Allow more forms of OMIT as per Ian D. Allen!'s request:
|
||||
|
||||
OMIT Month [THROUGH Month]
|
||||
OMIT Day Month [THROUGH Day Month]
|
||||
OMIT Day Month Year [THROUGH Day Month Year]
|
||||
|
||||
- BUG FIX: Make $T behave as documented, exactly like trigdate(). $T would
|
||||
return '1989-12-31' rather than 0 if the trigger date was not valid.
|
||||
|
||||
- BUG FIX: TkRemind: Fix resizing bug for a calendar with 6 rows.
|
||||
|
||||
- DOCUMENTATION IMPROVEMENT: Improve TkRemind documentation; document use
|
||||
of inotifywait if available.
|
||||
|
||||
* VERSION 4.0 Patch 1 - 2022-06-03
|
||||
|
||||
- IMPROVEMENT: Add $SuppressLRM system variable to suppress the UTF-8
|
||||
Left-to-Right mark in "remind -c" output.
|
||||
|
||||
- DOCUMENTATION FIX: Document the "q" sub-option to the "-p" option.
|
||||
|
||||
* VERSION 4.0 Patch 0 - 2022-04-04
|
||||
|
||||
- MAJOR NEW FEATURE: remind: Remind output can effectively be
|
||||
translated into other languages at run-time. A number of system
|
||||
@@ -30,6 +53,11 @@ CHANGES TO REMIND
|
||||
This causes Remind *not* to remove the %"...%" marker sequence from
|
||||
remind bodies.
|
||||
|
||||
- BUG FIX: rem2pdf: Make rem2pdf respect the --prefix ./configure flag.
|
||||
Loosely based on patch by Jonathan Kamens.
|
||||
|
||||
- BUG FIX: tkremind: Fix the "-m" flag, which was broken in 03.04.00.
|
||||
|
||||
- BUG FIX: Fix the overflow-detection functions so they work with link-time
|
||||
optimization. The previous versions would be optimized away.
|
||||
|
||||
|
||||
112
man/remind.1
112
man/remind.1
@@ -141,7 +141,7 @@ If you immediately follow the \fBs\fR with the letter
|
||||
day they actually occur \fIas well as\fR on any preceding days specified
|
||||
by the reminder's \fIdelta\fR.
|
||||
.TP
|
||||
.B \-p\fR[\fBa\fR][\fBp\fR][\fBp\fR]\fIn\fR
|
||||
.B \-p\fR[\fBa\fR][\fBp\fR][\fBp\fR][\fBq\fR]\fIn\fR
|
||||
The \fB\-p\fR option is very similar to the \fB\-s\fR option, except
|
||||
that the output contains additional information for use by the
|
||||
\fBRem2PS\fR program, which creates a PostScript calendar, and various
|
||||
@@ -156,7 +156,9 @@ by the reminder's \fIdelta\fR. If you follow the \fBp\fR with another
|
||||
format rather than the "simple calendar" format. This format is
|
||||
also documented in the \fBrem2ps(1)\fR man page. Finally, if you use
|
||||
three p's, as in \fB\-ppp\fR, then \fBRemind\fR uses a pure JSON
|
||||
format, again documented in \fBrem2ps(1)\fR.
|
||||
format, again documented in \fBrem2ps(1)\fR. If you include a \fBq\fR
|
||||
letter with this option, then the normal calendar-mode substitution filter
|
||||
is disabled and the %"...%" sequences are preserved in the output.
|
||||
.RS
|
||||
.PP
|
||||
Note that the \fB\-pp\fR or \fB\-ppp\fR options also enable the \fB\-l\fR
|
||||
@@ -563,6 +565,7 @@ The trigger date for a specific run is simply the current system date.
|
||||
present. The reminder is triggered on the specified day of each month.
|
||||
The trigger date for a particular run is the closest such day to the
|
||||
current system date. For example:
|
||||
.PP
|
||||
.nf
|
||||
REM 1 MSG First of every month.
|
||||
REM 31 MSG 31st of every month that has 31 days.
|
||||
@@ -572,6 +575,7 @@ current system date. For example:
|
||||
.I month
|
||||
present. The reminder is triggered every day of the specified month.
|
||||
Example:
|
||||
.PP
|
||||
.nf
|
||||
REM Feb MSG Every day in February
|
||||
.fi
|
||||
@@ -581,6 +585,7 @@ Example:
|
||||
and
|
||||
.I month
|
||||
present. Examples:
|
||||
.PP
|
||||
.nf
|
||||
REM 6 Jan MSG Every 6th of January
|
||||
REM Feb 29 MSG Every 29th of February
|
||||
@@ -589,6 +594,7 @@ present. Examples:
|
||||
5. Only
|
||||
.I year
|
||||
present. Example:
|
||||
.PP
|
||||
.nf
|
||||
REM 1991 MSG Every day in 1991
|
||||
.fi
|
||||
@@ -598,6 +604,7 @@ present. Example:
|
||||
and
|
||||
.I day
|
||||
present. Examples:
|
||||
.PP
|
||||
.nf
|
||||
REM 1 1990 MSG 1st of every month in 1990
|
||||
REM 1992 23 MSG 23rd of every month in 1992
|
||||
@@ -608,6 +615,7 @@ present. Examples:
|
||||
and
|
||||
.I month
|
||||
present. Examples:
|
||||
.PP
|
||||
.nf
|
||||
REM Feb 1991 MSG Every day in Feb 1991
|
||||
REM 1992 September MSG Every day in Sept 1992
|
||||
@@ -618,6 +626,7 @@ present. Examples:
|
||||
and
|
||||
.I day
|
||||
present. Examples:
|
||||
.PP
|
||||
.nf
|
||||
REM 8 Jan 1991 MSG 8th January 1991.
|
||||
REM 1992 March 9 MSG 9th March 1992.
|
||||
@@ -626,6 +635,7 @@ present. Examples:
|
||||
9.
|
||||
.I weekday
|
||||
only. Examples:
|
||||
.PP
|
||||
.nf
|
||||
REM Sat MSG Every Saturday
|
||||
REM Mon Tue Wed Thu Fri MSG Every working day
|
||||
@@ -637,6 +647,7 @@ only. Examples:
|
||||
and
|
||||
.I day
|
||||
present. Examples:
|
||||
.PP
|
||||
.nf
|
||||
REM Sat 1 MSG First Saturday of every month
|
||||
REM Mon Tue Wed Thu Fri 15 \\
|
||||
@@ -648,6 +659,7 @@ present. Examples:
|
||||
and
|
||||
.I month
|
||||
present. Examples:
|
||||
.PP
|
||||
.nf
|
||||
REM Mon March MSG Every Monday in March
|
||||
REM Mon Tue Wed Thu Fri Feb MSG Every working day in February
|
||||
@@ -658,6 +670,7 @@ present. Examples:
|
||||
and
|
||||
.I day
|
||||
present. Examples:
|
||||
.PP
|
||||
.nf
|
||||
REM Mon 1 March MSG First Monday in March
|
||||
REM Sat Sun 15 July MSG First Sat or Sun on or after 15 July
|
||||
@@ -668,6 +681,7 @@ present. Examples:
|
||||
and
|
||||
.I year
|
||||
present. Example:
|
||||
.PP
|
||||
.nf
|
||||
REM Sat Sun 1991 MSG Every Saturday and Sunday in 1991
|
||||
.fi
|
||||
@@ -677,6 +691,7 @@ present. Example:
|
||||
and
|
||||
.I year
|
||||
present. Examples:
|
||||
.PP
|
||||
.nf
|
||||
REM Mon 15 1990 MSG 1st Mon after 15th of every month in 1990
|
||||
REM Mon Tue Wed Thu Fri 1 1990 \\
|
||||
@@ -688,6 +703,7 @@ present. Examples:
|
||||
and
|
||||
.I year
|
||||
present. Example:
|
||||
.PP
|
||||
.nf
|
||||
REM Mon Wed 1991 Feb MSG Every Mon and Wed in Feb 1991.
|
||||
.fi
|
||||
@@ -697,6 +713,7 @@ present. Example:
|
||||
and
|
||||
.I year
|
||||
present. Example:
|
||||
.PP
|
||||
.nf
|
||||
REM Mon Tue Wed Thu Fri 28 Oct 1990 \\
|
||||
MSG 1st working day on or after 28 October 1990.
|
||||
@@ -1515,11 +1532,11 @@ In addition to being a keyword in the \fBREM\fR command,
|
||||
\fBOMIT\fR is a command in its own right. Its syntax is:
|
||||
.PP
|
||||
.RS
|
||||
\fBOMIT\fR \fIday\fR \fImonth\fR [\fIyear\fR]
|
||||
\fBOMIT\fR [\fIday\fR] \fImonth\fR [\fIyear\fR]
|
||||
.PP
|
||||
or:
|
||||
.PP
|
||||
\fBOMIT\fR \fIday1\fR \fImonth1\fR \fIyear1\fR \fBTHROUGH\fR \fIday2\fR \fImonth2\fR \fIyear2\fR
|
||||
\fBOMIT\fR [\fIday1\fR] \fImonth1\fR [\fIyear1\fR] \fBTHROUGH\fR [\fIday2\fR] \fImonth2\fR [\fIyear2\fR]
|
||||
.RE
|
||||
.PP
|
||||
The \fBOMIT\fR command is used to "globally" omit certain days
|
||||
@@ -1528,8 +1545,13 @@ The \fBOMIT\fR command is used to "globally" omit certain days
|
||||
"\-\-" and "\+\+" forms. Some examples:
|
||||
.PP
|
||||
.nf
|
||||
OMIT 1 Jan
|
||||
OMIT 7 Sep 1992
|
||||
OMIT 1 Jan
|
||||
OMIT 7 Sep 1992
|
||||
OMIT 15 Jan THROUGH 14 Feb
|
||||
OMIT May # Equivalent to OMIT May 1 THROUGH May 31
|
||||
OMIT 25 Dec THROUGH 4 Jan
|
||||
OMIT 2023-05-03 THROUGH 2023-05-12
|
||||
OMIT Jun THROUGH July # Equivalent to OMIT Jun 1 THROUGH July 31
|
||||
.fi
|
||||
.PP
|
||||
The first example specifies a holiday that occurs on the same date each
|
||||
@@ -1561,9 +1583,7 @@ equivalent:
|
||||
.fi
|
||||
.PP
|
||||
The \fBTHROUGH\fR keyword lets you conveniently OMIT a range of days.
|
||||
The starting and ending points must be fully-specified (ie, they must
|
||||
include day, month and year.). For example, the following sequences
|
||||
are equivalent:
|
||||
For example, the following sequences are equivalent:
|
||||
.PP
|
||||
.nf
|
||||
OMIT 3 Jan 2011
|
||||
@@ -1575,12 +1595,28 @@ are equivalent:
|
||||
OMIT 3 Jan 2011 THROUGH 5 Jan 2011
|
||||
.fi
|
||||
.PP
|
||||
You can make a THROUGH \fBOMIT\fR do double-duty as a \fBREM\fR command:
|
||||
You can make a THROUGH \fBOMIT\fR do double-duty as a \fBREM\fR command as
|
||||
long as both dates are fully specified
|
||||
.PP
|
||||
.nf
|
||||
OMIT 6 Sep 2010 THROUGH 10 Sep 2010 MSG Vacation
|
||||
.fi
|
||||
|
||||
.PP
|
||||
If you use a THROUGH clause, then either the year must be supplied before
|
||||
and after the THROUGH, or it must be missing before and after the THROUGH.
|
||||
The following are legal:
|
||||
.PP
|
||||
.nf
|
||||
OMIT 25 Dec THROUGH 6 Jan
|
||||
OMIT 25 Dec 2024 THROUGH 6 Jan 2025
|
||||
.fi
|
||||
.PP
|
||||
But the following are not:
|
||||
.PP
|
||||
.nf
|
||||
OMIT 25 Dec THROUGH 6 Jan 2025
|
||||
OMIT 25 Dec 2024 THROUGH 6 Jan
|
||||
.nf
|
||||
.PP
|
||||
You can debug your global OMITs with the following command:
|
||||
.PP
|
||||
@@ -2323,9 +2359,10 @@ the decimal point must be a period (".").
|
||||
.PP
|
||||
For example, the coordinates of the Statue of Liberty in New York City
|
||||
are approximately set by:
|
||||
.PP
|
||||
.nf
|
||||
SET $Latitude "40.68933"
|
||||
SET $Longitude "-74.04454"
|
||||
SET $Latitude "40.68933"
|
||||
SET $Longitude "-74.04454"
|
||||
.fi
|
||||
.RE
|
||||
.TP
|
||||
@@ -2441,6 +2478,20 @@ order, or 2 if sorting by time in descending order.
|
||||
The number of spaces by which all lines (except the first) of an
|
||||
\fBMSF\fR-type reminder should be indented. The default is 0.
|
||||
.TP
|
||||
.B $SuppressLRM
|
||||
Normally, when Remind is run with the \fB\-c\fR option in a UTF-8 locale,
|
||||
it emits a left-to-right mark sequence after printing day names or
|
||||
reminders. Some terminals render this incorrectly, so you can use:
|
||||
.RS
|
||||
.PP
|
||||
.nf
|
||||
SET $SuppressLRM 1
|
||||
.fi
|
||||
.PP
|
||||
at the top of your reminder file to suppress the LRM sequences, or you
|
||||
can invoke Remind with the option \fB'\-i$SuppressLRM=1'\fR.
|
||||
.RE
|
||||
.TP
|
||||
.B $SysInclude (read-only, STRING type)
|
||||
A directory path containing standard reminder scripts. Currently,
|
||||
Remind ships with some standard holiday files and language packs.
|
||||
@@ -3048,6 +3099,7 @@ be right-padded.
|
||||
.RS
|
||||
.PP
|
||||
Here are some examples:
|
||||
.PP
|
||||
.nf
|
||||
pad(3, "0", 2) --> "03"
|
||||
pad(465, "0", 2) --> "465"
|
||||
@@ -3205,7 +3257,7 @@ takes \fIa\fR back to 2009-05-13.
|
||||
.TP
|
||||
.B strlen(s_str)
|
||||
Returns the length of \fIstr\fR. If the length of \fIstr\fR is too large
|
||||
to represent as an integers, emits a "Number too high" error.
|
||||
to represent as an integer, emits a "Number too high" error.
|
||||
.TP
|
||||
.B substr(s_str, i_start [,i_end])
|
||||
Returns a \fBSTRING\fR consisting of all characters in \fIstr\fR from
|
||||
@@ -3266,6 +3318,7 @@ non-zero trigger date.
|
||||
\fBIFTRIG\fR. For example, if you have meetings every Monday in
|
||||
June and July, and you want warnings 3 days in advance, you
|
||||
could use:
|
||||
.PP
|
||||
.nf
|
||||
REM [trig("Mon Jun +3", "Mon July +3")] +3 MSG Meeting %b
|
||||
.fi
|
||||
@@ -4782,13 +4835,14 @@ reminder and \fItime\fR which is the trigger time.
|
||||
.TP
|
||||
.B subst_Nx(alt, date, time)
|
||||
Again, this is a \fIfamily\fR of functions. It is similar to the
|
||||
\fBsubst_x\fR family except it is only called if \fIdate\fR is two or
|
||||
\fBsubst_N\fR family except it is only called if \fIdate\fR is two or
|
||||
more days away from \fItoday()\fR. This is useful if you don't want to
|
||||
override the "today" or "tomorrow" output for most substitution sequences.
|
||||
.PP
|
||||
Here's an example of how you might customize your substitution filter.
|
||||
Suppose you want to change the "%b" sequence to substitute "the day
|
||||
after tomorrow" for an event two days from now. You could do this:
|
||||
.PP
|
||||
.nf
|
||||
FSET subst_bx(a,d,t) iif(d==today()+2, "the day after tomorrow", \
|
||||
"in " + (d-today()) + " days' time")
|
||||
@@ -4799,6 +4853,7 @@ after tomorrow" for an event two days from now. You could do this:
|
||||
.fi
|
||||
.PP
|
||||
The output of this script is:
|
||||
.PP
|
||||
.nf
|
||||
Event 1 is in 3 days' time
|
||||
Event 2 is the day after tomorrow
|
||||
@@ -4811,6 +4866,15 @@ time", and note also that the "tomorrow" and "today" events used the
|
||||
normal substitution---\fBsubst_bx\fR is not called for trigger days of
|
||||
today or tomorrow.
|
||||
.PP
|
||||
As a special case, if a \fBsubst_Nx\fB or \fBsubst_N\fR function
|
||||
returns the integer zero, then the normal substitution mechanism is
|
||||
used. Therefore, the previous example could have been written more simply
|
||||
as:
|
||||
.PP
|
||||
.nf
|
||||
FSET subst_bx(a,d,t) iif(d==today()+2, "the day after tomorrow", 0)
|
||||
.fi
|
||||
.PP
|
||||
.SH LANGUAGE PACKS
|
||||
.PP
|
||||
\fBRemind\fR ships with a number of language packs, which are simply reminder
|
||||
@@ -4823,12 +4887,14 @@ pl.rem (Polish), pt.rem (Portuguese) and ro.rem (Romanian).
|
||||
.PP
|
||||
To use a language pack (in this example, de.rem), simply place this at
|
||||
the top of your reminders file:
|
||||
.PP
|
||||
.nf
|
||||
INCLUDE [$SysInclude]/lang/de.rem
|
||||
.fi
|
||||
.PP
|
||||
If you want \fBRemind\fR to try to find the language pack appropriate
|
||||
for your locale settings, use:
|
||||
.PP
|
||||
.nf
|
||||
INCLUDE [$SysInclude]/lang/auto.rem
|
||||
.fi
|
||||
@@ -5043,10 +5109,12 @@ should attempt to support. They are currently supported by
|
||||
.PP
|
||||
The \fBSHADE\fR special replaces the \fBpsshade()\fR function.
|
||||
Use it like this:
|
||||
.PP
|
||||
.nf
|
||||
REM Sat Sun SPECIAL SHADE 128
|
||||
REM Mon SPECIAL SHADE 255 0 0
|
||||
.fi
|
||||
.PP
|
||||
The \fBSHADE\fR keyword is followed by either one or three numbers,
|
||||
from 0 to 255. If one number is supplied, it is interpreted as
|
||||
a grey-scale value from black (0) to white (255). If three numbers
|
||||
@@ -5057,14 +5125,17 @@ in calendars produced by \fBRem2PS\fR, \fBtkremind\fR and \fBrem2html\fR.)
|
||||
.PP
|
||||
The \fBMOON\fR special replaces the \fBpsmoon()\fR function. Use it
|
||||
like this:
|
||||
.PP
|
||||
.nf
|
||||
REM [moondate(0)] SPECIAL MOON 0
|
||||
REM [moondate(1)] SPECIAL MOON 1
|
||||
REM [moondate(2)] SPECIAL MOON 2
|
||||
REM [moondate(3)] SPECIAL MOON 3
|
||||
.fi
|
||||
.PP
|
||||
These draw little moons on the various calendars. The complete syntax
|
||||
of the \fBMOON\fR special is as follows:
|
||||
.PP
|
||||
.nf
|
||||
... SPECIAL MOON phase moonsize fontsize msg
|
||||
.fi
|
||||
@@ -5085,12 +5156,12 @@ and \fIfontsize\fR; the other backends use fixed sizes.
|
||||
.PP
|
||||
The \fBCOLOR\fR special lets you place colored reminders in the
|
||||
calendar. Use it like this:
|
||||
|
||||
.PP
|
||||
.nf
|
||||
REM ... SPECIAL COLOR 255 0 0 This is a bright red reminder
|
||||
REM ... SPECIAL COLOR 0 128 0 This is a dark green reminder
|
||||
.fi
|
||||
|
||||
.PP
|
||||
You can spell COLOR either the American way ("COLOR") or the British
|
||||
way ("COLOUR"). This manual will use the American way.
|
||||
|
||||
@@ -5111,11 +5182,11 @@ number in the calendar. For example, this would number each Monday
|
||||
with the ISO 8601 week number. The week number is shown like this:
|
||||
"(W\fIn\fR)" in this example, but you can put whatever text you like
|
||||
after the WEEK keyword.
|
||||
|
||||
.PP
|
||||
.nf
|
||||
REM Monday SPECIAL WEEK (W[weekno()])
|
||||
.fi
|
||||
|
||||
.PP
|
||||
.SH MISCELLANEOUS
|
||||
.PP
|
||||
.B COMMAND ABBREVIATIONS
|
||||
@@ -5373,9 +5444,6 @@ are not implemented as read-only system variables.
|
||||
.PP
|
||||
Hebrew dates in \fBRemind\fR change at midnight instead of sunset.
|
||||
.PP
|
||||
Language should be selectable at run-time, not compile-time. Don't
|
||||
expect this to happen soon!
|
||||
.PP
|
||||
\fBRemind\fR has some built-in limits (for example, number of global
|
||||
\fBOMIT\fRs.)
|
||||
.PP
|
||||
|
||||
@@ -18,13 +18,13 @@ as well as the tcllib extension. It also requires a \fBwish\fR
|
||||
binary. If you are using Tcl/Tk 8.5, you may also need either the Img
|
||||
or the tkpng extension to handle PNG images.
|
||||
|
||||
.SH OPTIONS
|
||||
\fBTkRemind\fR itself has no options. However, it passes certain options
|
||||
on to \fBRemind\fR. The options it passes are
|
||||
\fB\-b\fR, \fB\-g\fR, \fB\-x\fR, \fB\-i\fR and \fB\-m\fR.
|
||||
See the \fBRemind\fR man page for details about the options.
|
||||
Note that \fBTkRemind\fR will respect the \fB\-m\fR and
|
||||
\fB\-b1\fR options and adjust its appearance accordingly.
|
||||
.SH COMMAND-LINE OPTIONS
|
||||
\fBTkRemind\fR itself has no command-line options. However, it passes
|
||||
certain options on to \fBRemind\fR. The options it passes are
|
||||
\fB\-b\fR, \fB\-g\fR, \fB\-x\fR, \fB\-i\fR and \fB\-m\fR. See the
|
||||
\fBRemind\fR man page for details about the options. Note that
|
||||
\fBTkRemind\fR will respect the \fB\-m\fR and \fB\-b1\fR options and
|
||||
adjust its appearance accordingly.
|
||||
|
||||
\fIRead_file\fR is the file from which \fBTkRemind\fR reads reminders.
|
||||
It is in standard \fBRemind\fR format. \fIWrite_file\fR is the file
|
||||
@@ -44,8 +44,14 @@ include the line:
|
||||
.PP
|
||||
|
||||
\fIConfig_file\fR is the file in which \fBTkRemind\fR stores
|
||||
its options. If it is omitted, it defaults to \fI$HOME/.tkremindrt\fR.
|
||||
its options. If it is omitted, it defaults to \fI$HOME/.config/tkremindrc\fR.
|
||||
|
||||
.PP
|
||||
If \fB$HOME/.reminders\fR is a \fIdirectory\fR, then \fBTkRemind\fR defaults to
|
||||
reading \fB$HOME/.reminders\fR and writing new reminders to
|
||||
\fB$HOME/.reminders/100-tkremind.rem\fR. If you want to keep your
|
||||
reminders in a directory \fB$HOME/.reminders\fR, you should create that
|
||||
directory before starting \fBTkRemind\fR.
|
||||
.SH THE CALENDAR WINDOW
|
||||
When you start \fBTkRemind\fR, it displays a calendar for the current
|
||||
month, with today's date highlighted. Reminders are filled into each
|
||||
@@ -274,7 +280,7 @@ Similar to Change entry font, but applies to calendar heading
|
||||
.PP
|
||||
Once you've configured the options the way you like them,
|
||||
press \fBApply Options\fR to put them into effect, \fBSave Options\fR
|
||||
to put them into effect and save them in $HOME/.tkremindrc, or
|
||||
to put them into effect and save them in $HOME/.config/tkremindrc, or
|
||||
\fBCancel\fR to cancel any changes you made.
|
||||
|
||||
.SH KEYBOARD SHORTCUTS
|
||||
@@ -293,6 +299,19 @@ Next Month
|
||||
.B Home
|
||||
Today
|
||||
|
||||
.SH IMMEDIATE UPDATES
|
||||
|
||||
If you are running \fBTkRemind\fR on Linux and have the
|
||||
\fBinotifywait\fR program installed (part of the \fBinotify-tools\fR
|
||||
or similar package), then \fBTkRemind\fR redraws the calendar window
|
||||
\fIimmediately\fR if \fB$HOME/.reminders\fR changes (or, if it is a
|
||||
directory, any files in that directory change.)
|
||||
.PP
|
||||
This lets \fBTkRemind\fR react immediately to hand-edited reminders or
|
||||
to reminder files that are imported from another calendar system (for example,
|
||||
you may have a cron job that periodically imports your Google Calendar
|
||||
entries into Remind format.)
|
||||
|
||||
.SH ODDS AND ENDS
|
||||
\fBTkRemind\fR performs some basic consistency checks when you add or
|
||||
preview a reminder. However, if you edit a reminder in the previewer,
|
||||
@@ -323,8 +342,7 @@ You can use this to activate certain reminders in different ways
|
||||
for \fBTkRemind\fR (for example).
|
||||
.PP
|
||||
\fBTkRemind\fR uses tags to keep track of reminders in the
|
||||
script file. It also places special comments in the reminder
|
||||
file to store additional state. You can certainly mix
|
||||
script file. You can certainly mix
|
||||
"hand-crafted" reminders with reminders created by \fBTkRemind\fR
|
||||
if you are aware of the following rules and limitations:
|
||||
.TP
|
||||
@@ -334,15 +352,16 @@ where \fInnn\fR is a number. You should not use such \fBTAG\fRs
|
||||
in hand-crafted reminders.
|
||||
.TP
|
||||
o
|
||||
Do not edit lines starting with "# TKTAGnnn", "# TKEND", or any
|
||||
lines in between. You can move such lines, but be careful to move
|
||||
them as a single block.
|
||||
.TP
|
||||
o
|
||||
Hand-crafted reminders cannot be edited with \fBTkRemind\fR, and
|
||||
for hand-crafted timed reminders, you will not be presented with
|
||||
the "Don't remind me again" option when they pop up.
|
||||
|
||||
.PP
|
||||
However, rather than mixing hand-edited files with \fBTkRemind\fR-generated
|
||||
ones, it is better to make \fB$HOME/.reminders\fR a directory and keep
|
||||
your hand-edited files in a separate \fB*.rem\fR file than \fBTkRemind\fR's
|
||||
\fB100-tkremind.rem\fR file.
|
||||
|
||||
.SH SERVER MODE
|
||||
|
||||
\fBRemind\fR has a special mode for interacting with programs like
|
||||
@@ -400,13 +419,13 @@ This line is emitted in response to a \fBSTATUS\fR command. The number
|
||||
.SH AUTHOR
|
||||
TkRemind was written by Dianne Skoll <dianne@skoll.ca>
|
||||
|
||||
\fBTkRemind\fR is Copyright 1996-2020 by Dianne Skoll.
|
||||
\fBTkRemind\fR is Copyright 1996-2022 by Dianne Skoll.
|
||||
|
||||
.SH FILES
|
||||
|
||||
$HOME/.reminders -- default reminder file.
|
||||
$HOME/.reminders -- default reminder file or directory.
|
||||
|
||||
$HOME/.tkremindrc -- \fBTkRemind\fR saved options.
|
||||
$HOME/.config/tkremindrc -- \fBTkRemind\fR saved options.
|
||||
|
||||
.SH SEE ALSO
|
||||
\fBremind\fR, \fBrem2ps\fR, \fBrem2pdf\fR, \fBrem2html\fR
|
||||
|
||||
@@ -33,10 +33,16 @@ install:
|
||||
$(MAKE) install DESTDIR=$(DESTDIR) "INSTALL_BASE=$(INSTALL_BASE)" && exit 0; \
|
||||
elif test "$(prefix)" = "/usr" ; then \
|
||||
$(MAKE) install DESTDIR=$(DESTDIR) INSTALLDIRS=vendor && exit 0; \
|
||||
else \
|
||||
elif test "$(prefix)" = "/usr/local" ; then \
|
||||
$(MAKE) install DESTDIR=$(DESTDIR) && exit 0; \
|
||||
else \
|
||||
$(MAKE) install DESTDIR=$(DESTDIR) "INSTALL_BASE=$(prefix)" && exit 0; \
|
||||
fi; \
|
||||
exit 1;
|
||||
|
||||
Makefile: Makefile.PL
|
||||
$(PERL) Makefile.PL @PERLARTIFACTS@ INSTALL_BASE=$(INSTALL_BASE) || true
|
||||
if test "$(prefix)" != "/usr" -a "$(prefix)" != "/usr/local" -a "$(INSTALL_BASE)" = "" ; then \
|
||||
$(PERL) Makefile.PL @PERLARTIFACTS@ INSTALL_BASE=$(prefix) || true;\
|
||||
else \
|
||||
$(PERL) Makefile.PL @PERLARTIFACTS@ INSTALL_BASE=$(INSTALL_BASE) || true;\
|
||||
fi
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#!@PERL@
|
||||
use strict;
|
||||
use warnings;
|
||||
use lib '@prefix@/lib/perl5';
|
||||
|
||||
use Encode;
|
||||
use Cairo;
|
||||
|
||||
@@ -285,7 +285,7 @@ sub read_one_month_pp
|
||||
Given a hashref C<$hash> consisting of one entry parsed
|
||||
from the "remind -p" stream and a C<$specials_accepted> hash,
|
||||
return 1 if we should include this entry in the calendar or
|
||||
0 if mot.
|
||||
0 if not.
|
||||
|
||||
=cut
|
||||
sub accept_special
|
||||
|
||||
@@ -457,6 +457,7 @@ proc CreateCalFrame { w dayNames } {
|
||||
# Figure out reasonable height for text frames
|
||||
global SetFontsWorked
|
||||
global Option
|
||||
global MondayFirst
|
||||
set h [winfo screenheight .]
|
||||
if {$h <= 480} {
|
||||
if {$SetFontsWorked} {
|
||||
@@ -470,7 +471,6 @@ proc CreateCalFrame { w dayNames } {
|
||||
set h 5
|
||||
}
|
||||
|
||||
global MondayFirst
|
||||
frame $w -background $Option(LineColor)
|
||||
for {set i 0} {$i < 7} {incr i} {
|
||||
if {$MondayFirst} {
|
||||
@@ -547,7 +547,9 @@ proc ConfigureCalFrame { w firstDay numDays } {
|
||||
$w.t$i configure -state disabled -takefocus 0
|
||||
}
|
||||
for {set i $first} {$i <= $last} {incr i} {
|
||||
set row [expr ($i/7)+1]
|
||||
grid $w.f$i
|
||||
grid rowconfigure $w $row -weight 1
|
||||
pack $w.l$i -in $w.f$i -side top -expand 0 -fill x
|
||||
pack $w.t$i -in $w.f$i -side top -expand 1 -fill both
|
||||
raise $w.l$i
|
||||
@@ -581,7 +583,7 @@ proc ConfigureCalFrame { w firstDay numDays } {
|
||||
pack $w.t$i -in $w.f$i -side top -expand 1 -fill both
|
||||
raise $w.l$i
|
||||
raise $w.t$i
|
||||
grid rowconfigure $w [expr $row+1] -weight 1
|
||||
grid rowconfigure $w $row -weight 1
|
||||
}
|
||||
$w.l$i configure -text "" -command "" -state normal -relief flat -foreground $Option(LabelColor) -background $Option(WinBackground) -highlightcolor $Option(LineColor) -highlightbackground $Option(WinBackground)
|
||||
$w.l$i configure -state disabled
|
||||
@@ -1010,7 +1012,7 @@ proc ConfigureCalWindow { month year firstDay numDays } {
|
||||
proc FillCalWindow {} {
|
||||
set FileName ""
|
||||
set LineNo 0
|
||||
global DayNames CurYear CurMonth MonthNames CommandLine Option TagToObj RemindErrors
|
||||
global DayNames CurYear CurMonth MonthNames CommandLine Option TagToObj RemindErrors MondayFirst
|
||||
|
||||
array unset TagToObj
|
||||
|
||||
@@ -1049,7 +1051,12 @@ proc FillCalWindow {} {
|
||||
|
||||
# Update the day names in the calendar window
|
||||
for {set i 0} {$i < 7} {incr i} {
|
||||
.cal.day$i configure -text [lindex $DayNames $i]
|
||||
if {$MondayFirst} {
|
||||
set index [expr ($i+1)%7]
|
||||
} else {
|
||||
set index $i
|
||||
}
|
||||
.cal.day$i configure -text [lindex $DayNames $index]
|
||||
}
|
||||
set offset [CalEntryOffset $firstWkday]
|
||||
|
||||
|
||||
@@ -259,6 +259,10 @@ static void WriteCalDays (void);
|
||||
static void
|
||||
send_lrm(void)
|
||||
{
|
||||
/* Don't send LRM if SuppressLRM is set */
|
||||
if (SuppressLRM) {
|
||||
return;
|
||||
}
|
||||
/* Send a lrm control sequence if UseUTF8Chars is enabled
|
||||
or char encoding is UTF-8
|
||||
*/
|
||||
|
||||
@@ -229,14 +229,17 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
|
||||
expr = (char const *) s;
|
||||
r = EvalExpr(&expr, &v, NULL);
|
||||
if (r == OK) {
|
||||
if (!DoCoerce(STR_TYPE, &v)) {
|
||||
if (DBufPuts(dbuf, v.v.str) != OK) {
|
||||
DestroyValue(v);
|
||||
return E_NO_MEM;
|
||||
if (v.type != INT_TYPE || v.v.val != 0) {
|
||||
if (!DoCoerce(STR_TYPE, &v)) {
|
||||
if (DBufPuts(dbuf, v.v.str) != OK) {
|
||||
DestroyValue(v);
|
||||
return E_NO_MEM;
|
||||
}
|
||||
}
|
||||
DestroyValue(v);
|
||||
continue;
|
||||
}
|
||||
DestroyValue(v);
|
||||
continue;
|
||||
} else {
|
||||
Eprint("%s", ErrMsg[r]);
|
||||
}
|
||||
@@ -301,14 +304,17 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
|
||||
expr = (char const *) s;
|
||||
r = EvalExpr(&expr, &v, NULL);
|
||||
if (r == OK) {
|
||||
if (!DoCoerce(STR_TYPE, &v)) {
|
||||
if (DBufPuts(dbuf, v.v.str) != OK) {
|
||||
DestroyValue(v);
|
||||
return E_NO_MEM;
|
||||
if (v.type != INT_TYPE || v.v.val != 0) {
|
||||
if (!DoCoerce(STR_TYPE, &v)) {
|
||||
if (DBufPuts(dbuf, v.v.str) != OK) {
|
||||
DestroyValue(v);
|
||||
return E_NO_MEM;
|
||||
}
|
||||
}
|
||||
DestroyValue(v);
|
||||
continue;
|
||||
}
|
||||
DestroyValue(v);
|
||||
continue;
|
||||
} else {
|
||||
Eprint("%s", ErrMsg[r]);
|
||||
}
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
#define E_MON_TWICE 51
|
||||
#define E_DAY_TWICE 52
|
||||
#define E_UNKNOWN_TOKEN 53
|
||||
#define E_SPEC_MON_DAY 54
|
||||
#define E_SPEC_MON 54
|
||||
#define E_2MANY_PART 55
|
||||
#define E_2MANY_FULL 56
|
||||
#define E_PUSH_NOPOP 57
|
||||
@@ -187,7 +187,7 @@ EXTERN char *ErrMsg[]
|
||||
"Month specified twice",
|
||||
"Day specified twice",
|
||||
"Unknown token",
|
||||
"Must specify month and day in OMIT command",
|
||||
"Must specify month in OMIT command",
|
||||
"Too many partial OMITs",
|
||||
"Too many full OMITs",
|
||||
"Warning: PUSH-OMIT-CONTEXT without matching POP-OMIT-CONTEXT",
|
||||
|
||||
10
src/expr.c
10
src/expr.c
@@ -84,10 +84,12 @@ Operator UnOp[] = {
|
||||
|
||||
extern BuiltinFunc Func[];
|
||||
|
||||
Operator OpStack[OP_STACK_SIZE];
|
||||
Value ValStack[VAL_STACK_SIZE];
|
||||
int OpStackPtr = 0;
|
||||
int ValStackPtr = 0;
|
||||
static Operator OpStack[OP_STACK_SIZE];
|
||||
static int OpStackPtr = 0;
|
||||
|
||||
/* ValStack can't be static - needed by funcs.c */
|
||||
Value ValStack[VAL_STACK_SIZE];
|
||||
int ValStackPtr = 0;
|
||||
|
||||
/***************************************************************/
|
||||
/* */
|
||||
|
||||
@@ -313,6 +313,12 @@ EXTERN char *DynamicWas
|
||||
|
||||
EXTERN char *SysDir
|
||||
#ifdef MK_GLOBALS
|
||||
= STRSYSDIR(SYSDIR);
|
||||
= STRSYSDIR(SYSDIR)
|
||||
#endif
|
||||
;
|
||||
|
||||
EXTERN int SuppressLRM
|
||||
#ifdef MK_GLOBALS
|
||||
= 0
|
||||
#endif
|
||||
;
|
||||
|
||||
@@ -195,7 +195,7 @@ EXTERN char *ErrMsg[] =
|
||||
"Kuukausi annettu kahdesti",
|
||||
"Päivä annettu kahdesti",
|
||||
"Tuntematon sana tai merkki",
|
||||
"OMIT-komennossa on annettava kuukausi ja päivä",
|
||||
"OMIT-komennossa on annettava kuukausi",
|
||||
"Liian monta osittaista OMIT-komentoa",
|
||||
"Liian monta täydellistä OMIT-komentoa",
|
||||
"Varoitus: PUSH-OMIT-CONTEXT ilman POP-OMIT-CONTEXTia",
|
||||
|
||||
@@ -185,7 +185,7 @@ EXTERN char *ErrMsg[] =
|
||||
"Miesiąc podany dwókrotnie",
|
||||
"Dzień podany dwókrotnie",
|
||||
"Nieznane słowo",
|
||||
"W komendzie OMIT trzeba podać miesiąc i dzień",
|
||||
"W komendzie OMIT trzeba podać miesiąc",
|
||||
"Za dużo częściowych komend OMIT",
|
||||
"Za dużo pełnych komend OMIT",
|
||||
"Ostrzeżenie: PUSH-OMIT-CONTEXT bez POP-OMIT-CONTEXT",
|
||||
|
||||
@@ -194,7 +194,7 @@ EXTERN char *ErrMsg[] =
|
||||
"Mes especificado duas vezes",
|
||||
"Dia especificado duas vezes",
|
||||
"Token desconhecido",
|
||||
"Mes e dia devem ser especificados no comando OMIT",
|
||||
"O mes deve ser especificados no comando OMIT",
|
||||
"Muitos OMITs parciais",
|
||||
"Muitos OMITs full",
|
||||
"Aviso: PUSH-OMIT-CONTEXT sem POP-OMIT-CONTEXT correspondente",
|
||||
|
||||
214
src/omit.c
214
src/omit.c
@@ -271,7 +271,6 @@ static void InsertIntoSortedArray(int *array, int num, int key)
|
||||
*cur = key;
|
||||
}
|
||||
|
||||
static int DoThroughOmit(ParsePtr p, int y, int m, int d);
|
||||
static void DumpOmits(void);
|
||||
|
||||
/***************************************************************/
|
||||
@@ -283,11 +282,15 @@ static void DumpOmits(void);
|
||||
/***************************************************************/
|
||||
int DoOmit(ParsePtr p)
|
||||
{
|
||||
int y = NO_YR, m = NO_MON, d = NO_DAY, r;
|
||||
int y[2] = {NO_YR, NO_YR}, m[2] = {NO_MON, NO_MON}, d[2] = {NO_DAY, NO_DAY}, r;
|
||||
Token tok;
|
||||
int parsing=1;
|
||||
int parsing = 1;
|
||||
int seen_through = 0;
|
||||
int syndrome;
|
||||
int not_first_token = -1;
|
||||
int start, end, tmp;
|
||||
|
||||
int mc, dc;
|
||||
|
||||
DynamicBuffer buf;
|
||||
DBufInit(&buf);
|
||||
@@ -308,28 +311,28 @@ int DoOmit(ParsePtr p)
|
||||
|
||||
case T_Date:
|
||||
DBufFree(&buf);
|
||||
if (y != NO_YR) return E_YR_TWICE;
|
||||
if (m != NO_MON) return E_MON_TWICE;
|
||||
if (d != NO_DAY) return E_DAY_TWICE;
|
||||
FromJulian(tok.val, &y, &m, &d);
|
||||
if (y[seen_through] != NO_YR) return E_YR_TWICE;
|
||||
if (m[seen_through] != NO_MON) return E_MON_TWICE;
|
||||
if (d[seen_through] != NO_DAY) return E_DAY_TWICE;
|
||||
FromJulian(tok.val, &y[seen_through], &m[seen_through], &d[seen_through]);
|
||||
break;
|
||||
|
||||
case T_Year:
|
||||
DBufFree(&buf);
|
||||
if (y != NO_YR) return E_YR_TWICE;
|
||||
y = tok.val;
|
||||
if (y[seen_through] != NO_YR) return E_YR_TWICE;
|
||||
y[seen_through] = tok.val;
|
||||
break;
|
||||
|
||||
case T_Month:
|
||||
DBufFree(&buf);
|
||||
if (m != NO_MON) return E_MON_TWICE;
|
||||
m = tok.val;
|
||||
if (m[seen_through] != NO_MON) return E_MON_TWICE;
|
||||
m[seen_through] = tok.val;
|
||||
break;
|
||||
|
||||
case T_Day:
|
||||
DBufFree(&buf);
|
||||
if (d != NO_DAY) return E_DAY_TWICE;
|
||||
d = tok.val;
|
||||
if (d[seen_through] != NO_DAY) return E_DAY_TWICE;
|
||||
d[seen_through] = tok.val;
|
||||
break;
|
||||
|
||||
case T_Delta:
|
||||
@@ -338,8 +341,9 @@ int DoOmit(ParsePtr p)
|
||||
|
||||
case T_Through:
|
||||
DBufFree(&buf);
|
||||
if (y == NO_YR || m == NO_MON || d == NO_DAY) return E_INCOMPLETE;
|
||||
return DoThroughOmit(p, y, m, d);
|
||||
if (seen_through) return E_UNTIL_TWICE;
|
||||
seen_through = 1;
|
||||
break;
|
||||
|
||||
case T_Empty:
|
||||
case T_Comment:
|
||||
@@ -358,26 +362,85 @@ int DoOmit(ParsePtr p)
|
||||
return E_UNKNOWN_TOKEN;
|
||||
}
|
||||
}
|
||||
if (m == NO_MON || d == NO_DAY) return E_SPEC_MON_DAY;
|
||||
|
||||
if (y == NO_YR) {
|
||||
if (NumPartialOmits == MAX_PARTIAL_OMITS) return E_2MANY_PART;
|
||||
|
||||
if (d > MonthDays[m]) return E_BAD_DATE;
|
||||
syndrome = (m<<5) + d;
|
||||
if (!BexistsIntArray(PartialOmitArray, NumPartialOmits, syndrome)) {
|
||||
InsertIntoSortedArray(PartialOmitArray, NumPartialOmits, syndrome);
|
||||
NumPartialOmits++;
|
||||
}
|
||||
if (!seen_through) {
|
||||
/* We must have at least a month */
|
||||
if (m[0] == NO_MON) return E_SPEC_MON;
|
||||
m[1] = m[0];
|
||||
y[1] = y[0];
|
||||
if (d[0] == NO_DAY) {
|
||||
d[0] = 1;
|
||||
if (y[0] == NO_YR) {
|
||||
d[1] = MonthDays[m[0]];
|
||||
} else {
|
||||
d[1] = DaysInMonth(m[0], y[0]);
|
||||
}
|
||||
} else {
|
||||
d[1] = d[0];
|
||||
m[1] = m[0];
|
||||
y[1] = y[0];
|
||||
}
|
||||
} else {
|
||||
|
||||
if (d > DaysInMonth(m, y)) return E_BAD_DATE;
|
||||
syndrome = Julian(y, m, d);
|
||||
r = AddGlobalOmit(syndrome);
|
||||
if (r) {
|
||||
return r;
|
||||
if (m[0] == NO_MON) return E_SPEC_MON;
|
||||
if (m[1] == NO_MON) return E_SPEC_MON;
|
||||
if ((y[0] != NO_YR && y[1] == NO_YR) ||
|
||||
(y[0] == NO_YR && y[1] != NO_YR)) {
|
||||
return E_BAD_DATE;
|
||||
}
|
||||
if (d[0] == NO_DAY) d[0] = 1;
|
||||
if (d[1] == NO_DAY) {
|
||||
if (y[1] == NO_YR) {
|
||||
d[1] = MonthDays[m[1]];
|
||||
} else {
|
||||
d[1] = DaysInMonth(m[1], y[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (y[0] == NO_YR) {
|
||||
/* Partial OMITs */
|
||||
if (d[0] > MonthDays[m[0]]) return E_BAD_DATE;
|
||||
if (d[1] > MonthDays[m[1]]) return E_BAD_DATE;
|
||||
dc = d[0];
|
||||
mc = m[0];
|
||||
while(1) {
|
||||
syndrome = (mc<<5) + dc;
|
||||
if (!BexistsIntArray(PartialOmitArray, NumPartialOmits, syndrome)) {
|
||||
InsertIntoSortedArray(PartialOmitArray, NumPartialOmits, syndrome);
|
||||
NumPartialOmits++;
|
||||
}
|
||||
if (mc == m[1] && dc == d[1]) {
|
||||
break;
|
||||
}
|
||||
dc++;
|
||||
if (dc > MonthDays[mc]) {
|
||||
dc = 1;
|
||||
mc++;
|
||||
if (mc > 11) {
|
||||
mc = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* Full OMITs */
|
||||
if (d[0] > DaysInMonth(m[0], y[0])) return E_BAD_DATE;
|
||||
if (d[1] > DaysInMonth(m[1], y[1])) return E_BAD_DATE;
|
||||
start = Julian(y[0], m[0], d[0]);
|
||||
end = Julian(y[1], m[1], d[1]);
|
||||
if (end < start) {
|
||||
Eprint("Error: THROUGH date earlier than start date");
|
||||
return E_BAD_DATE;
|
||||
}
|
||||
|
||||
for (tmp = start; tmp <= end; tmp++) {
|
||||
if (!BexistsIntArray(FullOmitArray, NumFullOmits, tmp)) {
|
||||
if (NumFullOmits >= MAX_FULL_OMITS) return E_2MANY_FULL;
|
||||
InsertIntoSortedArray(FullOmitArray, NumFullOmits, tmp);
|
||||
NumFullOmits++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (tok.type == T_Tag || tok.type == T_Duration || tok.type == T_RemType || tok.type == T_Priority) return E_PARSE_AS_REM;
|
||||
return OK;
|
||||
|
||||
@@ -394,95 +457,6 @@ AddGlobalOmit(int jul)
|
||||
return OK;
|
||||
}
|
||||
|
||||
static int
|
||||
DoThroughOmit(ParsePtr p, int ystart, int mstart, int dstart)
|
||||
{
|
||||
int yend = NO_YR, mend = NO_MON, dend = NO_DAY, r;
|
||||
int start, end, tmp;
|
||||
int parsing = 1;
|
||||
|
||||
Token tok;
|
||||
|
||||
DynamicBuffer buf;
|
||||
DBufInit(&buf);
|
||||
|
||||
while(parsing) {
|
||||
if ( (r=ParseToken(p, &buf)) ) return r;
|
||||
FindToken(DBufValue(&buf), &tok);
|
||||
|
||||
switch(tok.type) {
|
||||
case T_Date:
|
||||
DBufFree(&buf);
|
||||
if (yend != NO_YR) return E_YR_TWICE;
|
||||
if (mend != NO_MON) return E_MON_TWICE;
|
||||
if (dend != NO_DAY) return E_DAY_TWICE;
|
||||
FromJulian(tok.val, ¥d, &mend, &dend);
|
||||
break;
|
||||
|
||||
case T_Year:
|
||||
DBufFree(&buf);
|
||||
if (yend != NO_YR) return E_YR_TWICE;
|
||||
yend = tok.val;
|
||||
break;
|
||||
|
||||
case T_Month:
|
||||
DBufFree(&buf);
|
||||
if (mend != NO_MON) return E_MON_TWICE;
|
||||
mend = tok.val;
|
||||
break;
|
||||
|
||||
case T_Day:
|
||||
DBufFree(&buf);
|
||||
if (dend != NO_DAY) return E_DAY_TWICE;
|
||||
dend = tok.val;
|
||||
break;
|
||||
|
||||
case T_Empty:
|
||||
case T_Comment:
|
||||
case T_RemType:
|
||||
case T_Priority:
|
||||
case T_Tag:
|
||||
case T_Duration:
|
||||
DBufFree(&buf);
|
||||
parsing = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
Eprint("%s: `%s' (OMIT)", ErrMsg[E_UNKNOWN_TOKEN],
|
||||
DBufValue(&buf));
|
||||
DBufFree(&buf);
|
||||
return E_UNKNOWN_TOKEN;
|
||||
|
||||
}
|
||||
}
|
||||
if (yend == NO_YR || mend == NO_MON || dend == NO_DAY) return E_INCOMPLETE;
|
||||
if (dend > DaysInMonth(mend, yend)) return E_BAD_DATE;
|
||||
if (dstart > DaysInMonth(mstart, ystart)) return E_BAD_DATE;
|
||||
|
||||
start = Julian(ystart, mstart, dstart);
|
||||
end = Julian(yend, mend, dend);
|
||||
|
||||
if (end < start) {
|
||||
Wprint("Warning: Swapping dates on OMIT ... THROUGH ... line");
|
||||
tmp = start;
|
||||
start = end;
|
||||
end = tmp;
|
||||
}
|
||||
|
||||
tmp = end - start + 1;
|
||||
|
||||
/* Don't create any OMITs if there would be too many. */
|
||||
if (NumFullOmits + tmp >= MAX_FULL_OMITS) return E_2MANY_FULL;
|
||||
for (tmp = start; tmp <= end; tmp++) {
|
||||
if (!BexistsIntArray(FullOmitArray, NumFullOmits, tmp)) {
|
||||
InsertIntoSortedArray(FullOmitArray, NumFullOmits, tmp);
|
||||
NumFullOmits++;
|
||||
}
|
||||
}
|
||||
if (tok.type == T_Tag || tok.type == T_Duration || tok.type == T_RemType || tok.type == T_Priority) return E_PARSE_AS_REM;
|
||||
return OK;
|
||||
}
|
||||
|
||||
void
|
||||
DumpOmits(void)
|
||||
{
|
||||
|
||||
@@ -184,7 +184,9 @@ void HandleQueuedReminders(void)
|
||||
while (TimeToSleep > 0L) {
|
||||
SleepTime = TimeToSleep;
|
||||
|
||||
if (Daemon > 0 && SleepTime > (unsigned int) 60*Daemon) SleepTime = 60*Daemon;
|
||||
if (Daemon > 0 && SleepTime > (unsigned int) 60*Daemon) {
|
||||
SleepTime = 60*Daemon;
|
||||
}
|
||||
|
||||
/* Wake up once a minute to recalibrate sleep time in
|
||||
case of laptop hibernation */
|
||||
|
||||
@@ -170,10 +170,11 @@ static int latitude_func(int do_set, Value *val)
|
||||
static int trig_date_func(int do_set, Value *val)
|
||||
{
|
||||
UNUSED(do_set);
|
||||
val->type = DATE_TYPE;
|
||||
if (!LastTrigValid) {
|
||||
val->type = INT_TYPE;
|
||||
val->v.val = 0;
|
||||
} else {
|
||||
val->type = DATE_TYPE;
|
||||
val->v.val = LastTriggerDate;
|
||||
}
|
||||
return OK;
|
||||
@@ -849,6 +850,7 @@ static SysVar SysVarArr[] = {
|
||||
{"SortByTime", 0, INT_TYPE, &SortByTime, 0, 0, NULL },
|
||||
{"SubsIndent", 1, INT_TYPE, &SubsIndent, 0, 132, NULL },
|
||||
{"Sunday", 1, STR_TYPE, &DynamicDayName[6], 0, 0, NULL },
|
||||
{"SuppressLRM", 1, INT_TYPE, &SuppressLRM, 0, 1, NULL },
|
||||
{"SysInclude", 0, STR_TYPE, &SysDir, 0, 0, NULL },
|
||||
{"T", 0, SPECIAL_TYPE, trig_date_func, 0, 0, NULL },
|
||||
{"Td", 0, SPECIAL_TYPE, trig_day_func, 0, 0, NULL },
|
||||
|
||||
@@ -328,6 +328,9 @@ fi
|
||||
../src/remind -w128 -c ../tests/utf-8.rem 1 Nov 2019 >> ../tests/test.out
|
||||
../src/remind -c ../tests/test-addomit.rem 1 Sep 2021 >> ../tests/test.out
|
||||
|
||||
../src/remind -cu ../tests/utf-8.rem 1 Nov 2019 >> ../tests/test.out
|
||||
../src/remind -cu '-i$SuppressLRM=1' ../tests/utf-8.rem 1 Nov 2019 >> ../tests/test.out
|
||||
|
||||
# Remove references to SysInclude, which is build-specific
|
||||
fgrep -v '$SysInclude' < ../tests/test.out > ../tests/test.out.1 && mv -f ../tests/test.out.1 ../tests/test.out
|
||||
cmp -s ../tests/test.out ../tests/test.cmp
|
||||
|
||||
371
tests/test.cmp
371
tests/test.cmp
@@ -1024,7 +1024,7 @@ set a057 value("a05"+"6")
|
||||
"a05" + "6" => "a056"
|
||||
value("a056") => "SDFJHSDF KSJDFH KJSDFH KSJDFH"
|
||||
set a058 version()
|
||||
version() => "04.00.00"
|
||||
version() => "04.00.02"
|
||||
set a059 wkday(today())
|
||||
today() => 1991-02-16
|
||||
wkday(1991-02-16) => "Saturday"
|
||||
@@ -2594,7 +2594,7 @@ a086 4
|
||||
a109 2012-01-01
|
||||
a128 2018-02-03@16:45
|
||||
a039 "February"
|
||||
a058 "04.00.00"
|
||||
a058 "04.00.02"
|
||||
a077 "1992 92
|
||||
"
|
||||
a096 -4
|
||||
@@ -2765,7 +2765,8 @@ Variable Value
|
||||
$SortByTime 0
|
||||
$SubsIndent 0 [0, 132]
|
||||
$Sunday "Sunday"
|
||||
$T 1990-01-01
|
||||
$SuppressLRM 0 [0, 1]
|
||||
$T 0
|
||||
$Td -1
|
||||
$Thursday "Thursday"
|
||||
$TimeSep ":"
|
||||
@@ -3942,6 +3943,118 @@ $MaxStringLen => 65535
|
||||
pad("foo", "0", 65536) => String too long
|
||||
../tests/test.rem(799): String too long
|
||||
|
||||
# Test OMIT
|
||||
CLEAR-OMIT-CONTEXT
|
||||
|
||||
OMIT Apr
|
||||
OMIT Jun THROUGH July 15
|
||||
OMIT Sep 5 THROUGH Sep 10
|
||||
OMIT 2024-12-25 THROUGH 2025-01-04
|
||||
OMIT Apr 2022 through July
|
||||
../tests/test.rem(808): Bad date specification
|
||||
|
||||
OMIT DUMP
|
||||
Global Full OMITs (11 of maximum allowed 1000):
|
||||
2024-12-25
|
||||
2024-12-26
|
||||
2024-12-27
|
||||
2024-12-28
|
||||
2024-12-29
|
||||
2024-12-30
|
||||
2024-12-31
|
||||
2025-01-01
|
||||
2025-01-02
|
||||
2025-01-03
|
||||
2025-01-04
|
||||
Global Partial OMITs (81 of maximum allowed 366):
|
||||
04-01
|
||||
04-02
|
||||
04-03
|
||||
04-04
|
||||
04-05
|
||||
04-06
|
||||
04-07
|
||||
04-08
|
||||
04-09
|
||||
04-10
|
||||
04-11
|
||||
04-12
|
||||
04-13
|
||||
04-14
|
||||
04-15
|
||||
04-16
|
||||
04-17
|
||||
04-18
|
||||
04-19
|
||||
04-20
|
||||
04-21
|
||||
04-22
|
||||
04-23
|
||||
04-24
|
||||
04-25
|
||||
04-26
|
||||
04-27
|
||||
04-28
|
||||
04-29
|
||||
04-30
|
||||
06-01
|
||||
06-02
|
||||
06-03
|
||||
06-04
|
||||
06-05
|
||||
06-06
|
||||
06-07
|
||||
06-08
|
||||
06-09
|
||||
06-10
|
||||
06-11
|
||||
06-12
|
||||
06-13
|
||||
06-14
|
||||
06-15
|
||||
06-16
|
||||
06-17
|
||||
06-18
|
||||
06-19
|
||||
06-20
|
||||
06-21
|
||||
06-22
|
||||
06-23
|
||||
06-24
|
||||
06-25
|
||||
06-26
|
||||
06-27
|
||||
06-28
|
||||
06-29
|
||||
06-30
|
||||
07-01
|
||||
07-02
|
||||
07-03
|
||||
07-04
|
||||
07-05
|
||||
07-06
|
||||
07-07
|
||||
07-08
|
||||
07-09
|
||||
07-10
|
||||
07-11
|
||||
07-12
|
||||
07-13
|
||||
07-14
|
||||
07-15
|
||||
09-05
|
||||
09-06
|
||||
09-07
|
||||
09-08
|
||||
09-09
|
||||
09-10
|
||||
CLEAR-OMIT-CONTEXT
|
||||
OMIT 2000-01-01 THROUGH 2020-12-31
|
||||
../tests/test.rem(812): Too many full OMITs
|
||||
|
||||
OMIT Dec 5 2029 through Dec 4 2029
|
||||
../tests/test.rem(814): Error: THROUGH date earlier than start date
|
||||
|
||||
# Don't want Remind to queue reminders
|
||||
EXIT
|
||||
|
||||
@@ -8017,4 +8130,256 @@ February 29
|
||||
| | | | | | | |
|
||||
| | | | | | | |
|
||||
+----------+----------+----------+----------+----------+----------+----------+
|
||||
┌────────────────────────────────────────────────────────────────────────────┐
|
||||
│ November 2019 │
|
||||
├──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┤
|
||||
│ Sunday │ Monday │ Tuesday │Wednesday │ Thursday │ Friday │ Saturday │
|
||||
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
|
||||
│ │ │ │ │ │1 │2 │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ │ │ │ │ │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ │ │ │ │ │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │עִבְרִית │עִבְרִית │
|
||||
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
|
||||
│3 │4 │5 │6 │7 │8 │9 │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ │ │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ │ │ │With tabs │ │ │ │
|
||||
│ │ │ │and │ │ │ │
|
||||
│ │ │ │spaces │ │ │ │
|
||||
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
|
||||
│10 │11 │12 │13 │14 │15 │16 │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ │ │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ │ │ │With tabs │ │ │ │
|
||||
│ │ │ │and │ │ │ │
|
||||
│ │ │ │spaces │ │ │ │
|
||||
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
|
||||
│17 │18 │19 │20 │21 │22 │23 │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ │ │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ │ │ │With tabs │ │ │ │
|
||||
│ │ │ │and │ │ │ │
|
||||
│ │ │ │spaces │ │ │ │
|
||||
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
|
||||
│24 │25 │26 │27 │28 │29 │30 │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ │ │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ │ │ │With tabs │ │ │ │
|
||||
│ │ │ │and │ │ │ │
|
||||
│ │ │ │spaces │ │ │ │
|
||||
└──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┘
|
||||
┌────────────────────────────────────────────────────────────────────────────┐
|
||||
│ November 2019 │
|
||||
├──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┤
|
||||
│ Sunday │ Monday │ Tuesday │Wednesday │ Thursday │ Friday │ Saturday │
|
||||
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
|
||||
│ │ │ │ │ │1 │2 │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ │ │ │ │ │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ │ │ │ │ │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │עִבְרִית │עִבְרִית │
|
||||
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
|
||||
│3 │4 │5 │6 │7 │8 │9 │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ │ │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ │ │ │With tabs │ │ │ │
|
||||
│ │ │ │and │ │ │ │
|
||||
│ │ │ │spaces │ │ │ │
|
||||
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
|
||||
│10 │11 │12 │13 │14 │15 │16 │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ │ │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ │ │ │With tabs │ │ │ │
|
||||
│ │ │ │and │ │ │ │
|
||||
│ │ │ │spaces │ │ │ │
|
||||
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
|
||||
│17 │18 │19 │20 │21 │22 │23 │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ │ │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ │ │ │With tabs │ │ │ │
|
||||
│ │ │ │and │ │ │ │
|
||||
│ │ │ │spaces │ │ │ │
|
||||
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
|
||||
│24 │25 │26 │27 │28 │29 │30 │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
|
||||
│ │ │ │ │ │ │ │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ │ │ │With tabs │ │ │ │
|
||||
│ │ │ │and │ │ │ │
|
||||
│ │ │ │spaces │ │ │ │
|
||||
└──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┘
|
||||
|
||||
|
||||
@@ -798,6 +798,21 @@ set a pad(11:33, " ", 12)
|
||||
set a pad(11:33, " ", 12, 1)
|
||||
set a pad("foo", "0", $MaxStringLen+1)
|
||||
|
||||
# Test OMIT
|
||||
CLEAR-OMIT-CONTEXT
|
||||
|
||||
OMIT Apr
|
||||
OMIT Jun THROUGH July 15
|
||||
OMIT Sep 5 THROUGH Sep 10
|
||||
OMIT 2024-12-25 THROUGH 2025-01-04
|
||||
OMIT Apr 2022 through July
|
||||
|
||||
OMIT DUMP
|
||||
CLEAR-OMIT-CONTEXT
|
||||
OMIT 2000-01-01 THROUGH 2020-12-31
|
||||
|
||||
OMIT Dec 5 2029 through Dec 4 2029
|
||||
|
||||
# Don't want Remind to queue reminders
|
||||
EXIT
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ HTMLDIR = /var/www/remind
|
||||
# Where you stick images and CSS files, as seen by UNIX
|
||||
IMAGEDIR = /var/www/remind/resources
|
||||
|
||||
# Where images and CSS fiels are, as seen by web browers
|
||||
# Where images and CSS files are, as seen by web browsers
|
||||
IMAGEBASE = /remind/resources
|
||||
|
||||
# Set by configure - don't touch.
|
||||
|
||||
Reference in New Issue
Block a user