mirror of
https://salsa.debian.org/dskoll/remind.git
synced 2026-05-18 05:33:24 +02:00
Compare commits
37 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 08a6eef73d | |||
| 3ae1a565ce | |||
| aee054281e | |||
| 6c9d685eca | |||
| b742303c94 | |||
| 64d7872038 | |||
| c48a67ba88 | |||
| 365b25e606 | |||
| 19fd401b5b | |||
| 08b2ce87ed | |||
| 6eea7e7996 | |||
| fc4012c01e | |||
| b6a26dcf04 | |||
| 83db92ecba | |||
| 1fdf85431a | |||
| 845c41c867 | |||
| bf83ce6c98 | |||
| 861d268448 | |||
| 02cf32c739 | |||
| 1f960039a1 | |||
| dcf55e0fba | |||
| aa8f5a9731 | |||
| de03d0c02a | |||
| 3e6e3b6a34 | |||
| bf48e31335 | |||
| 77c0beffb3 | |||
| 9a724d7618 | |||
| 1c20f54edb | |||
| 52b36d4503 | |||
| 0a82eadea6 | |||
| 0cd4fe67d1 | |||
| 9c31004b62 | |||
| 3431833be2 | |||
| a98a4b9f72 | |||
| 4aaba4da88 | |||
| 98e37d8c54 | |||
| 4335aac7b2 |
@@ -95,16 +95,9 @@ though I suspect it's entirely or almost entirely human-written.
|
|||||||
2. No AI-generated patches or other sorts of contributions to Remind
|
2. No AI-generated patches or other sorts of contributions to Remind
|
||||||
will be accepted.
|
will be accepted.
|
||||||
|
|
||||||
3. Remind's source code may not be used to train an AI model,
|
3. It is not yet settled whether, if you train an AI model on this
|
||||||
including an LLM model, unless all of the output of said model is
|
source code, the resulting model, and/or any outputs it produces, are
|
||||||
released under the GNU General Public License, version 2. If you use
|
derivative works of the code. But if they are, and do not fall under
|
||||||
any of Remind's source code to train your model, then anything that
|
"fair use" or equivalent in your jurisdiction, then as with any other
|
||||||
the model produces is a derived product of Remind and must be licensed
|
derivative work you may only distribute them under the terms of the
|
||||||
under the same terms as Remind.
|
GNU General Public License, version 2.
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Contact info: dianne@skoll.ca
|
|
||||||
|
|
||||||
Home page: [https://dianne.skoll.ca/projects/remind/](https://dianne.skoll.ca/projects/remind/)
|
|
||||||
|
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
Hi, all,
|
||||||
|
|
||||||
|
As you know, Remind has been around for a long time---over 36 years.
|
||||||
|
It's written in C, and I think it's high time to rewrite it in a
|
||||||
|
memory-safe language. After all, one CVE in 36 years is simply
|
||||||
|
unacceptable.
|
||||||
|
|
||||||
|
I was looking at writing it in Rust, but decided that Rust isn't quite
|
||||||
|
mature enough yet. So I decided to do it in FORTAN-77. I chose
|
||||||
|
FORTRAN-77 over the more obvious choice of COBOL because I studied
|
||||||
|
engineering and not business.
|
||||||
|
|
||||||
|
The rewrite will have the following implications:
|
||||||
|
|
||||||
|
o Remind will henceforth be known as REMIND.
|
||||||
|
|
||||||
|
o Sadly, I have to drop UTF-8 support. Your choices are ASCII or
|
||||||
|
EBCDIC.
|
||||||
|
|
||||||
|
o All statements must begin in column 7. That means you might need to
|
||||||
|
edit your existing scripts to add 6 spaces at the beginning of the
|
||||||
|
line.
|
||||||
|
|
||||||
|
o Variables whose names begin with "I" through "N" can only hold INTs.
|
||||||
|
|
||||||
|
o I will be setting up a store on my web site to sell punched cards.
|
||||||
|
(Yes; those will be needed to run REMIND.)
|
||||||
|
|
||||||
|
Now, I confess I haven't programmed in FORTRAN-77 in several decades,
|
||||||
|
so I plan on using AI to assist me. After all, it has been trained on
|
||||||
|
the mountains of open-source FORTRAN-77 code on the Internet.
|
||||||
|
|
||||||
|
I anticipate the rewrite will take about 9 years. You can use this
|
||||||
|
reminder to alert yourself to when it's ready:
|
||||||
|
|
||||||
|
REM 1 APRIL 2035 MSG REMIND IN FORTRAN-77 READY. STOP.
|
||||||
|
|
||||||
|
Regards,
|
||||||
|
|
||||||
|
Dianne.
|
||||||
@@ -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.72 for remind 06.02.04.
|
# Generated by GNU Autoconf 2.72 for remind 06.02.06.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation,
|
# Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation,
|
||||||
@@ -601,8 +601,8 @@ MAKEFLAGS=
|
|||||||
# Identity of this package.
|
# Identity of this package.
|
||||||
PACKAGE_NAME='remind'
|
PACKAGE_NAME='remind'
|
||||||
PACKAGE_TARNAME='remind'
|
PACKAGE_TARNAME='remind'
|
||||||
PACKAGE_VERSION='06.02.04'
|
PACKAGE_VERSION='06.02.06'
|
||||||
PACKAGE_STRING='remind 06.02.04'
|
PACKAGE_STRING='remind 06.02.06'
|
||||||
PACKAGE_BUGREPORT=''
|
PACKAGE_BUGREPORT=''
|
||||||
PACKAGE_URL='https://dianne.skoll.ca/projects/remind/'
|
PACKAGE_URL='https://dianne.skoll.ca/projects/remind/'
|
||||||
|
|
||||||
@@ -1258,7 +1258,7 @@ if test "$ac_init_help" = "long"; then
|
|||||||
# Omit some internal or obsolete options to make the list less imposing.
|
# 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 06.02.04 to adapt to many kinds of systems.
|
'configure' configures remind 06.02.06 to adapt to many kinds of systems.
|
||||||
|
|
||||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||||
|
|
||||||
@@ -1320,7 +1320,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 06.02.04:";;
|
short | recursive ) echo "Configuration of remind 06.02.06:";;
|
||||||
esac
|
esac
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
|
|
||||||
@@ -1408,7 +1408,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 06.02.04
|
remind configure 06.02.06
|
||||||
generated by GNU Autoconf 2.72
|
generated by GNU Autoconf 2.72
|
||||||
|
|
||||||
Copyright (C) 2023 Free Software Foundation, Inc.
|
Copyright (C) 2023 Free Software Foundation, Inc.
|
||||||
@@ -1871,7 +1871,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 06.02.04, which was
|
It was created by remind $as_me 06.02.06, which was
|
||||||
generated by GNU Autoconf 2.72. Invocation command line was
|
generated by GNU Autoconf 2.72. Invocation command line was
|
||||||
|
|
||||||
$ $0$ac_configure_args_raw
|
$ $0$ac_configure_args_raw
|
||||||
@@ -4892,7 +4892,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 06.02.04, which was
|
This file was extended by remind $as_me 06.02.06, which was
|
||||||
generated by GNU Autoconf 2.72. Invocation command line was
|
generated by GNU Autoconf 2.72. Invocation command line was
|
||||||
|
|
||||||
CONFIG_FILES = $CONFIG_FILES
|
CONFIG_FILES = $CONFIG_FILES
|
||||||
@@ -4957,7 +4957,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 06.02.04
|
remind config.status 06.02.06
|
||||||
configured by $0, generated by GNU Autoconf 2.72,
|
configured by $0, generated by GNU Autoconf 2.72,
|
||||||
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, 06.02.04, , , https://dianne.skoll.ca/projects/remind/)
|
AC_INIT(remind, 06.02.06, , , https://dianne.skoll.ca/projects/remind/)
|
||||||
AC_CONFIG_SRCDIR([src/queue.c])
|
AC_CONFIG_SRCDIR([src/queue.c])
|
||||||
|
|
||||||
cat <<'EOF'
|
cat <<'EOF'
|
||||||
|
|||||||
@@ -147,7 +147,7 @@
|
|||||||
"$May" "$MinsFromUTC" "$Minute" "$Monday" "$Mplu" "$NextMode"
|
"$May" "$MinsFromUTC" "$Minute" "$Monday" "$Mplu" "$NextMode"
|
||||||
"$November" "$Now" "$NumFullOmits" "$NumPartialOmits" "$NumQueued"
|
"$November" "$Now" "$NumFullOmits" "$NumPartialOmits" "$NumQueued"
|
||||||
"$NumTrig" "$October" "$On" "$OnceFile" "$ParseUntriggered" "$Pm"
|
"$NumTrig" "$October" "$On" "$OnceFile" "$ParseUntriggered" "$Pm"
|
||||||
"$PrefixLineNo" "$PSCal" "$RunOff" "$Saturday" "$September" "$Shaded"
|
"$PrefixLineNo" "$PSCal" "$Repeat" "$RunOff" "$Saturday" "$September" "$Shaded"
|
||||||
"$SimpleCal" "$SortByDate" "$SortByPrio" "$SortByTime" "$SubsIndent"
|
"$SimpleCal" "$SortByDate" "$SortByPrio" "$SortByTime" "$SubsIndent"
|
||||||
"$Sunday" "$SuppressImplicitWarnings" "$SuppressLRM" "$SysInclude" "$T" "$Tb" "$Td"
|
"$Sunday" "$SuppressImplicitWarnings" "$SuppressLRM" "$SysInclude" "$T" "$Tb" "$Td"
|
||||||
"$TerminalBackground" "$TerminalHyperlinks" "$Thursday" "$TimeSep" "$TimetIs64bit" "$Tm" "$Today" "$TodoFilter"
|
"$TerminalBackground" "$TerminalHyperlinks" "$Thursday" "$TimeSep" "$TimetIs64bit" "$Tm" "$Today" "$TodoFilter"
|
||||||
|
|||||||
@@ -1,5 +1,58 @@
|
|||||||
CHANGES TO REMIND
|
CHANGES TO REMIND
|
||||||
|
|
||||||
|
* VERSION 06.02.06 - 2026-05-15
|
||||||
|
|
||||||
|
- NEW FEATURE: remind: Add $Repeat read-only system variable which is
|
||||||
|
set to N if a command-line repeat of '*N' is supplied.
|
||||||
|
|
||||||
|
- NEW FEATURE: remind: You can use a command-line argument of the form
|
||||||
|
'@trigger' to set the current date. Remind evaluates the trigger
|
||||||
|
and sets today() to the result. For example, the following command
|
||||||
|
runs Remind in Agenda Mode on the next upcoming Friday the 13th:
|
||||||
|
|
||||||
|
remind filename.rem '@13 SATISFY [$Tw == 5]'
|
||||||
|
|
||||||
|
and the next command runs it on 2026-11-13, the first Friday the 13th
|
||||||
|
on or after 2026-08-01:
|
||||||
|
|
||||||
|
remind filename.rem 2026-08-01 '@13 SATISFY [$Tw == 5]'
|
||||||
|
|
||||||
|
- MINOR CHANGE: remind: When you supply the date on the command-line,
|
||||||
|
you can leave out the year, which defaults to the current year in
|
||||||
|
that case.
|
||||||
|
|
||||||
|
- MINOR CHANGE: remind: When dumping variables, indicate preserved
|
||||||
|
variables with a <preserved> tag.
|
||||||
|
|
||||||
|
- MINOR CHANGE: remind: Issue warnings if we try to FUNSET or
|
||||||
|
PUSH-FUNCS a built-in function.
|
||||||
|
|
||||||
|
- BUG FIX: include/holidays/jewish.rem: Rearrange code to improve ICS
|
||||||
|
export.
|
||||||
|
|
||||||
|
- BUG FIX: "make install": Remove old holidays files to avoid installation
|
||||||
|
failure because of change in symlink setup.
|
||||||
|
|
||||||
|
* VERSION 06.02.05 - 2026-03-02
|
||||||
|
|
||||||
|
- NEW FEATURE: rem2pdf: Add --avoid-overfull option. This makes the
|
||||||
|
font size in a calendar box with many reminders smaller in an effort
|
||||||
|
to fit everything neatly into the box.
|
||||||
|
|
||||||
|
- NEW FEATURE: rem2pdf: Add --entry-spacing option. This lets you
|
||||||
|
adjust the spacing between entries in a calendar box. It defaults
|
||||||
|
to one-half of the --border-size option. NOTE: In previous
|
||||||
|
releases, --entry-spacing defaulted to the SAME size as
|
||||||
|
--border-size, so unless you supply an --entry-spacing value to set
|
||||||
|
it back, the PDF calendars produced by this version of rem2pdf will
|
||||||
|
be slightly more compact than previous versions.
|
||||||
|
|
||||||
|
- DOCUMENTATION UPDATE: Clarify rules around use of Remind source code
|
||||||
|
for training AI models.
|
||||||
|
|
||||||
|
- FIX: include/holidays/nz.rem: Fix spelling of "Auckland" and add
|
||||||
|
Matariki. Fixes courtesy of Bart Joy.
|
||||||
|
|
||||||
* VERSION 06.02.04 - 2026-02-15
|
* VERSION 06.02.04 - 2026-02-15
|
||||||
|
|
||||||
- IMPROVEMENT: remind: Add the mblower and mbupper functions, which are
|
- IMPROVEMENT: remind: Add the mblower and mbupper functions, which are
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Save variables and functions that we will mess with
|
# Save variables and functions that we will mess with
|
||||||
PUSH-VARS InIsrael IncludeIsraeliHolidays Reform IncludeOmer IncludeOmerCal SunCal ostart yz
|
PUSH-VARS InIsrael IncludeIsraeliHolidays Reform IncludeOmer IncludeOmerCal SunCal ostart yz odays
|
||||||
PUSH-FUNCS _h2 _h2I _YZ _PastSat _BackTwoSat
|
PUSH-FUNCS _h2 _h2I _YZ _PastSat _BackTwoSat
|
||||||
|
|
||||||
SET InIsrael value("InIsrael", 0)
|
SET InIsrael value("InIsrael", 0)
|
||||||
@@ -105,22 +105,22 @@ IF !Reform
|
|||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
IF IncludeOmer || IncludeOmerCal
|
IF IncludeOmer || IncludeOmerCal
|
||||||
SET ostart HEBDATE(16, "Nisan", TODAY()-50)
|
SET ostart HEBDATE(16, "Nisan", $U-50)
|
||||||
IF ostart <= TODAY() && (TODAY() - ostart < 49)
|
IF ostart <= $U && ($U - ostart < 49)
|
||||||
SET odays TODAY()-ostart+1
|
SET odays $U-ostart+1
|
||||||
IF IncludeOmer
|
IF IncludeOmer
|
||||||
IF odays < 7
|
IF odays < 7
|
||||||
REM MSG %"%"Today is the [ORD(odays)] day of the Omer.
|
REM [$U] MSG %"%"Today is the [ORD(odays)] day of the Omer.
|
||||||
ELSE
|
ELSE
|
||||||
IF !(odays % 7)
|
IF !(odays % 7)
|
||||||
REM MSG %"%"Today is the [ORD(odays)] day of the Omer, being [odays / 7] [PLURAL(odays/7, "week")] of the Omer.
|
REM [$U] MSG %"%"Today is the [ORD(odays)] day of the Omer, being [odays / 7] [PLURAL(odays/7, "week")] of the Omer.
|
||||||
ELSE
|
ELSE
|
||||||
REM MSG %"%"Today is the [ORD(odays)] day of the Omer, being [odays/7] [PLURAL(odays/7, "week")] and [odays%7] [PLURAL(odays%7, "day")] of the Omer.
|
REM [$U] MSG %"%"Today is the [ORD(odays)] day of the Omer, being [odays/7] [PLURAL(odays/7, "week")] and [odays%7] [PLURAL(odays%7, "day")] of the Omer.
|
||||||
ENDIF
|
ENDIF
|
||||||
ENDIF
|
ENDIF
|
||||||
ENDIF
|
ENDIF
|
||||||
IF IncludeOmerCal
|
IF IncludeOmerCal
|
||||||
REM CAL [ORD(odays)] of Omer
|
REM [$U] CAL [ORD(odays)] of Omer
|
||||||
ENDIF
|
ENDIF
|
||||||
ENDIF
|
ENDIF
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|||||||
@@ -34,3 +34,36 @@ REM 27 December ADDOMIT SCANFROM -28 SATISFY [wkdaynum($T-2) == 0] MSG %"Christm
|
|||||||
REM 27 December ADDOMIT SCANFROM -28 SATISFY [wkdaynum($T-2) == 6] MSG %"Christmas Day (observed)%" %! %b.
|
REM 27 December ADDOMIT SCANFROM -28 SATISFY [wkdaynum($T-2) == 6] MSG %"Christmas Day (observed)%" %! %b.
|
||||||
REM 28 December ADDOMIT SCANFROM -28 SATISFY [wkdaynum($T-2) == 0] MSG %"Boxing Day (observed)%" %! %b.
|
REM 28 December ADDOMIT SCANFROM -28 SATISFY [wkdaynum($T-2) == 0] MSG %"Boxing Day (observed)%" %! %b.
|
||||||
REM 28 December ADDOMIT SCANFROM -28 SATISFY [wkdaynum($T-2) == 6] MSG %"Boxing Day (observed)%" %! %b.
|
REM 28 December ADDOMIT SCANFROM -28 SATISFY [wkdaynum($T-2) == 6] MSG %"Boxing Day (observed)%" %! %b.
|
||||||
|
|
||||||
|
# Matariki. Source:
|
||||||
|
# https://www.legislation.govt.nz/act/public/2022/0014/23.0/LMS557893.html#LMS557893
|
||||||
|
OMIT 2022-06-24 MSG Matariki
|
||||||
|
OMIT 2023-07-14 MSG Matariki
|
||||||
|
OMIT 2024-06-28 MSG Matariki
|
||||||
|
OMIT 2025-06-20 MSG Matariki
|
||||||
|
OMIT 2026-07-10 MSG Matariki
|
||||||
|
OMIT 2027-06-25 MSG Matariki
|
||||||
|
OMIT 2028-07-14 MSG Matariki
|
||||||
|
OMIT 2029-07-06 MSG Matariki
|
||||||
|
OMIT 2030-06-21 MSG Matariki
|
||||||
|
OMIT 2031-07-11 MSG Matariki
|
||||||
|
OMIT 2032-07-02 MSG Matariki
|
||||||
|
OMIT 2033-06-24 MSG Matariki
|
||||||
|
OMIT 2034-07-07 MSG Matariki
|
||||||
|
OMIT 2035-06-29 MSG Matariki
|
||||||
|
OMIT 2036-07-18 MSG Matariki
|
||||||
|
OMIT 2037-07-10 MSG Matariki
|
||||||
|
OMIT 2038-06-25 MSG Matariki
|
||||||
|
OMIT 2039-07-15 MSG Matariki
|
||||||
|
OMIT 2040-07-06 MSG Matariki
|
||||||
|
OMIT 2041-07-19 MSG Matariki
|
||||||
|
OMIT 2042-07-11 MSG Matariki
|
||||||
|
OMIT 2043-07-03 MSG Matariki
|
||||||
|
OMIT 2044-06-24 MSG Matariki
|
||||||
|
OMIT 2045-07-07 MSG Matariki
|
||||||
|
OMIT 2046-06-29 MSG Matariki
|
||||||
|
OMIT 2047-07-19 MSG Matariki
|
||||||
|
OMIT 2048-07-03 MSG Matariki
|
||||||
|
OMIT 2049-06-25 MSG Matariki
|
||||||
|
OMIT 2050-07-15 MSG Matariki
|
||||||
|
OMIT 2051-06-30 MSG Matariki
|
||||||
|
|||||||
@@ -10,4 +10,4 @@
|
|||||||
# If you want the national holidays as well, you must
|
# If you want the national holidays as well, you must
|
||||||
# also SYSINCLUDE holidays/nz.rem
|
# also SYSINCLUDE holidays/nz.rem
|
||||||
|
|
||||||
REM Monday 26 January ADDOMIT SCANFROM -28 MSG %"Aukland Anniversary Day%" %! %b.
|
REM Monday 26 January ADDOMIT SCANFROM -28 MSG %"Auckland Anniversary Day%" %! %b.
|
||||||
|
|||||||
@@ -10,4 +10,4 @@
|
|||||||
# If you want the national holidays as well, you must
|
# If you want the national holidays as well, you must
|
||||||
# also SYSINCLUDE holidays/nz.rem
|
# also SYSINCLUDE holidays/nz.rem
|
||||||
|
|
||||||
REM Monday 26 January ADDOMIT SCANFROM -28 MSG %"Aukland Anniversary Day%" %! %b.
|
REM Monday 26 January ADDOMIT SCANFROM -28 MSG %"Auckland Anniversary Day%" %! %b.
|
||||||
|
|||||||
+1
-1
@@ -33,7 +33,7 @@ TRANSLATE "are" "són"
|
|||||||
TRANSLATE "were" "eren"
|
TRANSLATE "were" "eren"
|
||||||
TRANSLATE "done" "completada"
|
TRANSLATE "done" "completada"
|
||||||
|
|
||||||
FSET - subst_bx(a,d,t) iif(d==today()+2, "demà passat", d >= today(), "d'aquí " + (d-today()) + " dies", "fa " + (today()-d) + " dies")
|
FSET - subst_bx(a,d,t) iif(d==$U+2, "demà passat", d >= $U, "d'aquí " + (d-$U) + " dies", "fa " + ($U-d) + " dies")
|
||||||
|
|
||||||
# 1 d'abril vs 1 de maig.
|
# 1 d'abril vs 1 de maig.
|
||||||
FSET - subst_sx(a,d,t) iif(isany(substr(mon(d), 1, 1), "a", "o") , "d'", "de")
|
FSET - subst_sx(a,d,t) iif(isany(substr(mon(d), 1, 1), "a", "o") , "d'", "de")
|
||||||
|
|||||||
+2
-2
@@ -58,12 +58,12 @@ FSET - subst_ampm(h) iif(h<5, " om natten", h < 12, " om formiddagen", h < 18, "
|
|||||||
FSET - subst_ordinal(d) "."
|
FSET - subst_ordinal(d) "."
|
||||||
FSET - ordx(n) n + "."
|
FSET - ordx(n) n + "."
|
||||||
|
|
||||||
FSET - subst_p(alt, d, t) iif(d==today()+1, "", "e")
|
FSET - subst_p(alt, d, t) iif(d==$U+1, "", "e")
|
||||||
FSET - zeropad(s, len) pad(s, "0", len)
|
FSET - zeropad(s, len) pad(s, "0", len)
|
||||||
FSET - subst_a_alt(d) wkday(d) + ", den " + day(d) + ". " + mon(d) + " " + year(d)
|
FSET - subst_a_alt(d) wkday(d) + ", den " + day(d) + ". " + mon(d) + " " + year(d)
|
||||||
FSET - subst_ax(alt, d, t) iif(alt, subst_a_alt(d), $On + " " + subst_a_alt(d))
|
FSET - subst_ax(alt, d, t) iif(alt, subst_a_alt(d), $On + " " + subst_a_alt(d))
|
||||||
|
|
||||||
FSET - subst_bx(a, d, t) iif(d >= today(), "om " + (d-today()) + " dage", "for " + (today()-d) + " dage siden")
|
FSET - subst_bx(a, d, t) iif(d >= $U, "om " + (d-$U) + " dage", "for " + ($U-d) + " dage siden")
|
||||||
|
|
||||||
FSET - subst_ex(alt, d, t) "den " + zeropad(day(d), 2) + $DateSep + zeropad(monnum(d), 2) + $DateSep + zeropad(year(d), 4)
|
FSET - subst_ex(alt, d, t) "den " + zeropad(day(d), 2) + $DateSep + zeropad(monnum(d), 2) + $DateSep + zeropad(year(d), 4)
|
||||||
FSET - subst_fx(alt, d, t) "den " + zeropad(monnum(d), 2) + $DateSep + zeropad(day(d), 2) + $DateSep + zeropad(year(d), 4)
|
FSET - subst_fx(alt, d, t) "den " + zeropad(monnum(d), 2) + $DateSep + zeropad(day(d), 2) + $DateSep + zeropad(year(d), 4)
|
||||||
|
|||||||
+2
-2
@@ -61,14 +61,14 @@ FSET - ordx(n) n + "."
|
|||||||
FSET - subst_a_alt(d) wkday(d) + ", den " + day(d) + ". " + mon(d) + " " + year(d)
|
FSET - subst_a_alt(d) wkday(d) + ", den " + day(d) + ". " + mon(d) + " " + year(d)
|
||||||
FSET - subst_ax(alt, d, t) iif(alt, subst_a_alt(d), $On + " " + subst_a_alt(d))
|
FSET - subst_ax(alt, d, t) iif(alt, subst_a_alt(d), $On + " " + subst_a_alt(d))
|
||||||
|
|
||||||
FSET - subst_bx(a, d, t) iif(d >= today(), "in " + (d-today()) + " Tagen", "vor " + (today()-d) + " Tagen")
|
FSET - subst_bx(a, d, t) iif(d >= $U, "in " + (d-$U) + " Tagen", "vor " + ($U-d) + " Tagen")
|
||||||
|
|
||||||
FSET - subst_g_alt(d) wkday(d) + ", den " + day(d) + ". " + mon(d)
|
FSET - subst_g_alt(d) wkday(d) + ", den " + day(d) + ". " + mon(d)
|
||||||
FSET - subst_gx(alt, d, t) iif(alt, subst_g_alt(d), $On + " " + subst_g_alt(d))
|
FSET - subst_gx(alt, d, t) iif(alt, subst_g_alt(d), $On + " " + subst_g_alt(d))
|
||||||
|
|
||||||
FSET - subst_ux(alt, d, t) subst_ax(alt, d, t)
|
FSET - subst_ux(alt, d, t) subst_ax(alt, d, t)
|
||||||
FSET - subst_vx(alt, d, t) subst_gx(alt, d, t)
|
FSET - subst_vx(alt, d, t) subst_gx(alt, d, t)
|
||||||
FSET - subst_p(alt, d, t) iif(d == today()+1, "", "en")
|
FSET - subst_p(alt, d, t) iif(d == $U+1, "", "en")
|
||||||
|
|
||||||
# Localization of various astronomical events
|
# Localization of various astronomical events
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -52,4 +52,4 @@ SET $And "y"
|
|||||||
SET $Hplu "s"
|
SET $Hplu "s"
|
||||||
SET $Mplu "s"
|
SET $Mplu "s"
|
||||||
|
|
||||||
FSET - subst_bx(a, d, t) iif(d >= today(), "dentro de " + (d-today()) + " días", "hace " + (today()-d) + " dias")
|
FSET - subst_bx(a, d, t) iif(d >= $U, "dentro de " + (d-$U) + " días", "hace " + ($U-d) + " dias")
|
||||||
|
|||||||
+2
-2
@@ -62,7 +62,7 @@ FSET - ordx(d) d + subst_ordinal(d)
|
|||||||
FSET - subst_a_alt(d, o, p) wkday(d) + o + " " + day(d) + ". " + mon(d) + p + " " + year(d)
|
FSET - subst_a_alt(d, o, p) wkday(d) + o + " " + day(d) + ". " + mon(d) + p + " " + year(d)
|
||||||
FSET - subst_ax(a, d, t) iif(a, subst_a_alt(d, "", ""), subst_a_alt(d, $On, "ta"))
|
FSET - subst_ax(a, d, t) iif(a, subst_a_alt(d, "", ""), subst_a_alt(d, $On, "ta"))
|
||||||
|
|
||||||
FSET - subst_bx(a, d, t) iif(d >= today(), (d-today()) + " päivän kuluttua", (today()-d) + " päivää sitten")
|
FSET - subst_bx(a, d, t) iif(d >= $U, (d-$U) + " päivän kuluttua", ($U-d) + " päivää sitten")
|
||||||
FSET - subst_cx(a, d, t) iif(a, wkday(d), wkday(d) + $On)
|
FSET - subst_cx(a, d, t) iif(a, wkday(d), wkday(d) + $On)
|
||||||
|
|
||||||
FSET - subst_ex(a, d, t) zeropad(day(d), 2) + $DateSep + zeropad(monnum(d), 2) + $DateSep + zeropad(year(d), 4)
|
FSET - subst_ex(a, d, t) zeropad(day(d), 2) + $DateSep + zeropad(monnum(d), 2) + $DateSep + zeropad(year(d), 4)
|
||||||
@@ -81,7 +81,7 @@ FSET - subst_k_alt(d, o) wkday(d) + o + " " + mon(d) + "n " + day(d) + subst_ord
|
|||||||
FSET - subst_kx(a, d, t) iif(a, subst_k_alt(d, ""), subst_k_alt(d, $On))
|
FSET - subst_kx(a, d, t) iif(a, subst_k_alt(d, ""), subst_k_alt(d, $On))
|
||||||
|
|
||||||
FSET - subst_lx(a, d, t) zeropad(year(d), 4) + $DateSep + zeropad(monnum(d), 2) + $DateSep + zeropad(day(d), 2)
|
FSET - subst_lx(a, d, t) zeropad(year(d), 4) + $DateSep + zeropad(monnum(d), 2) + $DateSep + zeropad(day(d), 2)
|
||||||
FSET - subst_p(a, d, t) iif(d==today()+1, "", "ä")
|
FSET - subst_p(a, d, t) iif(d==$U+1, "", "ä")
|
||||||
FSET - subst_qx(a, d, t) "n"
|
FSET - subst_qx(a, d, t) "n"
|
||||||
|
|
||||||
FSET - subst_u_alt(d, o, p) wkday(d) + o + " " + day(d) + subst_ordinal(day(d)) + " " + mon(d) + p + " " + year(d)
|
FSET - subst_u_alt(d, o, p) wkday(d) + o + " " + day(d) + subst_ordinal(day(d)) + " " + mon(d) + p + " " + year(d)
|
||||||
|
|||||||
+1
-1
@@ -63,7 +63,7 @@ FSET - subst_1(alt, date, time) iif(time == now(), "maintenant", \
|
|||||||
time > now(), "dans " + subst_tdiff((time-now())/60, (time-now())%60), \
|
time > now(), "dans " + subst_tdiff((time-now())/60, (time-now())%60), \
|
||||||
"il y a " + subst_tdiff ((now()-time)/60, (now()-time)%60))
|
"il y a " + subst_tdiff ((now()-time)/60, (now()-time)%60))
|
||||||
|
|
||||||
FSET - subst_bx(alt, date, time) iif(date >= today(), "dans " + (date-today()) + " jours", "il y a " + (today()-date) + " jours")
|
FSET - subst_bx(alt, date, time) iif(date >= $U, "dans " + (date-$U) + " jours", "il y a " + ($U-date) + " jours")
|
||||||
FSET - subst_j_alt(date) wkday(date) + ", " + day(date) + subst_ordinal(day(date)) + " " + mon(date) + ", " + year(date)
|
FSET - subst_j_alt(date) wkday(date) + ", " + day(date) + subst_ordinal(day(date)) + " " + mon(date) + ", " + year(date)
|
||||||
FSET - subst_jx(alt, date, time) iif(alt, subst_j_alt(date), $On + " " + subst_j_alt(date))
|
FSET - subst_jx(alt, date, time) iif(alt, subst_j_alt(date), $On + " " + subst_j_alt(date))
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -54,7 +54,7 @@ SET $And "και"
|
|||||||
SET $Hplu ""
|
SET $Hplu ""
|
||||||
SET $Mplu ""
|
SET $Mplu ""
|
||||||
|
|
||||||
FSET - subst_bx(a, d, t) iif(d >= today(), "σε " + (d - today()) + " ημέρες", "πριν από " + (today()-d) + " ημέρες")
|
FSET - subst_bx(a, d, t) iif(d >= $U, "σε " + (d - $U) + " ημέρες", "πριν από " + ($U-d) + " ημέρες")
|
||||||
FSET - subst_ordinal(d) "."
|
FSET - subst_ordinal(d) "."
|
||||||
FSET - ordx(d) d + "."
|
FSET - ordx(d) d + "."
|
||||||
FSET - subst_a_alt(d) wkday(d) + ", " + day(d) + ". " + mon(d) + " " + year(d)
|
FSET - subst_a_alt(d) wkday(d) + ", " + day(d) + ". " + mon(d) + " " + year(d)
|
||||||
|
|||||||
+2
-2
@@ -54,5 +54,5 @@ SET $And "og"
|
|||||||
SET $Hplu "ir"
|
SET $Hplu "ir"
|
||||||
SET $Mplu "r"
|
SET $Mplu "r"
|
||||||
|
|
||||||
FSET - subst_bx(a, d, t) iif(d >= today(), "eftir " + (d - today()) + " daga", "fyrir " + (today()-d) + " dögum")
|
FSET - subst_bx(a, d, t) iif(d >= $U, "eftir " + (d - $U) + " daga", "fyrir " + ($U-d) + " dögum")
|
||||||
FSET - subst_p(a, d, t) iif(d == today()+1, "", "a")
|
FSET - subst_p(a, d, t) iif(d == $U+1, "", "a")
|
||||||
|
|||||||
+3
-3
@@ -53,9 +53,9 @@ SET $And "e"
|
|||||||
SET $Hplu "a"
|
SET $Hplu "a"
|
||||||
SET $Mplu "i"
|
SET $Mplu "i"
|
||||||
|
|
||||||
FSET - subst_bx(a, d, t) iif(d >= today(), "fra " + (d-today()) + " giorni", (today()-d) + " giorni fa")
|
FSET - subst_bx(a, d, t) iif(d >= $U, "fra " + (d-$U) + " giorni", ($U-d) + " giorni fa")
|
||||||
FSET - subst_p(a, d, t) iif(d==today()+1, "o", "i")
|
FSET - subst_p(a, d, t) iif(d==$U+1, "o", "i")
|
||||||
FSET - subst_q(a, d, t) iif(d==today()+1, "a", "e")
|
FSET - subst_q(a, d, t) iif(d==$U+1, "a", "e")
|
||||||
|
|
||||||
FSET - subst_ax(a, d, t) wkday(d) + ", " + day(d) + " " + mon(d) + " " + year(d)
|
FSET - subst_ax(a, d, t) wkday(d) + ", " + day(d) + " " + mon(d) + " " + year(d)
|
||||||
FSET - subst_jx(a, d, t) subst_ax(a, d, t)
|
FSET - subst_jx(a, d, t) subst_ax(a, d, t)
|
||||||
|
|||||||
+1
-1
@@ -59,7 +59,7 @@ FSET - subst_1b(hdiff, mdiff) iif(hdiff==0, subst_minutes(mdiff), mdiff==0, subs
|
|||||||
FSET - subst_minutes(m) iif(m==1, "1 minuut", m + " minuten")
|
FSET - subst_minutes(m) iif(m==1, "1 minuut", m + " minuten")
|
||||||
FSET - subst_hours(h) iif(h==1, "1 uur", h + " uren")
|
FSET - subst_hours(h) iif(h==1, "1 uur", h + " uren")
|
||||||
|
|
||||||
FSET - subst_bx(a, d, t) iif (d == today()+2, "overmorgen", d+2 == today(), "eergisteren", d >= today(), "over " + (d-today()) + " dagen", (today()-d) + " dagen geleden")
|
FSET - subst_bx(a, d, t) iif (d == $U+2, "overmorgen", d+2 == $U, "eergisteren", d >= $U, "over " + (d-$U) + " dagen", ($U-d) + " dagen geleden")
|
||||||
|
|
||||||
FSET - subst_s(a, d, t) iif(day(d) == 1 || day(d) == 8, "e", day(d) < 20, "de", "te")
|
FSET - subst_s(a, d, t) iif(day(d) == 1 || day(d) == 8, "e", day(d) < 20, "de", "te")
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -53,7 +53,7 @@ SET $And "og"
|
|||||||
SET $Hplu "r"
|
SET $Hplu "r"
|
||||||
SET $Mplu "er"
|
SET $Mplu "er"
|
||||||
|
|
||||||
FSET - subst_bx(a, d, t) iif(d >= today(), "om " + (d-today()) + " dager", "for " + (today()-d) + " dager siden")
|
FSET - subst_bx(a, d, t) iif(d >= $U, "om " + (d-$U) + " dager", "for " + ($U-d) + " dager siden")
|
||||||
FSET - subst_ordinal(d) "."
|
FSET - subst_ordinal(d) "."
|
||||||
FSET - ordx(n) n + "."
|
FSET - ordx(n) n + "."
|
||||||
|
|
||||||
@@ -63,4 +63,4 @@ FSET - subst_gx(a, d, t) iif(a, subst_g_alt(d), $On + " " + subst_g_alt(d))
|
|||||||
FSET - subst_g_alt(d) wkday(d) + ", den " + day(d) + ". " + mon(d)
|
FSET - subst_g_alt(d) wkday(d) + ", den " + day(d) + ". " + mon(d)
|
||||||
FSET - subst_ux(a, d, t) subst_ax(a, d, t)
|
FSET - subst_ux(a, d, t) subst_ax(a, d, t)
|
||||||
FSET - subst_vx(a, d, t) subst_gx(a, d, t)
|
FSET - subst_vx(a, d, t) subst_gx(a, d, t)
|
||||||
FSET - subst_p(a, d, t) iif(d==today()+1, "", "er")
|
FSET - subst_p(a, d, t) iif(d==$U+1, "", "er")
|
||||||
|
|||||||
+1
-1
@@ -58,7 +58,7 @@ FSET - subst_ordinal(d) ""
|
|||||||
|
|
||||||
FSET - subst_a_alt(d) wkday(d) + ", " + day(d) + ". " + mon(d) + " " + year(d)
|
FSET - subst_a_alt(d) wkday(d) + ", " + day(d) + ". " + mon(d) + " " + year(d)
|
||||||
FSET - subst_ax(a, d, t) iif(a, subst_a_alt(d), $On + " " + subst_a_alt(d))
|
FSET - subst_ax(a, d, t) iif(a, subst_a_alt(d), $On + " " + subst_a_alt(d))
|
||||||
FSET - subst_bx(a, d, t) iif(d >= today(), "za " + (d-today()) + " dni", (today()-d) + " dni temu")
|
FSET - subst_bx(a, d, t) iif(d >= $U, "za " + (d-$U) + " dni", ($U-d) + " dni temu")
|
||||||
FSET - subst_g_alt(d) wkday(d) + ", " + day(d) + ". " + mon(d)
|
FSET - subst_g_alt(d) wkday(d) + ", " + day(d) + ". " + mon(d)
|
||||||
FSET - subst_gx(a, d, t) iif(a, subst_g_alt(d), $On + " " + subst_g_alt(d))
|
FSET - subst_gx(a, d, t) iif(a, subst_g_alt(d), $On + " " + subst_g_alt(d))
|
||||||
FSET - subst_ux(a, d, t) subst_ax(a, d, t)
|
FSET - subst_ux(a, d, t) subst_ax(a, d, t)
|
||||||
|
|||||||
+1
-1
@@ -58,7 +58,7 @@ FSET - subst_ordinal(d) ""
|
|||||||
FSET - subst_on_wd(d) iif(wkdaynum(d) == 1 || wkdaynum(d) == 2, "no", "na")
|
FSET - subst_on_wd(d) iif(wkdaynum(d) == 1 || wkdaynum(d) == 2, "no", "na")
|
||||||
|
|
||||||
FSET - subst_a_alt(d) wkday(d) + ", " + day(d) + " de " + mon(d) + " de " + year(d)
|
FSET - subst_a_alt(d) wkday(d) + ", " + day(d) + " de " + mon(d) + " de " + year(d)
|
||||||
FSET - subst_bx(a, d, t) iif(d >= today(), "em " + (d-today()) + " dias", "há " + (today()-d) + " dias")
|
FSET - subst_bx(a, d, t) iif(d >= $U, "em " + (d-$U) + " dias", "há " + ($U-d) + " dias")
|
||||||
FSET - subst_c_alt(d) wkday(d)
|
FSET - subst_c_alt(d) wkday(d)
|
||||||
FSET - subst_g_alt(d) wkday(d) + ", " + day(d) + " " + mon(d)
|
FSET - subst_g_alt(d) wkday(d) + ", " + day(d) + " " + mon(d)
|
||||||
FSET - subst_ax(a, d, t) iif(a, subst_a_alt(d), subst_on_wd(d) + " " + subst_a_alt(d))
|
FSET - subst_ax(a, d, t) iif(a, subst_a_alt(d), subst_on_wd(d) + " " + subst_a_alt(d))
|
||||||
|
|||||||
+2
-2
@@ -53,7 +53,7 @@ SET $Mplu "e"
|
|||||||
SET $Hplu "e"
|
SET $Hplu "e"
|
||||||
SET $And "şi"
|
SET $And "şi"
|
||||||
|
|
||||||
FSET - subst_bx(a, d, t) iif(d >= today(), "peste " + (d-today()) + " zile", "acume " + (today()-d) + " zile")
|
FSET - subst_bx(a, d, t) iif(d >= $U, "peste " + (d-$U) + " zile", "acume " + ($U-d) + " zile")
|
||||||
|
|
||||||
FSET - subst_ampm(h) iif(h<4, " noaptea", h<12, " dimineaţa", h<18, " după-amiaza", " seara")
|
FSET - subst_ampm(h) iif(h<4, " noaptea", h<12, " dimineaţa", h<18, " după-amiaza", " seara")
|
||||||
FSET - subst_ordinal(d) ""
|
FSET - subst_ordinal(d) ""
|
||||||
@@ -65,7 +65,7 @@ FSET - subst_jx(a, d, t) wkday(d) + ", " + mon(d) + " " + day(d) + ", " + year(d
|
|||||||
FSET - subst_kx(a, d, t) wkday(d) + ", " + mon(d) + " " + day(d)
|
FSET - subst_kx(a, d, t) wkday(d) + ", " + mon(d) + " " + day(d)
|
||||||
FSET - subst_ux(a, d, t) subst_ax(a, d, t)
|
FSET - subst_ux(a, d, t) subst_ax(a, d, t)
|
||||||
FSET - subst_vx(a, d, t) subst_gx(a, d, t)
|
FSET - subst_vx(a, d, t) subst_gx(a, d, t)
|
||||||
FSET - subst_p(a, d, t) iif(d==today()+1, "", "le")
|
FSET - subst_p(a, d, t) iif(d==$U+1, "", "le")
|
||||||
|
|
||||||
FSET - subst_1(a, d, t) iif(t==now(), $Now, t<now(), subst_1helper(now()-t, "acum "), subst_1helper(t-now(), "peste "))
|
FSET - subst_1(a, d, t) iif(t==now(), $Now, t<now(), subst_1helper(now()-t, "acum "), subst_1helper(t-now(), "peste "))
|
||||||
FSET - subst_1helper(diff, when) when + iif(diff%60==0, subst_1h(diff/60), diff/60==0, subst_1m(diff%60), subst_1h(diff/60) + " " + $And + " " + subst_1m(diff%60))
|
FSET - subst_1helper(diff, when) when + iif(diff%60==0, subst_1h(diff/60), diff/60==0, subst_1m(diff%60), subst_1h(diff/60) + " " + $And + " " + subst_1m(diff%60))
|
||||||
|
|||||||
@@ -7,10 +7,10 @@ IF access($SysInclude + "/translations/" + _("LANGID") + "/moonphases.rem", "r")
|
|||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
IF $CalMode || $PsCal
|
IF $CalMode || $PsCal
|
||||||
REM [moondate(0)] INFO "Url: https://en.wikipedia.org/wiki/New_moon" SPECIAL MOON 0 -1 -1 [moontime(0)]
|
REM NOQUEUE [moondatetime(0)] INFO "Url: https://en.wikipedia.org/wiki/New_moon" SPECIAL MOON 0 -1 -1 %*3
|
||||||
REM [moondate(1)] INFO "Url: https://en.wikipedia.org/wiki/Lunar_phase" SPECIAL MOON 1 -1 -1 [moontime(1)]
|
REM NOQUEUE [moondatetime(1)] INFO "Url: https://en.wikipedia.org/wiki/Lunar_phase" SPECIAL MOON 1 -1 -1 %*3
|
||||||
REM [moondate(2)] INFO "Url: https://en.wikipedia.org/wiki/Full_moon" SPECIAL MOON 2 -1 -1 [moontime(2)]
|
REM NOQUEUE [moondatetime(2)] INFO "Url: https://en.wikipedia.org/wiki/Full_moon" SPECIAL MOON 2 -1 -1 %*3
|
||||||
REM [moondate(3)] INFO "Url: https://en.wikipedia.org/wiki/Lunar_phase" SPECIAL MOON 3 -1 -1 [moontime(3)]
|
REM NOQUEUE [moondatetime(3)] INFO "Url: https://en.wikipedia.org/wiki/Lunar_phase" SPECIAL MOON 3 -1 -1 %*3
|
||||||
ELSE
|
ELSE
|
||||||
REM NOQUEUE INFO "Url: https://en.wikipedia.org/wiki/New_moon" [moondatetime(0)] MSG %"%(New Moon) (%2)%" %! %b.
|
REM NOQUEUE INFO "Url: https://en.wikipedia.org/wiki/New_moon" [moondatetime(0)] MSG %"%(New Moon) (%2)%" %! %b.
|
||||||
REM NOQUEUE INFO "Url: https://en.wikipedia.org/wiki/Lunar_phase" [moondatetime(1)] MSG %"%(First Quarter) (%2)%" %! %b.
|
REM NOQUEUE INFO "Url: https://en.wikipedia.org/wiki/Lunar_phase" [moondatetime(1)] MSG %"%(First Quarter) (%2)%" %! %b.
|
||||||
|
|||||||
+40
-3
@@ -1,6 +1,14 @@
|
|||||||
.TH REMIND 1 "@RELEASE_DATE@" "Remind" "VERSION @VERSION@"
|
.TH REMIND 1 "@RELEASE_DATE@" "Remind" "VERSION @VERSION@"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
remind \- a sophisticated reminder service
|
remind \- a sophisticated reminder service
|
||||||
|
.SH THE BOOK OF REMIND
|
||||||
|
This man page is a good \fIreference\fR for Remind. However, if you
|
||||||
|
are a novice wishing to \fIlearn\fR Remind, I suggest downloading
|
||||||
|
"The Book of Remind" from the Remind home page at the following URL:
|
||||||
|
.PP
|
||||||
|
.nf
|
||||||
|
https://dianne.skoll.ca/projects/remind/
|
||||||
|
.fi
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.B remind [\fIoptions\fR] \fIfilename\fR [\fIdate\fR] [\fI*rep\fR] [\fItime\fR]
|
.B remind [\fIoptions\fR] \fIfilename\fR [\fIdate\fR] [\fI*rep\fR] [\fItime\fR]
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
@@ -511,10 +519,12 @@ In other words, \fB\-i\fIvar\fR is exactly the same as \fB\-i\fIvar\fR\fB=\fR0.
|
|||||||
Allows you to define a function on the command line.
|
Allows you to define a function on the command line.
|
||||||
.PP
|
.PP
|
||||||
If you supply a \fIdate\fR on the command line, it must consist of
|
If you supply a \fIdate\fR on the command line, it must consist of
|
||||||
\fIday month year\fR, where \fIday\fR is the day of the month,
|
[\fIday\fR] \fImonth\fR [\fIyear\fR], where \fIday\fR is the day of the month,
|
||||||
\fImonth\fR is at least the first three letters of the English name
|
\fImonth\fR is at least the first three letters of the English name
|
||||||
of the month, and \fIyear\fR is a year (all 4 digits) from 1990 to
|
of the month, and \fIyear\fR is a year (all 4 digits) from 1990 to
|
||||||
about 2075. You can leave out the \fIday\fR, which then defaults to 1.
|
about 2075. You can leave out the \fIday\fR, which then defaults to 1.
|
||||||
|
If you leave out the year, then it defaults to the current year. You
|
||||||
|
cannot leave out the \fImonth\fR.
|
||||||
.PP
|
.PP
|
||||||
If you do supply a \fIdate\fR on the command line, then \fBRemind\fR
|
If you do supply a \fIdate\fR on the command line, then \fBRemind\fR
|
||||||
uses it, rather than the actual system date, as its notion of "today."
|
uses it, rather than the actual system date, as its notion of "today."
|
||||||
@@ -530,6 +540,28 @@ If you would rather specify the date more succinctly, you can supply
|
|||||||
it as YYYY-MM-DD or YYYY/MM/DD. You can even supply a date and
|
it as YYYY-MM-DD or YYYY/MM/DD. You can even supply a date and
|
||||||
time on the command line as one argument: YYYY-MM-DD@HH:MM.
|
time on the command line as one argument: YYYY-MM-DD@HH:MM.
|
||||||
.PP
|
.PP
|
||||||
|
You can also specify the date as a \fItrigger\fR by prefixing it
|
||||||
|
with the at symbol, "@". You might need to quote the argument. In this
|
||||||
|
case, Remind evaluates everything after the "@" as a trigger and the
|
||||||
|
resulting trigger date is used as the effective date. For example,
|
||||||
|
if you want to see what reminders will trigger on the next Friday
|
||||||
|
the 13th, you could use this:
|
||||||
|
.PP
|
||||||
|
.nf
|
||||||
|
remind .reminders '@13 SATISFY [$Tw == 5]'
|
||||||
|
.fi
|
||||||
|
.PP
|
||||||
|
You can also specify the date directly \fIand\fR use an "@" trigger
|
||||||
|
argument; in this case, Remind uses the specified date as the starting
|
||||||
|
point for the trigger calculation. As an example:
|
||||||
|
.PP
|
||||||
|
.nf
|
||||||
|
remind .reminders 2026-07-01 '@13 SATISFY [$Tw == 5]'
|
||||||
|
.fi
|
||||||
|
.PP
|
||||||
|
will set \fBRemind\fR's notion of "today" to 2026-11-13 because that
|
||||||
|
is the first Friday the 13th on or after 2026-07-01.
|
||||||
|
.PP
|
||||||
In addition, you can supply a \fIrepeat\fR parameter, which has the
|
In addition, you can supply a \fIrepeat\fR parameter, which has the
|
||||||
form *\fIrep\fR. This causes \fBRemind\fR to be run \fIrep\fR times,
|
form *\fIrep\fR. This causes \fBRemind\fR to be run \fIrep\fR times,
|
||||||
with the date incrementing on each iteration. You may have to enclose
|
with the date incrementing on each iteration. You may have to enclose
|
||||||
@@ -3359,6 +3391,10 @@ If non-zero, then the \fB\-l\fR option was supplied on the command line.
|
|||||||
.B $PSCal (read-only)
|
.B $PSCal (read-only)
|
||||||
If non-zero, then the \fB\-p\fR option was supplied on the command line.
|
If non-zero, then the \fB\-p\fR option was supplied on the command line.
|
||||||
.TP
|
.TP
|
||||||
|
.B $Repeat (read-only)
|
||||||
|
If this variable holds a non-zero value \fIn\fR, then a command-line
|
||||||
|
argument of *\fIn\fR was supplied to specify repeated runs of \fBRemind\fR..
|
||||||
|
.TP
|
||||||
.B $RunOff (read-only)
|
.B $RunOff (read-only)
|
||||||
If non-zero, the \fBRUN\fR directives are disabled.
|
If non-zero, the \fBRUN\fR directives are disabled.
|
||||||
.TP
|
.TP
|
||||||
@@ -6163,10 +6199,11 @@ For example, suppose you set the variables "me" and "hostname" as follows:
|
|||||||
.fi
|
.fi
|
||||||
.PP
|
.PP
|
||||||
Normally, \fBRemind\fR clears all variables between iterations in calendar
|
Normally, \fBRemind\fR clears all variables between iterations in calendar
|
||||||
mode. However, if certain variables are slow to compute, and will
|
mode and between iterations if a '*N' parameter was supplied on the
|
||||||
|
command-line. However, if certain variables are slow to compute, and will
|
||||||
not change between iterations, you can "preserve" their values with the
|
not change between iterations, you can "preserve" their values with the
|
||||||
\fBPRESERVE\fR command. Also, since function definitions are preserved
|
\fBPRESERVE\fR command. Also, since function definitions are preserved
|
||||||
between calendar iterations, there is no need to redefine them on each
|
between iterations, there is no need to redefine them on each
|
||||||
iteration. Thus, you could use the following sequence:
|
iteration. Thus, you could use the following sequence:
|
||||||
.PP
|
.PP
|
||||||
.nf
|
.nf
|
||||||
|
|||||||
@@ -195,6 +195,12 @@ Select the appropriate paper size and orientation. Activate
|
|||||||
be the normal case unless you have many reminders in a particular
|
be the normal case unless you have many reminders in a particular
|
||||||
day. (See the \fBrem2pdf\fR documentation.)
|
day. (See the \fBrem2pdf\fR documentation.)
|
||||||
|
|
||||||
|
If you activate \fBAvoid over-full boxes\fR, then \fBTkRemind\fR
|
||||||
|
will pass the \fB\-\-avoid\-overfull\fR option to \fBrem2pdf\fR. This
|
||||||
|
will make it try to fit many reminders into a calendar box by shrinking
|
||||||
|
the font. This option, if activated, also automatically activates
|
||||||
|
\fBFill page\fR.
|
||||||
|
|
||||||
Finally, click \fBPrint\fR to print or \fBCancel\fR to cancel. Note
|
Finally, click \fBPrint\fR to print or \fBCancel\fR to cancel. Note
|
||||||
that during printing, \fBRemind\fR is called with the
|
that during printing, \fBRemind\fR is called with the
|
||||||
\fB-itkremind=1\fR option and also an additional \fB-itkprint=1\fR
|
\fB-itkremind=1\fR option and also an additional \fB-itkprint=1\fR
|
||||||
|
|||||||
+30
-1
@@ -42,7 +42,7 @@ my $settings = {
|
|||||||
media => 'Letter',
|
media => 'Letter',
|
||||||
width => 0,
|
width => 0,
|
||||||
height => 0,
|
height => 0,
|
||||||
|
avoid_overfull_boxes => 0,
|
||||||
title_font => 'Sans',
|
title_font => 'Sans',
|
||||||
header_font => 'Sans',
|
header_font => 'Sans',
|
||||||
daynum_font => 'Sans Bold Oblique',
|
daynum_font => 'Sans Bold Oblique',
|
||||||
@@ -56,6 +56,7 @@ my $settings = {
|
|||||||
entry_size => 8,
|
entry_size => 8,
|
||||||
|
|
||||||
border_size => 4,
|
border_size => 4,
|
||||||
|
entry_spacing => -1,
|
||||||
line_thickness => 1,
|
line_thickness => 1,
|
||||||
|
|
||||||
margin_top => 36,
|
margin_top => 36,
|
||||||
@@ -96,6 +97,7 @@ Options:
|
|||||||
--ps Output PostScript instead of PDF
|
--ps Output PostScript instead of PDF
|
||||||
--eps Output encapsulated PostScript instead of PDF
|
--eps Output encapsulated PostScript instead of PDF
|
||||||
-cN Synonym for --small-calendars=N
|
-cN Synonym for --small-calendars=N
|
||||||
|
--avoid-overfull Shrink font size to avoid over-full boxes. Implies -e
|
||||||
--left-numbers, -x Print day numbers on the left (monthly calendars only)
|
--left-numbers, -x Print day numbers on the left (monthly calendars only)
|
||||||
--fill-page, -e Fill the entire page (monthly calendars only)
|
--fill-page, -e Fill the entire page (monthly calendars only)
|
||||||
--media=MEDIA, -mMEDIA Size for specified media
|
--media=MEDIA, -mMEDIA Size for specified media
|
||||||
@@ -112,6 +114,7 @@ Options:
|
|||||||
--header-size=S Specify size of font for weekday names
|
--header-size=S Specify size of font for weekday names
|
||||||
--daynum-size=S Specify size of font for day numbers
|
--daynum-size=S Specify size of font for day numbers
|
||||||
--entry-size=S Specify size of font for calendar entries
|
--entry-size=S Specify size of font for calendar entries
|
||||||
|
--entry-spacing=S Specify extra spacing between calendar entries
|
||||||
--border-size=S Specify size of gaps between items in 1/72nds of an inch
|
--border-size=S Specify size of gaps between items in 1/72nds of an inch
|
||||||
--line-thickness=S Specify line thickness in 1/72nds of an inch
|
--line-thickness=S Specify line thickness in 1/72nds of an inch
|
||||||
--margin-top=S Specify top margin size in 1/72nds of an inch
|
--margin-top=S Specify top margin size in 1/72nds of an inch
|
||||||
@@ -139,6 +142,7 @@ my $ret = GetOptions('landscape|l' => \$settings->{landscape},
|
|||||||
'svg' => \$settings->{svg},
|
'svg' => \$settings->{svg},
|
||||||
'ps' => \$settings->{ps},
|
'ps' => \$settings->{ps},
|
||||||
'eps' => \$settings->{eps},
|
'eps' => \$settings->{eps},
|
||||||
|
'avoid-overfull' => \$settings->{avoid_overfull_boxes},
|
||||||
'fill-page|e' => \$settings->{fill_entire_page},
|
'fill-page|e' => \$settings->{fill_entire_page},
|
||||||
'weeks-per-page|p=i' => \$settings->{weeks_per_page},
|
'weeks-per-page|p=i' => \$settings->{weeks_per_page},
|
||||||
'media|m=s' => \$settings->{media},
|
'media|m=s' => \$settings->{media},
|
||||||
@@ -155,6 +159,7 @@ my $ret = GetOptions('landscape|l' => \$settings->{landscape},
|
|||||||
'header-size=f' => \$settings->{header_size},
|
'header-size=f' => \$settings->{header_size},
|
||||||
'daynum-size=f' => \$settings->{daynum_size},
|
'daynum-size=f' => \$settings->{daynum_size},
|
||||||
'entry-size=f' => \$settings->{entry_size},
|
'entry-size=f' => \$settings->{entry_size},
|
||||||
|
'entry-spacing=f' => \$settings->{entry_spacing},
|
||||||
'border-size=f' => \$settings->{border_size},
|
'border-size=f' => \$settings->{border_size},
|
||||||
'line-thickness=f' => \$settings->{line_thickness},
|
'line-thickness=f' => \$settings->{line_thickness},
|
||||||
'margin-top=f' => \$settings->{margin_top},
|
'margin-top=f' => \$settings->{margin_top},
|
||||||
@@ -186,6 +191,15 @@ if ($version) {
|
|||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($settings->{entry_spacing} < 0) {
|
||||||
|
$settings->{entry_spacing} = 0.5 * $settings->{border_size};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ($settings->{avoid_overfull_boxes}) {
|
||||||
|
$settings->{fill_entire_page} = 1;
|
||||||
|
}
|
||||||
|
|
||||||
my $bad = 0;
|
my $bad = 0;
|
||||||
foreach my $setting (qw(bg_color line_color title_color header_color daynum_color smallcal_color)) {
|
foreach my $setting (qw(bg_color line_color title_color header_color daynum_color smallcal_color)) {
|
||||||
my $c = $settings->{$setting};
|
my $c = $settings->{$setting};
|
||||||
@@ -288,6 +302,9 @@ if ($settings->{svg}) {
|
|||||||
$settings->{width}, $settings->{height});
|
$settings->{width}, $settings->{height});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Save original entry size
|
||||||
|
$settings->{original_entry_size} = $settings->{entry_size};
|
||||||
|
|
||||||
# set_metadata not available in older versions of Cairo
|
# set_metadata not available in older versions of Cairo
|
||||||
eval { $surface->set_metadata('title', 'Calendar'); };
|
eval { $surface->set_metadata('title', 'Calendar'); };
|
||||||
eval { $surface->set_metadata('author', 'Remind (https://dianne.skoll.ca/projects/remind/)'); };
|
eval { $surface->set_metadata('author', 'Remind (https://dianne.skoll.ca/projects/remind/)'); };
|
||||||
@@ -481,6 +498,12 @@ the default top-right.
|
|||||||
|
|
||||||
Make the calendar fill the available space on the page.
|
Make the calendar fill the available space on the page.
|
||||||
|
|
||||||
|
=item --avoid-overfull
|
||||||
|
|
||||||
|
If a calendar box is going to overflow, try to make the entries fit by
|
||||||
|
decreasing the font size. Using the --avoid-overfull option automatically
|
||||||
|
enables the --fill-page option.
|
||||||
|
|
||||||
=item --media=I<media>, -mI<media>
|
=item --media=I<media>, -mI<media>
|
||||||
|
|
||||||
Specify the paper size (Letter, A4, etc.) For a list of valid media sizes,
|
Specify the paper size (Letter, A4, etc.) For a list of valid media sizes,
|
||||||
@@ -549,6 +572,12 @@ Specify the size of the blank border between the contents of a calendar
|
|||||||
box and the centre of the lines surrounding it, in 1/72ndths of an inch.
|
box and the centre of the lines surrounding it, in 1/72ndths of an inch.
|
||||||
The default is 4.
|
The default is 4.
|
||||||
|
|
||||||
|
=item --entry-spacing=I<n>
|
||||||
|
|
||||||
|
Specify the amount of extra space, in 1/72ndths of an inch, to leave
|
||||||
|
between calendar entries in a given calendar box. The default is
|
||||||
|
one-half of the --border-size value.
|
||||||
|
|
||||||
=item --line-thickness=I<n>
|
=item --line-thickness=I<n>
|
||||||
|
|
||||||
Specify the thickness of the lines drawn on the calendar. The default is 1.
|
Specify the thickness of the lines drawn on the calendar. The default is 1.
|
||||||
|
|||||||
@@ -608,7 +608,28 @@ sub draw_row
|
|||||||
for (my $col=0; $col<7; $col++) {
|
for (my $col=0; $col<7; $col++) {
|
||||||
my $day = $self->{daymap}->[$row]->[$col];
|
my $day = $self->{daymap}->[$row]->[$col];
|
||||||
next if ($day < 1);
|
next if ($day < 1);
|
||||||
$self->draw_day($cr, $settings, $so_far, $day, $col, $height);
|
if ($settings->{avoid_overfull_boxes}) {
|
||||||
|
my $old_entry_size = $settings->{entry_size};
|
||||||
|
my $old_spacing = $settings->{entry_spacing};
|
||||||
|
my $drawn = 0;
|
||||||
|
while ($settings->{entry_size} >= 2.0) {
|
||||||
|
my $h = $self->draw_day($cr, $settings, $so_far, $day, $col, 0);
|
||||||
|
if ($h <= $height) {
|
||||||
|
$self->draw_day($cr, $settings, $so_far, $day, $col, $height);
|
||||||
|
$drawn = 1;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
$settings->{entry_size} -= 0.125;
|
||||||
|
$settings->{entry_spacing} = $old_spacing * $settings->{entry_size} / $old_entry_size;
|
||||||
|
}
|
||||||
|
if (!$drawn) {
|
||||||
|
$self->draw_day($cr, $settings, $so_far, $day, $col, $height);
|
||||||
|
}
|
||||||
|
$settings->{entry_size} = $old_entry_size;
|
||||||
|
$settings->{entry_spacing} = $old_spacing;
|
||||||
|
} else {
|
||||||
|
$self->draw_day($cr, $settings, $so_far, $day, $col, $height);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $so_far + $height + $settings->{border_size} * 2;
|
return $so_far + $height + $settings->{border_size} * 2;
|
||||||
@@ -717,8 +738,8 @@ sub draw_day
|
|||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
if ($done) {
|
if ($done) {
|
||||||
$so_far += $settings->{border_size};
|
$so_far += $settings->{entry_spacing};
|
||||||
$entry_height += $settings->{border_size};
|
$entry_height += $settings->{entry_spacing};
|
||||||
}
|
}
|
||||||
$done = 1;
|
$done = 1;
|
||||||
my $h2 = $entry->render($self, $cr, $settings, $so_far, $day, $col, $height);
|
my $h2 = $entry->render($self, $cr, $settings, $so_far, $day, $col, $height);
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ sub render
|
|||||||
my $layout = Pango::Cairo::create_layout($cr);
|
my $layout = Pango::Cairo::create_layout($cr);
|
||||||
|
|
||||||
$layout->set_text(Encode::decode('UTF-8', $self->{body}));
|
$layout->set_text(Encode::decode('UTF-8', $self->{body}));
|
||||||
my $desc = Pango::FontDescription->from_string($settings->{entry_font} . ' ' . int(0.75 * $settings->{entry_size}) . 'px');
|
my $desc = Pango::FontDescription->from_string($settings->{entry_font} . ' ' . int(0.75 * $settings->{original_entry_size}) . 'px');
|
||||||
$layout->set_font_description($desc);
|
$layout->set_font_description($desc);
|
||||||
my ($wid, $h) = $layout->get_pixel_size();
|
my ($wid, $h) = $layout->get_pixel_size();
|
||||||
|
|
||||||
@@ -197,7 +197,7 @@ sub render
|
|||||||
my $layout;
|
my $layout;
|
||||||
my $bodywidth = 0;
|
my $bodywidth = 0;
|
||||||
if ($self->{fontsize} <= 0) {
|
if ($self->{fontsize} <= 0) {
|
||||||
$self->{fontsize} = $settings->{entry_size};
|
$self->{fontsize} = $settings->{original_entry_size};
|
||||||
}
|
}
|
||||||
if ($self->{size} <= 0) {
|
if ($self->{size} <= 0) {
|
||||||
$self->{size} = $settings->{daynum_size};
|
$self->{size} = $settings->{daynum_size};
|
||||||
|
|||||||
+22
-2
@@ -342,6 +342,9 @@ set Option(PrintOrient) landscape
|
|||||||
set OptDescr(PrintFill) "(0/1) If 1, fill entire page when printing"
|
set OptDescr(PrintFill) "(0/1) If 1, fill entire page when printing"
|
||||||
set Option(PrintFill) 1
|
set Option(PrintFill) 1
|
||||||
|
|
||||||
|
set OptDescr(PrintAvoidOverfull) "(0/1) If 1, avoid over-full calendar boxes if possible"
|
||||||
|
set Option(PrintAvoidOverfull) 0
|
||||||
|
|
||||||
set OptDescr(WrapCal) "(0/1) If 1, make printed calendars occupy at most 5 rows"
|
set OptDescr(WrapCal) "(0/1) If 1, make printed calendars occupy at most 5 rows"
|
||||||
set Option(WrapCal) 0
|
set Option(WrapCal) 0
|
||||||
|
|
||||||
@@ -1758,7 +1761,8 @@ proc DoPrintHelper {} {
|
|||||||
radiobutton .p.landscape -text "Landscape" -variable Option(PrintOrient) -value landscape
|
radiobutton .p.landscape -text "Landscape" -variable Option(PrintOrient) -value landscape
|
||||||
radiobutton .p.portrait -text "Portrait" -variable Option(PrintOrient) -value portrait
|
radiobutton .p.portrait -text "Portrait" -variable Option(PrintOrient) -value portrait
|
||||||
|
|
||||||
checkbutton .p.fill -text "Fill page" -variable Option(PrintFill)
|
checkbutton .p.fill -text "Fill page" -variable Option(PrintFill) -command PrintFillButtonPressed
|
||||||
|
checkbutton .p.avoid -text "Avoid over-full boxes" -variable Option(PrintAvoidOverfull) -command PrintAvoidOverfullButtonPressed
|
||||||
checkbutton .p.wrap -text "Use at most 5 rows" -variable Option(WrapCal)
|
checkbutton .p.wrap -text "Use at most 5 rows" -variable Option(WrapCal)
|
||||||
checkbutton .p.right -text "Day numbers at top-right" -variable Option(PrintDaysRight)
|
checkbutton .p.right -text "Day numbers at top-right" -variable Option(PrintDaysRight)
|
||||||
checkbutton .p.calendars -text "Print small calendars" -variable Option(PrintSmallCalendars)
|
checkbutton .p.calendars -text "Print small calendars" -variable Option(PrintSmallCalendars)
|
||||||
@@ -1770,7 +1774,7 @@ proc DoPrintHelper {} {
|
|||||||
wm protocol .p WM_DELETE_WINDOW { .p.cancel flash; .p.cancel invoke }
|
wm protocol .p WM_DELETE_WINDOW { .p.cancel flash; .p.cancel invoke }
|
||||||
pack .p.f1 .p.ff .p.f2 .p.f2a .p.f3 .p.f3a \
|
pack .p.f1 .p.ff .p.f2 .p.f2a .p.f3 .p.f3a \
|
||||||
-side top -fill both -expand 1 -anchor w
|
-side top -fill both -expand 1 -anchor w
|
||||||
pack .p.fill .p.wrap .p.right .p.calendars -in .p.f3a \
|
pack .p.fill .p.avoid .p.wrap .p.right .p.calendars -in .p.f3a \
|
||||||
-side top -anchor w -fill none -expand 0
|
-side top -anchor w -fill none -expand 0
|
||||||
pack .p.f4 -side top -fill both -expand 1 -anchor w
|
pack .p.f4 -side top -fill both -expand 1 -anchor w
|
||||||
pack .p.f11 .p.f12 -in .p.f1 -side top -fill none -expand 0 -anchor w
|
pack .p.f11 .p.f12 -in .p.f1 -side top -fill none -expand 0 -anchor w
|
||||||
@@ -1861,6 +1865,9 @@ proc DoPrintHelper {} {
|
|||||||
append cmd " -e"
|
append cmd " -e"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if {$Option(PrintAvoidOverfull)} {
|
||||||
|
append cmd " --avoid-overfull"
|
||||||
|
}
|
||||||
if {!$Option(PrintDaysRight)} {
|
if {!$Option(PrintDaysRight)} {
|
||||||
append cmd " -x"
|
append cmd " -x"
|
||||||
}
|
}
|
||||||
@@ -1883,6 +1890,19 @@ proc DoPrintHelper {} {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
proc PrintFillButtonPressed {} {
|
||||||
|
global Option
|
||||||
|
if { ! $Option(PrintFill) && $Option(PrintAvoidOverfull) } {
|
||||||
|
set Option(PrintAvoidOverfull) 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
proc PrintAvoidOverfullButtonPressed {} {
|
||||||
|
global Option
|
||||||
|
if { ! $Option(PrintFill) && $Option(PrintAvoidOverfull) } {
|
||||||
|
set Option(PrintFill) 1
|
||||||
|
}
|
||||||
|
}
|
||||||
proc ShowPrintCommand { cmd } {
|
proc ShowPrintCommand { cmd } {
|
||||||
global Option
|
global Option
|
||||||
catch { destroy .pc }
|
catch { destroy .pc }
|
||||||
|
|||||||
@@ -80,6 +80,8 @@ install: all
|
|||||||
$(INSTALL_DATA) $$man $(DESTDIR)$(mandir)/man1 || exit 1; \
|
$(INSTALL_DATA) $$man $(DESTDIR)$(mandir)/man1 || exit 1; \
|
||||||
done
|
done
|
||||||
-mkdir -p $(DESTDIR)$(datarootdir)/remind || true
|
-mkdir -p $(DESTDIR)$(datarootdir)/remind || true
|
||||||
|
# Avoid problems with symlinks under holidays/
|
||||||
|
-rm -rf $(DESTDIR)$(datarootdir)/remind/holidays > /dev/null 2>&1 || true
|
||||||
cp -R ../include/* $(DESTDIR)$(datarootdir)/remind
|
cp -R ../include/* $(DESTDIR)$(datarootdir)/remind
|
||||||
chmod -R a+rX $(DESTDIR)$(datarootdir)/remind
|
chmod -R a+rX $(DESTDIR)$(datarootdir)/remind
|
||||||
-mkdir -p $(DESTDIR)$(prefix)/share/pixmaps
|
-mkdir -p $(DESTDIR)$(prefix)/share/pixmaps
|
||||||
|
|||||||
@@ -68,7 +68,7 @@
|
|||||||
as a REM statement, also. */
|
as a REM statement, also. */
|
||||||
#define E_CANT_MODIFY 45
|
#define E_CANT_MODIFY 45
|
||||||
#define E_MKTIME_PROBLEM 46
|
#define E_MKTIME_PROBLEM 46
|
||||||
#define E_REDEF_FUNC 47
|
#define E_REDEF_BUILTIN_FUNC 47
|
||||||
#define E_CANTNEST_FDEF 48
|
#define E_CANTNEST_FDEF 48
|
||||||
#define E_REP_FULSPEC 49
|
#define E_REP_FULSPEC 49
|
||||||
#define E_YR_TWICE 50
|
#define E_YR_TWICE 50
|
||||||
@@ -139,7 +139,8 @@
|
|||||||
#define E_EXPECTING_EOXPR 115
|
#define E_EXPECTING_EOXPR 115
|
||||||
#define E_EXPECTING_ATOM 116
|
#define E_EXPECTING_ATOM 116
|
||||||
#define E_BAD_VAL_FOR_SYSVAR 117
|
#define E_BAD_VAL_FOR_SYSVAR 117
|
||||||
|
#define E_UNSET_BUILTIN_FUNC 118
|
||||||
|
#define E_PUSH_BUILTIN_FUNC 119
|
||||||
#ifdef MK_GLOBALS
|
#ifdef MK_GLOBALS
|
||||||
#undef EXTERN
|
#undef EXTERN
|
||||||
#define EXTERN
|
#define EXTERN
|
||||||
@@ -203,7 +204,7 @@ EXTERN char *ErrMsg[]
|
|||||||
/* E_PARSE_AS_REM */ "",
|
/* E_PARSE_AS_REM */ "",
|
||||||
/* E_CANT_MODIFY */ "Cannot modify system variable",
|
/* E_CANT_MODIFY */ "Cannot modify system variable",
|
||||||
/* E_MKTIME_PROBLEM */ "C library function can't represent date/time",
|
/* E_MKTIME_PROBLEM */ "C library function can't represent date/time",
|
||||||
/* E_REDEF_FUNC */ "Attempt to redefine built-in function",
|
/* E_REDEF_BUILTIN_FUNC */ "Attempt to redefine built-in function",
|
||||||
/* E_CANTNEST_FDEF */ "Can't nest function definition in expression",
|
/* E_CANTNEST_FDEF */ "Can't nest function definition in expression",
|
||||||
/* E_REP_FULSPEC */ "Must fully specify date to use repeat factor",
|
/* E_REP_FULSPEC */ "Must fully specify date to use repeat factor",
|
||||||
/* E_YR_TWICE */ "Year specified twice",
|
/* E_YR_TWICE */ "Year specified twice",
|
||||||
@@ -274,6 +275,8 @@ EXTERN char *ErrMsg[]
|
|||||||
/* E_EXPECTING_EOXPR */ "Expecting operator or end-of-expression",
|
/* E_EXPECTING_EOXPR */ "Expecting operator or end-of-expression",
|
||||||
/* E_EXPECTING_ATOM */ "Expecting constant, variable, function call or (expression)",
|
/* E_EXPECTING_ATOM */ "Expecting constant, variable, function call or (expression)",
|
||||||
/* E_BAD_VAL_FOR_SYSVAR */ "Invalid value for system variable",
|
/* E_BAD_VAL_FOR_SYSVAR */ "Invalid value for system variable",
|
||||||
|
/* E_UNSET_BUILTIN_FUNC */ "Attempt to unset built-in function",
|
||||||
|
/* E_PUSH_BUILTIN_FUNC */ "Attempt to PUSH built-in function",
|
||||||
}
|
}
|
||||||
#endif /* MK_GLOBALS */
|
#endif /* MK_GLOBALS */
|
||||||
;
|
;
|
||||||
|
|||||||
+5
-1
@@ -4727,6 +4727,7 @@ FEvalTrig(func_info *info)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
if (trig.tz != NULL && tim.ttime == NO_TIME) {
|
if (trig.tz != NULL && tim.ttime == NO_TIME) {
|
||||||
|
DestroyParser(&p);
|
||||||
FreeTrig(&trig);
|
FreeTrig(&trig);
|
||||||
return E_TZ_NO_AT;
|
return E_TZ_NO_AT;
|
||||||
}
|
}
|
||||||
@@ -4753,7 +4754,10 @@ FEvalTrig(func_info *info)
|
|||||||
dse = -1;
|
dse = -1;
|
||||||
}
|
}
|
||||||
DestroyParser(&p);
|
DestroyParser(&p);
|
||||||
if (r) return r;
|
if (r) {
|
||||||
|
FreeTrig(&trig);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
if (dse < 0) {
|
if (dse < 0) {
|
||||||
RetVal.type = INT_TYPE;
|
RetVal.type = INT_TYPE;
|
||||||
RETVAL = dse;
|
RETVAL = dse;
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ EXTERN INIT( int DoPrefixLineNo, 0);
|
|||||||
EXTERN INIT( int MondayFirst, 0);
|
EXTERN INIT( int MondayFirst, 0);
|
||||||
EXTERN INIT( int AddBlankLines, 1);
|
EXTERN INIT( int AddBlankLines, 1);
|
||||||
EXTERN INIT( int Iterations, 1);
|
EXTERN INIT( int Iterations, 1);
|
||||||
|
EXTERN INIT( int OrigIterations, 0);
|
||||||
EXTERN INIT( int PsCal, 0);
|
EXTERN INIT( int PsCal, 0);
|
||||||
EXTERN INIT( int CalWidth, 80);
|
EXTERN INIT( int CalWidth, 80);
|
||||||
EXTERN INIT( int CalWeeks, 0);
|
EXTERN INIT( int CalWeeks, 0);
|
||||||
|
|||||||
+123
-33
@@ -54,6 +54,9 @@ static int tty_init(int fd);
|
|||||||
static void tty_raw(int fd);
|
static void tty_raw(int fd);
|
||||||
static void tty_reset(int fd);
|
static void tty_reset(int fd);
|
||||||
|
|
||||||
|
static int GetInitDateFromTrigger(char const *s, int *y, int *m, int *d, int *systime);
|
||||||
|
static void SetTodayFromCmdlineArgs(int dse, int y, int m, int d);
|
||||||
|
|
||||||
static void ProcessLongOption(char const *arg);
|
static void ProcessLongOption(char const *arg);
|
||||||
/***************************************************************
|
/***************************************************************
|
||||||
*
|
*
|
||||||
@@ -183,6 +186,7 @@ void InitRemind(int argc, char const *argv[])
|
|||||||
int x;
|
int x;
|
||||||
int dse;
|
int dse;
|
||||||
int ttyfd;
|
int ttyfd;
|
||||||
|
int r;
|
||||||
|
|
||||||
/* Make sure remind is not installed set-uid or set-gid */
|
/* Make sure remind is not installed set-uid or set-gid */
|
||||||
if (getgid() != getegid() ||
|
if (getgid() != getegid() ||
|
||||||
@@ -740,10 +744,27 @@ void InitRemind(int argc, char const *argv[])
|
|||||||
if (i < argc) {
|
if (i < argc) {
|
||||||
while (i < argc) {
|
while (i < argc) {
|
||||||
arg = argv[i++];
|
arg = argv[i++];
|
||||||
|
/* If it begins with '@' then it's a trigger spec */
|
||||||
|
if (*arg == '@') {
|
||||||
|
SetTodayFromCmdlineArgs(dse, y, m, d);
|
||||||
|
r = GetInitDateFromTrigger(arg+1, &y, &m, &d, &SysTime);
|
||||||
|
if (r == OK) {
|
||||||
|
dse = NO_DATE; /* Date is in y/m/d */
|
||||||
|
if (SysTime != -1) {
|
||||||
|
DontQueue = 1;
|
||||||
|
Daemon = 0;
|
||||||
|
LocalSysTime = SysTime;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Could not evaluate command-line trigger: %s\n", GetErr(r));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
FindToken(arg, &tok);
|
FindToken(arg, &tok);
|
||||||
switch (tok.type) {
|
switch (tok.type) {
|
||||||
case T_Time:
|
case T_Time:
|
||||||
if (SysTime != -1L) Usage();
|
if (SysTime != -1) Usage();
|
||||||
else {
|
else {
|
||||||
SysTime = (long) tok.val * 60L;
|
SysTime = (long) tok.val * 60L;
|
||||||
LocalSysTime = SysTime;
|
LocalSysTime = SysTime;
|
||||||
@@ -753,7 +774,7 @@ void InitRemind(int argc, char const *argv[])
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case T_DateTime:
|
case T_DateTime:
|
||||||
if (SysTime != -1L) Usage();
|
if (SysTime != -1) Usage();
|
||||||
if (m != NO_MON || d != NO_DAY || y != NO_YR || dse != NO_DATE) Usage();
|
if (m != NO_MON || d != NO_DAY || y != NO_YR || dse != NO_DATE) Usage();
|
||||||
SysTime = (tok.val % MINUTES_PER_DAY) * 60;
|
SysTime = (tok.val % MINUTES_PER_DAY) * 60;
|
||||||
LocalSysTime = SysTime;
|
LocalSysTime = SysTime;
|
||||||
@@ -798,42 +819,13 @@ void InitRemind(int argc, char const *argv[])
|
|||||||
|
|
||||||
if (rep > 0) {
|
if (rep > 0) {
|
||||||
Iterations = rep;
|
Iterations = rep;
|
||||||
|
OrigIterations = rep;
|
||||||
IgnoreOnce = 1;
|
IgnoreOnce = 1;
|
||||||
DontQueue = 1;
|
DontQueue = 1;
|
||||||
Daemon = 0;
|
Daemon = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dse != NO_DATE) {
|
SetTodayFromCmdlineArgs(dse, y, m, d);
|
||||||
FromDSE(dse, &y, &m, &d);
|
|
||||||
}
|
|
||||||
/* Must supply date in the form: day, mon, yr OR mon, yr */
|
|
||||||
if (m != NO_MON || y != NO_YR || d != NO_DAY) {
|
|
||||||
if (m == NO_MON || y == NO_YR) {
|
|
||||||
if (rep == NO_REP) Usage();
|
|
||||||
else if (m != NO_MON || y != NO_YR) Usage();
|
|
||||||
else {
|
|
||||||
m = CurMon;
|
|
||||||
y = CurYear;
|
|
||||||
if (d == NO_DAY) d = CurDay;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (d == NO_DAY) d=1;
|
|
||||||
if (d > DaysInMonth(m, y)) {
|
|
||||||
fprintf(ErrFp, "%s", BadDate);
|
|
||||||
Usage();
|
|
||||||
}
|
|
||||||
DSEToday = DSE(y, m, d);
|
|
||||||
if (DSEToday == -1) {
|
|
||||||
fprintf(ErrFp, "%s", BadDate);
|
|
||||||
Usage();
|
|
||||||
}
|
|
||||||
LocalDSEToday = DSEToday;
|
|
||||||
CurYear = y;
|
|
||||||
CurMon = m;
|
|
||||||
CurDay = d;
|
|
||||||
if (DSEToday != RealToday) IgnoreOnce = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* JSON mode turns off sorting */
|
/* JSON mode turns off sorting */
|
||||||
@@ -1401,3 +1393,101 @@ GetTerminalBackground(void)
|
|||||||
}
|
}
|
||||||
return TerminalBackground;
|
return TerminalBackground;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
GetInitDateFromTrigger(char const *s, int *y, int *m, int *d, int *systime)
|
||||||
|
{
|
||||||
|
Parser p;
|
||||||
|
Trigger trig;
|
||||||
|
TimeTrig tim;
|
||||||
|
int dse;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
CreateParser(s, &p);
|
||||||
|
r = ParseRem(&p, &trig, &tim);
|
||||||
|
if (r) {
|
||||||
|
DestroyParser(&p);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
if (trig.tz != NULL && tim.ttime == NO_TIME) {
|
||||||
|
DestroyParser(&p);
|
||||||
|
FreeTrig(&trig);
|
||||||
|
return E_TZ_NO_AT;
|
||||||
|
}
|
||||||
|
if (trig.typ == SAT_TYPE) {
|
||||||
|
EnterTimezone(trig.tz);
|
||||||
|
r=DoSatRemind(&trig, &tim, &p);
|
||||||
|
ExitTimezone(trig.tz);
|
||||||
|
if (r) {
|
||||||
|
DestroyParser(&p);
|
||||||
|
FreeTrig(&trig);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
dse = LastTriggerDate;
|
||||||
|
} else if (trig.typ == NO_TYPE) {
|
||||||
|
EnterTimezone(trig.tz);
|
||||||
|
dse = ComputeTrigger(get_scanfrom(&trig), &trig, &tim, &r, 0);
|
||||||
|
ExitTimezone(trig.tz);
|
||||||
|
} else {
|
||||||
|
DestroyParser(&p);
|
||||||
|
FreeTrig(&trig);
|
||||||
|
return E_PARSE_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
DestroyParser(&p);
|
||||||
|
if (r) {
|
||||||
|
FreeTrig(&trig);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
if (dse < 0) {
|
||||||
|
FreeTrig(&trig);
|
||||||
|
return E_CANT_TRIG;
|
||||||
|
}
|
||||||
|
if (dse >= 0) {
|
||||||
|
if (tim.ttime != NO_TIME) {
|
||||||
|
if (*systime != -1) {
|
||||||
|
Usage();
|
||||||
|
}
|
||||||
|
dse=AdjustTriggerForTimeZone(&trig, dse, &tim, 1);
|
||||||
|
*systime = tim.ttime * 60;
|
||||||
|
}
|
||||||
|
FromDSE(dse, y, m, d);
|
||||||
|
if (dse != RealToday) {
|
||||||
|
IgnoreOnce = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FreeTrig(&trig);
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
SetTodayFromCmdlineArgs(int dse, int y, int m, int d)
|
||||||
|
{
|
||||||
|
if (dse != NO_DATE) {
|
||||||
|
FromDSE(dse, &y, &m, &d);
|
||||||
|
}
|
||||||
|
/* Must supply date in the form: day, mon, yr OR mon, yr */
|
||||||
|
if (m != NO_MON || y != NO_YR || d != NO_DAY) {
|
||||||
|
if (y == NO_YR) {
|
||||||
|
y = CurYear;
|
||||||
|
}
|
||||||
|
if (m == NO_MON) {
|
||||||
|
Usage();
|
||||||
|
}
|
||||||
|
if (d == NO_DAY) d=1;
|
||||||
|
if (d > DaysInMonth(m, y)) {
|
||||||
|
fprintf(ErrFp, "%s", BadDate);
|
||||||
|
Usage();
|
||||||
|
}
|
||||||
|
DSEToday = DSE(y, m, d);
|
||||||
|
if (DSEToday == -1) {
|
||||||
|
fprintf(ErrFp, "%s", BadDate);
|
||||||
|
Usage();
|
||||||
|
}
|
||||||
|
LocalDSEToday = DSEToday;
|
||||||
|
CurYear = y;
|
||||||
|
CurMon = m;
|
||||||
|
CurDay = d;
|
||||||
|
if (DSEToday != RealToday) IgnoreOnce = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+37
-14
@@ -117,16 +117,16 @@ int DoFrename(ParsePtr p)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
if (FindBuiltinFunc(DBufValue(&newbuf))) {
|
if (FindBuiltinFunc(DBufValue(&newbuf))) {
|
||||||
Eprint("%s: `%s'", GetErr(E_REDEF_FUNC), DBufValue(&newbuf));
|
Eprint("%s: `%s'", GetErr(E_REDEF_BUILTIN_FUNC), DBufValue(&newbuf));
|
||||||
DBufFree(&oldbuf);
|
DBufFree(&oldbuf);
|
||||||
DBufFree(&newbuf);
|
DBufFree(&newbuf);
|
||||||
return E_REDEF_FUNC;
|
return E_REDEF_BUILTIN_FUNC;
|
||||||
}
|
}
|
||||||
if (FindBuiltinFunc(DBufValue(&oldbuf))) {
|
if (FindBuiltinFunc(DBufValue(&oldbuf))) {
|
||||||
Eprint("%s: `%s'", GetErr(E_REDEF_FUNC), DBufValue(&oldbuf));
|
Eprint("%s: `%s'", GetErr(E_REDEF_BUILTIN_FUNC), DBufValue(&oldbuf));
|
||||||
DBufFree(&oldbuf);
|
DBufFree(&oldbuf);
|
||||||
DBufFree(&newbuf);
|
DBufFree(&newbuf);
|
||||||
return E_REDEF_FUNC;
|
return E_REDEF_BUILTIN_FUNC;
|
||||||
}
|
}
|
||||||
RenameUserFunc(DBufValue(&oldbuf), DBufValue(&newbuf));
|
RenameUserFunc(DBufValue(&oldbuf), DBufValue(&newbuf));
|
||||||
DBufFree(&oldbuf);
|
DBufFree(&oldbuf);
|
||||||
@@ -288,23 +288,29 @@ int DoFset(ParsePtr p)
|
|||||||
nonconst_debug(0, tr("Function definition considered non-constant because of context"));
|
nonconst_debug(0, tr("Function definition considered non-constant because of context"));
|
||||||
func->is_constant = 0;
|
func->is_constant = 0;
|
||||||
}
|
}
|
||||||
StrnCpy(func->name, DBufValue(&buf), VAR_NAME_LEN);
|
|
||||||
DBufFree(&buf);
|
|
||||||
if (!Hush) {
|
|
||||||
if (FindBuiltinFunc(func->name)) {
|
|
||||||
if (warning_level("03.00.04")) {
|
|
||||||
Eprint("%s: `%s'", GetErr(E_REDEF_FUNC), func->name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func->node = NULL;
|
func->node = NULL;
|
||||||
func->nargs = 0;
|
func->nargs = 0;
|
||||||
func->args = NULL;
|
func->args = NULL;
|
||||||
|
|
||||||
|
StrnCpy(func->name, DBufValue(&buf), VAR_NAME_LEN);
|
||||||
|
DBufFree(&buf);
|
||||||
|
if (FindBuiltinFunc(func->name)) {
|
||||||
|
if (!Hush) {
|
||||||
|
if (warning_level("03.00.04")) {
|
||||||
|
Eprint("%s: `%s'", GetErr(E_REDEF_BUILTIN_FUNC), func->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DestroyUserFunc(func);
|
||||||
|
return E_REDEF_BUILTIN_FUNC;
|
||||||
|
}
|
||||||
|
|
||||||
/* Get the local variables */
|
/* Get the local variables */
|
||||||
|
|
||||||
c=ParseNonSpaceChar(p, &r, 1);
|
c=ParseNonSpaceChar(p, &r, 1);
|
||||||
if (r) return r;
|
if (r) {
|
||||||
|
DestroyUserFunc(func);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
if (c == ')') {
|
if (c == ')') {
|
||||||
(void) ParseNonSpaceChar(p, &r, 0);
|
(void) ParseNonSpaceChar(p, &r, 0);
|
||||||
} else {
|
} else {
|
||||||
@@ -449,6 +455,13 @@ static void DestroyUserFunc(UserFunc *f)
|
|||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
static void FUnset(char const *name)
|
static void FUnset(char const *name)
|
||||||
{
|
{
|
||||||
|
if (!Hush) {
|
||||||
|
if (FindBuiltinFunc(name)) {
|
||||||
|
if (warning_level("06.02.06")) {
|
||||||
|
Eprint("%s: `%s'", GetErr(E_UNSET_BUILTIN_FUNC), name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
UserFunc *f = FindUserFunc(name);
|
UserFunc *f = FindUserFunc(name);
|
||||||
if (f) {
|
if (f) {
|
||||||
hash_table_delete(&FuncHash, f);
|
hash_table_delete(&FuncHash, f);
|
||||||
@@ -715,6 +728,16 @@ int PushUserFuncs(ParsePtr p)
|
|||||||
return E_BAD_ID;
|
return E_BAD_ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (FindBuiltinFunc(name)) {
|
||||||
|
if (!Hush) {
|
||||||
|
if (warning_level("06.02.06")) {
|
||||||
|
Eprint("%s: `%s'", GetErr(E_PUSH_BUILTIN_FUNC), name);
|
||||||
|
FreshLine = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DBufFree(&buf);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
r = add_func_to_push(name, pf);
|
r = add_func_to_push(name, pf);
|
||||||
|
|
||||||
DBufFree(&buf);
|
DBufFree(&buf);
|
||||||
|
|||||||
@@ -850,6 +850,9 @@ int DoDump(ParsePtr p)
|
|||||||
else {
|
else {
|
||||||
fprintf(ErrFp, "%s ", v->name);
|
fprintf(ErrFp, "%s ", v->name);
|
||||||
PrintValue(&(v->v), ErrFp);
|
PrintValue(&(v->v), ErrFp);
|
||||||
|
if (v->preserve) {
|
||||||
|
fprintf(ErrFp, " <preserved>");
|
||||||
|
}
|
||||||
if (dump_constness) {
|
if (dump_constness) {
|
||||||
if (v->is_constant) {
|
if (v->is_constant) {
|
||||||
fprintf(ErrFp, " <const>");
|
fprintf(ErrFp, " <const>");
|
||||||
@@ -885,6 +888,9 @@ void DumpVarTable(int dump_constness)
|
|||||||
hash_table_for_each(v, &VHashTbl) {
|
hash_table_for_each(v, &VHashTbl) {
|
||||||
fprintf(ErrFp, "%s ", v->name);
|
fprintf(ErrFp, "%s ", v->name);
|
||||||
PrintValue(&(v->v), ErrFp);
|
PrintValue(&(v->v), ErrFp);
|
||||||
|
if (v->preserve) {
|
||||||
|
fprintf(ErrFp, " <preserved>");
|
||||||
|
}
|
||||||
if (dump_constness) {
|
if (dump_constness) {
|
||||||
if (v->is_constant) {
|
if (v->is_constant) {
|
||||||
fprintf(ErrFp, " <const>");
|
fprintf(ErrFp, " <const>");
|
||||||
@@ -1098,6 +1104,7 @@ static SysVar SysVarArr[] = {
|
|||||||
{"Pm", 1, TRANS_TYPE, "pm", 0, 0 },
|
{"Pm", 1, TRANS_TYPE, "pm", 0, 0 },
|
||||||
{"PrefixLineNo", 0, INT_TYPE, &DoPrefixLineNo, 0, 0 },
|
{"PrefixLineNo", 0, INT_TYPE, &DoPrefixLineNo, 0, 0 },
|
||||||
{"PSCal", 0, INT_TYPE, &PsCal, 0, 0 },
|
{"PSCal", 0, INT_TYPE, &PsCal, 0, 0 },
|
||||||
|
{"Repeat", 0, INT_TYPE, &OrigIterations, 0, 0 },
|
||||||
{"RunOff", 0, INT_TYPE, &RunDisabled, 0, 0 },
|
{"RunOff", 0, INT_TYPE, &RunDisabled, 0, 0 },
|
||||||
{"Saturday", 1, TRANS_TYPE, "Saturday", 0, 0 },
|
{"Saturday", 1, TRANS_TYPE, "Saturday", 0, 0 },
|
||||||
{"September", 1, TRANS_TYPE, "September", 0, 0 },
|
{"September", 1, TRANS_TYPE, "September", 0, 0 },
|
||||||
|
|||||||
@@ -184,6 +184,7 @@ Hohl
|
|||||||
Hplu
|
Hplu
|
||||||
Hurray
|
Hurray
|
||||||
HushMode
|
HushMode
|
||||||
|
ICS
|
||||||
IFTRIG
|
IFTRIG
|
||||||
IFs
|
IFs
|
||||||
IIF
|
IIF
|
||||||
@@ -257,6 +258,7 @@ Makefiles
|
|||||||
Marczykowski
|
Marczykowski
|
||||||
Marek
|
Marek
|
||||||
Marinus
|
Marinus
|
||||||
|
Matariki
|
||||||
MaxFullOmits
|
MaxFullOmits
|
||||||
MaxLateMinutes
|
MaxLateMinutes
|
||||||
MaxPartialOmits
|
MaxPartialOmits
|
||||||
@@ -757,6 +759,7 @@ noto
|
|||||||
nqueued
|
nqueued
|
||||||
nroff
|
nroff
|
||||||
num
|
num
|
||||||
|
nz
|
||||||
ok
|
ok
|
||||||
oktober
|
oktober
|
||||||
ol
|
ol
|
||||||
|
|||||||
@@ -59,11 +59,11 @@ OMIT 2 Jan 1992
|
|||||||
|
|
||||||
# Complicated expressions
|
# Complicated expressions
|
||||||
SET a 3
|
SET a 3
|
||||||
FSET const(x) x+3
|
FSET is_const(x) x+3
|
||||||
FSET not_const(x) x+nonconst(a)
|
FSET not_const(x) x+nonconst(a)
|
||||||
|
|
||||||
REM [const(5)] Jan 1992 MSG expired... should be commented out
|
REM [is_const(5)] Jan 1992 MSG expired... should be commented out
|
||||||
REM [const(a)] Jan 1992 MSG expired... should be commented out
|
REM [is_const(a)] Jan 1992 MSG expired... should be commented out
|
||||||
REM [not_const(5)] Jan 1992 MSG nonconstant expression
|
REM [not_const(5)] Jan 1992 MSG nonconstant expression
|
||||||
REM [value("a")] Jan 1992 MSG constant expression
|
REM [value("a")] Jan 1992 MSG constant expression
|
||||||
REM [value("__cabbage", 1)] Jan 1992 MSG non-constant expression
|
REM [value("__cabbage", 1)] Jan 1992 MSG non-constant expression
|
||||||
|
|||||||
@@ -994,6 +994,17 @@ $REMIND -pp ../tests/shaded.rem 2026-02-01 >> $OUT 2>&1
|
|||||||
$REMIND ../tests/test-pushpop1.rem 2026-01-01 >> $OUT 2>&1
|
$REMIND ../tests/test-pushpop1.rem 2026-01-01 >> $OUT 2>&1
|
||||||
$REMIND -dp ../tests/test-pushpop1.rem 2026-01-01 >> $OUT 2>&1
|
$REMIND -dp ../tests/test-pushpop1.rem 2026-01-01 >> $OUT 2>&1
|
||||||
|
|
||||||
|
# Test the '@trigger" command-line parameter
|
||||||
|
echo "REM MSG %y-%t-%r" | $REMIND --test - '@13 SATISFY [$Tw == 5]' >> $OUT 2>&1
|
||||||
|
echo "REM MSG %y-%t-%r" | $REMIND --test - '@January' >> $OUT 2>&1
|
||||||
|
echo "REM MSG %y-%t-%r" | $REMIND --test - '@Dec SATISFY [$Tw == 6]' >> $OUT 2>&1
|
||||||
|
echo "REM MSG %y-%t-%r" | $REMIND --test - '@Dec 1990' >> $OUT 2>&1
|
||||||
|
|
||||||
|
echo "REM MSG %y-%t-%r" | $REMIND - 2026-08-01 '@13 SATISFY [$Tw == 5]' >> $OUT 2>&1
|
||||||
|
echo "REM MSG %y-%t-%r" | $REMIND - 2026-08-01 '@January' >> $OUT 2>&1
|
||||||
|
echo "REM MSG %y-%t-%r" | $REMIND - 2026-08-01 '@Dec SATISFY [$Tw == 6]' >> $OUT 2>&1
|
||||||
|
echo "REM MSG %y-%t-%r" | $REMIND - 2026-08-01 '@Dec 1990' >> $OUT 2>&1
|
||||||
|
|
||||||
cmp -s $OUT $CMP
|
cmp -s $OUT $CMP
|
||||||
if [ "$?" = "0" ]; then
|
if [ "$?" = "0" ]; then
|
||||||
echo "Remind: Acceptance tests ${GRN}PASSED${NRM}"
|
echo "Remind: Acceptance tests ${GRN}PASSED${NRM}"
|
||||||
|
|||||||
+59
-16
@@ -1046,7 +1046,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() => "06.02.04"
|
version() => "06.02.06"
|
||||||
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"
|
||||||
@@ -2609,7 +2609,7 @@ a056 "SDFJHSDF KSJDFH KJSDFH KSJDFH"
|
|||||||
a007 "1991-02-16"
|
a007 "1991-02-16"
|
||||||
a057 "SDFJHSDF KSJDFH KJSDFH KSJDFH"
|
a057 "SDFJHSDF KSJDFH KJSDFH KSJDFH"
|
||||||
a008 "11:44"
|
a008 "11:44"
|
||||||
a058 "06.02.04"
|
a058 "06.02.06"
|
||||||
a059 "Saturday"
|
a059 "Saturday"
|
||||||
a010 12
|
a010 12
|
||||||
a060 6
|
a060 6
|
||||||
@@ -5563,8 +5563,8 @@ REM SATISFY ""
|
|||||||
REM SATISFY [version() > "01.00.00"]
|
REM SATISFY [version() > "01.00.00"]
|
||||||
../tests/test.rem(1074): SATISFY: expression has no reference to trigdate() or $T...
|
../tests/test.rem(1074): SATISFY: expression has no reference to trigdate() or $T...
|
||||||
../tests/test.rem(1074): Trig = Saturday, 16 February, 1991
|
../tests/test.rem(1074): Trig = Saturday, 16 February, 1991
|
||||||
version() => "06.02.04"
|
version() => "06.02.06"
|
||||||
"06.02.04" > "01.00.00" => 1
|
"06.02.06" > "01.00.00" => 1
|
||||||
../tests/test.rem(1074): Trig(satisfied) = Saturday, 16 February, 1991
|
../tests/test.rem(1074): 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(1075): SATISFY: expression has no reference to trigdate() or $T...
|
../tests/test.rem(1075): SATISFY: expression has no reference to trigdate() or $T...
|
||||||
@@ -16771,13 +16771,16 @@ mbupper("öÖçÇéôñÑÉÊ") => "ÖÖÇÇÉÔÑÑÉÊ"
|
|||||||
mblower("öÖçÇéôñÑÉÊ") => "ööççéôññéê"
|
mblower("öÖçÇéôñÑÉÊ") => "ööççéôññéê"
|
||||||
upper("öÖçÇéôñÑÉÊ") => "öÖçÇéôñÑÉÊ"
|
upper("öÖçÇéôñÑÉÊ") => "öÖçÇéôñÑÉÊ"
|
||||||
lower("öÖçÇéôñÑÉÊ") => "öÖçÇéôñÑÉÊ"
|
lower("öÖçÇéôñÑÉÊ") => "öÖçÇéôñÑÉÊ"
|
||||||
DynBuf Mallocs: 1132 mallocs; 31873408 bytes
|
../tests/test.rem(1915): Attempt to redefine built-in function: `max'
|
||||||
|
../tests/test.rem(1916): Attempt to unset built-in function: `max'
|
||||||
|
../tests/test.rem(1917): Attempt to PUSH built-in function: `max'
|
||||||
|
DynBuf Mallocs: 1134 mallocs; 31873536 bytes
|
||||||
Variable hash table statistics:
|
Variable hash table statistics:
|
||||||
Entries: 100146; Buckets: 87719; Non-empty Buckets: 66303
|
Entries: 100146; Buckets: 87719; Non-empty Buckets: 66303
|
||||||
Maxlen: 5; Minlen: 0; Avglen: 1.142; Stddev: 0.878; Avg nonempty len: 1.510
|
Maxlen: 5; Minlen: 0; Avglen: 1.142; Stddev: 0.878; Avg nonempty len: 1.510
|
||||||
Growths: 13; Shrinks: 0
|
Growths: 13; Shrinks: 0
|
||||||
Function hash table statistics:
|
Function hash table statistics:
|
||||||
Entries: 100023; Buckets: 87719; Non-empty Buckets: 63576
|
Entries: 100022; Buckets: 87719; Non-empty Buckets: 63575
|
||||||
Maxlen: 5; Minlen: 0; Avglen: 1.140; Stddev: 0.934; Avg nonempty len: 1.573
|
Maxlen: 5; Minlen: 0; Avglen: 1.140; Stddev: 0.934; Avg nonempty len: 1.573
|
||||||
Growths: 13; Shrinks: 0
|
Growths: 13; Shrinks: 0
|
||||||
Dedupe hash table statistics:
|
Dedupe hash table statistics:
|
||||||
@@ -16789,7 +16792,7 @@ Translation hash table statistics:
|
|||||||
Maxlen: 1; Minlen: 0; Avglen: 0.143; Stddev: 0.350; Avg nonempty len: 1.000
|
Maxlen: 1; Minlen: 0; Avglen: 0.143; Stddev: 0.350; Avg nonempty len: 1.000
|
||||||
Growths: 0; Shrinks: 0
|
Growths: 0; Shrinks: 0
|
||||||
Expression nodes allocated: 302080
|
Expression nodes allocated: 302080
|
||||||
Expression nodes high-water: 302076
|
Expression nodes high-water: 302075
|
||||||
Expression nodes leaked: 0
|
Expression nodes leaked: 0
|
||||||
Parse level high-water: 34
|
Parse level high-water: 34
|
||||||
Max expr node evaluations per line: 2001
|
Max expr node evaluations per line: 2001
|
||||||
@@ -20507,7 +20510,6 @@ Timed
|
|||||||
Untimed
|
Untimed
|
||||||
|
|
||||||
Purge Test
|
Purge Test
|
||||||
../tests/purge_dir/f3.rem(62): Attempt to redefine built-in function: `const'
|
|
||||||
../tests/purge_dir/f3.rem(76): `/': Division by zero
|
../tests/purge_dir/f3.rem(76): `/': Division by zero
|
||||||
../tests/purge_dir/f3.rem(76): `/': Division by zero
|
../tests/purge_dir/f3.rem(76): `/': Division by zero
|
||||||
F1
|
F1
|
||||||
@@ -20603,13 +20605,13 @@ OMIT 2 Jan 1992
|
|||||||
|
|
||||||
# Complicated expressions
|
# Complicated expressions
|
||||||
SET a 3
|
SET a 3
|
||||||
FSET const(x) x+3
|
FSET is_const(x) x+3
|
||||||
FSET not_const(x) x+nonconst(a)
|
FSET not_const(x) x+nonconst(a)
|
||||||
|
|
||||||
#!P: Next line has expired, but contains expression... please verify
|
#!P: Next line has expired, but contains expression... please verify
|
||||||
#!P: Expired: REM [const(5)] Jan 1992 MSG expired... should be commented out
|
#!P: Expired: REM [is_const(5)] Jan 1992 MSG expired... should be commented out
|
||||||
#!P: Next line has expired, but contains expression... please verify
|
#!P: Next line has expired, but contains expression... please verify
|
||||||
#!P: Expired: REM [const(a)] Jan 1992 MSG expired... should be commented out
|
#!P: Expired: REM [is_const(a)] Jan 1992 MSG expired... should be commented out
|
||||||
#!P: Next line may have expired, but contains non-constant expression
|
#!P: Next line may have expired, but contains non-constant expression
|
||||||
#!P: or a relative SCANFROM clause
|
#!P: or a relative SCANFROM clause
|
||||||
REM [not_const(5)] Jan 1992 MSG nonconstant expression
|
REM [not_const(5)] Jan 1992 MSG nonconstant expression
|
||||||
@@ -20727,11 +20729,11 @@ OMIT 2 Jan 1992
|
|||||||
|
|
||||||
# Complicated expressions
|
# Complicated expressions
|
||||||
SET a 3
|
SET a 3
|
||||||
FSET const(x) x+3
|
FSET is_const(x) x+3
|
||||||
FSET not_const(x) x+nonconst(a)
|
FSET not_const(x) x+nonconst(a)
|
||||||
|
|
||||||
#!P: Expired: REM [const(5)] Jan 1992 MSG expired... should be commented out
|
#!P: Expired: REM [is_const(5)] Jan 1992 MSG expired... should be commented out
|
||||||
#!P: Expired: REM [const(a)] Jan 1992 MSG expired... should be commented out
|
#!P: Expired: REM [is_const(a)] Jan 1992 MSG expired... should be commented out
|
||||||
REM [not_const(5)] Jan 1992 MSG nonconstant expression
|
REM [not_const(5)] Jan 1992 MSG nonconstant expression
|
||||||
#!P: Expired: REM [value("a")] Jan 1992 MSG constant expression
|
#!P: Expired: REM [value("a")] Jan 1992 MSG constant expression
|
||||||
REM [value("__cabbage", 1)] Jan 1992 MSG non-constant expression
|
REM [value("__cabbage", 1)] Jan 1992 MSG non-constant expression
|
||||||
@@ -23831,7 +23833,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
|
||||||
06.02.04
|
06.02.06
|
||||||
Enabling test mode: This is meant for the acceptance test.
|
Enabling test mode: This is meant for the acceptance test.
|
||||||
Do not use --test in production.
|
Do not use --test in production.
|
||||||
In test mode, the system time is fixed at 2025-01-06@19:00
|
In test mode, the system time is fixed at 2025-01-06@19:00
|
||||||
@@ -23994,7 +23996,7 @@ No bug
|
|||||||
|
|
||||||
Variable Value
|
Variable Value
|
||||||
|
|
||||||
foo 0
|
foo 0 <preserved>
|
||||||
No reminders.
|
No reminders.
|
||||||
Variable Value
|
Variable Value
|
||||||
|
|
||||||
@@ -24948,6 +24950,7 @@ $ParseUntriggered
|
|||||||
$Pm
|
$Pm
|
||||||
$PrefixLineNo
|
$PrefixLineNo
|
||||||
$PSCal
|
$PSCal
|
||||||
|
$Repeat
|
||||||
$RunOff
|
$RunOff
|
||||||
$Saturday
|
$Saturday
|
||||||
$September
|
$September
|
||||||
@@ -25200,6 +25203,8 @@ TRANSLATE "Maximum expression complexity exceeded" ""
|
|||||||
TRANSLATE "Expecting operator or end-of-expression" ""
|
TRANSLATE "Expecting operator or end-of-expression" ""
|
||||||
TRANSLATE "Expecting constant, variable, function call or (expression)" ""
|
TRANSLATE "Expecting constant, variable, function call or (expression)" ""
|
||||||
TRANSLATE "Invalid value for system variable" ""
|
TRANSLATE "Invalid value for system variable" ""
|
||||||
|
TRANSLATE "Attempt to unset built-in function" ""
|
||||||
|
TRANSLATE "Attempt to PUSH built-in function" ""
|
||||||
|
|
||||||
# Other Messages
|
# Other Messages
|
||||||
TRANSLATE "%s function `%s' defined at %s(%s) does not use its argument" ""
|
TRANSLATE "%s function `%s' defined at %s(%s) does not use its argument" ""
|
||||||
@@ -40278,3 +40283,41 @@ No reminders.
|
|||||||
../tests/test-pushpop2.rem(2): POP-FUNCS at ../tests/test-pushpop2.rem:2 matches PUSH-FUNCS in different file: ../tests/test-pushpop1.rem:2
|
../tests/test-pushpop2.rem(2): POP-FUNCS at ../tests/test-pushpop2.rem:2 matches PUSH-FUNCS in different file: ../tests/test-pushpop1.rem:2
|
||||||
../tests/test-pushpop2.rem(3): POP-OMIT-CONTEXT at ../tests/test-pushpop2.rem:3 matches PUSH-OMIT-CONTEXT in different file: ../tests/test-pushpop1.rem:1
|
../tests/test-pushpop2.rem(3): POP-OMIT-CONTEXT at ../tests/test-pushpop2.rem:3 matches PUSH-OMIT-CONTEXT in different file: ../tests/test-pushpop1.rem:1
|
||||||
No reminders.
|
No reminders.
|
||||||
|
Enabling test mode: This is meant for the acceptance test.
|
||||||
|
Do not use --test in production.
|
||||||
|
In test mode, the system time is fixed at 2025-01-06@19:00
|
||||||
|
Reminders for Friday, 13th June, 2025:
|
||||||
|
|
||||||
|
2025-06-13
|
||||||
|
|
||||||
|
Enabling test mode: This is meant for the acceptance test.
|
||||||
|
Do not use --test in production.
|
||||||
|
In test mode, the system time is fixed at 2025-01-06@19:00
|
||||||
|
Reminders for Monday, 6th January, 2025 (today):
|
||||||
|
|
||||||
|
2025-01-06
|
||||||
|
|
||||||
|
Enabling test mode: This is meant for the acceptance test.
|
||||||
|
Do not use --test in production.
|
||||||
|
In test mode, the system time is fixed at 2025-01-06@19:00
|
||||||
|
Reminders for Saturday, 6th December, 2025:
|
||||||
|
|
||||||
|
2025-12-06
|
||||||
|
|
||||||
|
Enabling test mode: This is meant for the acceptance test.
|
||||||
|
Do not use --test in production.
|
||||||
|
In test mode, the system time is fixed at 2025-01-06@19:00
|
||||||
|
Could not evaluate command-line trigger: Can't compute trigger
|
||||||
|
Reminders for Friday, 13th November, 2026:
|
||||||
|
|
||||||
|
2026-11-13
|
||||||
|
|
||||||
|
Reminders for Friday, 1st January, 2027:
|
||||||
|
|
||||||
|
2027-01-01
|
||||||
|
|
||||||
|
Reminders for Saturday, 5th December, 2026:
|
||||||
|
|
||||||
|
2026-12-05
|
||||||
|
|
||||||
|
Could not evaluate command-line trigger: Can't compute trigger
|
||||||
|
|||||||
@@ -1911,6 +1911,12 @@ SET a upper("öÖçÇéôñÑÉÊ")
|
|||||||
SET a lower("öÖçÇéôñÑÉÊ")
|
SET a lower("öÖçÇéôñÑÉÊ")
|
||||||
DEBUG -x
|
DEBUG -x
|
||||||
|
|
||||||
|
# Warnings about defining/unsetting/pushing built-in functions
|
||||||
|
FSET max(x) x*2
|
||||||
|
FUNSET max
|
||||||
|
PUSH-FUNCS max a b c
|
||||||
|
POP-FUNCS
|
||||||
|
|
||||||
# Don't want Remind to queue reminders
|
# Don't want Remind to queue reminders
|
||||||
EXIT
|
EXIT
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user