Compare commits

...

79 Commits

Author SHA1 Message Date
Dianne Skoll
62b94ab065 Update WHATSNEW. 2022-03-25 16:08:33 -04:00
Dianne Skoll
49c7399599 Add "pad" function 2022-03-25 16:07:17 -04:00
Dianne Skoll
5fa9297aba Bump version to 04.00.00 2022-03-25 15:52:07 -04:00
Dianne Skoll
4ada31798b Document language packs. 2022-03-25 15:14:59 -04:00
Dianne Skoll
e78f953e90 Document "pad" function. 2022-03-25 14:47:42 -04:00
Dianne Skoll
af7a9ad8b5 Use Eprint instead of Wprint 2022-03-25 14:20:40 -04:00
Dianne Skoll
35eae045a6 Fix up test file. 2022-03-25 14:18:12 -04:00
Dianne Skoll
98a20ae058 Better call-stack printing. 2022-03-25 14:17:43 -04:00
Dianne Skoll
df9ef6e13a Print call stack if an error occurs in a user-defined function. 2022-03-25 14:03:06 -04:00
Dianne Skoll
10f5802069 Add callstack-management functions. 2022-03-25 13:56:00 -04:00
Dianne Skoll
780044219f Store the filename / lineno at which a user-defined function is defined. 2022-03-25 13:40:07 -04:00
Dianne Skoll
d015c061e7 Add site/ subdir and README. 2022-03-25 11:26:42 -04:00
Dianne Skoll
6f6326d433 Add another pad() test. 2022-03-25 11:13:51 -04:00
Dianne Skoll
9488e7ca13 Don't let pad function make over-long strings. 2022-03-25 11:08:43 -04:00
Dianne Skoll
71c11672c2 Add null "en.rem" 2022-03-25 10:59:51 -04:00
Dianne Skoll
0acefa800e Add Spanish language pack. 2022-03-25 10:58:57 -04:00
Dianne Skoll
d45cee4712 Add Romanian language pack. 2022-03-25 10:53:20 -04:00
Dianne Skoll
c026aa05e2 Warn if a substitution expression evaluates incorrectly. 2022-03-25 10:53:08 -04:00
Dianne Skoll
50076c74fa Implement Portuguese language pack. 2022-03-25 08:54:13 -04:00
Dianne Skoll
1563d77c06 More extensive tests. 2022-03-24 18:53:55 -04:00
Dianne Skoll
ed72ef8629 Use built-in "pad" function 2022-03-24 17:34:08 -04:00
Dianne Skoll
06c5996086 Add tests for pad function 2022-03-24 17:33:16 -04:00
Dianne Skoll
570ca857a0 Add "pad" function; make compare-language-mods.pl quiet. 2022-03-24 17:31:37 -04:00
Dianne Skoll
f8f20b7afc Add Polish language pack 2022-03-24 16:33:48 -04:00
Dianne Skoll
f55ef7ff20 Add Norwegian language pack. 2022-03-24 16:04:54 -04:00
Dianne Skoll
79220a74cf Add Italian language pack. 2022-03-24 15:49:25 -04:00
Dianne Skoll
77111ef628 Convert to utf-8 2022-03-24 15:01:37 -04:00
Dianne Skoll
bf96063311 Convert is.rem to utf-8 2022-03-24 14:45:57 -04:00
Dianne Skoll
58a201fceb Fix typo 2022-03-24 14:42:01 -04:00
Dianne Skoll
47cecb210b Add an auto.rem file to pick language file based on locale. 2022-03-24 14:39:18 -04:00
Dianne Skoll
bfbf744b0a Implement Icelandic language pack. 2022-03-24 14:14:42 -04:00
Dianne Skoll
0cf56ac1de Error-check -@ values. 2022-03-24 14:07:07 -04:00
Dianne Skoll
2880a718f4 Fix bug in compiled Dutch language support. 2022-03-24 12:34:58 -04:00
Dianne Skoll
da0dd0f7c6 Tweak nl language pack. 2022-03-24 12:32:43 -04:00
Dianne Skoll
c456d3e0ff More extensive testing. 2022-03-24 12:30:04 -04:00
Dianne Skoll
59059736e6 Add remembrance day 2022-03-24 11:42:45 -04:00
Dianne Skoll
f5cf2ab832 Working version of Finnish language pack! 2022-03-24 11:22:15 -04:00
Dianne Skoll
cc4ff2582d More work on getting Finnish language pack working properly. 2022-03-24 11:05:58 -04:00
Dianne Skoll
90f5fde3bb Progress on Finnish language pack. 2022-03-24 10:38:03 -04:00
Dianne Skoll
9fbe9f5132 Add more tests. 2022-03-23 17:30:28 -04:00
Dianne Skoll
f05661fa6c Fix typo 2022-03-23 17:22:47 -04:00
Dianne Skoll
d6882c3378 Add more tests. 2022-03-23 17:20:13 -04:00
Dianne Skoll
e32cab937e Install everything under include/ in $SysInclude 2022-03-23 16:43:15 -04:00
Dianne Skoll
14bb939977 Add US holidays. 2022-03-23 15:44:23 -04:00
Dianne Skoll
13e830782d Port over NL 2022-03-23 15:37:49 -04:00
Dianne Skoll
f39bb5e2d9 Tweaks 2022-03-23 14:53:28 -04:00
Dianne Skoll
8b795e81b7 Port Danish to da.rem 2022-03-23 14:47:22 -04:00
Dianne Skoll
aef7eeda5a Make "de" runtime localization match compiled version. 2022-03-23 12:04:54 -04:00
Dianne Skoll
0641a6f8f1 Add support for the "subst_#x" functions to simplify language customization. 2022-03-23 11:52:51 -04:00
Dianne Skoll
4fdf7b706b More work on making run-time language module match compile-time module. 2022-03-23 11:47:00 -04:00
Dianne Skoll
0653b9420a Add "q" suboption to "-p" to not suppress quote markers. 2022-03-23 11:02:16 -04:00
Dianne Skoll
27ede1ce37 Start working on runtime language files; make sure they give
the same tstlang.rem output as compiled language files.
2022-03-23 10:16:59 -04:00
Dianne Skoll
a303fb9cba Tweak configure script to use autoconf macros 2022-03-22 10:40:41 -04:00
Dianne Skoll
92af4e9c3e Only use -flto=auto and -ffat-lto-objects if C compiler supports them. 2022-03-22 10:33:36 -04:00
Dianne Skoll
abc4f45fed Compile with link-time optimization enabled if we're using gcc 2022-03-22 09:18:28 -04:00
Dianne Skoll
e651f92bd9 Make tests pass even if we use LTO. 2022-03-22 09:17:31 -04:00
Dianne Skoll
b2d3d98d72 Update de.rem 2022-03-20 14:22:15 -04:00
Dianne Skoll
cb8b7f85af Language tweaks 2022-03-20 14:20:01 -04:00
Dianne Skoll
d30f347a0b More language work. 2022-03-20 13:05:24 -04:00
Dianne Skoll
5e9b1e7464 Fix compilation errors for non-English languages. 2022-03-20 10:49:37 -04:00
Dianne Skoll
58085470c5 Install fr.rem 2022-03-20 10:31:53 -04:00
Dianne Skoll
8f0de805d5 More work on fr.rem 2022-03-20 10:27:04 -04:00
Dianne Skoll
3f879a1b97 Add subst_ampm and subst_ordinal 2022-03-20 10:20:50 -04:00
Dianne Skoll
94270c3d98 Add sys vars 2022-03-20 10:01:31 -04:00
Dianne Skoll
bb8a689186 Add a whole slew of system variables to customize language. 2022-03-20 09:53:31 -04:00
Dianne Skoll
a7e73cdac8 Remove IN_DOSUBST guards. 2022-03-20 09:44:42 -04:00
Dianne Skoll
d38c324340 Start making language stuff dynamic. 2022-03-20 09:42:24 -04:00
Dianne Skoll
fade38d522 Add $SysInclude system variable. 2022-03-20 08:56:01 -04:00
Dianne Skoll
858a7601aa Add support for "subst_X" functions to modify dosubst. 2022-03-19 15:53:21 -04:00
Dianne Skoll
37e3d3d1d1 Add $Today and $Tomorrow system variables. 2022-03-19 15:17:18 -04:00
Dianne Skoll
ff67ab3c86 We only need 6 digits of precision. 2022-03-17 17:37:40 -04:00
Dianne Skoll
ad7faa8ad9 Don't check errno 2022-03-17 17:33:50 -04:00
Dianne Skoll
c927166a8a Accept but warn if $Latitude/$Longituded uses locale decimal separator instead of "." 2022-03-17 11:29:27 -04:00
Dianne Skoll
9d22fba842 Document that decimal separator for $Latitude and $Longitude is always "." 2022-03-17 11:23:16 -04:00
Dianne Skoll
3d5adf6c42 Always interpret $Latitude and $Longitude values in the C locale. 2022-03-17 11:21:27 -04:00
Dianne Skoll
5ba862cbd7 Don't define RET as 'remind-indent-line 2022-03-17 10:22:13 -04:00
Dianne Skoll
6f20e056c9 Allow day numbers to be anchored to left, center or right.
Based on a patch from Paulo <qsmodo *AT* tutanota.com>
2022-03-16 17:30:06 -04:00
Dianne Skoll
878ab1a8bc Fix a bunch of spelling mistakes found by Jens Schleusener 2022-03-15 14:40:46 -04:00
Dianne Skoll
4d17494371 Bump copyright date. 2022-03-14 21:12:20 -04:00
85 changed files with 2701 additions and 449 deletions

21
.gitignore vendored
View File

