Compare commits

..

160 Commits

Author SHA1 Message Date
David F. Skoll
93aea240d6 Updated docs. 2007-08-14 21:25:09 -04:00
David F. Skoll
7717b37c36 Updated for 3.1.0 release. 2007-08-14 21:21:52 -04:00
David F. Skoll
e1b2990fb0 Prevent possible memory leak. 2007-08-12 20:01:50 -04:00
David F. Skoll
e49194c6ee Clean up man page. 2007-08-12 19:48:52 -04:00
David F. Skoll
79ab150546 Modify "make dist" target to use git-ls-files instead of peekentry into CVS. 2007-08-12 19:15:57 -04:00
David F. Skoll
fc658d15d4 Fix typos. Document -y option. 2007-08-11 22:22:12 -04:00
David F. Skoll
76d130ef82 Add -y option to synthesize tags. 2007-08-11 22:03:48 -04:00
David F. Skoll
3e9a55fbdb Working version of e-mail if you don't close timed reminder popup. 2007-08-10 22:27:08 -04:00
David F. Skoll
b071397d46 Fix typo. 2007-08-10 22:08:02 -04:00
David F. Skoll
df0dd55635 Add code to make tkremind mail reminders if dialog not dismissed. Untested! 2007-08-10 14:15:12 -04:00
David F. Skoll
960d08fd24 Start adding feature that e-mails reminders if popup not dismissed. 2007-08-10 09:08:06 -04:00
David F. Skoll
38603916a2 Fix typo. 2007-08-08 12:07:05 -04:00
David F. Skoll
0ed1bb4017 Remove $Id$ tags. 2007-08-08 12:05:28 -04:00
David F. Skoll
b4ac0c9f6c Remove CVS $Id$ tag. 2007-08-08 11:11:18 -04:00
David F. Skoll
b136af88ad Remove $Id$ tag. 2007-08-07 10:02:18 -04:00
David F. Skoll
508b5f9aae ? 2007-08-07 10:01:22 -04:00
David F. Skoll
43dff67a60 Modify "make dist" target to use git-ls-files instead of peekentry into CVS. 2007-08-02 22:27:12 -04:00
David F. Skoll
41b850321f Fix warning about unused variables. 2007-08-02 22:17:27 -04:00
David F. Skoll
523237007b Remove CVS ident tags. 2007-08-02 22:15:58 -04:00
dfs
a3f6c5fd9c Fix range of years allowed by tkremind. 2007-07-29 03:17:58 +00:00
dfs
785cdc8726 Increase YR_RANGE from 88 to 4000. 2007-07-29 03:16:40 +00:00
dfs
cbf12b5601 Save screen real-estate. 2007-07-17 08:57:38 +00:00
dfs
1a6d59d9c0 Updated man page. 2007-07-17 01:30:10 +00:00
dfs
23ae054abb Add missing DestroyParser call. 2007-07-14 17:18:11 +00:00
dfs
b57852d3d8 Properly handle timed reminders in -sa mode. 2007-07-13 12:19:13 +00:00
dfs
c0e1be2f3a Fixed custom.h.in 2007-07-13 03:43:30 +00:00
dfs
a442a15a8d Fix typo. 2007-07-13 03:40:24 +00:00
dfs
f91bf634ad Add FROM keyword.
Make Calendar delta calculations use ShouldTriggerReminder for proper
delta calculation.
2007-07-13 03:36:15 +00:00
dfs
ce4311c3df Add support for FROM keyword (a slight variation on SCANFROM) 2007-07-12 23:36:03 +00:00
dfs
08e69cb541 Fix compile error. 2007-07-12 12:12:25 +00:00
dfs
f8e2eaed73 Suppress time on timed-reminders in "advanced" trigger in -sa mode. 2007-07-12 04:31:52 +00:00
dfs
e68a16e73d Update docs. 2007-07-12 04:27:44 +00:00
dfs
ca191fbd92 Remove ACKNOWLEDGEMENTS 2007-07-12 04:26:36 +00:00
dfs
10276826c0 Fix docs. 2007-07-12 04:25:38 +00:00
dfs
02c9129903 Added WHATSNEW 2007-07-12 03:46:29 +00:00
dfs
04e4c902bd Write wrappers for setenv/unsetenv for Solaris 9. 2007-07-12 03:29:14 +00:00
dfs
0663ae77de Fix more bugs in -sa mode. 2007-07-12 03:14:36 +00:00
dfs
0c0f5ea093 Fix bug in -sa option. 2007-07-12 03:09:44 +00:00
dfs
f450fd633e Check for setenv and unsetenv. 2007-07-09 01:55:45 +00:00
dfs
59cdd35f61 Adjust spacing for longer variable names. 2007-07-08 18:48:32 +00:00
dfs
eab67cbda4 Increase some limits. 2007-07-08 18:46:23 +00:00
dfs
b3c4a48641 In normal mode, convert SPECIAL COLOR to MSG. 2007-07-08 18:42:13 +00:00
dfs
07ac8ed341 Error-checking for out-of-range dates in tzconvert. 2007-07-08 18:32:07 +00:00
dfs
e32aa218fc Documented tzconvert. 2007-07-08 18:21:39 +00:00
dfs
09d11d36c3 Added tzconvert function. 2007-07-08 16:57:47 +00:00
dfs
629e287526 More man-page tweaks. 2007-07-05 02:05:41 +00:00
dfs
e2cd29c824 Documented built-in funcs that can take a DATETIME. 2007-07-05 02:02:01 +00:00
dfs
69e597dbe7 Kill off HAVE_PROTOS. 2007-07-03 03:42:46 +00:00
dfs
152e7ebac9 More man page updates. 2007-07-03 03:36:52 +00:00
dfs
8d4451ed85 Remove obsolete files. 2007-07-01 20:22:52 +00:00
dfs
5b8836d4b8 Make default datesep '-' in build.tk 2007-07-01 20:13:37 +00:00
dfs
be7086579e Make DateSep and TimeSep into system variables that can be changed
at runtime.
2007-07-01 20:12:15 +00:00
dfs
ab16c8f1fe More work on Remind. 2007-07-01 14:49:44 +00:00
dfs
6bb71ee5e3 In simple calendar and normal mode, treat SPECIAL COLOR the same as MSG 2007-06-29 02:11:02 +00:00
dfs
ebb4ebea97 Change trigdate, trigtime, trigdatetime to return 0 if trigger was not
valid.
2007-06-29 01:52:36 +00:00
dfs
bf97e62d56 Bump version to 3.1.0 2007-06-29 01:23:36 +00:00
dfs
47645cddb6 Added full support for DATETIME data type. 2007-06-29 01:17:39 +00:00
dfs
cf2af56a05 Allow DATETIME - DATETIME 2007-06-28 21:57:07 +00:00
dfs
50d1ae42c9 More work on a unified DATETIME type. 2007-06-28 03:20:37 +00:00
dfs
9501498a7e Add DATETIME type. 2007-06-28 03:04:44 +00:00
dfs
614ab08099 Apply sorting patch so SPECIAL HTMLs sort with MSG-type reminders
(from Ian! Allen)
2007-06-05 02:44:30 +00:00
dfs
64ee338433 Sort "today's" reminder popup. 2007-04-24 14:34:48 +00:00
dfs
43556238d0 Fix Yom Ha'atzmaut and Yom Hazikaron. 2007-04-24 14:34:41 +00:00
dfs
58d7ac0520 Make "distclean" remove test.out 2007-03-26 19:37:56 +00:00
dfs
0754678ce7 Update copyright year 2007-01-25 02:33:18 +00:00
dfs
2bea176816 Update usage output. 2007-01-25 02:32:25 +00:00
dfs
fa90333219 Add "a" modifier to -s and -p options (Frank Terbeck) 2007-01-25 02:28:53 +00:00
dfs
e007b3bc0f Change per Tony Morel. 2006-11-02 20:50:16 +00:00
dfs
978e83567b Incorporate patch at http://bugs.debian.org/cgi-bin/bugreport.cgi/03-broken-postscript.patch?bug=320415;msg=26;att=1 2005-12-31 23:05:24 +00:00
dfs
d01c1190cd Fix incorrect sizes for Ledger vs. Legal 2005-12-01 14:37:10 +00:00
dfs
0b1855df9b Updated WHATSNEW file. 2005-11-20 01:43:25 +00:00
dfs
951f2785cc Support arbitrarily-long DURATIONs 2005-11-20 01:26:59 +00:00
dfs
30090d3f8d Fix segmentation fault (Stan Tobias) 2005-11-20 00:40:51 +00:00
dfs
b6ad67891c Implement Paul Pelzl's patch for combining -n with -s/-p 2005-10-16 14:48:02 +00:00
dfs
b61c9db6e6 Noted removal of non-UNIX support. 2005-09-30 03:36:19 +00:00
dfs
29368ec2ee Documented $PrefixLineNo variable. 2005-09-30 03:33:52 +00:00
dfs
88ff86c910 Removed old non-ANSI, non-UNIX cruft. 2005-09-30 03:29:32 +00:00
dfs
0cc5ae521c Start getting rid of non-ANSI cruft. 2005-09-28 02:43:09 +00:00
dfs
da1b5ed9a0 Remove OS2_POPUP crap. 2005-09-28 02:39:11 +00:00
dfs
f786d05c04 More Makefile tweaks. 2005-07-02 04:10:15 +00:00
dfs
0bcbe9047e Make Makefile obey DESTDIR 2005-07-02 04:08:36 +00:00
dfs
585346f753 Prep for 3.0.24 release. 2005-04-15 16:30:11 +00:00
dfs
324aa01f80 Remove logo stuff from tkremind. 2005-04-14 17:34:34 +00:00
dfs
8d0adfa6b7 New logo in build.tk 2005-04-14 17:33:26 +00:00
dfs
bffae3724c Corrected typo in docs. 2005-04-14 12:30:58 +00:00
dfs
a60dc3d1c8 Set status to "Editor already active" if editor is open and a reminder
is right-clicked.
2005-04-12 13:50:29 +00:00
dfs
df9977d4da Force gzip. 2005-04-12 13:41:54 +00:00
dfs
c31678d28e Updated man page for tkremind. 2005-04-12 13:41:27 +00:00
dfs
40c1a5a3ee Add hooks so right-clicking on a reminder brings up file on that line. 2005-04-12 02:30:21 +00:00
dfs
846dbd9338 Fix it so "SPECIAL COLOR" reminders are sorted as if they were MSG-type
reminders in the calendar.
2005-04-12 01:49:45 +00:00
dfs
2bfed13ebc Updated copyright dates. 2005-04-12 01:27:52 +00:00
dfs
2a5c625a7f Updated WHATSNEW file. 2005-04-12 01:25:58 +00:00
dfs
7660e4a5f1 Updated COPYRIGHT 2005-04-12 01:25:52 +00:00
dfs
779672a5b5 Updated README files. 2005-04-12 01:18:22 +00:00
dfs
46e9ac86bc Skip comments in remind -p output. 2005-04-12 01:14:48 +00:00
dfs
8d6ca79934 Fix regression test error. 2005-04-12 00:59:41 +00:00
dfs
2212d1eebe Create bindir and mandir/man1 2005-04-12 00:57:56 +00:00
dfs
c78c284f19 Updated docs for -l option 2005-04-12 00:57:48 +00:00
dfs
b6b30637c6 Make rem2html ignore "#" lines. 2005-04-12 00:51:36 +00:00
dfs
b17198697c Make rem2ps ignore lines beginning with '#' 2005-04-12 00:49:07 +00:00
dfs
3ec57a608d Add -l option for printing out line numbers (Paul Pelzl) 2005-04-12 00:44:07 +00:00
dfs
49cd14846c Fix bug in parsing unterminated date literals. 2004-09-04 03:17:09 +00:00
dfs
1fd794a5bc Documented COLOR special and arbitrary media sizes. 2004-08-11 14:59:49 +00:00
dfs
5848991c27 Bump version to 03.00.23 2004-08-11 14:54:11 +00:00
dfs
d71f92d034 Fixed typos. 2004-08-11 02:22:35 +00:00
dfs
f9719ae7f5 Fixed typos. 2004-08-11 02:14:36 +00:00
dfs
4e0be6645a ? 2004-08-11 02:01:46 +00:00
dfs
da25a18610 Added support for SPECIAL COLOR. 2004-08-11 01:55:39 +00:00
dfs
7bc3aa52d4 Added support for SPECIAL COLOR and for arbitrary media sizes. 2004-08-11 01:55:32 +00:00
dfs
ca5bb13096 Added support for SPECIAL COLOR 2004-08-11 01:55:20 +00:00
dfs
da124475fa Allow specification of arbitrary media sizes in rem2ps. 2004-08-09 19:48:04 +00:00
dfs
ff04b2e481 Whitespace cleanup. 2001-11-06 15:51:37 +00:00
dfs
09d66135b2 Change phone number to work number. 2001-11-05 14:41:36 +00:00
dfs
65cb72f7e8 *** empty log message *** 2001-05-07 14:15:22 +00:00
dfs
8ae1f93899 Made canvas background white. 2001-05-07 14:14:21 +00:00
dfs
0017f81da5 Made timed reminders have finer (5-minute) granularity. 2001-05-07 14:13:15 +00:00
dfs
8c782c5b4e Updated docs. 2001-05-07 14:12:58 +00:00
dfs
ffd283d779 Updated docs. 2001-05-07 14:08:08 +00:00
dfs
b9227e11df Corrected Hebrew dates for Yom Hazikaron/Yom Ha'atzmaut when 5 Iyar
falls on a Saturday.
2001-05-07 14:06:17 +00:00
dfs
5a289add73 *** empty log message *** 2000-12-18 14:09:16 +00:00
dfs
614254a40d Added Icelandic language. 2000-12-18 14:05:29 +00:00
dfs
e31981c4c8 -- Bumped version to 3.0.22 2000-06-26 14:50:52 +00:00
dfs
eb67e7757b -- Doh. Config stuff. 2000-06-26 14:47:25 +00:00
dfs
ececf4a76e -- Added option to name cgi files *.cgi 2000-06-26 14:44:17 +00:00
dfs
0a437420d8 -- Fixed serious bug -- NumQueued was not being incremented. 2000-06-26 14:44:07 +00:00
dfs
b6ddc22c80 -- Added option to display all reminders on startup; added ability to delete
a reminder from the popup dialog.
2000-06-26 14:43:51 +00:00
dfs
83d88affb7 -- Updated documentation. 2000-06-26 14:43:34 +00:00
dfs
5ae835db6c -- Clarified build instructions. 2000-06-26 14:43:25 +00:00
dfs
47e16f5525 -- Updated docs. 2000-03-26 00:01:32 +00:00
dfs
a6a3dffbd6 -- Changed packing order so buttons don't disappear. 2000-03-25 23:59:30 +00:00
dfs
9d1fcb19bf -- Fixed bug in configure.in 2000-03-15 16:05:18 +00:00
dfs
7176277ddb -- Moved no-longer-supported files to OBSOLETE. 2000-03-15 16:03:36 +00:00
dfs
d9acf28ea5 -- Updated WHATSNEW doc. 2000-03-15 15:58:46 +00:00
dfs
00bbb8b159 -- Updated e-mail address. 2000-03-15 15:51:33 +00:00
dfs
dbe22e99ee -- Added -Wall -Wstrict-prototype to gcc invocation. 2000-03-15 15:42:37 +00:00
dfs
361aa04c6d -- Clarified build instructions. 2000-03-13 17:40:38 +00:00
dfs
7e82b93a84 *** empty log message *** 2000-03-12 12:52:02 +00:00
dfs
36731d2606 -- More copyright fixes. 2000-02-18 03:55:47 +00:00
dfs
2e3ca89e0b -- More copyright message fixes. 2000-02-18 03:53:45 +00:00
dfs
394c4d0791 -- Fixed typo. 2000-02-18 03:48:53 +00:00
dfs
2bc3d991c1 -- Updated contact info, copyright years, etc. 2000-02-18 03:45:11 +00:00
dfs
a479ea971d -- Added "dusk" and "dawn" functions, courtesy of Ron Aaron. 2000-02-18 03:08:18 +00:00
dfs
075a491847 -- Fixed typo in queue.c which caused compilation failure for compilers
without function prototypes.
2000-02-02 20:20:33 +00:00
dfs
fefaea005b -- Added syntax highlighting file for Vim. 2000-02-02 20:20:13 +00:00
dfs
c564fa6165 -- Updated WHATSNEW 2000-02-02 20:20:00 +00:00
dfs
0f4d6b5f8b -- Removed "id" field from queued reminder. 1999-10-18 20:38:48 +00:00
dfs
55059d60e7 -- Updated regression test. 1999-10-18 20:38:18 +00:00
dfs
d45b590e59 -- Got the www scripts working properly. 1999-10-18 20:08:54 +00:00
dfs
76938d27f9 -- Updated what's-new doc. 1999-10-18 20:08:46 +00:00
dfs
e89b5a2d91 -- Fixed makefile. 1999-10-18 19:58:46 +00:00
dfs
a9ffc57ce6 -- Modified Makefile for my system 1999-10-18 19:57:38 +00:00
dfs
97fdee4616 -- Converted .gif images to .png 1999-10-18 19:55:10 +00:00
dfs
f9884f3e9d -- Added cm2rem.tcl script 1999-10-18 19:54:56 +00:00
dfs
87b9dbf36b -- Documented changes. 1999-10-18 19:54:45 +00:00
dfs
415c49fdb9 -- First more-or-less working cm2rem.tcl script. 1999-08-30 16:27:58 +00:00
dfs
89cbe86ad9 -- Decreased size of .gif images. 1999-08-23 18:14:09 +00:00
dfs
db605a774c -- Started on cm2rem conversion script. 1999-08-23 18:13:56 +00:00
dfs
0e00cf4ee9 -- Updated WHATSNEW doc. 1999-08-23 18:13:42 +00:00
dfs
5bfac19a2e -- Changed version to 3.0.21
-- Made queue.c restore some globals (LastTriggerDate, etc.) before
   issuing a reminder.
-- Removed version number where superfluous.
-- Fixed typo in dynbuf.c
1999-04-21 01:47:59 +00:00
dfs
ea34bd0950 -- Changed version to 3.0.21 1999-04-21 01:47:08 +00:00
128 changed files with 9234 additions and 8562 deletions

View File

@@ -1,54 +0,0 @@
$Id: ACKNOWLEDGEMENTS,v 1.1 1998-01-19 03:33:34 dfs Exp $
I would like to thank the following people:
Bill Aten <netagw!bill@uunet.UU.NET> for providing remind-all.sh
Bradley D. Keister <keister@poincare.phys.cmu.edu>, Rhys Weatherly
rhys@batserver.cs.uq.OZ.AU> and Anthony Cheng for initially providing
the Turbo C compiler support.
Dennis Cottel <dennis@peanuts.nosc.mil> for providing the patch to
produce calendars by weeks as well as by months.
Bill Silvert <bill%biomel@cs.dal.ca> and Dennis Cottel
<dennis@peanuts.nosc.mil> for suggesting many of the new features in
REMIND.
Dave Wolfe <dwolfe@pffft.sps.mot.com> and Raphael Manfredi
<ram@eiffel.com> for noticing bugs and sending me fixes.
Dave Rickel and George M. Sipe for sample reminders and holidays.
Michael Salmon for ISO encoding of PostScript output.
Darrel Hankerson for helping me provide some OS/2 support. Sorry
it's not complete, Darrel!
Phillipp Slusallek for suggesting the -k option.
Amos Shapir, David W. Tamkin and Frank Yellin for help with the Hebrew
calendar.
All of the language translators whose names are listed in lang.h
Mark Harrison and Michael McLennan for the excellent book
"Effective Tcl/Tk Programming". This is where I stole the source
for Tcl/Tk tabbed notebooks, and is an excellent reference book.
Thanks also to Lucent Technologies and Addison Wesley Longman for
making it legal to steal the code.
All others who have corresponded with me to report bugs, express
appreciation or suggest features - too many people to list here.
Finally, all those who donated money to support the production of
REMIND. Your donations were gratefully appreciated.
--
David F. Skoll <dfs@doe.carleton.ca> <aa775@freenet.carleton.ca>
986 Eiffel Avenue
Ottawa, Ontario K2C 0J2
CANADA
Tel. (613) 225-8687

View File

@@ -1,10 +1,9 @@
$Id: COPYRIGHT,v 1.11 1999-04-05 17:34:27 dfs Exp $
THE REMIND COPYRIGHT
1. REMIND refers to the entire set of files and documentation in the
REMIND package.
2. REMIND is Copyright 1999 by Roaring Penguin Software Inc.,
2. REMIND is Copyright 1999-2005 Roaring Penguin Software Inc.,
except where noted in individual files.
3. DISTRIBUTION AND USE
@@ -294,11 +293,8 @@ POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
--
David F. Skoll <dskoll@iname.com>
986 Eiffel Avenue
Ottawa, Ontario K2C 0J2
CANADA
David F. Skoll <dfs@roaringpenguin.com>
Tel. (613) 225-8687
Tel. (613) 231-6599
http://www.roaringpenguin.com

View File

@@ -1,7 +1,5 @@
# Top-level Makefile for Remind.
# $Id: Makefile,v 1.28 1998-05-06 01:51:12 dfs Exp $
all: src/Makefile
@echo ""
@echo "*******************"
@@ -27,7 +25,8 @@ clean:
cd src; $(MAKE) clean
distclean: clean
rm -f config.cache config.log config.status src/Makefile src/config.h
rm -f config.cache config.log config.status src/Makefile src/config.h tests/test.out
src/Makefile: src/Makefile.in
./configure
# DO NOT DELETE

10
README
View File

@@ -27,8 +27,12 @@ If you do NOT have Tcl/Tk or are NOT running X Windows:
2) Edit the file "src/lang.h" to choose a language.
3) Type: "make"
3) Type: "./configure" (You can supply options; type "./configure --help"
for details.)
4) Type: "make install" -- you may need to be root to do this.
4) Type: "make"
$Id: README,v 1.4 1998-01-19 03:24:03 dfs Exp $
5) Type: "make install" -- you may need to be root to do this.
Contact info: mailto:dfs@roaringpenguin.com
Home page: http://www.roaringpenguin.com/remind

View File

@@ -1,5 +1,3 @@
$Id: WINDOWS,v 1.1 1999-04-05 17:34:28 dfs Exp $
MICROSOFT WINDOWS
I used to prohibit porting Remind to Microsoft Windows. However, this

1091
build.tk

File diff suppressed because it is too large Load Diff

6170
configure vendored

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,6 @@
dnl Process this file with autoconf to produce a configure script.
dnl $Id: configure.in,v 1.5 1998-02-16 03:41:39 dfs Exp $
AC_INIT(src/amiga.c)
AC_INIT(src/queue.c)
cat <<'EOF'
@@ -26,21 +25,24 @@ dnl Replace `main' with a function in -lm:
AC_CHECK_LIB(m, sqrt)
dnl Integer sizes
AC_CHECK_SIZEOF(unsigned short)
AC_CHECK_SIZEOF(unsigned int)
AC_CHECK_SIZEOF(unsigned long)
dnl Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS(sys/file.h sys/time.h sys/types.h unistd.h malloc.h stdarg.h stdlib.h pwd.h)
AC_CHECK_HEADERS(sys/file.h)
dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_STRUCT_TM
dnl Checks for library functions.
AC_TYPE_SIGNAL
AC_TYPE_PID_T
AC_TYPE_UID_T
AC_FUNC_UTIME_NULL
AC_HEADER_TIME
AC_FUNC_VPRINTF
AC_CHECK_FUNCS(mktime putenv strstr timegm difftime)
if test "$GCC" = yes; then
CFLAGS="$CFLAGS -Wall -Wstrict-prototypes"
fi
AC_CHECK_FUNCS(setenv unsetenv)
AC_OUTPUT(src/Makefile)

View File

@@ -1,31 +1 @@
$Id: README.AMIGA,v 1.2 1998-01-17 04:50:33 dfs Exp $
REMIND version 3.0 for AmigaDOS
REMIND is a sophisticated alarm/calendar program. Details are given
in the man page, "remind.1".
1 - Read the file COPYRIGHT.
2 - cd src; examine the files config.h and custom.h and adjust parameters
as needed
3 - If you are using SAS/C to compile Remind, type:
copy amiga-SCOPTIONS SCOPTIONS
smake -f smakefile
This will create remind, which is ready to be executed.
[Please note: I CANNOT SUPPORT THE AMIGA VERSION!]
See README.UNIX for more info.
--
David F. Skoll <dfs@doe.carleton.ca>
986 Eiffel Avenue
Ottawa, Ontario K2C 0J2
CANADA
Tel. (613) 225-8687
Remind no longer works on AmigaDOS.

View File

@@ -1,33 +1 @@
$Id: README.BCC,v 1.2 1998-01-17 04:50:33 dfs Exp $
REMIND version 3.0 for Borland C++
IMPORTANT NOTE: BCC SUPPORT MAY BE BROKEN. I DON'T CARE. I'M NOT
MAINTAINING IT ANY LONGER.
1 - Read the file COPYRIGHT. (This may be called COPYRIGH on your
MS-DOS system.)
2 - You must use the Borland C++ OS/2 or MSDOS/Windows compiler.
3 - cd src; examine the files custom.h and config.h and adjust
parameters as needed
4 - Examine the file makefile.bcc and adjust parameters as needed.
5 - Type:
make -f makefile.bcc
This will make 'remind.exe' and 'rem2ps.exe' in the ..\os2-ex or ..\msdos-ex
directories.
See README.UNIX for more info.
--
David F. Skoll <dfs@doe.carleton.ca>
986 Eiffel Avenue
Ottawa, Ontario K2C 0J2
CANADA
Tel. (613) 225-8687
Remind no longer works with Borland C Compiler.

View File

@@ -1,38 +1 @@
$Id: README.DOS,v 1.2 1998-01-17 04:50:33 dfs Exp $
REMIND version 3.0 for MS-DOS
IMPORTANT NOTE: DOS SUPPORT MAY BE BROKEN. I DON'T CARE. I NO LONGER
MAINTAIN THE DOS VERSION.
REMIND is a sophisticated alarm/calendar program. Details are given
in the man page, "remind.1".
1 - Read the file COPYRIGHT. (This may be called COPYRIGH on your
MS-DOS system.)
2 - cd src; examine the files custom.h and config.h and adjust parameters
as needed
3 - If you are using Turbo C to compile Remind, type:
make -fmakefile.tc
If you are using Microsoft C to compile Remind, type:
make makefile.msc
This will create REMIND.EXE, which is ready to be executed.
The file "defs.rem" has some sample Remind definitions and commands,
as well as U.S. and Jewish holidays.
See README.UNIX for more info.
--
David F. Skoll <dfs@doe.carleton.ca>
986 Eiffel Avenue
Ottawa, Ontario K2C 0J2
CANADA
Tel. (613) 225-8687
Remind no longer works on MS-DOS.

View File

@@ -1,109 +1 @@
$Id: README.OS2,v 1.2 1998-01-17 04:50:34 dfs Exp $
REMIND version 3.0 for OS/2
This file contains instructions for compiling Remind under OS/2 with
Eberhard Mattes' emx/gcc compiler and with the Microsoft C compiler.
There are a number of targets in Makefile.os2, including OS/2-only
versions and bound versions (programs which run under OS/2 and DOS).
Note that there is also support for OS/2 using the Borland C
compiler--see the file README.BCC for details.
REMIND is a sophisticated alarm/calendar program. Details are given
in the man page, "remind.1".
1 - Read the file COPYRIGHT. (This may be called COPYRIGH on your
MS-DOS system.)
2 - To compile Remind for OS/2, you must use the Microsoft C compiler
or emx/gcc. You must also have a decent version of 'make', such
as dmake or GNU make.
3 - Change to "src" directory and examine the files config.h and custom.h
and adjust parameters as needed.
4 - Examine the file Makefile.os2 and adjust parameters as needed.
5 - Type:
make -f Makefile.os2
to see a list of targets. For example,
make -f Makefile.os2 emx
will build a 32-bit emx version which runs under OS/2 2.x and DOS.
NOTE that I do not have access to an OS/2 system, so support for this
system may not be as good as I'd like.
OS/2 support is courtesy of Russ Herman <rwh@gov.on.ca>, Norman Walsh
<norm@ora.com>, and Darrel Hankerson <hankedr@mail.auburn.edu>.
However, if you have problems, please contact me.
RELEASE NOTES -- miscellaneous info that couldn't go anywhere else!
1. POPUP REMINDERS
If you define the symbol OS2_POPUP in the OS/2 Makefile, you get
"full-screen popups" (as implemented by Russ Herman) for all MSG-
and MSF-type reminders. You may or may not like this feature.
One way of implementing popup reminders is to get the program
"pmpopup.exe" from ftp-os2.cdrom.com, and using Remind with the
'-k' option as follows from C:\STARTUP.CMD:
start /pm /inv /n remind "-kstart pmpopup %%s" remfile
Alternatively, if you have the Vrexx package, you can use this
procedure suggested by Norman Walsh:
Start remind like this in C:\STARTUP.CMD:
start /pm /inv /n \bin\remind -faz "-kstart popupmsg %%s" .reminders
The popups are done by POPUPMSG.CMD which looks like this:
-------------- Cut Here ---------- Cut Here ---------- Cut Here --------
/* PopUpMsg */
'@echo off'
parse arg theargs
if theargs = "" then
theargs = "Empty message"
call RxFuncAdd 'VInit', 'VREXX', 'VINIT'
initcode = VInit()
if initcode = 'ERROR' then signal CLEANUP
signal on failure name CLEANUP
signal on halt name CLEANUP
signal on syntax name CLEANUP
/* example VMsgBox call */
msg.0 = 1
msg.1 = theargs
call VDialogPos 50, 50
call VMsgBox 'Popup Message', msg, 1
/* end of CMD file */
CLEANUP:
call VExit
exit
-------------- Cut Here ---------- Cut Here ---------- Cut Here --------
See README.UNIX for some more information about Remind.
--
David F. Skoll <dfs@doe.carleton.ca>
986 Eiffel Avenue
Ottawa, Ontario K2C 0J2
CANADA
Tel. (613) 225-8687
Remind no longer works on OS/2.

View File

@@ -1,5 +1,4 @@
$Id: README.UNIX,v 1.4 1998-01-19 03:24:09 dfs Exp $
REMIND version 3.0 for UNIX
REMIND version 3.1 for UNIX
REMIND is a sophisticated alarm/calendar program. Details are given
in the man page, "remind.1".
@@ -125,9 +124,5 @@ exit
--
David F. Skoll <dfs@doe.carleton.ca>
986 Eiffel Avenue
Ottawa, Ontario K2C 0J2
CANADA
Tel. (613) 225-8687
David F. Skoll <dfs@roaringpenguin.com>
http://www.roaringpenguin.com/remind/

View File

@@ -1,50 +1 @@
$Id: README_QDOS,v 1.3 1998-03-01 20:43:04 dfs Exp $
REMIND version 3.0.19 for QDOS / SMSQ
REMIND is a sophisticated alarm/calendar program. Details are given
in the documentation file, "remind_doc" (QUILL format).
[Note from David Skoll -- I was not sent the file `remind_doc', so
you're on your own here. You'll have to use the UNIX man pages.]
1 - Read the file COPYRIGHT.
2 - Change to the directory "src"
3 - Examine the Makefile and change any parameters which need to be
changed for your system. (The makefile for QDOS / SMSQ is
makefile_QDOS).
4 - Examine the files config_h and custom_h and adjust parameters as needed
5 - Examine lang_h and choose the language you want Remind to use.
There has no effort been put in making the language modules working
on the QL. You'll have to adjust the files for yourself to get
them working (umlauts etc).
6 - Execute "make;'-fMakefile_QDOS'". Be sure, that your DATA_DEFAULT
directory is the directory where the remind source files are
placed.
See README.UNIX for some more information about Remind.
RELEASE NOTES -- miscellaneous info that couldn't go anywhere else!
The QDOS / SMSQ version does not support the enhanced features of
the UNIX and/or OS/2 versions.
I had some problems with the sunrise() and sunset() functions,
but didn't examine it.
I've ported Remind on a SMSQ/SGC system. It should work on other
systems without problems. The compiler used was C68 v4.14c.
Remind should work with each QL or compatible with 512K or more RAM.
It'll however NOT work on a standard QL due to it's code size.
Any problems with the QDOS / SMSQ versions should be sent to:
Robert H. Klein
Bluecherstrasse 24
D-56349 Kaub
Germany
Remind no longer works on QDOS.

View File

@@ -1,5 +1,168 @@
CHANGES TO REMIND
* Version 3.1 Patch 0 - 14 August 2007
+ MAJOR ENHANCEMENTS
- Added the FROM clause. This lets you write reminders like:
REM Mon FROM 16 July 2007 UNTIL 13 Aug 2007 MSG Some Mondays...
- Remind now has a new datatype: A DATETIME object represents a date AND
a time (to the nearest minute). DATETIME constants are written
as '2007-09-01@14:33'. Various operators and functions have been
modified to do sensible things with DATETIMEs and several new DATETIME
functions have been added.
- The SPECIAL COLOR reminder type has been hacked to behave more like
a MSG type. It sorts properly and is emitted as a normal reminder
in non-calendar mode. Simlarly, SPECIAL HTML sorts with -g as well.
+ MINOR ENHANCEMENTS
- TkRemind can e-mail you reminders if you don't dismiss the popup window
after one minute. This is useful if you need to leave your workstation
but want reminders to "follow" you via e-mail.
- A new "-y" option to Remind generates tags for all reminders that lack
a TAG clause. This may be useful for conversion tools that want each
reminder to have a unique identifier.
- A new "tzconvert" function lets you convert datetimes between different
time zones. It's only as good as your C library, so test thoroughly
please! Based on a patch from Stefan Wehr.
- TkRemind sorts reminders by invoking Remind with the '-g' option.
- The time and date separator characters can be changed at runtime by
setting $TimeSep and $DateSep respectively.
- The simple calendar ('-s') option can be immediately followed by an 'a'.
This causes Remind to output reminders with deltas before the actual
trigger date. Based loosely on an idea from Frank Terbeck.
+ MINOR CHANGES
- Default date separator is now '-' instead of '/'
- trigdate() and trigtime() behave differently - they return the integer 0
if the last reminder could not be computed or did not have an AT clause
(respectively).
- Maximum length of variable names has been increased from 12 to 16 characters.
+ BUG FIXES
- Fixed a potential memory leak in queue.c
- Fixed compile error on Mac OS X.
- Fixed behaviour of "-sa" option so deltas correctly obey omitted days
and the scheduling function (if one is used).
- rem2ps would produce invalid PostScript in some rare cases
(eg, for February 2007). This has been fixed.
* Version 3.0 Patch 24
+ MINOR ENHANCEMENTS
- Permit the DURATION of a reminder to be as high as you like. Previously,
DURATIONs could be at most 23:59. Fix courtesy of Paul Pelzl.
- The "-n" flag can be usefully combined with "-s", "-p" and "-l" now.
Fix courtesy of Paul Pelzl.
+ BUG FIXES
- The "-k" command escapes all characters except those known to be
safe, rather than attempting to escape only characters thought to be
unsafe.
- Removed the crufty code that supported non-ANSI C compilers.
- Removed all support for non-UNIX/non-Linux systems.
- Fixed a bug in the tokenizer that could make Remind segfault. Fix courtesy
of Stan Tobias.
* Version 3.0 Patch 23
+ MINOR ENHANCEMENTS
- Added the COLOR special for putting colored reminders in the calendar.
Supported by the HTML, Tcl/Tk and PostScript back-ends.
- Many minor tweaks to tkremind.
- Added ability to specify paper size in inches or centimetres to rem2ps.
- Added the "-l" option to Remind. This outputs additional information
for back-end programs that use the "-p" output format. Currently
used only by the "tkremind" back-end.
- Fixed dates for Yom Hazikaron and Yom Ha'atzmaut if 5 Iyar falls on a
Saturday. (Hebrew calendar fix.)
- Added support for the Icelandic language, courtesy of Björn Davíðsson.
+ BUG FIXES
- Fixed parser error for unterminated date constant: '2005/01/01
* Version 3.0 Patch 22
+ MINOR ENHANCEMENTS
- Added option to have TkRemind display all of today's reminders in a text
box on startup. This option is on by default.
- Makefile in "www" directory allows you to add ".cgi" suffix to CGI scripts.
- Added option to completely delete a reminder from the reminder file in
the timed reminder popup dialog.
- Clarified build instructions.
+ BUG FIXES
- Fixed packing order in TkRemind so resizing window doesn't make control
buttons disappear.
- Fixed serious bug in which background queued reminders were ignored and
Remind simply exited. Doh! Sorry about that.
* Version 3.0 Patch 21
+ MINOR ENHANCEMENTS
- Updated copyright years and contact info.
- Changed GIF images to PNG to avoid patent problems.
- Added "cm2trem.tcl" to convert from CDE's "cm" calendar manager to Remind
format. It handles only an older version of "cm" data; there is a utility
available (under Solaris anyway) to convert newer files to the older "cm"
format.
- Fixed the scripts in the "www" directory to install and work properly.
- Added "remind.vim" file for Vim syntax highlighting of Remind files,
thanks to Davide Alberani.
- Added "dusk" and "dawn" built-in functions, thanks to Ron Aaron.
+ BUG FIXES
- Files for no-longer-supported platforms (OS/2, amiga, MS-DOS) have been
moved to OBSOLETE subdirectory. They will disappear unless someone
wants to maintain them.
- Fixed typo which caused compilation failure on compilers without function
prototypes. Thanks to Ian Darwin for the patch.
- Fixed compilation problem on FreeBSD, IRIX, Tru64 and other UNIXes.
* Version 3.0 Patch 20
+ NEWS

View File

@@ -17,15 +17,11 @@
# "#COLORS" for examples of ANSI color escape sequences. #
# #
# This file is part of REMIND. #
# Copyright (C) 1992-1997 by David F. Skoll #
# Copyright (C) 1999 by Roaring Penguin Software Inc. #
# Copyright (C) 1992-1997 David F. Skoll #
# Copyright (C) 1999-2000 Roaring Penguin Software Inc. #
# #
#############################################################################
#
# $Id: defs.rem,v 1.3 1999-04-05 17:34:38 dfs Exp $
#
RUN OFF
################################################
@@ -472,6 +468,8 @@ SET Reform 0
FSET _h(x, y) TRIGGER(HEBDATE(x,y))
FSET _h2(x, y) HEBDATE(x, y, TODAY()-7)
FSET _PastSat(x, y) TRIGGER(IIF(WKDAYNUM(_h2(x,y))!=6, _h2(x,y), _h2(x,y)+1))
FSET _PastSun(x, y) TRIGGER(IIF(WKDAYNUM(_h2(x,y))!=0, _h2(x,y), _h2(x,y)+1))
FSET _PastMon(x, y) TRIGGER(IIF(WKDAYNUM(_h2(x,y))!=1, _h2(x,y), _h2(x,y)+1))
# Default values in case InIsrael and Reform are not set
SET InIsrael VALUE("InIsrael", 0)
@@ -541,9 +539,24 @@ IF !InIsrael && !Reform
[_h(22, "Nisan")] MSG %"Pesach 8%"
ENDIF
[_h(27, "Nisan")] ++4 MSG %"Yom HaShoah%" is %b.
[_h(4, "Iyar")] ++4 MSG %"Yom HaZikaron%" is %b.
[_h(5, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
[_PastSun(27, "Nisan")] ++4 MSG %"Yom HaShoah%" is %b.
# If 4 Iyar is a Friday, then Yom Hazikaron is
# the Wednesday before and Yom Ha'atzmaut is on
# Thursday. If 4 Iyar is a Sunday, then Yom Hazikaron
# moves to 5 Iyar and Yom Ha'atzmaut to 6 Iyar.
IF WKDAYNUM(_h2(4, "Iyar")) == 5
[_h(2, "Iyar")] ++4 MSG %"Yom Hazikaron%" is %b.
[_h(3, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
ELSE
IF WKDAYNUM(_h2, 4, "Iyar") == 0
[_h(5, "Iyar")] ++4 MSG %"Yom Hazikaron%" is %b.
[_h(6, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
ELSE
[_h(4, "Iyar")] ++4 MSG %"Yom Hazikaron%" is %b.
[_h(5, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
ENDIF
ENDIF
# Not sure about Reform's position on Lag B'Omer
IF !Reform

53
examples/remind.vim Normal file
View File

@@ -0,0 +1,53 @@
" Vim syntax file
" Language: Remind
" Maintainer: Davide Alberani <alberanid@bigfoot.com>
" Last change: 03 Dec 1999
" Version: 0.1
" URL: http://members.xoom.com/alberanid/vim/syntax/remind.vim
"
" remind is a sophisticated reminder service
" you can download remind from ftp://ftp.doe.carleton.ca/pub/remind-3.0/
" clear any unwanted syntax defs
syn clear
" shut case off
syn case ignore
syn keyword remindCommands REM OMIT SET FSET UNSET
syn keyword remindExpiry UNTIL SCANFROM SCAN WARN SCHED
syn keyword remindTag PRIORITY TAG
syn keyword remindTimed AT DURATION
syn keyword remindMove ONCE SKIP BEFORE AFTER
syn keyword remindSpecial INCLUDE INC BANNER PUSH-OMIT-CONTEXT PUSH CLEAR-OMIT-CONTEXT CLEAR POP-OMIT-CONTEXT POP
syn keyword remindRun MSG MSF RUN CAL SATISFY SPECIAL PS PSFILE SHADE MOON
syn keyword remindConditional IF ELSE ENDIF IFTRIG
syn match remindComment "#.*$"
syn region remindString start=+'+ end=+'+ skip=+\\\\\|\\'+ oneline
syn region remindString start=+"+ end=+"+ skip=+\\\\\|\\"+ oneline
syn keyword remindDebug DEBUG DUMPVARS DUMP ERRMSG FLUSH PRESERVE
syn match remindVar "\$[_a-zA-Z][_a-zA-Z0-9]*"
syn match remindSubst "%[^ ]"
syn match remindAdvanceNumber "\(\*\|+\|-\|++\|--\)[0-9]\+"
if !exists("did_remind_syntax_inits")
let did_remind_syntax_inits = 1
hi link remindCommands Function
hi link remindExpiry Repeat
hi link remindTag Label
hi link remindTimed Statement
hi link remindMove Statement
hi link remindSpecial Include
hi link remindRun Function
hi link remindConditional Conditional
hi link remindComment Comment
hi link remindString String
hi link remindDebug Debug
hi link remindVar Identifier
hi link remindSubst Constant
hi link remindAdvanceNumber Number
endif
let b:current_syntax = "remind"
"EOF vim: ts=8 noet tw=100 sw=8 sts=0

28
man/cm2rem.1 Normal file
View File

@@ -0,0 +1,28 @@
.TH CM2REM 1 "18 October 1999"
.UC4
.SH NAME
cm2rem.tcl \- Convert Sun's "cm" input file to Remind format
.SH SYNOPSIS
.B cm2rem.tcl < cm_file > remind_file
.SH DESCRIPTION
\fBcm2rem.tcl\fR reads the Sun calendar manager data file and converts
it into a \fBRemind\fR script. Note that \fBcm2rem.tcl\fR can convert
\fIonly\fR version 3 calendar manager files. If you are using version 4
files, there should be a system utility to convert them to version 3 files.
.SH AUTHOR
\fBcm2rem.tcl\fR is supported by Roaring Penguin Software
Inc. (http://www.roaringpenguin.com)
.PP
\fBcm2rem.tcl\fR was written by David F. Skoll <dfs@roaringpenguin.com>.
.SH BUGS
Not all of the Sun calendar manager options are respected. In particular,
nothing is done for e-mail actions. Also, the resulting Remind script
is not editable with \fBTkRemind\fR; you can only edit it with a text
editor.
.PP
\fBcm2rem.tcl\fR requires Tcl/Tk version 8.0 or higher. The
\fBtclsh\fR interpreter must be on your \fBpath\fR.
.SH SEE ALSO
\fBremind(1)\fR, \fBtkremind(1)\fR

View File

@@ -1,4 +1,3 @@
.\" $Id: kall.1,v 1.2 1998-02-16 02:35:09 dfs Exp $
.TH KALL 1 "15 February 1998"
.UC 4
.SH NAME

View File

@@ -1,4 +1,3 @@
.\" $Id: rem.1,v 1.2 1998-02-16 02:35:09 dfs Exp $
.TH REM 1 "15 February 1998"
.UC 4
.SH NAME

View File

@@ -1,5 +1,4 @@
.\" $Id: rem2ps.1,v 1.3 1999-04-13 01:46:18 dfs Exp $
.TH REM2PS 1 "1 February 1998"
.TH REM2PS 1 "11 April 2005"
.UC4
.SH NAME
rem2ps \- draw a PostScript calendar from Remind output
@@ -78,10 +77,10 @@ Letter
8.5 x 11 in.
.TP
Legal
11 x 17 in.
8.5 x 14 in.
.TP
Ledger
8.5 x 14 in.
11 x 17 in.
.TP
Statement
5.5 x 8.5 in.
@@ -112,6 +111,15 @@ Quarto
.TP
10x14
10 x 14 in.
.TP
\fIX\fRx\fIY\fRin
\fIX\fR by \fIY\fR inches, where \fIX\fR and \fIY\fR can be floating-point
numbers.
.TP
\fIX\fRx\fIY\fRcm
\fIX\fR by \fIY\fR centimetres, where \fIX\fR and \fIY\fR can be floating-point
numbers.
.PP
Type "rem2ps -m help" for a list of available media. Note that the media
type (and all \fBRem2ps\fR options) are case-sensitive. If you don't use
@@ -370,11 +378,21 @@ emits the line:
However, back-ends should keep reading until EOF in case more data for
subsequent months is forthcoming.
.PP
If you supply the \fB\-l\fR option to \fBremind\fR, then reminders
may be preceded by a line that looks like this:
.PP
\fB# fileinfo \fIlineno filename\fR
.PP
The word \fBfileinfo\fR is literal; \fIlineno\fR and \fIfilename\fR specify
the line number and file name of the file containing the reminder. Back-ends
that don't care about this information should ignore lines starting with
"#" (except, of course, for the # rem2ps lines.)
.PP
.SH AUTHOR
Rem2PS is now supported by Roaring Penguin Software
Inc. (http://www.roaringpenguin.com)
.PP
Rem2PS was written by David F. Skoll (dskoll@iname.com).
Rem2PS was written by David F. Skoll <dfs@roaringpenguin.com>.
.SH BUGS
All \fBRem2ps\fR options are case-sensitive, unlike \fBRemind\fR.
Any time you supply

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,3 @@
.\" $Id: tkremind.1,v 1.8 1999-04-13 01:46:20 dfs Exp $ "
.TH TKREMIND 1 "15 February 1998"
.UC 4
.SH NAME
@@ -149,6 +148,13 @@ in the \fBPreview reminder\fR dialog.
If the reminder was not created with \fBTkRemind\fR, you can't edit
it with \fBTkRemind\fR.
.SH USING A TEXT EDITOR
If you have set the "text editor" option correctly, right-clicking
on a reminder will bring up a text editor on the file containing
the reminder. The cursor will be positioned on the line that
generated the reminder.
.SH BACKGROUND REMINDERS
If you create "timed" reminders, \fBTkRemind\fR will queue them in
@@ -168,6 +174,12 @@ certain aspects of \fBTkRemind\fR. The configuration options are:
If this is selected, \fBTkRemind\fR starts up iconified. Otherwise,
it starts up in a normal window.
.TP
.B Show Today's Reminders on Startup
If this is selected, \fBTkRemind\fR shows a text window containing reminders
which would be issued by "remind -q -a -r" on startup, and when the date
changes at midnight.
.TP
.B Confirm Quit
If this is selected, you will be asked to confirm when you press
@@ -197,6 +209,26 @@ background reminder pops up.
.B Feed popped-up reminder to command's standard input
If selected, feeds the text of the reminder to the command described
above.
.TP
.B E-mail reminders here if popup not dismissed
If you enter a non-blank e-mail address in this field, then \fBTkRemind\fR
will e-mail you a reminder if you don't dismiss the popup box within
one minute. This is useful if you need to leave your terminal but
want your reminders to "follow" you via e-mail.
.TP
.B Name or IP address of SMTP server
\fBTkRemind\fR uses a direct SMTP connection to send mail. Enter the
IP address of your SMTP server here.
.TP
.B Text Editor
This specifies a text editor to invoke when a reminder is right-clicked.
The characters "%d" are replaced with the lined number of the file
containing the reminder, and "%s" are replaced with the file name.
Useful strings might be "emacs +%d %s" or "gvim +%d %s"
.PP
Once you've configured the options the way you like them,
press \fBApply Options\fR to put them into effect, \fBSave Options\fR
@@ -309,7 +341,7 @@ This line is emitted in response to a \fBSTATUS\fR command. The number
TkRemind is now supported by Roaring Penguin Software
Inc. (http://www.roaringpenguin.com)
.PP
TkRemind was written by David F. Skoll (dskoll@iname.com)
TkRemind was written by David F. Skoll <dfs@roaringpenguin.com>.
\fBTkRemind\fR is Copyright 1996-1998 by David F. Skoll, Copyright
1999 by Roaring Penguin Software Inc.

View File

@@ -1,7 +1,7 @@
Begin3
Title: Remind
Version: 03.00.19
Entered-date: 9 May 1998
Version: 03.00.22
Entered-date: 12 Apr 1999
Description: Full-featured calendar/reminder program featuring
sophisticated date calculation, moon phases, sunrise/sunset,
Hebrew calendar, alarms, PostScript output, X-Windows
@@ -10,14 +10,14 @@ Description: Full-featured calendar/reminder program featuring
platforms. Includes scripts for making a nice WWW
calendar server.
Keywords: calendar reminder alarm datebook PostScript www
Author: aa775@freenet.carleton.ca (David F. Skoll)
Maintained-by: aa775@freenet.carleton.ca (David F. Skoll)
Primary-site: ftp.doe.carleton.ca /pub/Remind-3.0
266kB remind-3.0.19.tgz
Author: dskoll@iname.com (David F. Skoll)
Maintained-by: dskoll@iname.com (David F. Skoll)
Primary-site: http://www.roaringpenguin.com/remind.html
304kB remind-3.0.22.tgz
Alternate-site:
Original-site:
Platform: Linux, Solaris, SunOS, HP-UX -- virtually any UN*X-like
system. Wish 8.x required for TCL/Tk front-end, but
this is not essential to use the software.
Copying-policy: GPL (No ports to MS Windows allowed)
Copying-policy: GPL
End

View File

@@ -5,6 +5,3 @@ rem -- Starts Remind with a default file of $HOME/.reminders
remind-all.csh -- Mails reminders to all users (C-Shell version)
remind-all.sh -- Mails reminders to all users (Bourne Shell version)
tkremind* -- Tcl/Tk graphical calendar using Remind as engine
$Id: README,v 1.1 1998-01-15 02:50:20 dfs Exp $

359
scripts/cm2rem.tcl Executable file
View File

@@ -0,0 +1,359 @@
#!/bin/sh
# -*-Mode: TCL;-*-
#--------------------------------------------------------------
# cm2rem.tcl
#
# A cheesy Tcl script to convert Sun's "cm" calendar manager
# files (version 3 only) to Remind format.
#
# This file is part of REMIND.
# Copyright (C) 1992-1998 by David F. Skoll
# Copyright (C) 1999-2000 by Roaring Penguin Software Inc.
#
#--------------------------------------------------------------
# the next line restarts using tclsh \
exec tclsh "$0" "$@"
set i 0
foreach month {January February March April May June
July August September October November December} {
incr i
set MonthNum($month) $i
set FullMonth([string range $month 0 2]) $month
}
#***********************************************************************
# %PROCEDURE: convertParens
# %ARGUMENTS:
# line -- a line read from a cm file
# %RETURNS:
# A new line with all ( and ) outside quotes converted to { and }.
# This cheap trick allows us to use Tcl's built-in list manipulation
# functions to munge the line.
#***********************************************************************
proc convertParens { line } {
# Convert all ( and ) to { and } unless they are inside a quoted
# string
set out ""
set len [string length $line]
set inQuotes 0
for {set i 0} {$i < $len} {incr i} {
set char [string range $line $i $i]
if {$char == "\\" && $inQuotes} {
append out $char
incr i
set char [string range $line $i $i]
append out $char
continue
}
if {$char == "(" && !$inQuotes} {
set char \{
}
if {$char == ")" && !$inQuotes} {
set char \}
}
if {$char == "\""} {
set inQuotes [expr !$inQuotes]
}
append out $char
}
return $out
}
#***********************************************************************
# %PROCEDURE: processLine
# %ARGUMENTS:
# line -- a line read from a cm file
# %RETURNS:
# Nothing
# %DESCRIPTION:
# Processes a single line from the file, possibly writing a reminder
# in Remind format to stdout
#***********************************************************************
proc processLine { line } {
global Attributes
global FullMonth
catch {unset Attributes}
# Only convert lines which start with "(add"
if {[string range $line 0 3] != "(add"} {
return
}
set line [convertParens $line]
# Convert it to a list. CAREFUL: Potential security problem if
# $line contains something nasty.
eval set line $line
set Attributes(body) ""
foreach {key val} $line {
switch -exact -- $key {
"add" {
set Attributes(date) $val
}
"what:" {
append Attributes(body) $val
}
"details:" {
append Attributes(body) $val
}
"duration:" {
set Attributes(duration) $val
}
"period:" {
set Attributes(period) $val
}
"ntimes:" {
set Attributes(ntimes) $val
}
"attributes:" {
set Attributes(action) $val
}
}
}
if {[info exists Attributes(action)]} {
# Nuke quotes and commas in action
regsub -all {[,\"]} $Attributes(action) { } Attributes(action)
# Add spaces to pairs
regsub -all \}\{ $Attributes(action) \}\ \{ Attributes(action)
# Add another pair of brackets to make a proper list
set Attributes(action) "{$Attributes(action)}"
# Convert to a real Tcl list
eval set Attributes(action) $Attributes(action)
}
# Split out date into month, day, year, time parts
scan $Attributes(date) "%s%s%s%s%s" wkday month day time year
set time [string range $time 0 4]
set Attributes(wkday) $wkday
set Attributes(month) $FullMonth($month)
set Attributes(day) $day
set Attributes(time) $time
set Attributes(year) $year
# Convert newlines in body to spaces
set body $Attributes(body)
regsub -all "\n" $body " " body
# TODO: Escape BODY to get rid of [] chars.
set Attributes(body) $body
# Convert to Reminder format
convertReminder
}
#***********************************************************************
# %PROCEDURE: convertReminder
# %ARGUMENTS:
# None -- uses global Attributes variable which must be filled in
# %RETURNS:
# Nothing
# %DESCRIPTION:
# Converts a reminder to Remind format.
#***********************************************************************
proc convertReminder {} {
global Attributes
switch -exact $Attributes(period) {
single { convertSingleReminder }
daily { convertDailyReminder }
weekly { convertWeeklyReminder }
monthly { convertMonthlyReminder }
yearly { convertYearlyReminder }
default {
puts "\# Unable to convert reminder with period $Attributes(period)"
puts "\# Body is: $Attributes(body)"
}
}
}
#***********************************************************************
# %PROCEDURE: convertSingleReminder
# %ARGUMENTS:
# None -- uses global Attributes variable which must be filled in
# %RETURNS:
# Nothing
# %DESCRIPTION:
# Converts a reminder with "single" period to Remind format.
#***********************************************************************
proc convertSingleReminder {} {
global Attributes
puts "REM $Attributes(day) $Attributes(month) $Attributes(year) [at][duration]MSG $Attributes(body)"
}
#***********************************************************************
# %PROCEDURE: convertDailyReminder
# %ARGUMENTS:
# None -- uses global Attributes variable which must be filled in
# %RETURNS:
# Nothing
# %DESCRIPTION:
# Converts a reminder with "daily" period to Remind format.
#***********************************************************************
proc convertDailyReminder {} {
global Attributes
set ntimes [expr $Attributes(ntimes) - 1]
if {$ntimes <= 1} {
convertSingleReminder
return
}
set until [getUntilDate $Attributes(day) $Attributes(month) $Attributes(year) $ntimes]
puts "REM $Attributes(day) $Attributes(month) $Attributes(year) *1 [at][duration]UNTIL $until MSG $Attributes(body)"
}
#***********************************************************************
# %PROCEDURE: convertWeeklyReminder
# %ARGUMENTS:
# None -- uses global Attributes variable which must be filled in
# %RETURNS:
# Nothing
# %DESCRIPTION:
# Converts a reminder with "daily" period to Remind format.
#***********************************************************************
proc convertWeeklyReminder {} {
global Attributes
set ntimes [expr $Attributes(ntimes) - 1]
if {$ntimes <= 1} {
convertSingleReminder
return
}
set until [getUntilDate $Attributes(day) $Attributes(month) $Attributes(year) [expr $ntimes * 7]]
puts "REM $Attributes(day) $Attributes(month) $Attributes(year) *7 [at][duration]UNTIL $until MSG $Attributes(body)"
}
#***********************************************************************
# %PROCEDURE: convertMonthlyReminder
# %ARGUMENTS:
# None -- uses global Attributes variable which must be filled in
# %RETURNS:
# Nothing
# %DESCRIPTION:
# Converts a reminder with "monthly" period to Remind format.
#***********************************************************************
proc convertMonthlyReminder {} {
global Attributes
set ntimes [expr $Attributes(ntimes) - 1]
if {$ntimes <= 1} {
convertSingleReminder
return
}
# If repetition > 1000, it's infinite
if {$ntimes > 1000} {
puts "REM $Attributes(day) [at][duration]MSG $Attributes(body)"
return
}
### UNTIL date is fudged!
set until [getUntilDate $Attributes(day) $Attributes(month) $Attributes(year) [expr $ntimes * 30]]
puts "REM $Attributes(day) [at][duration]UNTIL $until MSG $Attributes(body)"
}
#***********************************************************************
# %PROCEDURE: convertYearlyReminder
# %ARGUMENTS:
# None -- uses global Attributes variable which must be filled in
# %RETURNS:
# Nothing
# %DESCRIPTION:
# Converts a reminder with "yearly" period to Remind format.
#***********************************************************************
proc convertYearlyReminder {} {
global Attributes
# No special handling of ntimes et al.
puts "REM $Attributes(day) $Attributes(month) [at][duration]MSG $Attributes(body)"
}
#***********************************************************************
# %PROCEDURE: at
# %ARGUMENTS:
# None -- uses Attributes global variable
# %RETURNS:
# A string providing the correct AT clause for a timed reminder.
#***********************************************************************
proc at {} {
global Attributes
if {![info exists Attributes(time)]} {
return ""
}
if {"$Attributes(time)" == ""} {
return ""
}
return "AT $Attributes(time) "
}
#***********************************************************************
# %PROCEDURE: duration
# %ARGUMENTS:
# None -- uses Attributes global variable
# %RETURNS:
# A string providing the correct DURATION clause for a timed reminder.
#***********************************************************************
proc duration {} {
global Attributes
if {![info exists Attributes(duration)]} {
return ""
}
if {"$Attributes(duration)" == ""} {
return ""
}
set h [expr $Attributes(duration) / 3600]
set remainder [expr $Attributes(duration) - $h*3600]
set m [expr $remainder / 60]
return "DURATION [format "%d:%02d " $h $m]"
}
#***********************************************************************
# %PROCEDURE: getUntilDate
# %ARGUMENTS:
# day, month, year -- a date
# days -- number of days to add to date
# %RETURNS:
# The date which is "days" later than supplied date in a correct UNTIL
# format.
#***********************************************************************
proc getUntilDate { day month year days } {
global RemindPipe
global MonthNum
set date "'$year/$MonthNum($month)/$day'"
puts $RemindPipe "MSG \[trigger($date + $days)\]%"
puts $RemindPipe "flush"
flush $RemindPipe
gets $RemindPipe line
return $line
}
catch {wm withdraw .}
# Start a Remind process to issue reminders
if {[catch {set RemindPipe [open "|remind -" "r+"]} err]} {
puts stderr "Error: Cannot run Remind: $err"
exit 1
}
puts $RemindPipe "banner %"
flush $RemindPipe
# Write some blurb
puts "\# Reminder file converted from \"cm\" data by cm2rem.tcl"
puts ""
while {[gets stdin line] >= 0} {
processLine $line
}
exit 0

View File

@@ -1,7 +1,5 @@
#!/bin/sh
#
# $Id: kall,v 1.1 1998-01-15 02:50:20 dfs Exp $
#
# kall - kill all processes belonging to this user that match
# specified string.

View File

@@ -2,8 +2,6 @@
#
# rem - by David Skoll - 26 February 1991
#
# $Id: rem,v 1.1 1998-01-15 02:50:21 dfs Exp $
#
# This script runs 'remind' with a default reminder file assumed. You
# can override the default by using "rem -F newfile ..." (But why would
# you use rem unless you wanted to accept the default??)

View File

@@ -2,8 +2,6 @@
# Shell script to mail all users reminders.
# $Id: remind-all.csh,v 1.1 1998-01-15 02:50:21 dfs Exp $
# Run it AFTER MIDNIGHT so that date is correct!
# On our system, we have the following in our crontab:
# 05 5 * * * /usr/share/lib/remind/remind-all > /dev/null 2>&1

View File

@@ -3,10 +3,8 @@
# This file is part of REMIND
#
# $Id: remind-all.sh,v 1.3 1999-04-05 17:34:40 dfs Exp $
#
# REMIND is Copyright (C) 1992-1998 by David F. Skoll
# Copyright (C) 1999 by Roaring Penguin Software Inc.
# REMIND is Copyright (C) 1992-1998 by David F. Skoll
# Copyright (C) 1999-2007 Roaring Penguin Software Inc.
# This file is Copyright (C) 1990 by Bill Aten
# Thanks to Bill Aten for this script.

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,9 @@
# Makefile.in for REMIND
#
# $Id: Makefile.in,v 1.11 1998-05-10 02:19:20 dfs Exp $
#
VERSION= 03.00.19
VERSION=03.01.00
SHELL= /bin/sh
BETA = 1
srcdir=@srcdir@
prefix=@prefix@
exec_prefix=@exec_prefix@
@@ -19,18 +18,21 @@ INSTALL_DATA=@INSTALL_DATA@
PROGS= remind rem2ps
SCRIPTS= $(srcdir)/../scripts/kall $(srcdir)/../scripts/rem \
$(srcdir)/../scripts/tkremind
$(srcdir)/../scripts/tkremind $(srcdir)/../scripts/cm2rem.tcl
MANS= $(srcdir)/../man/kall.1 $(srcdir)/../man/rem.1 \
$(srcdir)/../man/rem2ps.1 $(srcdir)/../man/remind.1 \
$(srcdir)/../man/tkremind.1
$(srcdir)/../man/tkremind.1 $(srcdir)/../man/cm2rem.1
.SUFFIXES:
.SUFFIXES: .c .o
REMINDSRCS= calendar.c dynbuf.c dorem.c dosubst.c expr.c files.c funcs.c \
globals.c hbcal.c init.c main.c moon.c omit.c queue.c sort.c \
token.c trigger.c userfns.c utils.c var.c
globals.c hbcal.c init.c main.c md5.c moon.c omit.c queue.c \
sort.c token.c trigger.c userfns.c utils.c var.c
REMINDHDRS=config.h custom.h dynbuf.h err.h expr.h globals.h lang.h \
md5.h protos.h rem2ps.h types.h version.h
REMINDOBJS= $(REMINDSRCS:.c=.o)
all: remind rem2ps
@@ -39,7 +41,7 @@ test: remind
sh ../tests/test-rem
.c.o:
@CC@ -c @CFLAGS@ @DEFS@ $(LANGDEF) -DUNIX -I. -I$(srcdir) $<
@CC@ -c @CFLAGS@ @DEFS@ $(CEXTRA) $(LANGDEF) -I. -I$(srcdir) $<
rem2ps: rem2ps.o dynbuf.o
@CC@ @LDFLAGS@ -o rem2ps rem2ps.o dynbuf.o
@@ -48,13 +50,15 @@ remind: $(REMINDOBJS)
@CC@ @LDFLAGS@ -o remind $(REMINDOBJS) @LIBS@
install: all
-mkdir -p $(DESTDIR)$(bindir) || true
for prog in $(PROGS) $(SCRIPTS) ; do \
$(INSTALL_PROGRAM) $$prog $(bindir) ; \
$(INSTALL_PROGRAM) $$prog $(DESTDIR)$(bindir) || exit 1; \
done
-strip $(bindir)/remind
-strip $(bindir)/rem2ps
-strip $(DESTDIR)$(bindir)/remind || true
-strip $(DESTDIR)$(bindir)/rem2ps || true
-mkdir -p $(DESTDIR)$(mandir)/man1 || true
for man in $(MANS) ; do \
$(INSTALL_DATA) $$man $(mandir)/man1 ; \
$(INSTALL_DATA) $$man $(DESTDIR)$(mandir)/man1 || exit 1; \
done
clean:
@@ -64,24 +68,23 @@ clobber:
rm -f *.o *~ remind rem2ps test.out core *.bak
depend:
gccmakedep @DEFS@ -DUNIX $(REMINDSRCS) rem2ps.c
gccmakedep @DEFS@ $(REMINDSRCS) rem2ps.c
# The next targets are not very useful to you. I use them to build
# distributions, etc.
# Build a tar file based on all files checked into CVS.
tgz:
ln -s .. remind-$(VERSION)
peekentry `find remind-$(VERSION) -depth -follow -name 'Entries' -print` | xargs tar cvf remind-$(VERSION).tar
gzip -v -9 remind-$(VERSION).tar
mv remind-$(VERSION).tar.gz remind-$(VERSION).tgz
rm -f remind-$(VERSION)
# Build a tar file based on all files checked into git.
distro:
ln -s . ../remind-$(VERSION)
(cd ..; git-ls-files) | sed -e 's/^/remind-$(VERSION)\//' | xargs tar -C .. -cvf remind-$(VERSION).tar
gzip -f -v -9 remind-$(VERSION).tar
rm -f ../remind-$(VERSION)
beta-tgz:
ln -s .. remind-$(VERSION)-BETA
peekentry `find remind-$(VERSION)-BETA -depth -follow -name 'Entries' -print` | xargs tar cvf remind-$(VERSION)-BETA.tar
gzip -v -9 remind-$(VERSION)-BETA.tar
mv remind-$(VERSION)-BETA.tar.gz remind-$(VERSION)-BETA.tgz
rm -f remind-$(VERSION)-BETA
ln -s . ../remind-$(VERSION)-BETA-$(BETA)
(cd ..; git-ls-files) | sed -e 's/^/remind-$(VERSION)-BETA-$(BETA)\//' | xargs tar -C .. -cvf remind-$(VERSION)-BETA-$(BETA).tar
gzip -f -v -9 remind-$(VERSION)-BETA-$(BETA).tar
rm -f ../remind-$(VERSION)-BETA-$(BETA)
#---------------- Stuff after this added by "make depend" -----------------

View File

@@ -1,4 +1,3 @@
#$Id: Makefile_QDOS,v 1.2 1998-03-01 20:43:53 dfs Exp $
# Makefile for REMIND for QDOS / SMSQ
#-----------------------------------------------------------------------------
@@ -24,7 +23,6 @@ LDFLAGS= -bufp200K
# YOU SHOULDN'T EDIT ANYTHING BELOW HERE. You may want to change some things
# in config_h; then, you should be able to type 'make'.
#-----------------------------------------------------------------------------
VERSION= 03.00.19
MATHLIB= -lm
HDRS= config_h err_h expr_h globals_h protos_h types_h version_h \

View File

@@ -8,11 +8,10 @@
/* */
/* This file is part of REMIND. */
/* Remind is Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
#include "config.h"
static char const RCSID[] = "$Id: amiga.c,v 1.3 1999-04-05 17:34:42 dfs Exp $";
#include <stdlib.h>
#include <string.h>

View File

@@ -1,7 +1,4 @@
# Makefile for REMIND for Borland C++
# $Id: makefile.bcc,v 1.2 1998-03-01 20:43:56 dfs Exp $
VERSION= 03.00.19
MODEL=l

View File

@@ -1,5 +1,4 @@
# Makefile for REMIND for Microsoft C for MSDOS
# $Id: makefile.msc,v 1.1 1998-01-15 02:50:32 dfs Exp $
OBJS= calendar.obj dorem.obj dosubst.obj expr.obj files.obj funcs.obj \
globals.obj init.obj main.obj omit.obj token.obj trigger.obj userfns.obj \

View File

@@ -1,7 +1,5 @@
# Makefile for REMIND
#
# $Id: makefile.os2,v 1.1 1998-01-15 02:50:32 dfs Exp $
#
# THIS IS OUT OF DATE!
#
# - for GNU gcc (emx 0.8g kit) [executables for OS/2 2.x or DOS (32-bit)]

View File

@@ -1,8 +1,6 @@
# Makefile for REMIND for Turbo C for MSDOS
# $Id: makefile.tc,v 1.2 1998-03-01 20:43:57 dfs Exp $
CC= tcc
VERSION= 03.00.19
HDRS= config.h err.h expr.h globals.h protos.h types.h version.h \
lang.h english.h german.h dutch.h finnish.h french.h norwgian.h \

View File

@@ -8,12 +8,11 @@
/* */
/* This file is Copyright (C) 1993 by Russ Herman. */
/* REMIND is Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
#include "config.h"
static char const RCSID[] = "$Id: os2func.c,v 1.3 1999-04-05 17:34:54 dfs Exp $";
#ifdef OS2_POPUP
#define INCL_VIO

View File

@@ -1,4 +1,3 @@
# $Id: smakefile,v 1.1 1998-01-15 02:50:36 dfs Exp $
# Makefile for REMIND, suitable for SAS/C 6.50 under AmigaDOS
# English version
# THIS IS OUT OF DATE!

View File

@@ -6,30 +6,24 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
#include "config.h"
static char const RCSID[] = "$Id: calendar.c,v 1.8 1999-04-05 17:34:42 dfs Exp $";
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
#include "types.h"
#include "protos.h"
#include "expr.h"
#include "globals.h"
#include "err.h"
#include "md5.h"
/* Data structures used by the calendar */
typedef struct cal_entry {
@@ -41,6 +35,8 @@ typedef struct cal_entry {
char tag[TAG_LEN+1];
char passthru[PASSTHRU_LEN+1];
int duration;
char *filename;
int lineno;
} CalEntry;
/* Global variables */
@@ -49,22 +45,22 @@ static CalEntry *CalPs[7];
static int ColSpaces;
PRIVATE void SortCol ARGS((CalEntry **col));
PRIVATE void DoCalendarOneWeek ARGS ((void));
PRIVATE void DoCalendarOneMonth ARGS ((void));
PRIVATE int WriteCalendarRow ARGS ((void));
PRIVATE void PrintLeft ARGS ((char *s, int width, char pad));
PRIVATE void PrintCentered ARGS ((char *s, int width, char pad));
PRIVATE int WriteOneCalLine ARGS ((void));
PRIVATE int WriteOneColLine ARGS ((int col));
PRIVATE void GenerateCalEntries ARGS ((int col));
PRIVATE void WriteCalHeader ARGS ((void));
PRIVATE void WriteCalTrailer ARGS ((void));
PRIVATE int DoCalRem ARGS ((ParsePtr p, int col));
PRIVATE void WriteSimpleEntries ARGS ((int col, int jul));
PRIVATE void WriteSolidCalLine ARGS ((void));
PRIVATE void WriteIntermediateCalLine ARGS ((void));
PRIVATE void WriteCalDays ARGS ((void));
static void SortCol (CalEntry **col);
static void DoCalendarOneWeek (void);
static void DoCalendarOneMonth (void);
static int WriteCalendarRow (void);
static void PrintLeft (char *s, int width, char pad);
static void PrintCentered (char *s, int width, char pad);
static int WriteOneCalLine (void);
static int WriteOneColLine (int col);
static void GenerateCalEntries (int col);
static void WriteCalHeader (void);
static void WriteCalTrailer (void);
static int DoCalRem (ParsePtr p, int col);
static void WriteSimpleEntries (int col, int jul);
static void WriteSolidCalLine (void);
static void WriteIntermediateCalLine (void);
static void WriteCalDays (void);
/***************************************************************/
/* */
@@ -73,11 +69,7 @@ PRIVATE void WriteCalDays ARGS ((void));
/* Main loop for generating a calendar. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void ProduceCalendar(void)
#else
void ProduceCalendar()
#endif
void ProduceCalendar(void)
{
int y, m, d;
@@ -88,7 +80,7 @@ void ProduceCalendar()
if (CalMonths) {
FromJulian(JulianToday, &y, &m, &d);
JulianToday = Julian(y, m, 1);
JulianToday = Julian(y, m, 1);
while (CalMonths--)
DoCalendarOneMonth();
return;
@@ -115,11 +107,7 @@ void ProduceCalendar()
/* Write a calendar for a single week */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void DoCalendarOneWeek(void)
#else
static void DoCalendarOneWeek()
#endif
static void DoCalendarOneWeek(void)
{
int y, m, d, done, i, l, wd;
char buf[81];
@@ -148,9 +136,9 @@ static void DoCalendarOneWeek()
PutChar('|');
for (i=0; i<7; i++) {
FromJulian(OrigJul+i, &y, &m, &d);
sprintf(buf, "%d %c%c%c ", d, MonthName[m][0], MonthName[m][1],
sprintf(buf, "%d %c%c%c ", d, MonthName[m][0], MonthName[m][1],
MonthName[m][2]);
if (OrigJul+i == RealToday)
if (OrigJul+i == RealToday)
PrintLeft(buf, ColSpaces, '*');
else
PrintLeft(buf, ColSpaces, ' ');
@@ -183,7 +171,7 @@ static void DoCalendarOneWeek()
PutChar('\n');
}
/* Write the final line */
/* Write the final line */
WriteIntermediateCalLine();
}
@@ -194,11 +182,7 @@ static void DoCalendarOneWeek()
/* Produce a calendar for the current month. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void DoCalendarOneMonth(void)
#else
static void DoCalendarOneMonth()
#endif
static void DoCalendarOneMonth(void)
{
int y, m, d, mm, yy;
@@ -229,7 +213,7 @@ static void DoCalendarOneMonth()
if (PsCal) printf("%s\n", PSEND);
if (!DoSimpleCalendar) WriteCalTrailer();
}
}
/***************************************************************/
/* */
@@ -238,11 +222,7 @@ static void DoCalendarOneMonth()
/* Write one row of the calendar */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int WriteCalendarRow(void)
#else
static int WriteCalendarRow()
#endif
static int WriteCalendarRow(void)
{
int y, m, d, wd, i, l;
int done;
@@ -271,7 +251,7 @@ static int WriteCalendarRow()
}
return (d+7-wd <= DaysInMonth(m, y));
}
/* Here come the first few lines... */
PutChar('|');
@@ -324,14 +304,7 @@ static int WriteCalendarRow()
/* Left-justify a piece of text. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void PrintLeft(char *s, int width, char pad)
#else
static void PrintLeft(s, width, pad)
char *s;
int width;
char pad;
#endif
static void PrintLeft(char *s, int width, char pad)
{
int len = strlen(s);
printf("%s", s);
@@ -345,14 +318,7 @@ char pad;
/* Center a piec of text */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void PrintCentered(char *s, int width, char pad)
#else
static void PrintCentered(s, width, pad)
char *s;
int width;
char pad;
#endif
static void PrintCentered(char *s, int width, char pad)
{
int len = strlen(s);
int d = (width - len) / 2;
@@ -372,11 +338,7 @@ char pad;
/* Write a single line. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int WriteOneCalLine(void)
#else
static int WriteOneCalLine()
#endif
static int WriteOneCalLine(void)
{
int done = 1, i;
@@ -394,7 +356,7 @@ static int WriteOneCalLine()
return done;
}
/***************************************************************/
/* */
/* WriteOneColLine */
@@ -403,12 +365,7 @@ static int WriteOneCalLine()
/* the column still has entries; 0 otherwise. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int WriteOneColLine(int col)
#else
static int WriteOneColLine(col)
int col;
#endif
static int WriteOneColLine(int col)
{
CalEntry *e = CalColumn[col];
char *s;
@@ -425,6 +382,7 @@ int col;
PrintLeft("", ColSpaces, ' ');
CalColumn[col] = e->next;
free(e->text);
free(e->filename);
free(e);
return 1;
}
@@ -464,6 +422,7 @@ int col;
if (!*s && !e->next) {
CalColumn[col] = e->next;
free(e->text);
free(e->filename);
free(e);
} else {
e->pos = s;
@@ -478,12 +437,7 @@ int col;
/* Generate the calendar entries for the ith column */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void GenerateCalEntries(int col)
#else
static void GenerateCalEntries(col)
int col;
#endif
static void GenerateCalEntries(int col)
{
int r;
Token tok;
@@ -527,7 +481,7 @@ int col;
switch(tok.type) {
case T_Empty:
case T_Empty:
case T_Comment:
break;
@@ -544,7 +498,7 @@ int col;
case T_UnSet: r=DoUnset(&p); break;
case T_Clr: r=DoClear(&p); break;
case T_Flush: r=DoFlush(&p); break;
case T_Debug: break; /* IGNORE DEBUG CMD */
case T_Debug: break; /* IGNORE DEBUG CMD */
case T_Dumpvars: break; /* IGNORE DUMPVARS CMD */
case T_Banner: break; /* IGNORE BANNER CMD */
case T_Omit: r=DoOmit(&p);
@@ -556,7 +510,7 @@ int col;
break;
case T_Pop: r=PopOmitContext(&p); break;
case T_Push: r=PushOmitContext(&p); break;
case T_Preserve: r=DoPreserve(&p); break;
case T_Preserve: r=DoPreserve(&p); break;
case T_RemType: if (tok.val == RUN_TYPE) {
r=DoRun(&p);
break;
@@ -588,11 +542,7 @@ int col;
/* WriteCalHeader */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void WriteCalHeader(void)
#else
static void WriteCalHeader()
#endif
static void WriteCalHeader(void)
{
char buf[80];
int y, m, d;
@@ -617,11 +567,7 @@ static void WriteCalHeader()
/* WriteCalTrailer */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void WriteCalTrailer(void)
#else
static void WriteCalTrailer()
#endif
static void WriteCalTrailer(void)
{
PutChar('\f');
}
@@ -633,13 +579,7 @@ static void WriteCalTrailer()
/* Do the REM command in the context of a calendar. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int DoCalRem(ParsePtr p, int col)
#else
static int DoCalRem(p, col)
ParsePtr p;
int col;
#endif
static int DoCalRem(ParsePtr p, int col)
{
int oldLen;
Trigger trig;
@@ -660,9 +600,7 @@ int col;
if ( (r=ParseRem(p, &trig, &tim)) ) return r;
/* Don't include timed reminders in calendar if -a option supplied. */
#ifdef HAVE_QUEUED
if (DontIssueAts && tim.ttime != NO_TIME) return OK;
#endif
if (trig.typ == NO_TYPE) return E_EOLN;
if (trig.typ == SAT_TYPE) {
r=DoSatRemind(&trig, &tim, p);
@@ -700,22 +638,49 @@ int col;
strcpy(trig.passthru, "PSFile");
trig.typ = PASSTHRU_TYPE;
}
if (!PsCal && trig.typ == PASSTHRU_TYPE) return OK;
if (!PsCal) {
if (trig.typ == PASSTHRU_TYPE) {
if (strcmp(trig.passthru, "COLOR")) return OK;
/* Strip off the three color numbers */
DBufFree(&buf);
r=ParseToken(p, &buf);
DBufFree(&buf);
if (r) return r;
r=ParseToken(p, &buf);
DBufFree(&buf);
if (r) return r;
r=ParseToken(p, &buf);
DBufFree(&buf);
if (r) return r;
}
}
/* Remove any "at" times from PS or PSFILE reminders */
if (trig.typ == PASSTHRU_TYPE) {
if (trig.typ == PASSTHRU_TYPE && strcmp(trig.passthru, "COLOR")) {
tim.ttime = NO_TIME;
tim.duration = NO_TIME;
}
/* If trigger date == today, add it to the current entry */
/* If trigger date == today, add it to the current entry */
DBufInit(&obuf);
if (jul == JulianToday) {
if ((jul == JulianToday) ||
(DoSimpleCalendar &&
DoSimpleCalDelta &&
ShouldTriggerReminder(&trig, &tim, jul))) {
NumTriggered++;
if (DoSimpleCalendar || tim.ttime != NO_TIME) {
if (DBufPuts(&obuf, SimpleTime(tim.ttime)) != OK) {
DBufFree(&obuf);
return E_NO_MEM;
/* Suppress time if it's not today */
if (jul != JulianToday) {
if (DBufPuts(&obuf, SimpleTime(NO_TIME)) != OK) {
DBufFree(&obuf);
return E_NO_MEM;
}
} else {
if (DBufPuts(&obuf, SimpleTime(tim.ttime)) != OK) {
DBufFree(&obuf);
return E_NO_MEM;
}
}
}
if (trig.typ != PASSTHRU_TYPE &&
@@ -736,7 +701,15 @@ int col;
}
}
oldLen = DBufLen(&obuf);
if ( (r=DoSubst(p, &obuf, &trig, &tim, jul, CAL_MODE)) ) {
/* In -sa mode, run in ADVANCE mode if we're triggering
* before the actual date */
if (jul != JulianToday) {
r = DoSubst(p, &obuf, &trig, &tim, jul, ADVANCE_MODE);
} else {
r = DoSubst(p, &obuf, &trig, &tim, jul, CAL_MODE);
}
if (r) {
DBufFree(&obuf);
return r;
}
@@ -776,11 +749,28 @@ int col;
}
StrnCpy(e->tag, trig.tag, TAG_LEN);
if (!e->tag[0]) {
strcpy(e->tag, "*");
if (SynthesizeTags) {
SynthesizeTag(e->tag);
} else {
strcpy(e->tag, "*");
}
}
e->duration = tim.duration;
e->priority = trig.priority;
if (trig.typ == PASSTHRU_TYPE) {
e->filename = StrDup(FileName);
if(!e->filename) {
free(e);
return E_NO_MEM;
}
e->lineno = LineNo;
/* Ugly hack... SPECIAL COLOR and SPECIAL HTML are not treated
as "passthru" to preserve ordering and make them behave like
a MSG-type reminder */
if (trig.typ == PASSTHRU_TYPE &&
strcmp(trig.passthru, "COLOR") &&
strcmp(trig.passthru, "HTML")) {
StrnCpy(e->passthru, trig.passthru, PASSTHRU_LEN);
e->pos = e->passthru;
e->time = NO_TIME;
@@ -788,8 +778,17 @@ int col;
CalPs[col] = e;
SortCol(&CalPs[col]);
} else {
if (trig.typ == PASSTHRU_TYPE) {
StrnCpy(e->passthru, trig.passthru, PASSTHRU_LEN);
} else {
e->passthru[0] = 0;
}
e->pos = e->text;
e->time = tim.ttime;
if (jul == JulianToday) {
e->time = tim.ttime;
} else {
e->time = NO_TIME;
}
e->next = CurCol;
CalColumn[col] = e;
SortCol(&CalColumn[col]);
@@ -805,12 +804,7 @@ int col;
/* Write entries in 'simple calendar' format. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void WriteSimpleEntries(int col, int jul)
#else
static void WriteSimpleEntries(col, jul)
int col, jul;
#endif
static void WriteSimpleEntries(int col, int jul)
{
CalEntry *e = CalPs[col];
CalEntry *n;
@@ -819,9 +813,9 @@ int col, jul;
/* Do all the PASSTHRU entries first, if any */
FromJulian(jul, &y, &m, &d);
while(e) {
if (DoPrefixLineNo) printf("# fileinfo %d %s\n", e->lineno, e->filename);
printf("%04d/%02d/%02d ", y, m+1, d);
printf("%s ", e->passthru);
printf("%s ", e->tag);
printf("%s %s ", e->passthru, e->tag);
if (e->duration != NO_TIME) {
printf("%d ", e->duration);
} else {
@@ -834,16 +828,23 @@ int col, jul;
}
printf("%s\n", e->text);
free(e->text);
free(e->filename);
n = e->next;
free(e);
e = n;
}
CalPs[col] = NULL;
e = CalColumn[col];
e = CalColumn[col];
while(e) {
if (DoPrefixLineNo) printf("# fileinfo %d %s\n", e->lineno, e->filename);
printf("%04d/%02d/%02d", y, m+1, d);
printf(" * %s ", e->tag);
if (e->passthru[0]) {
printf(" %s", e->passthru);
} else {
printf(" *");
}
printf(" %s ", e->tag);
if (e->duration != NO_TIME) {
printf("%d ", e->duration);
} else {
@@ -856,6 +857,7 @@ int col, jul;
}
printf("%s\n", e->text);
free(e->text);
free(e->filename);
n = e->next;
free(e);
e = n;
@@ -868,11 +870,7 @@ int col, jul;
/* Various functions for writing different types of lines. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void WriteSolidCalLine(void)
#else
static void WriteSolidCalLine()
#endif
static void WriteSolidCalLine(void)
{
PutChar('+');
PrintCentered("", CalWidth-2, '-');
@@ -880,11 +878,7 @@ static void WriteSolidCalLine()
PutChar('\n');
}
#ifdef HAVE_PROTOS
PRIVATE void WriteIntermediateCalLine(void)
#else
static void WriteIntermediateCalLine()
#endif
static void WriteIntermediateCalLine(void)
{
int i;
@@ -896,11 +890,7 @@ static void WriteIntermediateCalLine()
PutChar('\n');
}
#ifdef HAVE_PROTOS
PRIVATE void WriteCalDays(void)
#else
static void WriteCalDays()
#endif
static void WriteCalDays(void)
{
int i;
PutChar('|');
@@ -923,18 +913,13 @@ static void WriteCalDays()
/* A trailing space is always added. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC char *SimpleTime(int tim)
#else
char *SimpleTime(tim)
int tim;
#endif
char *SimpleTime(int tim)
{
static char buf[32];
int h, min, hh;
buf[0] = 0;
switch(ScFormat) {
case SC_AMPM:
@@ -944,7 +929,7 @@ int tim;
if (h == 0) hh=12;
else if (h > 12) hh=h-12;
else hh=h;
sprintf(buf, "%2d%c%02d%s ", hh, TIMESEP, min, (h>=12) ? L_PM : L_AM);
sprintf(buf, "%2d%c%02d%s ", hh, TimeSep, min, (h>=12) ? L_PM : L_AM);
}
break;
@@ -952,7 +937,7 @@ int tim;
if (tim != NO_TIME) {
h = tim / 60;
min = tim % 60;
sprintf(buf, "%02d%c%02d ", h, TIMESEP, min);
sprintf(buf, "%02d%c%02d ", h, TimeSep, min);
}
break;
}
@@ -966,12 +951,7 @@ int tim;
/* Sort the calendar entries in a column by time and priority */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void SortCol(CalEntry **col)
#else
static void SortCol(col)
CalEntry **col;
#endif
static void SortCol(CalEntry **col)
{
CalEntry *cur, *prev, *next;
@@ -1000,3 +980,22 @@ CalEntry **col;
}
}
}
void SynthesizeTag(char *out)
{
struct MD5Context ctx;
unsigned char buf[16];
MD5Init(&ctx);
MD5Update(&ctx, (unsigned char *) CurLine, strlen(CurLine));
MD5Final(buf, &ctx);
sprintf(out, "__syn__%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
(unsigned int) buf[0], (unsigned int) buf[1],
(unsigned int) buf[2], (unsigned int) buf[3],
(unsigned int) buf[4], (unsigned int) buf[5],
(unsigned int) buf[6], (unsigned int) buf[7],
(unsigned int) buf[8], (unsigned int) buf[9],
(unsigned int) buf[10], (unsigned int) buf[11],
(unsigned int) buf[12], (unsigned int) buf[13],
(unsigned int) buf[14], (unsigned int) buf[15]);
}

View File

@@ -1,80 +1,28 @@
/* src/config.h.in. Generated automatically from configure.in by autoheader. */
/* $Id: config.h.in,v 1.3 1998-02-16 03:41:44 dfs Exp $ */
/* Define to empty if the keyword does not work. */
#undef const
/* Define to `int' if <sys/types.h> doesn't define. */
#undef gid_t
/* Define if you don't have vprintf but do have _doprnt. */
#undef HAVE_DOPRNT
/* Define if utime(file, NULL) sets file's timestamp to the present. */
#undef HAVE_UTIME_NULL
/* Define if you have the vprintf function. */
#undef HAVE_VPRINTF
/* Define to `int' if <sys/types.h> doesn't define. */
#undef pid_t
/* Define as the return type of signal handlers (int or void). */
#undef RETSIGTYPE
/* Define if you have the ANSI C header files. */
#undef STDC_HEADERS
/* Define if you can safely include both <sys/time.h> and <time.h>. */
#undef TIME_WITH_SYS_TIME
/* Define if your <sys/time.h> declares struct tm. */
#undef TM_IN_SYS_TIME
/* Define to `int' if <sys/types.h> doesn't define. */
#undef uid_t
/* Define if you have the mktime function. */
#undef HAVE_MKTIME
/* Define if you have the putenv function. */
#undef HAVE_PUTENV
/* Define if you have the strstr function. */
#undef HAVE_STRSTR
/* Define if you have the timegm function. */
#undef HAVE_TIMEGM
/* Define if you have the difftime function. */
#undef HAVE_DIFFTIME
/* Define if you have the <pwd.h> header file. */
#undef HAVE_PWD_H
/* Define if you have the <malloc.h> header file. */
#undef HAVE_MALLOC_H
/* Define if you have the <stdarg.h> header file. */
#undef HAVE_STDARG_H
/* Define if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H
/* Define if you have the <sys/file.h> header file. */
#undef HAVE_SYS_FILE_H
/* Define if you have the <sys/time.h> header file. */
#undef HAVE_SYS_TIME_H
#undef HAVE_SETENV
/* Define if you have the <sys/types.h> header file. */
#undef HAVE_SYS_TYPES_H
#undef HAVE_UNSETENV
/* Define if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
/* The number of bytes in a unsigned int. */
#undef SIZEOF_UNSIGNED_INT
/* Define if you have the m library (-lm). */
#undef HAVE_LIBM
/* The number of bytes in a unsigned long. */
#undef SIZEOF_UNSIGNED_LONG
/* The number of bytes in a unsigned short. */
#undef SIZEOF_UNSIGNED_SHORT
#include "custom.h"

View File

@@ -7,12 +7,10 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
/* $Id: custom.h,v 1.19 1999-04-05 17:42:35 dfs Exp $ */
/*---------------------------------------------------------------------*/
/* LAT_DEG, LAT_MIN and LAT_SEC: Latitude of your location */
/* LON_DEG, LON_MIN and LON_SEC: Longitude of your location */
@@ -41,11 +39,11 @@
/* #define DEFAULT_PAGE {"A4", 595, 842} */
/*---------------------------------------------------------------------*/
/* DATESEP: The default date separator. North American usage is '/'; */
/* others may prefer '-'. */
/* DATESEP: The default date separator. Standard usage is '-'; */
/* others may prefer '/'. */
/*---------------------------------------------------------------------*/
#define DATESEP '/'
/* #define DATESEP '-' */
#define DATESEP '-'
/* #define DATESEP '/' */
/*---------------------------------------------------------------------*/
/* TIMESEP: The default time separator. North American usage is ':'; */
@@ -134,19 +132,16 @@
#define BASE 1990
/*---------------------------------------------------------------------*/
/* YR_RANGE: The range of years allowed. Computers with 16-bit */
/* integers can handle about 89 years worth of reminders; if */
/* you use 32-bit integers, you can handle over 5 867 000 */
/* years. Note that YR_RANGE is set to 88 rather than 89 */
/* because we can range up to the last day of the 88th year. */
/* YR_RANGE: The range of years allowed. With 32-bit signed integers, */
/* the DATETIME type can store 2^31 minutes or about 4074 years. */
/*---------------------------------------------------------------------*/
#define YR_RANGE 88
#define YR_RANGE 4000
/*---------------------------------------------------------------------*/
/* VAR_NAME_LEN: The maximum length of variable names. Don't make it */
/* any less than 12. */
/*---------------------------------------------------------------------*/
#define VAR_NAME_LEN 12
#define VAR_NAME_LEN 16
/*---------------------------------------------------------------------*/
/* MAX_PRT_LEN: The maximum number of characters to print when */
@@ -175,35 +170,20 @@
/*---------------------------------------------------------------------*/
#define IF_NEST (4*sizeof(unsigned int))
/*---------------------------------------------------------------------*/
/* Do we handle queued reminders? */
/*---------------------------------------------------------------------*/
#if defined(UNIX) || defined(__OS2__)
#define HAVE_QUEUED 1
#endif
/*---------------------------------------------------------------------*/
/* Does our C compiler have prototypes? Override this test if you */
/* are using a non-ANSI compiler that nevertheless has prototypes. */
/*---------------------------------------------------------------------*/
#if defined(__STDC__) || defined(__TURBOC__) || defined(__BORLANDC__)
#define HAVE_PROTOS 1
#endif
/*---------------------------------------------------------------------*/
/* How many attempts to resolve a weird date spec? */
/*---------------------------------------------------------------------*/
#define TRIG_ATTEMPTS 25
#define TRIG_ATTEMPTS 50
/*---------------------------------------------------------------------*/
/* How many global omits of the form YYYY MM DD do we handle? */
/*---------------------------------------------------------------------*/
#define MAX_FULL_OMITS 75
#define MAX_FULL_OMITS 250
/*---------------------------------------------------------------------*/
/* How many global omits of the form MM DD do we handle? */
/*---------------------------------------------------------------------*/
#define MAX_PARTIAL_OMITS 75
#define MAX_PARTIAL_OMITS 250
/*---------------------------------------------------------------------*/
/* A newline - some systems need "\n\r" */
@@ -222,17 +202,9 @@
/*---------------------------------------------------------------------*/
/* TAG_LEN: The maximum length of tags. Don't change it */
/*---------------------------------------------------------------------*/
#define TAG_LEN 32
#define TAG_LEN 48
#define PASSTHRU_LEN 24
#define PUBLIC
#define PRIVATE static
#ifdef UNIX
#define _POSIX_SOURCE
#define _SVID_SOURCE
#endif
#define PASSTHRU_LEN 32
#define PSBEGIN "# rem2ps begin"
#define PSEND "# rem2ps end"

View File

@@ -7,12 +7,10 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
/* $Id: custom.h.in,v 1.6 1999-04-05 17:34:43 dfs Exp $ */
/*---------------------------------------------------------------------*/
/* LAT_DEG, LAT_MIN and LAT_SEC: Latitude of your location */
/* LON_DEG, LON_MIN and LON_SEC: Longitude of your location */
@@ -41,11 +39,11 @@
/* #define DEFAULT_PAGE {"A4", 595, 842} */
/*---------------------------------------------------------------------*/
/* DATESEP: The default date separator. North American usage is '/'; */
/* others may prefer '-'. */
/* DATESEP: The default date separator. Standard usage is '-'; */
/* others may prefer '/'. */
/*---------------------------------------------------------------------*/
#define DATESEP '/'
/* #define DATESEP '-' */
#define DATESEP '-'
/* #define DATESEP '/' */
/*---------------------------------------------------------------------*/
/* TIMESEP: The default time separator. North American usage is ':'; */
@@ -134,19 +132,16 @@
#define BASE 1990
/*---------------------------------------------------------------------*/
/* YR_RANGE: The range of years allowed. Computers with 16-bit */
/* integers can handle about 89 years worth of reminders; if */
/* you use 32-bit integers, you can handle over 5 867 000 */
/* years. Note that YR_RANGE is set to 88 rather than 89 */
/* because we can range up to the last day of the 88th year. */
/* YR_RANGE: The range of years allowed. With 32-bit signed integers, */
/* the DATETIME type can store 2^31 minutes or about 4074 years. */
/*---------------------------------------------------------------------*/
#define YR_RANGE 88
#define YR_RANGE 4000
/*---------------------------------------------------------------------*/
/* VAR_NAME_LEN: The maximum length of variable names. Don't make it */
/* any less than 12. */
/*---------------------------------------------------------------------*/
#define VAR_NAME_LEN 12
#define VAR_NAME_LEN 16
/*---------------------------------------------------------------------*/
/* MAX_PRT_LEN: The maximum number of characters to print when */
@@ -175,35 +170,20 @@
/*---------------------------------------------------------------------*/
#define IF_NEST (4*sizeof(unsigned int))
/*---------------------------------------------------------------------*/
/* Do we handle queued reminders? */
/*---------------------------------------------------------------------*/
#if defined(UNIX) || defined(__OS2__)
#define HAVE_QUEUED 1
#endif
/*---------------------------------------------------------------------*/
/* Does our C compiler have prototypes? Override this test if you */
/* are using a non-ANSI compiler that nevertheless has prototypes. */
/*---------------------------------------------------------------------*/
#if defined(__STDC__) || defined(__TURBOC__) || defined(__BORLANDC__)
#define HAVE_PROTOS 1
#endif
/*---------------------------------------------------------------------*/
/* How many attempts to resolve a weird date spec? */
/*---------------------------------------------------------------------*/
#define TRIG_ATTEMPTS 25
#define TRIG_ATTEMPTS 50
/*---------------------------------------------------------------------*/
/* How many global omits of the form YYYY MM DD do we handle? */
/*---------------------------------------------------------------------*/
#define MAX_FULL_OMITS 75
#define MAX_FULL_OMITS 250
/*---------------------------------------------------------------------*/
/* How many global omits of the form MM DD do we handle? */
/*---------------------------------------------------------------------*/
#define MAX_PARTIAL_OMITS 75
#define MAX_PARTIAL_OMITS 250
/*---------------------------------------------------------------------*/
/* A newline - some systems need "\n\r" */
@@ -222,17 +202,9 @@
/*---------------------------------------------------------------------*/
/* TAG_LEN: The maximum length of tags. Don't change it */
/*---------------------------------------------------------------------*/
#define TAG_LEN 32
#define TAG_LEN 48
#define PASSTHRU_LEN 24
#define PUBLIC
#define PRIVATE static
#ifdef UNIX
#define _POSIX_SOURCE
#define _SVID_SOURCE
#endif
#define PASSTHRU_LEN 32
#define PSBEGIN "# rem2ps begin"
#define PSEND "# rem2ps end"

View File

@@ -8,24 +8,16 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
#include "config.h"
static char const RCSID[] = "$Id: dorem.c,v 1.8 1999-04-05 17:34:44 dfs Exp $";
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
#include "globals.h"
#include "err.h"
@@ -33,20 +25,16 @@ static char const RCSID[] = "$Id: dorem.c,v 1.8 1999-04-05 17:34:44 dfs Exp $";
#include "protos.h"
#include "expr.h"
/* Define the shell characters to escape */
static char const EscapeMe[] =
#ifdef QDOS
"\"'!$%^&*()|<>[]{}\x9F~;?\\";
#else
"\"'!$%^&*()|<>[]{}`~;?\\";
#endif
/* Define the shell characters not to escape */
static char const DontEscapeMe[] =
"1234567890_-=+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@.,";
PRIVATE int ParseTimeTrig ARGS ((ParsePtr s, TimeTrig *tim));
PRIVATE int ParseLocalOmit ARGS ((ParsePtr s, Trigger *t));
PRIVATE int ParseScanFrom ARGS ((ParsePtr s, Trigger *t));
PRIVATE int ParsePriority ARGS ((ParsePtr s, Trigger *t));
PRIVATE int ParseUntil ARGS ((ParsePtr s, Trigger *t));
PRIVATE int ShouldTriggerBasedOnWarn ARGS ((Trigger *t, int jul));
static int ParseTimeTrig (ParsePtr s, TimeTrig *tim);
static int ParseLocalOmit (ParsePtr s, Trigger *t);
static int ParseScanFrom (ParsePtr s, Trigger *t, int type);
static int ParsePriority (ParsePtr s, Trigger *t);
static int ParseUntil (ParsePtr s, Trigger *t);
static int ShouldTriggerBasedOnWarn (Trigger *t, int jul);
/***************************************************************/
/* */
@@ -55,12 +43,7 @@ PRIVATE int ShouldTriggerBasedOnWarn ARGS ((Trigger *t, int jul));
/* Do the REM command. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoRem(ParsePtr p)
#else
int DoRem(p)
ParsePtr p;
#endif
int DoRem(ParsePtr p)
{
Trigger trig;
@@ -109,9 +92,8 @@ ParsePtr p;
jul = ComputeTrigger(trig.scanfrom, &trig, &r);
if (r) return r;
}
/* Queue the reminder, if necessary */
#ifdef HAVE_QUEUED
if (jul == JulianToday &&
!(!IgnoreOnce &&
trig.once != NO_ONCE &&
@@ -119,15 +101,9 @@ ParsePtr p;
QueueReminder(p, &trig, &tim, trig.sched);
/* If we're in daemon mode, do nothing over here */
if (Daemon) return OK;
#endif
if (ShouldTriggerReminder(&trig, &tim, jul)) {
#ifdef OS2_POPUP
if ( (r=TriggerReminder(p, &trig, &tim, jul, 0)) )
#else
if ( (r=TriggerReminder(p, &trig, &tim, jul)) )
#endif
if ( (r=TriggerReminder(p, &trig, &tim, jul)) )
{
return r;
}
@@ -144,14 +120,7 @@ ParsePtr p;
/* trigger structure. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
#else
int ParseRem(s, trig, tim)
ParsePtr s;
Trigger *trig;
TimeTrig *tim;
#endif
int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
{
register int r;
DynamicBuffer buf;
@@ -180,6 +149,7 @@ PUBLIC int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
tim->delta = NO_DELTA;
tim->rep = NO_REP;
tim->duration = NO_TIME;
LastTriggerTime = NO_TIME;
while(1) {
/* Read space-delimited string */
@@ -221,7 +191,7 @@ PUBLIC int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
case T_Scanfrom:
DBufFree(&buf);
r=ParseScanFrom(s, trig);
r=ParseScanFrom(s, trig, tok.val);
if (r) return r;
break;
@@ -314,6 +284,7 @@ PUBLIC int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
DBufFree(&buf);
switch(tok.type) {
case T_Time:
case T_LongTime:
tim->duration = tok.val;
break;
default:
@@ -328,6 +299,11 @@ PUBLIC int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
DBufFree(&buf);
break;
case T_LongTime:
DBufFree(&buf);
return E_BAD_TIME;
break;
default:
PushToken(DBufValue(&buf), s);
DBufFree(&buf);
@@ -344,13 +320,7 @@ PUBLIC int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
/* ParseTimeTrig - parse the AT part of a timed reminder */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int ParseTimeTrig(ParsePtr s, TimeTrig *tim)
#else
static int ParseTimeTrig(s, tim)
ParsePtr s;
TimeTrig *tim;
#endif
static int ParseTimeTrig(ParsePtr s, TimeTrig *tim)
{
Token tok;
int r;
@@ -396,13 +366,7 @@ PRIVATE int ParseTimeTrig(ParsePtr s, TimeTrig *tim)
/* reminder. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int ParseLocalOmit(ParsePtr s, Trigger *t)
#else
static int ParseLocalOmit(s, t)
ParsePtr s;
Trigger *t;
#endif
static int ParseLocalOmit(ParsePtr s, Trigger *t)
{
Token tok;
int r;
@@ -432,13 +396,7 @@ PRIVATE int ParseLocalOmit(ParsePtr s, Trigger *t)
/* ParseUntil - parse the UNTIL portion of a reminder */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int ParseUntil(ParsePtr s, Trigger *t)
#else
static int ParseUntil(s, t)
ParsePtr s;
Trigger *t;
#endif
static int ParseUntil(ParsePtr s, Trigger *t)
{
int y = NO_YR,
m = NO_MON,
@@ -503,16 +461,10 @@ PRIVATE int ParseUntil(ParsePtr s, Trigger *t)
/***************************************************************/
/* */
/* ParseScanFrom - parse the SCANFROM portion of a reminder */
/* ParseScanFrom - parse the FROM/SCANFROM portion */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int ParseScanFrom(ParsePtr s, Trigger *t)
#else
static int ParseScanFrom(s, t)
ParsePtr s;
Trigger *t;
#endif
static int ParseScanFrom(ParsePtr s, Trigger *t, int type)
{
int y = NO_YR,
m = NO_MON,
@@ -522,6 +474,12 @@ PRIVATE int ParseScanFrom(ParsePtr s, Trigger *t)
int r;
DynamicBuffer buf;
DBufInit(&buf);
char const *word;
if (type == SCANFROM_TYPE) {
word = "SCANFROM";
} else {
word = "FROM";
}
if (t->scanfrom != NO_DATE) return E_SCAN_TWICE;
@@ -533,7 +491,7 @@ PRIVATE int ParseScanFrom(ParsePtr s, Trigger *t)
case T_Year:
DBufFree(&buf);
if (y != NO_YR) {
Eprint("SCANFROM: %s", ErrMsg[E_YR_TWICE]);
Eprint("%s: %s", word, ErrMsg[E_YR_TWICE]);
return E_YR_TWICE;
}
y = tok.val;
@@ -542,7 +500,7 @@ PRIVATE int ParseScanFrom(ParsePtr s, Trigger *t)
case T_Month:
DBufFree(&buf);
if (m != NO_MON) {
Eprint("SCANFROM: %s", ErrMsg[E_MON_TWICE]);
Eprint("%s: %s", word, ErrMsg[E_MON_TWICE]);
return E_MON_TWICE;
}
m = tok.val;
@@ -551,7 +509,7 @@ PRIVATE int ParseScanFrom(ParsePtr s, Trigger *t)
case T_Day:
DBufFree(&buf);
if (d != NO_DAY) {
Eprint("SCANFROM: %s", ErrMsg[E_DAY_TWICE]);
Eprint("%s: %s", word, ErrMsg[E_DAY_TWICE]);
return E_DAY_TWICE;
}
d = tok.val;
@@ -559,7 +517,7 @@ PRIVATE int ParseScanFrom(ParsePtr s, Trigger *t)
default:
if (y == NO_YR || m == NO_MON || d == NO_DAY) {
Eprint("SCANFROM: %s", ErrMsg[E_INCOMPLETE]);
Eprint("%s: %s", word, ErrMsg[E_INCOMPLETE]);
DBufFree(&buf);
return E_INCOMPLETE;
}
@@ -568,6 +526,12 @@ PRIVATE int ParseScanFrom(ParsePtr s, Trigger *t)
return E_BAD_DATE;
}
t->scanfrom = Julian(y, m, d);
if (type == FROM_TYPE) {
if (t->scanfrom < JulianToday) {
t->scanfrom = JulianToday;
}
}
PushToken(DBufValue(&buf), s);
DBufFree(&buf);
return OK;
@@ -581,57 +545,45 @@ PRIVATE int ParseScanFrom(ParsePtr s, Trigger *t)
/* Trigger the reminder if it's a RUN or MSG type. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
#ifdef OS2_POPUP
PUBLIC int TriggerReminder(ParsePtr p, Trigger *t, TimeTrig *tim, int jul,
int AsPopUp)
#else /* ! OS2_POPUP */
PUBLIC int TriggerReminder(ParsePtr p, Trigger *t, TimeTrig *tim, int jul)
#endif /* OS2_POPUP */
#else /* ! HAVE_PROTOS */
#ifdef OS2_POPUP
int TriggerReminder(p, t, tim, jul, AsPopUp)
ParsePtr p;
Trigger *t;
TimeTrig *tim;
int jul;
int AsPopUp;
#else /* ! OS2_POPUP */
int TriggerReminder(p, t, tim, jul)
ParsePtr p;
Trigger *t;
TimeTrig *tim;
int jul;
#endif /* OS2_POPUP */
#endif /* HAVE_PROTOS */
int TriggerReminder(ParsePtr p, Trigger *t, TimeTrig *tim, int jul)
{
int r, y, m, d;
char PrioExpr[25];
DynamicBuffer buf;
char tmpBuf[64];
DynamicBuffer buf, calRow;
char *s;
Value v;
DBufInit(&buf);
DBufInit(&calRow);
if (t->typ == RUN_TYPE && RunDisabled) return E_RUN_DISABLED;
if (t->typ == PASSTHRU_TYPE ||
if ((t->typ == PASSTHRU_TYPE && strcmp(t->passthru, "COLOR")) ||
t->typ == CAL_TYPE ||
t->typ == PS_TYPE ||
t->typ == PSF_TYPE)
return OK;
/* Handle COLOR types */
if (t->typ == PASSTHRU_TYPE && !strcmp(t->passthru, "COLOR")) {
/* Strip off three tokens */
r = ParseToken(p, &buf);
DBufFree(&buf);
if (r) return r;
r = ParseToken(p, &buf);
DBufFree(&buf);
if (r) return r;
r = ParseToken(p, &buf);
DBufFree(&buf);
if (r) return r;
t->typ = MSG_TYPE;
}
/* If it's a MSG-type reminder, and no -k option was used, issue the banner. */
if ((t->typ == MSG_TYPE || t->typ == MSF_TYPE)
&& !NumTriggered && !NextMode && !MsgCommand) {
if (!DoSubstFromString(DBufValue(&Banner), &buf,
JulianToday, NO_TIME) &&
DBufLen(&buf)) {
#ifdef OS2_POPUP
if (AsPopUp)
PutlPopUp(DBufValue(&buf));
else
printf("%s\n", DBufValue(&buf));
#else
printf("%s\n", DBufValue(&buf));
#endif
}
DBufFree(&buf);
}
@@ -645,25 +597,54 @@ PUBLIC int TriggerReminder(ParsePtr p, Trigger *t, TimeTrig *tim, int jul,
return OK;
}
FromJulian(jul, &y, &m, &d);
#ifdef OS2_POPUP
if (AsPopUp) {
char tmpBuf[64];
sprintf(tmpBuf, "%04d%c%02d%c%02d %s", y, DATESEP, m+1, DATESEP, d,
SimpleTime(tim->ttime));
StartPopUp();
PutsPopUp(tmpBuf);
PutlPopUp(DBufValue(&buf));
}
else
printf("%04d%c%02d%c%02d %s%s\n", y, DATESEP, m+1, DATESEP, d,
SimpleTime(tim->ttime),
DBufValue(&buf));
#else
printf("%04d%c%02d%c%02d %s%s\n", y, DATESEP, m+1, DATESEP, d,
SimpleTime(tim->ttime),
DBufValue(&buf));
#endif
sprintf(tmpBuf, "%04d%c%02d%c%02d ", y, DateSep, m+1, DateSep, d);
if (DBufPuts(&calRow, tmpBuf) != OK) {
DBufFree(&calRow);
return E_NO_MEM;
}
/* If DoSimpleCalendar==1, output *all* simple calendar fields */
if (DoSimpleCalendar) {
/* ignore passthru field when in NextMode */
if (DBufPuts(&calRow, "* ") != OK) {
DBufFree(&calRow);
return E_NO_MEM;
}
if (t->tag[0]) {
sprintf(tmpBuf, "%s ", t->tag);
} else {
sprintf(tmpBuf, "* ");
}
if (DBufPuts(&calRow, tmpBuf) != OK) {
DBufFree(&calRow);
return E_NO_MEM;
}
if (tim->duration != NO_TIME) {
sprintf(tmpBuf, "%d ", tim->duration);
} else {
sprintf(tmpBuf, "* ");
}
if (DBufPuts(&calRow, tmpBuf) != OK) {
DBufFree(&calRow);
return E_NO_MEM;
}
if (tim->ttime != NO_TIME) {
sprintf(tmpBuf, "%d ", tim->ttime);
} else {
sprintf(tmpBuf, "* ");
}
if (DBufPuts(&calRow, tmpBuf) != OK) {
DBufFree(&calRow);
return E_NO_MEM;
}
}
if (DBufPuts(&calRow, SimpleTime(tim->ttime)) != OK) {
DBufFree(&calRow);
return E_NO_MEM;
}
printf("%s%s\n", DBufValue(&calRow), DBufValue(&buf));
DBufFree(&buf);
DBufFree(&calRow);
return OK;
}
@@ -720,32 +701,16 @@ PUBLIC int TriggerReminder(ParsePtr p, Trigger *t, TimeTrig *tim, int jul,
reminder now. */
switch(t->typ) {
case MSG_TYPE:
case PASSTHRU_TYPE:
if (MsgCommand) {
DoMsgCommand(MsgCommand, DBufValue(&buf));
} else {
#ifdef OS2_POPUP
if (AsPopUp)
PutlPopUp(DBufValue(&buf));
else
printf("%s", DBufValue(&buf));
#else
printf("%s", DBufValue(&buf));
#endif
}
break;
case MSF_TYPE:
#ifdef OS2_POPUP
if (AsPopUp) {
StartPopUp();
FillParagraph(DBufValue(&buf), 1);
EndPopUp();
} else {
FillParagraph(DBufValue(&buf), 0);
}
#else
FillParagraph(DBufValue(&buf));
#endif
break;
case RUN_TYPE:
@@ -771,32 +736,19 @@ PUBLIC int TriggerReminder(ParsePtr p, Trigger *t, TimeTrig *tim, int jul,
/* triggered. */
/* */
/***************************************************************/
#ifdef __TURBOC__
#pragma argsused
#endif
#ifdef HAVE_PROTOS
PUBLIC int ShouldTriggerReminder(Trigger *t, TimeTrig *tim, int jul)
#else
int ShouldTriggerReminder(t, tim, jul)
Trigger *t;
TimeTrig *tim;
int jul;
#endif
int ShouldTriggerReminder(Trigger *t, TimeTrig *tim, int jul)
{
int r;
/* Handle the ONCE modifier in the reminder. */
if (!IgnoreOnce && t->once !=NO_ONCE && FileAccessDate == JulianToday)
return 0;
if (jul < JulianToday) return 0;
/* Don't trigger timed reminders if DontIssueAts is true, and if the
reminder is for today */
#ifdef HAVE_QUEUED
if (jul == JulianToday && DontIssueAts && tim->ttime != NO_TIME) return 0;
#endif
/* Don't trigger "old" timed reminders */
/*** REMOVED...
@@ -837,17 +789,7 @@ PUBLIC int ShouldTriggerReminder(Trigger *t, TimeTrig *tim, int jul)
/* Do the "satisfying..." remind calculation. */
/* */
/***************************************************************/
#ifdef __TURBOC__
#pragma argsused
#endif
#ifdef HAVE_PROTOS
PUBLIC int DoSatRemind(Trigger *trig, TimeTrig *tim, ParsePtr p)
#else
int DoSatRemind(trig, tim, p)
Trigger *trig;
TimeTrig *tim;
ParsePtr p;
#endif
int DoSatRemind(Trigger *trig, TimeTrig *tim, ParsePtr p)
{
int iter, jul, r;
Value v;
@@ -881,13 +823,7 @@ PUBLIC int DoSatRemind(Trigger *trig, TimeTrig *tim, ParsePtr p)
/* ParsePriority - parse the PRIORITY portion of a reminder */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int ParsePriority(ParsePtr s, Trigger *t)
#else
static int ParsePriority(s, t)
ParsePtr s;
Trigger *t;
#endif
static int ParsePriority(ParsePtr s, Trigger *t)
{
int p, r;
char *u;
@@ -928,19 +864,12 @@ PRIVATE int ParsePriority(ParsePtr s, Trigger *t)
/* Execute the '-k' command, escaping shell chars in message. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoMsgCommand(char *cmd, char *msg)
#else
int DoMsgCommand(cmd, msg)
char *cmd;
char *msg;
#endif
int DoMsgCommand(char *cmd, char *msg)
{
int r;
int i, l;
DynamicBuffer execBuffer;
#ifdef WANT_SHELL_ESCAPING
DynamicBuffer buf;
char *s;
@@ -949,7 +878,7 @@ PUBLIC int DoMsgCommand(char *cmd, char *msg)
/* Escape shell characters in msg INCLUDING WHITESPACE! */
for (s=msg; *s; s++) {
if (isspace(*s) || strchr(EscapeMe, *s)) {
if (isspace(*s) || !strchr(DontEscapeMe, *s)) {
if (DBufPutc(&buf, '\\') != OK) {
r = E_NO_MEM;
goto finished;
@@ -961,9 +890,6 @@ PUBLIC int DoMsgCommand(char *cmd, char *msg)
}
}
msg = DBufValue(&buf);
#else
DBufInit(&execBuffer);
#endif
/* Do "%s" substitution */
l = strlen(cmd)-1;
@@ -991,9 +917,7 @@ PUBLIC int DoMsgCommand(char *cmd, char *msg)
system(DBufValue(&execBuffer));
finished:
#ifdef WANT_SHELL_ESCAPING
DBufFree(&buf);
#endif
DBufFree(&execBuffer);
return r;
}
@@ -1006,13 +930,7 @@ finished:
/* function. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int ShouldTriggerBasedOnWarn(Trigger *t, int jul)
#else
static int ShouldTriggerBasedOnWarn(t, jul)
Trigger *t;
int jul;
#endif
static int ShouldTriggerBasedOnWarn(Trigger *t, int jul)
{
char buffer[VAR_NAME_LEN+32];
int i;

View File

@@ -7,32 +7,24 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
#include "config.h"
static char const RCSID[] = "$Id: dosubst.c,v 1.9 1999-04-05 17:34:44 dfs Exp $";
#define L_IN_DOSUBST
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
#include "globals.h"
#include "err.h"
#include "types.h"
#include "protos.h"
#define UPPER(c) (islower(c) ? toupper(c) : c)
#define UPPER(c) (islower(c) ? toupper(c) : (c))
#define ABS(x) ( (x) < 0 ? -(x) : (x) )
#ifndef NL
#define NL "\n"
@@ -50,18 +42,10 @@ static char TOMORROW[] = L_TOMORROW;
/* Process the % escapes in the reminder. If */
/* mode==NORMAL_MODE, ignore the %" sequence. If */
/* mode==CAL_MODE, process the %" sequence. */
/* If mode==ADVANCE_MODE, ignore %" but don't add newline */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul, int mode)
#else
int DoSubst(p, dbuf, t, tt, jul, mode)
ParsePtr p;
DynamicBuffer *dbuf;
Trigger *t;
TimeTrig *tt;
int jul, mode;
#endif
int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul, int mode)
{
int diff = jul - JulianToday;
int curtime = SystemTime(0) / 60;
@@ -92,14 +76,14 @@ int jul, mode;
mplu = (mdiff == 1 ? "" : L_MPLU);
#endif /* L_MPLU_OVER */
#ifdef L_HPLU_OVER
#ifdef L_HPLU_OVER
L_HPLU_OVER
#else /* L_HPLU_OVER */
hplu = (hdiff == 1 ? "" : L_HPLU);
#endif /* L_HPLU_OVER */
when = (tdiff < 0 ? L_AGO : L_FROMNOW);
h = tim / 60;
min = tim % 60;
@@ -109,7 +93,7 @@ int jul, mode;
pm = (h < 12) ? L_AM : L_PM;
#endif
hh = (h == 12) ? 12 : h % 12;
ch = curtime / 60;
cmin = curtime % 60;
@@ -127,17 +111,17 @@ int jul, mode;
case 1:
case 21:
case 31: plu = "st"; break;
case 2:
case 22: plu = "nd"; break;
case 3:
case 23: plu = "rd"; break;
default: plu = "th"; break;
}
#endif
#endif
while(1) {
c = ParseChar(p, &err, 0);
if (err) {
@@ -146,7 +130,8 @@ int jul, mode;
}
if (c == '\n') continue;
if (!c) {
if (mode != CAL_MODE && t->typ != RUN_TYPE && !MsgCommand) {
if (mode != CAL_MODE && mode != ADVANCE_MODE &&
t->typ != RUN_TYPE && !MsgCommand) {
if (DBufPutc(dbuf, '\n') != OK) return E_NO_MEM;
}
break;
@@ -168,10 +153,10 @@ int jul, mode;
if (diff <= 1) {
switch(UPPER(c)) {
#ifndef L_NOTOMORROW_A
case 'A':
case 'A':
#endif
#ifndef L_NOTOMORROW_B
case 'B':
case 'B':
#endif
#ifndef L_NOTOMORROW_C
case 'C':
@@ -210,35 +195,35 @@ int jul, mode;
SHIP_OUT(s);
done = 1;
break;
default: done = 0;
default: done = 0;
}
}
if (!done) switch(UPPER(c)) {
case 'A':
#ifdef L_A_OVER
L_A_OVER
#else
#else
sprintf(s, "%s %s, %d %s, %d", L_ON, DayName[jul%7], d,
MonthName[m], y);
#endif
SHIP_OUT(s);
SHIP_OUT(s);
break;
case 'B':
#ifdef L_B_OVER
L_B_OVER
#else
#else
sprintf(s, L_INXDAYS, diff);
#endif
SHIP_OUT(s);
break;
break;
case 'C':
#ifdef L_C_OVER
L_C_OVER
#else
#else
sprintf(s, "%s %s", L_ON, DayName[jul%7]);
#endif
SHIP_OUT(s);
@@ -247,7 +232,7 @@ int jul, mode;
case 'D':
#ifdef L_D_OVER
L_D_OVER
#else
#else
sprintf(s, "%d", d);
#endif
SHIP_OUT(s);
@@ -256,9 +241,9 @@ int jul, mode;
case 'E':
#ifdef L_E_OVER
L_E_OVER
#else
sprintf(s, "%s %02d%c%02d%c%04d", L_ON, d, DATESEP,
m+1, DATESEP, y);
#else
sprintf(s, "%s %02d%c%02d%c%04d", L_ON, d, DateSep,
m+1, DateSep, y);
#endif
SHIP_OUT(s);
break;
@@ -266,8 +251,8 @@ int jul, mode;
case 'F':
#ifdef L_F_OVER
L_F_OVER
#else
sprintf(s, "%s %02d%c%02d%c%04d", L_ON, m+1, DATESEP, d, DATESEP, y);
#else
sprintf(s, "%s %02d%c%02d%c%04d", L_ON, m+1, DateSep, d, DateSep, y);
#endif
SHIP_OUT(s);
break;
@@ -275,7 +260,7 @@ int jul, mode;
case 'G':
#ifdef L_G_OVER
L_G_OVER
#else
#else
sprintf(s, "%s %s, %d %s", L_ON, DayName[jul%7], d, MonthName[m]);
#endif
SHIP_OUT(s);
@@ -284,8 +269,8 @@ int jul, mode;
case 'H':
#ifdef L_H_OVER
L_H_OVER
#else
sprintf(s, "%s %02d%c%02d", L_ON, d, DATESEP, m+1);
#else
sprintf(s, "%s %02d%c%02d", L_ON, d, DateSep, m+1);
#endif
SHIP_OUT(s);
break;
@@ -293,8 +278,8 @@ int jul, mode;
case 'I':
#ifdef L_I_OVER
L_I_OVER
#else
sprintf(s, "%s %02d%c%02d", L_ON, m+1, DATESEP, d);
#else
sprintf(s, "%s %02d%c%02d", L_ON, m+1, DateSep, d);
#endif
SHIP_OUT(s);
break;
@@ -323,7 +308,7 @@ int jul, mode;
#ifdef L_L_OVER
L_L_OVER
#else
sprintf(s, "%s %04d%c%02d%c%02d", L_ON, y, DATESEP, m+1, DATESEP, d);
sprintf(s, "%s %04d%c%02d%c%02d", L_ON, y, DateSep, m+1, DateSep, d);
#endif
SHIP_OUT(s);
break;
@@ -461,9 +446,9 @@ int jul, mode;
#ifdef L_1_OVER
L_1_OVER
#else
if (tdiff == 0)
if (tdiff == 0)
sprintf(s, "%s", L_NOW);
else if (hdiff == 0)
else if (hdiff == 0)
sprintf(s, "%d %s%s %s", mdiff, L_MINUTE, mplu, when);
else if (mdiff == 0)
sprintf(s, "%d %s%s %s", hdiff, L_HOUR, hplu, when);
@@ -478,7 +463,7 @@ int jul, mode;
#ifdef L_2_OVER
L_2_OVER
#else
sprintf(s, "%s %d%c%02d%s", L_AT, hh, TIMESEP, min, pm);
sprintf(s, "%s %d%c%02d%s", L_AT, hh, TimeSep, min, pm);
#endif
SHIP_OUT(s);
break;
@@ -488,7 +473,7 @@ int jul, mode;
L_3_OVER
#else
sprintf(s, "%s %02d%c%02d", L_AT, h, TIMESEP, min);
sprintf(s, "%s %02d%c%02d", L_AT, h, TimeSep, min);
#endif
SHIP_OUT(s);
break;
@@ -569,7 +554,7 @@ int jul, mode;
#ifdef L_AT_OVER
L_AT_OVER
#else
sprintf(s, "%d%c%02d%s", chh, TIMESEP, cmin, cpm);
sprintf(s, "%d%c%02d%s", chh, TimeSep, cmin, cpm);
#endif
SHIP_OUT(s);
break;
@@ -578,15 +563,15 @@ int jul, mode;
#ifdef L_HASH_OVER
L_HASH_OVER
#else
sprintf(s, "%02d%c%02d", ch, TIMESEP, cmin);
sprintf(s, "%02d%c%02d", ch, TimeSep, cmin);
#endif
SHIP_OUT(s);
break;
case '_':
if (mode != CAL_MODE && !MsgCommand)
case '_':
if (mode != CAL_MODE && mode != ADVANCE_MODE && !MsgCommand)
sprintf(s, "%s", NL);
else
else
sprintf(s, " ");
SHIP_OUT(s);
break;
@@ -617,7 +602,7 @@ int jul, mode;
/* If there are NO quotes, then: If CAL_MODE && RUN_TYPE, we don't want the
reminder in the calendar. Zero the output buffer and quit. */
if (!has_quote) {
if (mode == CAL_MODE && t->typ == RUN_TYPE) {
if ((mode == ADVANCE_MODE || mode == CAL_MODE) && t->typ == RUN_TYPE) {
*DBufValue(dbuf) = 0;
dbuf->len = 0;
}
@@ -629,7 +614,7 @@ int jul, mode;
ss = DBufValue(dbuf) + origLen;
os = ss;
if (mode == NORMAL_MODE) {
if (mode == NORMAL_MODE || mode == ADVANCE_MODE) {
while (*ss) {
if (*ss != QUOTE_MARKER) *os++ = *ss;
ss++;
@@ -653,7 +638,7 @@ int jul, mode;
return OK;
}
/***************************************************************/
/* */
@@ -664,16 +649,8 @@ int jul, mode;
/* default triggers and a mode of NORMAL_MODE. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoSubstFromString(char *source, DynamicBuffer *dbuf,
int DoSubstFromString(char *source, DynamicBuffer *dbuf,
int jul, int tim)
#else
int DoSubstFromString(source, dbuf, jul, tim)
char *source;
DynamicBuffer *dbuf;
int jul;
int tim;
#endif
{
Trigger tempTrig;
TimeTrig tempTime;
@@ -686,7 +663,7 @@ int tim;
tempP.allownested = 0;
tempTrig.typ = MSG_TYPE;
tempTime.ttime = tim;
r = DoSubst(&tempP, dbuf, &tempTrig, &tempTime, jul, NORMAL_MODE);
DestroyParser(&tempP);
return r;

View File

@@ -7,25 +7,15 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
static char const RCSID[] =
"$Id: dynbuf.c,v 1.3 1999-04-05 17:34:45 dfs Exp $";
#include "config.h"
#include "dynbuf.h"
#include "err.h"
#include <string.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
/**********************************************************************
%FUNCTION: DBufMakeRoom
@@ -38,13 +28,7 @@ static char const RCSID[] =
Doubles the size of dynamic buffer until it has room for at least
'n' characters, not including trailing '\0'
**********************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int DBufMakeRoom(DynamicBuffer *dbuf, int n)
#else
static int DBufMakeRoom(dbuf, n)
DynamicBuffer *dbuf;
int n;
#endif
static int DBufMakeRoom(DynamicBuffer *dbuf, int n)
{
/* Double size until it's greater than n (strictly > to leave room
for trailing '\0' */
@@ -80,12 +64,7 @@ int n;
%DESCRIPTION:
Initializes a dynamic buffer
**********************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void DBufInit(DynamicBuffer *dbuf)
#else
void DBufInit(dbuf)
DynamicBuffer *dbuf;
#endif
void DBufInit(DynamicBuffer *dbuf)
{
dbuf->buffer = dbuf->staticBuf;
dbuf->len = 0;
@@ -103,13 +82,7 @@ DynamicBuffer *dbuf;
%DESCRIPTION:
Appends a character to the buffer.
**********************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DBufPutc(DynamicBuffer *dbuf, char c)
#else
int DBufPutc(dbuf, c)
DynamicBuffer *dbuf;
char c;
#endif
int DBufPutc(DynamicBuffer *dbuf, char c)
{
if (dbuf->allocatedLen == dbuf->len+1) {
if (DBufMakeRoom(dbuf, dbuf->len+1) != OK) return E_NO_MEM;
@@ -129,13 +102,7 @@ char c;
%DESCRIPTION:
Appends a string to the buffer.
**********************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DBufPuts(DynamicBuffer *dbuf, char *str)
#else
int DBufPuts(dbuf, str)
DynamicBuffer *dbuf;
char *str;
#endif
int DBufPuts(DynamicBuffer *dbuf, char *str)
{
int l = strlen(str);
if (!l) return OK;
@@ -155,12 +122,7 @@ char *str;
%DESCRIPTION:
Frees and reinitializes a dynamic buffer
**********************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void DBufFree(DynamicBuffer *dbuf)
#else
void DBufFree(dbuf)
DynamicBuffer *dbuf;
#endif
void DBufFree(DynamicBuffer *dbuf)
{
if (dbuf->buffer != dbuf->staticBuf) free(dbuf->buffer);
DBufInit(dbuf);
@@ -177,13 +139,7 @@ DynamicBuffer *dbuf;
Reads an entire line from a file and appends to dbuf. Does not include
trailing newline.
**********************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DBufGets(DynamicBuffer *dbuf, FILE *fp)
#else
int DBufGets(dbuf, fp)
DynamicBuffer *dbuf;
FILE *fp
#endif
int DBufGets(DynamicBuffer *dbuf, FILE *fp)
{
char tmp[256]; /* Safe to hard-code */
int busy = 1;

View File

@@ -6,12 +6,10 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
/* $Id: dynbuf.h,v 1.2 1999-04-05 17:34:45 dfs Exp $ */
#ifndef DYNBUF_H
#define DYNBUF_H
@@ -25,14 +23,6 @@ typedef struct {
char staticBuf[DBUF_STATIC_SIZE];
} DynamicBuffer;
#ifndef ARGS
#ifdef HAVE_PROTOS
#define ARGS(x) x
#else
#define ARGS(x) ()
#endif
#endif
void DBufInit(DynamicBuffer *dbuf);
int DBufPutc(DynamicBuffer *dbuf, char c);
int DBufPuts(DynamicBuffer *dbuf, char *str);

View File

@@ -6,12 +6,10 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
/* $Id: err.h,v 1.3 1999-04-05 17:34:46 dfs Exp $ */
/* Note that not all of the "errors" are really errors - some are just
messages for information purposes. Constants beginning with M_ should
never be returned as error indicators - they should only be used to
@@ -118,6 +116,7 @@
#define M_QUEUED 96
#define E_EXPECTING_NUMBER 97
#define M_BAD_WARN_FUNC 98
#define E_CANT_CONVERT_TZ 99
#ifdef MK_GLOBALS
#undef EXTERN
@@ -206,7 +205,7 @@ EXTERN char *ErrMsg[]
"Expecting time after AT",
"UNTIL keyword used twice",
"Incomplete date specification",
"SCANFROM keyword used twice",
"FROM/SCANFROM keyword used twice",
"Variable",
"Value",
"*UNDEFINED*",
@@ -230,7 +229,8 @@ EXTERN char *ErrMsg[]
"No reminders.",
"%d reminder(s) queued for later today.\n",
"Expecting number",
"Bad function in WARN clause"
"Bad function in WARN clause",
"Can't convert between time zones"
}
#endif /* MK_GLOBALS */
;

View File

@@ -6,24 +6,16 @@
/* expressions. */
/* */
/* Copyright 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
#include "config.h"
static char const RCSID[] = "$Id: expr.c,v 1.7 1999-04-05 17:34:46 dfs Exp $";
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
#include "err.h"
#include "types.h"
@@ -42,23 +34,15 @@ static char const RCSID[] = "$Id: expr.c,v 1.7 1999-04-05 17:34:46 dfs Exp $";
static char CoerceBuf[512];
extern int NumFuncs;
#ifdef HAVE_PROTOS
PRIVATE int Multiply(void), Divide(void), Mod(void), Add(void),
static int Multiply(void), Divide(void), Mod(void), Add(void),
Subtract(void), GreaterThan(void), LessThan(void),
EqualTo(void), NotEqual(void), LessOrEqual(void),
GreaterOrEqual(void), LogAND(void), LogOR(void),
UnMinus(void), LogNot(void),
Compare(int);
#else
PRIVATE int Multiply(), Divide(), Mod(), Add(),
Subtract(), GreaterThan(), LessThan(),
EqualTo(), NotEqual(), LessOrEqual(),
GreaterOrEqual(), LogAND(), LogOR(),
UnMinus(), LogNot(), Compare();
#endif
PRIVATE int MakeValue ARGS ((char *s, Value *v, Var *locals));
PRIVATE int ParseLiteralDate ARGS ((char **s, int *jul));
static int MakeValue (char *s, Value *v, Var *locals);
static int ParseLiteralDate (char **s, int *jul, int *tim);
/* Binary operators - all left-associative */
@@ -104,12 +88,7 @@ int OpStackPtr, ValStackPtr;
/* Execute an operator or function with debugging. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int DebugPerform(Operator *op)
#else
static int DebugPerform(op)
Operator *op;
#endif
static int DebugPerform(Operator *op)
{
int r;
@@ -140,11 +119,7 @@ Operator *op;
/* Clean the stack after an error occurs. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void CleanStack(void)
#else
static void CleanStack()
#endif
static void CleanStack(void)
{
int i;
@@ -157,12 +132,7 @@ static void CleanStack()
/* PeekChar - peek ahead to next char. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE char PeekChar(char **s)
#else
static char PeekChar(s)
char **s;
#endif
static char PeekChar(char **s)
{
char *t = *s;
while (*t && isspace(*t)) t++;
@@ -176,21 +146,15 @@ char **s;
/* Read a token. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int ParseExprToken(DynamicBuffer *buf, char **in)
#else
static int ParseExprToken(buf, in)
DynamicBuffer *buf;
char **in;
#endif
static int ParseExprToken(DynamicBuffer *buf, char **in)
{
char c;
DBufFree(buf);
/* Skip white space */
while (**in && isspace(**in)) (*in)++;
if (!**in) return OK;
c = *(*in)++;
@@ -221,7 +185,7 @@ char **in;
(*in)++;
}
return OK;
case '!':
case '>':
case '<':
@@ -265,6 +229,7 @@ char **in;
}
if (c == '\'') return OK;
DBufFree(buf);
return E_MISS_QUOTE;
}
if (!ISID(c) && c != '$') {
@@ -273,7 +238,7 @@ char **in;
}
/* Parse a constant, variable name or function */
while (ISID(**in) || **in == ':' || **in == '.' || **in == TIMESEP) {
while (ISID(**in) || **in == ':' || **in == '.' || **in == TimeSep) {
if (DBufPutc(buf, **in) != OK) {
DBufFree(buf);
return E_NO_MEM;
@@ -301,13 +266,7 @@ char **in;
/* Put the result into value pointed to by v. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int EvalExpr(char **e, Value *v)
#else
int EvalExpr(e, v)
char **e;
Value *v;
#endif
int EvalExpr(char **e, Value *v)
{
int r;
@@ -330,13 +289,7 @@ Value *v;
}
/* Evaluate - do the actual work of evaluation. */
#ifdef HAVE_PROTOS
PUBLIC int Evaluate(char **s, Var *locals)
#else
int Evaluate(s, locals)
char **s;
Var *locals;
#endif
int Evaluate(char **s, Var *locals)
{
int OpBase, ValBase;
int r;
@@ -345,10 +298,10 @@ Var *locals;
Operator op, op2;
Value va;
char *ufname = NULL; /* Stop GCC from complaining about use of uninit var */
OpBase = OpStackPtr;
ValBase = ValStackPtr;
while(1) {
/* Looking for a value. Accept: value, unary op, func. call or left paren */
r = ParseExprToken(&ExprBuf, s);
@@ -413,8 +366,8 @@ Var *locals;
r = CallUserFunc(ufname, args);
free(ufname);
}
if (r) return r;
DBufFree(&ExprBuf);
if (r) return r;
}
} else { /* Unary operator */
f = FindFunc(DBufValue(&ExprBuf), UnOp, NUM_UN_OPS);
@@ -487,7 +440,7 @@ Var *locals;
PushOpStack(*f);
}
}
/***************************************************************/
/* */
/* MakeValue */
@@ -495,14 +448,7 @@ Var *locals;
/* a date or the value of a symbol. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int MakeValue(char *s, Value *v, Var *locals)
#else
static int MakeValue(s, v, locals)
char *s;
Value *v;
Var *locals;
#endif
static int MakeValue(char *s, Value *v, Var *locals)
{
int len;
int h, m, r;
@@ -520,10 +466,15 @@ Var *locals;
return OK;
} else if (*s == '\'') { /* It's a literal date */
s++;
if ((r=ParseLiteralDate(&s, &h))) return r;
if ((r=ParseLiteralDate(&s, &h, &m))) return r;
if (*s != '\'') return E_BAD_DATE;
v->type = DATE_TYPE;
v->v.val = h;
if (m == NO_TIME) {
v->type = DATE_TYPE;
v->v.val = h;
} else {
v->type = DATETIME_TYPE;
v->v.val = (h * MINUTES_PER_DAY) + m;
}
return OK;
} else if (isdigit(*s)) { /* It's a number - use len to hold it.*/
len = 0;
@@ -531,7 +482,7 @@ Var *locals;
len *= 10;
len += (*s++ - '0');
}
if (*s == ':' || *s == '.' || *s == TIMESEP) { /* Must be a literal time */
if (*s == ':' || *s == '.' || *s == TimeSep) { /* Must be a literal time */
s++;
if (!isdigit(*s)) return E_BAD_TIME;
h = len;
@@ -542,7 +493,7 @@ Var *locals;
s++;
}
if (*s || h>23 || m>59) return E_BAD_TIME;
v->type = TIM_TYPE;
v->type = TIME_TYPE;
v->v.val = h*60 + m;
return OK;
}
@@ -555,7 +506,7 @@ Var *locals;
if (DebugFlag & DB_PRTEXPR)
fprintf(ErrFp, "%s => ", s);
r = GetSysVar(s+1, v);
if (! (DebugFlag & DB_PRTEXPR)) return r;
if (r == OK) {
PrintValue(v, ErrFp);
@@ -568,7 +519,7 @@ Var *locals;
r = GetVarValue(s, v, locals);
if (! (DebugFlag & DB_PRTEXPR)) return r;
if (r == OK) {
PrintValue(v, ErrFp);
PrintValue(v, ErrFp);
Putc('\n', ErrFp);
}
return r;
@@ -579,30 +530,54 @@ Var *locals;
/* DoCoerce - actually coerce a value to the specified type. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoCoerce(char type, Value *v)
#else
int DoCoerce(type, v)
char type;
Value *v;
#endif
int DoCoerce(char type, Value *v)
{
int h, d, m, y, i;
int h, d, m, y, i, k;
char *s;
/* Do nothing if value is already the right type */
if (type == v->type) return OK;
switch(type) {
case DATETIME_TYPE:
switch(v->type) {
case INT_TYPE:
v->type = DATETIME_TYPE;
return OK;
case DATE_TYPE:
v->type = DATETIME_TYPE;
v->v.val *= MINUTES_PER_DAY;
return OK;
case STR_TYPE:
s = v->v.str;
if (ParseLiteralDate(&s, &i, &m)) return E_CANT_COERCE;
if (*s) return E_CANT_COERCE;
v->type = DATETIME_TYPE;
free(v->v.str);
if (m == NO_TIME) m = 0;
v->v.val = i * MINUTES_PER_DAY + m;
return OK;
default:
return E_CANT_COERCE;
}
case STR_TYPE:
switch(v->type) {
case INT_TYPE: sprintf(CoerceBuf, "%d", v->v.val); break;
case TIM_TYPE: sprintf(CoerceBuf, "%02d%c%02d", v->v.val / 60,
TIMESEP, v->v.val % 60);
case TIME_TYPE: sprintf(CoerceBuf, "%02d%c%02d", v->v.val / 60,
TimeSep, v->v.val % 60);
break;
case DATE_TYPE: FromJulian(v->v.val, &y, &m, &d);
sprintf(CoerceBuf, "%04d%c%02d%c%02d",
y, DATESEP, m+1, DATESEP, d);
y, DateSep, m+1, DateSep, d);
break;
case DATETIME_TYPE:
i = v->v.val / MINUTES_PER_DAY;
FromJulian(i, &y, &m, &d);
k = v->v.val % MINUTES_PER_DAY;
h = k / 60;
i = k % 60;
sprintf(CoerceBuf, "%04d%c%02d%c%02d@%02d%c%02d",
y, DateSep, m+1, DateSep, d, h, TimeSep, i);
break;
default: return E_CANT_COERCE;
}
@@ -639,7 +614,8 @@ Value *v;
return OK;
case DATE_TYPE:
case TIM_TYPE:
case TIME_TYPE:
case DATETIME_TYPE:
v->type = INT_TYPE;
return OK;
@@ -656,22 +632,28 @@ Value *v;
case STR_TYPE:
s = v->v.str;
if (ParseLiteralDate(&s, &i)) return E_CANT_COERCE;
if (ParseLiteralDate(&s, &i, &m)) return E_CANT_COERCE;
if (*s) return E_CANT_COERCE;
v->type = DATE_TYPE;
free(v->v.str);
v->v.val = i;
return OK;
case DATETIME_TYPE:
v->type = DATE_TYPE;
v->v.val /= MINUTES_PER_DAY;
return OK;
default: return E_CANT_COERCE;
}
case TIM_TYPE:
case TIME_TYPE:
switch(v->type) {
case INT_TYPE:
v->type = TIM_TYPE;
v->v.val %= 1440;
if (v->v.val < 0) v->v.val += 1440;
case DATETIME_TYPE:
v->type = TIME_TYPE;
v->v.val %= MINUTES_PER_DAY;
if (v->v.val < 0) v->v.val += MINUTES_PER_DAY;
return OK;
case STR_TYPE:
@@ -683,7 +665,7 @@ Value *v;
h *= 10;
h += *s++ - '0';
}
if (*s != ':' && *s != '.' && *s != TIMESEP)
if (*s != ':' && *s != '.' && *s != TimeSep)
return E_CANT_COERCE;
s++;
if (!isdigit(*s)) return E_CANT_COERCE;
@@ -692,7 +674,7 @@ Value *v;
m += *s++ - '0';
}
if (*s || h>23 || m>59) return E_CANT_COERCE;
v->type = TIM_TYPE;
v->type = TIME_TYPE;
free(v->v.str);
v->v.val = h*60+m;
return OK;
@@ -710,21 +692,17 @@ Value *v;
/* Perform addition. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int Add(void)
#else
static int Add()
#endif
static int Add(void)
{
Value v1, v2, v3;
int r;
PopValStack(v2);
if ( (r = FnPopValStack(&v1)) ) {
DestroyValue(v2);
return r;
}
/* If both are ints, just add 'em */
if (v2.type == INT_TYPE && v1.type == INT_TYPE) {
v2.v.val += v1.v.val;
@@ -741,16 +719,26 @@ static int Add()
PushValStack(v1);
return OK;
}
/* If it's a time plus an int, add 'em mod 1440 */
if ((v1.type == TIM_TYPE && v2.type == INT_TYPE) ||
(v1.type == INT_TYPE && v2.type == TIM_TYPE)) {
v1.v.val = (v1.v.val + v2.v.val) % 1440;
if (v1.v.val < 0) v1.v.val += 1440;
v1.type = TIM_TYPE;
/* If it's a datetime plus an int, add 'em */
if ((v1.type == DATETIME_TYPE && v2.type == INT_TYPE) ||
(v1.type == INT_TYPE && v2.type == DATETIME_TYPE)) {
v1.v.val += v2.v.val;
if (v1.v.val < 0) return E_DATE_OVER;
v1.type = DATETIME_TYPE;
PushValStack(v1);
return OK;
}
}
/* If it's a time plus an int, add 'em mod MINUTES_PER_DAY */
if ((v1.type == TIME_TYPE && v2.type == INT_TYPE) ||
(v1.type == INT_TYPE && v2.type == TIME_TYPE)) {
v1.v.val = (v1.v.val + v2.v.val) % MINUTES_PER_DAY;
if (v1.v.val < 0) v1.v.val += MINUTES_PER_DAY;
v1.type = TIME_TYPE;
PushValStack(v1);
return OK;
}
/* If either is a string, coerce them both to strings and concatenate */
if (v1.type == STR_TYPE || v2.type == STR_TYPE) {
@@ -778,7 +766,7 @@ static int Add()
/* Don't handle other types yet */
return E_BAD_TYPE;
}
/***************************************************************/
/* */
/* Subtract */
@@ -786,15 +774,11 @@ static int Add()
/* Perform subtraction. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int Subtract(void)
#else
static int Subtract()
#endif
static int Subtract(void)
{
Value v1, v2;
int r;
PopValStack(v2);
if ( (r = FnPopValStack(&v1)) ) {
DestroyValue(v2);
@@ -816,16 +800,25 @@ static int Subtract()
return OK;
}
/* If it's a time minus an int, do subtraction mod 1440 */
if (v1.type == TIM_TYPE && v2.type == INT_TYPE) {
v1.v.val = (v1.v.val - v2.v.val) % 1440;
if (v1.v.val < 0) v1.v.val += 1440;
/* If it's a datetime minus an int, do subtraction, checking for underflow */
if (v1.type == DATETIME_TYPE && v2.type == INT_TYPE) {
v1.v.val -= v2.v.val;
if (v1.v.val < 0) return E_DATE_OVER;
PushValStack(v1);
return OK;
}
/* If it's a time minus an int, do subtraction mod MINUTES_PER_DAY */
if (v1.type == TIME_TYPE && v2.type == INT_TYPE) {
v1.v.val = (v1.v.val - v2.v.val) % MINUTES_PER_DAY;
if (v1.v.val < 0) v1.v.val += MINUTES_PER_DAY;
PushValStack(v1);
return OK;
}
/* If it's a time minus a time or a date minus a date, do it */
if ((v1.type == TIM_TYPE && v2.type == TIM_TYPE) ||
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)) {
v1.v.val -= v2.v.val;
v1.type = INT_TYPE;
@@ -845,11 +838,7 @@ static int Subtract()
/* Perform multiplication. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int Multiply(void)
#else
static int Multiply()
#endif
static int Multiply(void)
{
Value v1, v2;
int r;
@@ -876,11 +865,7 @@ static int Multiply()
/* Perform division. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int Divide(void)
#else
static int Divide()
#endif
static int Divide(void)
{
Value v1, v2;
int r;
@@ -908,11 +893,7 @@ static int Divide()
/* Perform modulus function. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int Mod(void)
#else
static int Mod()
#endif
static int Mod(void)
{
Value v1, v2;
int r;
@@ -942,21 +923,12 @@ static int Mod()
/* All the comparison functions. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int GreaterThan(void) {return Compare(GT);}
PRIVATE int LessThan(void) {return Compare(LT);}
PRIVATE int EqualTo(void) {return Compare(EQ);}
PRIVATE int NotEqual(void) {return Compare(NE);}
PRIVATE int LessOrEqual(void) {return Compare(LE);}
PRIVATE int GreaterOrEqual(void) {return Compare(GE);}
#else
static int GreaterThan() {return Compare(GT);}
static int LessThan() {return Compare(LT);}
static int EqualTo() {return Compare(EQ);}
static int NotEqual() {return Compare(NE);}
static int LessOrEqual() {return Compare(LE);}
static int GreaterOrEqual() {return Compare(GE);}
#endif
static int GreaterThan(void) {return Compare(GT);}
static int LessThan(void) {return Compare(LT);}
static int EqualTo(void) {return Compare(EQ);}
static int NotEqual(void) {return Compare(NE);}
static int LessOrEqual(void) {return Compare(LE);}
static int GreaterOrEqual(void) {return Compare(GE);}
/***************************************************************/
/* */
@@ -964,12 +936,7 @@ static int GreaterOrEqual() {return Compare(GE);}
/* Do the actual work of comparison. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int Compare(int how)
#else
static int Compare(how)
int how;
#endif
static int Compare(int how)
{
Value v1, v2, v3;
int r;
@@ -1027,11 +994,7 @@ int how;
/* Do logical OR */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int LogOR(void)
#else
static int LogOR()
#endif
static int LogOR(void)
{
Value v1, v2;
int r;
@@ -1058,11 +1021,7 @@ static int LogOR()
/* Do logical AND */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int LogAND(void)
#else
static int LogAND()
#endif
static int LogAND(void)
{
Value v1, v2;
int r;
@@ -1089,11 +1048,7 @@ static int LogAND()
/* Unary Minus */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int UnMinus(void)
#else
static int UnMinus()
#endif
static int UnMinus(void)
{
Value *v = &ValStack[ValStackPtr-1];
if (v->type != INT_TYPE) return E_BAD_TYPE;
@@ -1108,11 +1063,7 @@ static int UnMinus()
/* Logical NOT */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int LogNot(void)
#else
static int LogNot()
#endif
static int LogNot(void)
{
Value *v = &ValStack[ValStackPtr-1];
if (v->type != INT_TYPE) return E_BAD_TYPE;
@@ -1127,14 +1078,7 @@ static int LogNot()
/* Find a function. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
Operator *FindFunc(char *name, Operator where[], int num)
#else
Operator *FindFunc(name, where, num)
char *name;
Operator where[];
int num;
#endif
{
int top=num-1, bot=0;
int mid, r;
@@ -1147,7 +1091,7 @@ int num;
}
return NULL;
}
/***************************************************************/
/* */
/* PrintValue */
@@ -1155,13 +1099,7 @@ int num;
/* Print a value to stdout for debugging purposes. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void PrintValue (Value *v, FILE *fp)
#else
void PrintValue(v, fp)
Value *v;
FILE *fp;
#endif
void PrintValue (Value *v, FILE *fp)
{
int y, m, d;
char *s;
@@ -1172,13 +1110,18 @@ FILE *fp;
for (y=0; y<MAX_PRT_LEN && *s; y++) Putc(*s++, fp);
Putc('"',fp);
if (*s) fprintf(fp, "...");
}
}
else if (v->type == INT_TYPE) fprintf(fp, "%d", v->v.val);
else if (v->type == TIM_TYPE) fprintf(fp, "%02d%c%02d", v->v.val / 60,
TIMESEP, v->v.val % 60);
else if (v->type == TIME_TYPE) fprintf(fp, "%02d%c%02d", v->v.val / 60,
TimeSep, v->v.val % 60);
else if (v->type == DATE_TYPE) {
FromJulian(v->v.val, &y, &m, &d);
fprintf(fp, "%04d%c%02d%c%02d", y, DATESEP, m+1, DATESEP, d);
fprintf(fp, "%04d%c%02d%c%02d", y, DateSep, m+1, DateSep, d);
}
else if (v->type == DATETIME_TYPE) {
FromJulian(v->v.val / MINUTES_PER_DAY, &y, &m, &d);
fprintf(fp, "%04d%c%02d%c%02d@%02d%c%02d", y, DateSep, m+1, DateSep, d,
(v->v.val % MINUTES_PER_DAY) / 60, TimeSep, (v->v.val % MINUTES_PER_DAY) % 60);
}
else fprintf(fp, "ERR");
}
@@ -1190,12 +1133,7 @@ FILE *fp;
/* Copy a value. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int CopyValue(Value *dest, const Value *src)
#else
int CopyValue(dest, src)
Value *dest, *src;
#endif
int CopyValue(Value *dest, const Value *src)
{
dest->type = ERR_TYPE;
if (src->type == STR_TYPE) {
@@ -1212,27 +1150,25 @@ Value *dest, *src;
/* */
/* ParseLiteralDate */
/* */
/* Parse a literal date. Return result in jul, update s. */
/* Parse a literal date or datetime. Return result in jul */
/* and tim; update s. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int ParseLiteralDate(char **s, int *jul)
#else
static int ParseLiteralDate(s, jul)
char **s;
int *jul;
#endif
static int ParseLiteralDate(char **s, int *jul, int *tim)
{
int y, m, d;
int hour, min;
y=0; m=0; d=0;
hour=0; min=0;
*tim = NO_TIME;
if (!isdigit(**s)) return E_BAD_DATE;
while (isdigit(**s)) {
y *= 10;
y += *(*s)++ - '0';
}
if (**s != '/' && **s != '-' && **s != DATESEP) return E_BAD_DATE;
if (**s != '/' && **s != '-' && **s != DateSep) return E_BAD_DATE;
(*s)++;
if (!isdigit(**s)) return E_BAD_DATE;
while (isdigit(**s)) {
@@ -1240,7 +1176,7 @@ int *jul;
m += *(*s)++ - '0';
}
m--;
if (**s != '/' && **s != '-' && **s != DATESEP) return E_BAD_DATE;
if (**s != '/' && **s != '-' && **s != DateSep) return E_BAD_DATE;
(*s)++;
if (!isdigit(**s)) return E_BAD_DATE;
while (isdigit(**s)) {
@@ -1248,9 +1184,26 @@ int *jul;
d += *(*s)++ - '0';
}
if (!DateOK(y, m, d)) return E_BAD_DATE;
*jul = Julian(y, m, d);
/* Do we have a time part as well? */
if (**s == ' ' || **s == '@') {
(*s)++;
while(isdigit(**s)) {
hour *= 10;
hour += *(*s)++ - '0';
}
if (**s != ':' && **s != '.' && **s != TimeSep) return E_BAD_TIME;
(*s)++;
while(isdigit(**s)) {
min *= 10;
min += *(*s)++ - '0';
}
if (hour > 23 || min > 59) return E_BAD_TIME;
*tim = hour * 60 + min;
}
return OK;
}
@@ -1263,12 +1216,7 @@ int *jul;
/* return upon failure. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int FnPopValStack(Value *val)
#else
int FnPopValStack(val)
Value *val;
#endif
int FnPopValStack(Value *val)
{
if (ValStackPtr <= 0)
return E_VA_STK_UNDER;
@@ -1277,4 +1225,3 @@ Value *val;
return OK;
}
}

View File

@@ -6,18 +6,18 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
/* $Id: expr.h,v 1.3 1999-04-05 17:34:48 dfs Exp $ */
/* Define the types of values */
#define ERR_TYPE 0
#define INT_TYPE 1
#define TIM_TYPE 2
#define DATE_TYPE 3
#define STR_TYPE 4
#define ERR_TYPE 0
#define INT_TYPE 1
#define TIME_TYPE 2
#define DATE_TYPE 3
#define STR_TYPE 4
#define DATETIME_TYPE 5
#define SPECIAL_TYPE 6 /* Only for system variables */
/* Define stuff for parsing expressions */
#define BEG_OF_EXPR '['

View File

@@ -8,12 +8,11 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
#include "config.h"
static char const RCSID[] = "$Id: files.c,v 1.9 1999-04-05 17:34:48 dfs Exp $";
#include <stdio.h>
@@ -27,29 +26,9 @@ static char const RCSID[] = "$Id: files.c,v 1.9 1999-04-05 17:34:48 dfs Exp $";
#include <time.h>
#endif
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#if defined(__MSDOS__)
#include <io.h>
#endif
#ifdef __MSC__
#include <dos.h>
#endif
#include "types.h"
#include "protos.h"
@@ -71,9 +50,7 @@ typedef struct cheader {
struct cheader *next;
char *filename;
CachedLine *cache;
#ifdef UNIX
int ownedByMe;
#endif
} CachedFile;
/* Define the structures needed by the INCLUDE file system */
@@ -84,9 +61,7 @@ typedef struct {
int NumIfs;
long offset;
CachedLine *CLine;
#ifdef UNIX
int ownedByMe;
#endif
} IncludeStruct;
static CachedFile *CachedFiles = (CachedFile *) NULL;
@@ -97,10 +72,10 @@ static FILE *fp;
static IncludeStruct IStack[INCLUDE_NEST];
static int IStackPtr = 0;
PRIVATE int ReadLineFromFile ARGS ((void));
PRIVATE int CacheFile ARGS ((const char *fname));
PRIVATE void DestroyCache ARGS ((CachedFile *cf));
PRIVATE int CheckSafety ARGS ((void));
static int ReadLineFromFile (void);
static int CacheFile (const char *fname);
static void DestroyCache (CachedFile *cf);
static int CheckSafety (void);
/***************************************************************/
/* */
@@ -109,11 +84,7 @@ PRIVATE int CheckSafety ARGS ((void));
/* Read a line from the file or cache. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int ReadLine(void)
#else
int ReadLine()
#endif
int ReadLine(void)
{
int r;
@@ -144,11 +115,7 @@ int ReadLine()
/* Read a line from the file pointed to by fp. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int ReadLineFromFile(void)
#else
static int ReadLineFromFile()
#endif
static int ReadLineFromFile(void)
{
int l;
@@ -204,12 +171,7 @@ static int ReadLineFromFile()
/* ShouldCache is 1, cache the file */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int OpenFile(const char *fname)
#else
int OpenFile(fname)
char *fname;
#endif
int OpenFile(const char *fname)
{
CachedFile *h = CachedFiles;
int r;
@@ -224,11 +186,9 @@ char *fname;
CLine = h->cache;
STRSET(FileName, fname);
LineNo = 0;
#ifdef UNIX
if (!h->ownedByMe) {
RunDisabled |= RUN_NOTOWNER;
}
#endif
if (FileName) return OK; else return E_NO_MEM;
}
h = h->next;
@@ -270,12 +230,7 @@ char *fname;
/* Returns an indication of success or failure. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int CacheFile(const char *fname)
#else
static int CacheFile(fname)
char *fname;
#endif
static int CacheFile(const char *fname)
{
int r;
CachedFile *cf;
@@ -295,13 +250,12 @@ char *fname;
return E_NO_MEM;
}
#ifdef UNIX
if (RunDisabled & RUN_NOTOWNER) {
cf->ownedByMe = 0;
} else {
cf->ownedByMe = 1;
}
#endif
/* Read the file */
while(fp) {
r = ReadLineFromFile();
@@ -363,11 +317,7 @@ char *fname;
/* file, or return E_EOF */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int PopFile(void)
#else
int PopFile()
#endif
int PopFile(void)
{
IncludeStruct *i;
@@ -385,11 +335,9 @@ int PopFile()
CLine = i->CLine;
fp = NULL;
STRSET(FileName, i->filename);
#ifdef UNIX
if (!i->ownedByMe) {
RunDisabled |= RUN_NOTOWNER;
}
#endif
if (!CLine && (i->offset != -1L)) {
/* We must open the file, then seek to specified position */
if (strcmp(i->filename, "-")) {
@@ -412,12 +360,7 @@ int PopFile()
/* The INCLUDE command. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoInclude(ParsePtr p)
#else
int DoInclude(p)
ParsePtr p;
#endif
int DoInclude(ParsePtr p)
{
DynamicBuffer buf;
int r, e;
@@ -444,12 +387,7 @@ ParsePtr p;
/* inclusion. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int IncludeFile(const char *fname)
#else
int IncludeFile(fname)
char *fname;
#endif
int IncludeFile(const char *fname)
{
IncludeStruct *i;
int r;
@@ -465,13 +403,11 @@ char *fname;
i->IfFlags = IfFlags;
i->CLine = CLine;
i->offset = -1L;
#ifdef UNIX
if (RunDisabled & RUN_NOTOWNER) {
i->ownedByMe = 0;
} else {
i->ownedByMe = 1;
}
#endif
if (fp) {
i->offset = ftell(fp);
FCLOSE(fp);
@@ -496,22 +432,13 @@ char *fname;
/* GetAccessDate - get the access date of a file. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int GetAccessDate(char *file)
#else
int GetAccessDate(file)
char *file;
#endif
int GetAccessDate(char *file)
{
struct stat statbuf;
struct tm *t1;
if (stat(file, &statbuf)) return -1;
#ifdef __TURBOC__
t1 = localtime( (time_t *) &(statbuf.st_atime) );
#else
t1 = localtime(&(statbuf.st_atime));
#endif
if (t1->tm_year + 1900 < BASE)
return 0;
@@ -519,71 +446,6 @@ char *file;
return Julian(t1->tm_year+1900, t1->tm_mon, t1->tm_mday);
}
/***************************************************************/
/* */
/* SetAccessDate */
/* */
/* Used only by DOS to set access date after we close the */
/* file. Not needed for UNIX. */
/* */
/***************************************************************/
#if defined(__MSDOS__)
/*
* WARNING WARNING WARNING WARNING
* In the version of Turbo C which I have, there is a bug in the
* stdio.h file. The following lines correct the bug. YOU MAY
* HAVE TO REMOVE THESE LINES FOR LATER VERSIONS OF TURBOC
*/
#ifdef __TURBOC__
#ifndef fileno
#define fileno(f) ((f)->fd)
#endif
#endif
#ifdef HAVE_PROTOS
PUBLIC int SetAccessDate(char *fname, int jul)
#else
int SetAccessDate(fname, jul)
char *fname;
int jul;
#endif
{
#ifdef __TURBOC__
int y, m, d;
struct ftime ft;
FILE *f;
FromJulian(jul, &y, &m, &d);
ft.ft_tsec = 0;
ft.ft_min = 0;
ft.ft_hour = 12; /* Arbitrarily set time to noon. */
ft.ft_day = (unsigned int) d;
ft.ft_month = (unsigned int) m+1;
ft.ft_year = (unsigned int) (y - 1980);
f = fopen(fname, "r");
if (!f || setftime(fileno(f) , &ft)) {
#else /* Must be MSC */
if (utime(fname, (struct utimbuf *) NULL)) {
#endif
fprintf(ErrFp, ErrMsg[M_CANTSET_ACCESS], fname);
#ifdef __TURBOC__
if (f) FCLOSE(f);
#endif
return -1;
}
#ifdef __TURBOC__
FCLOSE(f);
#endif
return 0;
}
#endif /* __MSDOS__ */
/***************************************************************/
/* */
/* DestroyCache */
@@ -591,12 +453,7 @@ int jul;
/* Free all the memory used by a cached file. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void DestroyCache(CachedFile *cf)
#else
static void DestroyCache(cf)
CachedFile *cf;
#endif
static void DestroyCache(CachedFile *cf)
{
CachedLine *cl, *cnext;
CachedFile *temp;
@@ -629,11 +486,7 @@ CachedFile *cf;
/* Returns 1 if current file is top level, 0 otherwise. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int TopLevel(void)
#else
int TopLevel()
#endif
int TopLevel(void)
{
return !IStackPtr;
}
@@ -649,13 +502,8 @@ int TopLevel()
/* who we're running as. */
/* As a side effect, if we don't own the file, we disable RUN */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int CheckSafety(void)
#else
static int CheckSafety()
#endif
static int CheckSafety(void)
{
#ifdef UNIX
struct stat statbuf;
if (fp == stdin) {
@@ -695,6 +543,5 @@ static int CheckSafety()
RunDisabled |= RUN_NOTOWNER;
}
#endif
return 1;
}

File diff suppressed because it is too large Load Diff

View File

@@ -9,15 +9,15 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
#include "config.h"
static char const RCSID[] = "$Id: globals.c,v 1.3 1999-04-05 17:34:50 dfs Exp $";
#include <stdio.h> /* For defintion of FILE - sigh! */
#include "types.h"
#include "custom.h"
#define MK_GLOBALS
#include "globals.h"
#include "err.h"

View File

@@ -8,12 +8,10 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
/* $Id: globals.h,v 1.6 1999-04-05 17:34:50 dfs Exp $ */
#ifdef MK_GLOBALS
#undef EXTERN
#define EXTERN
@@ -24,6 +22,8 @@
#define INIT(var, val) var
#endif
#define MINUTES_PER_DAY 1440
#define DaysInYear(y) (((y) % 4) ? 365 : ((!((y) % 100) && ((y) % 400)) ? 365 : 366 ))
#define IsLeapYear(y) (((y) % 4) ? 0 : ((!((y) % 100) && ((y) % 400)) ? 0 : 1 ))
#define DaysInMonth(m, y) ((m) != 1 ? MonthDays[m] : 28 + IsLeapYear(y))
@@ -42,6 +42,8 @@ EXTERN INIT( int ShowAllErrors, 0);
EXTERN INIT( int DebugFlag, 0);
EXTERN INIT( int DoCalendar, 0);
EXTERN INIT( int DoSimpleCalendar, 0);
EXTERN INIT( int DoSimpleCalDelta, 0);
EXTERN INIT( int DoPrefixLineNo, 0);
EXTERN INIT( int MondayFirst, 0);
EXTERN INIT( int Iterations, 1);
EXTERN INIT( int PsCal, 0);
@@ -67,8 +69,9 @@ EXTERN INIT( int DontQueue, 0);
EXTERN INIT( int NumQueued, 0);
EXTERN INIT( int DontIssueAts, 0);
EXTERN INIT( int Daemon, 0);
EXTERN INIT( char DateSep, DATESEP);
EXTERN INIT( char TimeSep, TIMESEP);
EXTERN INIT( int SynthesizeTags, 0);
EXTERN INIT( int ScFormat, SC_AMPM);
EXTERN INIT( int MaxSatIter, 150);
EXTERN INIT( char *FileName, NULL);
@@ -171,12 +174,3 @@ EXTERN int MonthIndex[2][12]
#endif
;
#if defined(__OS2__)
#if defined(_MSC_VER) || defined(__EMX__)
#define OS2MODE (_osmode == OS2_MODE)
#define DOSMODE (_osmode == DOS_MODE)
#else
#define OS2MODE 1
#define DOSMODE 0
#endif
#endif

View File

@@ -6,7 +6,7 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/* Derived from code written by Amos Shapir in 1978; revised */
/* 1985. */
@@ -14,7 +14,6 @@
/***************************************************************/
#include "config.h"
static char const RCSID[] = "$Id: hbcal.c,v 1.3 1999-04-05 17:34:50 dfs Exp $";
#include <stdio.h> /* For FILE used by protos.h - sigh. */
#include "types.h"
@@ -64,7 +63,7 @@ static char MaxMonLen[] = {
30, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 29};
static char HebIsLeap[] = {0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,1};
/***************************************************************/
/* */
/* RoshHashana */
@@ -73,12 +72,7 @@ static char HebIsLeap[] = {0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,1};
/* Hebrew year. (ie, 5751, not 1990) */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int RoshHashana(int i)
#else
int RoshHashana(i)
int i;
#endif
int RoshHashana(int i)
{
long j;
j = DaysToHebYear(i-3744) - CORRECTION;
@@ -93,12 +87,7 @@ int i;
/* from new moon before Tishrey 1 5701. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC long DaysToHebYear(int y)
#else
long DaysToHebYear(y)
int y;
#endif
long DaysToHebYear(int y)
{
long m, nm, dw, s, l;
@@ -131,12 +120,7 @@ int y;
/* */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DaysInHebYear(int y)
#else
int DaysInHebYear(y)
int y;
#endif
int DaysInHebYear(int y)
{
long thisyear, nextyear;
@@ -153,12 +137,7 @@ int y;
/* given the LENGTH of the Hebrew year. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC char *DaysInHebMonths(int ylen)
#else
char *DaysInHebMonths(ylen)
int ylen;
#endif
char *DaysInHebMonths(int ylen)
{
static char monlen[13] =
{30, 29, 30, 29, 30, 0, 29, 30, 29, 30, 29, 30, 29};
@@ -184,12 +163,7 @@ int ylen;
/* non-leap-years. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int HebToJul(int hy, int hm, int hd)
#else
int HebToJul(hy, hm, hd)
int hy, hm, hd;
#endif
int HebToJul(int hy, int hm, int hd)
{
int ylen;
char *monlens;
@@ -222,12 +196,7 @@ int hy, hm, hd;
/* non-leap-years. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void JulToHeb(int jul, int *hy, int *hm, int *hd)
#else
void JulToHeb(jul, hy, hm, hd)
int jul, *hy, *hm, *hd;
#endif
void JulToHeb(int jul, int *hy, int *hm, int *hd)
{
int y, m, d;
int rh;
@@ -263,12 +232,7 @@ int jul, *hy, *hm, *hd;
/* year. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int HebNameToNum(const char *mname)
#else
int HebNameToNum(mname)
char *mname;
#endif
int HebNameToNum(const char *mname)
{
int i;
int m=-1;
@@ -290,12 +254,7 @@ char *mname;
/* year. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC char *HebMonthName(int m, int y)
#else
char *HebMonthName(m, y)
int m, y;
#endif
char *HebMonthName(int m, int y)
{
if (m != ADARA && m != ADARB) return HebMonthNames[m];
@@ -331,13 +290,8 @@ int m, y;
/* Change 30 Adar A to 30 Shvat in nonleap */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int GetValidHebDate(int yin, int min, int din, int adarbehave,
int GetValidHebDate(int yin, int min, int din, int adarbehave,
int *mout, int *dout, int jahr)
#else
int GetValidHebDate(yin, min, din, adarbehave, mout, dout, jahr)
int yin, min, din, adarbehave, *mout, *dout, jahr;
#endif
{
char *monlen;
int ylen;
@@ -436,13 +390,8 @@ int yin, min, din, adarbehave, *mout, *dout, jahr;
/* Returns 0 for success, non-zero for failure. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int GetNextHebrewDate(int julstart, int hm, int hd,
int GetNextHebrewDate(int julstart, int hm, int hd,
int jahr, int adarbehave, int *ans)
#else
int GetNextHebrewDate(julstart, hm, hd, jahr, adarbehave, ans)
int julstart, hm, hd, jahr, adarbehave, *ans;
#endif
{
int r, yout, mout, dout, jul=1;
int adarflag = adarbehave;
@@ -497,12 +446,7 @@ int julstart, hm, hd, jahr, adarbehave, *ans;
/* Given a date of death, compute the value to use for jahr. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int ComputeJahr(int y, int m, int d, int *ans)
#else
int ComputeJahr(y, m, d, ans)
int y, m, d, *ans;
#endif
int ComputeJahr(int y, int m, int d, int *ans)
{
char *monlen;
int len;

View File

@@ -8,37 +8,21 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2007 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
#include "config.h"
static char const RCSID[] = "$Id: init.c,v 1.11 1999-04-12 19:45:27 dfs Exp $";
#define L_IN_INIT 1
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_PWD_H
#include <pwd.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include "types.h"
#include "protos.h"
@@ -58,6 +42,8 @@ static char const RCSID[] = "$Id: init.c,v 1.11 1999-04-12 19:45:27 dfs Exp $";
* -w[n,n,n] = Specify output device width, padding and spacing
* -s[n] = Produce calendar in "simple calendar" format
* -p[n] = Produce calendar in format compatible with rem2ps
* -l = Prefix simple calendar lines with a comment containing
* their trigger line numbers and filenames
* -v = Verbose mode
* -o = Ignore ONCE directives
* -a = Don't issue timed reminders which will be queued
@@ -93,11 +79,8 @@ while (isdigit(*(s))) { \
s++; \
}
#ifdef UNIX
PRIVATE void ChgUser ARGS((char *uname));
#endif
PRIVATE void InitializeVar ARGS ((char *str));
static void ChgUser(char *u);
static void InitializeVar(char *str);
static char *BadDate = "Illegal date on command line\n";
@@ -108,13 +91,7 @@ static char *BadDate = "Illegal date on command line\n";
/* Initialize the system - called only once at beginning! */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void InitRemind(int argc, char *argv[])
#else
void InitRemind(argc, argv)
int argc;
char *argv[];
#endif
void InitRemind(int argc, char *argv[])
{
char *arg;
int i;
@@ -129,13 +106,11 @@ char *argv[];
DBufPuts(&Banner, L_BANNER);
/* Make sure remind is not installed set-uid or set-gid */
#ifdef UNIX
if (getgid() != getegid() ||
getuid() != geteuid()) {
fprintf(ErrFp, "\nRemind should not be installed set-uid or set-gid.\nCHECK YOUR SYSTEM SECURITY.\n");
exit(1);
}
#endif
y = NO_YR;
m = NO_MON;
@@ -150,19 +125,6 @@ char *argv[];
JulianToday = RealToday;
FromJulian(JulianToday, &CurYear, &CurMon, &CurDay);
#if !defined(HAVE_QUEUED)
DontFork = 1;
DontQueue = 1;
NumQueued = 0;
DontIssueAts = 0;
Daemon = 0;
#elif defined(_MSC_VER) || defined(__BORLANDC__)
DontFork = 1;
#elif defined(__OS2__) && defined (__MSDOS__)
if (DOSMODE)
DontFork = 1;
#endif
/* Parse the command-line options */
i = 1;
while (i < argc) {
@@ -184,14 +146,12 @@ char *argv[];
InitializeVar(arg);
while(*arg) arg++;
break;
case 'n':
case 'N':
NextMode = 1;
#ifdef HAVE_QUEUED
DontQueue = 1;
Daemon = 0;
#endif
break;
case 'r':
@@ -209,6 +169,11 @@ char *argv[];
IgnoreOnce = 1;
break;
case 'y':
case 'Y':
SynthesizeTags = 1;
break;
case 't':
case 'T':
InfiniteDelta = 1;
@@ -246,16 +211,12 @@ char *argv[];
}
break;
#if defined(UNIX) && defined(WANT_U_OPTION)
case 'u':
case 'U':
ChgUser(arg);
RunDisabled = RUN_CMDLINE;
while (*arg) arg++;
break;
#endif
#ifdef HAVE_QUEUED
case 'z':
case 'Z':
DontFork = 1;
@@ -285,7 +246,6 @@ char *argv[];
case 'F':
DontFork = 1;
break;
#endif
case 'c':
case 'C':
DoCalendar = 1;
@@ -302,6 +262,10 @@ char *argv[];
case 's':
case 'S':
DoSimpleCalendar = 1;
if (*arg == 'a' || *arg == 'A') {
DoSimpleCalDelta = 1;
arg++;
}
if (*arg == '+') {
arg++;
PARSENUM(CalWeeks, arg);
@@ -316,10 +280,19 @@ char *argv[];
case 'P':
DoSimpleCalendar = 1;
PsCal = 1;
if (*arg == 'a' || *arg == 'A') {
DoSimpleCalDelta = 1;
arg++;
}
PARSENUM(CalMonths, arg);
if (!CalMonths) CalMonths = 1;
break;
case 'l':
case 'L':
DoPrefixLineNo = 1;
break;
case 'w':
case 'W':
if (*arg != ',') {
@@ -403,10 +376,8 @@ char *argv[];
if (SysTime != -1L) Usage();
else {
SysTime = (long) tok.val * 60L;
#ifdef HAVE_QUEUED
DontQueue = 1;
Daemon = 0;
#endif
}
break;
@@ -482,14 +453,10 @@ char *argv[];
/* */
/***************************************************************/
#ifndef L_USAGE_OVERRIDE
#ifdef HAVE_PROTOS
PUBLIC void Usage(void)
#else
void Usage()
#endif /* HAVE_PROTOS */
void Usage(void)
{
fprintf(ErrFp, "\nREMIND %s (%s version) Copyright 1992-1998 by David F. Skoll\n", VERSION, L_LANGNAME);
fprintf(ErrFp, "Copyright 1999 by Roaring Penguin Software Inc.\n");
fprintf(ErrFp, "\nREMIND %s (%s version) Copyright 1992-1998 David F. Skoll\n", VERSION, L_LANGNAME);
fprintf(ErrFp, "Copyright 1999-2007 Roaring Penguin Software Inc.\n");
#ifdef BETA
fprintf(ErrFp, ">>>> BETA VERSION <<<<\n");
#endif
@@ -500,18 +467,17 @@ void Usage()
fprintf(ErrFp, " -c[n] Produce a calendar for n (default 1) months\n");
fprintf(ErrFp, " -c+[n] Produce a calendar for n (default 1) weeks\n");
fprintf(ErrFp, " -w[n[,p[,s]]] Specify width, padding and spacing of calendar\n");
fprintf(ErrFp, " -s[+][n] Produce `simple calendar' for n (1) months (weeks)\n");
fprintf(ErrFp, " -p[n] Same as -s, but input compatible with rem2ps\n");
fprintf(ErrFp, " -s[a][+][n] Produce `simple calendar' for n (1) months (weeks)\n");
fprintf(ErrFp, " -p[a][n] Same as -s, but input compatible with rem2ps\n");
fprintf(ErrFp, " -l Prefix each simple calendar line with line number and filename comment\n");
fprintf(ErrFp, " -v Verbose mode\n");
fprintf(ErrFp, " -o Ignore ONCE directives\n");
fprintf(ErrFp, " -t Trigger all future reminders regardless of delta\n");
fprintf(ErrFp, " -h `Hush' mode - be very quiet\n");
#ifdef HAVE_QUEUED
fprintf(ErrFp, " -a Don't trigger timed reminders immediately - just queue them\n");
fprintf(ErrFp, " -q Don't queue timed reminders\n");
fprintf(ErrFp, " -f Trigger timed reminders by staying in foreground\n");
fprintf(ErrFp, " -z[n] Enter daemon mode, waking every n (5) minutes.\n");
#endif
fprintf(ErrFp, " -d... Debug: e=echo x=expr-eval t=trig v=dumpvars l=showline\n");
fprintf(ErrFp, " -e Divert messages normally sent to stderr to stdout\n");
fprintf(ErrFp, " -b[n] Time format for cal: 0=am/pm, 1=24hr, 2=none\n");
@@ -520,6 +486,7 @@ void Usage()
fprintf(ErrFp, " -g[ddd] Sort reminders by date, time and priority before issuing\n");
fprintf(ErrFp, " -ivar=val Initialize var to val and preserve var\n");
fprintf(ErrFp, " -m Start calendar with Monday rather than Sunday\n");
fprintf(ErrFp, " -y Synthesize tags for tagless reminders\n");
exit(1);
}
#endif /* L_USAGE_OVERRIDE */
@@ -533,13 +500,7 @@ void Usage()
/* USER environment variables. */
/* */
/***************************************************************/
#if defined(UNIX) && defined(WANT_U_OPTION)
#ifdef HAVE_PROTOS
PRIVATE void ChgUser(char *user)
#else
static void ChgUser(user)
char *user;
#endif /* HAVE_PROTOS */
static void ChgUser(char *user)
{
uid_t myuid;
@@ -598,8 +559,6 @@ char *user;
putenv(logname);
}
}
#endif /* UNIX && WANT_U_OPTION */
/***************************************************************/
/* */
/* InitializeVar */
@@ -607,12 +566,7 @@ char *user;
/* Initialize and preserve a variable */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void InitializeVar(char *str)
#else
static void InitializeVar(str)
char *str;
#endif
static void InitializeVar(char *str)
{
char *varname, *expr;

View File

@@ -6,12 +6,10 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
/* $Id: lang.h,v 1.4 1999-04-05 17:34:51 dfs Exp $ */
/* I'm chauvinistic and name each language with its English name... */
#define ENGLISH 0 /* original by David F. Skoll */
@@ -26,8 +24,9 @@
#define ITALIAN 9 /* translated by Valerio Aimale */
#define ROMANIAN 10 /* translated by Liviu Daia */
#define SPANISH 11 /* translated by Rafa Couto */
#define ICELANDIC 12 /* translated by Björn Davíðsson */
/* Add more languages here - but please e-mail aa775@freenet.carleton.ca
/* Add more languages here - but please e-mail dfs@roaringpenguin.com
to have your favorite language assigned a number. If you add a
language, please send me the header file, and permission to include
it in future releases of Remind. Note that you'll get no remuneration
@@ -69,6 +68,8 @@
#include "langs/romanian.h"
#elif LANG == SPANISH
#include "langs/spanish.h"
#elif LANG == ICELANDIC
#include "langs/icelandic.h"
/* If no sensible language, choose English. I intended to use
the #error directive here, but some C compilers barf. */

View File

@@ -7,13 +7,11 @@
/* This file is part of REMIND. */
/* */
/* REMIND is Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright 1999 by Roaring Penguin Software Inc. */
/* Copyright 1999-2000 by Roaring Penguin Software Inc. */
/* This file is Copyright (C) 1993 by Mogens Lynnerup. */
/* */
/***************************************************************/
/* $Id: danish.h,v 1.6 1999-04-05 17:35:05 dfs Exp $ */
/* The very first define in a language support file must be L_LANGNAME: */
#define L_LANGNAME "Danish"
@@ -103,11 +101,11 @@
#define L_AMPM_OVERRIDE(ampm, hour) ampm = (hour < 12) ? (hour<5) ? " om natten" : " om formiddagen" : (hour > 17) ? " om aftenen" : " om eftermiddagen";
#define L_ORDINAL_OVERRIDE plu = ".";
#define L_A_OVER sprintf(s, "%s %s, den %d. %s %d", L_ON, DayName[jul%7], d, MonthName[m], y);
#define L_E_OVER sprintf(s, "den %02d%c%02d%c%04d", d, DATESEP, m+1, DATESEP, y);
#define L_F_OVER sprintf(s, "den %02d%c%02d%c%04d", m+1, DATESEP, d, DATESEP, y);
#define L_E_OVER sprintf(s, "den %02d%c%02d%c%04d", d, DateSep, m+1, DateSep, y);
#define L_F_OVER sprintf(s, "den %02d%c%02d%c%04d", m+1, DateSep, d, DateSep, y);
#define L_G_OVER sprintf(s, "%s %s, den %d. %s", L_ON, DayName[jul%7], d, MonthName[m]);
#define L_H_OVER sprintf(s, "den %02d%c%02d", d, DATESEP, m+1);
#define L_I_OVER sprintf(s, "den %02d%c%02d", m+1, DATESEP, d);
#define L_H_OVER sprintf(s, "den %02d%c%02d", d, DateSep, m+1);
#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

View File

@@ -12,12 +12,10 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright 1999 by Roaring Penguin Software Inc. */
/* Copyright 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
/* $Id: dutch.h,v 1.4 1999-04-05 17:35:06 dfs Exp $ */
/* The very first define in a language support file must be L_LANGNAME: */
#define L_LANGNAME "Dutch"

View File

@@ -6,12 +6,10 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright 1999 by Roaring Penguin Software Inc. */
/* Copyright 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
/* $Id: english.h,v 1.4 1999-04-05 17:35:06 dfs Exp $ */
/* The very first define in a language support file must be L_LANGNAME: */
#define L_LANGNAME "English"

View File

@@ -12,12 +12,10 @@
/* This file is part of REMIND. */
/* This file is Copyright (C) 1993-1998 by Mikko Silvonen. */
/* REMIND is Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright 1999 by Roaring Penguin Software Inc. */
/* Copyright 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
/* $Id: finnish.h,v 1.8 1999-04-12 19:45:41 dfs Exp $ */
/* The very first define in a language support file must be L_LANGNAME: */
#define L_LANGNAME "Finnish"
@@ -166,18 +164,18 @@
#define L_A_OVER sprintf(s, "%s%s %d. %s%s %d", DayName[jul%7], L_ON, d, \
MonthName[m], L_PARTIT, y);
#define L_C_OVER sprintf(s, "%s%s", DayName[jul%7], L_ON);
#define L_E_OVER sprintf(s, "%02d%c%02d%c%04d", d, DATESEP, m+1, DATESEP, \
#define L_E_OVER sprintf(s, "%02d%c%02d%c%04d", d, DateSep, m+1, DateSep, \
y);
#define L_F_OVER sprintf(s, "%02d%c%02d%c%04d", m+1, DATESEP, d, DATESEP, y);
#define L_F_OVER sprintf(s, "%02d%c%02d%c%04d", m+1, DateSep, d, DateSep, y);
#define L_G_OVER sprintf(s, "%s%s %d. %s%s", DayName[jul%7], L_ON, d, \
MonthName[m], L_PARTIT);
#define L_H_OVER sprintf(s, "%02d%c%02d", d, DATESEP, m+1);
#define L_I_OVER sprintf(s, "%02d%c%02d", m+1, DATESEP, d);
#define L_H_OVER sprintf(s, "%02d%c%02d", d, DateSep, m+1);
#define L_I_OVER sprintf(s, "%02d%c%02d", m+1, DateSep, d);
#define L_J_OVER sprintf(s, "%s%s %sn %d%s %d", DayName[jul%7], L_ON, \
MonthName[m], d, plu, y);
#define L_K_OVER sprintf(s, "%s%s %sn %d%s", DayName[jul%7], L_ON, \
MonthName[m], d, plu);
#define L_L_OVER sprintf(s, "%04d%c%02d%c%02d", y, DATESEP, m+1, DATESEP, d);
#define L_L_OVER sprintf(s, "%04d%c%02d%c%02d", y, DateSep, m+1, DateSep, d);
#define L_Q_OVER sprintf(s, "n");
#define L_U_OVER sprintf(s, "%s%s %d%s %s%s %d", DayName[jul%7], L_ON, \
d, plu, MonthName[m], L_PARTIT, y);
@@ -284,7 +282,7 @@ EXTERN char *ErrMsg[] =
"AT-sanan per\xE4st\xE4 puuttuu aika",
"UNTIL-sanaa k\xE4ytetty kahdesti",
"Ep\xE4t\xE4ydellinen p\xE4iv\xE4ys",
"SCANFROM-sanaa k\xE4ytetty kahdesti",
"FROM/SCANFROM-sanaa k\xE4ytetty kahdesti",
"Muuttuja",
"Arvo",
"*M\xC4\xC4RITTELEM\xC4T\xD6N*",
@@ -308,7 +306,8 @@ EXTERN char *ErrMsg[] =
"Ei viestej\xE4.",
"%d viesti(\xE4) t\xE4m\xE4n p\xE4iv\xE4n jonossa.\n",
"Numero puuttuu",
"Virheellinen funktio WARN-lausekkeessa"
"Virheellinen funktio WARN-lausekkeessa",
"Can't convert between time zones"
#elif IBMEXTENDED
"Ok",
@@ -385,7 +384,7 @@ EXTERN char *ErrMsg[] =
"AT-sanan per\x84st\x84 puuttuu aika",
"UNTIL-sanaa k\x84ytetty kahdesti",
"Ep\x84t\x84ydellinen p\x84iv\x84ys",
"SCANFROM-sanaa k\x84ytetty kahdesti",
"FROM/SCANFROM-sanaa k\x84ytetty kahdesti",
"Muuttuja",
"Arvo",
"*M\x8E\x8ERITTELEM\x8ET\x99N*",
@@ -409,7 +408,8 @@ EXTERN char *ErrMsg[] =
"Ei viestej\x84.",
"%d viesti(\x84) t\x84m\x84n p\x84iv\x84n jonossa.\n",
"Numero puuttuu"
"Virheellinen funktio WARN-lausekkeessa"
"Virheellinen funktio WARN-lausekkeessa",
"Can't convert between time zones"
#else
"Ok",
"Puuttuva ']'",
@@ -485,7 +485,7 @@ EXTERN char *ErrMsg[] =
"AT-sanan per{st{ puuttuu aika",
"UNTIL-sanaa k{ytetty kahdesti",
"Ep{t{ydellinen p{iv{ys",
"SCANFROM-sanaa k{ytetty kahdesti",
"FROM/SCANFROM-sanaa k{ytetty kahdesti",
"Muuttuja",
"Arvo",
"*M[[RITTELEM[T\\N*",
@@ -509,7 +509,9 @@ EXTERN char *ErrMsg[] =
"Ei viestej{.",
"%d viesti({) t{m{n p{iv{n jonossa.\n",
"Numero puuttuu",
"Virheellinen funktio WARN-lausekkeessa"
"Virheellinen funktio WARN-lausekkeessa",
"Can't convert between time zones"
#endif
};
#endif /* MK_GLOBALS */
@@ -517,14 +519,10 @@ EXTERN char *ErrMsg[] =
/* The following is only used in init.c */
#ifdef L_IN_INIT
#define L_USAGE_OVERRIDE 1
#ifdef HAVE_PROTOS
PUBLIC void Usage(void)
#else
void Usage()
#endif /* HAVE_PROTOS */
void Usage(void)
{
fprintf(ErrFp, "\nREMIND %s (%s version) Copyright 1992-1998 by David F. Skoll\n", VERSION, L_LANGNAME);
fprintf(ErrFp, "Copyright 1999 by Roaring Penguin Software Inc.\n");
fprintf(ErrFp, "\nREMIND %s (%s version) Copyright 1992-1998 David F. Skoll\n", VERSION, L_LANGNAME);
fprintf(ErrFp, "Copyright 1999-2000 Roaring Penguin Software Inc.\n");
#ifdef BETA
fprintf(ErrFp, ">>>> BETAVERSIO <<<<\n");
#endif

View File

@@ -9,14 +9,12 @@
/* This file is part of REMIND. */
/* */
/* REMIND is Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright 1999 by Roaring Penguin Software Inc. */
/* Copyright 1999-2000 by Roaring Penguin Software Inc. */
/* This file is Copyright (C) 1993 by Laurent Duperval and */
/* David F. Skoll. */
/* */
/***************************************************************/
/* $Id: french.h,v 1.7 1999-04-12 19:45:42 dfs Exp $ */
/* The very first define in a language support file must be L_LANGNAME: */
#define L_LANGNAME "French"
@@ -221,7 +219,7 @@ EXTERN char *ErrMsg[] =
"Heure attendue apr\350s AT",
"Mot-cl\351 UNTIL utilis\351 deux fois",
"Sp\351cification de date incompl\350te",
"Mot-cl\351 SCANFROM utilis\351 deux fois",
"Mot-cl\351 FROM/SCANFROM utilis\351 deux fois",
"Variable",
"Valeur",
"*NON-DEFINI*",
@@ -245,7 +243,8 @@ EXTERN char *ErrMsg[] =
"Pas de rappels.",
"%d rappel(s) en file pour aujourd'hui.\n",
"Nombre attendu",
"Fonction ill\351gale apr\350s WARN"
"Fonction ill\351gale apr\350s WARN",
"Can't convert between time zones"
#else /* ISOLATIN1 */
"Ok",
"']' manquant",
@@ -321,7 +320,7 @@ EXTERN char *ErrMsg[] =
"Heure attendue apres AT",
"Mot-cle UNTIL utilise deux fois",
"Specification de date incomplete",
"Mot-cle SCANFROM utilise deux fois",
"Mot-cle FROM/SCANFROM utilise deux fois",
"Variable",
"Valeur",
"*NON-DEFINI*",
@@ -345,7 +344,8 @@ EXTERN char *ErrMsg[] =
"Pas de rappels.",
"%d rappel(s) en file pour aujourd'hui.\n",
"Nombre attendu",
"Fonction illegale apres WARN"
"Fonction illegale apres WARN",
"Can't convert between time zones"
#endif /* ISOLATIN1 */
};
#endif /* MK_GLOBALS */
@@ -353,14 +353,10 @@ EXTERN char *ErrMsg[] =
/* The following is only used in init.c */
#ifdef L_IN_INIT
#define L_USAGE_OVERRIDE 1
#ifdef HAVE_PROTOS
PUBLIC void Usage(void)
#else
void Usage()
#endif /* HAVE_PROTOS */
void Usage(void)
{
fprintf(ErrFp, "\nREMIND %s (%s version) Copyright 1992-1998 by David F. Skoll\n", VERSION, L_LANGNAME);
fprintf(ErrFp, "Copyright 1999 by Roaring Penguin Software Inc.\n");
fprintf(ErrFp, "\nREMIND %s (%s version) Copyright 1992-1998 David F. Skoll\n", VERSION, L_LANGNAME);
fprintf(ErrFp, "Copyright 1999-2000 Roaring Penguin Software Inc.\n");
#ifdef BETA
fprintf(ErrFp, ">>>> BETA VERSION <<<<\n");
#endif

View File

@@ -10,12 +10,10 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright 1999 by Roaring Penguin Software Inc. */
/* Copyright 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
/* $Id: german.h,v 1.5 1999-04-05 17:35:08 dfs Exp $ */
/* The very first define in a language support file must be L_LANGNAME: */
#define L_LANGNAME "German"

84
src/langs/icelandic.h Normal file
View File

@@ -0,0 +1,84 @@
/***************************************************************/
/* */
/* ICELANDIC.H */
/* */
/* Support for the Icelandic language. */
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright 1999-2000 by Roaring Penguin Software Inc. */
/* Translated by Björn Davíðsson (bjossi@snerpa.is) */
/* */
/***************************************************************/
/* The very first define in a language support file must be L_LANGNAME: */
#define L_LANGNAME "Icelandic"
/* Day names */
#define L_SUNDAY "sunnudagur"
#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_SATURDAY "laugardagur"
/* Month names */
#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_SEP "september"
#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"
/* The default banner */
#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ú"
/* "in %d days' time" */
#define L_INXDAYS "eftir %d daga"
/* "on" as in "on date..." */
#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_AT "kl."
#define L_MINUTE "mínútu"
#define L_HOUR "klukkustund"
#define L_IS "er"
#define L_WAS "var"
#define L_AND "og"
/* What to add to make "hour" plural */
#define L_HPLU "ir"
/* What to add to make "minute" plural */
#define L_MPLU "r"
/* 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

@@ -8,12 +8,10 @@
/* It is Copyright (C) 1996 by Valerio Aimale */
/* */
/* Remind is copyright (C) 1992-1998 by David F. Skoll */
/* Copyright 1999 by Roaring Penguin Software Inc. */
/* Copyright 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
/* $Id: italian.h,v 1.5 1999-04-05 17:35:09 dfs Exp $ */
/* The very first define in a language support file must be L_LANGNAME: */
#define L_LANGNAME "Italian"
@@ -108,23 +106,23 @@
MonthName[m], y);
#define L_C_OVER sprintf(s, "%s", DayName[jul%7]);
#define L_E_OVER sprintf(s, "%02d%c%02d%c%04d", d, DATESEP,\
m+1, DATESEP, y);
#define L_E_OVER sprintf(s, "%02d%c%02d%c%04d", d, DateSep,\
m+1, DateSep, y);
#define L_F_OVER sprintf(s, "%02d%c%02d%c%04d", m+1, DATESEP, d, DATESEP, y);
#define L_F_OVER sprintf(s, "%02d%c%02d%c%04d", m+1, DateSep, d, DateSep, y);
#define L_G_OVER sprintf(s, "%s, %d %s", DayName[jul%7], d, MonthName[m]);
#define L_H_OVER sprintf(s, "%02d%c%02d", d, DATESEP, m+1);
#define L_H_OVER sprintf(s, "%02d%c%02d", d, DateSep, m+1);
#define L_I_OVER sprintf(s, "%02d%c%02d", m+1, DATESEP, d);
#define L_I_OVER sprintf(s, "%02d%c%02d", m+1, DateSep, d);
#define L_J_OVER sprintf(s, "%s, %d %s %d", DayName[jul%7], d, \
MonthName[m], y);
#define L_K_OVER sprintf(s, "%s, %d %s", DayName[jul%7], d, \
MonthName[m]);
#define L_L_OVER sprintf(s, "%04d%c%02d%c%02d", y, DATESEP, m+1, DATESEP, d);
#define L_L_OVER sprintf(s, "%04d%c%02d%c%02d", y, DateSep, m+1, DateSep, d);
#define L_U_OVER sprintf(s, "%s, %d %s %d", DayName[jul%7], d, \
MonthName[m], y);

View File

@@ -7,12 +7,10 @@
/* This file is part of REMIND. */
/* This file is Copyright (C) 1993 by Trygve Randen. */
/* Remind is Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright 1999 by Roaring Penguin Software Inc. */
/* Copyright 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
/* $Id: norwgian.h,v 1.5 1999-04-05 17:35:09 dfs Exp $ */
/* The very first define in a language support file must be L_LANGNAME: */
#define L_LANGNAME "Norwegian"

View File

@@ -10,12 +10,10 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright 1999 by Roaring Penguin Software Inc. */
/* Copyright 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
/* $Id: polish.h,v 1.7 1999-04-12 19:45:43 dfs Exp $ */
/* The very first define in a language support file must be L_LANGNAME: */
#define L_LANGNAME "Polish"
@@ -256,7 +254,7 @@ EXTERN char *ErrMsg[] =
"Po AT oczekiwany jest czas",
"S\263owo UNTIL u\277yte dw\363krotnie",
"Niekompletna specyfikacja daty",
"S\263owo SCANFROM u\277yte dw\363krotnie",
"S\263owo FROM/SCANFROM u\277yte dw\363krotnie",
"Zmienna",
"Warto\266\346",
"*NIE ZDEFINIOWANE*",
@@ -280,7 +278,8 @@ EXTERN char *ErrMsg[] =
"Brak przypomnie\361.",
"%d Przypomnienia zakolejkowane na p\363\274niej.\n",
"Spodziewana liczba",
"Illegal function in WARN clause (NEEDS TRANSLATION TO POLISH)"
"Illegal function in WARN clause (NEEDS TRANSLATION TO POLISH)",
"Can't convert between time zones"
#else /* ISOLATIN1 */
"OK",
"Brakujacy ']'",
@@ -356,7 +355,7 @@ EXTERN char *ErrMsg[] =
"Po AT oczekiwany jest czas",
"Slowo UNTIL uzyte dwokrotnie",
"Niekompletna specyfikacja daty",
"Slowo SCANFROM uzyte dwokrotnie",
"Slowo FROM/SCANFROM uzyte dwokrotnie",
"Zmienna",
"Wartosc",
"*UNDEFINED*",
@@ -380,7 +379,8 @@ EXTERN char *ErrMsg[] =
"Brak przypomnien.",
"%d Przypomnienia zakolejkowane na pozniej.\n",
"Spodziewana liczba",
"Illegal function in WARN clause (NEEDS TRANSLATION TO POLISH)"
"Illegal function in WARN clause (NEEDS TRANSLATION TO POLISH)",
"Can't convert between time zones"
#endif /* ISOLATIN1 */
};
#endif /* MK_GLOBALS */
@@ -388,14 +388,10 @@ EXTERN char *ErrMsg[] =
/* The following is only used in init.c */
#ifdef L_IN_INIT
#define L_USAGE_OVERRIDE 1
#ifdef HAVE_PROTOS
PUBLIC void Usage(void)
#else
void Usage()
#endif /* HAVE_PROTOS */
void Usage(void)
{
fprintf(ErrFp, "\nREMIND %s (%s version) Copyright 1992-1998 by David F. Skoll\n", VERSION, L_LANGNAME);
fprintf(ErrFp, "Copyright 1999 by Roaring Penguin Software Inc.\n");
fprintf(ErrFp, "\nREMIND %s (%s version) Copyright 1992-1998 David F. Skoll\n", VERSION, L_LANGNAME);
fprintf(ErrFp, "Copyright 1999-2000 Roaring Penguin Software Inc.\n");
#ifdef BETA
fprintf(ErrFp, ">>>> BETA VERSION <<<<\n");
#endif

View File

@@ -9,14 +9,12 @@
/* This file is part of REMIND. */
/* */
/* REMIND is Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright 1999 by Roaring Penguin Software Inc. */
/* Copyright 1999-2000 by Roaring Penguin Software Inc. */
/* This file is Copyright (C) 1996 by Marco Paganini and */
/* David F. Skoll. */
/* */
/***************************************************************/
/* $Id: portbr.h,v 1.6 1999-04-12 19:45:43 dfs Exp $ */
/* The very first define in a language support file must be L_LANGNAME: */
#define L_LANGNAME "Brazilian Portuguese"
@@ -222,7 +220,7 @@ EXTERN char *ErrMsg[] =
"Esperando hora apos AT",
"Keyword UNTIL usada duas vezes",
"Especificacao de data incompleta",
"Keyword SCANFROM usada duas vezes",
"Keyword FROM/SCANFROM usada duas vezes",
"Variavel",
"Valor",
"*INDEFINIDO*",
@@ -246,21 +244,18 @@ EXTERN char *ErrMsg[] =
"Sem compromissos.",
"%d compromisso(s) colocados na fila para mais tarde.\n",
"Esperando numero",
"Funcao ilegal na clausula WARN"
"Funcao ilegal na clausula WARN",
"Can't convert between time zones"
};
#endif /* MK_GLOBALS */
/* The following is only used in init.c */
#ifdef L_IN_INIT
#define L_USAGE_OVERRIDE 1
#ifdef HAVE_PROTOS
PUBLIC void Usage(void)
#else
void Usage()
#endif /* HAVE_PROTOS */
void Usage(void)
{
fprintf(ErrFp, "\nREMIND %s (versao %s) (C) 1992-1998 by David F. Skoll\n", VERSION, L_LANGNAME);
fprintf(ErrFp, "(C) 1999 by Roaring Penguin Software Inc.\n");
fprintf(ErrFp, "\nREMIND %s (versao %s) (C) 1992-1998 David F. Skoll\n", VERSION, L_LANGNAME);
fprintf(ErrFp, "(C) 1999-2000 Roaring Penguin Software Inc.\n");
#ifdef BETA
fprintf(ErrFp, ">>>> VERSAO BETA <<<<\n");
#endif

View File

@@ -9,13 +9,11 @@
/* This file is part of REMIND. */
/* */
/* REMIND is Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright 1999 by Roaring Penguin Software Inc. */
/* Copyright 1999-2000 by Roaring Penguin Software Inc. */
/* This file is Copyright (C) 1996-1998 by Liviu Daia */
/* */
/***************************************************************/
/* $Id: romanian.h,v 1.5 1999-04-05 17:35:10 dfs Exp $ */
/* The very first define in a language support file must be L_LANGNAME: */
#define L_LANGNAME "Romanian"

View File

@@ -8,12 +8,10 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright 1999 by Roaring Penguin Software Inc. */
/* Copyright 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
/* $Id: spanish.h,v 1.2 1999-04-05 17:35:11 dfs Exp $ */
#define L_LANGNAME "Spanish"
/* Nombres de los di'as de la semana */

View File

@@ -7,34 +7,18 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
#include "config.h"
static char const RCSID[] = "$Id: main.c,v 1.10 1999-04-05 17:34:52 dfs Exp $";
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <stdio.h>
#include <signal.h>
#include <string.h>
#ifdef HAVE_STDARG_H
#include <stdarg.h>
#else
#include <varargs.h>
#endif
#include <ctype.h>
#ifdef TIME_WITH_SYS_TIME
@@ -48,17 +32,7 @@ static char const RCSID[] = "$Id: main.c,v 1.10 1999-04-05 17:34:52 dfs Exp $";
#endif
#endif
#ifdef AMIGA
#include <sys/types.h>
#endif
#if defined(__MSDOS__) || defined(__OS2__)
#include <dos.h>
#endif
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#include "types.h"
#include "protos.h"
@@ -66,21 +40,11 @@ static char const RCSID[] = "$Id: main.c,v 1.10 1999-04-05 17:34:52 dfs Exp $";
#include "globals.h"
#include "err.h"
PRIVATE void DoReminders ARGS ((void));
#if !defined(HAVE_TIMEGM) && !defined(HAVE_MKTIME)
PRIVATE long time_cheat ARGS ((int year, int month));
long timegm ARGS((struct tm *tm));
long timelocal ARGS((struct tm *tm));
#endif
static void DoReminders(void);
/* Whooo... the putchar/Putchar/PutChar macros are a mess...
my apologies... */
#ifdef OS2_POPUP
#define Putchar(c) {if (AsPopUp) PutcPopUp(c); else putchar(c);}
#else
#define Putchar(c) PutChar(c)
#endif
/***************************************************************/
/***************************************************************/
@@ -89,17 +53,9 @@ long timelocal ARGS((struct tm *tm));
/** **/
/***************************************************************/
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int main(int argc, char *argv[])
#else
int main(argc, argv)
int argc;
char *argv[];
#endif
int main(int argc, char *argv[])
{
#ifdef HAVE_QUEUED
int pid;
#endif
/* The very first thing to do is to set up ErrFp to be stderr */
ErrFp = stderr;
@@ -109,7 +65,7 @@ char *argv[];
ArgV = argv;
InitRemind(argc, argv);
if(DoCalendar || DoSimpleCalendar) {
if (DoCalendar || (DoSimpleCalendar && (!NextMode || PsCal))) {
ProduceCalendar();
return 0;
}
@@ -128,32 +84,17 @@ char *argv[];
if (!Hush) {
if (DestroyOmitContexts())
Eprint("%s", ErrMsg[E_PUSH_NOPOP]);
#ifdef HAVE_QUEUED
if (!Daemon && !NextMode && !NumTriggered && !NumQueued) {
printf("%s\n", ErrMsg[E_NOREMINDERS]);
} else if (!Daemon && !NextMode && !NumTriggered) {
printf(ErrMsg[M_QUEUED], NumQueued);
}
#else
if (!NextMode && !NumTriggered) {
printf("%s\n", ErrMsg[E_NOREMINDERS]);
}
#endif
}
/* If it's MS-DOS, reset the file access date. */
/* Note that OS/2 and DOS bound programs have __MSDOS__ */
/* defined, so this test should probably be modified. */
#if defined(__MSDOS__)
if (!UseStdin && (RealToday == JulianToday))
SetAccessDate(InitialFile, RealToday);
#endif
/* If there are sorted reminders, handle them */
if (SortByDate) IssueSortedReminders();
/* If there are any background reminders queued up, handle them */
#ifdef HAVE_QUEUED
if (NumQueued || Daemon) {
if (DontFork) {
@@ -171,7 +112,6 @@ char *argv[];
}
}
}
#endif
if (Iterations) {
ClearGlobalOmits();
DestroyOmitContexts();
@@ -190,11 +130,7 @@ char *argv[];
/* The normal case - we're not doing a calendar. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void DoReminders(void)
#else
static void DoReminders()
#endif
static void DoReminders(void)
{
int r;
Token tok;
@@ -308,12 +244,7 @@ static void DoReminders()
/* 1 January 1990. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int Julian(int year, int month, int day)
#else
int Julian(year, month, day)
int day, month, year;
#endif
int Julian(int year, int month, int day)
{
int y1 = BASE-1, y2 = year-1;
@@ -332,13 +263,7 @@ int day, month, year;
/* Convert a Julian date to year, month, day. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void FromJulian(int jul, int *y, int *m, int *d)
#else
void FromJulian(jul, y, m, d)
int jul;
int *y, *m, *d;
#endif
void FromJulian(int jul, int *y, int *m, int *d)
{
int try_yr = (jul / 365) + BASE;
int try_mon = 0;
@@ -378,14 +303,7 @@ int *y, *m, *d;
/* zero, then just peek ahead; don't advance pointer. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int ParseChar(ParsePtr p, int *err, int peek)
#else
int ParseChar(p, err, peek)
ParsePtr p;
int *err;
int peek;
#endif
int ParseChar(ParsePtr p, int *err, int peek)
{
Value val;
int r;
@@ -457,14 +375,7 @@ int peek;
/* Parse the next non-space character. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int ParseNonSpaceChar(ParsePtr p, int *err, int peek)
#else
int ParseNonSpaceChar(p, err, peek)
ParsePtr p;
int *err;
int peek;
#endif
int ParseNonSpaceChar(ParsePtr p, int *err, int peek)
{
int ch;
@@ -487,13 +398,7 @@ int peek;
/* Parse a token delimited by whitespace. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int ParseToken(ParsePtr p, DynamicBuffer *dbuf)
#else
int ParseToken(p, dbuf)
ParsePtr p;
DynamicBuffer *dbuf;
#endif
int ParseToken(ParsePtr p, DynamicBuffer *dbuf)
{
int c, err;
@@ -529,13 +434,7 @@ DynamicBuffer *dbuf;
/* invalid. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int ParseIdentifier(ParsePtr p, DynamicBuffer *dbuf)
#else
int ParseIdentifier(p, dbuf)
ParsePtr p;
DynamicBuffer *dbuf;
#endif
int ParseIdentifier(ParsePtr p, DynamicBuffer *dbuf)
{
int c, err;
@@ -577,13 +476,7 @@ DynamicBuffer *dbuf;
/* return the value. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int EvaluateExpr(ParsePtr p, Value *v)
#else
int EvaluateExpr(p, v)
ParsePtr p;
Value *v;
#endif
int EvaluateExpr(ParsePtr p, Value *v)
{
int bracketed = 0;
@@ -610,23 +503,9 @@ Value *v;
/* Eprint - print an error message. */
/* */
/***************************************************************/
#ifdef HAVE_STDARG_H
#ifdef HAVE_PROTOS
PUBLIC void Eprint(const char *fmt, ...)
#else
void Eprint(fmt)
char *fmt;
#endif
#else
/*VARARGS0*/
void Eprint(va_alist)
va_dcl
#endif
void Eprint(const char *fmt, ...)
{
va_list argptr;
#ifndef HAVE_STDARG_H
char *fmt;
#endif
/* Check if more than one error msg. from this line */
if (!FreshLine && !ShowAllErrors) return;
@@ -640,17 +519,10 @@ va_dcl
if (DebugFlag & DB_PRTLINE) OutputLine(ErrFp);
} else fprintf(ErrFp, " ");
#ifdef HAVE_STDARG_H
va_start(argptr, fmt);
#else
va_start(argptr);
fmt = va_arg(argptr, char *);
#endif
(void) vfprintf(ErrFp, fmt, argptr);
(void) fputc('\n', ErrFp);
#ifndef HAVE_STDARG_H
va_end(argptr);
#endif
return;
}
@@ -662,12 +534,7 @@ va_dcl
/* simply involves escaping newlines. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void OutputLine(FILE *fp)
#else
void OutputLine(fp)
FILE *fp;
#endif
void OutputLine(FILE *fp)
{
register char *s = CurLine;
register char c = 0;
@@ -687,13 +554,7 @@ FILE *fp;
/* Create a parser given a string buffer */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void CreateParser(char *s, ParsePtr p)
#else
void CreateParser(s, p)
char *s;
ParsePtr p;
#endif
void CreateParser(char *s, ParsePtr p)
{
p->text = s;
p->pos = s;
@@ -712,12 +573,7 @@ ParsePtr p;
/* Destroy a parser, freeing up resources used. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void DestroyParser(ParsePtr p)
#else
void DestroyParser(p)
ParsePtr p;
#endif
void DestroyParser(ParsePtr p)
{
if (p->isnested && p->etext) {
free(p->etext);
@@ -733,13 +589,7 @@ ParsePtr p;
/* on a per-parser basis. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int PushToken(const char *tok, ParsePtr p)
#else
int PushToken(tok, p)
char *tok;
ParsePtr p;
#endif
int PushToken(const char *tok, ParsePtr p)
{
DBufFree(&p->pushedToken);
if (DBufPuts(&p->pushedToken, (char *) tok) != OK ||
@@ -758,26 +608,8 @@ ParsePtr p;
/* Return the system time in seconds past midnight */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC long SystemTime(int realtime)
#else
long SystemTime(realtime)
int realtime;
#endif
long SystemTime(int realtime)
{
#if defined( __MSDOS__ ) && defined( __TURBOC__ )
/* Get time in Turbo C */
struct time t;
/* If time was supplied on command line, return it. */
if (!realtime && (SysTime != -1L)) return SysTime;
gettime(&t);
return (long) t.ti_hour * 3600L + (long) t.ti_min * 60L +
(long) t.ti_sec;
#else
/* Get time in Unix or with MSC */
time_t tloc;
struct tm *t;
@@ -787,8 +619,8 @@ int realtime;
t = localtime(&tloc);
return (long) t->tm_hour * 3600L + (long) t->tm_min * 60L +
(long) t->tm_sec;
#endif
}
/***************************************************************/
/* */
/* SystemDate */
@@ -798,25 +630,8 @@ int realtime;
/* year.) */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int SystemDate(int *y, int *m, int *d)
#else
int SystemDate(y, m, d)
int *d;
int *m;
int *y;
#endif
int SystemDate(int *y, int *m, int *d)
{
#if defined( __MSDOS__ ) && defined( __TURBOC__ )
/* Get today's date in Turbo C */
struct date da;
getdate(&da);
*y = da.da_year;
*m = da.da_mon - 1;
*d = da.da_day;
#else
/* Get today's date in UNIX or with MSC */
time_t tloc;
struct tm *t;
@@ -826,7 +641,7 @@ int *y;
*d = t->tm_mday;
*m = t->tm_mon;
*y = t->tm_year + 1900;
#endif
return Julian(*y, *m, *d);
}
@@ -836,12 +651,7 @@ int *y;
/* DoIf - handle the IF command. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoIf(ParsePtr p)
#else
int DoIf(p)
ParsePtr p;
#endif
int DoIf(ParsePtr p)
{
Value v;
int r;
@@ -875,12 +685,7 @@ ParsePtr p;
/* DoElse - handle the ELSE command. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoElse(ParsePtr p)
#else
int DoElse(p)
ParsePtr p;
#endif
int DoElse(ParsePtr p)
{
unsigned syndrome;
@@ -899,12 +704,7 @@ ParsePtr p;
/* DoEndif - handle the Endif command. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoEndif(ParsePtr p)
#else
int DoEndif(p)
ParsePtr p;
#endif
int DoEndif(ParsePtr p)
{
if (!NumIfs) return E_ENDIF_NO_IF;
NumIfs--;
@@ -918,12 +718,7 @@ ParsePtr p;
/* Handle the IFTRIG command. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoIfTrig(ParsePtr p)
#else
int DoIfTrig(p)
ParsePtr p;
#endif
int DoIfTrig(ParsePtr p)
{
int r;
unsigned syndrome;
@@ -959,11 +754,7 @@ ParsePtr p;
/* stack, should we ignore the current line? */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int ShouldIgnoreLine(void)
#else
int ShouldIgnoreLine()
#endif
int ShouldIgnoreLine(void)
{
register int i, syndrome;
@@ -985,12 +776,7 @@ int ShouldIgnoreLine()
/* Verify that current line contains no more tokens. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int VerifyEoln(ParsePtr p)
#else
int VerifyEoln(p)
ParsePtr p;
#endif
int VerifyEoln(ParsePtr p)
{
int r;
@@ -1016,12 +802,7 @@ ParsePtr p;
/* Set the debug options under program control. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoDebug(ParsePtr p)
#else
int DoDebug(p)
ParsePtr p;
#endif
int DoDebug(ParsePtr p)
{
int err;
int ch;
@@ -1090,12 +871,7 @@ ParsePtr p;
/* reminder is issued. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoBanner(ParsePtr p)
#else
int DoBanner(p)
ParsePtr p;
#endif
int DoBanner(ParsePtr p)
{
int err;
int c;
@@ -1133,12 +909,7 @@ ParsePtr p;
/* */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoRun(ParsePtr p)
#else
int DoRun(p)
ParsePtr p;
#endif
int DoRun(ParsePtr p)
{
int r;
@@ -1170,12 +941,7 @@ ParsePtr p;
/* Flush stdout and stderr */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoFlush(ParsePtr p)
#else
int DoFlush(p)
ParsePtr p;
#endif
int DoFlush(ParsePtr p)
{
fflush(stdout);
fflush(stderr);
@@ -1189,12 +955,7 @@ ParsePtr p;
/* Handle the EXIT command. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void DoExit(ParsePtr p)
#else
void DoExit(p)
ParsePtr p;
#endif
void DoExit(ParsePtr p)
{
int r;
Value v;
@@ -1211,12 +972,7 @@ ParsePtr p;
/* Issue an error message under program control. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoErrMsg(ParsePtr p)
#else
int DoErrMsg(p)
ParsePtr p;
#endif
int DoErrMsg(ParsePtr p)
{
TimeTrig tt;
Trigger t;
@@ -1258,12 +1014,7 @@ static int FoldArray[2][7] = {
{2024, 2008, 2020, 2004, 2016, 2000, 2012}
};
#ifdef HAVE_PROTOS
PUBLIC int CalcMinsFromUTC(int jul, int tim, int *mins, int *isdst)
#else
int CalcMinsFromUTC(jul, tim, mins, isdst)
int jul, tim, *mins, *isdst;
#endif
int CalcMinsFromUTC(int jul, int tim, int *mins, int *isdst)
{
/* Convert jul and tim to an Unix tm struct */
@@ -1291,11 +1042,6 @@ int jul, tim, *mins, *isdst;
local.tm_isdst = -1; /* We don't know whether or not dst is in effect */
#if !defined(HAVE_MKTIME)
loc_t = timelocal(&local);
local.tm_isdst = 0;
utc_t = timegm(&local);
#else
/* Horrible contortions to get minutes from UTC portably */
loc_t = mktime(&local);
if (loc_t == -1) return 1;
@@ -1308,21 +1054,10 @@ int jul, tim, *mins, *isdst;
utc.tm_isdst = 0;
utc_t = mktime(&utc);
if (utc_t == -1) return 1;
#endif
/* Compute difference between local time and UTC in seconds.
Be careful, since time_t might be unsigned. */
#ifdef HAVE_DIFFTIME
tdiff = (int) difftime(loc_t, utc_t);
#else
/* time_t may be unsigned, hence the contortions */
if (loc_t < utc_t) {
tdiff = - (int) (utc_t - loc_t);
} else {
tdiff = (int) (loc_t - utc_t);
}
#endif
if (isdst_tmp) tdiff += 60*60;
if (mins) *mins = (int)(tdiff / 60);
if (isdst) *isdst = isdst_tmp;
@@ -1344,22 +1079,7 @@ int jul, tim, *mins, *isdst;
/* A macro safe ONLY if used with arg with no side effects! */
#define ISBLANK(c) (isspace(c) && (c) != '\n')
#ifdef HAVE_PROTOS
#ifdef OS2_POPUP
PUBLIC void FillParagraph(char *s, int AsPopUp)
#else
PUBLIC void FillParagraph(char *s)
#endif
#else
#ifdef OS2_POPUP
void FillParagraph(s, AsPopUp)
char *s;
int AsPopUp;
#else
void FillParagraph(s)
char *s;
#endif
#endif
void FillParagraph(char *s)
{
int line = 0;
@@ -1433,81 +1153,6 @@ char *s;
}
}
#if !defined(HAVE_TIMEGM) && !defined(HAVE_MKTIME)
#define TGM_SEC (1)
#define TGM_MIN (60 * TGM_SEC)
#define TGM_HR (60 * TGM_MIN)
#define TGM_DAY (24 * TGM_HR)
#ifdef HAVE_PROTOS
PRIVATE long time_cheat(int year, int month)
#else
static long time_cheat (year, month)
int year;
int month;
#endif
{
long guess = time((long *) NULL);
struct tm g;
int diff;
g = *gmtime (&guess);
while ((diff = year - g.tm_year) > 0)
{
guess += diff * (363 - TGM_DAY);
g = *gmtime (&guess);
}
g.tm_mday--;
guess -= g.tm_sec * TGM_SEC + g.tm_min * TGM_MIN +
g.tm_hour * TGM_HR + g.tm_mday * TGM_DAY;
return (guess);
}
#ifdef HAVE_PROTOS
PUBLIC long timegm (struct tm *tm)
#else
long timegm(tm)
struct tm *tm;
#endif
{
long clock = time_cheat (tm->tm_year, tm->tm_mon);
return (clock + tm->tm_sec * TGM_SEC +
tm->tm_min * TGM_MIN +
tm->tm_hour * TGM_HR +
(tm->tm_mday - 1) * TGM_DAY);
}
#ifdef HAVE_PROTOS
PUBLIC long timelocal (struct tm *tm)
#else
long timelocal (tm)
struct tm *tm;
#endif
{
long zero = 0;
struct tm epoch;
int tzmin;
long clock;
struct tm test;
epoch = *localtime (&zero);
tzmin = epoch.tm_hour * 60 + epoch.tm_min;
if (tzmin > 0)
{
tzmin = 24 * 60 - tzmin;
if (epoch.tm_year == 70)
tzmin -= 24 * 60;
}
clock = timegm (tm) + tzmin * TGM_MIN;
test = *localtime (&clock);
if (test.tm_hour != tm->tm_hour)
clock -= TGM_HR;
return (clock);
}
#endif /* NEED_TIMEGM */
/***************************************************************/
/* */
/* LocalToUTC */
@@ -1515,12 +1160,7 @@ struct tm *tm;
/* Convert a local date/time to a UTC date/time. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void LocalToUTC(int locdate, int loctime, int *utcdate, int *utctime)
#else
void LocalToUTC(locdate, loctime, utcdate, utctime)
int locdate, loctime, *utcdate, *utctime;
#endif
void LocalToUTC(int locdate, int loctime, int *utcdate, int *utctime)
{
int diff;
int dummy;
@@ -1530,10 +1170,10 @@ int locdate, loctime, *utcdate, *utctime;
loctime -= diff;
if (loctime < 0) {
loctime += 1440;
loctime += MINUTES_PER_DAY;
locdate--;
} else if (loctime >= 1440) {
loctime -= 1440;
} else if (loctime >= MINUTES_PER_DAY) {
loctime -= MINUTES_PER_DAY;
locdate++;
}
*utcdate = locdate;
@@ -1547,12 +1187,7 @@ int locdate, loctime, *utcdate, *utctime;
/* Convert a UTC date/time to a local date/time. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void UTCToLocal(int utcdate, int utctime, int *locdate, int *loctime)
#else
void UTCToLocal(utcdate, utctime, locdate, loctime)
int utcdate, utctime, *locdate, *loctime;
#endif
void UTCToLocal(int utcdate, int utctime, int *locdate, int *loctime)
{
int diff;
int dummy;
@@ -1563,10 +1198,10 @@ int utcdate, utctime, *locdate, *loctime;
utctime += diff;
if (utctime < 0) {
utctime += 1440;
utctime += MINUTES_PER_DAY;
utcdate--;
} else if (utctime >= 1440) {
utctime -= 1440;
} else if (utctime >= MINUTES_PER_DAY) {
utctime -= MINUTES_PER_DAY;
utcdate++;
}
*locdate = utcdate;
@@ -1581,34 +1216,11 @@ int utcdate, utctime, *locdate, *loctime;
/* contents of the queue. This does NOT work when the -f */
/* command-line flag is supplied. */
/* */
/* For OS/2, this has to be in the main thread. */
/* */
/***************************************************************/
#ifdef HAVE_QUEUED
#ifdef __BORLANDC__
void __cdecl SigIntHandler(int d)
#else
#ifdef HAVE_PROTOS
RETSIGTYPE SigIntHandler(int d)
#else
RETSIGTYPE SigIntHandler()
#endif
#endif
void SigIntHandler(int d)
{
signal(SIGINT, SigIntHandler);
#ifdef __BORLANDC__
signal(SIGINT, SIG_DFL);
#else
#ifdef __OS2__
signal(SIGINT, SIG_ACK);
#endif
#endif
GotSigInt();
#ifndef UNIX
exit(0);
#endif
}
#endif /* HAVE_QUEUED */

249
src/md5.c Normal file
View File

@@ -0,0 +1,249 @@
/*
* This code implements the MD5 message-digest algorithm.
* The algorithm is due to Ron Rivest. This code was
* written by Colin Plumb in 1993, no copyright is claimed.
* This code is in the public domain; do with it what you wish.
*
* Equivalent code is available from RSA Data Security, Inc.
* This code has been tested against that, and is equivalent,
* except that you don't need to include two pages of legalese
* with every copy.
*
* LIC: GPL
*
* To compute the message digest of a chunk of bytes, declare an
* MD5Context structure, pass it to MD5Init, call MD5Update as
* needed on buffers full of bytes, and then call MD5Final, which
* will fill a supplied 16-byte array with the digest.
*/
#include <string.h> /* for memcpy() */
#include "md5.h"
static void byteReverse(unsigned char *buf, unsigned longs);
/*
* Note: this code is harmless on little-endian machines.
*/
static void
byteReverse(unsigned char *buf, unsigned longs)
{
uint32 t;
do {
t = (uint32) ((unsigned) buf[3] << 8 | buf[2]) << 16 |
((unsigned) buf[1] << 8 | buf[0]);
*(uint32 *) buf = t;
buf += 4;
} while (--longs);
}
/*
* Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
* initialization constants.
*/
void MD5Init(struct MD5Context *ctx)
{
ctx->buf[0] = 0x67452301;
ctx->buf[1] = 0xefcdab89;
ctx->buf[2] = 0x98badcfe;
ctx->buf[3] = 0x10325476;
ctx->bits[0] = 0;
ctx->bits[1] = 0;
}
/*
* Update context to reflect the concatenation of another buffer full
* of bytes.
*/
void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len)
{
uint32 t;
/* Update bitcount */
t = ctx->bits[0];
if ((ctx->bits[0] = t + ((uint32) len << 3)) < t)
ctx->bits[1]++; /* Carry from low to high */
ctx->bits[1] += len >> 29;
t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */
/* Handle any leading odd-sized chunks */
if (t) {
unsigned char *p = (unsigned char *) ctx->in + t;
t = 64 - t;
if (len < t) {
memcpy(p, buf, len);
return;
}
memcpy(p, buf, t);
byteReverse(ctx->in, 16);
MD5Transform(ctx->buf, (uint32 *) ctx->in);
buf += t;
len -= t;
}
/* Process data in 64-byte chunks */
while (len >= 64) {
memcpy(ctx->in, buf, 64);
byteReverse(ctx->in, 16);
MD5Transform(ctx->buf, (uint32 *) ctx->in);
buf += 64;
len -= 64;
}
/* Handle any remaining bytes of data. */
memcpy(ctx->in, buf, len);
}
/*
* Final wrapup - pad to 64-byte boundary with the bit pattern
* 1 0* (64-bit count of bits processed, MSB-first)
*/
void MD5Final(unsigned char digest[16], struct MD5Context *ctx)
{
unsigned count;
unsigned char *p;
/* Compute number of bytes mod 64 */
count = (ctx->bits[0] >> 3) & 0x3F;
/* Set the first char of padding to 0x80. This is safe since there is
always at least one byte free */
p = ctx->in + count;
*p++ = 0x80;
/* Bytes of padding needed to make 64 bytes */
count = 64 - 1 - count;
/* Pad out to 56 mod 64 */
if (count < 8) {
/* Two lots of padding: Pad the first block to 64 bytes */
memset(p, 0, count);
byteReverse(ctx->in, 16);
MD5Transform(ctx->buf, (uint32 *) ctx->in);
/* Now fill the next block with 56 bytes */
memset(ctx->in, 0, 56);
} else {
/* Pad block to 56 bytes */
memset(p, 0, count - 8);
}
byteReverse(ctx->in, 14);
/* Append length in bits and transform */
((uint32 *) ctx->in)[14] = ctx->bits[0];
((uint32 *) ctx->in)[15] = ctx->bits[1];
MD5Transform(ctx->buf, (uint32 *) ctx->in);
byteReverse((unsigned char *) ctx->buf, 4);
memcpy(digest, ctx->buf, 16);
memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */
}
#ifndef ASM_MD5
/* The four core functions - F1 is optimized somewhat */
/* #define F1(x, y, z) (x & y | ~x & z) */
#define F1(x, y, z) (z ^ (x & (y ^ z)))
#define F2(x, y, z) F1(z, x, y)
#define F3(x, y, z) (x ^ y ^ z)
#define F4(x, y, z) (y ^ (x | ~z))
/* This is the central step in the MD5 algorithm. */
#define MD5STEP(f, w, x, y, z, data, s) \
( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x )
/*
* The core of the MD5 algorithm, this alters an existing MD5 hash to
* reflect the addition of 16 longwords of new data. MD5Update blocks
* the data and converts bytes into longwords for this routine.
*/
void MD5Transform(uint32 buf[4], uint32 const in[16])
{
register uint32 a, b, c, d;
a = buf[0];
b = buf[1];
c = buf[2];
d = buf[3];
MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
buf[0] += a;
buf[1] += b;
buf[2] += c;
buf[3] += d;
}
#endif

34
src/md5.h Normal file
View File

@@ -0,0 +1,34 @@
#ifndef MD5_H
#define MD5_H
/*
* LIC: GPL
*/
#include "config.h"
#if SIZEOF_UNSIGNED_INT == 4
typedef unsigned int uint32;
#elif SIZEOF_UNSIGNED_LONG == 4
typedef unsigned long uint32;
#else
# error Could not find a 32-bit integer type
#endif
struct MD5Context {
uint32 buf[4];
uint32 bits[2];
unsigned char in[64];
};
void MD5Init(struct MD5Context *context);
void MD5Update(struct MD5Context *context, unsigned char const *buf,
unsigned len);
void MD5Final(unsigned char digest[16], struct MD5Context *context);
void MD5Transform(uint32 buf[4], uint32 const in[16]);
/*
* This is needed to make RSAREF happy on some MS-DOS compilers.
*/
typedef struct MD5Context MD5_CTX;
#endif /* !MD5_H */

View File

@@ -6,12 +6,11 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
#include "config.h"
static char const RCSID[] = "$Id: moon.c,v 1.4 1999-04-05 17:34:53 dfs Exp $";
/* All of these routines were adapted from the program "moontool"
by John Walker, February 1988. Here's the blurb from moontool:
@@ -61,10 +60,7 @@ static char const RCSID[] = "$Id: moon.c,v 1.4 1999-04-05 17:34:53 dfs Exp $";
that credit and blame may be properly apportioned.
*/
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#include <stdio.h>
#include <math.h>
#include <time.h>
@@ -75,14 +71,14 @@ static char const RCSID[] = "$Id: moon.c,v 1.4 1999-04-05 17:34:53 dfs Exp $";
#include "err.h"
/* Function prototypes */
PRIVATE long jdate ARGS((int y, int mon, int day));
PRIVATE double jtime ARGS((int y, int mon, int day, int hour, int min, int sec));
PRIVATE void jyear ARGS((double td, int *yy, int *mm, int *dd));
PRIVATE void jhms ARGS((double j, int *h, int *m, int *s));
PRIVATE double meanphase ARGS((double sdate, double phase, double *usek));
PRIVATE double truephase ARGS((double k, double phase));
PRIVATE double kepler ARGS((double m, double ecc));
PRIVATE double phase ARGS((double, double *, double *, double *, double *, double *, double *));
static long jdate (int y, int mon, int day);
static double jtime (int y, int mon, int day, int hour, int min, int sec);
static void jyear (double td, int *yy, int *mm, int *dd);
static void jhms (double j, int *h, int *m, int *s);
static double meanphase (double sdate, double phase, double *usek);
static double truephase (double k, double phase);
static double kepler (double m, double ecc);
static double phase (double, double *, double *, double *, double *, double *, double *);
/* Astronomical constants */
@@ -151,12 +147,7 @@ PRIVATE double phase ARGS((double, double *, double *, double *, double *, doubl
/* Convert a date and time to Julian day and fraction. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE long jdate(int y, int mon, int day)
#else
static long jdate(y, mon, day)
int y, mon, day;
#endif
static long jdate(int y, int mon, int day)
{
long c, m;
@@ -180,12 +171,7 @@ int y, mon, day;
/* i.e. Julian date plus day fraction, expressed as a double */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE double jtime(int y, int mon, int day, int hour, int min, int sec)
#else
static double jtime(y, mon, day, hour, min, sec)
int y, mon, day, hour, min, sec;
#endif
static double jtime(int y, int mon, int day, int hour, int min, int sec)
{
return (jdate(y, mon, day)-0.5) +
(sec + 60L * (long) min + 3600L * (long) hour) / 86400.0;
@@ -198,13 +184,7 @@ int y, mon, day, hour, min, sec;
/* Convert a Julian date to year, month, day. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void jyear(double td, int *yy, int *mm, int *dd)
#else
static void jyear(td, yy, mm, dd)
double td;
int *yy, *mm, *dd;
#endif
static void jyear(double td, int *yy, int *mm, int *dd)
{
double j, d, y, m;
@@ -239,13 +219,7 @@ int *yy, *mm, *dd;
/* Convert a Julian time to hour, minutes and seconds. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void jhms(double j, int *h, int *m, int *s)
#else
static void jhms(j, h, m, s)
double j;
int *h, *m, *s;
#endif
static void jhms(double j, int *h, int *m, int *s)
{
long ij;
@@ -273,13 +247,7 @@ int *h, *m, *s;
/* than this calculation reveals. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE double meanphase(double sdate, double phase, double *usek)
#else
static double meanphase(sdate, phase, usek)
double sdate, phase;
double *usek;
#endif
static double meanphase(double sdate, double phase, double *usek)
{
double k, t, t2, t3, nt1;
@@ -315,12 +283,7 @@ double *usek;
/* the true, corrected phase time. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE double truephase(double k, double phase)
#else
static double truephase(k, phase)
double k, phase;
#endif
static double truephase(double k, double phase)
{
double t, t2, t3, pt, m, mprime, f;
int apcor = 0;
@@ -401,12 +364,7 @@ double k, phase;
/* Solve the equation of Kepler. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE double kepler(double m, double ecc)
#else
static double kepler(m, ecc)
double m, ecc;
#endif
static double kepler(double m, double ecc)
{
double e, delta;
#define EPSILON 1E-6
@@ -434,24 +392,13 @@ double m, ecc;
/* the centre of the Earth. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE double phase(double pdate,
double *pphase,
double *mage,
double *dist,
double *angdia,
double *sudist,
double *suangdia)
#else
static double phase(pdate, pphase, mage, dist, angdia, sudist, suangdia)
double pdate;
double *pphase; /* Illuminated fraction */
double *mage; /* Age of moon in days */
double *dist; /* Distance in kilometres */
double *angdia; /* Angular diameter in degrees */
double *sudist; /* Distance to Sun */
double *suangdia; /* Sun's angular diameter */
#endif
static double phase(double pdate,
double *pphase,
double *mage,
double *dist,
double *angdia,
double *sudist,
double *suangdia)
{
double Day, N, M, Ec, Lambdasun, ml, MM, MN, Ev, Ae, A3, MmP,
@@ -564,12 +511,7 @@ double *suangdia; /* Sun's angular diameter */
/* that date and time as a number from 0 to 360. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int MoonPhase(int date, int time)
#else
int MoonPhase(date, time)
int date, time;
#endif
int MoonPhase(int date, int time)
{
int utcd, utct;
int y, m, d;
@@ -599,12 +541,7 @@ int date, time;
/* 0 to 3 for new, 1stq, full, 3rdq */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void HuntPhase(int startdate, int starttim, int phas, int *date, int *time)
#else
void HuntPhase(startdate, starttim, phas, date, time)
int startdate, starttim, phas, *date, *time;
#endif
void HuntPhase(int startdate, int starttim, int phas, int *date, int *time)
{
int utcd, utct;
int y, m, d;

View File

@@ -7,30 +7,22 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
#include "config.h"
static char const RCSID[] = "$Id: omit.c,v 1.5 1999-04-05 17:34:54 dfs Exp $";
#include <stdio.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
#include "types.h"
#include "protos.h"
#include "globals.h"
#include "err.h"
PRIVATE int BexistsIntArray ARGS ((int array[], int num, int key));
PRIVATE void InsertIntoSortedArray ARGS ((int *array, int num, int key));
static int BexistsIntArray (int array[], int num, int key);
static void InsertIntoSortedArray (int *array, int num, int key);
/* Arrays for the global omits */
static int FullOmitArray[MAX_FULL_OMITS];
@@ -57,11 +49,7 @@ static OmitContext *SavedOmitContexts = NULL;
/* Clear all the global OMIT context. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int ClearGlobalOmits(void)
#else
int ClearGlobalOmits()
#endif
int ClearGlobalOmits(void)
{
NumFullOmits = NumPartialOmits = 0;
return OK;
@@ -74,12 +62,7 @@ int ClearGlobalOmits()
/* The command-line function CLEAR-OMIT-CONTEXT */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoClear(ParsePtr p)
#else
int DoClear(p)
ParsePtr p;
#endif
int DoClear(ParsePtr p)
{
ClearGlobalOmits();
return VerifyEoln(p);
@@ -94,11 +77,7 @@ ParsePtr p;
/* destroyed. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DestroyOmitContexts(void)
#else
int DestroyOmitContexts()
#endif
int DestroyOmitContexts(void)
{
OmitContext *c = SavedOmitContexts;
OmitContext *d;
@@ -123,12 +102,7 @@ int DestroyOmitContexts()
/* Push the OMIT context on to the stack. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int PushOmitContext(ParsePtr p)
#else
int PushOmitContext(p)
ParsePtr p;
#endif
int PushOmitContext(ParsePtr p)
{
register int i;
OmitContext *context;
@@ -171,12 +145,7 @@ ParsePtr p;
/* Pop the OMIT context off of the stack. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int PopOmitContext(ParsePtr p)
#else
int PopOmitContext(p)
ParsePtr p;
#endif
int PopOmitContext(ParsePtr p)
{
register int i;
@@ -211,12 +180,7 @@ ParsePtr p;
/* Return non-zero if date is OMITted, zero if it is not. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int IsOmitted(int jul, int localomit)
#else
int IsOmitted(jul, localomit)
int jul, localomit;
#endif
int IsOmitted(int jul, int localomit)
{
int y, m, d;
@@ -243,12 +207,7 @@ int jul, localomit;
/* element is found, 0 otherwise. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int BexistsIntArray(int array[], int num, int key)
#else
static int BexistsIntArray(array, num, key)
int array[], num, key;
#endif
static int BexistsIntArray(int array[], int num, int key)
{
int top=num-1, bot=0, mid;
@@ -269,12 +228,7 @@ int array[], num, key;
/* room in the array for it. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void InsertIntoSortedArray(int *array, int num, int key)
#else
static void InsertIntoSortedArray(array, num, key)
int *array, num, key;
#endif
static void InsertIntoSortedArray(int *array, int num, int key)
{
/* num is number of elements CURRENTLY in the array. */
int *cur = array+num;
@@ -293,12 +247,7 @@ int *array, num, key;
/* Do a global OMIT command. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoOmit(ParsePtr p)
#else
int DoOmit(p)
ParsePtr p;
#endif
int DoOmit(ParsePtr p)
{
int y = NO_YR, m = NO_MON, d = NO_DAY, r;
Token tok;

View File

@@ -6,18 +6,10 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
/* $Id: protos.h,v 1.7 1999-04-05 17:34:54 dfs Exp $ */
#ifdef HAVE_PROTOS
#define ARGS(x) x
#else
#define ARGS(x) ()
#endif
/* Define a string assignment macro - be careful!!! */
#define STRSET(x, str) { if (x) free(x); (x) = StrDup(str); }
@@ -26,150 +18,118 @@
#include "dynbuf.h"
#ifndef HAVE_STRSTR
char *strstr ARGS ((char *s1, char *s2));
#endif
int CallUserFunc ARGS ((char *name, int nargs));
int DoFset ARGS ((ParsePtr p));
void ProduceCalendar ARGS ((void));
char *SimpleTime ARGS ((int tim));
int DoRem ARGS ((ParsePtr p));
int DoFlush ARGS ((ParsePtr p));
void DoExit ARGS ((ParsePtr p));
int ParseRem ARGS ((ParsePtr s, Trigger *trig, TimeTrig *tim));
#ifdef OS2_POPUP
int TriggerReminder ARGS ((ParsePtr p, Trigger *t, TimeTrig *tim, int jul,
int AsPopUp));
#else
int TriggerReminder ARGS ((ParsePtr p, Trigger *t, TimeTrig *tim, int jul));
#endif
int ShouldTriggerReminder ARGS ((Trigger *t, TimeTrig *tim, int jul));
int DoSubst ARGS ((ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul, int mode));
int DoSubstFromString ARGS ((char *source, DynamicBuffer *dbuf, int jul, int tim));
int EvalExpr ARGS ((char **e, Value *v));
int DoCoerce ARGS ((char type, Value *v));
void PrintValue ARGS ((Value *v, FILE *fp));
int CopyValue ARGS ((Value *dest, const Value *src));
int ReadLine ARGS ((void));
int OpenFile ARGS ((const char *fname));
int PopFile ARGS ((void));
int DoInclude ARGS ((ParsePtr p));
int IncludeFile ARGS ((const char *fname));
int GetAccessDate ARGS ((char *file));
int SetAccessDate ARGS ((char *fname, int jul));
int TopLevel ARGS ((void));
int CallFunc ARGS ((Operator *f, int nargs));
void InitRemind ARGS ((int argc, char *argv[]));
void Usage ARGS ((void));
int main ARGS ((int argc, char *argv[]));
int Julian ARGS ((int year, int month, int day));
void FromJulian ARGS ((int jul, int *y, int *m, int *d));
int ParseChar ARGS ((ParsePtr p, int *err, int peek));
int ParseToken ARGS ((ParsePtr p, DynamicBuffer *dbuf));
int ParseIdentifier ARGS ((ParsePtr p, DynamicBuffer *dbuf));
int EvaluateExpr ARGS ((ParsePtr p, Value *v));
int Evaluate ARGS ((char **s, Var *locals));
int FnPopValStack ARGS ((Value *val));
void Eprint ARGS ((const char *fmt, ...));
void OutputLine ARGS ((FILE *fp));
void CreateParser ARGS ((char *s, ParsePtr p));
void DestroyParser ARGS ((ParsePtr p));
int PushToken ARGS ((const char *tok, ParsePtr p));
long SystemTime ARGS ((int realtime));
int SystemDate ARGS ((int *y, int *m, int *d));
int DoIf ARGS ((ParsePtr p));
int DoElse ARGS ((ParsePtr p));
int DoEndif ARGS ((ParsePtr p));
int DoIfTrig ARGS ((ParsePtr p));
int ShouldIgnoreLine ARGS ((void));
int VerifyEoln ARGS ((ParsePtr p));
int DoDebug ARGS ((ParsePtr p));
int DoBanner ARGS ((ParsePtr p));
int DoRun ARGS ((ParsePtr p));
int DoErrMsg ARGS ((ParsePtr p));
int ClearGlobalOmits ARGS ((void));
int DoClear ARGS ((ParsePtr p));
int DestroyOmitContexts ARGS ((void));
int PushOmitContext ARGS ((ParsePtr p));
int PopOmitContext ARGS ((ParsePtr p));
int IsOmitted ARGS ((int jul, int localomit));
int DoOmit ARGS ((ParsePtr p));
int QueueReminder ARGS ((ParsePtr p, Trigger *trig, TimeTrig *tim, const char *sched));
void HandleQueuedReminders ARGS ((void));
char *FindInitialToken ARGS ((Token *tok, char *s));
void FindToken ARGS ((const char *s, Token *tok));
void FindNumericToken ARGS ((const char *s, Token *t));
int ComputeTrigger ARGS ((int today, Trigger *trig, int *err));
char *StrnCpy ARGS ((char *dest, const char *source, int n));
int StrMatch ARGS ((const char *s1, const char *s2, int n));
int StrinCmp ARGS ((const char *s1, const char *s2, int n));
char *StrDup ARGS ((const char *s));
int StrCmpi ARGS ((const char *s1, const char *s2));
Var *FindVar ARGS ((const char *str, int create));
int DeleteVar ARGS ((const char *str));
int SetVar ARGS ((const char *str, Value *val));
int GetVarValue ARGS ((const char *str, Value *val, Var *locals));
int DoSet ARGS ((Parser *p));
int DoUnset ARGS ((Parser *p));
int DoDump ARGS ((ParsePtr p));
void DumpVarTable ARGS ((void));
void DestroyVars ARGS ((int all));
int PreserveVar ARGS ((char *name));
int DoPreserve ARGS ((Parser *p));
int DoSatRemind ARGS ((Trigger *trig, TimeTrig *tim, ParsePtr p));
int DoMsgCommand ARGS ((char *cmd, char *msg));
int ParseNonSpaceChar ARGS ((ParsePtr p, int *err, int peek));
unsigned int HashVal ARGS ((const char *str));
int DateOK ARGS ((int y, int m, int d));
Operator *FindFunc ARGS ((char *name, Operator where[], int num));
int InsertIntoSortBuffer ARGS ((int jul, int tim, char *body, int typ, int prio));
void IssueSortedReminders ARGS ((void));
int UserFuncExists ARGS ((char *fn));
void JulToHeb ARGS((int jul, int *hy, int *hm, int *hd));
int HebNameToNum ARGS((const char *mname));
char *HebMonthName ARGS((int m, int y));
int RoshHashana ARGS((int i));
long DaysToHebYear ARGS((int y));
int DaysInHebYear ARGS((int y));
char *DaysInHebMonths ARGS((int ylen));
int HebToJul ARGS((int hy, int hm, int hd));
int GetValidHebDate ARGS((int yin, int min, int din, int adarbehave, int *mout, int *dout, int yahr));
int GetNextHebrewDate ARGS((int julstart, int hm, int hd, int yahr, int adarbehave, int *ans));
int ComputeJahr ARGS ((int y, int m, int d, int *ans));
int GetSysVar ARGS ((const char *name, Value *val));
int SetSysVar ARGS ((const char *name, Value *val));
void DumpSysVarByName ARGS ((const char *name));
int CalcMinsFromUTC ARGS ((int jul, int tim, int *mins, int *isdst));
#ifdef OS2_POPUP
void FillParagraph ARGS ((char *s, int AsPopUp));
#else
void FillParagraph ARGS ((char *s));
#endif
void LocalToUTC ARGS ((int locdate, int loctime, int *utcdate, int *utctime));
void UTCToLocal ARGS ((int utcdate, int utctime, int *locdate, int *loctime));
int MoonPhase ARGS ((int date, int time));
void HuntPhase ARGS ((int startdate, int starttim, int phas, int *date, int *time));
int CompareRems ARGS ((int dat1, int tim1, int prio1, int dat2, int tim2, int prio2, int bydate, int bytime, int byprio));
#ifdef __BORLANDC__
void __cdecl SigIntHandler ARGS ((int d));
#else
RETSIGTYPE SigIntHandler ARGS ((int d));
#endif
void GotSigInt ARGS ((void));
#if defined(__OS2__)
int fork ARGS ((void));
#if defined(OS2_POPUP)
void StartPopUp ARGS ((void));
void EndPopUp ARGS ((void));
int PutcPopUp ARGS ((int c));
int PutlPopUp ARGS ((char *s));
int PutsPopUp ARGS ((char *s));
#endif
#endif
#ifdef BROKEN_PUTC
int SafePutChar ARGS ((int ch));
int SafePutc ARGS ((int ch, FILE *fp));
#endif
int CallUserFunc (char *name, int nargs);
int DoFset (ParsePtr p);
void ProduceCalendar (void);
char *SimpleTime (int tim);
int DoRem (ParsePtr p);
int DoFlush (ParsePtr p);
void DoExit (ParsePtr p);
int ParseRem (ParsePtr s, Trigger *trig, TimeTrig *tim);
int TriggerReminder (ParsePtr p, Trigger *t, TimeTrig *tim, int jul);
int ShouldTriggerReminder (Trigger *t, TimeTrig *tim, int jul);
int DoSubst (ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul, int mode);
int DoSubstFromString (char *source, DynamicBuffer *dbuf, int jul, int tim);
int EvalExpr (char **e, Value *v);
int DoCoerce (char type, Value *v);
void PrintValue (Value *v, FILE *fp);
int CopyValue (Value *dest, const Value *src);
int ReadLine (void);
int OpenFile (const char *fname);
int PopFile (void);
int DoInclude (ParsePtr p);
int IncludeFile (const char *fname);
int GetAccessDate (char *file);
int SetAccessDate (char *fname, int jul);
int TopLevel (void);
int CallFunc (Operator *f, int nargs);
void InitRemind (int argc, char *argv[]);
void Usage (void);
int main (int argc, char *argv[]);
int Julian (int year, int month, int day);
void FromJulian (int jul, int *y, int *m, int *d);
int ParseChar (ParsePtr p, int *err, int peek);
int ParseToken (ParsePtr p, DynamicBuffer *dbuf);
int ParseIdentifier (ParsePtr p, DynamicBuffer *dbuf);
int EvaluateExpr (ParsePtr p, Value *v);
int Evaluate (char **s, Var *locals);
int FnPopValStack (Value *val);
void Eprint (const char *fmt, ...);
void OutputLine (FILE *fp);
void CreateParser (char *s, ParsePtr p);
void DestroyParser (ParsePtr p);
int PushToken (const char *tok, ParsePtr p);
long SystemTime (int realtime);
int SystemDate (int *y, int *m, int *d);
int DoIf (ParsePtr p);
int DoElse (ParsePtr p);
int DoEndif (ParsePtr p);
int DoIfTrig (ParsePtr p);
int ShouldIgnoreLine (void);
int VerifyEoln (ParsePtr p);
int DoDebug (ParsePtr p);
int DoBanner (ParsePtr p);
int DoRun (ParsePtr p);
int DoErrMsg (ParsePtr p);
int ClearGlobalOmits (void);
int DoClear (ParsePtr p);
int DestroyOmitContexts (void);
int PushOmitContext (ParsePtr p);
int PopOmitContext (ParsePtr p);
int IsOmitted (int jul, int localomit);
int DoOmit (ParsePtr p);
int QueueReminder (ParsePtr p, Trigger *trig, TimeTrig *tim, const char *sched);
void HandleQueuedReminders (void);
char *FindInitialToken (Token *tok, char *s);
void FindToken (const char *s, Token *tok);
void FindNumericToken (const char *s, Token *t);
int ComputeTrigger (int today, Trigger *trig, int *err);
char *StrnCpy (char *dest, const char *source, int n);
int StrMatch (const char *s1, const char *s2, int n);
int StrinCmp (const char *s1, const char *s2, int n);
char *StrDup (const char *s);
int StrCmpi (const char *s1, const char *s2);
Var *FindVar (const char *str, int create);
int DeleteVar (const char *str);
int SetVar (const char *str, Value *val);
int GetVarValue (const char *str, Value *val, Var *locals);
int DoSet (Parser *p);
int DoUnset (Parser *p);
int DoDump (ParsePtr p);
void DumpVarTable (void);
void DestroyVars (int all);
int PreserveVar (char *name);
int DoPreserve (Parser *p);
int DoSatRemind (Trigger *trig, TimeTrig *tim, ParsePtr p);
int DoMsgCommand (char *cmd, char *msg);
int ParseNonSpaceChar (ParsePtr p, int *err, int peek);
unsigned int HashVal (const char *str);
int DateOK (int y, int m, int d);
Operator *FindFunc (char *name, Operator where[], int num);
int InsertIntoSortBuffer (int jul, int tim, char *body, int typ, int prio);
void IssueSortedReminders (void);
int UserFuncExists (char *fn);
void JulToHeb (int jul, int *hy, int *hm, int *hd);
int HebNameToNum (const char *mname);
char *HebMonthName (int m, int y);
int RoshHashana (int i);
long DaysToHebYear (int y);
int DaysInHebYear (int y);
char *DaysInHebMonths (int ylen);
int HebToJul (int hy, int hm, int hd);
int GetValidHebDate (int yin, int min, int din, int adarbehave, int *mout, int *dout, int yahr);
int GetNextHebrewDate (int julstart, int hm, int hd, int yahr, int adarbehave, int *ans);
int ComputeJahr (int y, int m, int d, int *ans);
int GetSysVar (const char *name, Value *val);
int SetSysVar (const char *name, Value *val);
void DumpSysVarByName (const char *name);
int CalcMinsFromUTC (int jul, int tim, int *mins, int *isdst);
void FillParagraph (char *s);
void LocalToUTC (int locdate, int loctime, int *utcdate, int *utctime);
void UTCToLocal (int utcdate, int utctime, int *locdate, int *loctime);
int MoonPhase (int date, int time);
void HuntPhase (int startdate, int starttim, int phas, int *date, int *time);
int CompareRems (int dat1, int tim1, int prio1, int dat2, int tim2, int prio2, int bydate, int bytime, int byprio);
void SigIntHandler (int d);
void GotSigInt (void);
void SynthesizeTag(char *);

View File

@@ -6,50 +6,27 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
#include "config.h"
static char const RCSID[] = "$Id: queue.c,v 1.10 1999-04-05 17:34:55 dfs Exp $";
/* Solaris needs this to get select() prototype */
#ifdef __sun__
#define __EXTENSIONS__ 1
#undef _POSIX_SOURCE
#endif
/* We only want object code generated if we have queued reminders */
#ifdef HAVE_QUEUED
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#ifdef HAVE_STDLIB_H
#include <sys/select.h>
#include <stdlib.h>
#endif
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#if defined(__OS2__) || defined(__MSDOS__)
#include <io.h>
#if defined(__BORLANDC__)
#include <dos.h>
#endif
#include <process.h>
#endif
#include "globals.h"
#include "err.h"
@@ -75,12 +52,12 @@ static QueuedRem *QueueHead;
static time_t FileModTime;
static struct stat StatBuf;
PRIVATE void CheckInitialFile ARGS ((void));
PRIVATE int CalculateNextTime ARGS ((QueuedRem *q));
PRIVATE QueuedRem *FindNextReminder ARGS ((void));
PRIVATE int CalculateNextTimeUsingSched ARGS ((QueuedRem *q));
PRIVATE void DaemonWait ARGS ((unsigned int sleeptime));
PRIVATE void reread ARGS((void));
static void CheckInitialFile (void);
static int CalculateNextTime (QueuedRem *q);
static QueuedRem *FindNextReminder (void);
static int CalculateNextTimeUsingSched (QueuedRem *q);
static void DaemonWait (unsigned int sleeptime);
static void reread (void);
/***************************************************************/
/* */
@@ -90,16 +67,8 @@ PRIVATE void reread ARGS((void));
/* enabled. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int QueueReminder(ParsePtr p, Trigger *trig,
int QueueReminder(ParsePtr p, Trigger *trig,
TimeTrig *tim, const char *sched)
#else
int QueueReminder(p, trig, tim, sched)
ParsePtr p;
Trigger *trig,
TimeTrig *tim;
char *sched;
#endif
{
QueuedRem *qelem;
@@ -118,6 +87,7 @@ char *sched;
free(qelem);
return E_NO_MEM;
}
NumQueued++;
qelem->typ = trig->typ;
qelem->tt = *tim;
qelem->next = QueueHead;
@@ -125,8 +95,10 @@ char *sched;
qelem->ntrig = 0;
strcpy(qelem->sched, sched);
strcpy(qelem->tag, trig->tag);
if (! *qelem->tag && SynthesizeTags) {
SynthesizeTag(qelem->tag);
}
QueueHead = qelem;
NumQueued++;
return OK;
}
@@ -137,14 +109,10 @@ char *sched;
/* Handle the issuing of queued reminders in the background */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void HandleQueuedReminders(void)
#else
void HandleQueuedReminders()
#endif
void HandleQueuedReminders(void)
{
QueuedRem *q = QueueHead;
long TimeToSleep;
int TimeToSleep;
unsigned SleepTime;
Parser p;
Trigger trig;
@@ -177,20 +145,16 @@ void HandleQueuedReminders()
Daemon = 0;
} else FileModTime = StatBuf.st_mtime;
}
/* Initialize the queue - initialize all the entries time of issue */
while (q) {
q->tt.nexttime = (int) (SystemTime(0)/60 - 1);
q->tt.nexttime = CalculateNextTime(q);
q = q->next;
}
#ifdef __BORLANDC__
signal(SIGINT, SigIntHandler);
#else
if (!DontFork || Daemon) signal(SIGINT, SigIntHandler);
#endif
/* Sit in a loop, issuing reminders when necessary */
while(1) {
@@ -202,16 +166,16 @@ void HandleQueuedReminders()
if (Daemon && !q) {
if (Daemon < 0) {
/* Sleep until midnight */
TimeToSleep = (long) 1440*60L - SystemTime(0);
TimeToSleep = MINUTES_PER_DAY*60 - SystemTime(0);
} else {
TimeToSleep = (long) 60*Daemon;
TimeToSleep = 60*Daemon;
}
} else {
TimeToSleep = (long) q->tt.nexttime * 60L - SystemTime(0);
TimeToSleep = q->tt.nexttime * 60L - SystemTime(0);
}
while (TimeToSleep > 0L) {
SleepTime = (unsigned) ((TimeToSleep > 30000L) ? 30000 : TimeToSleep);
SleepTime = TimeToSleep;
if (Daemon > 0 && SleepTime > 60*Daemon) SleepTime = 60*Daemon;
@@ -226,12 +190,12 @@ void HandleQueuedReminders()
if (Daemon && !q) {
if (Daemon < 0) {
/* Sleep until midnight */
TimeToSleep = (long) 1440*60L - SystemTime(0);
TimeToSleep = MINUTES_PER_DAY*60 - SystemTime(0);
} else {
TimeToSleep = (long) 60*Daemon;
TimeToSleep = 60*Daemon;
}
} else {
TimeToSleep = (long) q->tt.nexttime * 60L - SystemTime(0);
TimeToSleep = q->tt.nexttime * 60L - SystemTime(0);
}
}
@@ -251,25 +215,25 @@ void HandleQueuedReminders()
}
printf("\n");
}
#ifdef OS2_POPUP
(void) TriggerReminder(&p, &trig, &q->tt, JulianToday, 1);
#else
/* Set up global variables so some functions like trigdate()
and trigtime() work correctly */
LastTriggerDate = JulianToday;
LastTriggerTime = q->tt.ttime;
LastTrigValid = 1;
(void) TriggerReminder(&p, &trig, &q->tt, JulianToday);
#endif
if (Daemon < 0) {
printf("NOTE endreminder\n");
}
fflush(stdout);
/* Calculate the next trigger time */
q->tt.nexttime = CalculateNextTime(q);
DestroyParser(&p);
}
#ifdef __BORLANDC__
signal(SIGINT, SIG_DFL);
#endif
exit(0);
}
/***************************************************************/
/* */
@@ -282,12 +246,7 @@ void HandleQueuedReminders()
/* fails, revert to AT with delta and rep. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int CalculateNextTime(QueuedRem *q)
#else
static int CalculateNextTime(q)
QueuedRem *q;
#endif
static int CalculateNextTime(QueuedRem *q)
{
int tim = q->tt.ttime;
int rep = q->tt.rep;
@@ -301,8 +260,13 @@ QueuedRem *q;
r = CalculateNextTimeUsingSched(q);
if (r != NO_TIME) return r;
}
if (delta == NO_DELTA)
if (tim < curtime) return NO_TIME; else return tim;
if (delta == NO_DELTA) {
if (tim < curtime) {
return NO_TIME;
} else {
return tim;
}
}
tim -= delta;
if (rep == NO_REP) rep = delta;
@@ -319,11 +283,7 @@ QueuedRem *q;
/* Find the next reminder to trigger */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE QueuedRem *FindNextReminder(void)
#else
static QueuedRem *FindNextReminder()
#endif
static QueuedRem *FindNextReminder(void)
{
QueuedRem *q = QueueHead;
QueuedRem *ans = NULL;
@@ -333,12 +293,12 @@ static QueuedRem *FindNextReminder()
if (!ans) ans = q;
else if (q->tt.nexttime < ans->tt.nexttime) ans = q;
}
q = q->next;
}
return ans;
}
/***************************************************************/
/* */
@@ -348,11 +308,7 @@ static QueuedRem *FindNextReminder()
/* This will be necessary for OS/2 multithreaded. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
void GotSigInt(void)
#else
void GotSigInt()
#endif
{
QueuedRem *q = QueueHead;
@@ -361,8 +317,8 @@ void GotSigInt()
while (q) {
if (q->tt.nexttime != NO_TIME) {
printf("Trigger: %02d%c%02d Activate: %02d%c%02d Rep: %d Delta: %d Sched: %s",
q->tt.ttime / 60, TIMESEP, q->tt.ttime % 60,
q->tt.nexttime / 60, TIMESEP, q->tt.nexttime % 60,
q->tt.ttime / 60, TimeSep, q->tt.ttime % 60,
q->tt.nexttime / 60, TimeSep, q->tt.nexttime % 60,
q->tt.rep, q->tt.delta, q->sched);
if (*q->sched) printf("(%d)", q->ntrig+1);
printf("%s", NL);
@@ -384,11 +340,7 @@ void GotSigInt()
/* daemon. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void CheckInitialFile(void)
#else
static void CheckInitialFile()
#endif
static void CheckInitialFile(void)
{
/* If date has rolled around, or file has changed, spawn a new version. */
time_t tim = FileModTime;
@@ -408,12 +360,7 @@ static void CheckInitialFile()
/* Call the scheduling function. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int CalculateNextTimeUsingSched(QueuedRem *q)
#else
static int CalculateNextTimeUsingSched(q)
QueuedRem *q;
#endif
static int CalculateNextTimeUsingSched(QueuedRem *q)
{
/* Use LineBuffer for temp. string storage. */
int r;
@@ -438,10 +385,10 @@ QueuedRem *q;
q->sched[0] = 0;
return NO_TIME;
}
if (v.type == TIM_TYPE) {
if (v.type == TIME_TYPE) {
ThisTime = v.v.val;
} else if (v.type == INT_TYPE) {
if (v.v.val > 0)
if (v.v.val > 0)
ThisTime = q->tt.nexttime + v.v.val;
else
ThisTime = q->tt.ttime + v.v.val;
@@ -452,7 +399,7 @@ QueuedRem *q;
return NO_TIME;
}
if (ThisTime < 0) ThisTime = 0; /* Can't be less than 00:00 */
if (ThisTime > 1439) ThisTime = 1439; /* or greater than 11:59 */
if (ThisTime > (MINUTES_PER_DAY-1)) ThisTime = (MINUTES_PER_DAY-1); /* or greater than 11:59 */
if (ThisTime > q->tt.nexttime) return ThisTime;
if (ThisTime <= LastTime) {
q->sched[0] = 0;
@@ -470,12 +417,7 @@ QueuedRem *q;
/* Sleep or read command from stdin in "daemon -1" mode */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void DaemonWait(unsigned int sleeptime)
#else
static DaemonWait(sleeptime)
unsigned int sleeptime
#endif
static void DaemonWait(unsigned int sleeptime)
{
fd_set readSet;
struct timeval timeout;
@@ -542,13 +484,8 @@ unsigned int sleeptime
/* Restarts Remind if date rolls over or REREAD cmd received */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void reread(void)
#else
static reread()
#endif
static void reread(void)
{
execvp(ArgV[0], ArgV);
}
#endif /* HAVE_QUEUED from way at the top */

View File

@@ -6,46 +6,34 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
#include "config.h"
#include "dynbuf.h"
static char const RCSID[] = "$Id: rem2ps.c,v 1.9 1999-04-05 17:34:55 dfs Exp $";
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef __TURBOC__
#include <io.h>
#endif
#include "rem2ps.h"
#include "version.h"
#ifdef HAVE_PROTOS
#define ARGS(x) x
#else
#define ARGS(x) ()
#endif
#define NEW(type) ((type *) malloc(sizeof(type)))
#define SPECIAL_NORMAL 0
#define SPECIAL_POSTSCRIPT 1
#define SPECIAL_PSFILE 2
#define SPECIAL_MOON 3
#define SPECIAL_SHADE 4
#define SPECIAL_COLOR 5
typedef struct calentry {
struct calentry *next;
int special;
char *entry;
} CalEntry;
@@ -82,7 +70,8 @@ PageType Pages[] =
{"B5", 519, 729},
{"Folio", 612, 936},
{"Quarto", 612, 780},
{"10x14", 720, 1008}
{"10x14", 720, 1008},
{"-custom-", 0, 0}
};
PageType DefaultPage[1] =
@@ -126,15 +115,15 @@ int LeftMarg, RightMarg, TopMarg, BotMarg;
int FillPage;
int Verbose = 0;
void Init ARGS ((int argc, char *argv[]));
void Usage ARGS ((char *s));
void DoPsCal ARGS ((void));
int DoQueuedPs ARGS ((void));
void DoSmallCal ARGS((char *m, int days, int first, int col, int which));
void WriteProlog ARGS ((void));
void WriteCalEntry ARGS ((void));
void WriteOneEntry ARGS ((char *s));
void GetSmallLocations ARGS ((void));
void Init (int argc, char *argv[]);
void Usage (char *s);
void DoPsCal (void);
int DoQueuedPs (void);
void DoSmallCal (char *m, int days, int first, int col, int which);
void WriteProlog (void);
void WriteCalEntry (void);
void WriteOneEntry (CalEntry *c);
void GetSmallLocations (void);
char *EatToken(char *in, char *out, int maxlen);
/***************************************************************/
@@ -142,13 +131,7 @@ char *EatToken(char *in, char *out, int maxlen);
/* MAIN PROGRAM */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int main(int argc, char *argv[])
#else
int main(argc, argv)
int argc;
char argv[];
#endif
int main(int argc, char *argv[])
{
/* If stdin is a tty - probably wrong. */
@@ -190,11 +173,7 @@ char argv[];
/* DoPsCal - emit PostScript for the calendar. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
void DoPsCal(void)
#else
void DoPsCal()
#endif
{
char month[40], year[40];
char prevm[40], nextm[40];
@@ -280,14 +259,18 @@ void DoPsCal()
fprintf(stderr, "Input from REMIND is corrupt!\n");
exit(1);
}
DBufGets(&buf, stdin);
if (!strcmp(DBufValue(&buf), PSEND)) {
DBufFree(&buf);
break;
}
/* Read the day number - a bit of a hack! */
/* Ignore lines beginning with '#' */
if (DBufValue(&buf)[0] == '#') {
continue;
}
/* Read the day number - a bit of a hack! */
DayNum = (DBufValue(&buf)[8] - '0') * 10 + DBufValue(&buf)[9] - '0';
if (DayNum != CurDay) {
for(; CurDay<DayNum; CurDay++) {
@@ -295,13 +278,14 @@ void DoPsCal()
WkDayNum = (WkDayNum + 1) % 7;
}
}
/* Add the text */
/* Add the text */
c = NEW(CalEntry);
if (!c) {
fprintf(stderr, "malloc failed - aborting.\n");
exit(1);
}
c->next = NULL;
c->special = SPECIAL_NORMAL;
/* Skip the tag, duration and time */
startOfBody = DBufValue(&buf)+10;
@@ -325,38 +309,45 @@ void DoPsCal()
!strcmp(passthru, "SHADE")) {
is_ps = 1;
}
c->entry = malloc(strlen(startOfBody) + 1 + is_ps);
c->entry = malloc(strlen(startOfBody) + 1);
if (!c->entry) {
fprintf(stderr, "malloc failed - aborting.\n");
exit(1);
}
strcpy(c->entry+is_ps, startOfBody);
strcpy(c->entry, startOfBody);
if (is_ps) {
/* Save the 'P' or 'F' flag */
/* Save the type of SPECIAL */
if (!strcmp(passthru, "PostScript")) {
*(c->entry) = 'P';
c->special = SPECIAL_POSTSCRIPT;
} else if (!strcmp(passthru, "SHADE")) {
*(c->entry) = 'S';
c->special = SPECIAL_SHADE;
} else if (!strcmp(passthru, "MOON")) {
*(c->entry) = 'M';
c->special = SPECIAL_MOON;
} else {
*(c->entry) = 'F';
c->special = SPECIAL_PSFILE;
}
if (!PsEntries[DayNum]) PsEntries[DayNum] = c;
else {
if (!PsEntries[DayNum]) {
PsEntries[DayNum] = c;
} else {
d = PsEntries[DayNum];
while(d->next) d = d->next;
d->next = c;
}
} else if (!strcmp(passthru, "*")) {
/* Put on linked list */
if (!CurEntries) CurEntries = c;
else {
} else if (!strcmp(passthru, "*") ||
!strcmp(passthru, "COLOR")) {
/* Put on linked list */
if (!CurEntries) {
CurEntries = c;
} else {
d = CurEntries;
while(d->next) d = d->next;
d->next = c;
}
if (!strcmp(passthru, "COLOR")) {
c->special = SPECIAL_COLOR;
}
}
}
for(; CurDay<=days; CurDay++) {
@@ -392,11 +383,7 @@ void DoPsCal()
/* WriteProlog - write the PostScript prologue */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
void WriteProlog(void)
#else
void WriteProlog()
#endif
{
int i;
int x = CurPage->xsize;
@@ -497,11 +484,7 @@ void WriteProlog()
/* WriteCalEntry - write all entries for one day */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
void WriteCalEntry(void)
#else
void WriteCalEntry()
#endif
{
CalEntry *c = CurEntries;
CalEntry *d;
@@ -520,7 +503,7 @@ void WriteCalEntry()
CurEntries = NULL;
while(c) {
WriteOneEntry(c->entry);
WriteOneEntry(c);
free(c->entry);
d = c->next;
free(c);
@@ -540,7 +523,7 @@ void WriteCalEntry()
/* If WkDayNum is a Sunday or Monday, depending on MondayFirst,
move to next row. Also handle the queued PS and PSFILE reminders */
if ((!MondayFirst && WkDayNum == 6) ||
(MondayFirst && WkDayNum == 0) || CurDay == MaxDay) {
(MondayFirst && WkDayNum == 0) || CurDay == MaxDay) {
HadQPS = 0;
if (MondayFirst) begin = CurDay - (WkDayNum ? WkDayNum-1 : 6);
else begin = CurDay - WkDayNum;
@@ -588,37 +571,61 @@ void WriteCalEntry()
/* WriteOneEntry - write an entry for one day */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
void WriteOneEntry(char *s)
#else
void WriteOneEntry(s)
char *s;
#endif
void WriteOneEntry(CalEntry *c)
{
int c;
int ch, i;
char *s = c->entry;
printf(" [");
/* Chew up leading spaces */
/* Chew up leading spaces */
while(isspace((unsigned char) *s)) s++;
/* Skip three decimal numbers for COLOR special */
if (c->special == SPECIAL_COLOR) {
for (i=0; i<3; i++) {
while(*s && !isspace(*s)) s++;
while(*s && isspace(*s)) s++;
}
}
PutChar('(');
while(*s) {
/* Use the "unsigned char" cast to fix problem on Solaris 2.5 */
/* which treated some latin1 characters as white space. */
c = (unsigned char) *s++;
if (c == '\\' || c == '(' || c == ')') PutChar('\\');
if (!isspace(c)) PutChar(c);
/* which treated some latin1 characters as white space. */
ch = (unsigned char) *s++;
if (ch == '\\' || ch == '(' || ch == ')') PutChar('\\');
if (!isspace(ch)) PutChar(ch);
else {
PutChar(')');
while(isspace((unsigned char)*s)) s++;
if (!*s) {
printf("]\n");
return;
goto finish;
}
PutChar('(');
}
}
printf(")]\n");
printf(")\n");
finish:
if (c->special == SPECIAL_COLOR) {
int r, g, b;
if (sscanf(c->entry, "%d %d %d", &r, &g, &b) == 3) {
if (r < 0) r = 0;
else if (r > 255) r = 255;
if (g < 0) g = 0;
else if (g > 255) g = 255;
if (b < 0) b = 0;
else if (b > 255) b = 255;
printf("(gsave %f %f %f setrgbcolor)(grestore)",
r / 255.0, g / 255.0, b / 255.0);
} else {
/* Punt... unrecognized color is black */
printf("()()");
}
} else {
printf("()()");
}
printf("]\n");
}
/***************************************************************/
@@ -626,13 +633,7 @@ char *s;
/* Init - set up parameters */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void Init(int argc, char *argv[])
#else
void Init(argc, argv)
int argc;
char *argv[];
#endif
void Init(int argc, char *argv[])
{
char *s, *t;
int i=1;
@@ -676,9 +677,9 @@ char *argv[];
case 'e': EntrySize = t; break;
case 'd': DaySize = t; break;
case 't': TitleSize = t; break;
default: Usage("Size must specify h, t, e, or d");
default: Usage("Size must specify h, t, e, or d");
}
}
}
break;
case 'f':
@@ -691,9 +692,9 @@ char *argv[];
case 'd': DayFont = t; break;
case 's': SmallFont = t; break;
case 't': TitleFont = t; break;
default: Usage("Font must specify s, h, t, e, or d");
default: Usage("Font must specify s, h, t, e, or d");
}
}
}
break;
case 'v':
@@ -704,20 +705,35 @@ char *argv[];
if (i == argc) Usage("Media must be supplied");
t = argv[i++];
CurPage = NULL;
for (j=0; j<NUMPAGES; j++)
for (j=0; j<NUMPAGES-1; j++)
if (!strcmp(t, Pages[j].name)) {
CurPage = &Pages[j];
CurPage = &Pages[j];
break;
}
if (!CurPage) {
double w, h;
if (sscanf(t, "%lfx%lfin", &w, &h) == 2) {
CurPage = &Pages[NUMPAGES-1];
CurPage->xsize = (int) (w * 72.0);
CurPage->ysize = (int) (h * 72.0);
} else if (sscanf(t, "%lfx%lfcm", &w, &h) == 2) {
CurPage = &Pages[NUMPAGES-1];
CurPage->xsize = (int) ((double) w * 28.346457);
CurPage->ysize = (int) ((double) w * 28.346457);
}
}
if (!CurPage) {
fprintf(stderr, "\nUnknown media specified.\n");
fprintf(stderr, "\nAvailable media types:\n");
for (j=0; j<NUMPAGES; j++)
for (j=0; j<NUMPAGES-1; j++) {
fprintf(stderr, " %s\n", Pages[j].name);
}
fprintf(stderr, " WxHin Specify size in inches (W and H are decimal numbers)\n");
fprintf(stderr, " WxHcm Specify size in centimetres (W and H are decimal numbers)\n");
fprintf(stderr, "Default media type is %s\n", DefaultPage[0].name);
exit(1);
}
}
break;
case 'o':
@@ -775,12 +791,7 @@ char *argv[];
/* Usage - print usage information */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void Usage(char *s)
#else
void Usage(s)
char *s;
#endif
void Usage(char *s)
{
if (s) fprintf(stderr, "Rem2PS: %s\n\n", s);
@@ -809,13 +820,7 @@ char *s;
/* month. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
void DoSmallCal(char *m, int days, int first, int col, int which)
#else
void DoSmallCal(m, days, first, col, which)
char *m;
int days, first, col;
#endif
{
/* Do the small calendar */
int i, j;
@@ -843,7 +848,7 @@ int days, first, col;
/* Move origin to upper-left hand corner of appropriate box */
printf("%d xincr mul MinX add ysmall%d translate\n", col, which);
/* Print the month */
/* Print the month */
printf("SmallWidth 7 mul (%s) stringwidth pop sub 2 div Border add Border neg SmallFontSize sub moveto (%s) show\n", m, m);
/* Print the days of the week */
@@ -869,11 +874,7 @@ int days, first, col;
/* DoQueuedPs - do the queued PS and PSFILE reminders. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoQueuedPs(void)
#else
int DoQueuedPs()
#endif
int DoQueuedPs(void)
{
int i;
int HadPS = 0;
@@ -910,14 +911,14 @@ int DoQueuedPs()
while (e) {
/* Now do the user's PostScript code */
fnoff = 1;
/* Now do the PostScript SPECIAL */
fnoff = 0;
while (isspace(*(e->entry+fnoff))) fnoff++;
switch(*e->entry) {
case 'P': /* Send PostScript through */
switch(e->special) {
case SPECIAL_POSTSCRIPT: /* Send PostScript through */
printf("%s\n", e->entry+fnoff);
break;
case 'F': /* PostScript from a file */
case SPECIAL_PSFILE: /* PostScript from a file */
fp = fopen(e->entry+fnoff, "r");
if (!fp) {
fprintf(stderr, "Could not open PostScript file `%s'\n", e->entry+1);
@@ -930,7 +931,7 @@ int DoQueuedPs()
fclose(fp);
}
break;
case 'S': /* Shading */
case SPECIAL_SHADE: /* Shading */
num = sscanf(e->entry+fnoff, "%d %d %d", &r, &g, &b);
if (num == 1) {
g = r;
@@ -952,7 +953,7 @@ int DoQueuedPs()
r/255.0, g/255.0, b/255.0);
break;
case 'M': /* Moon phase */
case SPECIAL_MOON: /* Moon phase */
num = sscanf(e->entry+fnoff, "%d %d %d", &phase, &moonsize,
&fontsize);
if (num == 1) {
@@ -975,7 +976,7 @@ int DoQueuedPs()
sprintf(buffer, "%d", moonsize);
size = buffer;
}
printf("gsave 0 setgray newpath Border %s add BoxHeight Border sub %s sub\n", size, size);
printf(" %s 0 360 arc closepath\n", size);
switch(phase) {
@@ -1056,11 +1057,7 @@ int DoQueuedPs()
/* Set up the locations for the small calendars. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void GetSmallLocations(void)
#else
void GetSmallLocations()
#endif
void GetSmallLocations(void)
{
char c;
char *s = SmallLocation;
@@ -1079,14 +1076,14 @@ void GetSmallLocations()
switch(c) {
case 'b':
/* Adjust Feb. if we want it on the bottom */
if (MaxDay == 28 && colfirst == 0) {
if (MaxDay == 28 && colfirst == 0) {
printf("/ysmallbot ymin def /ymin ysmallbot MinBoxSize sub def\n");
printf("MinX ymin MaxX ymin L\n");
printf("/ysmall1 ysmallbot def /ysmall2 ysmallbot def\n");
SmallCol1 = 5;
SmallCol2 = 6;
return;
}
}
if (collast <= 4) {
printf("/ysmall1 ysmallbot def /ysmall2 ysmallbot def\n");
SmallCol1 = 5;
@@ -1117,7 +1114,7 @@ void GetSmallLocations()
NoSmallCal = 1;
return;
}
/***************************************************************/
/* */
/* EatToken */
@@ -1125,13 +1122,7 @@ void GetSmallLocations()
/* Read a space-delimited token into an output buffer. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC char *EatToken(char *in, char *out, int maxlen)
#else
char *EatToken(in, out, maxlen)
char *in, *out;
int maxlen;
#endif
char *EatToken(char *in, char *out, int maxlen)
{
int i = 0;

View File

@@ -6,12 +6,10 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
/* $Id: rem2ps.h,v 1.3 1999-04-05 17:34:56 dfs Exp $ */
char *PSProlog1[] =
{
"% This file was produced by Remind and Rem2PS, written by",
@@ -178,8 +176,22 @@ char *PSProlog2[] =
" /width exch def",
" /xleft exch def",
" /curline () def",
" % The last two strings in the word array are actually the PostScript",
" % code to execute before and after the entry is printed.",
" dup dup",
" length 1 sub",
" get",
" exch",
" dup dup",
" length 2 sub",
" get",
" dup length 0 gt",
" {cvx exec} {pop} ifelse",
" dup length 2 sub 0 exch getinterval",
" {EnterOneWord} forall",
" FinishFormatting",
" dup length 0 gt",
" {cvx exec} {pop} ifelse",
" y",
"} bind def",
"% Variables for calendar boxes:",

View File

@@ -6,24 +6,16 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
#include "config.h"
static char const RCSID[] = "$Id: sort.c,v 1.5 1999-04-05 17:34:56 dfs Exp $";
#include <stdio.h>
#include <string.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
#include "types.h"
#include "protos.h"
#include "expr.h"
@@ -43,8 +35,8 @@ typedef struct sortrem {
/* The sorted reminder queue */
static Sortrem *SortedQueue = (Sortrem *) NULL;
PRIVATE Sortrem *MakeSortRem ARGS ((int jul, int tim, char *body, int typ, int prio));
PRIVATE void IssueSortBanner ARGS ((int jul));
static Sortrem *MakeSortRem (int jul, int tim, char *body, int typ, int prio);
static void IssueSortBanner (int jul);
/***************************************************************/
/* */
@@ -53,14 +45,7 @@ PRIVATE void IssueSortBanner ARGS ((int jul));
/* Create a new Sortrem entry - return NULL on failure. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE Sortrem *MakeSortRem(int jul, int tim, char *body, int typ, int prio)
#else
static Sortrem *MakeSortRem(jul, tim, body, typ, prio)
int jul, tim;
char *body;
int typ, prio;
#endif
static Sortrem *MakeSortRem(int jul, int tim, char *body, int typ, int prio)
{
Sortrem *new = NEW(Sortrem);
if (!new) return NULL;
@@ -86,15 +71,7 @@ int typ, prio;
/* Insert a reminder into the sort buffer */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int InsertIntoSortBuffer(int jul, int tim, char *body, int typ, int prio)
#else
int InsertIntoSortBuffer(jul, tim, body, typ, prio)
int jul;
int tim;
char *body;
int typ, prio;
#endif
int InsertIntoSortBuffer(int jul, int tim, char *body, int typ, int prio)
{
Sortrem *new = MakeSortRem(jul, tim, body, typ, prio);
Sortrem *cur = SortedQueue, *prev = NULL;
@@ -147,11 +124,7 @@ int typ, prio;
/* Issue all of the sorted reminders and free memory. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void IssueSortedReminders(void)
#else
void IssueSortedReminders()
#endif
void IssueSortedReminders(void)
{
Sortrem *cur = SortedQueue;
Sortrem *next;
@@ -173,11 +146,7 @@ void IssueSortedReminders()
break;
case MSF_TYPE:
#ifdef OS2_POPUP
FillParagraph(cur->text, 0);
#else
FillParagraph(cur->text);
#endif
break;
case RUN_TYPE:
@@ -199,12 +168,7 @@ void IssueSortedReminders()
/* defined to take one argument. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void IssueSortBanner(int jul)
#else
static void IssueSortBanner(jul)
int jul;
#endif
static void IssueSortBanner(int jul)
{
char BanExpr[64];
int y, m, d;
@@ -237,14 +201,9 @@ int jul;
/* sorting direction by date and time, resp. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int CompareRems(int dat1, int tim1, int prio1,
int dat2, int tim2, int prio2,
int bydate, int bytime, int byprio)
#else
int CompareRems(dat1, tim1, prio1, dat2, tim2, prio2, bydate, bytime, byprio)
int dat1, tim1, prio1, dat2, tim2, prio2, bydate, bytime, byprio;
#endif
int CompareRems(int dat1, int tim1, int prio1,
int dat2, int tim2, int prio2,
int bydate, int bytime, int byprio)
{
int dafter, tafter, pafter;

View File

@@ -7,25 +7,17 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
#include "config.h"
static char const RCSID[] = "$Id: token.c,v 1.8 1999-04-05 17:34:57 dfs Exp $";
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
#include "types.h"
#include "globals.h"
#include "protos.h"
@@ -49,63 +41,64 @@ while (isdigit(*(string))) { \
Token TokArray[] = {
/* NAME MINLEN TYPE VALUE */
{ "after", 3, T_Skip, AFTER_SKIP },
{ "after", 3, T_Skip, AFTER_SKIP },
{ "april", 3, T_Month, 3 },
{ "at", 2, T_At, 0 },
{ "august", 3, T_Month, 7 },
{ "banner", 3, T_Banner, 0 },
{ "before", 3, T_Skip, BEFORE_SKIP },
{ "cal", 3, T_RemType, CAL_TYPE },
{ "before", 3, T_Skip, BEFORE_SKIP },
{ "cal", 3, T_RemType, CAL_TYPE },
{ "clear-omit-context", 5, T_Clr, 0 },
{ "debug", 5, T_Debug, 0 },
{ "december", 3, T_Month, 11 },
{ "dumpvars", 4, T_Dumpvars, 0 },
{ "duration", 3, T_Duration, 0 },
{ "else", 4, T_Else, 0 },
{ "endif", 5, T_EndIf, 0 },
{ "else", 4, T_Else, 0 },
{ "endif", 5, T_EndIf, 0 },
{ "errmsg", 6, T_ErrMsg, 0 },
{ "exit", 4, T_Exit, 0 },
{ "february", 3, T_Month, 1 },
{ "february", 3, T_Month, 1 },
{ "flush", 5, T_Flush, 0 },
{ "friday", 3, T_WkDay, 4 },
{ "from", 4, T_Scanfrom, FROM_TYPE },
{ "fset", 4, T_Fset, 0 },
{ "if", 2, T_If, 0 },
{ "iftrig", 6, T_IfTrig, 0 },
{ "include", 3, T_Include, 0 },
{ "january", 3, T_Month, 0 },
{ "include", 3, T_Include, 0 },
{ "january", 3, T_Month, 0 },
{ "july", 3, T_Month, 6 },
{ "june", 3, T_Month, 5 },
{ "march", 3, T_Month, 2 },
{ "may", 3, T_Month, 4 },
{ "may", 3, T_Month, 4 },
{ "monday", 3, T_WkDay, 0 },
{ "msf", 3, T_RemType, MSF_TYPE },
{ "msg", 3, T_RemType, MSG_TYPE },
{ "november", 3, T_Month, 10 },
{ "october", 3, T_Month, 9 },
{ "msg", 3, T_RemType, MSG_TYPE },
{ "november", 3, T_Month, 10 },
{ "october", 3, T_Month, 9 },
{ "omit", 3, T_Omit, 0 },
{ "once", 3, T_Once, 0 },
{ "once", 3, T_Once, 0 },
{ "pop-omit-context", 3, T_Pop, 0 },
{ "preserve", 8, T_Preserve, 0 },
{ "priority", 8, T_Priority, 0 },
{ "ps", 2, T_RemType, PS_TYPE },
{ "psfile", 6, T_RemType, PSF_TYPE },
{ "push-omit-context", 4, T_Push, 0 },
{ "ps", 2, T_RemType, PS_TYPE },
{ "psfile", 6, T_RemType, PSF_TYPE },
{ "push-omit-context", 4, T_Push, 0 },
{ "rem", 3, T_Rem, 0 },
{ "run", 3, T_RemType, RUN_TYPE },
{ "run", 3, T_RemType, RUN_TYPE },
{ "satisfy", 7, T_RemType, SAT_TYPE },
{ "saturday", 3, T_WkDay, 5 },
{ "scanfrom", 4, T_Scanfrom, 0 },
{ "scanfrom", 4, T_Scanfrom, SCANFROM_TYPE },
{ "sched", 5, T_Sched, 0 },
{ "september", 3, T_Month, 8 },
{ "september", 3, T_Month, 8 },
{ "set", 3, T_Set, 0 },
{ "skip", 3, T_Skip, SKIP_SKIP },
{ "skip", 3, T_Skip, SKIP_SKIP },
{ "special", 7, T_RemType, PASSTHRU_TYPE },
{ "sunday", 3, T_WkDay, 6 },
{ "tag", 3, T_Tag, 0 },
{ "thursday", 3, T_WkDay, 3 },
{ "tuesday", 3, T_WkDay, 1 },
{ "unset", 5, T_UnSet, 0 },
{ "until", 3, T_Until, 0 },
{ "unset", 5, T_UnSet, 0 },
{ "until", 3, T_Until, 0 },
{ "warn", 4, T_Warn, 0 },
{ "wednesday", 3, T_WkDay, 2 }
};
@@ -137,7 +130,7 @@ Token NonEnglishToks[] = {
};
#endif
PRIVATE int TokStrCmp ARGS((const Token *t, const char *s));
static int TokStrCmp (const Token *t, const char *s);
/***************************************************************/
/* */
@@ -147,13 +140,7 @@ PRIVATE int TokStrCmp ARGS((const Token *t, const char *s));
/* left square bracket, return a T_Illegal type. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC char *FindInitialToken(Token *tok, char *s)
#else
char *FindInitialToken(tok, s)
Token *tok;
char *s;
#endif
char *FindInitialToken(Token *tok, char *s)
{
DynamicBuffer buf;
DBufInit(&buf);
@@ -171,7 +158,7 @@ char *s;
return s;
}
/***************************************************************/
/* */
@@ -180,15 +167,9 @@ char *s;
/* Given a string, which token is it? */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void FindToken(const char *s, Token *tok)
#else
void FindToken(s, tok)
char *s;
Token *tok;
#endif
void FindToken(const char *s, Token *tok)
{
register int top, bot, mid, r;
int top, bot, mid, r, max;
int l;
tok->type = T_Illegal;
@@ -196,7 +177,7 @@ Token *tok;
tok->type = T_Empty;
return;
}
if (*s == '#' || *s == ';') {
tok->type = T_Comment;
return;
@@ -216,6 +197,7 @@ Token *tok;
}
bot = 0;
top = sizeof(TokArray) / sizeof(TokArray[0]) - 1;
max = sizeof(TokArray) / sizeof(TokArray[0]);
while(top >= bot) {
mid = (top + bot) / 2;
@@ -227,9 +209,13 @@ Token *tok;
return;
} else {
while (mid && !TokStrCmp(&TokArray[mid-1],s)) mid--;
while (!TokStrCmp(&TokArray[mid], s) && l < TokArray[mid].MinLen)
while (mid < max &&
!TokStrCmp(&TokArray[mid], s) &&
l < TokArray[mid].MinLen) {
mid++;
if (!TokStrCmp(&TokArray[mid], s)) {
}
if (mid < max &&
!TokStrCmp(&TokArray[mid], s)) {
tok->type = TokArray[mid].type;
tok->val = TokArray[mid].val;
return;
@@ -244,7 +230,7 @@ Token *tok;
array. */
#if LANG != ENGLISH
for (r=0; r<(sizeof(NonEnglishToks) / sizeof(Token)); r++) {
if (l >= NonEnglishToks[r].MinLen &&
if (l >= NonEnglishToks[r].MinLen &&
!TokStrCmp(&NonEnglishToks[r], s)) {
tok->type = NonEnglishToks[r].type;
tok->val = NonEnglishToks[r].val;
@@ -252,7 +238,7 @@ Token *tok;
}
}
#endif
return;
}
@@ -268,13 +254,7 @@ Token *tok;
/* Rep - *n */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void FindNumericToken(const char *s, Token *t)
#else
void FindNumericToken(s, t)
char *s;
Token *t;
#endif
void FindNumericToken(const char *s, Token *t)
{
int mult = 1, hour, min;
@@ -298,13 +278,17 @@ Token *t;
return;
}
/* If we hit a colon or a period, we've probably got a time hr:min */
if (*s == ':' || *s == '.' || *s == TIMESEP) {
if (*s == ':' || *s == '.' || *s == TimeSep) {
s++;
hour = t->val;
PARSENUM(min, s);
if (*s || hour > 23 || min > 59) return; /* Illegal time */
if (*s || min > 59) return; /* Illegal time */
t->val = hour*60 + min; /* Convert to minutes past midnight */
t->type = T_Time;
if (hour <= 23) {
t->type = T_Time;
} else {
t->type = T_LongTime;
}
return;
}
@@ -353,13 +337,7 @@ Token *t;
/* Compare a token to a string. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int TokStrCmp(const Token *t, const char *s)
#else
static int TokStrCmp(t, s)
Token *t;
char *s;
#endif
static int TokStrCmp(const Token *t, const char *s)
{
register int r;
char *tk = t->name;

View File

@@ -6,23 +6,14 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
#include "config.h"
static char const RCSID[] = "$Id: trigger.c,v 1.4 1999-04-05 17:34:57 dfs Exp $";
#include <stdio.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
#include "types.h"
#include "expr.h"
#include "protos.h"
@@ -34,10 +25,10 @@ static char const RCSID[] = "$Id: trigger.c,v 1.4 1999-04-05 17:34:57 dfs Exp $"
#define GOT_YR 4
#define GOT_WD 8
static int JYear ARGS((int jul));
static int JMonth ARGS((int jul));
static int NextSimpleTrig ARGS((int startdate, Trigger *trig, int *err));
static int GetNextTriggerDate ARGS((Trigger *trig, int start, int *err, int *nextstart));
static int JYear(int jul);
static int JMonth(int jul);
static int NextSimpleTrig(int startdate, Trigger *trig, int *err);
static int GetNextTriggerDate(Trigger *trig, int start, int *err, int *nextstart);
/***************************************************************/
/* */
@@ -51,14 +42,7 @@ static int GetNextTriggerDate ARGS((Trigger *trig, int start, int *err, int *nex
/* so that dates with a REP can be handled properly. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int NextSimpleTrig(int startdate, Trigger *trig, int *err)
#else
static int NextSimpleTrig(startdate, trig, err)
int startdate;
Trigger *trig;
int *err;
#endif
static int NextSimpleTrig(int startdate, Trigger *trig, int *err)
{
int typ = 0;
int d, m, y, j, d2, m2, y2;
@@ -271,12 +255,7 @@ int *err;
/* JMonth - Given a Julian date, what's the month? */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int JMonth(int jul)
#else
static int JMonth(jul)
int jul;
#endif
static int JMonth(int jul)
{
int y, m, d;
FromJulian(jul, &y, &m, &d);
@@ -288,12 +267,7 @@ int jul;
/* JYear - Given a Julian date, what's the year? */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int JYear(int jul)
#else
static int JYear(jul)
int jul;
#endif
static int JYear(int jul)
{
int y, m, d;
FromJulian(jul, &y, &m, &d);
@@ -310,15 +284,7 @@ int jul;
/* expired, -2 if can't compute trigger date. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int GetNextTriggerDate(Trigger *trig, int start, int *err, int *nextstart)
#else
static int GetNextTriggerDate(trig, start, err, nextstart)
Trigger *trig;
int start;
int *err;
int *nextstart;
#endif
static int GetNextTriggerDate(Trigger *trig, int start, int *err, int *nextstart)
{
int simple, mod;
@@ -380,14 +346,7 @@ int *nextstart;
/* today's date. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int ComputeTrigger(int today, Trigger *trig, int *err)
#else
int ComputeTrigger(today, trig, err)
int today;
Trigger *trig;
int *err;
#endif
int ComputeTrigger(int today, Trigger *trig, int *err)
{
int nattempts = 0,
start = today,
@@ -396,6 +355,7 @@ int *err;
result;
LastTrigValid = 0;
/* Assume everything works */
*err = OK;

View File

@@ -6,12 +6,11 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
/* $Id: types.h,v 1.4 1999-04-05 17:34:58 dfs Exp $ */
#include <limits.h>
#include "dynbuf.h"
/* Values */
@@ -28,11 +27,7 @@ typedef struct {
char *name;
char prec;
char type;
#ifdef HAVE_PROTOS
int (*func)(void);
#else
int (*func) ();
#endif
} Operator;
/* Define the structure of a variable */
@@ -105,7 +100,7 @@ typedef Parser *ParsePtr; /* Pointer to parser structure */
#define BEFORE_SKIP 2
#define AFTER_SKIP 3
#define NO_TIME 1500 /* >1440, ie > than the largest possible legal time */
#define NO_TIME INT_MAX
#define NO_PRIORITY 5000 /* Default priority is midway between 0 and 9999 */
@@ -150,7 +145,8 @@ enum TokTypes
T_Sched,
T_Warn,
T_Tag,
T_Duration
T_Duration,
T_LongTime
};
/* The structure of a token */
@@ -171,8 +167,10 @@ typedef struct {
#define IF_ELSE_MASK 2
/* Flags for the DoSubst function */
#define NORMAL_MODE 0
#define CAL_MODE 1
#define NORMAL_MODE 0
#define CAL_MODE 1
#define ADVANCE_MODE 2
#define QUOTE_MARKER 1 /* Unlikely character to appear in reminder */
/* Flags for disabling run */
@@ -189,3 +187,7 @@ typedef struct {
#define SORT_NONE 0
#define SORT_ASCEND 1
#define SORT_DESCEND 2
/* Flags for FROM / SCANFROM */
#define SCANFROM_TYPE 0
#define FROM_TYPE 1

View File

@@ -7,24 +7,16 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
#include "config.h"
static char const RCSID[] = "$Id: userfns.c,v 1.5 1999-04-05 17:34:59 dfs Exp $";
#include <stdio.h>
#include <ctype.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
#include "types.h"
#include "globals.h"
#include "protos.h"
@@ -54,11 +46,11 @@ extern Operator Func[];
extern Value ValStack[];
extern int ValStackPtr;
PRIVATE void DestroyUserFunc ARGS ((UserFunc *f));
PRIVATE void FUnset ARGS ((char *name));
PRIVATE void FSet ARGS ((UserFunc *f));
PRIVATE int SetUpLocalVars ARGS ((UserFunc *f));
PRIVATE void DestroyLocalVals ARGS ((UserFunc *f));
static void DestroyUserFunc (UserFunc *f);
static void FUnset (char *name);
static void FSet (UserFunc *f);
static int SetUpLocalVars (UserFunc *f);
static void DestroyLocalVals (UserFunc *f);
/***************************************************************/
/* */
@@ -67,12 +59,7 @@ PRIVATE void DestroyLocalVals ARGS ((UserFunc *f));
/* Define a user-defined function - the FSET command. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoFset(ParsePtr p)
#else
int DoFset(p)
ParsePtr p;
#endif
int DoFset(ParsePtr p)
{
int r;
int c;
@@ -183,12 +170,7 @@ ParsePtr p;
/* Free up all the resources used by a user-defined function. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void DestroyUserFunc(UserFunc *f)
#else
static void DestroyUserFunc(f)
UserFunc *f;
#endif
static void DestroyUserFunc(UserFunc *f)
{
Var *v, *prev;
@@ -216,12 +198,7 @@ UserFunc *f;
/* it exists. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void FUnset(char *name)
#else
static void FUnset(name)
char *name;
#endif
static void FUnset(char *name)
{
UserFunc *cur, *prev;
int h;
@@ -247,12 +224,7 @@ char *name;
/* Insert a user-defined function into the hash table. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void FSet(UserFunc *f)
#else
static void FSet(f)
UserFunc *f;
#endif
static void FSet(UserFunc *f)
{
int h = HashVal(f->name) % FUNC_HASH_SIZE;
f->next = FuncHash[h];
@@ -266,13 +238,7 @@ UserFunc *f;
/* Call a user-defined function. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int CallUserFunc(char *name, int nargs)
#else
int CallUserFunc(name, nargs)
char *name;
int nargs;
#endif
int CallUserFunc(char *name, int nargs)
{
UserFunc *f;
int h = HashVal(name) % FUNC_HASH_SIZE;
@@ -351,12 +317,7 @@ int nargs;
/* Set up the local variables from the stack frame. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE int SetUpLocalVars(UserFunc *f)
#else
static int SetUpLocalVars(f)
UserFunc *f;
#endif
static int SetUpLocalVars(UserFunc *f)
{
int i, r;
Var *var;
@@ -378,12 +339,7 @@ UserFunc *f;
/* the function. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void DestroyLocalVals(UserFunc *f)
#else
static void DestroyLocalVals(f)
UserFunc *f;
#endif
static void DestroyLocalVals(UserFunc *f)
{
Var *v = f->locals;
@@ -400,12 +356,7 @@ UserFunc *f;
/* it is defined, or -1 if it is not defined. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int UserFuncExists(char *fn)
#else
int UserFuncExists(fn)
char *fn;
#endif
int UserFuncExists(char *fn)
{
UserFunc *f;
int h = HashVal(fn) % FUNC_HASH_SIZE;

View File

@@ -6,25 +6,17 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2000 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
#include "config.h"
static char const RCSID[] = "$Id: utils.c,v 1.4 1999-04-05 17:34:59 dfs Exp $";
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
#include "types.h"
#include "globals.h"
#include "protos.h"
@@ -38,13 +30,7 @@ static char const RCSID[] = "$Id: utils.c,v 1.4 1999-04-05 17:34:59 dfs Exp $";
/* Just like strncpy EXCEPT we ALWAYS copy the trailing 0. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC char *StrnCpy(char *dest, const char *source, int n)
#else
char *StrnCpy(dest, source, n)
char *dest, *source;
int n;
#endif
char *StrnCpy(char *dest, const char *source, int n)
{
register char *odest = dest;
@@ -62,13 +48,7 @@ int n;
/* of the first string, whichever is greater. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int StrMatch(const char *s1, const char *s2, int n)
#else
int StrMatch(s1, s2, n)
char *s1, *s2;
int n;
#endif
int StrMatch(const char *s1, const char *s2, int n)
{
int l;
if ((l = strlen(s1)) < n) return 0;
@@ -80,13 +60,7 @@ int n;
/* StrinCmp - compare strings, case-insensitive */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int StrinCmp(const char *s1, const char *s2, int n)
#else
int StrinCmp(s1, s2, n)
char *s1, *s2;
int n;
#endif
int StrinCmp(const char *s1, const char *s2, int n)
{
register int r;
while (n && *s1 && *s2) {
@@ -106,12 +80,7 @@ int n;
/* Like ANSI strdup */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC char *StrDup(const char *s)
#else
char *StrDup(s)
char *s;
#endif
char *StrDup(const char *s)
{
char *ret = (char *) malloc(strlen(s)+1);
if (!ret) return (char *) NULL;
@@ -126,12 +95,7 @@ char *s;
/* Compare strings, case insensitive. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int StrCmpi(const char *s1, const char *s2)
#else
int StrCmpi(s1, s2)
char *s1, *s2;
#endif
int StrCmpi(const char *s1, const char *s2)
{
int r;
while (*s1 && *s2) {
@@ -143,26 +107,6 @@ char *s1, *s2;
return UPPER(*s1) - UPPER(*s2);
}
#ifndef HAVE_STRSTR
#ifdef HAVE_PROTOS
PUBLIC char *strstr(char *s1, char *s2)
#else
char *strstr(s1, s2)
char *s1, *s2;
#endif
{
char *s = s1;
int len2 = strlen(s2);
int len1 = strlen(s1);
while (s-s1 <= len1-len2) {
if (!strncmp(s, s2, len2)) return s;
s++;
}
return NULL;
}
#endif
/***************************************************************/
/* */
/* DateOK */
@@ -170,12 +114,7 @@ char *s1, *s2;
/* Return 1 if the date is OK, 0 otherwise. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DateOK(int y, int m, int d)
#else
int DateOK(y, m, d)
int y, m, d;
#endif
int DateOK(int y, int m, int d)
{
if (d < 1 ||
m < 0 ||
@@ -185,31 +124,3 @@ int y, m, d;
d > DaysInMonth(m, y) ) return 0;
else return 1;
}
#ifdef BROKEN_PUTC
/***************************************************************/
/* */
/* Safe versions of putc and putchar */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int SafePutChar(int c)
#else
int SafePutChar(c)
int c;
#endif
{
return putchar(c);
}
#ifdef HAVE_PROTOS
PUBLIC int SafePutc(int c, FILE *fp)
#else
int SafePutc(c, fp)
int c;
FILE *fp;
#endif
{
return putc(c, fp);
}
#endif

232
src/var.c
View File

@@ -7,25 +7,17 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2007 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
#include "config.h"
static char const RCSID[] = "$Id: var.c,v 1.6 1999-04-05 17:34:59 dfs Exp $";
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
#include "types.h"
#include "expr.h"
#include "globals.h"
@@ -42,18 +34,53 @@ static char const RCSID[] = "$Id: var.c,v 1.6 1999-04-05 17:34:59 dfs Exp $";
static Var *VHashTbl[VAR_HASH_SIZE];
typedef int (*SysVarFunc)(int, Value *);
static int date_sep_func(int do_set, Value *val)
{
if (!do_set) {
val->v.str = malloc(2);
if (!val->v.str) return E_NO_MEM;
val->v.str[0] = DateSep;
val->v.str[1] = 0;
val->type = STR_TYPE;
return OK;
}
if (val->type != STR_TYPE) return E_BAD_TYPE;
if (strcmp(val->v.str, "/") &&
strcmp(val->v.str, "-")) {
return E_BAD_TYPE;
}
DateSep = val->v.str[0];
return OK;
}
static int time_sep_func(int do_set, Value *val)
{
if (!do_set) {
val->v.str = malloc(2);
if (!val->v.str) return E_NO_MEM;
val->v.str[0] = TimeSep;
val->v.str[1] = 0;
val->type = STR_TYPE;
return OK;
}
if (val->type != STR_TYPE) return E_BAD_TYPE;
if (strcmp(val->v.str, ":") &&
strcmp(val->v.str, ".")) {
return E_BAD_TYPE;
}
TimeSep = val->v.str[0];
return OK;
}
/***************************************************************/
/* */
/* HashVal */
/* Given a string, compute the hash value. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC unsigned int HashVal(const char *str)
#else
unsigned int HashVal(str)
char *str;
#endif
unsigned int HashVal(const char *str)
{
register unsigned int i=0;
register unsigned int j=1;
@@ -75,13 +102,7 @@ char *str;
/* string. If create is 1, create the variable. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC Var *FindVar(const char *str, int create)
#else
Var *FindVar(str, create)
char *str;
int create;
#endif
Var *FindVar(const char *str, int create)
{
register int h;
register Var *v;
@@ -118,12 +139,7 @@ int create;
/* string and delete it. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DeleteVar(const char *str)
#else
int DeleteVar(str)
char *str;
#endif
int DeleteVar(const char *str)
{
register int h;
register Var *v;
@@ -152,13 +168,7 @@ char *str;
/* Set the indicate variable to the specified value. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int SetVar(const char *str, Value *val)
#else
int SetVar(str, val)
char *str;
Value *val;
#endif
int SetVar(const char *str, Value *val)
{
Var *v = FindVar(str, 1);
@@ -176,14 +186,7 @@ Value *val;
/* Get a copy of the value of the variable. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int GetVarValue(const char *str, Value *val, Var *locals)
#else
int GetVarValue(str, val, locals)
char *str;
Value *val;
Var *locals;
#endif
int GetVarValue(const char *str, Value *val, Var *locals)
{
Var *v;
@@ -209,12 +212,7 @@ Var *locals;
/* DoSet - set a variable. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoSet (Parser *p)
#else
int DoSet (p)
Parser *p;
#endif
int DoSet (Parser *p)
{
Value v;
int r;
@@ -242,12 +240,7 @@ Parser *p;
/* DoUnset - delete a bunch of variables. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoUnset (Parser *p)
#else
int DoUnset (p)
Parser *p;
#endif
int DoUnset (Parser *p)
{
int r;
@@ -282,12 +275,7 @@ Parser *p;
/* Command file command to dump variable table. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoDump(ParsePtr p)
#else
int DoDump(p)
ParsePtr p;
#endif
int DoDump(ParsePtr p)
{
int r;
Var *v;
@@ -336,11 +324,7 @@ ParsePtr p;
/* Dump the variable table to stderr. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void DumpVarTable(void)
#else
void DumpVarTable()
#endif
void DumpVarTable(void)
{
register Var *v;
register int i;
@@ -366,12 +350,7 @@ void DumpVarTable()
/* preserved variables unless ALL is non-zero. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void DestroyVars(int all)
#else
void DestroyVars(all)
int all;
#endif
void DestroyVars(int all)
{
int i;
Var *v, *next, *prev;
@@ -404,12 +383,7 @@ int all;
/* Given the name of a variable, "preserve" it. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int PreserveVar(char *name)
#else
int PreserveVar(name)
char *name;
#endif
int PreserveVar(char *name)
{
Var *v;
@@ -424,12 +398,7 @@ char *name;
/* DoPreserve - preserve a bunch of variables. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int DoPreserve (Parser *p)
#else
int DoPreserve (p)
Parser *p;
#endif
int DoPreserve (Parser *p)
{
int r;
@@ -484,13 +453,15 @@ typedef struct {
#define been_malloced min
/* Flag for no min/max constraint */
#define ANY 4532
#define ANY -31415926
/* All of the system variables sorted alphabetically */
static SysVar SysVarArr[] = {
/* name mod type value min/mal max */
{ "CalcUTC", 1, INT_TYPE, &CalculateUTC, 0, 1 },
{ "CalMode", 0, INT_TYPE, &DoCalendar, 0, 0 },
{ "Daemon", 0, INT_TYPE, &Daemon, 0, 0 },
{ "DateSep", 1, SPECIAL_TYPE, date_sep_func, 0, 0 },
{ "DefaultPrio", 1, INT_TYPE, &DefaultPrio, 0, 9999 },
{ "DontFork", 0, INT_TYPE, &DontFork, 0, 0 },
{ "DontQueue", 0, INT_TYPE, &DontQueue, 0, 0 },
@@ -515,18 +486,20 @@ static SysVar SysVarArr[] = {
{ "NextMode", 0, INT_TYPE, &NextMode, 0, 0 },
{ "NumQueued", 0, INT_TYPE, &NumQueued, 0, 0 },
{ "NumTrig", 0, INT_TYPE, &NumTriggered, 0, 0 },
{ "PSCal", 0, INT_TYPE, &PsCal, 0, 0 },
{ "PrefixLineNo", 0, INT_TYPE, &DoPrefixLineNo,0, 0 },
{ "PSCal", 0, INT_TYPE, &PsCal, 0, 0 },
{ "RunOff", 0, INT_TYPE, &RunDisabled, 0, 0 },
{ "SimpleCal", 0, INT_TYPE, &DoSimpleCalendar, 0, 0 },
{ "SortByDate", 0, INT_TYPE, &SortByDate, 0, 0},
{ "SortByPrio", 0, INT_TYPE, &SortByPrio, 0, 0},
{ "SortByTime", 0, INT_TYPE, &SortByTime, 0, 0},
{ "SubsIndent", 1, INT_TYPE, &SubsIndent, 0, 132}
{ "SubsIndent", 1, INT_TYPE, &SubsIndent, 0, 132},
{ "TimeSep", 1, SPECIAL_TYPE, time_sep_func, 0, 0 }
};
#define NUMSYSVARS ( sizeof(SysVarArr) / sizeof(SysVar) )
PRIVATE SysVar *FindSysVar ARGS((const char *name));
PRIVATE void DumpSysVar ARGS((const char *name, const SysVar *v));
static SysVar *FindSysVar (const char *name);
static void DumpSysVar (const char *name, const SysVar *v);
/***************************************************************/
/* */
/* SetSysVar */
@@ -534,24 +507,22 @@ PRIVATE void DumpSysVar ARGS((const char *name, const SysVar *v));
/* Set a system variable to the indicated value. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int SetSysVar(const char *name, Value *value)
#else
int SetSysVar(name, value)
char *name;
Value *value;
#endif
int SetSysVar(const char *name, Value *value)
{
SysVar *v = FindSysVar(name);
if (!v) return E_NOSUCH_VAR;
if (v->type != value->type) return E_BAD_TYPE;
if (v->type != SPECIAL_TYPE &&
v->type != value->type) return E_BAD_TYPE;
if (!v->modifiable) {
Eprint("%s: `$%s'", ErrMsg[E_CANT_MODIFY], name);
return E_CANT_MODIFY;
}
/* If it's a string variable, special measures must be taken */
if (v->type == STR_TYPE) {
if (v->type == SPECIAL_TYPE) {
SysVarFunc f = (SysVarFunc) v->value;
return f(1, value);
} else if (v->type == STR_TYPE) {
/* If it's a string variable, special measures must be taken */
if (v->been_malloced) free(*((char **)(v->value)));
v->been_malloced = 1;
*((char **) v->value) = value->v.str;
@@ -571,19 +542,16 @@ Value *value;
/* Get the value of a system variable */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC int GetSysVar(const char *name, Value *val)
#else
int GetSysVar(name, val)
char *name;
Value *val;
#endif
int GetSysVar(const char *name, Value *val)
{
SysVar *v = FindSysVar(name);
val->type = ERR_TYPE;
if (!v) return E_NOSUCH_VAR;
if (v->type == STR_TYPE) {
if (v->type == SPECIAL_TYPE) {
SysVarFunc f = (SysVarFunc) v->value;
return f(0, val);
} else if (v->type == STR_TYPE) {
val->v.str = StrDup(*((char **) v->value));
if (!val->v.str) return E_NO_MEM;
} else {
@@ -609,12 +577,7 @@ Value *val;
/* Find a system var with specified name. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE SysVar *FindSysVar(const char *name)
#else
static SysVar *FindSysVar(name)
char *name;
#endif
static SysVar *FindSysVar(const char *name)
{
int top=NUMSYSVARS-1, bottom=0;
int mid=(top + bottom) / 2;
@@ -629,7 +592,7 @@ char *name;
}
return NULL;
}
/***************************************************************/
/* */
/* DumpSysVarByName */
@@ -638,12 +601,7 @@ char *name;
/* If name is "", dump all system variables. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PUBLIC void DumpSysVarByName(const char *name)
#else
void DumpSysVarByName(name)
char *name;
#endif
void DumpSysVarByName(const char *name)
{
int i;
SysVar *v;
@@ -652,7 +610,7 @@ char *name;
for (i=0; i<NUMSYSVARS; i++) DumpSysVar(name, SysVarArr + i);
return;
}
v = FindSysVar(name);
DumpSysVar(name, v);
return;
@@ -665,28 +623,37 @@ char *name;
/* Dump the system variable. */
/* */
/***************************************************************/
#ifdef HAVE_PROTOS
PRIVATE void DumpSysVar(const char *name, const SysVar *v)
#else
static void DumpSysVar(name, v)
char *name;
SysVar *v;
#endif
static void DumpSysVar(const char *name, const SysVar *v)
{
char buffer[VAR_NAME_LEN+10];
if (name && !*name) name=NULL;
if (!v && !name) return; /* Shouldn't happen... */
buffer[0]='$'; buffer[1] = 0;
if (name) strcat(buffer, name); else strcat(buffer, v->name);
fprintf(ErrFp, "%*s ", VAR_NAME_LEN, buffer);
fprintf(ErrFp, "%*s ", VAR_NAME_LEN+1, buffer);
if (v) {
if (v->type == STR_TYPE) {
if (v->type == SPECIAL_TYPE) {
Value val;
SysVarFunc f = (SysVarFunc) v->value;
f(0, &val);
if (DoCoerce(STR_TYPE, &val) == OK) {
fprintf(ErrFp, "\"%s\"\n", val.v.str);
}
DestroyValue(val);
} else if (v->type == STR_TYPE) {
char *s = *((char **)v->value);
int y;
Putc('"', ErrFp);
for (y=0; y<MAX_PRT_LEN && *s; y++) Putc(*s++, ErrFp);
for (y=0; y<MAX_PRT_LEN && *s; y++) {
if (*s == '"') {
fprintf(ErrFp, "\" + char(34) + \"");
s++;
} else {
Putc(*s++, ErrFp);
}
}
Putc('"', ErrFp);
if (*s) fprintf(ErrFp, "...");
Putc('\n', ErrFp);
@@ -704,4 +671,3 @@ SysVar *v;
return;
}

View File

@@ -6,9 +6,8 @@
/* */
/* This file is part of REMIND. */
/* Copyright (C) 1992-1998 by David F. Skoll */
/* Copyright (C) 1999 by Roaring Penguin Software Inc. */
/* Copyright (C) 1999-2007 by Roaring Penguin Software Inc. */
/* */
/***************************************************************/
/* $Id: version.h,v 1.7 1999-04-05 17:35:00 dfs Exp $ */
#define VERSION "03.00.20"
#define VERSION "03.01.00"

View File

@@ -2,15 +2,13 @@
# ---------------------------------------------------------------------------
# TEST-REM
#
# $Id: test-rem,v 1.3 1999-04-05 17:35:13 dfs Exp $
#
# This file runs an acceptance test for Remind. To use it, type:
# sh test-rem OR make test
# in the build directory.
#
# This file is part of REMIND.
# Copyright (C) 1992-1997 by David F. Skoll
# Copyright (C) 1999 by Roaring Penguin Software Inc.
# Copyright (C) 1992-1997 David F. Skoll
# Copyright (C) 1999-2000 Roaring Penguin Software Inc.
# ---------------------------------------------------------------------------
TEST_GETENV="foo bar baz" ; export TEST_GETENV

View File

@@ -1,830 +0,0 @@
# Test file for REMIND
#
# Use this file to test the date calculation routines
# of the REMIND program by typing:
#
# ./test-rem # From WITHIN Remind source directory!
REM MSG Today is [hebday(today())] [hebmon(today())] [hebyear(today())]
test.rem(8): Trig = Saturday, 16 February, 1991
Reminders for Saturday, 16th February, 1991:
today() => 1991/02/16
hebday(1991/02/16) => 2
today() => 1991/02/16
hebmon(1991/02/16) => "Adar"
today() => 1991/02/16
hebyear(1991/02/16) => 5751
Today is 2 Adar 5751
fset _h(x, y) trigger(hebdate(x,y))
[_h(1, "Tishrey")] MSG Rosh Hashana 1
Entering UserFN _h(1, "Tishrey")
x => 1
y => "Tishrey"
hebdate(1, "Tishrey") => 1991/09/09
trigger(1991/09/09) => "9 September 1991"
Leaving UserFN _h() => "9 September 1991"
test.rem(11): Trig = Monday, 9 September, 1991
[_h(2, "Tishrey")] MSG Rosh Hashana 2
Entering UserFN _h(2, "Tishrey")
x => 2
y => "Tishrey"
hebdate(2, "Tishrey") => 1991/09/10
trigger(1991/09/10) => "10 September 1991"
Leaving UserFN _h() => "10 September 1991"
test.rem(12): Trig = Tuesday, 10 September, 1991
[_h(3, "Tishrey")] MSG Tzom Gedalia
Entering UserFN _h(3, "Tishrey")
x => 3
y => "Tishrey"
hebdate(3, "Tishrey") => 1991/09/11
trigger(1991/09/11) => "11 September 1991"
Leaving UserFN _h() => "11 September 1991"
test.rem(13): Trig = Wednesday, 11 September, 1991
[_h(10, "Tishrey")] MSG Yom Kippur
Entering UserFN _h(10, "Tishrey")
x => 10
y => "Tishrey"
hebdate(10, "Tishrey") => 1991/09/18
trigger(1991/09/18) => "18 September 1991"
Leaving UserFN _h() => "18 September 1991"
test.rem(14): Trig = Wednesday, 18 September, 1991
[_h(15, "Tishrey")] MSG Sukkot 1
Entering UserFN _h(15, "Tishrey")
x => 15
y => "Tishrey"
hebdate(15, "Tishrey") => 1991/09/23
trigger(1991/09/23) => "23 September 1991"
Leaving UserFN _h() => "23 September 1991"
test.rem(15): Trig = Monday, 23 September, 1991
[_h(25, "Kislev")] MSG Channuka
Entering UserFN _h(25, "Kislev")
x => 25
y => "Kislev"
hebdate(25, "Kislev") => 1991/12/02
trigger(1991/12/02) => "2 December 1991"
Leaving UserFN _h() => "2 December 1991"
test.rem(16): Trig = Monday, 2 December, 1991
[_h(10, "Tevet")] MSG Asara B'Tevet
Entering UserFN _h(10, "Tevet")
x => 10
y => "Tevet"
hebdate(10, "Tevet") => 1991/12/17
trigger(1991/12/17) => "17 December 1991"
Leaving UserFN _h() => "17 December 1991"
test.rem(17): Trig = Tuesday, 17 December, 1991
[_h(15, "Shvat")] MSG Tu B'Shvat
Entering UserFN _h(15, "Shvat")
x => 15
y => "Shvat"
hebdate(15, "Shvat") => 1992/01/20
trigger(1992/01/20) => "20 January 1992"
Leaving UserFN _h() => "20 January 1992"
test.rem(18): Trig = Monday, 20 January, 1992
[_h(15, "Adar A")] MSG Purim Katan
Entering UserFN _h(15, "Adar A")
x => 15
y => "Adar A"
hebdate(15, "Adar A") => 1992/02/19
trigger(1992/02/19) => "19 February 1992"
Leaving UserFN _h() => "19 February 1992"
test.rem(19): Trig = Wednesday, 19 February, 1992
[_h(14, "Adar")] MSG Purim
Entering UserFN _h(14, "Adar")
x => 14
y => "Adar"
hebdate(14, "Adar") => 1991/02/28
trigger(1991/02/28) => "28 February 1991"
Leaving UserFN _h() => "28 February 1991"
test.rem(20): Trig = Thursday, 28 February, 1991
[_h(15, "Nisan")] MSG Pesach
Entering UserFN _h(15, "Nisan")
x => 15
y => "Nisan"
hebdate(15, "Nisan") => 1991/03/30
trigger(1991/03/30) => "30 March 1991"
Leaving UserFN _h() => "30 March 1991"
test.rem(21): Trig = Saturday, 30 March, 1991
[_h(27, "Nisan")] MSG Yom HaShoah
Entering UserFN _h(27, "Nisan")
x => 27
y => "Nisan"
hebdate(27, "Nisan") => 1991/04/11
trigger(1991/04/11) => "11 April 1991"
Leaving UserFN _h() => "11 April 1991"
test.rem(22): Trig = Thursday, 11 April, 1991
[_h(4, "Iyar")] MSG Yom HaZikaron
Entering UserFN _h(4, "Iyar")
x => 4
y => "Iyar"
hebdate(4, "Iyar") => 1991/04/18
trigger(1991/04/18) => "18 April 1991"
Leaving UserFN _h() => "18 April 1991"
test.rem(23): Trig = Thursday, 18 April, 1991
[_h(5, "Iyar")] MSG Yom Ha'atzmaut
Entering UserFN _h(5, "Iyar")
x => 5
y => "Iyar"
hebdate(5, "Iyar") => 1991/04/19
trigger(1991/04/19) => "19 April 1991"
Leaving UserFN _h() => "19 April 1991"
test.rem(24): Trig = Friday, 19 April, 1991
[_h(28, "Iyar")] MSG Yom Yerushalayim
Entering UserFN _h(28, "Iyar")
x => 28
y => "Iyar"
hebdate(28, "Iyar") => 1991/05/12
trigger(1991/05/12) => "12 May 1991"
Leaving UserFN _h() => "12 May 1991"
test.rem(25): Trig = Sunday, 12 May, 1991
[_h(6, "Sivan")] MSG Shavuot
Entering UserFN _h(6, "Sivan")
x => 6
y => "Sivan"
hebdate(6, "Sivan") => 1991/05/19
trigger(1991/05/19) => "19 May 1991"
Leaving UserFN _h() => "19 May 1991"
test.rem(26): Trig = Sunday, 19 May, 1991
[_h(9, "Av")] MSG Tish'a B'Av
Entering UserFN _h(9, "Av")
x => 9
y => "Av"
hebdate(9, "Av") => 1991/07/20
trigger(1991/07/20) => "20 July 1991"
Leaving UserFN _h() => "20 July 1991"
test.rem(27): Trig = Saturday, 20 July, 1991
# Test some jahrzeit cases
fset _i(x,y,z,a) trigger(hebdate(x,y,z,a))
[_i(30, "Heshvan", today(), 5759)] MSG Complete-Complete
today() => 1991/02/16
Entering UserFN _i(30, "Heshvan", 1991/02/16, 5759)
x => 30
y => "Heshvan"
z => 1991/02/16
a => 5759
hebdate(30, "Heshvan", 1991/02/16, 5759) => 1991/11/07
trigger(1991/11/07) => "7 November 1991"
Leaving UserFN _i() => "7 November 1991"
test.rem(31): Trig = Thursday, 7 November, 1991
[_i(30, "Heshvan", today(), 5760)] MSG Complete-Defective
today() => 1991/02/16
Entering UserFN _i(30, "Heshvan", 1991/02/16, 5760)
x => 30
y => "Heshvan"
z => 1991/02/16
a => 5760
hebdate(30, "Heshvan", 1991/02/16, 5760) => 1991/11/07
trigger(1991/11/07) => "7 November 1991"
Leaving UserFN _i() => "7 November 1991"
test.rem(32): Trig = Thursday, 7 November, 1991
[_i(30, "Heshvan", today(), 5761)] MSG Illegal
today() => 1991/02/16
Entering UserFN _i(30, "Heshvan", 1991/02/16, 5761)
x => 30
y => "Heshvan"
z => 1991/02/16
a => 5761
hebdate(30, "Heshvan", 1991/02/16, 5761) => test.rem(33): 30 Heshvan 5761: Invalid Hebrew date
Invalid Hebrew date
Leaving UserFN _i() => Invalid Hebrew date
[_i(30, "Kislev", today(), 5759)] MSG Complete-Complete
today() => 1991/02/16
Entering UserFN _i(30, "Kislev", 1991/02/16, 5759)
x => 30
y => "Kislev"
z => 1991/02/16
a => 5759
hebdate(30, "Kislev", 1991/02/16, 5759) => 1991/12/07
trigger(1991/12/07) => "7 December 1991"
Leaving UserFN _i() => "7 December 1991"
test.rem(35): Trig = Saturday, 7 December, 1991
[_i(30, "Kislev", today(), 5760)] MSG Complete-Defective
today() => 1991/02/16
Entering UserFN _i(30, "Kislev", 1991/02/16, 5760)
x => 30
y => "Kislev"
z => 1991/02/16
a => 5760
hebdate(30, "Kislev", 1991/02/16, 5760) => 1991/12/07
trigger(1991/12/07) => "7 December 1991"
Leaving UserFN _i() => "7 December 1991"
test.rem(36): Trig = Saturday, 7 December, 1991
[_i(30, "Kislev", today(), 5761)] MSG Illegal
today() => 1991/02/16
Entering UserFN _i(30, "Kislev", 1991/02/16, 5761)
x => 30
y => "Kislev"
z => 1991/02/16
a => 5761
hebdate(30, "Kislev", 1991/02/16, 5761) => test.rem(37): 30 Kislev 5761: Invalid Hebrew date
Invalid Hebrew date
Leaving UserFN _i() => Invalid Hebrew date
[_i(30, "Adar A", today(), 5755)] MSG Leap
today() => 1991/02/16
Entering UserFN _i(30, "Adar A", 1991/02/16, 5755)
x => 30
y => "Adar A"
z => 1991/02/16
a => 5755
hebdate(30, "Adar A", 1991/02/16, 5755) => 1992/03/05
trigger(1992/03/05) => "5 March 1992"
Leaving UserFN _i() => "5 March 1992"
test.rem(39): Trig = Thursday, 5 March, 1992
[_i(30, "Adar A", today(), 5756)] MSG Illegal
today() => 1991/02/16
Entering UserFN _i(30, "Adar A", 1991/02/16, 5756)
x => 30
y => "Adar A"
z => 1991/02/16
a => 5756
hebdate(30, "Adar A", 1991/02/16, 5756) => test.rem(40): No Adar A in 5756
Invalid Hebrew date
Leaving UserFN _i() => Invalid Hebrew date
[_i(29, "Adar A", today(), 5755)] MSG Leap
today() => 1991/02/16
Entering UserFN _i(29, "Adar A", 1991/02/16, 5755)
x => 29
y => "Adar A"
z => 1991/02/16
a => 5755
hebdate(29, "Adar A", 1991/02/16, 5755) => 1991/03/15
trigger(1991/03/15) => "15 March 1991"
Leaving UserFN _i() => "15 March 1991"
test.rem(41): Trig = Friday, 15 March, 1991
[_i(29, "Adar A", today(), 5756)] MSG Illegal
today() => 1991/02/16
Entering UserFN _i(29, "Adar A", 1991/02/16, 5756)
x => 29
y => "Adar A"
z => 1991/02/16
a => 5756
hebdate(29, "Adar A", 1991/02/16, 5756) => test.rem(42): No Adar A in 5756
Invalid Hebrew date
Leaving UserFN _i() => Invalid Hebrew date
# Test each possible case of the basic reminders.
REM MSG Every Day
test.rem(46): Trig = Saturday, 16 February, 1991
Every Day
REM 18 MSG Every 18th
test.rem(48): Trig = Monday, 18 February, 1991
REM 15 MSG Every 15th
test.rem(49): Trig = Friday, 15 March, 1991
REM Feb MSG February
test.rem(51): Trig = Saturday, 16 February, 1991
February
REM Jan MSG January
test.rem(52): Trig = Wednesday, 1 January, 1992
REM March MSG March
test.rem(53): Trig = Friday, 1 March, 1991
REM 13 Jan MSG 13 Jan
test.rem(55): Trig = Monday, 13 January, 1992
REM 15 Feb MSG 15 Feb
test.rem(56): Trig = Saturday, 15 February, 1992
REM 28 Feb MSG 28 Feb
test.rem(57): Trig = Thursday, 28 February, 1991
REM 29 Feb MSG 29 Feb
test.rem(58): Trig = Saturday, 29 February, 1992
REM 5 Mar MSG 5 Mar
test.rem(59): Trig = Tuesday, 5 March, 1991
REM 1990 MSG 1990
test.rem(61): Expired
REM 1991 MSG 1991
test.rem(62): Trig = Saturday, 16 February, 1991
1991
REM 1992 MSG 1991
test.rem(63): Trig = Wednesday, 1 January, 1992
REM 1 1990 MSG 1 1990
test.rem(65): Expired
REM 29 1991 MSG 29 1991
test.rem(66): Trig = Friday, 29 March, 1991
REM 29 1992 MSG 29 1992
test.rem(67): Trig = Wednesday, 29 January, 1992
REM 16 1991 MSG 16 1991
test.rem(68): Trig = Saturday, 16 February, 1991
16 1991
REM Jan 1990 MSG Jan 1990
test.rem(70): Expired
REM Feb 1991 MSG Feb 1991
test.rem(71): Trig = Saturday, 16 February, 1991
Feb 1991
REM Dec 1991 MSG Dec 1991
test.rem(72): Trig = Sunday, 1 December, 1991
REM May 1992 MSG May 1992
test.rem(73): Trig = Friday, 1 May, 1992
REM 1 Jan 1991 MSG 1 Jan 1991
test.rem(75): Expired
REM 16 Feb 1991 MSG 16 Feb 1991
test.rem(76): Trig = Saturday, 16 February, 1991
16 Feb 1991
REM 29 Dec 1992 MSG 29 Dec 1992
test.rem(77): Trig = Tuesday, 29 December, 1992
REM Sun MSG Sun
test.rem(79): Trig = Sunday, 17 February, 1991
REM Fri Sat Tue MSG Fri Sat Tue
test.rem(80): Trig = Saturday, 16 February, 1991
Fri Sat Tue
REM Sun 16 MSG Sun 16
test.rem(82): Trig = Sunday, 17 February, 1991
REM Mon Tue Wed Thu Fri 1 MSG Mon Tue Wed Thu Fri 1
test.rem(83): Trig = Friday, 1 March, 1991
REM Sun Feb MSG Sun Feb
test.rem(85): Trig = Sunday, 17 February, 1991
REM Mon Tue March MSG Mon Tue March
test.rem(86): Trig = Monday, 4 March, 1991
REM Sun 16 Feb MSG Sun 16 Feb
test.rem(88): Trig = Sunday, 17 February, 1991
REM Mon Tue 10 March MSG Mon Tue 10 March
test.rem(89): Trig = Monday, 11 March, 1991
REM Sat Sun 1991 MSG Sat Sun 1991
test.rem(91): Trig = Saturday, 16 February, 1991
Sat Sun 1991
REM Mon Tue 1992 MSG Mon Tue 1992
test.rem(92): Trig = Monday, 6 January, 1992
REM Sun 16 1991 MSG Sun 16 1991
test.rem(94): Trig = Sunday, 17 February, 1991
REM Mon Tue Wed Thu Fri 1 1992 MSG Mon Tue Wed Thu Fri 1 1992
test.rem(95): Trig = Wednesday, 1 January, 1992
REM Mon Feb 1991 MSG Mon Feb 1991
test.rem(97): Trig = Monday, 18 February, 1991
REM Tue Jan 1992 MSG Tue Jan 1992
test.rem(98): Trig = Tuesday, 7 January, 1992
REM Sun Mon 16 Feb 1991 MSG Sun Mon 16 Feb 1991
test.rem(100): Trig = Sunday, 17 February, 1991
REM Tue 28 Jan 1992 MSG Tue 28 Jan 1992
test.rem(101): Trig = Tuesday, 28 January, 1992
# Try some Backs
CLEAR-OMIT-CONTEXT
REM 1 -1 OMIT sat sun MSG 1 -1 OMIT Sat Sun
test.rem(105): Trig = Thursday, 28 February, 1991
REM 1 --1 OMIT sat sun MSG 1 --1 OMIT Sat Sun
test.rem(106): Trig = Thursday, 28 February, 1991
OMIT 28 Feb
REM 1 -1 OMIT sat sun MSG 1 -1 OMIT Sat Sun (28 Feb omitted)
test.rem(109): Trig = Wednesday, 27 February, 1991
REM 1 --1 OMIT sat sun MSG 1 --1 OMIT Sat Sun (28 Feb omitted)
test.rem(110): Trig = Thursday, 28 February, 1991
CLEAR-OMIT-CONTEXT
# Try out UNTIL
REM Wed UNTIL 21 Feb 1991 MSG Wed UNTIL 21 Feb 1991
test.rem(115): Trig = Wednesday, 20 February, 1991
# Try playing with the OMIT context
OMIT 28 Feb 1991
REM 1 Mar -1 MSG 1 mar -1 (28feb91 omitted)
test.rem(120): Trig = Wednesday, 27 February, 1991
REM 1 Mar --1 MSG 1 mar --1 (28Feb91 omitted)
test.rem(121): Trig = Thursday, 28 February, 1991
REM 28 Feb BEFORE MSG 28 Feb BEFORE (28Feb91 omitted)
test.rem(122): Trig = Wednesday, 27 February, 1991
REM 28 Feb SKIP MSG 28 Feb SKIP (28Feb91 omitted)
test.rem(123): Trig = Friday, 28 February, 1992
REM 28 Feb AFTER MSG 28 Feb AFTER (28Feb91 omitted)
test.rem(124): Trig = Friday, 1 March, 1991
PUSH-OMIT-CONTEXT
CLEAR-OMIT-CONTEXT
REM 1 Mar -1 MSG 1 mar -1
test.rem(128): Trig = Thursday, 28 February, 1991
REM 1 Mar --1 MSG 1 mar --1
test.rem(129): Trig = Thursday, 28 February, 1991
REM 28 Feb BEFORE MSG 28 Feb BEFORE
test.rem(130): Trig = Thursday, 28 February, 1991
REM 28 Feb SKIP MSG 28 Feb SKIP
test.rem(131): Trig = Thursday, 28 February, 1991
REM 28 Feb AFTER MSG 28 Feb AFTER
test.rem(132): Trig = Thursday, 28 February, 1991
POP-OMIT-CONTEXT
REM 1 Mar -1 MSG 1 mar -1 (28feb91 omitted)
test.rem(135): Trig = Wednesday, 27 February, 1991
REM 1 Mar --1 MSG 1 mar --1 (28Feb91 omitted)
test.rem(136): Trig = Thursday, 28 February, 1991
REM 28 Feb BEFORE MSG 28 Feb BEFORE (28Feb91 omitted)
test.rem(137): Trig = Wednesday, 27 February, 1991
REM 28 Feb SKIP MSG 28 Feb SKIP (28Feb91 omitted)
test.rem(138): Trig = Friday, 28 February, 1992
REM 28 Feb AFTER MSG 28 Feb AFTER (28Feb91 omitted)
test.rem(139): Trig = Friday, 1 March, 1991
REM 13 March 1991 *1 UNTIL 19 March 1991 MSG 13-19 Mar 91
test.rem(142): Trig = Wednesday, 13 March, 1991
# Test BACK
CLEAR-OMIT-CONTEXT
REM 18 Feb 1991 +1 MSG 18 Feb 1991 +1
test.rem(146): Trig = Monday, 18 February, 1991
OMIT 17 Feb 1991
REM 18 Feb 1991 +1 MSG 18 Feb 1991 +1 (17Feb91 omitted)
test.rem(149): Trig = Monday, 18 February, 1991
18 Feb 1991 +1 (17Feb91 omitted)
REM 18 Feb 1991 ++1 MSG 18 Feb 1991 ++1 (17Feb91 omitted)
test.rem(150): Trig = Monday, 18 February, 1991
CLEAR-OMIT-CONTEXT
# Test the scanfrom clause
REM Fri SATISFY 1
test.rem(154): Trig = Friday, 22 February, 1991
OMIT [trigger(trigdate())]
trigdate() => 1991/02/22
trigger(1991/02/22) => "22 February 1991"
REM Fri after MSG 23 Feb 1991
test.rem(156): Trig = Saturday, 23 February, 1991
CLEAR-OMIT-CONTEXT
REM Fri SCANFROM [trigger(today()-7)] SATISFY 1
today() => 1991/02/16
1991/02/16 - 7 => 1991/02/09
trigger(1991/02/09) => "9 February 1991"
test.rem(158): Trig = Friday, 15 February, 1991
OMIT [trigger(trigdate())]
trigdate() => 1991/02/15
trigger(1991/02/15) => "15 February 1991"
REM Fri after MSG 16 Feb 1991
test.rem(160): Trig = Saturday, 16 February, 1991
16 Feb 1991
CLEAR-OMIT-CONTEXT
set a000 abs(1)
abs(1) => 1
set a001 abs(-1)
- 1 => -1
abs(-1) => 1
set a002 asc("foo")
asc("foo") => 102
set a003 baseyr()
baseyr() => 1990
set a004 char(66,55,66,77,66)
char(66, 55, 66, 77, 66) => "B7BMB"
set a005 choose(3, "foo", "bar", "baz", "blech")
choose(3, "foo", "bar", "baz", "blech") => "baz"
set a006 coerce("string", 1)
coerce("string", 1) => "1"
set a007 coerce("string", today())
today() => 1991/02/16
coerce("string", 1991/02/16) => "1991/02/16"
set a008 coerce("string", 11:44)
coerce("string", 11:44) => "11:44"
set a009 coerce("int", "badnews")
coerce("int", "badnews") => Can't coerce
test.rem(171): Can't coerce
set a010 coerce("int", "12")
coerce("int", "12") => 12
set a011 coerce("int", 11:44)
coerce("int", 11:44) => 704
set a012 coerce("int", today())
today() => 1991/02/16
coerce("int", 1991/02/16) => 411
set a013 date(1992, 2, 2)
date(1992, 2, 2) => 1992/02/02
set a014 date(1993, 2, 29)
date(1993, 2, 29) => Bad date specification
test.rem(176): Bad date specification
set a015 day(today())
today() => 1991/02/16
day(1991/02/16) => 16
set a016 daysinmon(2, 1991)
daysinmon(2, 1991) => 28
set a017 daysinmon(2, 1992)
daysinmon(2, 1992) => 29
set a018 defined("a017")
defined("a017") => 1
set a019 defined("a019")
defined("a019") => 0
set a020 filename()
filename() => "test.rem"
set a021 getenv("TEST_GETENV")
getenv("TEST_GETENV") => "foo bar baz"
set a022 hour(11:22)
hour(11:22) => 11
set a023 iif(1, 1, 0)
iif(1, 1, 0) => 1
set a024 iif(0, 1, 0)
iif(0, 1, 0) => 0
set a025 index("barfoobar", "foo")
index("barfoobar", "foo") => 4
set a026 index("barfoobar", "bar", 2)
index("barfoobar", "bar", 2) => 7
set a027 isleap(today())
today() => 1991/02/16
isleap(1991/02/16) => 0
set a028 isleap(1992)
isleap(1992) => 1
omit [trigger(today())]
today() => 1991/02/16
trigger(1991/02/16) => "16 February 1991"
set a030 isomitted(today())
today() => 1991/02/16
isomitted(1991/02/16) => 1
clear
set a029 isomitted(today())
today() => 1991/02/16
isomitted(1991/02/16) => 0
set a031 lower("FOOBARBAZ")
lower("FOOBARBAZ") => "foobarbaz"
set a032 max(1, 2, 34, 1, 3)
max(1, 2, 34, 1, 3) => 34
set a033 max("foo", "bar", "baz")
max("foo", "bar", "baz") => "foo"
set a034 max(today(), today()+1, today()-1)
today() => 1991/02/16
today() => 1991/02/16
1991/02/16 + 1 => 1991/02/17
today() => 1991/02/16
1991/02/16 - 1 => 1991/02/15
max(1991/02/16, 1991/02/17, 1991/02/15) => 1991/02/17
set a035 min(1, 2, 34, 1, 3)
min(1, 2, 34, 1, 3) => 1
set a036 min("foo", "bar", "baz")
min("foo", "bar", "baz") => "bar"
set a037 min(today(), today()+1, today()-1)
today() => 1991/02/16
today() => 1991/02/16
1991/02/16 + 1 => 1991/02/17
today() => 1991/02/16
1991/02/16 - 1 => 1991/02/15
min(1991/02/16, 1991/02/17, 1991/02/15) => 1991/02/15
set a038 minute(11:33)
minute(11:33) => 33
set a039 mon(today())
today() => 1991/02/16
mon(1991/02/16) => "February"
set a040 monnum(today())
today() => 1991/02/16
monnum(1991/02/16) => 2
set a041 ord(3)
ord(3) => "3rd"
set a042 ord(4)
ord(4) => "4th"
set a043 ostype()
ostype() => "AmigaDOS"
set a044 plural(2)
plural(2) => "s"
set a045 plural(2, "ies")
plural(2, "ies") => "iess"
set a046 plural(2, "y", "ies")
plural(2, "y", "ies") => "ies"
set a047 sgn(-2)
- 2 => -2
sgn(-2) => -1
set a048 shell("echo foo")
shell("echo foo") => "foo"
set a049 strlen("sadjflkhsldkfhsdlfjhk")
strlen("sadjflkhsldkfhsdlfjhk") => 21
set a050 substr(a049, 2)
a049 => 21
substr(21, 2) => Type mismatch
test.rem(214): Type mismatch
set a051 substr(a050, 2, 6)
a050 => test.rem(215): Undefined variable: a050
set a052 time(1+2, 3+4)
1 + 2 => 3
3 + 4 => 7
time(3, 7) => 03:07
rem 10 jan 1992 AT 11:22 CAL
test.rem(217): Trig = Friday, 10 January, 1992
set a053 trigdate()
trigdate() => 1992/01/10
set a054 trigtime()
trigtime() => 11:22
set a055 trigvalid()
trigvalid() => 1
set a056 upper("sdfjhsdf ksjdfh kjsdfh ksjdfh")
upper("sdfjhsdf ksjdfh kjsdfh ksjdfh") => "SDFJHSDF KSJDFH KJSDFH KSJDFH"
set a057 value("a05"+"6")
"a05" + "6" => "a056"
value("a056") => "SDFJHSDF KSJDFH KJSDFH KSJDFH"
set a058 version()
version() => "03.00.19"
set a059 wkday(today())
today() => 1991/02/16
wkday(1991/02/16) => "Saturday"
set a060 wkdaynum(today())
today() => 1991/02/16
wkdaynum(1991/02/16) => 6
set a061 year(today())
today() => 1991/02/16
year(1991/02/16) => 1991
set a062 1+2*(3+4-(5*7/2))
3 + 4 => 7
5 * 7 => 35
35 / 2 => 17
7 - 17 => -10
2 * -10 => -20
1 + -20 => -19
set a063 1>=2
1 >= 2 => 0
set a064 1<2 || 3 > 4
1 < 2 => 1
3 > 4 => 0
1 || 0 => 1
set a065 1 && 1
1 && 1 => 1
set a066 !a065
a065 => 1
! 1 => 0
set a067 typeof(2)
typeof(2) => "INT"
set a068 typeof("foo")
typeof("foo") => "STRING"
set a069 typeof(11:33)
typeof(11:33) => "TIME"
set a070 typeof(today())
today() => 1991/02/16
typeof(1991/02/16) => "DATE"
fset g(x,y) max(x,y)
fset h(x,y) min(g(x+y, x*y), g(x-y, x/y))
set a071 g(1, 2)
Entering UserFN g(1, 2)
x => 1
y => 2
max(1, 2) => 2
Leaving UserFN g() => 2
set a072 h(2, 3)
Entering UserFN h(2, 3)
x => 2
y => 3
2 + 3 => 5
x => 2
y => 3
2 * 3 => 6
Entering UserFN g(5, 6)
x => 5
y => 6
max(5, 6) => 6
Leaving UserFN g() => 6
x => 2
y => 3
2 - 3 => -1
x => 2
y => 3
2 / 3 => 0
Entering UserFN g(-1, 0)
x => -1
y => 0
max(-1, 0) => 0
Leaving UserFN g() => 0
min(6, 0) => 0
Leaving UserFN h() => 0
set a073 h("foo", 11:33)
Entering UserFN h("foo", 11:33)
x => "foo"
y => 11:33
"foo" + 11:33 => "foo11:33"
x => "foo"
y => 11:33
"foo" * 11:33 => Type mismatch
test.rem(240): '*': 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"...
msg [a074]%
test.rem(242): Trig = Saturday, 16 February, 1991
a074 => "on Tuesday, 5 May, 1992 in 444 days' tim"...
on Tuesday, 5 May, 1992 in 444 days' time on Tuesday 5 on 05/05/1992 on 05/05/1992 on Tuesday, 5 May on 05/05
set a075 dosubst("%i %j %k %l %m %n %o %p", '1992/5/5')
dosubst("%i %j %k %l %m %n %o %p", 1992/05/05) => "on 05/05 on Tuesday, May 5th, 1992 on Tu"...
msg [a075]%
test.rem(244): Trig = Saturday, 16 February, 1991
a075 => "on 05/05 on Tuesday, May 5th, 1992 on Tu"...
on 05/05 on Tuesday, May 5th, 1992 on Tuesday, May 5th on 1992/05/05 May 5 s
set a076 dosubst("%q %r %s %t %u %v %w %x", '1992/5/5')
dosubst("%q %r %s %t %u %v %w %x", 1992/05/05) => "s' 05 th 05 on Tuesday, 5th May, 1992 on"...
msg [a076]%
test.rem(246): Trig = Saturday, 16 February, 1991
a076 => "s' 05 th 05 on Tuesday, 5th May, 1992 on"...
s' 05 th 05 on Tuesday, 5th May, 1992 on Tuesday, 5th May Tuesday 444
set a077 dosubst("%y %z", '1992/5/5')
dosubst("%y %z", 1992/05/05) => "1992 92
"
msg [a077]%
test.rem(248): Trig = Saturday, 16 February, 1991
a077 => "1992 92
"
1992 92
set a078 easterdate(today())
today() => 1991/02/16
easterdate(1991/02/16) => 1991/03/31
set a079 easterdate(1992)
easterdate(1992) => 1992/04/19
set a080 easterdate(1995)
easterdate(1995) => 1995/04/16
set a081 ""
dump
Variable Value
a017 29
a036 "bar"
a055 1
a074 "on Tuesday, 5 May, 1992 in 444 days' tim"...
a008 "11:44"
a027 0
a046 "ies"
a065 1
a018 1
a037 1991/02/15
a056 "SDFJHSDF KSJDFH KJSDFH KSJDFH"
a075 "on 05/05 on Tuesday, May 5th, 1992 on Tu"...
a028 1
a047 -1
a066 0
a019 0
a038 33
a057 "SDFJHSDF KSJDFH KJSDFH KSJDFH"
a076 "s' 05 th 05 on Tuesday, 5th May, 1992 on"...
a029 0
a048 "foo"
a067 "INT"
a039 "February"
a058 "03.00.19"
a077 "1992 92
"
a049 21
a068 "STRING"
a059 "Saturday"
a078 1991/03/31
a069 "TIME"
a079 1992/04/19
a000 1
a010 12
a001 1
a020 "test.rem"
a011 704
a030 1
a002 102
a021 "foo bar baz"
a040 2
a012 411
a031 "foobarbaz"
a003 1990
a022 11
a041 "3rd"
a060 6
a013 1992/02/02
a032 34
a070 "DATE"
a004 "B7BMB"
a023 1
a042 "4th"
a061 1991
a080 1995/04/16
a033 "foo"
a052 03:07
a071 2
a005 "baz"
a024 0
a043 "AmigaDOS"
a062 -19
a081 ""
a015 16
a034 1991/02/17
a053 1992/01/10
a072 0
a006 "1"
a025 4
a044 "s"
a063 0
a016 28
a035 1
a054 11:22
a007 "1991/02/16"
a026 7
a045 "iess"
a064 1

View File

@@ -1,33 +0,0 @@
@echo off
rem ---------------------------------------------------------------------------
rem TEST-REM
rem
rem $Id: test-rem.bat,v 1.2 1999-04-05 17:35:14 dfs Exp $
rem
rem This file runs an MSDOS acceptance test for Remind. To use it, type:
rem test-rem
rem in the build directory.
rem
rem This file is part of REMIND.
rem Copyright (C) 1992-1997 by David F. Skoll
rem Copyright (C) 1999 by Roaring Penguin Software Inc.
rem ---------------------------------------------------------------------------
del test.out > nul
set TEST_GETENV=foo bar baz
if exist ..\msdos-ex\remind.exe goto bcc
remind -e -dxte ./test.rem 16 feb 1991 > test.out
goto cmp
:bcc
..\msdos-ex\remind -e -dxte .\test.rem 16 feb 1991 > test.out
:cmp
echo n | comp test.out test1.cmp
if errorlevel 1 goto oops
echo "Remind: Acceptance test PASSED"
goto quit
:oops
echo "Remind: Acceptance test FAILED"
echo ""
echo "Examine the file test.out to see where it differs from the"
echo "reference file test1.cmp."
:quit

View File

@@ -1,35 +0,0 @@
@echo off
rem ---------------------------------------------------------------------------
rem TEST-REM
rem
rem $Id: test-rem.cmd,v 1.2 1999-04-05 17:35:14 dfs Exp $
rem
rem This file runs an OS/2 acceptance test for Remind. To use it, type:
rem test-rem
rem in the build directory.
rem
rem This file is part of REMIND.
rem Copyright (C) 1992-1997 by David F. Skoll
rem Copyright (C) 1999 by Roaring Penguin Software Inc.
rem ---------------------------------------------------------------------------
del /f test.out > nul
setlocal
set TEST_GETENV=foo bar baz
if exist ..\os2-ex\remind.exe goto bcc
remind -e -dxte ./test.rem 16 feb 1991 > .\test.out
goto cmp
:bcc
..\os2-ex\remind -e -dxte .\test.rem 16 feb 1991 > .\test.out
:cmp
echo n | comp test.out test2.cmp
if errorlevel 1 goto oops
echo "Remind: Acceptance test PASSED"
goto quit
:oops
echo "Remind: Acceptance test FAILED"
echo ""
echo "Examine the file test.out to see where it differs from the"
echo "reference file test2.cmp."
:quit
endlocal

View File

@@ -1,23 +0,0 @@
/* ---------------------------------------------------------------------------
$Id: test-rem.rexx,v 1.1 1998-01-15 02:50:50 dfs Exp $
TEST-REM
This file runs an AmigaDOS acceptance test for Remind. To use it, type:
rx test-rem
in the build directory.
(Use this with the ENGLISH version only !!!)
---------------------------------------------------------------------------
*/
address 'COMMAND'
options results
'setenv TEST_GETENV "foo bar baz"'
'remind -e -dxte test.rem 16 feb 1991 >ram:test.out'
'diff ram:test.out test-rem.ami >NIL:'
if rc=0 then do
say "Remind: Acceptance test PASSED"
end
else do
say "Remind: Acceptance test FAILED"
end
'delete ram:test.out quiet'

View File

@@ -9,12 +9,12 @@ REM MSG Today is [hebday(today())] [hebmon(today())] [hebyear(today())]
../tests/test.rem(8): Trig = Saturday, 16 February, 1991
Reminders for Saturday, 16th February, 1991:
today() => 1991/02/16
hebday(1991/02/16) => 2
today() => 1991/02/16
hebmon(1991/02/16) => "Adar"
today() => 1991/02/16
hebyear(1991/02/16) => 5751
today() => 1991-02-16
hebday(1991-02-16) => 2
today() => 1991-02-16
hebmon(1991-02-16) => "Adar"
today() => 1991-02-16
hebyear(1991-02-16) => 5751
Today is 2 Adar 5751
fset _h(x, y) trigger(hebdate(x,y))
@@ -23,247 +23,247 @@ fset _h(x, y) trigger(hebdate(x,y))
Entering UserFN _h(1, "Tishrey")
x => 1
y => "Tishrey"
hebdate(1, "Tishrey") => 1991/09/09
trigger(1991/09/09) => "9 September 1991"
hebdate(1, "Tishrey") => 1991-09-09
trigger(1991-09-09) => "9 September 1991"
Leaving UserFN _h() => "9 September 1991"
../tests/test.rem(11): Trig = Monday, 9 September, 1991
[_h(2, "Tishrey")] MSG Rosh Hashana 2
Entering UserFN _h(2, "Tishrey")
x => 2
y => "Tishrey"
hebdate(2, "Tishrey") => 1991/09/10
trigger(1991/09/10) => "10 September 1991"
hebdate(2, "Tishrey") => 1991-09-10
trigger(1991-09-10) => "10 September 1991"
Leaving UserFN _h() => "10 September 1991"
../tests/test.rem(12): Trig = Tuesday, 10 September, 1991
[_h(3, "Tishrey")] MSG Tzom Gedalia
Entering UserFN _h(3, "Tishrey")
x => 3
y => "Tishrey"
hebdate(3, "Tishrey") => 1991/09/11
trigger(1991/09/11) => "11 September 1991"
hebdate(3, "Tishrey") => 1991-09-11
trigger(1991-09-11) => "11 September 1991"
Leaving UserFN _h() => "11 September 1991"
../tests/test.rem(13): Trig = Wednesday, 11 September, 1991
[_h(10, "Tishrey")] MSG Yom Kippur
Entering UserFN _h(10, "Tishrey")
x => 10
y => "Tishrey"
hebdate(10, "Tishrey") => 1991/09/18
trigger(1991/09/18) => "18 September 1991"
hebdate(10, "Tishrey") => 1991-09-18
trigger(1991-09-18) => "18 September 1991"
Leaving UserFN _h() => "18 September 1991"
../tests/test.rem(14): Trig = Wednesday, 18 September, 1991
[_h(15, "Tishrey")] MSG Sukkot 1
Entering UserFN _h(15, "Tishrey")
x => 15
y => "Tishrey"
hebdate(15, "Tishrey") => 1991/09/23
trigger(1991/09/23) => "23 September 1991"
hebdate(15, "Tishrey") => 1991-09-23
trigger(1991-09-23) => "23 September 1991"
Leaving UserFN _h() => "23 September 1991"
../tests/test.rem(15): Trig = Monday, 23 September, 1991
[_h(25, "Kislev")] MSG Channuka
Entering UserFN _h(25, "Kislev")
x => 25
y => "Kislev"
hebdate(25, "Kislev") => 1991/12/02
trigger(1991/12/02) => "2 December 1991"
hebdate(25, "Kislev") => 1991-12-02
trigger(1991-12-02) => "2 December 1991"
Leaving UserFN _h() => "2 December 1991"
../tests/test.rem(16): Trig = Monday, 2 December, 1991
[_h(10, "Tevet")] MSG Asara B'Tevet
Entering UserFN _h(10, "Tevet")
x => 10
y => "Tevet"
hebdate(10, "Tevet") => 1991/12/17
trigger(1991/12/17) => "17 December 1991"
hebdate(10, "Tevet") => 1991-12-17
trigger(1991-12-17) => "17 December 1991"
Leaving UserFN _h() => "17 December 1991"
../tests/test.rem(17): Trig = Tuesday, 17 December, 1991
[_h(15, "Shvat")] MSG Tu B'Shvat
Entering UserFN _h(15, "Shvat")
x => 15
y => "Shvat"
hebdate(15, "Shvat") => 1992/01/20
trigger(1992/01/20) => "20 January 1992"
hebdate(15, "Shvat") => 1992-01-20
trigger(1992-01-20) => "20 January 1992"
Leaving UserFN _h() => "20 January 1992"
../tests/test.rem(18): Trig = Monday, 20 January, 1992
[_h(15, "Adar A")] MSG Purim Katan
Entering UserFN _h(15, "Adar A")
x => 15
y => "Adar A"
hebdate(15, "Adar A") => 1992/02/19
trigger(1992/02/19) => "19 February 1992"
hebdate(15, "Adar A") => 1992-02-19
trigger(1992-02-19) => "19 February 1992"
Leaving UserFN _h() => "19 February 1992"
../tests/test.rem(19): Trig = Wednesday, 19 February, 1992
[_h(14, "Adar")] MSG Purim
Entering UserFN _h(14, "Adar")
x => 14
y => "Adar"
hebdate(14, "Adar") => 1991/02/28
trigger(1991/02/28) => "28 February 1991"
hebdate(14, "Adar") => 1991-02-28
trigger(1991-02-28) => "28 February 1991"
Leaving UserFN _h() => "28 February 1991"
../tests/test.rem(20): Trig = Thursday, 28 February, 1991
[_h(15, "Nisan")] MSG Pesach
Entering UserFN _h(15, "Nisan")
x => 15
y => "Nisan"
hebdate(15, "Nisan") => 1991/03/30
trigger(1991/03/30) => "30 March 1991"
hebdate(15, "Nisan") => 1991-03-30
trigger(1991-03-30) => "30 March 1991"
Leaving UserFN _h() => "30 March 1991"
../tests/test.rem(21): Trig = Saturday, 30 March, 1991
[_h(27, "Nisan")] MSG Yom HaShoah
Entering UserFN _h(27, "Nisan")
x => 27
y => "Nisan"
hebdate(27, "Nisan") => 1991/04/11
trigger(1991/04/11) => "11 April 1991"
hebdate(27, "Nisan") => 1991-04-11
trigger(1991-04-11) => "11 April 1991"
Leaving UserFN _h() => "11 April 1991"
../tests/test.rem(22): Trig = Thursday, 11 April, 1991
[_h(4, "Iyar")] MSG Yom HaZikaron
Entering UserFN _h(4, "Iyar")
x => 4
y => "Iyar"
hebdate(4, "Iyar") => 1991/04/18
trigger(1991/04/18) => "18 April 1991"
hebdate(4, "Iyar") => 1991-04-18
trigger(1991-04-18) => "18 April 1991"
Leaving UserFN _h() => "18 April 1991"
../tests/test.rem(23): Trig = Thursday, 18 April, 1991
[_h(5, "Iyar")] MSG Yom Ha'atzmaut
Entering UserFN _h(5, "Iyar")
x => 5
y => "Iyar"
hebdate(5, "Iyar") => 1991/04/19
trigger(1991/04/19) => "19 April 1991"
hebdate(5, "Iyar") => 1991-04-19
trigger(1991-04-19) => "19 April 1991"
Leaving UserFN _h() => "19 April 1991"
../tests/test.rem(24): Trig = Friday, 19 April, 1991
[_h(28, "Iyar")] MSG Yom Yerushalayim
Entering UserFN _h(28, "Iyar")
x => 28
y => "Iyar"
hebdate(28, "Iyar") => 1991/05/12
trigger(1991/05/12) => "12 May 1991"
hebdate(28, "Iyar") => 1991-05-12
trigger(1991-05-12) => "12 May 1991"
Leaving UserFN _h() => "12 May 1991"
../tests/test.rem(25): Trig = Sunday, 12 May, 1991
[_h(6, "Sivan")] MSG Shavuot
Entering UserFN _h(6, "Sivan")
x => 6
y => "Sivan"
hebdate(6, "Sivan") => 1991/05/19
trigger(1991/05/19) => "19 May 1991"
hebdate(6, "Sivan") => 1991-05-19
trigger(1991-05-19) => "19 May 1991"
Leaving UserFN _h() => "19 May 1991"
../tests/test.rem(26): Trig = Sunday, 19 May, 1991
[_h(9, "Av")] MSG Tish'a B'Av
Entering UserFN _h(9, "Av")
x => 9
y => "Av"
hebdate(9, "Av") => 1991/07/20
trigger(1991/07/20) => "20 July 1991"
hebdate(9, "Av") => 1991-07-20
trigger(1991-07-20) => "20 July 1991"
Leaving UserFN _h() => "20 July 1991"
../tests/test.rem(27): Trig = Saturday, 20 July, 1991
# Test some jahrzeit cases
fset _i(x,y,z,a) trigger(hebdate(x,y,z,a))
[_i(30, "Heshvan", today(), 5759)] MSG Complete-Complete
today() => 1991/02/16
Entering UserFN _i(30, "Heshvan", 1991/02/16, 5759)
today() => 1991-02-16
Entering UserFN _i(30, "Heshvan", 1991-02-16, 5759)
x => 30
y => "Heshvan"
z => 1991/02/16
z => 1991-02-16
a => 5759
hebdate(30, "Heshvan", 1991/02/16, 5759) => 1991/11/07
trigger(1991/11/07) => "7 November 1991"
hebdate(30, "Heshvan", 1991-02-16, 5759) => 1991-11-07
trigger(1991-11-07) => "7 November 1991"
Leaving UserFN _i() => "7 November 1991"
../tests/test.rem(31): Trig = Thursday, 7 November, 1991
[_i(30, "Heshvan", today(), 5760)] MSG Complete-Defective
today() => 1991/02/16
Entering UserFN _i(30, "Heshvan", 1991/02/16, 5760)
today() => 1991-02-16
Entering UserFN _i(30, "Heshvan", 1991-02-16, 5760)
x => 30
y => "Heshvan"
z => 1991/02/16
z => 1991-02-16
a => 5760
hebdate(30, "Heshvan", 1991/02/16, 5760) => 1991/11/07
trigger(1991/11/07) => "7 November 1991"
hebdate(30, "Heshvan", 1991-02-16, 5760) => 1991-11-07
trigger(1991-11-07) => "7 November 1991"
Leaving UserFN _i() => "7 November 1991"
../tests/test.rem(32): Trig = Thursday, 7 November, 1991
[_i(30, "Heshvan", today(), 5761)] MSG Illegal
today() => 1991/02/16
Entering UserFN _i(30, "Heshvan", 1991/02/16, 5761)
today() => 1991-02-16
Entering UserFN _i(30, "Heshvan", 1991-02-16, 5761)
x => 30
y => "Heshvan"
z => 1991/02/16
z => 1991-02-16
a => 5761
hebdate(30, "Heshvan", 1991/02/16, 5761) => ../tests/test.rem(33): 30 Heshvan 5761: Invalid Hebrew date
hebdate(30, "Heshvan", 1991-02-16, 5761) => ../tests/test.rem(33): 30 Heshvan 5761: Invalid Hebrew date
Invalid Hebrew date
Leaving UserFN _i() => Invalid Hebrew date
[_i(30, "Kislev", today(), 5759)] MSG Complete-Complete
today() => 1991/02/16
Entering UserFN _i(30, "Kislev", 1991/02/16, 5759)
today() => 1991-02-16
Entering UserFN _i(30, "Kislev", 1991-02-16, 5759)
x => 30
y => "Kislev"
z => 1991/02/16
z => 1991-02-16
a => 5759
hebdate(30, "Kislev", 1991/02/16, 5759) => 1991/12/07
trigger(1991/12/07) => "7 December 1991"
hebdate(30, "Kislev", 1991-02-16, 5759) => 1991-12-07
trigger(1991-12-07) => "7 December 1991"
Leaving UserFN _i() => "7 December 1991"
../tests/test.rem(35): Trig = Saturday, 7 December, 1991
[_i(30, "Kislev", today(), 5760)] MSG Complete-Defective
today() => 1991/02/16
Entering UserFN _i(30, "Kislev", 1991/02/16, 5760)
today() => 1991-02-16
Entering UserFN _i(30, "Kislev", 1991-02-16, 5760)
x => 30
y => "Kislev"
z => 1991/02/16
z => 1991-02-16
a => 5760
hebdate(30, "Kislev", 1991/02/16, 5760) => 1991/12/07
trigger(1991/12/07) => "7 December 1991"
hebdate(30, "Kislev", 1991-02-16, 5760) => 1991-12-07
trigger(1991-12-07) => "7 December 1991"
Leaving UserFN _i() => "7 December 1991"
../tests/test.rem(36): Trig = Saturday, 7 December, 1991
[_i(30, "Kislev", today(), 5761)] MSG Illegal
today() => 1991/02/16
Entering UserFN _i(30, "Kislev", 1991/02/16, 5761)
today() => 1991-02-16
Entering UserFN _i(30, "Kislev", 1991-02-16, 5761)
x => 30
y => "Kislev"
z => 1991/02/16
z => 1991-02-16
a => 5761
hebdate(30, "Kislev", 1991/02/16, 5761) => ../tests/test.rem(37): 30 Kislev 5761: Invalid Hebrew date
hebdate(30, "Kislev", 1991-02-16, 5761) => ../tests/test.rem(37): 30 Kislev 5761: Invalid Hebrew date
Invalid Hebrew date
Leaving UserFN _i() => Invalid Hebrew date
[_i(30, "Adar A", today(), 5755)] MSG Leap
today() => 1991/02/16
Entering UserFN _i(30, "Adar A", 1991/02/16, 5755)
today() => 1991-02-16
Entering UserFN _i(30, "Adar A", 1991-02-16, 5755)
x => 30
y => "Adar A"
z => 1991/02/16
z => 1991-02-16
a => 5755
hebdate(30, "Adar A", 1991/02/16, 5755) => 1992/03/05
trigger(1992/03/05) => "5 March 1992"
hebdate(30, "Adar A", 1991-02-16, 5755) => 1992-03-05
trigger(1992-03-05) => "5 March 1992"
Leaving UserFN _i() => "5 March 1992"
../tests/test.rem(39): Trig = Thursday, 5 March, 1992
[_i(30, "Adar A", today(), 5756)] MSG Illegal
today() => 1991/02/16
Entering UserFN _i(30, "Adar A", 1991/02/16, 5756)
today() => 1991-02-16
Entering UserFN _i(30, "Adar A", 1991-02-16, 5756)
x => 30
y => "Adar A"
z => 1991/02/16
z => 1991-02-16
a => 5756
hebdate(30, "Adar A", 1991/02/16, 5756) => ../tests/test.rem(40): No Adar A in 5756
hebdate(30, "Adar A", 1991-02-16, 5756) => ../tests/test.rem(40): No Adar A in 5756
Invalid Hebrew date
Leaving UserFN _i() => Invalid Hebrew date
[_i(29, "Adar A", today(), 5755)] MSG Leap
today() => 1991/02/16
Entering UserFN _i(29, "Adar A", 1991/02/16, 5755)
today() => 1991-02-16
Entering UserFN _i(29, "Adar A", 1991-02-16, 5755)
x => 29
y => "Adar A"
z => 1991/02/16
z => 1991-02-16
a => 5755
hebdate(29, "Adar A", 1991/02/16, 5755) => 1991/03/15
trigger(1991/03/15) => "15 March 1991"
hebdate(29, "Adar A", 1991-02-16, 5755) => 1991-03-15
trigger(1991-03-15) => "15 March 1991"
Leaving UserFN _i() => "15 March 1991"
../tests/test.rem(41): Trig = Friday, 15 March, 1991
[_i(29, "Adar A", today(), 5756)] MSG Illegal
today() => 1991/02/16
Entering UserFN _i(29, "Adar A", 1991/02/16, 5756)
today() => 1991-02-16
Entering UserFN _i(29, "Adar A", 1991-02-16, 5756)
x => 29
y => "Adar A"
z => 1991/02/16
z => 1991-02-16
a => 5756
hebdate(29, "Adar A", 1991/02/16, 5756) => ../tests/test.rem(42): No Adar A in 5756
hebdate(29, "Adar A", 1991-02-16, 5756) => ../tests/test.rem(42): No Adar A in 5756
Invalid Hebrew date
Leaving UserFN _i() => Invalid Hebrew date
@@ -463,19 +463,19 @@ CLEAR-OMIT-CONTEXT
REM Fri SATISFY 1
../tests/test.rem(154): Trig = Friday, 22 February, 1991
OMIT [trigger(trigdate())]
trigdate() => 1991/02/22
trigger(1991/02/22) => "22 February 1991"
trigdate() => 1991-02-22
trigger(1991-02-22) => "22 February 1991"
REM Fri after MSG 23 Feb 1991
../tests/test.rem(156): Trig = Saturday, 23 February, 1991
CLEAR-OMIT-CONTEXT
REM Fri SCANFROM [trigger(today()-7)] SATISFY 1
today() => 1991/02/16
1991/02/16 - 7 => 1991/02/09
trigger(1991/02/09) => "9 February 1991"
today() => 1991-02-16
1991-02-16 - 7 => 1991-02-09
trigger(1991-02-09) => "9 February 1991"
../tests/test.rem(158): Trig = Friday, 15 February, 1991
OMIT [trigger(trigdate())]
trigdate() => 1991/02/15
trigger(1991/02/15) => "15 February 1991"
trigdate() => 1991-02-15
trigger(1991-02-15) => "15 February 1991"
REM Fri after MSG 16 Feb 1991
../tests/test.rem(160): Trig = Saturday, 16 February, 1991
16 Feb 1991
@@ -497,8 +497,8 @@ choose(3, "foo", "bar", "baz", "blech") => "baz"
set a006 coerce("string", 1)
coerce("string", 1) => "1"
set a007 coerce("string", today())
today() => 1991/02/16
coerce("string", 1991/02/16) => "1991/02/16"
today() => 1991-02-16
coerce("string", 1991-02-16) => "1991-02-16"
set a008 coerce("string", 11:44)
coerce("string", 11:44) => "11:44"
set a009 coerce("int", "badnews")
@@ -509,16 +509,16 @@ coerce("int", "12") => 12
set a011 coerce("int", 11:44)
coerce("int", 11:44) => 704
set a012 coerce("int", today())
today() => 1991/02/16
coerce("int", 1991/02/16) => 411
today() => 1991-02-16
coerce("int", 1991-02-16) => 411
set a013 date(1992, 2, 2)
date(1992, 2, 2) => 1992/02/02
date(1992, 2, 2) => 1992-02-02
set a014 date(1993, 2, 29)
date(1993, 2, 29) => Bad date specification
../tests/test.rem(176): Bad date specification
set a015 day(today())
today() => 1991/02/16
day(1991/02/16) => 16
today() => 1991-02-16
day(1991-02-16) => 16
set a016 daysinmon(2, 1991)
daysinmon(2, 1991) => 28
set a017 daysinmon(2, 1992)
@@ -542,20 +542,20 @@ index("barfoobar", "foo") => 4
set a026 index("barfoobar", "bar", 2)
index("barfoobar", "bar", 2) => 7
set a027 isleap(today())
today() => 1991/02/16
isleap(1991/02/16) => 0
today() => 1991-02-16
isleap(1991-02-16) => 0
set a028 isleap(1992)
isleap(1992) => 1
omit [trigger(today())]
today() => 1991/02/16
trigger(1991/02/16) => "16 February 1991"
today() => 1991-02-16
trigger(1991-02-16) => "16 February 1991"
set a030 isomitted(today())
today() => 1991/02/16
isomitted(1991/02/16) => 1
today() => 1991-02-16
isomitted(1991-02-16) => 1
clear
set a029 isomitted(today())
today() => 1991/02/16
isomitted(1991/02/16) => 0
today() => 1991-02-16
isomitted(1991-02-16) => 0
set a031 lower("FOOBARBAZ")
lower("FOOBARBAZ") => "foobarbaz"
set a032 max(1, 2, 34, 1, 3)
@@ -563,31 +563,31 @@ max(1, 2, 34, 1, 3) => 34
set a033 max("foo", "bar", "baz")
max("foo", "bar", "baz") => "foo"
set a034 max(today(), today()+1, today()-1)
today() => 1991/02/16
today() => 1991/02/16
1991/02/16 + 1 => 1991/02/17
today() => 1991/02/16
1991/02/16 - 1 => 1991/02/15
max(1991/02/16, 1991/02/17, 1991/02/15) => 1991/02/17
today() => 1991-02-16
today() => 1991-02-16
1991-02-16 + 1 => 1991-02-17
today() => 1991-02-16
1991-02-16 - 1 => 1991-02-15
max(1991-02-16, 1991-02-17, 1991-02-15) => 1991-02-17
set a035 min(1, 2, 34, 1, 3)
min(1, 2, 34, 1, 3) => 1
set a036 min("foo", "bar", "baz")
min("foo", "bar", "baz") => "bar"
set a037 min(today(), today()+1, today()-1)
today() => 1991/02/16
today() => 1991/02/16
1991/02/16 + 1 => 1991/02/17
today() => 1991/02/16
1991/02/16 - 1 => 1991/02/15
min(1991/02/16, 1991/02/17, 1991/02/15) => 1991/02/15
today() => 1991-02-16
today() => 1991-02-16
1991-02-16 + 1 => 1991-02-17
today() => 1991-02-16
1991-02-16 - 1 => 1991-02-15
min(1991-02-16, 1991-02-17, 1991-02-15) => 1991-02-15
set a038 minute(11:33)
minute(11:33) => 33
set a039 mon(today())
today() => 1991/02/16
mon(1991/02/16) => "February"
today() => 1991-02-16
mon(1991-02-16) => "February"
set a040 monnum(today())
today() => 1991/02/16
monnum(1991/02/16) => 2
today() => 1991-02-16
monnum(1991-02-16) => 2
set a041 ord(3)
ord(3) => "3rd"
set a042 ord(4)
@@ -620,7 +620,7 @@ time(3, 7) => 03:07
rem 10 jan 1992 AT 11:22 CAL
../tests/test.rem(217): Trig = Friday, 10 January, 1992
set a053 trigdate()
trigdate() => 1992/01/10
trigdate() => 1992-01-10
set a054 trigtime()
trigtime() => 11:22
set a055 trigvalid()
@@ -631,16 +631,16 @@ set a057 value("a05"+"6")
"a05" + "6" => "a056"
value("a056") => "SDFJHSDF KSJDFH KJSDFH KSJDFH"
set a058 version()
version() => "03.00.20"
version() => "03.01.00"
set a059 wkday(today())
today() => 1991/02/16
wkday(1991/02/16) => "Saturday"
today() => 1991-02-16
wkday(1991-02-16) => "Saturday"
set a060 wkdaynum(today())
today() => 1991/02/16
wkdaynum(1991/02/16) => 6
today() => 1991-02-16
wkdaynum(1991-02-16) => 6
set a061 year(today())
today() => 1991/02/16
year(1991/02/16) => 1991
today() => 1991-02-16
year(1991-02-16) => 1991
set a062 1+2*(3+4-(5*7/2))
3 + 4 => 7
5 * 7 => 35
@@ -666,8 +666,8 @@ typeof("foo") => "STRING"
set a069 typeof(11:33)
typeof(11:33) => "TIME"
set a070 typeof(today())
today() => 1991/02/16
typeof(1991/02/16) => "DATE"
today() => 1991-02-16
typeof(1991-02-16) => "DATE"
fset g(x,y) max(x,y)
fset h(x,y) min(g(x+y, x*y), g(x-y, x/y))
set a071 g(1, 2)
@@ -713,25 +713,25 @@ y => 11:33
../tests/test.rem(240): `*': 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"...
dosubst("%a %b %c %d %e %f %g %h", 1992-05-05) => "on Tuesday, 5 May, 1992 in 444 days' tim"...
msg [a074]%
../tests/test.rem(242): Trig = Saturday, 16 February, 1991
a074 => "on Tuesday, 5 May, 1992 in 444 days' tim"...
on Tuesday, 5 May, 1992 in 444 days' time on Tuesday 5 on 05/05/1992 on 05/05/1992 on Tuesday, 5 May on 05/05
on Tuesday, 5 May, 1992 in 444 days' time on Tuesday 5 on 05-05-1992 on 05-05-1992 on Tuesday, 5 May on 05-05
set a075 dosubst("%i %j %k %l %m %n %o %p", '1992/5/5')
dosubst("%i %j %k %l %m %n %o %p", 1992/05/05) => "on 05/05 on Tuesday, May 5th, 1992 on Tu"...
dosubst("%i %j %k %l %m %n %o %p", 1992-05-05) => "on 05-05 on Tuesday, May 5th, 1992 on Tu"...
msg [a075]%
../tests/test.rem(244): Trig = Saturday, 16 February, 1991
a075 => "on 05/05 on Tuesday, May 5th, 1992 on Tu"...
on 05/05 on Tuesday, May 5th, 1992 on Tuesday, May 5th on 1992/05/05 May 5 s
a075 => "on 05-05 on Tuesday, May 5th, 1992 on Tu"...
on 05-05 on Tuesday, May 5th, 1992 on Tuesday, May 5th on 1992-05-05 May 5 s
set a076 dosubst("%q %r %s %t %u %v %w %x", '1992/5/5')
dosubst("%q %r %s %t %u %v %w %x", 1992/05/05) => "s' 05 th 05 on Tuesday, 5th May, 1992 on"...
dosubst("%q %r %s %t %u %v %w %x", 1992-05-05) => "s' 05 th 05 on Tuesday, 5th May, 1992 on"...
msg [a076]%
../tests/test.rem(246): Trig = Saturday, 16 February, 1991
a076 => "s' 05 th 05 on Tuesday, 5th May, 1992 on"...
s' 05 th 05 on Tuesday, 5th May, 1992 on Tuesday, 5th May Tuesday 444
set a077 dosubst("%y %z", '1992/5/5')
dosubst("%y %z", 1992/05/05) => "1992 92
dosubst("%y %z", 1992-05-05) => "1992 92
"
msg [a077]%
../tests/test.rem(248): Trig = Saturday, 16 February, 1991
@@ -739,92 +739,92 @@ a077 => "1992 92
"
1992 92
set a078 easterdate(today())
today() => 1991/02/16
easterdate(1991/02/16) => 1991/03/31
today() => 1991-02-16
easterdate(1991-02-16) => 1991-03-31
set a079 easterdate(1992)
easterdate(1992) => 1992/04/19
easterdate(1992) => 1992-04-19
set a080 easterdate(1995)
easterdate(1995) => 1995/04/16
easterdate(1995) => 1995-04-16
set a081 ""
dump
Variable Value
Variable Value
a017 29
a036 "bar"
a055 1
a074 "on Tuesday, 5 May, 1992 in 444 days' tim"...
a008 "11:44"
a027 0
a046 "ies"
a065 1
a018 1
a037 1991/02/15
a056 "SDFJHSDF KSJDFH KJSDFH KSJDFH"
a075 "on 05/05 on Tuesday, May 5th, 1992 on Tu"...
a028 1
a047 -1
a066 0
a019 0
a038 33
a057 "SDFJHSDF KSJDFH KJSDFH KSJDFH"
a076 "s' 05 th 05 on Tuesday, 5th May, 1992 on"...
a029 0
a048 "foo"
a067 "INT"
a039 "February"
a058 "03.00.20"
a077 "1992 92
a017 29
a036 "bar"
a055 1
a074 "on Tuesday, 5 May, 1992 in 444 days' tim"...
a008 "11:44"
a027 0
a046 "ies"
a065 1
a018 1
a037 1991-02-15
a056 "SDFJHSDF KSJDFH KJSDFH KSJDFH"
a075 "on 05-05 on Tuesday, May 5th, 1992 on Tu"...
a028 1
a047 -1
a066 0
a019 0
a038 33
a057 "SDFJHSDF KSJDFH KJSDFH KSJDFH"
a076 "s' 05 th 05 on Tuesday, 5th May, 1992 on"...
a029 0
a048 "foo"
a067 "INT"
a039 "February"
a058 "03.01.00"
a077 "1992 92
"
a049 21
a068 "STRING"
a059 "Saturday"
a078 1991/03/31
a069 "TIME"
a079 1992/04/19
a000 1
a010 12
a001 1
a020 "../tests/test.rem"
a011 704
a030 1
a002 102
a021 "foo bar baz"
a040 2
a012 411
a031 "foobarbaz"
a003 1990
a022 11
a041 "3rd"
a060 6
a013 1992/02/02
a032 34
a070 "DATE"
a004 "B7BMB"
a023 1
a042 "4th"
a061 1991
a080 1995/04/16
a033 "foo"
a052 03:07
a071 2
a005 "baz"
a024 0
a043 "UNIX"
a062 -19
a081 ""
a015 16
a034 1991/02/17
a053 1992/01/10
a072 0
a006 "1"
a025 4
a044 "s"
a063 0
a016 28
a035 1
a054 11:22
a007 "1991/02/16"
a026 7
a045 "iess"
a064 1
a049 21
a068 "STRING"
a059 "Saturday"
a078 1991-03-31
a069 "TIME"
a079 1992-04-19
a000 1
a010 12
a001 1
a020 "../tests/test.rem"
a011 704
a030 1
a002 102
a021 "foo bar baz"
a040 2
a012 411
a031 "foobarbaz"
a003 1990
a022 11
a041 "3rd"
a060 6
a013 1992-02-02
a032 34
a070 "DATE"
a004 "B7BMB"
a023 1
a042 "4th"
a061 1991
a080 1995-04-16
a033 "foo"
a052 03:07
a071 2
a005 "baz"
a024 0
a043 "UNIX"
a062 -19
a081 ""
a015 16
a034 1991-02-17
a053 1992-01-10
a072 0
a006 "1"
a025 4
a044 "s"
a063 0
a016 28
a035 1
a054 11:22
a007 "1991-02-16"
a026 7
a045 "iess"
a064 1

View File

@@ -1,7 +1,5 @@
# Test file for REMIND
#
# $Id: test1.cmp,v 1.2 1998-03-01 20:44:20 dfs Exp $
#
# Use this file to test the date calculation routines
# of the REMIND program by typing:
#

Some files were not shown because too many files have changed in this diff Show More