@@ -1,27 +1,28 @@
rem2pdf/Makefile.old
*.bak
*.o
*~
.gitignore
MYMETA.json
MYMETA.yml
Makefile
TAGS
autom4te.cache
blib/
config.log
config.status
pm_to_blib
rem2html/Makefile
rem2html/rem2html.1
rem2pdf/Makefile.PL
rem2pdf/Makefile.old
rem2pdf/Makefile.top
rem2pdf/bin/rem2pdf
src/*.tar.gz*
src/Makefile
src/config.h
src/rem2ps
src/remind
src/test-*.out
src/version.h
tests/test.out
www/Makefile
rem2pdf/Makefile.PL
MYMETA.json
MYMETA.yml
Makefile
blib/
pm_to_blib
rem2pdf/Makefile.top
rem2pdf/bin/rem2pdf
rem2html/rem2html.1

View File

@@ -3,7 +3,7 @@ THE REMIND COPYRIGHT
1. REMIND refers to the entire set of files and documentation in the
REMIND package.
2. REMIND is Copyright 1992-2021 Dianne Skoll, except where noted in
2. REMIND is Copyright 1992-2022 Dianne Skoll, except where noted in
individual files.
3. DISTRIBUTION AND USE

View File

@@ -355,7 +355,7 @@ proc RunCommand { cmd } {
# %RETURNS:
# Nothing
# %DESCRIPTION:
# Reads characters from command pipelin and appends them to .msg.
# Reads characters from command pipeline and appends them to .msg.
#***********************************************************************
proc CommandReadable { f } {
global CmdDone

16
configure vendored
View File

@@ -3306,7 +3306,6 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrt in -lm" >&5
$as_echo_n "checking for sqrt in -lm... " >&6; }
if ${ac_cv_lib_m_sqrt+:} false; then :
@@ -3974,6 +3973,19 @@ fi
if test "$GCC" = yes; then
CFLAGS="$CFLAGS -Wall -Wextra -Wstrict-prototypes"
# Check for link-time optimization support
for f in -flto=auto -ffat-lto-objects; do
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports $f" >&5
$as_echo_n "checking whether $CC supports $f... " >&6; }
if $CC -E $f /dev/null > /dev/null 2>&1 ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
CFLAGS="$CFLAGS $f"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
done
fi
if test "$ac_cv_perlartifacts" = "yes" ; then
@@ -3994,7 +4006,7 @@ _ACEOF
fi
done
VERSION=03.04.02
VERSION=04.00.00

View File

@@ -28,8 +28,6 @@ AC_PROG_MAKE_SET
AC_PATH_PROG([PERL], [perl])
dnl Checks for libraries.
dnl Replace `main' with a function in -lm:
AC_CHECK_LIB(m, sqrt)
dnl Integer sizes
@@ -48,6 +46,16 @@ AC_HEADER_TIME
if test "$GCC" = yes; then
CFLAGS="$CFLAGS -Wall -Wextra -Wstrict-prototypes"
# Check for link-time optimization support
for f in -flto=auto -ffat-lto-objects; do
AC_MSG_CHECKING([whether $CC supports $f])
if $CC -E $f /dev/null > /dev/null 2>&1 ; then
AC_MSG_RESULT([yes])
CFLAGS="$CFLAGS $f"
else
AC_MSG_RESULT([no])
fi
done
fi
if test "$ac_cv_perlartifacts" = "yes" ; then
@@ -57,7 +65,7 @@ else
fi
AC_CHECK_FUNCS(setenv unsetenv glob mbstowcs setlocale initgroups)
VERSION=03.04.02
VERSION=04.00.00
AC_SUBST(VERSION)
AC_SUBST(PERL)
AC_SUBST(PERLARTIFACTS)

View File

@@ -32,7 +32,7 @@
# version 0.5 2007-03-21
# - Add more help options
# - --project-lead-time option
# - Supress printing of heading if there are no todos to print
# - Suppress printing of heading if there are no todos to print
# version 0.4
# - Version 0.4 changes all written or inspired by, and thanks to Mark Stosberg
# - Change to GetOptions
@@ -84,7 +84,7 @@ How may days in advance to start getting reminders about the events. Defaults to
ical2rem.pl --no-todos
If you don't care about the ToDos the calendar, this will surpress
If you don't care about the ToDos the calendar, this will suppress
printing of the ToDo heading, as well as skipping ToDo processing.
=head2 --heading

View File

@@ -141,7 +141,7 @@ appear with exactly the text and exactly the same duration (including
one VEVENT object, that will have a RFC2445 C<RDATE> property.
B<rem2ics> is not yet smart enough to derive an C<RRULE> based
recurrance. If you really want that feature, either implement it and
recurrence. If you really want that feature, either implement it and
send in a patch, or contact the author and convince him to do it.
=head2 Other iCalendar Properties
@@ -164,7 +164,7 @@ runs.
=head2 Other iCalendar Perl objects
Why does't B<rem2ics> use any of the iCalendar Perl stuff in CPAN?
Why doesn't B<rem2ics> use any of the iCalendar Perl stuff in CPAN?
Because I don't trust them, and they are too big for this app. One
links to a binary library. Another hasn't been maintained since 1991,
and is full of notes as to how buggy and incomplete it is. And so
@@ -218,7 +218,7 @@ Bug fix, error message for non-recurring events
Bug fix,
rem2ics 0.91 chokes on timed reminders with
duration using `remind -s` as it functions in remind-03.01.03.
Remind 3.01 changed how the -s data is formated for events that have a duration
Remind 3.01 changed how the -s data is formatted for events that have a duration
Patch by Paul Hinze E<lt>paul dot t dot hinze at gmail dot comE<gt>
and Michael Schultz E<lt>mjschultz at gmail dot comE<gt>
@@ -376,7 +376,7 @@ foreach $v (@events) {
my(%grovel);
# if the user doesnt want recurrance detection
# if the user doesn't want recurrence detection
unless ($options{norecurr}) {
# then dont put events in the grovel hash
@@ -393,7 +393,7 @@ unless ($options{norecurr}) {
$v = ${$grovel{$k}}[0];
$v->{recurlist} = \@{$grovel{$k}};
foreach my $v0 (@{$grovel{$k}}) {
$v0->{is_recurrance} = $v;
$v0->{is_recurrence} = $v;
}
}
}
@@ -409,12 +409,12 @@ unless ($options{norecurr}) {
# might have a problem if a recurring event has two instances both on
# the first day.
# Every event that is recurring has a "is_recurrance" property.
# Every event that is recurring has a "is_recurrence" property.
# Additionally, (hopefully) the first/earliest event in a set of
# recurrances has a "recurlist" property. The "recurlist" is a
# recurrences has a "recurlist" property. The "recurlist" is a
# reference to a list of references to each of the events. The first
# one on that list will be the same event that has the "recurlist"
# property. The "is_recurrance" property is a reference back to the
# property. The "is_recurrence" property is a reference back to the
# event that has the "recurlist" property.
foreach my $k (keys %grovel) {
@@ -466,8 +466,8 @@ foreach my $k (keys %grovel) {
}
foreach $v (@events) {
# for recurrant events, skip those that arnt the "head"
next if ($v->{is_recurrance} and (not $v->{recurlist}));
# for recurrent events, skip those that arnt the "head"
next if ($v->{is_recurrence} and (not $v->{recurlist}));
if (${$v->{sf}}[4] eq "*") { # no time was given
$v->{i_dtstart} = sprintf("DTSTART:%s", $v->{dts});
@@ -485,7 +485,7 @@ foreach $v (@events) {
}
if (${$v->{sf}}[3] ne "*") { # a duration was given
# It's convienient that RFC2445 defines DURATION, thus we
# It's convenient that RFC2445 defines DURATION, thus we
# don't need to calculate DTEND, with awkward figuring out
# crossing hours, days, months, year, etc. Instead we
# will let the iCalendar consuming application worry about it.
@@ -501,8 +501,8 @@ print "BEGIN:VCALENDAR\015\012"
# output each vevent
foreach $v (@events) {
# for recurrant events, only output the "head", skip the others
next if ($v->{is_recurrance} and (not $v->{recurlist}));
# for recurrent events, only output the "head", skip the others
next if ($v->{is_recurrence} and (not $v->{recurlist}));
print "BEGIN:VEVENT\015\012";
my $tag = ${$v->{sf}}[2];

View File

@@ -5,7 +5,7 @@
;; Author: Shelagh Manton <shelagh.manton@gmail.com> with help from
;; Dianne Skoll
;; Keywords: remind configure convenience
;; Version: 0.15
;; Version: 0.15-dfs2
;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the GNU General Public License
@@ -91,7 +91,6 @@
(define-key remind-conf-mode-map "\C-c\C-x" 'rem-tomorrow)
(define-key remind-conf-mode-map "\C-c\C-a" 'rem-days-away)
(define-key remind-conf-mode-map "\M-j" 'remind-indent-line)
(define-key remind-conf-mode-map (kbd "RET") 'remind-indent-line)
(define-key remind-conf-mode-map "\C-c\C-c" 'rem-save-file)
;; syntax-table
@@ -133,20 +132,20 @@
(defconst remind-builtin-variables
(sort
(list "$April" "$August" "$CalcUTC" "$CalMode" "$Daemon" "$DateSep"
(list "$Ago" "$Am" "$And" "$April" "$At" "$August" "$CalcUTC" "$CalMode" "$Daemon" "$DateSep"
"$DateTimeSep" "$December" "$DefaultColor" "$DefaultPrio"
"$DefaultTDelta" "$DeltaOffset" "$DontFork" "$DontQueue"
"$DontTrigAts" "$EndSent" "$EndSentIg" "$February" "$FirstIndent"
"$FoldYear" "$FormWidth" "$Friday" "$HushMode" "$IgnoreOnce"
"$InfDelta" "$IntMax" "$IntMin" "$January" "$July" "$June" "$LatDeg"
"$FoldYear" "$FormWidth" "$Friday" "$Fromnow" "$Hour" "$Hplu" "$HushMode" "$IgnoreOnce"
"$InfDelta" "$IntMax" "$IntMin" "$Is" "$January" "$July" "$June" "$LatDeg"
"$Latitude" "$LatMin" "$LatSec" "$Location" "$LongDeg" "$Longitude"
"$LongMin" "$LongSec" "$March" "$MaxSatIter" "$MaxStringLen" "$May"
"$MinsFromUTC" "$Monday" "$NextMode" "$November" "$NumQueued"
"$NumTrig" "$October" "$PrefixLineNo" "$PSCal" "$RunOff" "$Saturday"
"$MinsFromUTC" "$Minute" "$Monday" "$Mplu" "$NextMode" "$November" "$Now" "$NumQueued"
"$NumTrig" "$October" "$On" "$Pm" "$PrefixLineNo" "$PSCal" "$RunOff" "$Saturday"
"$September" "$SimpleCal" "$SortByDate" "$SortByPrio" "$SortByTime"
"$SubsIndent" "$Sunday" "$T" "$Td" "$Thursday" "$TimeSep" "$Tm"
"$Tuesday" "$Tw" "$Ty" "$U" "$Ud" "$Um" "$UntimedFirst" "$Uw" "$Uy"
"$Wednesday")
"$SubsIndent" "$Sunday" "$SysInclude" "$T" "$Td" "$Thursday" "$TimeSep" "$Tm"
"$Today" "$Tomorrow" "$Tuesday" "$Tw" "$Ty" "$U" "$Ud" "$Um" "$UntimedFirst" "$Uw" "$Uy"
"$Was" "$Wednesday")
#'(lambda (a b) (> (length a) (length b)))))
@@ -168,7 +167,7 @@
"hebday" "hebmon" "hebyear" "hour" "iif" "index" "isany" "isdst"
"isleap" "isomitted" "language" "lower" "max" "min" "minsfromutc"
"minute" "mon" "monnum" "moondate" "moondatetime" "moonphase"
"moontime" "ndawn" "ndusk" "nonomitted" "now" "ord" "ostype" "plural"
"moontime" "ndawn" "ndusk" "nonomitted" "now" "ord" "ostype" "pad" "plural"
"psmoon" "psshade" "realcurrent" "realnow" "realtoday" "sgn" "shell"
"shellescape" "slide" "strlen" "substr" "sunrise" "sunset" "time"
"timepart" "today" "trig" "trigback" "trigdate" "trigdatetime"

View File

@@ -1,5 +1,46 @@
CHANGES TO REMIND
* VERSION 4.0 Patch 0 - 2022-??-??
- MAJOR NEW FEATURE: remind: Remind output can effectively be
translated into other languages at run-time. A number of system
variables let you translate English words to another language, and a
mechanism for altering the substitution filter at run-time lets you
translate its output so the results are idiomatic. See the man page
sections "RUN-TIME SUPPORT FOR OTHER LANGUAGES", "RUN-TIME
MODIFICATION OF THE SUBSTITUTION FILTER" and "LANGUAGE PACKS".
- NEW FEATURE: remind: Add the pad() built-in function
- NEW FEATURE: tkremind: Day numbers can be displayed left-aligned,
centered or right-aligned.
- IMPROVEMENT: contrib/remind-conf-mode: The Emacs syntax-highlighter
has been updated with the latest system variables and functions
and has been made case-insensitive.
- IMPROVEMENT: remind, rem2ps: Use link-time optimization with gcc if
possible.
- IMPROVEMENT: remind: Print better diagnostics when errors occur inside
a user-defined function. We now show the stack trace to make it easier
to figure out where the error actually is.
- CHANGE: Add a "q" sub-option to the "-p", "-pp", and "-ppp" options.
This causes Remind *not* to remove the %"...%" marker sequence from
remind bodies.
- BUG FIX: Fix the overflow-detection functions so they work with link-time
optimization. The previous versions would be optimized away.
- BUG FIX: Warn if the arguments to the "-@" option are out of range.
Problem noted by Ian! D. Allen.
- BUG FIX: Always interpret $Latitude and $Longitude input values in the
"C" locale. (We do accept localized input, but warn.)
- BUG FIX: Fix many spelling mistakes caught by Jens Schleusener
* VERSION 3.4 Patch 2 - 2022-03-14
- NEW FEATURE: remind: Add syntactic sugar to simplify some common

View File

@@ -36,7 +36,7 @@ ENDIF
###########################################################
SET Quote CHAR(34)
# Handy constants/function for specifing week of month...
# Handy constants/function for specifying week of month...
SET Week_1 1
SET Week_2 8
SET Week_3 15

View File

@@ -1,7 +1,7 @@
" Vim syntax file
" Language: Remind
" Maintainer: Davide Alberani <da@erlug.linux.it>
" Last Change: 02 Nov 2015 + 13 Mar 2021 by Dianne Skoll <dianne@skoll.ca>
" Last Change: 02 Nov 2015 + 13 Mar 2022 by Dianne Skoll <dianne@skoll.ca>
" Version: 0.7+dianne1
" URL: http://ismito.it/vim/syntax/remind.vim
"

29
include/holidays/ca.rem Normal file
View File

@@ -0,0 +1,29 @@
# Canadian holidays
OMIT 1 Jan MSG New Year's Day
# This varies by province
REM Third Monday in Feb SCANFROM -7 ADDOMIT MSG Family Day
# This varies by province
OMIT [easterdate($Uy) - 2] MSG Good Friday
# This varies by province
OMIT [easterdate($Uy) + 1] MSG Easter Monday
REM Mon 18 May SCANFROM -7 ADDOMIT MSG Victoria Day
OMIT 1 July MSG Canada Day
# This varies by province
REM First Monday in Aug SCANFROM -7 ADDOMIT MSG Civic Holiday
REM First Monday in Sep SCANFROM -7 ADDOMIT MSG Labour Day
REM Second Monday in Oct SCANFROM -7 ADDOMIT MSG Thanksgiving Day
REM 11 November MSG Remembrance Day
OMIT 25 Dec MSG Christmas
OMIT 26 Dec MSG Boxing Day

49
include/holidays/us.rem Normal file
View File

@@ -0,0 +1,49 @@
# US holidays
# This file is part of REMIND.
# Copyright (C) 1992-2022 Dianne Skoll
REM [easterdate($Uy)-46] MSG %"Ash Wednesday%"
REM [easterdate($Uy)-7] MSG %"Palm Sunday%"
OMIT [easterdate($Uy)-2] MSG %"Good Friday%"
OMIT [easterdate($Uy)] MSG %"Easter%" Sunday
REM [easterdate($Uy)+39] MSG %"Ascension Day%"
REM [easterdate($Uy)+49] MSG %"Pentecost%"
# Some holidays are omitted, some are not. You may want to change
# which ones are omitted.
OMIT Jan 1 MSG %"New Year's Day%"
REM Third Monday in Jan MSG Martin Luther King - %"MLK Day%"
REM Feb 2 MSG %"Ground Hog Day%"
REM Feb 14 MSG %"Valentine's Day%"
REM Third Monday in Feb SCANFROM -7 ADDOMIT MSG %"President's Day%"
REM Mar 17 MSG %"St. Patrick's Day%"
# The DST rules are accurate for most locations in
# North America
REM Sun Apr 1 ++2 UNTIL 1 Jan 2007 MSG Daylight Saving Time - %"DST starts%" %b
REM Sun Mar 8 ++2 FROM 1 Jan 2007 MSG Daylight Saving Time - %"DST starts%" %b
REM Last Sunday in October ++2 UNTIL 1 Jan 2007 MSG Daylight Saving Time - %"DST ends%" %b
REM First Sunday in November ++2 FROM 1 Jan 2007 MSG Daylight Saving Time - %"DST ends%" %b
REM Apr 1 MSG %"April Fool's%" Day
REM Mon Tue Wed Thu Fri Sat 15 Apr MSG %"Income tax%" due
REM May 5 MSG %"Cinco de Mayo%"
REM First Sat in May MSG %"Kentucky Derby%"
REM Second Sun in May MSG %"Mother's Day%"
REM Third Sat in May MSG %"Armed Forces Day%"
REM Last Monday in May SCANFROM -7 ADDOMIT MSG %"Memorial Day%"
REM Jun 14 MSG %"Flag Day%"
REM Third Sun in June MSG %"Father's Day%"
REM First Mon in Sep SCANFROM -7 ADDOMIT MSG %"Labor Day%"
REM Second Mon in Oct MSG %"Columbus Day%"
REM Nov 11 MSG %"Veterans Day%"
REM Oct 30 MSG %"Mischief Night%"
REM Oct 31 MSG %"Halloween%"
REM Tue Nov 2 SCANFROM -7 SATISFY [($Ty % 4) == 0] MSG %"Election Day%"
REM Last Thu in Nov SCANFROM -7 ADDOMIT MSG %"Thanksgiving Day%"
REM Fri Nov [Week_4+1] SCANFROM -7 ADDOMIT MSG %"Thanksgiving (cont.)%"
REM Dec 24 MSG %"Christmas Eve%"
OMIT Dec 25 MSG %"Christmas%" Day

19
include/lang/auto.rem Normal file
View File

@@ -0,0 +1,19 @@
SET autolang getenv("LC_ALL")
IF autolang == ""
SET autolang getenv("LANGUAGE")
ENDIF
IF autolang == ""
SET autolang getenv("LANG")
ENDIF
IF autolang != ""
IF access($SysInclude + "/lang/" + lower(substr(autolang, 1, 5)) + ".rem", "r") == 0
INCLUDE [$SysInclude]/lang/[lower(substr(autolang, 1, 5))].rem
ELSE
IF access($SysInclude + "/lang/" + lower(substr(autolang, 1, 2)) + ".rem", "r") == 0
INCLUDE [$SysInclude]/lang/[lower(substr(autolang, 1, 2))].rem
ENDIF
ENDIF
ENDIF
UNSET autolang

69
include/lang/da.rem Normal file
View File

@@ -0,0 +1,69 @@
# Support for the Danish language.
# This file is part of REMIND.
# REMIND is Copyright (C) 1992-2022 by Dianne Skoll
# This file is derived from a translation by Mogens Lynnerup.
SET $Sunday "Søndag"
SET $Monday "Mandag"
SET $Tuesday "Tirsdag"
SET $Wednesday "Onsdag"
SET $Thursday "Torsdag"
SET $Friday "Fredag"
SET $Saturday "Lørdag"
SET $January "Januar"
SET $February "Februar"
SET $March "Marts"
SET $April "April"
SET $May "Maj"
SET $June "Juni"
SET $July "Juli"
SET $August "August"
SET $September "September"
SET $October "Oktober"
SET $November "November"
SET $December "December"
SET $Today "i dag"
SET $Tomorrow "i morgen"
BANNER Påmindelse for %w, %d. %m, %y%o:
SET $Am "am"
SET $Pm "pm"
SET $Ago "siden"
SET $Fromnow "fra nu"
SET $On "på"
SET $Now "nu"
SET $At "kl."
SET $Minute "minut"
SET $Hour "time"
SET $Is "er"
SET $Was "var"
SET $And "og"
SET $Hplu "r"
SET $Mplu "ter"
FSET subst_ampm(h) iif(h<5, " om natten", h < 12, " om formiddagen", h < 18, " om eftermiddagen", " om aftenen")
FSET subst_ordinal(d) "."
FSET subst_p(alt, d, t) iif(d==today()+1, "", "e")
FSET zeropad(s, len) pad(s, "0", len)
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_bx(a, d, t) "om " + (d-today()) + " dage"
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_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_hx(alt, d, t) "den " + zeropad(day(d), 2) + $DateSep + zeropad(monnum(d), 2)
FSET subst_ix(alt, d, t) "den " + zeropad(monnum(d), 2) + $DateSep + zeropad(day(d), 2)
FSET subst_ux(alt, d, t) subst_ax(alt, d, t)
FSET subst_vx(alt, d, t) subst_gx(alt, d, t)

63
include/lang/de.rem Normal file
View File

@@ -0,0 +1,63 @@
# Support for the German language.
# This file is part of REMIND.
# REMIND is Copyright (C) 1992-2022 by Dianne Skoll
# This file is derived from a translation by Wolfgang Thronicke
# Day names
SET $Sunday "Sonntag"
SET $Monday "Montag"
SET $Tuesday "Dienstag"
SET $Wednesday "Mittwoch"
SET $Thursday "Donnerstag"
SET $Friday "Freitag"
SET $Saturday "Samstag"
# Month names
SET $January "Januar"
SET $February "Februar"
SET $March "März"
SET $April "April"
SET $May "Mai"
SET $June "Juni"
SET $July "Juli"
SET $August "August"
SET $September "September"
SET $October "Oktober"
SET $November "November"
SET $December "Dezember"
SET $Today "heute"
SET $Tomorrow "morgen"
# Banner
BANNER Termine für %w, den %d. %m %y%o:
SET $Am "am"
SET $Pm "pm"
SET $On "am"
SET $Hplu "n"
SET $Mplu "n"
SET $Now "jetzt"
SET $At "um"
SET $Minute "Minute"
SET $Hour "Stunde"
SET $Is "ist"
SET $Was "war"
SET $And "und"
SET $Ago "vorher"
SET $Fromnow "von heute"
FSET subst_ampm(h) iif(h<5, " nachts", h<12, " vormittags", h<=17, " nachmittags", " abends")
FSET subst_ordinal(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_bx(a, d, t) "in " + (d-today()) + " Tagen"
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_ux(alt, d, t) subst_ax(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")

4
include/lang/en.rem Normal file
View File

@@ -0,0 +1,4 @@
# Support for the English language.
# This file is part of REMIND.
# REMIND is Copyright (C) 1992-2022 by Dianne Skoll
# Nothing to do for English since it is the default.

48
include/lang/es.rem Normal file
View File

@@ -0,0 +1,48 @@
# Support for the Spanish language.
# This file is part of REMIND.
# REMIND is Copyright (C) 1992-2022 by Dianne Skoll
# This file is derived from a translation by Rafa Couto <rafacouto@biogate.com>
SET $Sunday "Domingo"
SET $Monday "Lunes"
SET $Tuesday "Martes"
SET $Wednesday "Miércoles"
SET $Thursday "Jueves"
SET $Friday "Viernes"
SET $Saturday "Sábado"
SET $January "Enero"
SET $February "Febrero"
SET $March "Marzo"
SET $April "Abril"
SET $May "Mayo"
SET $June "Junio"
SET $July "Julio"
SET $August "Agosto"
SET $September "Septiembre"
SET $October "Octubre"
SET $November "Noviembre"
SET $December "Diciembre"
SET $Today "hoy"
SET $Tomorrow "mañana"
BANNER Agenda para el %w, %d%s %m, %y%o:
SET $Am "am"
SET $Pm "pm"
SET $Ago "hace"
SET $Fromnow "desde hoy"
SET $On "el día"
SET $Now "ahora"
SET $At "a las"
SET $Minute "minuto"
SET $Hour "hora"
SET $Is "es"
SET $Was "fue"
SET $And "y"
SET $Hplu "s"
SET $Mplu "s"
FSET subst_bx(a, d, t) "dentro de " + (d-today()) + " días"

94
include/lang/fi.rem Normal file
View File

@@ -0,0 +1,94 @@
# Support for the Finnish language.
# This file is part of REMIND.
# REMIND is Copyright (C) 1992-2022 by Dianne Skoll
# This file is derived from a translation by Mikko Silvonen
SET $Sunday "sunnuntai"
SET $Monday "maanantai"
SET $Tuesday "tiistai"
SET $Wednesday "keskiviikko"
SET $Thursday "torstai"
SET $Friday "perjantai"
SET $Saturday "lauantai"
SET $January "tammikuu"
SET $February "helmikuu"
SET $March "maaliskuu"
SET $April "huhtikuu"
SET $May "toukokuu"
SET $June "kesäkuu"
SET $July "heinäkuu"
SET $August "elokuu"
SET $September "syyskuu"
SET $October "lokakuu"
SET $November "marraskuu"
SET $December "joulukuu"
SET $Today "tänään"
SET $Tomorrow "huomenna"
BANNER Viestit %wna %d. %mta %y%o:
SET $Am " ap."
SET $Pm " ip."
SET $ago "sitten"
SET $Fromnow "kuluttua"
SET $On "na"
SET $Now "nyt"
SET $At "klo"
SET $Minute "minuutti"
SET $Hour "tunti"
SET $Is "on"
SET $Was "oli"
SET $And "ja"
SET $Hplu "a"
SET $Mplu "a"
FSET zeropad(s, len) pad(s, "0", len)
FSET subst_ordinal(d) iif(d==1, ":senä", d==2, ":sena", (d%10)==2||(d%10)==3||(d%10)==6||(d%10)==8, ":ntena", ":ntenä")
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_bx(a, d, t) (d-today()) + " päivän kuluttua"
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_fx(a, d, t) zeropad(monnum(d), 2) + $DateSep + zeropad(day(d), 2) + $DateSep + zeropad(year(d), 4)
FSET subst_g_alt(d, o, p) wkday(d) + o + " " + day(d) + ". " + mon(d) + p
FSET subst_gx(a, d, t) iif(a, subst_g_alt(d, "", ""), subst_g_alt(d, $On, "ta"))
FSET subst_hx(a, d, t) zeropad(day(d), 2) + $DateSep + zeropad(monnum(d), 2)
FSET subst_ix(a, d, t) zeropad(monnum(d), 2) + $DateSep + zeropad(day(d), 2)
FSET subst_j_alt(d, o) wkday(d) + o + " " + mon(d) + "n " + day(d) + subst_ordinal(day(d)) + " " + year(d)
FSET subst_jx(a, d, t) iif(a, subst_j_alt(d, ""), subst_j_alt(d, $On))
FSET subst_k_alt(d, o) wkday(d) + o + " " + mon(d) + "n " + day(d) + subst_ordinal(day(d))
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_p(a, d, t) iif(d==today()+1, "", "ä")
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_ux(a, d, t) iif(a, subst_u_alt(d, "", ""), subst_u_alt(d, $On, "ta"))
FSET subst_v_alt(d, o, p) wkday(d) + o + " " + day(d) + subst_ordinal(day(d)) + " " + mon(d) + p
FSET subst_vx(a, d, t) iif(a, subst_v_alt(d, "", ""), subst_v_alt(d, $On, "ta"))
FSET subst_1(a, d, t) iif(t==now(), $Now, t<now(), subst1_past(now()-t), subst1_future(t-now()))
FSET subst1_past(mins) subst_hour_past(mins/60) + subst_min_past(mins%60) + $Ago
FSET subst1_future(mins) subst_hour_future(mins/60) + subst_min_future(mins%60) + $Fromnow
FSET subst_hour_past(h) iif(h==0, "", h + " " + $Hour + iif(h==1, " ", $Hplu + " "))
FSET subst_min_past(m) iif(m==0, "", m + " " + $Minute + iif(m==1, " ", $Mplu + " "))
FSET subst_hour_future(h) iif(h==0, "", h + " tunnin ")
FSET subst_min_future(m) iif(m==0, "", m + " minuutin ")

62
include/lang/fr.rem Normal file
View File

@@ -0,0 +1,62 @@
# Support for the French language.
# This file is part of REMIND.
# REMIND is Copyright (C) 1992-2022 by Dianne Skoll
# This file is derived from a translation by Laurent Duperval
SET $Sunday "dimanche"
SET $Monday "lundi"
SET $Tuesday "mardi"
SET $Wednesday "mercredi"
SET $Thursday "jeudi"
SET $Friday "vendredi"
SET $Saturday "samedi"
SET $January "janvier"
SET $February "février"
SET $March "mars"
SET $April "avril"
SET $May "mai"
SET $June "juin"
SET $July "juillet"
SET $August "août"
SET $September "septembre"
SET $October "octobre"
SET $November "novembre"
SET $December "décembre"
SET $Today "aujourd'hui"
SET $Tomorrow "demain"
SET $On "le"
SET $At "à"
SET $Now "maintenant"
SET $Minute "minute"
SET $Hour "heure"
SET $Is "est"
SET $Was "était"
SET $And "et"
SET $Hplu "s"
SET $Mplu "s"
SET $Ago "il y a"
SET $Fromnow "dans"
# Banner
BANNER Rappels pour %w, %d%s %m, %y%o:
# Ordinal for a day (English would be "st", "nd", "rd", "th")
FSET subst_ordinal(d) iif(d == 1, "er", "")
# "%d hours", "%d minutes", or "%d hours and %d minutes"
FSET subst_tdiff(hdiff, mdiff) iif(hdiff==0&&mdiff==0, $Now, \
hdiff==0, mdiff + plural(mdiff, " minute"), \
mdiff==0, hdiff + plural(hdiff, " heure"), \
hdiff + plural(hdiff, " heure") + " et " + mdiff + plural(mdiff, " minute"))
FSET subst_1(alt, date, time) iif(time == now(), "maintenant", \
time > now(), "dans " + subst_tdiff((time-now())/60, (time-now())%60), \
"il y a " + subst_tdiff ((now()-time)/60, (now()-time)%60))
FSET subst_bx(alt, date, time) "dans " + (date-today()) + " jours"
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_k_alt(date) wkday(date) + ", " + day(date) + subst_ordinal(day(date)) + " " + mon(date)
FSET subst_kx(alt, date, time) iif(alt, subst_k_alt(date), $On + " " + subst_k_alt(date))

51
include/lang/is.rem Normal file
View File

@@ -0,0 +1,51 @@
# Support for the Icelanding language.
# This file is part of REMIND.
# REMIND is Copyright (C) 1992-2022 by Dianne Skoll
# This file is derived from a translation by Björn Davíðsson (bjossi@snerpa.is)
SET $Sunday "sunnudagur"
SET $Monday "mánudagur"
SET $Tuesday "þriðjudagur"
SET $Wednesday "miðvikudagur"
SET $Thursday "fimmtudagur"
SET $Friday "föstudagur"
SET $Saturday "laugardagur"
SET $January "janúar"
SET $February "febrúar"
SET $March "mars"
SET $April "apríl"
SET $May "maí"
SET $June "júní"
SET $July "júlí"
SET $August "ágúst"
SET $September "september"
SET $October "október"
SET $November "nóvember"
SET $December "desember"
SET $Today "í dag"
SET $Tomorrow "á morgun"
BANNER Minnisatriði: %w, %d%s %m, %y%o:
SET $Am "fh"
SET $Pm "eh"
SET $Ago "síðan"
SET $Fromnow "frá því nú"
SET $On "þann"
SET $Now "núna"
SET $At "kl."
SET $Minute "mínútu"
SET $Hour "klukkustund"
SET $Is "er"
SET $Was "var"
SET $And "og"
SET $Hplu "ir"
SET $Mplu "r"
FSET subst_bx(a, d, t) "eftir " + (d - today()) + " daga"
fset subst_p(a, d, t) iif(d == today()+1, "", "a")

67
include/lang/it.rem Normal file
View File

@@ -0,0 +1,67 @@
# Support for the Italian language.
# This file is part of REMIND.
# REMIND is Copyright (C) 1992-2022 by Dianne Skoll
# This file is derived from a translation by Valerio Aimale
SET $Sunday "Domenica"
SET $Monday "Lunedí"
SET $Tuesday "Martedí"
SET $Wednesday "Mercoledí"
SET $Thursday "Giovedí"
SET $Friday "Venerdí"
SET $Saturday "Sabato"
SET $January "Gennaio"
SET $February "Febbraio"
SET $March "Marzo"
SET $April "Aprile"
SET $May "Maggio"
SET $June "Giugno"
SET $July "Luglio"
SET $August "Agosto"
SET $September "Settembre"
SET $October "Ottobre"
SET $November "Novembre"
SET $December "Dicembre"
SET $Today "oggi"
SET $Tomorrow "domani"
BANNER Promemoria per %w, %d %m %y%o:
SET $Am "am"
SET $Pm "pm"
SET $Ago "fa"
SET $Fromnow "da oggi"
SET $On ""
SET $Now "ora"
SET $At "alle"
SET $Minute "minuto"
SET $Hour "ora"
SET $Is "é"
SET $Was "era"
SET $And "e"
SET $Hplu "a"
SET $Mplu "i"
FSET subst_bx(a, d, t) "fra " + (d-today()) + " giorni"
FSET subst_p(a, d, t) iif(d==today()+1, "o", "i")
FSET subst_q(a, d, t) iif(d==today()+1, "a", "e")
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_kx(a, d, t) wkday(d) + ", " + day(d) + " " + mon(d)
FSET subst_ux(a, d, t) subst_ax(a, d, t)
FSET subst_vx(a, d, t) subst_kx(a, d, t)
FSET subst_1(a, d, t) iif(t==now(), $Now, t<now(), subst_1a(now()-t, $Ago), subst_1a(t-now(), $Fromnow))
FSET subst_1a(diff, when) subst_1b(diff/60, diff%60) + " " + when
FSET subst_1b(hdiff, mdiff) iif(hdiff==0, subst_minutes(mdiff), mdiff==0, subst_hours(hdiff), subst_hours(hdiff) + " " + $And + " " + subst_minutes(mdiff))
FSET subst_minutes(m) iif(m==1, "1 minuto", m + " minuti")
FSET subst_hours(h) iif(h==1, "1 ora", h + " ore")
FSET subst_0(a, d, t) iif(abs(now()-t)/60==1, "a", "e")
FSET subst_9(a, d, t) iif(abs(now()-t)%60==1, "o", "i")

56
include/lang/nl.rem Normal file
View File

@@ -0,0 +1,56 @@
# Support for the Dutch language.
# This file is part of REMIND.
# REMIND is Copyright (C) 1992-2022 by Dianne Skoll
# This file is derived from a translation by Willem Kasdorp and Erik-Jan Vens
SET $Sunday "zondag"
SET $Monday "maandag"
SET $Tuesday "dinsdag"
SET $Wednesday "woensdag"
SET $Thursday "donderdag"
SET $Friday "vrijdag"
SET $Saturday "zaterdag"
SET $January "januari"
SET $February "februari"
SET $March "maart"
SET $April "april"
SET $May "mei"
SET $June "juni"
SET $July "juli"
SET $August "augustus"
SET $September "september"
SET $October "oktober"
SET $November "november"
SET $December "december"
SET $Today "vandaag"
SET $Tomorrow "morgen"
BANNER Herinneringen voor %w, %d%s %m, %y%o:
SET $Am "am"
SET $Pm "pm"
SET $Ago "geleden"
SET $Fromnow "vanaf nu"
SET $On "op"
SET $Now "nu"
SET $At "op"
SET $Minute "minuut"
SET $Hour "uur"
SET $Is "is"
SET $Was "was"
SET $And "en"
SET $Hplu "en"
SET $Mplu "en"
FSET subst_1(a, d, t) iif(t==now(), $Now, t<now(), subst_1a(now()-t, $Ago), subst_1a(t-now(), $Fromnow))
FSET subst_1a(diff, when) subst_1b(diff/60, diff%60) + " " + when
FSET subst_1b(hdiff, mdiff) iif(hdiff==0, subst_minutes(mdiff), mdiff==0, subst_hours(hdiff), subst_hours(hdiff) + " " + $And + " " + subst_minutes(mdiff))
FSET subst_minutes(m) iif(m==1, "1 minuut", m + " minuten")
FSET subst_hours(h) iif(h==1, "1 uur", h + " uren")
FSET subst_bx(a, d, t) "over " + (d-today()) + " dagen"

58
include/lang/no.rem Normal file
View File

@@ -0,0 +1,58 @@
# Support for the Norwegian language.
# This file is part of REMIND.
# REMIND is Copyright (C) 1992-2022 by Dianne Skoll
# This file is derived from a translation by Trygve Randen
SET $Sunday "Søndag"
SET $Monday "Mandag"
SET $Tuesday "Tirsdag"
SET $Wednesday "Onsdag"
SET $Thursday "Torsdag"
SET $Friday "Fredag"
SET $Saturday "Lørdag"
SET $January "Januar"
SET $February "Februar"
SET $March "Mars"
SET $April "April"
SET $May "Mai"
SET $June "Juni"
SET $July "Juli"
SET $August "August"
SET $September "September"
SET $October "Oktober"
SET $November "November"
SET $December "Desember"
SET $Today "i dag"
SET $Tomorrow "i morgen"
BANNER Påminnelse for %w, %d. %m, %y%o:
SET $Am "am"
SET $Pm "pm"
SET $Ago "siden"
SET $Fromnow "fra nå"
SET $On "den"
SET $Now "nå"
SET $At "kl."
SET $Minute "minutt"
SET $Hour "time"
SET $Is "er"
SET $Was "var"
SET $And "og"
SET $Hplu "r"
SET $Mplu "er"
FSET subst_bx(a, d, t) "om " + (d-today()) + " dager"
FSET subst_ordinal(d) "."
FSET subst_ax(a, d, t) iif(a, subst_a_alt(d), $On + " " + subst_a_alt(d))
FSET subst_a_alt(d) wkday(d) + ", den " + day(d) + ". " + mon(d) + " " + year(d)
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_ux(a, d, t) subst_ax(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")

69
include/lang/pl.rem Normal file
View File

@@ -0,0 +1,69 @@
# Support for the Polish language.
# This file is part of REMIND.
# REMIND is Copyright (C) 1992-2022 by Dianne Skoll
# This file is derived from a translation by Jerzy Sobczyk
SET $Sunday "Niedziela"
SET $Monday "Poniedziałek"
SET $Tuesday "Wtorek"
SET $Wednesday "Środa"
SET $Thursday "Czwartek"
SET $Friday "Piątek"
SET $Saturday "Sobota"
SET $January "Styczeń"
SET $February "Luty"
SET $March "Marzec"
SET $April "Kwiecień"
SET $May "Maj"
SET $June "Czerwiec"
SET $July "Lipiec"
SET $August "Sierpień"
SET $September "Wrzesień"
SET $October "Październik"
SET $November "Listopad"
SET $December "Grudzień"
SET $Today "dzisiaj"
SET $Tomorrow "jutro"
BANNER Terminarz na %w, %d. %m %y%o:
SET $Am "am"
SET $Pm "pm"
SET $Ago "temu"
SET $Fromnow "od teraz"
SET $On "-"
SET $Now "teraz"
SET $At "o"
SET $Minute "minut"
SET $Hour "godzin"
SET $Is "będzie"
SET $Was "było"
SET $And "i"
SET $Hplu ""
SET $Mplu ""
FSET subst_pl_plu(n) iif(n==1, "ę", (n==12||n==13||n==14), "", (n%10==2||n%10==3||n%10==4), "y", "")
FSET subst_ampm(h) iif(h<5, " w nocy", h<10, " rano", h<12, " przed południem", h<18, " po południu", h<22, " wieczorem", " w nocy")
FSET subst_ordinal(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_bx(a, d, t) "za " + (d-today()) + " dni"
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_ux(a, d, t) subst_ax(a, d, t)
FSET subst_vx(a, d, t) subst_gx(a, d, t)
FSET subst_p(a, d, t) ""
FSET subst_0(a, d, t) subst_pl_plu(abs(t-now())/60)
FSET subst_9(a, d, t) subst_pl_plu(abs(t-now())%60)
FSET subst_1(a, d, t) iif(t==now(), $Now, t<now(), subst_1past(now()-t), subst_1future(t-now()))
FSET subst_1future(diff) "za " + iif(diff/60==0, subst_1min(diff%60), diff%60==0, subst_1h(diff/60), subst_1h(diff/60) + " " + $And + " " + subst_1min(diff%60))
FSET subst_1past(diff) iif(diff/60==0, subst_1min(diff%60), diff%60==0, subst_1h(diff/60), subst_1h(diff/60) + " " + $And + " " + subst_1min(diff%60)) + " temu"
FSET subst_1min(m) m + " " + $Minute + subst_pl_plu(m)
FSET subst_1h(h) h + " " + $Hour + subst_pl_plu(h)

69
include/lang/pt.rem Normal file
View File

@@ -0,0 +1,69 @@
# Support for the (Brazilian) Portuguese language.
# This file is part of REMIND.
# REMIND is Copyright (C) 1992-2022 by Dianne Skoll
# This file is derived from a translation by Marco Paganini
SET $Sunday "domingo"
SET $Monday "segunda"
SET $Tuesday "terça"
SET $Wednesday "quarta"
SET $Thursday "quinta"
SET $Friday "sexta"
SET $Saturday "sábado"
SET $January "janeiro"
SET $February "fevereiro"
SET $March "março"
SET $April "abril"
SET $May "maio"
SET $June "junho"
SET $July "julho"
SET $August "agosto"
SET $September "setembro"
SET $October "outubro"
SET $November "novembro"
SET $December "dezembro"
SET $Today "hoje"
SET $Tomorrow "amanhã"
BANNER Avisos para %w, %d de %m de %y%o:
SET $Am "am"
SET $Pm "pm"
SET $Ago "atrás"
SET $Fromnow "adiante"
SET $On "em"
SET $Now "agora"
SET $At "as"
SET $Minute "minuto"
SET $Hour "hora"
SET $Is "é"
SET $Was "foi"
SET $And "e"
SET $Hplu "s"
SET $Mplu "s"
FSET subst_ordinal(d) ""
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_bx(a, d, t) "em " + (d-today()) + " dias"
FSET subst_c_alt(d) wkday(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_cx(a, d, t) iif(a, subst_c_alt(d), subst_on_wd(d) + " " + subst_c_alt(d))
FSET subst_gx(a, d, t) iif(a, subst_g_alt(d), subst_on_wd(d) + " " + subst_g_alt(d))
FSET subst_jx(a, d, t) subst_ax(a, d, t)
FSET subst_k_alt(d) wkday(d) + ", " + day(d) + " de " + mon(d)
FSET subst_kx(a, d, t) iif(a, subst_k_alt(d), subst_on_wd(d) + " " + subst_k_alt(d))
FSET subst_ux(a, d, t) subst_ax(a, d, t)
FSET subst_vx(a, d, t) subst_kx(a, d, t)
FSET subst_1(a, d, t) iif(t==now(), $Now, t>now(), "em " + subst_1help(t-now()), subst_1help(now()-t) + " " + $Ago)
FSET subst_1help(diff) iif(diff/60==0, subst_mplu(diff%60), diff%60==0, subst_hplu(diff/60), subst_hplu(diff/60) + " " + $And + " " + subst_mplu(diff%60))
FSET subst_mplu(m) iif(m==1, "1 " + $Minute, m + " " + $Minute + $Mplu)
FSET subst_hplu(h) iif(h==1, "1 " + $Hour, h + " " + $Hour + $Hplu)

68
include/lang/ro.rem Normal file
View File

@@ -0,0 +1,68 @@
# Support for the Romanian language.
# This file is part of REMIND.
# REMIND is Copyright (C) 1992-2022 by Dianne Skoll
# This file is derived from a translation by Liviu Daia
SET $Sunday "Duminică"
SET $Monday "Luni"
SET $Tuesday "Marți"
SET $Wednesday "Miercuri"
SET $Thursday "Joi"
SET $Friday "Vineri"
SET $Saturday "Sâmbătă"
SET $January "Ianuarie"
SET $February "Februarie"
SET $March "Martie"
SET $April "Aprilie"
SET $May "Mai"
SET $June "Iunie"
SET $July "Iulie"
SET $August "August"
SET $September "Septembrie"
SET $October "Octombrie"
SET $November "Noiembrie"
SET $December "Decembrie"
SET $Today "astăzi"
SET $Tomorrow "mâine"
BANNER Reamintiri pentru %w, %d %m %y%o:
SET $Am "am"
SET $Pm "pm"
SET $Ago "acum"
SET $Fromnow "peste"
SET $On "pe"
SET $Now "acum"
SET $At "la ora"
SET $Minute "minut"
SET $Hour "or"
SET $Is "este"
SET $Was "a fost"
SET $Mplu "e"
SET $Hplu "e"
SET $And "şi"
FSET subst_bx(a, d, t) "peste " + (d-today()) + " zile"
FSET subst_ampm(h) iif(h<4, " noaptea", h<12, " dimineaţa", h<18, " după-amiaza", " seara")
FSET subst_ordinal(d) ""
FSET subst_ax(a, d, t) wkday(d) + ", " + day(d) + " " + mon(d) + " " + year(d)
FSET subst_cx(a, d, t) wkday(d)
FSET subst_gx(a, d, t) wkday(d) + ", " + day(d) + " " + mon(d)
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_ux(a, d, t) subst_ax(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_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_1h(h) iif(h==1, "1 oră", h + " ore")
FSET subst_1m(m) iif(m==1, "1 minut", m + " minute")
FSET subst_0(a, d, t) iif(abs(t-now())/60==1, "ă", "e")

2
include/site/README Normal file
View File

@@ -0,0 +1,2 @@
This directory is for system administrators to install site-wide
Remind scripts that are useful to their user-base.

View File

@@ -1,4 +1,4 @@
.TH REM 1 "1 January 2021"
.TH REM 1 "14 March 2022"
.UC 4
.SH NAME
rem \- Invoke Remind with a default filename

View File

@@ -1,4 +1,4 @@
.TH REM2PS 1 "5 January 2021"
.TH REM2PS 1 "14 March 2022"
.UC 4
.SH NAME
rem2ps \- draw a PostScript calendar from Remind output

View File

@@ -1,4 +1,4 @@
.TH REMIND 1 "1 January 2021"
.TH REMIND 1 "14 March 2022"
.UC 4
.SH NAME
remind \- a sophisticated reminder service
@@ -2307,14 +2307,18 @@ The latitude of your location, expressed as a string that is a floating-point
number. Because \fBRemind\fR does not have a native floating-point type,
we need to express it as a string. $Latitude can range from "-90.0" to
"90.0", with positive numbers representing points north of the equator
and negative numbers representing south.
and negative numbers representing south. Note that regardless of your
locale, $Latitude is always interpreted in the "C" locale and as such,
the decimal point must be a period (".").
.TP
.B $Longitude (STRING type)
The longitude of your location, expressed as a string that is a floating-point
number. Because \fBRemind\fR does not have a native floating-point type,
we need to express it as a string. $Longitude can range from "-180.0" to
"180.0", with positive numbers representing points east of the Greenwich
Meridian and negative numbers representing west.
Meridian and negative numbers representing west. Note that regardless of your
locale, $Longitude is always interpreted in the "C" locale and as such,
the decimal point must be a period (".").
.RS
.PP
For example, the coordinates of the Statue of Liberty in New York City
@@ -2437,6 +2441,12 @@ 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 $SysInclude (read-only, STRING type)
A directory path containing standard reminder scripts. Currently,
Remind ships with some standard holiday files and language packs.
The value of \fB$SysInclude\fR is likely to be something like
"/usr/share/remind" or "/usr/local/share/remind"
.TP
.B $T (read-only, DATE type)
Exactly equivalent to \fBtrigdate()\fR. (See BUILT-IN FUNCTIONS.)
.TP
@@ -3027,6 +3037,26 @@ Returns a string that is the ordinal number \fInum\fR. For example,
.B ostype()
Returns "UNIX". Remind used to run on OS/2 and MS-DOS, but does not
any longer.
.TP
.B pad(x_arg, s_padstr, i_len [, i_right])
Converts the first argument \fIarg\fR to a string if necessary, and
then if it is shorter than \fIlen\fR characters, pads to to
\fIlen\fR characters using as many copies (including partial copies)
of \fIpadstr\fR as necessary. By default, the string is left-padded,
but if \fIright\fR is supplied and non-zero, the string will
be right-padded.
.RS
.PP
Here are some examples:
.nf
pad(3, "0", 2) --> "03"
pad(465, "0", 2) --> "465"
pad("foo", " ", 5) --> " foo"
pad("foo", " ", 5, 1) --> "foo "
pad("foo", "bar", 11) --> "barbarbafoo"
.fi
.RE
.TP
.B plural(i_num [,s_str1 [,s_str2]])
Can take from one to three arguments. If one argument is supplied, returns
@@ -4668,7 +4698,7 @@ error messages. For an example of this, define the following:
fset msgprefix(x) x/0
.fi
.PP
.SH SUPPORT FOR OTHER LANGUAGES
.SH COMPILE-TIME SUPPORT FOR OTHER LANGUAGES
.PP
Your version of \fBRemind\fR may have been compiled to support a
language other than English. This support may or may not be complete -
@@ -4681,10 +4711,14 @@ selected language rather than for English.
Note that a non-English version of \fBRemind\fR will accept \fIonly\fR
English names of weekdays and months in a reminder script.
.PP
If there is no support for your particular language, you can set
\fBRemind\fR system variables so that calendars are printed using
your language's day and month names. The system variables that you
can set are:
.SH RUN-TIME SUPPORT FOR OTHER LANGUAGES
.PP
\fBRemind\fR has run-time support for other languages, and it is
expected that compile-time support will be deprecated in favour of
run-time support.
.PP
A number of system variables let you translate various phrases
to other languages. These system variables are:
.PP
.TP
.B $Monday, $Tuesday, $Wednesday, $Thursday, $Friday, $Saturday
@@ -4694,16 +4728,113 @@ day's name in your language. Strings must be valid UTF-8 strings.
.B $January, $February, $March, $April, $May, $June, $July, $August, $September, $October, $November, $December
Set each of these system variables to a string representing the corresponding
month's name in your language. Strings must be valid UTF-8 strings.
.TP
.B $Ago, $Am, $And, $At, $Hour, $Is, $Minute, $Now, $On, $Pm, $Was
Set each of these system variables to the translation of the corresponding
English word into your language. Note that \fB$Am\fR and \fB$Pm\fR should
be the translations of "AM" and "PM" (morning and afternoon time indicators)
respectively.
.TP
.B $Hplu, $Mplu
Set these to the suffix to add to the word for "hour" and "minute" to
make them plural. In English, both would be set to "s".
.TP
.B $Fromnow
Set this to the translation of the English phrase "from now"
.PP
Note that if you set the day- or month-name system variables, they
should be set in a section of your script that always is evaluated.
If you set them inside an \fBIF\fR statement, for example, results
are unpredictable.
Note that if you set any of the language-related system variables,
they should be set in a section of your script that always is
evaluated. If you set them inside an \fBIF\fR statement, for example,
results are unpredictable.
.PP
Note also that the \fBRem2PS\fR back-end does not support the full
range of UTF-8 characters. The \fBTkRemind\fR, \fBrem2html\fR and
\fBrem2pdf\fR back-ends all do support the full UTF-8 range.
.PP
.SH RUN-TIME MODIFICATION OF THE SUBSTITUTION FILTER
.PP
The system variables mentioned in the previous section are not typically
sufficient to properly translate Remind's output to another language.
Some languages have complicated rules for AM vs PM times and others have
complex rules for making words plural. \fBRemind\fR therefore allows
you to define a number of functions that modify the behavior of
the substitution filter at run-time. The functions are:
.PP
.TP
.B subst_ampm(h)
This function is passed a single integer, namely an hour from 0 to 23.
It should return a string that indicates "AM" or "PM" or even finer
gradations in some languages.
.TP
.B subst_ordinal(d)
This function is passed a single integer, namely a day of the month from
1 to 31. It should return a string that is suffixed to the day number to
turn it into an ordinal number. In English, for example, the function
might return "st", "nd", "rd" or "th", depending on \fId\fR.
.TP
.B subst_N(alt, date, time)
This is actually a \fIfamily\fR of functions, where \fIN\fR is a letter
or number. This function \fIcompletely overrides\fR the substitution
sequence "%X". The three arguments are an integer \fIalt\fR which,
if non-zero, indicates that the alternate-mode substitution sequence
"%*X" was encountered; \fIdate\fR which is the trigger date of the
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
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:
.nf
FSET subst_bx(a,d,t) iif(d==today()+2, "the day after tomorrow", \
"in " + (d-today()) + " days' time")
REM [today()+3] ++3 MSG Event 1 is %b%
REM [today()+2] ++3 MSG Event 2 is %b%
REM [today()+1] ++3 MSG Event 3 is %b%
REM [today()] ++3 MSG Event 4 is %b%
.fi
.PP
The output of this script is:
.nf
Event 1 is in 3 days' time
Event 2 is the day after tomorrow
Event 3 is tomorrow
Event 4 is today
.fi
.PP
Note how Event 2's wording was changed from the normal "in 2 days'
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
.SH LANGUAGE PACKS
.PP
\fBRemind\fR ships with a number of language packs, which are simply reminder
scripts located in \fB[$SysInclude]/lang\fR. The currently-shipping
language packs are:
.PP
da.rem (Danish), de.rem (German), es.rem (Spanish), fr.rem (French),
is.rem (Icelandic), it.rem (Italian), nl.rem (Dutch), no.rem (Norwegian),
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:
.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:
.nf
INCLUDE [$SysInclude]/lang/auto.rem
.fi
.PP
You are encouraged to study the language packs to see how to translate
Remind into additional languages.
.PP
.SH THE HEBREW CALENDAR
.PP

View File

@@ -1,4 +1,4 @@
.TH TKREMIND 1 "15 January 2021"
.TH TKREMIND 1 "14 March 2022"
.UC 4
.SH NAME
tkremind \- graphical front-end to Remind calendar program

View File

@@ -7,7 +7,7 @@
# A cheesy graphical front/back end for Remind using Tcl/Tk
#
# This file is part of REMIND.
# Copyright (C) 1992-2021 Dianne Skoll
# Copyright (C) 1992-2022 Dianne Skoll
#
#--------------------------------------------------------------
@@ -103,6 +103,9 @@ set OptDescr(RunCmd) "(String) If non-blank, run specified command when a pop-up
set Option(FeedReminder) 0
set OptDescr(FeedReminder) "(0/1) If 1, feed the reminder to RunCmd on standard input (see RunCmd option)"
set Option(DayAnchor) "center"
set OptDescr(DayAnchor) "(w/center/e) Anchor the day number to the left (w), center or right (e) of its container"
set Option(Editor) "emacs +%d %s"
set OptDescr(Editor) "(String) Specify command to edit a file. %d is replaced with line number and %s with filename"
@@ -483,7 +486,7 @@ proc CreateCalFrame { w dayNames } {
set n [expr $i*7]
for {set j 0} {$j < 7} {incr j} {
set f [expr $n+$j]
button $w.l$f -text "" -justify center -command "" \
button $w.l$f -text "" -justify center -command "" -anchor $Option(DayAnchor) \
-state disabled -relief flat -bd 0 -padx 0 -pady 0 -font HeadingFont -highlightthickness 1
text $w.t$f -width 12 -height $h -bd 0 -spacing3 3 -wrap word -relief flat \
-state disabled -takefocus 0 -cursor {} -font CalboxFont -foreground $Option(TextColor) -background $Option(BackgroundColor) \
@@ -793,12 +796,26 @@ proc EditOptions {} {
-text "Feed popped-up reminder to command's standard input" \
-variable tmpOpt(FeedReminder) -anchor w -justify left
frame $w.ancFrame
label $w.ancLabel -text "Anchor day numbers to:"
radiobutton $w.ancLeft \
-text "Left" \
-variable tmpOpt(DayAnchor) -value "w" -anchor w -justify left
radiobutton $w.ancCenter \
-text "Center" \
-variable tmpOpt(DayAnchor) -value "center" -anchor w -justify left
radiobutton $w.ancRight \
-text "Right" \
-variable tmpOpt(DayAnchor) -value "e" -anchor w -justify left
pack $w.ancLabel $w.ancLeft $w.ancCenter $w.ancRight -in $w.ancFrame -side left
pack $w.startIconified -in $w.f -side top -expand 0 -fill x
pack $w.showTodays -in $w.f -side top -expand 0 -fill x
pack $w.confirmQuit -in $w.f -side top -expand 0 -fill x
pack $w.bringDown -in $w.f -side top -expand 0 -fill x
pack $w.ring -in $w.f -side top -expand 0 -fill x
pack $w.deic -in $w.f -side top -expand 0 -fill x
pack $w.ancFrame -in $w.f -side top -expand 0 -fill x
pack $w.sep1 -in $w.f -side top -expand 0 -fill x -ipady 1
pack $w.rf -in $w.f -side top -expand 0 -fill x
pack $w.feed -in $w.f -side top -expand 0 -fill x
@@ -877,6 +894,13 @@ proc SaveOptions { w } {
for {set i 0} {$i < 7} {incr i} {
.cal.day$i configure -foreground $Option(LabelColor) -background $Option(WinBackground)
}
for {set i 0} {$i < 6} {incr i} {
set n [expr $i*7]
for {set j 0} {$j < 7} {incr j} {
set f [expr $n+$j]
.cal.l$f configure -anchor $Option(DayAnchor);
}
}
.b.status configure -foreground $Option(LabelColor) -background $Option(WinBackground)
.b.nqueued configure -foreground $Option(LabelColor) -background $Option(WinBackground)
.b configure -background $Option(WinBackground)

View File

@@ -40,7 +40,7 @@ test: remind
@sh ../tests/test-rem
.c.o:
@CC@ -c @CPPFLAGS@ @CFLAGS@ @DEFS@ $(CEXTRA) $(LANGDEF) -I. -I$(srcdir) $<
@CC@ -c @CPPFLAGS@ @CFLAGS@ @DEFS@ $(CEXTRA) $(LANGDEF) -DSYSDIR=$(datarootdir)/remind -I. -I$(srcdir) $<
$(REMINDOBJS): $(REMINDHDRS)
@@ -61,6 +61,8 @@ install-nostripped: all
for man in $(MANS) ; do \
$(INSTALL_DATA) $$man $(DESTDIR)$(mandir)/man1 || exit 1; \
done
-mkdir -p $(DESTDIR)$(datarootdir)/remind || true
cp -R ../include/* $(DESTDIR)$(datarootdir)/remind
install: install-nostripped
strip $(DESTDIR)$(bindir)/remind || true

View File

@@ -5,7 +5,7 @@
/* The code for generating a calendar. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -31,6 +31,7 @@
#include <langinfo.h>
#endif
#include "lang.h"
#include "types.h"
#include "protos.h"
#include "expr.h"
@@ -2245,14 +2246,14 @@ CalendarTime(int tim, int duration)
}
if (h >= 12) {
ampm1 = L_PM;
ampm1 = DynamicPm;
} else {
ampm1 = L_AM;
ampm1 = DynamicAm;
}
if (h2 >= 12) {
ampm2 = L_PM;
ampm2 = DynamicPm;
} else {
ampm2 = L_AM;
ampm2 = DynamicAm;
}
if (!days) {
if (!strcmp(ampm1, ampm2)) {
@@ -2299,7 +2300,7 @@ char const *SimpleTime(int tim)
if (h == 0) hh=12;
else if (h > 12) hh=h-12;
else hh=h;
sprintf(buf, "%d%c%02d%s ", hh, TimeSep, min, (h>=12) ? L_PM : L_AM);
sprintf(buf, "%d%c%02d%s ", hh, TimeSep, min, (h>=12) ? DynamicPm : DynamicAm);
}
break;

54
src/compare-language-mods.pl Executable file
View File

@@ -0,0 +1,54 @@
#!/usr/bin/perl
use strict;
use warnings;
my $language_map = {
en => 'ENGLISH',
de => 'GERMAN',
nl => 'DUTCH',
fi => 'FINNISH',
fr => 'FRENCH',
'no' => 'NORWEGIAN',
da => 'DANISH',
pl => 'POLISH',
is => 'ICELANDIC',
pt => 'BRAZPORT',
it => 'ITALIAN',
ro => 'ROMANIAN',
es => 'SPANISH',
};
if (!$ARGV[0]) {
print STDERR "Usage: $0 lang_code\n";
exit(1);
}
my $lang = $ARGV[0];
if (!exists($language_map->{$lang})) {
print STDERR "$lang is not a valid language.\n";
exit(1);
}
my $flag = $language_map->{$lang};
print STDERR "Testing for: $lang - $flag.\n";
my_sys("make clean > /dev/null 2>&1") && die("make clean failed");
my_sys("make -j6 all LANGDEF=-DLANG=$flag > /dev/null 2>&1") && die("make all failed");
my_sys("./remind -q -r ../tests/tstlang.rem 2022-03-23 11:44 > test-$lang-compiled.out 2>&1");
my_sys("make clean > /dev/null 2>&1") && die("make clean failed");
my_sys("make -j6 all > /dev/null 2>&1") && die("make all failed");
my_sys("./remind -q -r -ii=\\\"../include/lang/$lang.rem\\\" ../tests/tstlang.rem 2022-03-23 11:44 > test-$lang-runtime.out 2>&1");
my $rc = my_sys("cmp test-$lang-compiled.out test-$lang-runtime.out > /dev/null 2>&1");
if ($rc == 0) {
print STDERR "Congrats! Compiled and runtime language output matches for $lang.\n";
} else {
print STDERR "Whoops. Compiled and runtime language output differs for $lang.\n"
}
exit(0);
sub my_sys
{
#print STDERR "Running: " . join(' ', @_) . "\n";
return system(@_);
}

View File

@@ -6,7 +6,7 @@
/* which you can customize. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -21,8 +21,8 @@
/* The default values are initially set to the city hall in Ottawa, */
/* Ontario, Canada. */
/*---------------------------------------------------------------------*/
#define DEFAULT_LATITUDE 45.42055555555555
#define DEFAULT_LONGITUDE -75.68972222222223
#define DEFAULT_LATITUDE 45.420556
#define DEFAULT_LONGITUDE -75.689722
#define LOCATION "Ottawa"
/*---------------------------------------------------------------------*/

View File

@@ -6,7 +6,7 @@
/* which you can customize. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -21,8 +21,8 @@
/* The default values are initially set to the city hall in Ottawa, */
/* Ontario, Canada. */
/*---------------------------------------------------------------------*/
#define DEFAULT_LATITUDE 45.42055555555555
#define DEFAULT_LONGITUDE -75.68972222222223
#define DEFAULT_LATITUDE 45.420556
#define DEFAULT_LONGITUDE -75.689722
#define LOCATION "Ottawa"
/*---------------------------------------------------------------------*/

View File

@@ -7,7 +7,7 @@
/* commands. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/

View File

@@ -6,11 +6,12 @@
/* reminders are triggered. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
#include "config.h"
#include "expr.h"
#define L_IN_DOSUBST
#include <stdio.h>
#include <string.h>
@@ -29,9 +30,6 @@
#define NL "\n"
#endif
static char TODAY[] = L_TODAY;
static char TOMORROW[] = L_TOMORROW;
#define SHIP_OUT(s) if(DBufPuts(dbuf, s) != OK) return E_NO_MEM
/***************************************************************/
@@ -58,10 +56,17 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
char const *mplu, *hplu, *when, *plu;
int has_quote = 0;
char *ss;
char const *expr;
char *os;
char s[256];
char uf[32];
char mypm[64];
char mycpm[64];
char myplu[64];
int origLen = DBufLen(dbuf);
int altmode;
int r;
Value v;
FromJulian(jul, &y, &m, &d);
@@ -74,16 +79,16 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_MPLU_OVER
L_MPLU_OVER
#else /* L_MPLU_OVER */
mplu = (mdiff == 1 ? "" : L_MPLU);
mplu = (mdiff == 1 ? "" : DynamicMplu);
#endif /* L_MPLU_OVER */
#ifdef L_HPLU_OVER
L_HPLU_OVER
#else /* L_HPLU_OVER */
hplu = (hdiff == 1 ? "" : L_HPLU);
hplu = (hdiff == 1 ? "" : DynamicHplu);
#endif /* L_HPLU_OVER */
when = (tdiff < 0 ? L_AGO : L_FROMNOW);
when = (tdiff < 0) ? DynamicAgo : DynamicFromnow;
h = tim / 60;
min = tim % 60;
@@ -91,7 +96,26 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_AMPM_OVERRIDE
L_AMPM_OVERRIDE (pm, h)
#else
pm = (h < 12) ? L_AM : L_PM;
r = -1;
if (UserFuncExists("subst_ampm") == 1) {
snprintf(s, sizeof(s), "subst_ampm(%d)", h);
expr = (char const *) s;
r = EvalExpr(&expr, &v, NULL);
if (r == OK) {
if (!DoCoerce(STR_TYPE, &v)) {
snprintf(mypm, sizeof(mypm), "%s", v.v.str);
pm = mypm;
} else {
r = -1;
}
DestroyValue(v);
} else {
Eprint("%s", ErrMsg[r]);
}
}
if (r != OK) {
pm = (h < 12) ? DynamicAm : DynamicPm;
}
#endif
hh = (h == 12) ? 12 : h % 12;
@@ -101,25 +125,60 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_AMPM_OVERRIDE
L_AMPM_OVERRIDE (cpm, ch)
#else
cpm = (ch < 12) ? L_AM : L_PM;
r = -1;
if (UserFuncExists("subst_ampm") == 1) {
snprintf(s, sizeof(s), "subst_ampm(%d)", ch);
expr = (char const *) s;
r = EvalExpr(&expr, &v, NULL);
if (r == OK) {
if (!DoCoerce(STR_TYPE, &v)) {
snprintf(mycpm, sizeof(mycpm), "%s", v.v.str);
cpm = mycpm;
} else {
r = -1;
}
} else {
Eprint("%s", ErrMsg[r]);
}
}
if (r != OK) {
cpm = (h < 12) ? DynamicAm : DynamicPm;
}
#endif
chh = (ch == 12) ? 12 : ch % 12;
#ifdef L_ORDINAL_OVERRIDE
L_ORDINAL_OVERRIDE
L_ORDINAL_OVERRIDE;
#else
switch(d) {
case 1:
case 21:
case 31: plu = "st"; break;
if (UserFuncExists("subst_ordinal") == 1) {
snprintf(s, sizeof(s), "subst_ordinal(%d)", d);
expr = (char const *) s;
r = EvalExpr(&expr, &v, NULL);
if (r == OK) {
if (!DoCoerce(STR_TYPE, &v)) {
snprintf(myplu, sizeof(myplu), "%s", v.v.str);
plu = myplu;
} else {
r = -1;
}
} else {
Eprint("%s", ErrMsg[r]);
}
}
if (r != OK) {
switch(d) {
case 1:
case 21:
case 31: plu = "st"; break;
case 2:
case 22: plu = "nd"; break;
case 2:
case 22: plu = "nd"; break;
case 3:
case 23: plu = "rd"; break;
case 3:
case 23: plu = "rd"; break;
default: plu = "th"; break;
default: plu = "th"; break;
}
}
#endif
@@ -163,6 +222,26 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
}
}
done = 0;
snprintf(uf, sizeof(uf), "subst_%c", c);
if (UserFuncExists(uf) == 3) {
snprintf(s, sizeof(s), "subst_%c(%d,'%04d-%02d-%02d',%02d:%02d)",
c, altmode ? 1 : 0, y, m+1, d, h, min);
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;
}
}
DestroyValue(v);
continue;
} else {
Eprint("%s", ErrMsg[r]);
}
}
if (diff <= 1) {
switch(UPPER(c)) {
#ifndef L_NOTOMORROW_A
@@ -204,7 +283,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifndef L_NOTOMORROW_V
case 'V':
#endif
sprintf(s, "%s", (diff ? TOMORROW : TODAY));
snprintf(s, sizeof(s), "%s", (diff ? DynamicTomorrow: DynamicToday));
SHIP_OUT(s);
done = 1;
break;
@@ -213,16 +292,39 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
}
}
if (!done) {
snprintf(uf, sizeof(uf), "subst_%cx", c);
if (UserFuncExists(uf) == 3) {
snprintf(s, sizeof(s), "subst_%cx(%d,'%04d-%02d-%02d',%02d:%02d)",
c, altmode ? 1 : 0, y, m+1, d, h, min);
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;
}
}
DestroyValue(v);
continue;
} else {
Eprint("%s", ErrMsg[r]);
}
}
}
if (!done) switch(UPPER(c)) {
case 'A':
#ifdef L_A_OVER
L_A_OVER
#else
if (altmode == '*') {
sprintf(s, "%s, %d %s, %d", get_day_name(jul%7), d,
if (altmode == '*' || !strcmp(DynamicOn, "")) {
snprintf(s, sizeof(s), "%s, %d %s, %d", get_day_name(jul%7), d,
get_month_name(m), y);
} else {
sprintf(s, "%s %s, %d %s, %d", L_ON, get_day_name(jul%7), d,
snprintf(s, sizeof(s), "%s %s, %d %s, %d", DynamicOn, get_day_name(jul%7), d,
get_month_name(m), y);
}
#endif
@@ -233,7 +335,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_B_OVER
L_B_OVER
#else
sprintf(s, L_INXDAYS, diff);
snprintf(s, sizeof(s), L_INXDAYS, diff);
#endif
SHIP_OUT(s);
break;
@@ -242,10 +344,10 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_C_OVER
L_C_OVER
#else
if (altmode == '*') {
sprintf(s, "%s", get_day_name(jul%7));
if (altmode == '*' || !strcmp(DynamicOn, "")) {
snprintf(s, sizeof(s), "%s", get_day_name(jul%7));
} else {
sprintf(s, "%s %s", L_ON, get_day_name(jul%7));
snprintf(s, sizeof(s), "%s %s", DynamicOn, get_day_name(jul%7));
}
#endif
SHIP_OUT(s);
@@ -255,7 +357,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_D_OVER
L_D_OVER
#else
sprintf(s, "%d", d);
snprintf(s, sizeof(s), "%d", d);
#endif
SHIP_OUT(s);
break;
@@ -264,11 +366,11 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_E_OVER
L_E_OVER
#else
if (altmode == '*') {
sprintf(s, "%02d%c%02d%c%04d", d, DateSep,
if (altmode == '*' || !strcmp(DynamicOn, "")) {
snprintf(s, sizeof(s), "%02d%c%02d%c%04d", d, DateSep,
m+1, DateSep, y);
} else {
sprintf(s, "%s %02d%c%02d%c%04d", L_ON, d, DateSep,
snprintf(s, sizeof(s), "%s %02d%c%02d%c%04d", DynamicOn, d, DateSep,
m+1, DateSep, y);
}
#endif
@@ -279,10 +381,10 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_F_OVER
L_F_OVER
#else
if (altmode == '*') {
sprintf(s, "%02d%c%02d%c%04d", m+1, DateSep, d, DateSep, y);
if (altmode == '*' || !strcmp(DynamicOn, "")) {
snprintf(s, sizeof(s), "%02d%c%02d%c%04d", m+1, DateSep, d, DateSep, y);
} else {
sprintf(s, "%s %02d%c%02d%c%04d", L_ON, m+1, DateSep, d, DateSep, y);
snprintf(s, sizeof(s), "%s %02d%c%02d%c%04d", DynamicOn, m+1, DateSep, d, DateSep, y);
}
#endif
SHIP_OUT(s);
@@ -292,10 +394,10 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_G_OVER
L_G_OVER
#else
if (altmode == '*') {
sprintf(s, "%s, %d %s", get_day_name(jul%7), d, get_month_name(m));
if (altmode == '*' || !strcmp(DynamicOn, "")) {
snprintf(s, sizeof(s), "%s, %d %s", get_day_name(jul%7), d, get_month_name(m));
} else {
sprintf(s, "%s %s, %d %s", L_ON, get_day_name(jul%7), d, get_month_name(m));
snprintf(s, sizeof(s), "%s %s, %d %s", DynamicOn, get_day_name(jul%7), d, get_month_name(m));
}
#endif
SHIP_OUT(s);
@@ -305,10 +407,10 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_H_OVER
L_H_OVER
#else
if (altmode == '*') {
sprintf(s, "%02d%c%02d", d, DateSep, m+1);
if (altmode == '*' || !strcmp(DynamicOn, "")) {
snprintf(s, sizeof(s), "%02d%c%02d", d, DateSep, m+1);
} else {
sprintf(s, "%s %02d%c%02d", L_ON, d, DateSep, m+1);
snprintf(s, sizeof(s), "%s %02d%c%02d", DynamicOn, d, DateSep, m+1);
}
#endif
SHIP_OUT(s);
@@ -318,10 +420,10 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_I_OVER
L_I_OVER
#else
if (altmode == '*') {
sprintf(s, "%02d%c%02d", m+1, DateSep, d);
if (altmode == '*' || !strcmp(DynamicOn, "")) {
snprintf(s, sizeof(s), "%02d%c%02d", m+1, DateSep, d);
} else {
sprintf(s, "%s %02d%c%02d", L_ON, m+1, DateSep, d);
snprintf(s, sizeof(s), "%s %02d%c%02d", DynamicOn, m+1, DateSep, d);
}
#endif
SHIP_OUT(s);
@@ -331,11 +433,11 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_J_OVER
L_J_OVER
#else
if (altmode == '*') {
sprintf(s, "%s, %s %d%s, %d", get_day_name(jul%7),
if (altmode == '*' || !strcmp(DynamicOn, "")) {
snprintf(s, sizeof(s), "%s, %s %d%s, %d", get_day_name(jul%7),
get_month_name(m), d, plu, y);
} else {
sprintf(s, "%s %s, %s %d%s, %d", L_ON, get_day_name(jul%7),
snprintf(s, sizeof(s), "%s %s, %s %d%s, %d", DynamicOn, get_day_name(jul%7),
get_month_name(m), d, plu, y);
}
#endif
@@ -346,11 +448,11 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_K_OVER
L_K_OVER
#else
if (altmode == '*') {
sprintf(s, "%s, %s %d%s", get_day_name(jul%7),
if (altmode == '*' || !strcmp(DynamicOn, "")) {
snprintf(s, sizeof(s), "%s, %s %d%s", get_day_name(jul%7),
get_month_name(m), d, plu);
} else {
sprintf(s, "%s %s, %s %d%s", L_ON, get_day_name(jul%7),
snprintf(s, sizeof(s), "%s %s, %s %d%s", DynamicOn, get_day_name(jul%7),
get_month_name(m), d, plu);
}
#endif
@@ -361,10 +463,10 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_L_OVER
L_L_OVER
#else
if (altmode == '*') {
sprintf(s, "%04d%c%02d%c%02d", y, DateSep, m+1, DateSep, d);
if (altmode == '*' || !strcmp(DynamicOn, "")) {
snprintf(s, sizeof(s), "%04d%c%02d%c%02d", y, DateSep, m+1, DateSep, d);
} else {
sprintf(s, "%s %04d%c%02d%c%02d", L_ON, y, DateSep, m+1, DateSep, d);
snprintf(s, sizeof(s), "%s %04d%c%02d%c%02d", DynamicOn, y, DateSep, m+1, DateSep, d);
}
#endif
SHIP_OUT(s);
@@ -374,7 +476,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_M_OVER
L_M_OVER
#else
sprintf(s, "%s", get_month_name(m));
snprintf(s, sizeof(s), "%s", get_month_name(m));
#endif
SHIP_OUT(s);
break;
@@ -383,7 +485,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_N_OVER
L_N_OVER
#else
sprintf(s, "%d", m+1);
snprintf(s, sizeof(s), "%d", m+1);
#endif
SHIP_OUT(s);
break;
@@ -392,7 +494,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_O_OVER
L_O_OVER
#else
if (RealToday == JulianToday) sprintf(s, " (%s)", L_TODAY);
if (RealToday == JulianToday) snprintf(s, sizeof(s), " (%s)", DynamicToday);
else *s = 0;
#endif
SHIP_OUT(s);
@@ -402,7 +504,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_P_OVER
L_P_OVER
#else
sprintf(s, "%s", (diff == 1 ? "" : L_PLURAL));
snprintf(s, sizeof(s), "%s", (diff == 1 ? "" : L_PLURAL));
#endif
SHIP_OUT(s);
break;
@@ -411,7 +513,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_Q_OVER
L_Q_OVER
#else
sprintf(s, "%s", (diff == 1 ? "'s" : "s'"));
snprintf(s, sizeof(s), "%s", (diff == 1 ? "'s" : "s'"));
#endif
SHIP_OUT(s);
break;
@@ -420,7 +522,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_R_OVER
L_R_OVER
#else
sprintf(s, "%02d", d);
snprintf(s, sizeof(s), "%02d", d);
#endif
SHIP_OUT(s);
break;
@@ -429,7 +531,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_S_OVER
L_S_OVER
#else
sprintf(s, "%s", plu);
snprintf(s, sizeof(s), "%s", plu);
#endif
SHIP_OUT(s);
break;
@@ -438,7 +540,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_T_OVER
L_T_OVER
#else
sprintf(s, "%02d", m+1);
snprintf(s, sizeof(s), "%02d", m+1);
#endif
SHIP_OUT(s);
break;
@@ -447,11 +549,11 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_U_OVER
L_U_OVER
#else
if (altmode == '*') {
sprintf(s, "%s, %d%s %s, %d", get_day_name(jul%7), d,
if (altmode == '*' || !strcmp(DynamicOn, "")) {
snprintf(s, sizeof(s), "%s, %d%s %s, %d", get_day_name(jul%7), d,
plu, get_month_name(m), y);
} else {
sprintf(s, "%s %s, %d%s %s, %d", L_ON, get_day_name(jul%7), d,
snprintf(s, sizeof(s), "%s %s, %d%s %s, %d", DynamicOn, get_day_name(jul%7), d,
plu, get_month_name(m), y);
}
#endif
@@ -462,11 +564,11 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_V_OVER
L_V_OVER
#else
if (altmode == '*') {
sprintf(s, "%s, %d%s %s", get_day_name(jul%7), d, plu,
if (altmode == '*' || !strcmp(DynamicOn, "")) {
snprintf(s, sizeof(s), "%s, %d%s %s", get_day_name(jul%7), d, plu,
get_month_name(m));
} else {
sprintf(s, "%s %s, %d%s %s", L_ON, get_day_name(jul%7), d, plu,
snprintf(s, sizeof(s), "%s %s, %d%s %s", DynamicOn, get_day_name(jul%7), d, plu,
get_month_name(m));
}
#endif
@@ -477,7 +579,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_W_OVER
L_W_OVER
#else
sprintf(s, "%s", get_day_name(jul%7));
snprintf(s, sizeof(s), "%s", get_day_name(jul%7));
#endif
SHIP_OUT(s);
break;
@@ -486,7 +588,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_X_OVER
L_X_OVER
#else
sprintf(s, "%d", diff);
snprintf(s, sizeof(s), "%d", diff);
#endif
SHIP_OUT(s);
break;
@@ -495,7 +597,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_Y_OVER
L_Y_OVER
#else
sprintf(s, "%d", y);
snprintf(s, sizeof(s), "%d", y);
#endif
SHIP_OUT(s);
break;
@@ -504,7 +606,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_Z_OVER
L_Z_OVER
#else
sprintf(s, "%d", y % 100);
snprintf(s, sizeof(s), "%d", y % 100);
#endif
SHIP_OUT(s);
break;
@@ -514,14 +616,14 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
L_1_OVER
#else
if (tdiff == 0)
sprintf(s, "%s", L_NOW);
snprintf(s, sizeof(s), "%s", DynamicNow);
else if (hdiff == 0)
sprintf(s, "%d %s%s %s", mdiff, L_MINUTE, mplu, when);
snprintf(s, sizeof(s), "%d %s%s %s", mdiff, DynamicMinute, mplu, when);
else if (mdiff == 0)
sprintf(s, "%d %s%s %s", hdiff, L_HOUR, hplu, when);
snprintf(s, sizeof(s), "%d %s%s %s", hdiff, DynamicHour, hplu, when);
else
sprintf(s, "%d %s%s %s %d %s%s %s", hdiff, L_HOUR, hplu,
L_AND, mdiff, L_MINUTE, mplu, when);
snprintf(s, sizeof(s), "%d %s%s %s %d %s%s %s", hdiff, DynamicHour, hplu,
DynamicAnd, mdiff, DynamicMinute, mplu, when);
#endif
SHIP_OUT(s);
break;
@@ -531,9 +633,9 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
L_2_OVER
#else
if (altmode == '*') {
sprintf(s, "%d%c%02d%s", hh, TimeSep, min, pm);
snprintf(s, sizeof(s), "%d%c%02d%s", hh, TimeSep, min, pm);
} else {
sprintf(s, "%s %d%c%02d%s", L_AT, hh, TimeSep, min, pm);
snprintf(s, sizeof(s), "%s %d%c%02d%s", DynamicAt, hh, TimeSep, min, pm);
}
#endif
SHIP_OUT(s);
@@ -545,9 +647,9 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#else
if (altmode == '*') {
sprintf(s, "%02d%c%02d", h, TimeSep, min);
snprintf(s, sizeof(s), "%02d%c%02d", h, TimeSep, min);
} else {
sprintf(s, "%s %02d%c%02d", L_AT, h, TimeSep, min);
snprintf(s, sizeof(s), "%s %02d%c%02d", DynamicAt, h, TimeSep, min);
}
#endif
SHIP_OUT(s);
@@ -557,7 +659,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_4_OVER
L_4_OVER
#else
sprintf(s, "%d", tdiff);
snprintf(s, sizeof(s), "%d", tdiff);
#endif
SHIP_OUT(s);
break;
@@ -566,7 +668,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_5_OVER
L_5_OVER
#else
sprintf(s, "%d", adiff);
snprintf(s, sizeof(s), "%d", adiff);
#endif
SHIP_OUT(s);
break;
@@ -575,7 +677,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_6_OVER
L_6_OVER
#else
sprintf(s, "%s", when);
snprintf(s, sizeof(s), "%s", when);
#endif
SHIP_OUT(s);
break;
@@ -584,7 +686,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_7_OVER
L_7_OVER
#else
sprintf(s, "%d", hdiff);
snprintf(s, sizeof(s), "%d", hdiff);
#endif
SHIP_OUT(s);
break;
@@ -593,7 +695,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_8_OVER
L_8_OVER
#else
sprintf(s, "%d", mdiff);
snprintf(s, sizeof(s), "%d", mdiff);
#endif
SHIP_OUT(s);
break;
@@ -602,7 +704,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_9_OVER
L_9_OVER
#else
sprintf(s, "%s", mplu);
snprintf(s, sizeof(s), "%s", mplu);
#endif
SHIP_OUT(s);
break;
@@ -611,7 +713,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_0_OVER
L_0_OVER
#else
sprintf(s, "%s", hplu);
snprintf(s, sizeof(s), "%s", hplu);
#endif
SHIP_OUT(s);
break;
@@ -620,7 +722,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_BANG_OVER
L_BANG_OVER
#else
sprintf(s, "%s", (tdiff >= 0 ? L_IS : L_WAS));
snprintf(s, sizeof(s), "%s", (tdiff >= 0 ? DynamicIs : DynamicWas));
#endif
SHIP_OUT(s);
break;
@@ -629,7 +731,7 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_AT_OVER
L_AT_OVER
#else
sprintf(s, "%d%c%02d%s", chh, TimeSep, cmin, cpm);
snprintf(s, sizeof(s), "%d%c%02d%s", chh, TimeSep, cmin, cpm);
#endif
SHIP_OUT(s);
break;
@@ -638,16 +740,16 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
#ifdef L_HASH_OVER
L_HASH_OVER
#else
sprintf(s, "%02d%c%02d", ch, TimeSep, cmin);
snprintf(s, sizeof(s), "%02d%c%02d", ch, TimeSep, cmin);
#endif
SHIP_OUT(s);
break;
case '_':
if (PsCal == PSCAL_LEVEL2 || PsCal == PSCAL_LEVEL3 || (mode != CAL_MODE && mode != ADVANCE_MODE && !MsgCommand)) {
sprintf(s, "%s", NL);
snprintf(s, sizeof(s), "%s", NL);
} else {
sprintf(s, " ");
snprintf(s, sizeof(s), " ");
}
SHIP_OUT(s);
break;
@@ -657,8 +759,13 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
break;
case '"':
if (DBufPutc(dbuf, QUOTE_MARKER) != OK) return E_NO_MEM;
has_quote = 1;
if (DontSuppressQuoteMarkers) {
if (DBufPutc(dbuf, '%') != OK) return E_NO_MEM;
if (DBufPutc(dbuf, c) != OK) return E_NO_MEM;
} else {
if (DBufPutc(dbuf, QUOTE_MARKER) != OK) return E_NO_MEM;
has_quote = 1;
}
break;
default:

View File

@@ -6,7 +6,7 @@
/* buffers. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/

View File

@@ -5,7 +5,7 @@
/* Declaration of functions for manipulating dynamic buffers */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/

View File

@@ -5,7 +5,7 @@
/* Error definitions. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/

View File

@@ -5,7 +5,7 @@
/* This file contains routines to parse and evaluate */
/* expressions. */
/* */
/* Copyright 1992-2021 by Dianne Skoll */
/* Copyright 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -783,12 +783,11 @@ static int Add(void)
/* If both are ints, just add 'em */
if (v2.type == INT_TYPE && v1.type == INT_TYPE) {
int old = v1.v.val;
v1.v.val += v2.v.val;
/* Check for overflow */
if (_private_add_overflow(v1.v.val, v2.v.val, old)) {
if (_private_add_overflow(v1.v.val, v2.v.val)) {
return E_2HIGH;
}
v1.v.val += v2.v.val;
PushValStack(v1);
return OK;
}
@@ -796,9 +795,8 @@ static int Add(void)
/* If it's a date plus an int, add 'em */
if ((v1.type == DATE_TYPE && v2.type == INT_TYPE) ||
(v1.type == INT_TYPE && v2.type == DATE_TYPE)) {
int old = v1.v.val;
if (_private_add_overflow(v1.v.val, v2.v.val)) return E_DATE_OVER;
v1.v.val += v2.v.val;
if (_private_add_overflow(v1.v.val, v2.v.val, old)) return E_DATE_OVER;
if (v1.v.val < 0) return E_DATE_OVER;
v1.type = DATE_TYPE;
PushValStack(v1);
@@ -808,9 +806,8 @@ static int Add(void)
/* If it's a datetime plus an int or a time, add 'em */
if ((v1.type == DATETIME_TYPE && (v2.type == INT_TYPE || v2.type == TIME_TYPE)) ||
((v1.type == INT_TYPE || v1.type == TIME_TYPE) && v2.type == DATETIME_TYPE)) {
int old = v1.v.val;
if (_private_add_overflow(v1.v.val, v2.v.val)) return E_DATE_OVER;
v1.v.val += v2.v.val;
if (_private_add_overflow(v1.v.val, v2.v.val, old)) return E_DATE_OVER;
if (v1.v.val < 0) return E_DATE_OVER;
v1.type = DATETIME_TYPE;
PushValStack(v1);
@@ -822,9 +819,8 @@ static int Add(void)
if ((v1.type == TIME_TYPE && v2.type == INT_TYPE) ||
(v1.type == INT_TYPE && v2.type == TIME_TYPE) ||
(v1.type == TIME_TYPE && v2.type == TIME_TYPE)) {
int old = v1.v.val;
if (_private_add_overflow(v1.v.val, v2.v.val)) return E_DATE_OVER;
v1.v.val += v2.v.val;
if (_private_add_overflow(v1.v.val, v2.v.val, old)) return E_DATE_OVER;
v1.v.val = v1.v.val % MINUTES_PER_DAY;
if (v1.v.val < 0) v1.v.val += MINUTES_PER_DAY;
v1.type = TIME_TYPE;
@@ -885,18 +881,16 @@ static int Subtract(void)
/* If they're both INTs, do subtraction */
if (v1.type == INT_TYPE && v2.type == INT_TYPE) {
int old = v1.v.val;
if (_private_sub_overflow(v1.v.val, v2.v.val)) return E_2HIGH;
v1.v.val -= v2.v.val;
if (_private_sub_overflow(v1.v.val, v2.v.val, old)) return E_2HIGH;
PushValStack(v1);
return OK;
}
/* If it's a date minus an int, do subtraction, checking for underflow */
if (v1.type == DATE_TYPE && v2.type == INT_TYPE) {
int old = v1.v.val;
if (_private_sub_overflow(v1.v.val, v2.v.val)) return E_DATE_OVER;
v1.v.val -= v2.v.val;
if (_private_sub_overflow(v1.v.val, v2.v.val, old)) return E_DATE_OVER;
if (v1.v.val < 0) return E_DATE_OVER;
PushValStack(v1);
return OK;
@@ -905,9 +899,8 @@ static int Subtract(void)
/* If it's a datetime minus an int or a time, do subtraction,
* checking for underflow */
if (v1.type == DATETIME_TYPE && (v2.type == INT_TYPE || v2.type == TIME_TYPE)) {
int old = v1.v.val;
if (_private_sub_overflow(v1.v.val, v2.v.val)) return E_DATE_OVER;
v1.v.val -= v2.v.val;
if (_private_sub_overflow(v1.v.val, v2.v.val, old)) return E_DATE_OVER;
if (v1.v.val < 0) return E_DATE_OVER;
PushValStack(v1);
return OK;
@@ -925,9 +918,8 @@ static int Subtract(void)
if ((v1.type == TIME_TYPE && v2.type == TIME_TYPE) ||
(v1.type == DATETIME_TYPE && v2.type == DATETIME_TYPE) ||
(v1.type == DATE_TYPE && v2.type == DATE_TYPE)) {
int old = v1.v.val;
if (_private_sub_overflow(v1.v.val, v2.v.val)) return E_DATE_OVER;
v1.v.val -= v2.v.val;
if (_private_sub_overflow(v1.v.val, v2.v.val, old)) return E_DATE_OVER;
v1.type = INT_TYPE;
PushValStack(v1);
return OK;
@@ -962,11 +954,8 @@ static int Multiply(void)
(v1.v.val == -1 && v2.v.val == INT_MIN)) {
return E_2HIGH;
}
int old = v1.v.val;
if (_private_mul_overflow(v1.v.val, v2.v.val)) return E_2HIGH;
v1.v.val *= v2.v.val;
if (v2.v.val != 0) {
if (_private_div(v1.v.val, v2.v.val) != old) return E_2HIGH;
}
PushValStack(v1);
return OK;
}
@@ -1177,9 +1166,8 @@ static int UnMinus(void)
{
Value *v = &ValStack[ValStackPtr-1];
if (v->type != INT_TYPE) return E_BAD_TYPE;
int old = v->v.val;
if (v->v.val == INT_MIN) return E_2HIGH;
v->v.val = -v->v.val;
if (_private_unminus_overflow(old, v->v.val)) return E_2HIGH;
return OK;
}

View File

@@ -5,7 +5,7 @@
/* Contains a few definitions used by expression evaluator. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -58,7 +58,7 @@ else \
in various arithmetic operators. They have to be in separate
functions with extern linkage to defeat compiler optimizations
that would otherwise break the overflow checks. */
extern int _private_div(int a, int b);
extern int _private_add_overflow(int result, int b, int old);
extern int _private_sub_overflow(int result, int b, int old);
extern int _private_unminus_overflow(int a, int b);
extern int _private_mul_overflow(int a, int b);
extern int _private_add_overflow(int a, int b);
extern int _private_sub_overflow(int a, int b);

View File

@@ -7,7 +7,7 @@
/* files. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -163,6 +163,7 @@ int ReadLine(void)
LineNo = CLine->LineNo;
CLine = CLine->next;
FreshLine = 1;
clear_callstack();
if (DebugFlag & DB_ECHO_LINE) OutputLine(ErrFp);
return OK;
}
@@ -263,6 +264,7 @@ static int ReadLineFromFile(int use_pclose)
}
FreshLine = 1;
clear_callstack();
if (DebugFlag & DB_ECHO_LINE) OutputLine(ErrFp);
return OK;
}
@@ -818,6 +820,7 @@ static int IncludeCmd(char const *cmd)
int old_flag;
FreshLine = 1;
clear_callstack();
if (IStackPtr+1 >= INCLUDE_NEST) return E_NESTED_INCLUDE;
i = &IStack[IStackPtr];
@@ -935,6 +938,7 @@ int IncludeFile(char const *fname)
struct stat statbuf;
FreshLine = 1;
clear_callstack();
if (IStackPtr+1 >= INCLUDE_NEST) return E_NESTED_INCLUDE;
i = &IStack[IStackPtr];

View File

@@ -6,7 +6,7 @@
/* expressions. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -111,6 +111,7 @@ static int FNonomitted (func_info *);
static int FNow (func_info *);
static int FOrd (func_info *);
static int FOstype (func_info *);
static int FPad (func_info *);
static int FPlural (func_info *);
static int FPsmoon (func_info *);
static int FPsshade (func_info *);
@@ -264,6 +265,7 @@ BuiltinFunc Func[] = {
{ "now", 0, 0, 0, FNow },
{ "ord", 1, 1, 1, FOrd },
{ "ostype", 0, 0, 1, FOstype },
{ "pad", 3, 4, 1, FPad },
{ "plural", 1, 3, 1, FPlural },
{ "psmoon", 1, 4, 1, FPsmoon},
{ "psshade", 1, 3, 1, FPsshade},
@@ -998,6 +1000,73 @@ static int FOrd(func_info *info)
return RetStrVal(buf, info);
}
/***************************************************************/
/* */
/* FPad - Pad a string to min length */
/* */
/* pad("1", "0", 4) --> "0004" */
/* pad("1", "0", 4, 1) --> "4000" */
/* pad("foo", "bar", 7) -> "barbfoo" */
/* */
/***************************************************************/
static int FPad(func_info *info)
{
int r;
char *s;
DynamicBuffer dbuf;
size_t len;
size_t wantlen;
size_t i;
ASSERT_TYPE(1, STR_TYPE);
ASSERT_TYPE(2, INT_TYPE);
if (Nargs == 4) {
ASSERT_TYPE(3, INT_TYPE);
}
if (ARG(0).type != STR_TYPE) {
r = DoCoerce(STR_TYPE, &ARG(0));
if (r != OK) return r;
}
wantlen = ARGV(2);
len = strlen(ARGSTR(0));
if (len >= wantlen) {
DCOPYVAL(RetVal, ARG(0));
return OK;
}
if (strlen(ARGSTR(1)) == 0) {
return E_BAD_TYPE;
}
if (MaxStringLen > 0 && wantlen > (size_t) MaxStringLen) {
return E_STRING_TOO_LONG;
}
DBufInit(&dbuf);
s = ARGSTR(1);
if (Nargs < 4 || !ARGV(3)) {
/* Pad on the LEFT */
for (i=0; i<wantlen-len; i++) {
DBufPutc(&dbuf, *s++);
if (!*s) s = ARGSTR(1);
}
DBufPuts(&dbuf, ARGSTR(0));
} else {
/* Pad on the RIGHT */
DBufPuts(&dbuf, ARGSTR(0));
for (i=0; i<wantlen-len; i++) {
DBufPutc(&dbuf, *s++);
if (!*s) s = ARGSTR(1);
}
}
r = RetStrVal(DBufValue(&dbuf), info);
DBufFree(&dbuf);
return r;
}
/***************************************************************/
/* */
/* FPlural - pluralization function */
@@ -2237,10 +2306,10 @@ static int SunStuff(int rise, double cosz, int jul)
/* Sometimes, we get roundoff error. Check for "reasonableness" of
answer. */
if (rise) {
/* Sunrise so close to midnight it wrapped around -- permament light */
/* Sunrise so close to midnight it wrapped around -- permanent light */
if (hours >= 23) return NO_TIME;
} else {
/* Sunset so close to midnight it wrapped around -- permament light */
/* Sunset so close to midnight it wrapped around -- permanent light */
if (hours <= 1) return -NO_TIME;
}
return hours*60 + mins;

View File

@@ -8,15 +8,16 @@
/* globals.h and err.h */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
#include "config.h"
#include <stdio.h> /* For defintion of FILE - sigh! */
#include <stdio.h> /* For definition of FILE - sigh! */
#include "types.h"
#include "custom.h"
#include "lang.h"
#define MK_GLOBALS 1
#include "globals.h"
#include "err.h"

View File

@@ -11,6 +11,7 @@
/* */
/***************************************************************/
#ifdef MK_GLOBALS
#undef EXTERN
#define EXTERN
@@ -24,6 +25,10 @@
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
EXTERN FILE *ErrFp;
#include "dynbuf.h"
#include "lang.h"
#define MAX_TRUSTED_USERS 20
@@ -75,6 +80,7 @@ EXTERN INIT( long SysTime, -1L);
EXTERN char const *InitialFile;
EXTERN int FileAccessDate;
EXTERN INIT( int DontSuppressQuoteMarkers, 0);
EXTERN INIT( int DontFork, 0);
EXTERN INIT( int DontQueue, 0);
EXTERN INIT( int NumQueued, 0);
@@ -94,7 +100,6 @@ EXTERN INIT( char *FileName, NULL);
EXTERN INIT( int UseStdin, 0);
EXTERN INIT( int PurgeMode, 0);
EXTERN INIT( int PurgeIncludeDepth, 0);
EXTERN FILE *ErrFp;
EXTERN INIT( FILE *PurgeFP, NULL);
EXTERN INIT( int NumIfs, 0);
EXTERN INIT( unsigned int IfFlags, 0);
@@ -141,11 +146,6 @@ EXTERN INIT( int SubsIndent, 0);
EXTERN INIT( char *EndSent, ".?!");
EXTERN INIT( char *EndSentIg, "\"')]}>");
/* We need the language stuff here... */
#include "lang.h"
#include "dynbuf.h"
EXTERN DynamicBuffer Banner;
EXTERN DynamicBuffer LineBuffer;
EXTERN DynamicBuffer ExprBuf;
@@ -227,3 +227,92 @@ EXTERN int MonthIndex[2][12]
#endif
;
EXTERN char *DynamicAgo
#ifdef MK_GLOBALS
= L_AGO
#endif
;
EXTERN char *DynamicAm
#ifdef MK_GLOBALS
= L_AM
#endif
;
EXTERN char *DynamicAnd
#ifdef MK_GLOBALS
= L_AND
#endif
;
EXTERN char *DynamicAt
#ifdef MK_GLOBALS
= L_AT
#endif
;
EXTERN char *DynamicFromnow
#ifdef MK_GLOBALS
= L_FROMNOW
#endif
;
EXTERN char *DynamicHour
#ifdef MK_GLOBALS
= L_HOUR
#endif
;
EXTERN char *DynamicHplu
#ifdef MK_GLOBALS
= L_HPLU
#endif
;
EXTERN char *DynamicIs
#ifdef MK_GLOBALS
= L_IS
#endif
;
EXTERN char *DynamicMinute
#ifdef MK_GLOBALS
= L_MINUTE
#endif
;
EXTERN char *DynamicMplu
#ifdef MK_GLOBALS
= L_MPLU
#endif
;
EXTERN char *DynamicNow
#ifdef MK_GLOBALS
= L_NOW
#endif
;
EXTERN char *DynamicOn
#ifdef MK_GLOBALS
= L_ON
#endif
;
EXTERN char *DynamicPm
#ifdef MK_GLOBALS
= L_PM
#endif
;
EXTERN char *DynamicToday
#ifdef MK_GLOBALS
= L_TODAY
#endif
;
EXTERN char *DynamicTomorrow
#ifdef MK_GLOBALS
= L_TOMORROW
#endif
;
EXTERN char *DynamicWas
#ifdef MK_GLOBALS
= L_WAS
#endif
;
#define XSTR(x) #x
#define STRSYSDIR(x) XSTR(x)
EXTERN char *SysDir
#ifdef MK_GLOBALS
= STRSYSDIR(SYSDIR);
#endif
;

View File

@@ -5,7 +5,7 @@
/* Support for the Hebrew calendar */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/* Derived from code written by Amos Shapir in 1978; revised */
/* 1985. */

View File

@@ -7,7 +7,7 @@
/* in normal mode. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -30,10 +30,10 @@
#endif
#include "types.h"
#include "globals.h"
#include "protos.h"
#include "expr.h"
#include "err.h"
#include "globals.h"
/***************************************************************
*
@@ -154,7 +154,7 @@ void InitRemind(int argc, char const *argv[])
if (FormWidth > 500) FormWidth = 500;
}
}
/* Initialize global dynamic buffers */
DBufInit(&Banner);
DBufInit(&LineBuffer);
@@ -232,7 +232,10 @@ void InitRemind(int argc, char const *argv[])
Use256Colors = 1;
} else if (x == 2) {
UseTrueColors = 1;
}
} else if (x != 0) {
fprintf(ErrFp, "%s: -@n,m: n must be 0, 1 or 2 (assuming 0)\n",
argv[0]);
}
}
if (*arg == ',') {
arg++;
@@ -241,7 +244,10 @@ void InitRemind(int argc, char const *argv[])
TerminalBackground = TERMINAL_BACKGROUND_DARK;
} else if (x == 1) {
TerminalBackground = TERMINAL_BACKGROUND_LIGHT;
}
} else {
fprintf(ErrFp, "%s: -@n,m: m must be 0 or 1\n",
argv[0]);
}
}
break;
@@ -459,6 +465,7 @@ void InitRemind(int argc, char const *argv[])
DoSimpleCalendar = 1;
PsCal = PSCAL_LEVEL1;
while (*arg == 'a' || *arg == 'A' ||
*arg == 'q' || *arg == 'Q' ||
*arg == 'p' || *arg == 'P') {
if (*arg == 'a' || *arg == 'A') {
DoSimpleCalDelta = 1;
@@ -471,7 +478,9 @@ void InitRemind(int argc, char const *argv[])
} else {
PsCal = PSCAL_LEVEL3;
}
}
} else if (*arg == 'q' || *arg == 'Q') {
DontSuppressQuoteMarkers = 1;
}
arg++;
}
PARSENUM(CalMonths, arg);
@@ -672,7 +681,7 @@ void InitRemind(int argc, char const *argv[])
#ifndef L_USAGE_OVERRIDE
void Usage(void)
{
fprintf(ErrFp, "\nREMIND %s (%s version) Copyright 1992-2021 Dianne Skoll\n", VERSION, L_LANGNAME);
fprintf(ErrFp, "\nREMIND %s (%s version) Copyright 1992-2022 Dianne Skoll\n", VERSION, L_LANGNAME);
#ifdef BETA
fprintf(ErrFp, ">>>> BETA VERSION <<<<\n");
#endif

View File

@@ -5,7 +5,7 @@
/* Header file for language support for various languages. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/

View File

@@ -6,7 +6,7 @@
/* */
/* This file is part of REMIND. */
/* */
/* REMIND is Copyright (C) 1992-2021 by Dianne Skoll */
/* REMIND is Copyright (C) 1992-2022 by Dianne Skoll */
/* This file is Copyright (C) 1993 by Mogens Lynnerup. */
/* */
/***************************************************************/
@@ -48,9 +48,6 @@
#define L_AM "am"
#define L_PM "pm"
/*** The following are only used in dosubst.c ***/
#ifdef L_IN_DOSUBST
/* Ago and from now */
#define L_AGO "siden"
#define L_FROMNOW "fra nu"
@@ -91,5 +88,3 @@
#define L_I_OVER sprintf(s, "den %02d%c%02d", m+1, DateSep, d);
#define L_U_OVER L_A_OVER
#define L_V_OVER L_G_OVER
#endif /* L_IN_DOSUBST */

View File

@@ -11,7 +11,7 @@
/* Further corrections by Erik-Jan Vens */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -52,9 +52,6 @@
#define L_AM "am"
#define L_PM "pm"
/*** The following are only used in dosubst.c ***/
#ifdef L_IN_DOSUBST
/* Ago and from now */
#define L_AGO "geleden"
#define L_FROMNOW "vanaf nu"
@@ -91,15 +88,14 @@ if (tdiff == 0) \
sprintf(s, L_NOW); \
else if (hdiff == 0) \
sprintf(s, "%d %s %s", mdiff, \
(mdiff == 1 ? "minuut" : "minuten"), when); \
((mdiff == 1) ? "minuut" : "minuten"), when); \
else if (mdiff == 0) \
sprintf(s, "%d %s %s", hdiff, \
(mdiff == 1 ? "uur" : "uren"), when); \
else sprintf(s, "%d %s %s %d %s %s", hdiff, \
(hdiff == 1 ? "uur" : "uren"), \
L_AND, mdiff, \
(mdiff == 1 ? "minuut" : "minuten"), \
when);
((hdiff == 1) ? "uur" : "uren"), when); \
else sprintf(s, "%d %s %s %d %s %s", hdiff, \
(hdiff == 1 ? "uur" : "uren"), \
L_AND, mdiff, \
(mdiff == 1 ? "minuut" : "minuten"), \
when);
#endif /* L_IN_DOSUBST */

View File

@@ -5,7 +5,7 @@
/* Support for the English language. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -46,9 +46,6 @@
#define L_AM "am"
#define L_PM "pm"
/*** The following are only used in dosubst.c ***/
#ifdef L_IN_DOSUBST
/* Ago and from now */
#define L_AGO "ago"
#define L_FROMNOW "from now"
@@ -72,11 +69,9 @@
#define L_WAS "was"
#define L_AND "and"
/* What to add to make "hour" plural */
#define L_HPLU "s"
#define L_HPLU "s"
/* What to add to make "minute" plural */
#define L_MPLU "s"
/* Define any overrides here, such as L_ORDINAL_OVERRIDE, L_A_OVER, etc.
See the file dosubst.c for more info. */
#endif /* L_IN_DOSUBST */

View File

@@ -11,7 +11,7 @@
/* */
/* This file is part of REMIND. */
/* This file is Copyright (C) 1993-1998 by Mikko Silvonen. */
/* REMIND is Copyright (C) 1992-2021 by Dianne Skoll */
/* REMIND is Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -52,9 +52,6 @@
#define L_AM " ap."
#define L_PM " ip."
/*** The following are only used in dosubst.c ***/
#ifdef L_IN_DOSUBST
/* Ago and from now */
#define L_AGO "sitten"
#define L_FROMNOW "kuluttua"
@@ -138,7 +135,6 @@ else { \
} \
sprintf(s + strlen(s), when); \
}
#endif /* L_IN_DOSUBST */
/* The next ones are used only when MK_GLOBALS is set */
#ifdef MK_GLOBALS
@@ -257,7 +253,7 @@ EXTERN char *ErrMsg[] =
#define L_USAGE_OVERRIDE 1
void Usage(void)
{
fprintf(ErrFp, "\nREMIND %s (%s version) Copyright 1992-2021 Dianne Skoll\n", VERSION, L_LANGNAME);
fprintf(ErrFp, "\nREMIND %s (%s version) Copyright 1992-2022 Dianne Skoll\n", VERSION, L_LANGNAME);
#ifdef BETA
fprintf(ErrFp, ">>>> BETAVERSIO <<<<\n");
#endif

View File

@@ -8,7 +8,7 @@
/* */
/* This file is part of REMIND. */
/* */
/* REMIND is Copyright (C) 1992-2021 by Dianne Skoll */
/* REMIND is Copyright (C) 1992-2022 by Dianne Skoll */
/* This file is Copyright (C) 1993 by Laurent Duperval and */
/* Dianne Skoll. */
/* */
@@ -51,9 +51,6 @@
#define L_AM "am"
#define L_PM "pm"
/*** The following are only used in dosubst.c ***/
#ifdef L_IN_DOSUBST
/* Ago and from now */
#define L_AGO "il y a"
#define L_FROMNOW "dans"
@@ -113,8 +110,6 @@ else if (tdiff < 0) { \
#define L_K_OVER if (altmode == '*') { sprintf(s, "%s, %d%s %s", DayName[jul%7], d, plu, MonthName[m]); } else { sprintf(s, "%s %s, %d%s %s", L_ON, DayName[jul%7], d, plu, MonthName[m]); }
#endif /* L_IN_DOSUBST */
/* The next ones are used only when MK_GLOBALS is set */
#ifdef MK_GLOBALS
#define L_ERR_OVERRIDE 1
@@ -232,7 +227,7 @@ EXTERN char *ErrMsg[] =
#define L_USAGE_OVERRIDE 1
void Usage(void)
{
fprintf(ErrFp, "\nREMIND %s (%s version) Copyright 1992-2021 Dianne Skoll\n", VERSION, L_LANGNAME);
fprintf(ErrFp, "\nREMIND %s (%s version) Copyright 1992-2022 Dianne Skoll\n", VERSION, L_LANGNAME);
#ifdef BETA
fprintf(ErrFp, ">>>> BETA VERSION <<<<\n");
#endif

View File

@@ -9,7 +9,7 @@
/* I don't speak German. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -50,9 +50,6 @@
#define L_AM "am"
#define L_PM "pm"
/*** The following are only used in dosubst.c ***/
#ifdef L_IN_DOSUBST
/* Ago and from now */
#define L_AGO "vorher"
#define L_FROMNOW "von heute"
@@ -88,5 +85,3 @@
#define L_G_OVER if (altmode == '*') { sprintf(s, "%s, den %d. %s", DayName[jul%7], d, MonthName[m]); } else { sprintf(s, "%s %s, den %d. %s", L_ON, DayName[jul%7], d, MonthName[m]); }
#define L_U_OVER L_A_OVER
#define L_V_OVER L_G_OVER
#endif /* L_IN_DOSUBST */

View File

@@ -5,8 +5,8 @@
/* Support for the Icelandic language. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Translated by Björn Davíðsson (bjossi@snerpa.is) */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* Translated by Björn Davíðsson (bjossi@snerpa.is) */
/* */
/***************************************************************/
@@ -15,59 +15,56 @@
/* Day names */
#define L_SUNDAY "sunnudagur"
#define L_MONDAY "mánudagur"
#define L_TUESDAY "þriðjudagur"
#define L_WEDNESDAY "miðvikudagur"
#define L_MONDAY "mánudagur"
#define L_TUESDAY "þriðjudagur"
#define L_WEDNESDAY "miðvikudagur"
#define L_THURSDAY "fimmtudagur"
#define L_FRIDAY "föstudagur"
#define L_FRIDAY "föstudagur"
#define L_SATURDAY "laugardagur"
/* Month names */
#define L_JAN "janúar"
#define L_FEB "febrúar"
#define L_JAN "janúar"
#define L_FEB "febrúar"
#define L_MAR "mars"
#define L_APR "apríl"
#define L_MAY "maí"
#define L_JUN "júní"
#define L_JUL "júlí"
#define L_AUG "ágúst"
#define L_APR "apríl"
#define L_MAY "maí"
#define L_JUN "júní"
#define L_JUL "júlí"
#define L_AUG "ágúst"
#define L_SEP "september"
#define L_OCT "október"
#define L_NOV "nóvember"
#define L_OCT "október"
#define L_NOV "nóvember"
#define L_DEC "desember"
/* Today and tomorrow */
#define L_TODAY "í dag"
#define L_TOMORROW "á morgun"
#define L_TODAY "í dag"
#define L_TOMORROW "á morgun"
/* The default banner */
#define L_BANNER "Minnisatriði: %w, %d%s %m, %y%o:"
#define L_BANNER "Minnisatriði: %w, %d%s %m, %y%o:"
/* "am" and "pm" */
#define L_AM "fh"
#define L_PM "eh"
/*** The following are only used in dosubst.c ***/
#ifdef L_IN_DOSUBST
/* Ago and from now */
#define L_AGO "síðan"
#define L_FROMNOW "frá því nú"
#define L_AGO "síðan"
#define L_FROMNOW "frá því nú"
/* "in %d days' time" */
#define L_INXDAYS "eftir %d daga"
/* "on" as in "on date..." */
#define L_ON "þann"
#define L_ON "þann"
/* Pluralizing - this is a problem for many languages and may require
a more drastic fix */
#define L_PLURAL "a"
/* Minutes, hours, at, etc */
#define L_NOW "núna"
#define L_NOW "núna"
#define L_AT "kl."
#define L_MINUTE "mínútu"
#define L_MINUTE "mínútu"
#define L_HOUR "klukkustund"
#define L_IS "er"
#define L_WAS "var"
@@ -79,5 +76,3 @@
/* Define any overrides here, such as L_ORDINAL_OVERRIDE, L_A_OVER, etc.
See the file dosubst.c for more info. */
#endif /* L_IN_DOSUBST */

View File

@@ -7,7 +7,7 @@
/* This file is part of REMIND. */
/* It is Copyright (C) 1996 by Valerio Aimale */
/* */
/* Remind is copyright (C) 1992-2021 by Dianne Skoll */
/* Remind is copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -49,9 +49,6 @@
#define L_AM "am"
#define L_PM "pm"
/*** The following are only used in dosubst.c ***/
#ifdef L_IN_DOSUBST
/* Ago and from now */
#define L_AGO "fa"
#define L_FROMNOW "da oggi"
@@ -114,6 +111,3 @@
#define L_V_OVER sprintf(s, "%s, %d %s", DayName[jul%7], d, \
MonthName[m]);
#endif /* L_IN_DOSUBST */

View File

@@ -6,7 +6,7 @@
/* */
/* This file is part of REMIND. */
/* This file is Copyright (C) 1993 by Trygve Randen. */
/* Remind is Copyright (C) 1992-2021 by Dianne Skoll */
/* Remind is Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -47,9 +47,6 @@
#define L_AM "am"
#define L_PM "pm"
/*** The following are only used in dosubst.c ***/
#ifdef L_IN_DOSUBST
/* Ago and from now */
#define L_AGO "siden"
#define L_FROMNOW "fra nå"
@@ -84,6 +81,3 @@
#define L_G_OVER if (altmode == '*') { sprintf(s, "%s, den %d. %s", DayName[jul%7], d, MonthName[m]); } else { sprintf(s, "%s %s, den %d. %s", L_ON, DayName[jul%7], d, MonthName[m]); }
#define L_U_OVER L_A_OVER
#define L_V_OVER L_G_OVER
#endif /* L_IN_DOSUBST */

View File

@@ -9,7 +9,7 @@
/* Polish. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -50,9 +50,6 @@
#define L_AM "am"
#define L_PM "pm"
/*** The following are only used in dosubst.c ***/
#ifdef L_IN_DOSUBST
/* Ago and from now */
#define L_AGO "temu"
#define L_FROMNOW "od teraz"
@@ -75,13 +72,17 @@
# define L_IS "będzie"
# define L_WAS "było"
#define L_AND "i"
#define L_HPLU ""
#define L_MPLU ""
/* What to add to make "hour" or "minute" plural */
#define L_NPLU( N ) ((N == 1) ? "ę" : ((N==12) || (N==13) || (N==14)) ? "" : \
((N%10==2) || (N%10==3) || (N%10==4)) ? "y" : "" )
/* What to add to make "hour" plural */
#define L_HPLU L_NPLU( hdiff )
#define L_HPLU_OVER hplu = L_NPLU( hdiff );
/* What to add to make "minute" plural */
#define L_MPLU L_NPLU( mdiff )
#define L_MPLU_OVER mplu = L_NPLU( mdiff );
/* Define any overrides here, such as L_ORDINAL_OVERRIDE, L_A_OVER, etc.
See the file dosubst.c for more info. */
@@ -99,32 +100,30 @@ ampm = (hour<12) ? \
#define L_U_OVER L_A_OVER
#define L_V_OVER L_G_OVER
#endif /* L_IN_DOSUBST */
#define L_0_OVER sprintf(s, L_HPLU);
#define L_9_OVER sprintf(s, L_MPLU);
#define L_0_OVER sprintf(s, L_NPLU(hdiff));
#define L_9_OVER sprintf(s, L_NPLU(mdiff));
#define L_1_OVER \
if (tdiff == 0) \
sprintf(s, L_NOW); \
else if (tdiff > 0) \
{ \
if (hdiff == 0) \
sprintf(s, "za %d %s%s", mdiff, L_MINUTE, L_MPLU); \
sprintf(s, "za %d %s%s", mdiff, L_MINUTE, L_NPLU(mdiff)); \
else if (mdiff == 0) \
sprintf(s, "za %d %s%s", hdiff, L_HOUR, L_HPLU); \
sprintf(s, "za %d %s%s", hdiff, L_HOUR, L_NPLU(hdiff)); \
else \
sprintf(s, "za %d %s%s %s %d %s%s", hdiff, L_HOUR, L_HPLU, \
L_AND, mdiff, L_MINUTE, L_MPLU); \
sprintf(s, "za %d %s%s %s %d %s%s", hdiff, L_HOUR, L_NPLU(hdiff), \
L_AND, mdiff, L_MINUTE, L_NPLU(mdiff)); \
} \
else \
{ \
if (hdiff == 0) \
sprintf(s, "%d %s%s temu", mdiff, L_MINUTE, L_MPLU); \
sprintf(s, "%d %s%s temu", mdiff, L_MINUTE, L_NPLU(mdiff)); \
else if (mdiff == 0) \
sprintf(s, "%d %s%s temu", hdiff, L_HOUR, L_HPLU); \
sprintf(s, "%d %s%s temu", hdiff, L_HOUR, L_NPLU(hdiff)); \
else \
sprintf(s, "%d %s%s %s %d %s%s temu", hdiff, L_HOUR, L_HPLU, \
L_AND, mdiff, L_MINUTE, L_MPLU); \
sprintf(s, "%d %s%s %s %d %s%s temu", hdiff, L_HOUR, L_NPLU(hdiff), \
L_AND, mdiff, L_MINUTE, L_NPLU(mdiff)); \
}
/* The next ones are used only when MK_GLOBALS is set */
@@ -244,7 +243,7 @@ EXTERN char *ErrMsg[] =
#define L_USAGE_OVERRIDE 1
void Usage(void)
{
fprintf(ErrFp, "\nREMIND %s (%s version) Copyright 1992-2021 Dianne Skoll\n", VERSION, L_LANGNAME);
fprintf(ErrFp, "\nREMIND %s (%s version) Copyright 1992-2022 Dianne Skoll\n", VERSION, L_LANGNAME);
#ifdef BETA
fprintf(ErrFp, ">>>> BETA VERSION <<<<\n");
#endif

View File

@@ -8,7 +8,7 @@
/* */
/* This file is part of REMIND. */
/* */
/* REMIND is Copyright (C) 1992-2021 by Dianne Skoll */
/* REMIND is Copyright (C) 1992-2022 by Dianne Skoll */
/* This file is Copyright (C) 1996 by Marco Paganini and */
/* Dianne Skoll. */
/* */
@@ -51,9 +51,6 @@
#define L_AM "am"
#define L_PM "pm"
/*** The following are only used in dosubst.c ***/
#ifdef L_IN_DOSUBST
/* Ago and from now */
#define L_AGO "atras"
#define L_FROMNOW "adiante"
@@ -138,8 +135,6 @@
} \
}
#endif /* L_IN_DOSUBST */
/* The next ones are used only when MK_GLOBALS is set */
#ifdef MK_GLOBALS
#define L_ERR_OVERRIDE 1
@@ -257,7 +252,7 @@ EXTERN char *ErrMsg[] =
#define L_USAGE_OVERRIDE 1
void Usage(void)
{
fprintf(ErrFp, "\nREMIND %s (versao %s) (C) 1992-2021 Dianne Skoll\n", VERSION, L_LANGNAME);
fprintf(ErrFp, "\nREMIND %s (versao %s) (C) 1992-2022 Dianne Skoll\n", VERSION, L_LANGNAME);
#ifdef BETA
fprintf(ErrFp, ">>>> VERSAO BETA <<<<\n");
#endif

View File

@@ -8,7 +8,7 @@
/* */
/* This file is part of REMIND. */
/* */
/* REMIND is Copyright (C) 1992-2021 by Dianne Skoll */
/* REMIND is Copyright (C) 1992-2022 by Dianne Skoll */
/* This file is Copyright (C) 1996-1998 by Liviu Daia */
/* */
/***************************************************************/
@@ -50,9 +50,6 @@
#define L_AM "am"
#define L_PM "pm"
#ifdef L_IN_DOSUBST
/*** The following are only used in dosubst.c ***/
/* Ago and from now */
#define L_AGO "acum"
#define L_FROMNOW "peste"
@@ -76,6 +73,7 @@
#define L_WAS "a fost"
/* What to add to make "minute" plural */
#define L_MPLU "e"
#define L_HPLU "e"
/* What to add to make "hour" plural */
#define L_HPLU_OVER hplu = (hdiff == 1 ? "ă" : "e");
@@ -104,5 +102,3 @@
else \
sprintf(s, "%s %d %s%s %s %d %s%s", when, hdiff, \
L_HOUR, hplu, L_AND, mdiff, L_MINUTE, mplu);
#endif /* L_IN_DOSUBST */

View File

@@ -7,7 +7,7 @@
/* Author: Rafa Couto <rafacouto@biogate.com> */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -47,9 +47,6 @@
#define L_AM "am"
#define L_PM "pm"
/*** The following are only used in dosubst.c ***/
#ifdef L_IN_DOSUBST
/* Hace y desde hoy */
#define L_AGO "hace"
#define L_FROMNOW "desde hoy"
@@ -74,5 +71,3 @@
#define L_HPLU "s"
#define L_MPLU "s"
#endif /* L_IN_DOSUBST */

View File

@@ -6,7 +6,7 @@
/* routines, etc. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -605,13 +605,23 @@ void Eprint(char const *fmt, ...)
if (FreshLine && FileName) {
FreshLine = 0;
if (strcmp(FileName, "-"))
if (strcmp(FileName, "-")) {
(void) fprintf(ErrFp, "%s(%d): ", FileName, LineNo);
else
if (print_callstack(ErrFp)) {
(void) fprintf(ErrFp, ": ");
}
} else {
(void) fprintf(ErrFp, "-stdin-(%d): ", LineNo);
if (print_callstack(ErrFp)) {
(void) fprintf(ErrFp, ": ");
}
}
if (DebugFlag & DB_PRTLINE) OutputLine(ErrFp);
} else if (FileName) {
fprintf(ErrFp, " ");
if (print_callstack(ErrFp)) {
(void) fprintf(ErrFp, ": ");
}
}
va_start(argptr, fmt);
@@ -1135,8 +1145,8 @@ int DoErrMsg(ParsePtr p)
/* The array FoldArray[2][7] contains sample years which begin
on the specified weekday. For example, FoldArray[0][2] is a
non-leapyear beginning on Wednesday, and FoldArray[1][5] is a
leapyear beginning on Saturday. Used to fold back dates which
non-leap year beginning on Wednesday, and FoldArray[1][5] is a
leap year beginning on Saturday. Used to fold back dates which
are too high for the standard Unix representation.
NOTE: This implies that you cannot set BASE > 2001!!!!! */
static int FoldArray[2][7] = {

View File

@@ -5,7 +5,7 @@
/* Calculations for figuring out moon phases. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/

View File

@@ -6,7 +6,7 @@
/* the data structures for OMITted dates. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/

View File

@@ -5,7 +5,7 @@
/* Function Prototypes. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -170,3 +170,9 @@ void set_components_from_lat_and_long(void);
char const *get_day_name(int wkday);
char const *get_month_name(int mon);
int push_call(char const *filename, char const *func, int lineno);
void clear_callstack(void);
int have_callstack(void);
int print_callstack(FILE *fp);
void pop_call(void);

View File

@@ -5,7 +5,7 @@
/* Queue up reminders for subsequent execution. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -230,7 +230,7 @@ void HandleQueuedReminders(void)
/* Do NOT trigger the reminder if tt.nexttime is more than a
minute in the past. This can happen if the clock is
changed or a laptop awakes from hibernation.
However, DO triger if tt.nexttime == tt.ttime so all
However, DO trigger if tt.nexttime == tt.ttime so all
queued reminders are triggered at least once. */
if ((SystemTime(1) - (q->tt.nexttime * 60) <= 60) ||
(q->tt.nexttime == q->tt.ttime)) {

View File

@@ -5,7 +5,7 @@
/* Print a PostScript calendar. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -349,7 +349,7 @@ int main(int argc, char *argv[])
!strcmp(DBufValue(&buf), PSBEGIN2)) {
if (!validfile) {
if (Verbose) {
fprintf(stderr, "Rem2PS: Version %s Copyright 1992-2021 by Dianne Skoll\n\n", VERSION);
fprintf(stderr, "Rem2PS: Version %s Copyright 1992-2022 by Dianne Skoll\n\n", VERSION);
fprintf(stderr, "Generating PostScript calendar\n");
}
}

View File

@@ -5,7 +5,7 @@
/* Define the PostScript prologue */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -13,7 +13,7 @@ char *PSProlog1[] =
{
"% This file was produced by Remind and Rem2PS, written by",
"% Dianne Skoll.",
"% Remind and Rem2PS are Copyright 1992-2021 Dianne Skoll.",
"% Remind and Rem2PS are Copyright 1992-2022 Dianne Skoll.",
"/ISOLatin1Encoding where { pop save true }{ false } ifelse",
" /ISOLatin1Encoding [ StandardEncoding 0 45 getinterval aload pop /minus",
" StandardEncoding 46 98 getinterval aload pop /dotlessi /grave /acute",

View File

@@ -5,7 +5,7 @@
/* Routines for sorting reminders by trigger date */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/

View File

@@ -4,9 +4,23 @@
ALL=`grep ^#define lang.h | grep -v '#define LANG' | awk '{print $2}'`
OUTPUT_COMPILED=lang-compiled.out
OUTPUT_RUNTIME=lang-runtime.out
cat /dev/null > $OUTPUT_COMPILED
cat /dev/null > $OUTPUT_RUNTIME
for i in $ALL ; do
make clean
make -j`nproc` all LANGDEF=-DLANG=$i || exit 1
./remind -q -r ../tests/tstlang.rem
./remind -q -r ../tests/tstlang.rem >> $OUTPUT_COMPILED 2>&1
done
# Rebuild English version
make clean
make -j`nproc` all || exit 1
ALL=`ls ../include/lang/*.rem`
for i in $ALL; do
./remind -q -r "-ii=\"$i\"" ../tests/tstlang.rem >> $OUTPUT_RUNTIME 2>&1
done
exit 0

View File

@@ -6,7 +6,7 @@
/* classifying the tokens parsed. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -155,10 +155,6 @@ void FindToken(char const *s, Token *tok)
int top, bot, mid, r, max;
int l;
#if LANG != ENGLISH
size_t i;
#endif
tok->type = T_Illegal;
if (! *s) {
tok->type = T_Empty;

View File

@@ -5,7 +5,7 @@
/* Routines for figuring out the trigger date of a reminder */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/

View File

@@ -5,7 +5,7 @@
/* Type definitions all dumped here. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/

View File

@@ -6,7 +6,7 @@
/* functions. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -32,6 +32,8 @@ typedef struct udf_struct {
Var *locals;
char IsActive;
int nargs;
char const *filename;
int lineno;
} UserFunc;
/* The hash table */
@@ -93,6 +95,11 @@ int DoFset(ParsePtr p)
DBufFree(&buf);
return E_NO_MEM;
}
func->filename = StrDup(FileName);
if (!func->filename) {
return E_NO_MEM;
}
func->lineno = LineNo;
StrnCpy(func->name, DBufValue(&buf), VAR_NAME_LEN);
DBufFree(&buf);
if (!Hush) {
@@ -196,6 +203,9 @@ static void DestroyUserFunc(UserFunc *f)
/* Free the function definition */
if (f->text) free( (char *) f->text);
/* Free the filename */
if (f->filename) free( (char *) f->filename);
/* Free the data structure itself */
free(f);
}
@@ -306,7 +316,11 @@ int CallUserFunc(char const *name, int nargs, ParsePtr p)
/* Skip the opening bracket, if there's one */
while (isempty(*s)) s++;
if (*s == BEG_OF_EXPR) s++;
push_call(f->filename, f->name, f->lineno);
h = Evaluate(&s, f->locals, p);
if (h == OK) {
pop_call();
}
f->IsActive = 0;
DestroyLocalVals(f);
if (DebugFlag &DB_PRTEXPR) {

View File

@@ -5,7 +5,7 @@
/* Useful utility functions. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -130,24 +130,33 @@ int DateOK(int y, int m, int d)
/* Functions designed to defeat gcc optimizer */
int _private_div(int a, int b) { return a/b; }
int _private_add_overflow(int result, int b, int old)
int _private_mul_overflow(int a, int b)
{
if (b > 0 && result < old) return 1;
if (b < 0 && result > old) return 1;
return 0;
}
int _private_sub_overflow(int result, int b, int old)
{
if (b < 0 && result < old) return 1;
if (b > 0 && result > old) return 1;
double aa = (double) a;
double bb = (double) b;
if (aa*bb > (double) INT_MAX || aa*bb < (double) INT_MIN) {
return 1;
}
return 0;
}
int _private_unminus_overflow(int a, int b)
int _private_add_overflow(int a, int b)
{
if (a > 0 && b > 0) return 1;
if (a < 0 && b < 0) return 1;
double aa = (double) a;
double bb = (double) b;
if (aa+bb < (double) INT_MIN) return 1;
if (aa+bb > (double) INT_MAX) return 1;
return 0;
}
int _private_sub_overflow(int a, int b)
{
double aa = (double) a;
double bb = (double) b;
if (aa-bb < (double) INT_MIN) return 1;
if (aa-bb > (double) INT_MAX) return 1;
return 0;
}
@@ -162,3 +171,90 @@ ShellEscape(char const *in, DynamicBuffer *out)
}
return OK;
}
/* Call-stack for printing errors from user-defined functions */
typedef struct cs_s {
struct cs_s *next;
char const *filename;
char const *func;
int lineno;
} cs;
static cs *callstack = NULL;
static void
destroy_cs(cs *entry)
{
if (entry->filename) free( (void *) entry->filename);
if (entry->func) free( (void *) entry->func);
free( (void *) entry);
}
int
push_call(char const *filename, char const *func, int lineno)
{
cs *entry = NEW(cs);
if (!entry) {
return E_NO_MEM;
}
entry->next = NULL;
entry->filename = StrDup(filename);
entry->func = StrDup(func);
entry->lineno = lineno;
if (!entry->filename || !entry->func) {
destroy_cs(entry);
return E_NO_MEM;
}
entry->next = callstack;
callstack = entry;
return OK;
}
void
clear_callstack(void)
{
cs *entry = callstack;
cs *next;
while(entry) {
next = entry->next;
destroy_cs(entry);
entry = next;
}
callstack = NULL;
}
int
have_callstack(void)
{
if (callstack) return 1;
return 0;
}
static void
print_callstack_aux(FILE *fp, cs *entry)
{
if (entry) {
print_callstack_aux(fp, entry->next);
fprintf(fp, "\n");
(void) fprintf(fp, "%s(%d): In function `%s'", entry->filename, entry->lineno, entry->func);
}
}
int
print_callstack(FILE *fp)
{
print_callstack_aux(fp, callstack);
if (callstack) return 1;
return 0;
}
void
pop_call(void)
{
cs *entry = callstack;
if (entry) {
callstack = entry->next;
destroy_cs(entry);
}
}

View File

@@ -6,7 +6,7 @@
/* user- and system-defined variables. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-2021 by Dianne Skoll */
/* Copyright (C) 1992-2022 by Dianne Skoll */
/* */
/***************************************************************/
@@ -19,12 +19,12 @@
#include <stdlib.h>
#include <limits.h>
#include <errno.h>
#include <locale.h>
#include "types.h"
#include "expr.h"
#include "globals.h"
#include "protos.h"
#include "err.h"
#define UPPER(c) (islower(c) ? toupper(c) : c)
/* The variable hash table */
@@ -40,6 +40,36 @@ static Var *VHashTbl[VAR_HASH_SIZE];
typedef int (*SysVarFunc)(int, Value *);
static double
strtod_in_c_locale(char const *str, char **endptr)
{
/* Get current locale */
char const *loc = setlocale(LC_NUMERIC, NULL);
double x;
/* If it failed, punt */
if (!loc) {
return strtod(str, endptr);
}
/* Set locale to C */
setlocale(LC_NUMERIC, "C");
x = strtod(str, endptr);
/* Back to original locale */
setlocale(LC_NUMERIC, loc);
/* If we got an error, try in original locale, but issue a warning */
if (**endptr) {
x = strtod(str, endptr);
if (!**endptr) {
Wprint("Accepting \"%s\" for $Latitude/$Longitude, but you should use the \"C\" locale decimal separator \".\" instead", str);
}
}
return x;
}
static void deprecated_var(char const *var, char const *instead)
{
if (DebugFlag & DB_PRTLINE) {
@@ -96,9 +126,16 @@ static int latitude_longitude_func(int do_set, Value *val, double *var, double m
char buf[64];
double x;
char *endptr;
char const *loc = setlocale(LC_NUMERIC, NULL);
if (!do_set) {
if (loc) {
setlocale(LC_NUMERIC, "C");
}
snprintf(buf, sizeof(buf), "%f", *var);
if (loc) {
setlocale(LC_NUMERIC, loc);
}
val->v.str = malloc(strlen(buf)+1);
if (!val->v.str) return E_NO_MEM;
strcpy(val->v.str, buf);
@@ -109,9 +146,7 @@ static int latitude_longitude_func(int do_set, Value *val, double *var, double m
x = (double) val->v.val;
} else {
if (val->type != STR_TYPE) return E_BAD_TYPE;
errno = 0;
x = strtod(val->v.str, &endptr);
if (errno) return E_BAD_TYPE;
x = strtod_in_c_locale(val->v.str, &endptr);
if (*endptr) return E_BAD_TYPE;
}
if (x < min) return E_2LOW;
@@ -740,7 +775,11 @@ typedef struct {
/* All of the system variables sorted alphabetically */
static SysVar SysVarArr[] = {
/* name mod type value min/mal max validate*/
{"Ago", 1, STR_TYPE, &DynamicAgo, 0, 0, NULL },
{"Am", 1, STR_TYPE, &DynamicAm, 0, 0, NULL },
{"And", 1, STR_TYPE, &DynamicAnd, 0, 0, NULL },
{"April", 1, STR_TYPE, &DynamicMonthName[3], 0, 0, NULL },
{"At", 1, STR_TYPE, &DynamicAt, 0, 0, NULL },
{"August", 1, STR_TYPE, &DynamicMonthName[7], 0, 0, NULL },
{"CalcUTC", 1, INT_TYPE, &CalculateUTC, 0, 1, NULL },
{"CalMode", 0, INT_TYPE, &DoCalendar, 0, 0, NULL },
@@ -762,11 +801,15 @@ static SysVar SysVarArr[] = {
{"FoldYear", 1, INT_TYPE, &FoldYear, 0, 1, NULL },
{"FormWidth", 1, INT_TYPE, &FormWidth, 20, 500, NULL },
{"Friday", 1, STR_TYPE, &DynamicDayName[4], 0, 0, NULL },
{"Fromnow", 1, STR_TYPE, &DynamicFromnow, 0, 0, NULL },
{"Hour", 1, STR_TYPE, &DynamicHour, 0, 0, NULL },
{"Hplu", 1, STR_TYPE, &DynamicHplu, 0, 0, NULL },
{"HushMode", 0, INT_TYPE, &Hush, 0, 0, NULL },
{"IgnoreOnce", 0, INT_TYPE, &IgnoreOnce, 0, 0, NULL },
{"InfDelta", 0, INT_TYPE, &InfiniteDelta, 0, 0, NULL },
{"IntMax", 0, INT_TYPE, &IntMax, 0, 0, NULL },
{"IntMin", 0, INT_TYPE, &IntMin, 0, 0, NULL },
{"Is", 1, STR_TYPE, &DynamicIs, 0, 0, NULL },
{"January", 1, STR_TYPE, &DynamicMonthName[0], 0, 0, NULL },
{"July", 1, STR_TYPE, &DynamicMonthName[6], 0, 0, NULL },
{"June", 1, STR_TYPE, &DynamicMonthName[5], 0, 0, NULL },
@@ -784,12 +827,17 @@ static SysVar SysVarArr[] = {
{"MaxStringLen", 1, INT_TYPE, &MaxStringLen, -1, ANY, NULL },
{"May", 1, STR_TYPE, &DynamicMonthName[4], 0, 0, NULL },
{"MinsFromUTC", 1, INT_TYPE, &MinsFromUTC, -780, 780, NULL },
{"Minute", 1, STR_TYPE, &DynamicMinute, 0, 0, NULL },
{"Monday", 1, STR_TYPE, &DynamicDayName[0], 0, 0, NULL },
{"Mplu", 1, STR_TYPE, &DynamicMplu, 0, 0, NULL },
{"NextMode", 0, INT_TYPE, &NextMode, 0, 0, NULL },
{"November", 1, STR_TYPE, &DynamicMonthName[10],0, 0, NULL },
{"Now", 1, STR_TYPE, &DynamicNow, 0, 0, NULL },
{"NumQueued", 0, INT_TYPE, &NumQueued, 0, 0, NULL },
{"NumTrig", 0, INT_TYPE, &NumTriggered, 0, 0, NULL },
{"October", 1, STR_TYPE, &DynamicMonthName[9], 0, 0, NULL },
{"On", 1, STR_TYPE, &DynamicOn, 0, 0, NULL },
{"Pm", 1, STR_TYPE, &DynamicPm, 0, 0, NULL },
{"PrefixLineNo", 0, INT_TYPE, &DoPrefixLineNo, 0, 0, NULL },
{"PSCal", 0, INT_TYPE, &PsCal, 0, 0, NULL },
{"RunOff", 0, INT_TYPE, &RunDisabled, 0, 0, NULL },
@@ -801,11 +849,14 @@ 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 },
{"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 },
{"Thursday", 1, STR_TYPE, &DynamicDayName[3], 0, 0, NULL },
{"TimeSep", 1, SPECIAL_TYPE, time_sep_func, 0, 0, NULL },
{"Tm", 0, SPECIAL_TYPE, trig_mon_func, 0, 0, NULL },
{"Today", 1, STR_TYPE, &DynamicToday, 0, 0, NULL },
{"Tomorrow", 1, STR_TYPE, &DynamicTomorrow, 0, 0, NULL },
{"Tuesday", 1, STR_TYPE, &DynamicDayName[1], 0, 0, NULL },
{"Tw", 0, SPECIAL_TYPE, trig_wday_func, 0, 0, NULL },
{"Ty", 0, SPECIAL_TYPE, trig_year_func, 0, 0, NULL },
@@ -815,6 +866,7 @@ static SysVar SysVarArr[] = {
{"UntimedFirst", 0, INT_TYPE, &UntimedBeforeTimed, 0, 0, NULL },
{"Uw", 0, SPECIAL_TYPE, today_wday_func, 0, 0, NULL },
{"Uy", 0, SPECIAL_TYPE, today_year_func, 0, 0, NULL },
{"Was", 1, STR_TYPE, &DynamicWas, 0, 0, NULL },
{"Wednesday", 1, STR_TYPE, &DynamicDayName[2], 0, 0, NULL }
};

View File

@@ -7,7 +7,7 @@
# in the build directory.
#
# This file is part of REMIND.
# Copyright (C) 1992-2021 Dianne Skoll
# Copyright (C) 1992-2022 Dianne Skoll
# ---------------------------------------------------------------------------
DIR=`dirname $0`
@@ -328,6 +328,8 @@ 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
# 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
if [ "$?" = "0" ]; then
echo "Remind: Acceptance test PASSED"

View File

@@ -324,7 +324,8 @@ x => 30
y => "Heshvan"
z => 1991-02-16
a => 5761
hebdate(30, "Heshvan", 1991-02-16, 5761) => ../tests/test.rem(74): 30 Heshvan 5761: Invalid Hebrew date
hebdate(30, "Heshvan", 1991-02-16, 5761) => ../tests/test.rem(74):
../tests/test.rem(71): In function `_i': 30 Heshvan 5761: Invalid Hebrew date
Invalid Hebrew date
Leaving UserFN _i() => Invalid Hebrew date
@@ -357,7 +358,8 @@ x => 30
y => "Kislev"
z => 1991-02-16
a => 5761
hebdate(30, "Kislev", 1991-02-16, 5761) => ../tests/test.rem(78): 30 Kislev 5761: Invalid Hebrew date
hebdate(30, "Kislev", 1991-02-16, 5761) => ../tests/test.rem(78):
../tests/test.rem(71): In function `_i': 30 Kislev 5761: Invalid Hebrew date
Invalid Hebrew date
Leaving UserFN _i() => Invalid Hebrew date
@@ -379,7 +381,8 @@ x => 30
y => "Adar A"
z => 1991-02-16
a => 5756
hebdate(30, "Adar A", 1991-02-16, 5756) => ../tests/test.rem(81): No Adar A in 5756
hebdate(30, "Adar A", 1991-02-16, 5756) => ../tests/test.rem(81):
../tests/test.rem(71): In function `_i': No Adar A in 5756
Invalid Hebrew date
Leaving UserFN _i() => Invalid Hebrew date
[_i(29, "Adar A", today(), 5755)] MSG Leap
@@ -400,7 +403,8 @@ x => 29
y => "Adar A"
z => 1991-02-16
a => 5756
hebdate(29, "Adar A", 1991-02-16, 5756) => ../tests/test.rem(83): No Adar A in 5756
hebdate(29, "Adar A", 1991-02-16, 5756) => ../tests/test.rem(83):
../tests/test.rem(71): In function `_i': No Adar A in 5756
Invalid Hebrew date
Leaving UserFN _i() => Invalid Hebrew date
@@ -1020,7 +1024,7 @@ set a057 value("a05"+"6")
"a05" + "6" => "a056"
value("a056") => "SDFJHSDF KSJDFH KJSDFH KSJDFH"
set a058 version()
version() => "03.04.02"
version() => "04.00.00"
set a059 wkday(today())
today() => 1991-02-16
wkday(1991-02-16) => "Saturday"
@@ -1099,7 +1103,8 @@ y => 11:33
x => "foo"
y => 11:33
"foo" * 11:33 => Type mismatch
../tests/test.rem(337): `*': Type mismatch
../tests/test.rem(337):
../tests/test.rem(334): In function `h': `*': Type mismatch
Leaving UserFN h() => Type mismatch
set a074 dosubst("%a %b %c %d %e %f %g %h", '1992/5/5')
dosubst("%a %b %c %d %e %f %g %h", 1992-05-05) => "on Tuesday, 5 May, 1992 in 444 days' tim"...
@@ -2589,7 +2594,7 @@ a086 4
a109 2012-01-01
a128 2018-02-03@16:45
a039 "February"
a058 "03.04.02"
a058 "04.00.00"
a077 "1992 92
"
a096 -4
@@ -2686,7 +2691,11 @@ a125 -1
dump $
Variable Value
$Ago "ago"
$Am "am"
$And "and"
$April "April"
$At "at"
$August "August"
$CalcUTC 0 [0, 1]
$CalMode 0
@@ -2708,11 +2717,15 @@ Variable Value
$FoldYear 0 [0, 1]
$FormWidth 72 [20, 500]
$Friday "Friday"
$Fromnow "from now"
$Hour "hour"
$Hplu "s"
$HushMode 0
$IgnoreOnce 1
$InfDelta 0
$IntMax 2147483647
$IntMin -2147483648
$Is "is"
$January "January"
$July "July"
$June "June"
@@ -2730,12 +2743,17 @@ Variable Value
$MaxStringLen 65535 [-1, Inf)
$May "May"
$MinsFromUTC -300 [-780, 780]
$Minute "minute"
$Monday "Monday"
$Mplu "s"
$NextMode 0
$November "November"
$Now "now"
$NumQueued 0
$NumTrig 37
$October "October"
$On "on"
$Pm "pm"
$PrefixLineNo 0
$PSCal 0
$RunOff 0
@@ -2752,6 +2770,8 @@ Variable Value
$Thursday "Thursday"
$TimeSep ":"
$Tm -1
$Today "today"
$Tomorrow "tomorrow"
$Tuesday "Tuesday"
$Tw -1
$Ty -1
@@ -2761,6 +2781,7 @@ Variable Value
$UntimedFirst 0
$Uw 6
$Uy 1991
$Was "was"
$Wednesday "Wednesday"
msg [$April]%
../tests/test.rem(450): Trig = Saturday, 16 February, 1991
@@ -3773,7 +3794,8 @@ trig("sun warn w") => ../tests/test.rem(740): Trig = Sunday, 17 February, 1991
Entering UserFN w(1)
x => 1
1 / 0 => Division by zero
../tests/test.rem(740): `/': Division by zero
../tests/test.rem(740):
../tests/test.rem(739): In function `w': `/': Division by zero
Leaving UserFN w() => Division by zero
1990-01-01
trig("thu warn w") => ../tests/test.rem(740): Trig = Thursday, 21 February, 1991
@@ -3902,6 +3924,24 @@ REM Lastday April 2022 OMIT SAT SUN MSG foo
REM Lastworkday April 2022 OMIT SAT SUN MSG foo
../tests/test.rem(791): Trig = Friday, 29 April, 2022
SET a pad(1, "0", 2)
pad(1, "0", 2) => "01"
set a pad(1, "0", 2, 1)
pad(1, "0", 2, 1) => "10"
set a pad("foo", "quux", 14)
pad("foo", "quux", 14) => "quuxquuxquufoo"
set a pad("foo", "quux", 14, 1)
pad("foo", "quux", 14, 1) => "fooquuxquuxquu"
set a pad(11:33, " ", 12)
pad(11:33, " ", 12) => " 11:33"
set a pad(11:33, " ", 12, 1)
pad(11:33, " ", 12, 1) => "11:33 "
set a pad("foo", "0", $MaxStringLen+1)
$MaxStringLen => 65535
65535 + 1 => 65536
pad("foo", "0", 65536) => String too long
../tests/test.rem(799): String too long
# Don't want Remind to queue reminders
EXIT
@@ -5399,7 +5439,7 @@ No reminders.
<< /PageSize [612 792] >> setpagedevice
% This file was produced by Remind and Rem2PS, written by
% Dianne Skoll.
% Remind and Rem2PS are Copyright 1992-2021 Dianne Skoll.
% Remind and Rem2PS are Copyright 1992-2022 Dianne Skoll.
/ISOLatin1Encoding where { pop save true }{ false } ifelse
/ISOLatin1Encoding [ StandardEncoding 0 45 getinterval aload pop /minus
StandardEncoding 46 98 getinterval aload pop /dotlessi /grave /acute
@@ -6503,7 +6543,7 @@ showpage
<< /PageSize [612 792] >> setpagedevice
% This file was produced by Remind and Rem2PS, written by
% Dianne Skoll.
% Remind and Rem2PS are Copyright 1992-2021 Dianne Skoll.
% Remind and Rem2PS are Copyright 1992-2022 Dianne Skoll.
/ISOLatin1Encoding where { pop save true }{ false } ifelse
/ISOLatin1Encoding [ StandardEncoding 0 45 getinterval aload pop /minus
StandardEncoding 46 98 getinterval aload pop /dotlessi /grave /acute
@@ -7977,4 +8017,4 @@ February 29
| | | | | | | |
| | | | | | | |
+----------+----------+----------+----------+----------+----------+----------+

View File

@@ -790,6 +790,14 @@ REM Jan 2001 ~~1 MSG y
REM Lastday April 2022 OMIT SAT SUN MSG foo
REM Lastworkday April 2022 OMIT SAT SUN MSG foo
SET a pad(1, "0", 2)
set a pad(1, "0", 2, 1)
set a pad("foo", "quux", 14)
set a pad("foo", "quux", 14, 1)
set a pad(11:33, " ", 12)
set a pad(11:33, " ", 12, 1)
set a pad("foo", "0", $MaxStringLen+1)
# Don't want Remind to queue reminders
EXIT

View File

@@ -11,7 +11,7 @@
# Use the output to verify your translations.
#
# This file is part of REMIND.
# Copyright (C) 1992-2018 Dianne Skoll
# Copyright (C) 1992-2022 Dianne Skoll
#
# ---------------------------------------------------------------------------
@@ -28,18 +28,186 @@ if !$RunOff || !$DontQueue || $DontTrigAts
exit
endif
# Include a language file, if that's given as "-ii=/path"
if defined("i")
do [i]
# msg INCLUDING [i]
endif
# Set up a few useful definitions
fset show(x) "%%" + x + " yields: " + char(34) + "%" + x + char(34) + "% and %%*" + x + " yields: " + char(34) + "%*" + x + char(34) + "%"
set a trigger(today()+2) + " ++2"
set l language()
set tt now()+134
set tu now()-134
set ut now()+60
set uu now()-60
set vt now()+120
set vu now()-120
set wt now()-1
set wu now()+1
set xt now()-2
set xu now()+2
set d a + " at " + tt
set e a + " at " + tu
set f a + " at " + ut
set g a + " at " + uu
set h a + " at " + wt
set j a + " at " + wu
set k a + " at " + xt
set m a + " at " + xu
set n a + " at " + vt
set p a + " at " + vu
msg The above is the default banner for the [l] language.
set a trigger(today()+7) + " ++7"
msg %_%_The following are the 7-day-in-advance substitutions:%
[a] msg [show("a")]
[a] msg [show("b")]
[a] msg [show("c")]
[a] msg [show("d")]
[a] msg [show("e")]
[a] msg [show("f")]
[a] msg [show("g")]
[a] msg [show("h")]
[a] msg [show("i")]
[a] msg [show("j")]
[a] msg [show("k")]
[a] msg [show("l")]
[a] msg [show("m")]
[a] msg [show("n")]
[a] msg [show("o")]
[a] msg [show("p")]
[a] msg [show("q")]
[a] msg [show("r")]
[a] msg [show("s")]
[a] msg [show("t")]
[a] msg [show("u")]
[a] msg [show("v")]
[a] msg [show("w")]
[a] msg [show("x")]
[a] msg [show("y")]
[a] msg [show("z")]
msg The following are the two-day-in-advance substitutions:%
set a trigger(today()+6) + " ++6"
msg %_%_The following are the 6-day-in-advance substitutions:%
[a] msg [show("a")]
[a] msg [show("b")]
[a] msg [show("c")]
[a] msg [show("d")]
[a] msg [show("e")]
[a] msg [show("f")]
[a] msg [show("g")]
[a] msg [show("h")]
[a] msg [show("i")]
[a] msg [show("j")]
[a] msg [show("k")]
[a] msg [show("l")]
[a] msg [show("m")]
[a] msg [show("n")]
[a] msg [show("o")]
[a] msg [show("p")]
[a] msg [show("q")]
[a] msg [show("r")]
[a] msg [show("s")]
[a] msg [show("t")]
[a] msg [show("u")]
[a] msg [show("v")]
[a] msg [show("w")]
[a] msg [show("x")]
[a] msg [show("y")]
[a] msg [show("z")]
set a trigger(today()+5) + " ++5"
msg %_%_The following are the 5-day-in-advance substitutions:%
[a] msg [show("a")]
[a] msg [show("b")]
[a] msg [show("c")]
[a] msg [show("d")]
[a] msg [show("e")]
[a] msg [show("f")]
[a] msg [show("g")]
[a] msg [show("h")]
[a] msg [show("i")]
[a] msg [show("j")]
[a] msg [show("k")]
[a] msg [show("l")]
[a] msg [show("m")]
[a] msg [show("n")]
[a] msg [show("o")]
[a] msg [show("p")]
[a] msg [show("q")]
[a] msg [show("r")]
[a] msg [show("s")]
[a] msg [show("t")]
[a] msg [show("u")]
[a] msg [show("v")]
[a] msg [show("w")]
[a] msg [show("x")]
[a] msg [show("y")]
[a] msg [show("z")]
set a trigger(today()+4) + " ++4"
msg %_%_The following are the 4-day-in-advance substitutions:%
[a] msg [show("a")]
[a] msg [show("b")]
[a] msg [show("c")]
[a] msg [show("d")]
[a] msg [show("e")]
[a] msg [show("f")]
[a] msg [show("g")]
[a] msg [show("h")]
[a] msg [show("i")]
[a] msg [show("j")]
[a] msg [show("k")]
[a] msg [show("l")]
[a] msg [show("m")]
[a] msg [show("n")]
[a] msg [show("o")]
[a] msg [show("p")]
[a] msg [show("q")]
[a] msg [show("r")]
[a] msg [show("s")]
[a] msg [show("t")]
[a] msg [show("u")]
[a] msg [show("v")]
[a] msg [show("w")]
[a] msg [show("x")]
[a] msg [show("y")]
[a] msg [show("z")]
set a trigger(today()+3) + " ++3"
msg %_%_The following are the 3-day-in-advance substitutions:%
[a] msg [show("a")]
[a] msg [show("b")]
[a] msg [show("c")]
[a] msg [show("d")]
[a] msg [show("e")]
[a] msg [show("f")]
[a] msg [show("g")]
[a] msg [show("h")]
[a] msg [show("i")]
[a] msg [show("j")]
[a] msg [show("k")]
[a] msg [show("l")]
[a] msg [show("m")]
[a] msg [show("n")]
[a] msg [show("o")]
[a] msg [show("p")]
[a] msg [show("q")]
[a] msg [show("r")]
[a] msg [show("s")]
[a] msg [show("t")]
[a] msg [show("u")]
[a] msg [show("v")]
[a] msg [show("w")]
[a] msg [show("x")]
[a] msg [show("y")]
[a] msg [show("z")]
set a trigger(today()+2) + " ++2"
msg %_%_The following are the two-day-in-advance substitutions:%
[a] msg [show("a")]
[a] msg [show("b")]
[a] msg [show("c")]
@@ -129,50 +297,539 @@ set e a + " at " + tu
[a] msg [show("y")]
[a] msg [show("z")]
msg %_Time substititions for a time in the future:%
[d] msg [show("1")]
[d] msg [show("2")]
[d] msg [show("3")]
[d] msg [show("4")]
[d] msg [show("5")]
[d] msg [show("6")]
[d] msg [show("7")]
[d] msg [show("8")]
[d] msg [show("9")]
[d] msg [show("0")]
[d] msg [show("!")]
[d] msg [show("@")]
[d] msg [show("#")]
msg %_Time substititions for a time in the past:%
[e] msg [show("1")]
[e] msg [show("2")]
[e] msg [show("3")]
[e] msg [show("4")]
[e] msg [show("5")]
[e] msg [show("6")]
[e] msg [show("7")]
[e] msg [show("8")]
[e] msg [show("9")]
[e] msg [show("0")]
[e] msg [show("!")]
[e] msg [show("@")]
[e] msg [show("#")]
MSG %_Time substitutions for [now()] where now() = [now()]
REM AT [now()] MSG [show("1")]
REM AT [now()] MSG [show("2")]
REM AT [now()] MSG [show("3")]
REM AT [now()] MSG [show("4")]
REM AT [now()] MSG [show("5")]
REM AT [now()] MSG [show("6")]
REM AT [now()] MSG [show("7")]
REM AT [now()] MSG [show("8")]
REM AT [now()] MSG [show("9")]
REM AT [now()] MSG [show("0")]
REM AT [now()] MSG [show("!")]
REM AT [now()] MSG [show("@")]
REM AT [now()] MSG [show("#")]
MSG %_Time substitutions for [now()+134] where now() = [now()]
REM AT [now()+134] MSG [show("1")]
REM AT [now()+134] MSG [show("2")]
REM AT [now()+134] MSG [show("3")]
REM AT [now()+134] MSG [show("4")]
REM AT [now()+134] MSG [show("5")]
REM AT [now()+134] MSG [show("6")]
REM AT [now()+134] MSG [show("7")]
REM AT [now()+134] MSG [show("8")]
REM AT [now()+134] MSG [show("9")]
REM AT [now()+134] MSG [show("0")]
REM AT [now()+134] MSG [show("!")]
REM AT [now()+134] MSG [show("@")]
REM AT [now()+134] MSG [show("#")]
MSG %_Time substitutions for [now()-134] where now() = [now()]
REM AT [now()-134] MSG [show("1")]
REM AT [now()-134] MSG [show("2")]
REM AT [now()-134] MSG [show("3")]
REM AT [now()-134] MSG [show("4")]
REM AT [now()-134] MSG [show("5")]
REM AT [now()-134] MSG [show("6")]
REM AT [now()-134] MSG [show("7")]
REM AT [now()-134] MSG [show("8")]
REM AT [now()-134] MSG [show("9")]
REM AT [now()-134] MSG [show("0")]
REM AT [now()-134] MSG [show("!")]
REM AT [now()-134] MSG [show("@")]
REM AT [now()-134] MSG [show("#")]
MSG %_Time substitutions for [now()+60] where now() = [now()]
REM AT [now()+60] MSG [show("1")]
REM AT [now()+60] MSG [show("2")]
REM AT [now()+60] MSG [show("3")]
REM AT [now()+60] MSG [show("4")]
REM AT [now()+60] MSG [show("5")]
REM AT [now()+60] MSG [show("6")]
REM AT [now()+60] MSG [show("7")]
REM AT [now()+60] MSG [show("8")]
REM AT [now()+60] MSG [show("9")]
REM AT [now()+60] MSG [show("0")]
REM AT [now()+60] MSG [show("!")]
REM AT [now()+60] MSG [show("@")]
REM AT [now()+60] MSG [show("#")]
MSG %_Time substitutions for [now()-60] where now() = [now()]
REM AT [now()-60] MSG [show("1")]
REM AT [now()-60] MSG [show("2")]
REM AT [now()-60] MSG [show("3")]
REM AT [now()-60] MSG [show("4")]
REM AT [now()-60] MSG [show("5")]
REM AT [now()-60] MSG [show("6")]
REM AT [now()-60] MSG [show("7")]
REM AT [now()-60] MSG [show("8")]
REM AT [now()-60] MSG [show("9")]
REM AT [now()-60] MSG [show("0")]
REM AT [now()-60] MSG [show("!")]
REM AT [now()-60] MSG [show("@")]
REM AT [now()-60] MSG [show("#")]
MSG %_Time substitutions for [now()+120] where now() = [now()]
REM AT [now()+120] MSG [show("1")]
REM AT [now()+120] MSG [show("2")]
REM AT [now()+120] MSG [show("3")]
REM AT [now()+120] MSG [show("4")]
REM AT [now()+120] MSG [show("5")]
REM AT [now()+120] MSG [show("6")]
REM AT [now()+120] MSG [show("7")]
REM AT [now()+120] MSG [show("8")]
REM AT [now()+120] MSG [show("9")]
REM AT [now()+120] MSG [show("0")]
REM AT [now()+120] MSG [show("!")]
REM AT [now()+120] MSG [show("@")]
REM AT [now()+120] MSG [show("#")]
MSG %_Time substitutions for [now()-120] where now() = [now()]
REM AT [now()-120] MSG [show("1")]
REM AT [now()-120] MSG [show("2")]
REM AT [now()-120] MSG [show("3")]
REM AT [now()-120] MSG [show("4")]
REM AT [now()-120] MSG [show("5")]
REM AT [now()-120] MSG [show("6")]
REM AT [now()-120] MSG [show("7")]
REM AT [now()-120] MSG [show("8")]
REM AT [now()-120] MSG [show("9")]
REM AT [now()-120] MSG [show("0")]
REM AT [now()-120] MSG [show("!")]
REM AT [now()-120] MSG [show("@")]
REM AT [now()-120] MSG [show("#")]
MSG %_Time substitutions for [now()+1] where now() = [now()]
REM AT [now()+1] MSG [show("1")]
REM AT [now()+1] MSG [show("2")]
REM AT [now()+1] MSG [show("3")]
REM AT [now()+1] MSG [show("4")]
REM AT [now()+1] MSG [show("5")]
REM AT [now()+1] MSG [show("6")]
REM AT [now()+1] MSG [show("7")]
REM AT [now()+1] MSG [show("8")]
REM AT [now()+1] MSG [show("9")]
REM AT [now()+1] MSG [show("0")]
REM AT [now()+1] MSG [show("!")]
REM AT [now()+1] MSG [show("@")]
REM AT [now()+1] MSG [show("#")]
MSG %_Time substitutions for [now()-1] where now() = [now()]
REM AT [now()-1] MSG [show("1")]
REM AT [now()-1] MSG [show("2")]
REM AT [now()-1] MSG [show("3")]
REM AT [now()-1] MSG [show("4")]
REM AT [now()-1] MSG [show("5")]
REM AT [now()-1] MSG [show("6")]
REM AT [now()-1] MSG [show("7")]
REM AT [now()-1] MSG [show("8")]
REM AT [now()-1] MSG [show("9")]
REM AT [now()-1] MSG [show("0")]
REM AT [now()-1] MSG [show("!")]
REM AT [now()-1] MSG [show("@")]
REM AT [now()-1] MSG [show("#")]
MSG %_Time substitutions for [now()+2] where now() = [now()]
REM AT [now()+2] MSG [show("1")]
REM AT [now()+2] MSG [show("2")]
REM AT [now()+2] MSG [show("3")]
REM AT [now()+2] MSG [show("4")]
REM AT [now()+2] MSG [show("5")]
REM AT [now()+2] MSG [show("6")]
REM AT [now()+2] MSG [show("7")]
REM AT [now()+2] MSG [show("8")]
REM AT [now()+2] MSG [show("9")]
REM AT [now()+2] MSG [show("0")]
REM AT [now()+2] MSG [show("!")]
REM AT [now()+2] MSG [show("@")]
REM AT [now()+2] MSG [show("#")]
MSG %_Time substitutions for [now()-2] where now() = [now()]
REM AT [now()-2] MSG [show("1")]
REM AT [now()-2] MSG [show("2")]
REM AT [now()-2] MSG [show("3")]
REM AT [now()-2] MSG [show("4")]
REM AT [now()-2] MSG [show("5")]
REM AT [now()-2] MSG [show("6")]
REM AT [now()-2] MSG [show("7")]
REM AT [now()-2] MSG [show("8")]
REM AT [now()-2] MSG [show("9")]
REM AT [now()-2] MSG [show("0")]
REM AT [now()-2] MSG [show("!")]
REM AT [now()-2] MSG [show("@")]
REM AT [now()-2] MSG [show("#")]
MSG %_Time substitutions for [0:00] where now() = [now()]
REM AT [0:00] MSG [show("1")]
REM AT [0:00] MSG [show("2")]
REM AT [0:00] MSG [show("3")]
REM AT [0:00] MSG [show("4")]
REM AT [0:00] MSG [show("5")]
REM AT [0:00] MSG [show("6")]
REM AT [0:00] MSG [show("7")]
REM AT [0:00] MSG [show("8")]
REM AT [0:00] MSG [show("9")]
REM AT [0:00] MSG [show("0")]
REM AT [0:00] MSG [show("!")]
REM AT [0:00] MSG [show("@")]
REM AT [0:00] MSG [show("#")]
MSG %_Time substitutions for [1:00] where now() = [now()]
REM AT [1:00] MSG [show("1")]
REM AT [1:00] MSG [show("2")]
REM AT [1:00] MSG [show("3")]
REM AT [1:00] MSG [show("4")]
REM AT [1:00] MSG [show("5")]
REM AT [1:00] MSG [show("6")]
REM AT [1:00] MSG [show("7")]
REM AT [1:00] MSG [show("8")]
REM AT [1:00] MSG [show("9")]
REM AT [1:00] MSG [show("0")]
REM AT [1:00] MSG [show("!")]
REM AT [1:00] MSG [show("@")]
REM AT [1:00] MSG [show("#")]
MSG %_Time substitutions for [2:00] where now() = [now()]
REM AT [2:00] MSG [show("1")]
REM AT [2:00] MSG [show("2")]
REM AT [2:00] MSG [show("3")]
REM AT [2:00] MSG [show("4")]
REM AT [2:00] MSG [show("5")]
REM AT [2:00] MSG [show("6")]
REM AT [2:00] MSG [show("7")]
REM AT [2:00] MSG [show("8")]
REM AT [2:00] MSG [show("9")]
REM AT [2:00] MSG [show("0")]
REM AT [2:00] MSG [show("!")]
REM AT [2:00] MSG [show("@")]
REM AT [2:00] MSG [show("#")]
MSG %_Time substitutions for [3:00] where now() = [now()]
REM AT [3:00] MSG [show("1")]
REM AT [3:00] MSG [show("2")]
REM AT [3:00] MSG [show("3")]
REM AT [3:00] MSG [show("4")]
REM AT [3:00] MSG [show("5")]
REM AT [3:00] MSG [show("6")]
REM AT [3:00] MSG [show("7")]
REM AT [3:00] MSG [show("8")]
REM AT [3:00] MSG [show("9")]
REM AT [3:00] MSG [show("0")]
REM AT [3:00] MSG [show("!")]
REM AT [3:00] MSG [show("@")]
REM AT [3:00] MSG [show("#")]
MSG %_Time substitutions for [4:00] where now() = [now()]
REM AT [4:00] MSG [show("1")]
REM AT [4:00] MSG [show("2")]
REM AT [4:00] MSG [show("3")]
REM AT [4:00] MSG [show("4")]
REM AT [4:00] MSG [show("5")]
REM AT [4:00] MSG [show("6")]
REM AT [4:00] MSG [show("7")]
REM AT [4:00] MSG [show("8")]
REM AT [4:00] MSG [show("9")]
REM AT [4:00] MSG [show("0")]
REM AT [4:00] MSG [show("!")]
REM AT [4:00] MSG [show("@")]
REM AT [4:00] MSG [show("#")]
MSG %_Time substitutions for [5:00] where now() = [now()]
REM AT [5:00] MSG [show("1")]
REM AT [5:00] MSG [show("2")]
REM AT [5:00] MSG [show("3")]
REM AT [5:00] MSG [show("4")]
REM AT [5:00] MSG [show("5")]
REM AT [5:00] MSG [show("6")]
REM AT [5:00] MSG [show("7")]
REM AT [5:00] MSG [show("8")]
REM AT [5:00] MSG [show("9")]
REM AT [5:00] MSG [show("0")]
REM AT [5:00] MSG [show("!")]
REM AT [5:00] MSG [show("@")]
REM AT [5:00] MSG [show("#")]
MSG %_Time substitutions for [6:00] where now() = [now()]
REM AT [6:00] MSG [show("1")]
REM AT [6:00] MSG [show("2")]
REM AT [6:00] MSG [show("3")]
REM AT [6:00] MSG [show("4")]
REM AT [6:00] MSG [show("5")]
REM AT [6:00] MSG [show("6")]
REM AT [6:00] MSG [show("7")]
REM AT [6:00] MSG [show("8")]
REM AT [6:00] MSG [show("9")]
REM AT [6:00] MSG [show("0")]
REM AT [6:00] MSG [show("!")]
REM AT [6:00] MSG [show("@")]
REM AT [6:00] MSG [show("#")]
MSG %_Time substitutions for [7:00] where now() = [now()]
REM AT [7:00] MSG [show("1")]
REM AT [7:00] MSG [show("2")]
REM AT [7:00] MSG [show("3")]
REM AT [7:00] MSG [show("4")]
REM AT [7:00] MSG [show("5")]
REM AT [7:00] MSG [show("6")]
REM AT [7:00] MSG [show("7")]
REM AT [7:00] MSG [show("8")]
REM AT [7:00] MSG [show("9")]
REM AT [7:00] MSG [show("0")]
REM AT [7:00] MSG [show("!")]
REM AT [7:00] MSG [show("@")]
REM AT [7:00] MSG [show("#")]
MSG %_Time substitutions for [8:00] where now() = [now()]
REM AT [8:00] MSG [show("1")]
REM AT [8:00] MSG [show("2")]
REM AT [8:00] MSG [show("3")]
REM AT [8:00] MSG [show("4")]
REM AT [8:00] MSG [show("5")]
REM AT [8:00] MSG [show("6")]
REM AT [8:00] MSG [show("7")]
REM AT [8:00] MSG [show("8")]
REM AT [8:00] MSG [show("9")]
REM AT [8:00] MSG [show("0")]
REM AT [8:00] MSG [show("!")]
REM AT [8:00] MSG [show("@")]
REM AT [8:00] MSG [show("#")]
MSG %_Time substitutions for [9:00] where now() = [now()]
REM AT [9:00] MSG [show("1")]
REM AT [9:00] MSG [show("2")]
REM AT [9:00] MSG [show("3")]
REM AT [9:00] MSG [show("4")]
REM AT [9:00] MSG [show("5")]
REM AT [9:00] MSG [show("6")]
REM AT [9:00] MSG [show("7")]
REM AT [9:00] MSG [show("8")]
REM AT [9:00] MSG [show("9")]
REM AT [9:00] MSG [show("0")]
REM AT [9:00] MSG [show("!")]
REM AT [9:00] MSG [show("@")]
REM AT [9:00] MSG [show("#")]
MSG %_Time substitutions for [10:00] where now() = [now()]
REM AT [10:00] MSG [show("1")]
REM AT [10:00] MSG [show("2")]
REM AT [10:00] MSG [show("3")]
REM AT [10:00] MSG [show("4")]
REM AT [10:00] MSG [show("5")]
REM AT [10:00] MSG [show("6")]
REM AT [10:00] MSG [show("7")]
REM AT [10:00] MSG [show("8")]
REM AT [10:00] MSG [show("9")]
REM AT [10:00] MSG [show("0")]
REM AT [10:00] MSG [show("!")]
REM AT [10:00] MSG [show("@")]
REM AT [10:00] MSG [show("#")]
MSG %_Time substitutions for [11:00] where now() = [now()]
REM AT [11:00] MSG [show("1")]
REM AT [11:00] MSG [show("2")]
REM AT [11:00] MSG [show("3")]
REM AT [11:00] MSG [show("4")]
REM AT [11:00] MSG [show("5")]
REM AT [11:00] MSG [show("6")]
REM AT [11:00] MSG [show("7")]
REM AT [11:00] MSG [show("8")]
REM AT [11:00] MSG [show("9")]
REM AT [11:00] MSG [show("0")]
REM AT [11:00] MSG [show("!")]
REM AT [11:00] MSG [show("@")]
REM AT [11:00] MSG [show("#")]
MSG %_Time substitutions for [11:59] where now() = [now()]
REM AT [11:59] MSG [show("1")]
REM AT [11:59] MSG [show("2")]
REM AT [11:59] MSG [show("3")]
REM AT [11:59] MSG [show("4")]
REM AT [11:59] MSG [show("5")]
REM AT [11:59] MSG [show("6")]
REM AT [11:59] MSG [show("7")]
REM AT [11:59] MSG [show("8")]
REM AT [11:59] MSG [show("9")]
REM AT [11:59] MSG [show("0")]
REM AT [11:59] MSG [show("!")]
REM AT [11:59] MSG [show("@")]
REM AT [11:59] MSG [show("#")]
MSG %_Time substitutions for [12:00] where now() = [now()]
REM AT [12:00] MSG [show("1")]
REM AT [12:00] MSG [show("2")]
REM AT [12:00] MSG [show("3")]
REM AT [12:00] MSG [show("4")]
REM AT [12:00] MSG [show("5")]
REM AT [12:00] MSG [show("6")]
REM AT [12:00] MSG [show("7")]
REM AT [12:00] MSG [show("8")]
REM AT [12:00] MSG [show("9")]
REM AT [12:00] MSG [show("0")]
REM AT [12:00] MSG [show("!")]
REM AT [12:00] MSG [show("@")]
REM AT [12:00] MSG [show("#")]
MSG %_Time substitutions for [12:01] where now() = [now()]
REM AT [12:01] MSG [show("1")]
REM AT [12:01] MSG [show("2")]
REM AT [12:01] MSG [show("3")]
REM AT [12:01] MSG [show("4")]
REM AT [12:01] MSG [show("5")]
REM AT [12:01] MSG [show("6")]
REM AT [12:01] MSG [show("7")]
REM AT [12:01] MSG [show("8")]
REM AT [12:01] MSG [show("9")]
REM AT [12:01] MSG [show("0")]
REM AT [12:01] MSG [show("!")]
REM AT [12:01] MSG [show("@")]
REM AT [12:01] MSG [show("#")]
MSG %_Time substitutions for [13:00] where now() = [now()]
REM AT [13:00] MSG [show("1")]
REM AT [13:00] MSG [show("2")]
REM AT [13:00] MSG [show("3")]
REM AT [13:00] MSG [show("4")]
REM AT [13:00] MSG [show("5")]
REM AT [13:00] MSG [show("6")]
REM AT [13:00] MSG [show("7")]
REM AT [13:00] MSG [show("8")]
REM AT [13:00] MSG [show("9")]
REM AT [13:00] MSG [show("0")]
REM AT [13:00] MSG [show("!")]
REM AT [13:00] MSG [show("@")]
REM AT [13:00] MSG [show("#")]
MSG %_Time substitutions for [14:00] where now() = [now()]
REM AT [14:00] MSG [show("1")]
REM AT [14:00] MSG [show("2")]
REM AT [14:00] MSG [show("3")]
REM AT [14:00] MSG [show("4")]
REM AT [14:00] MSG [show("5")]
REM AT [14:00] MSG [show("6")]
REM AT [14:00] MSG [show("7")]
REM AT [14:00] MSG [show("8")]
REM AT [14:00] MSG [show("9")]
REM AT [14:00] MSG [show("0")]
REM AT [14:00] MSG [show("!")]
REM AT [14:00] MSG [show("@")]
REM AT [14:00] MSG [show("#")]
MSG %_Time substitutions for [15:00] where now() = [now()]
REM AT [15:00] MSG [show("1")]
REM AT [15:00] MSG [show("2")]
REM AT [15:00] MSG [show("3")]
REM AT [15:00] MSG [show("4")]
REM AT [15:00] MSG [show("5")]
REM AT [15:00] MSG [show("6")]
REM AT [15:00] MSG [show("7")]
REM AT [15:00] MSG [show("8")]
REM AT [15:00] MSG [show("9")]
REM AT [15:00] MSG [show("0")]
REM AT [15:00] MSG [show("!")]
REM AT [15:00] MSG [show("@")]
REM AT [15:00] MSG [show("#")]
MSG %_Time substitutions for [16:00] where now() = [now()]
REM AT [16:00] MSG [show("1")]
REM AT [16:00] MSG [show("2")]
REM AT [16:00] MSG [show("3")]
REM AT [16:00] MSG [show("4")]
REM AT [16:00] MSG [show("5")]
REM AT [16:00] MSG [show("6")]
REM AT [16:00] MSG [show("7")]
REM AT [16:00] MSG [show("8")]
REM AT [16:00] MSG [show("9")]
REM AT [16:00] MSG [show("0")]
REM AT [16:00] MSG [show("!")]
REM AT [16:00] MSG [show("@")]
REM AT [16:00] MSG [show("#")]
MSG %_Time substitutions for [17:00] where now() = [now()]
REM AT [17:00] MSG [show("1")]
REM AT [17:00] MSG [show("2")]
REM AT [17:00] MSG [show("3")]
REM AT [17:00] MSG [show("4")]
REM AT [17:00] MSG [show("5")]
REM AT [17:00] MSG [show("6")]
REM AT [17:00] MSG [show("7")]
REM AT [17:00] MSG [show("8")]
REM AT [17:00] MSG [show("9")]
REM AT [17:00] MSG [show("0")]
REM AT [17:00] MSG [show("!")]
REM AT [17:00] MSG [show("@")]
REM AT [17:00] MSG [show("#")]
MSG %_Time substitutions for [18:00] where now() = [now()]
REM AT [18:00] MSG [show("1")]
REM AT [18:00] MSG [show("2")]
REM AT [18:00] MSG [show("3")]
REM AT [18:00] MSG [show("4")]
REM AT [18:00] MSG [show("5")]
REM AT [18:00] MSG [show("6")]
REM AT [18:00] MSG [show("7")]
REM AT [18:00] MSG [show("8")]
REM AT [18:00] MSG [show("9")]
REM AT [18:00] MSG [show("0")]
REM AT [18:00] MSG [show("!")]
REM AT [18:00] MSG [show("@")]
REM AT [18:00] MSG [show("#")]
MSG %_Time substitutions for [19:00] where now() = [now()]
REM AT [19:00] MSG [show("1")]
REM AT [19:00] MSG [show("2")]
REM AT [19:00] MSG [show("3")]
REM AT [19:00] MSG [show("4")]
REM AT [19:00] MSG [show("5")]
REM AT [19:00] MSG [show("6")]
REM AT [19:00] MSG [show("7")]
REM AT [19:00] MSG [show("8")]
REM AT [19:00] MSG [show("9")]
REM AT [19:00] MSG [show("0")]
REM AT [19:00] MSG [show("!")]
REM AT [19:00] MSG [show("@")]
REM AT [19:00] MSG [show("#")]
MSG %_Time substitutions for [20:00] where now() = [now()]
REM AT [20:00] MSG [show("1")]
REM AT [20:00] MSG [show("2")]
REM AT [20:00] MSG [show("3")]
REM AT [20:00] MSG [show("4")]
REM AT [20:00] MSG [show("5")]
REM AT [20:00] MSG [show("6")]
REM AT [20:00] MSG [show("7")]
REM AT [20:00] MSG [show("8")]
REM AT [20:00] MSG [show("9")]
REM AT [20:00] MSG [show("0")]
REM AT [20:00] MSG [show("!")]
REM AT [20:00] MSG [show("@")]
REM AT [20:00] MSG [show("#")]
MSG %_Time substitutions for [21:00] where now() = [now()]
REM AT [21:00] MSG [show("1")]
REM AT [21:00] MSG [show("2")]
REM AT [21:00] MSG [show("3")]
REM AT [21:00] MSG [show("4")]
REM AT [21:00] MSG [show("5")]
REM AT [21:00] MSG [show("6")]
REM AT [21:00] MSG [show("7")]
REM AT [21:00] MSG [show("8")]
REM AT [21:00] MSG [show("9")]
REM AT [21:00] MSG [show("0")]
REM AT [21:00] MSG [show("!")]
REM AT [21:00] MSG [show("@")]
REM AT [21:00] MSG [show("#")]
MSG %_Time substitutions for [22:00] where now() = [now()]
REM AT [22:00] MSG [show("1")]
REM AT [22:00] MSG [show("2")]
REM AT [22:00] MSG [show("3")]
REM AT [22:00] MSG [show("4")]
REM AT [22:00] MSG [show("5")]
REM AT [22:00] MSG [show("6")]
REM AT [22:00] MSG [show("7")]
REM AT [22:00] MSG [show("8")]
REM AT [22:00] MSG [show("9")]
REM AT [22:00] MSG [show("0")]
REM AT [22:00] MSG [show("!")]
REM AT [22:00] MSG [show("@")]
REM AT [22:00] MSG [show("#")]
MSG %_Time substitutions for [23:00] where now() = [now()]
REM AT [23:00] MSG [show("1")]
REM AT [23:00] MSG [show("2")]
REM AT [23:00] MSG [show("3")]
REM AT [23:00] MSG [show("4")]
REM AT [23:00] MSG [show("5")]
REM AT [23:00] MSG [show("6")]
REM AT [23:00] MSG [show("7")]
REM AT [23:00] MSG [show("8")]
REM AT [23:00] MSG [show("9")]
REM AT [23:00] MSG [show("0")]
REM AT [23:00] MSG [show("!")]
REM AT [23:00] MSG [show("@")]
REM AT [23:00] MSG [show("#")]
MSG %_Time substitutions for [23:59] where now() = [now()]
REM AT [23:59] MSG [show("1")]
REM AT [23:59] MSG [show("2")]
REM AT [23:59] MSG [show("3")]
REM AT [23:59] MSG [show("4")]
REM AT [23:59] MSG [show("5")]
REM AT [23:59] MSG [show("6")]
REM AT [23:59] MSG [show("7")]
REM AT [23:59] MSG [show("8")]
REM AT [23:59] MSG [show("9")]
REM AT [23:59] MSG [show("0")]
REM AT [23:59] MSG [show("!")]
REM AT [23:59] MSG [show("@")]
REM AT [23:59] MSG [show("#")]
msg %_Time substititions for the current time:%
set e a + " at " + now()
[e] msg [show("1")]
[e] msg [show("2")]
[e] msg [show("3")]
[e] msg [show("4")]
[e] msg [show("5")]
[e] msg [show("6")]
[e] msg [show("7")]
[e] msg [show("8")]
[e] msg [show("9")]
[e] msg [show("0")]
[e] msg [show("!")]
[e] msg [show("@")]
[e] msg [show("#")]
msg %_The following are the days of the week:
fset showwd(x) "wkday("+x+") = " + wkday(x) + "%"

View File

@@ -10,7 +10,7 @@ it should work on any UNIX web server.
To install it, you need the Remind package, available via ftp from
https://dianne.skoll.ca/projects/remind/ You should install Remind,
setting the lattitude, longitude, location and time zone as appropriate
setting the latitude, longitude, location and time zone as appropriate
for your machine.
Once you have Remind installed, follow these steps to set up your WWW