home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume39 / remind / patch08a next >
Text File  |  1993-09-07  |  62KB  |  2,030 lines

  1. Newsgroups: comp.sources.misc
  2. From: <dfs@doe.carleton.ca> (David F. Skoll)
  3. Subject: v39i079:  remind - A replacement for calendar, Patch08a/3
  4. Message-ID: <csm-v39i079=remind.072921@sparky.Sterling.COM>
  5. X-Md4-Signature: 39b3dfa88e695c2645e1fdd36dab6c85
  6. Sender: kent@sparky.sterling.com (Kent Landfield)
  7. Organization: Sterling Software
  8. Date: Wed, 8 Sep 1993 12:30:01 GMT
  9. Approved: kent@sparky.sterling.com
  10.  
  11. Submitted-by: <dfs@doe.carleton.ca> (David F. Skoll)
  12. Posting-number: Volume 39, Issue 79
  13. Archive-name: remind/patch08a
  14. Environment: UNIX, MS-DOS, OS/2
  15. Patch-To: remind: Volume 33, Issue 58-69
  16.  
  17. This is patch 8 for version 3.0 of Remind.
  18.  
  19. Remind is a sophisticated calendar/alarm program, which runs under
  20. MS-DOS, UNIX and OS/2.
  21.  
  22. Most noticeable changes: Addition of French and Norwegian support,
  23. including complete support for French; reorganization of the code to
  24. more fully support foreign langueages; addition of the MSF keyword to
  25. automatically paragraph-fill reminders.
  26.  
  27. AVAILABILITY: Remind is available via anonymous ftp at ftp.doe.carleton.ca
  28. (134.117.9.35) in the directory /pub/remind-3.0 - see the file README.1st
  29. in that directory for a list of files.
  30.  
  31. >From the WHATSNEW file:
  32.  
  33. CHANGES TO REMIND
  34.  
  35. * Version 3.0 Patch 8
  36.  
  37. + MAJOR ENHANCEMENTS
  38.  
  39. - Changed the code to more fully support foreign languages - error
  40.   messages and usage instructions can now be changed.  All changes can
  41.   be localized in the appropriate language.h files.
  42.  
  43. - Added support for the French language, courtesy of Laurent Duperval.
  44.   Note that the French support is more complete than for other languages -
  45.   French usage instructions and error messages are supported.
  46.  
  47. - Added support for the Norwegian language, courtesy of Trygve Randen.
  48.  
  49. + MINOR ENHANCEMENTS
  50.  
  51. - Added code for the functions timelocal() and timegm(), courtesy of
  52.   Lucio de Re.  This is for those very few machines whose libraries
  53.   include neither those functions nor mktime().
  54.  
  55. - Added the filedate() function.
  56.  
  57. - Allowed the filename to be specified as "-" to cause Remind to take
  58.   its input from the standard input stream.
  59.  
  60. - Added the "MSF" keyword to cause reminders to be formatted automatically.
  61.   This keyword paragraph-fills reminder text following user specifications.
  62.   Based on a suggestion by Ken McGlothlen.
  63.  
  64. - Added the "-e" option to Rem2PS, allowing the PostScript calendar
  65.   to fill the entire page.  Thanks to Arthur G. Yaffe.
  66.  
  67. + BUG FIXES
  68.  
  69. - Corrected the Hebrew holidays Tzom Gedalia, Tzom Tevet, Ta'anit
  70.   Esther, Tzom Tamuz and Tisha B'Av so they won't occur on Saturday.
  71.   Corrections made following the algorithm in "Calendrical Calculations"
  72.   by Nachum Dershowitz and Edward M. Reingold.
  73.  
  74. - Changed the dutch.h language file as suggested by Erik-Jan Vens.  Made
  75.   month and day names lower-case; corrected the spelling of oktober.
  76.  
  77. - Changed HashVal in var.c to use unsigned arithmetic - it's conceivable
  78.   that a machine with signed chars could cause problems otherwise.
  79.  
  80. - Changed the LONG_* macros in config.h to LON_* to avoid conflicts
  81.   with names defined by ANSI C.  Thanks to David W. Sanderson.
  82.  
  83. - Allowed the built-in function char() to accept numbers in the
  84.   range [-128, 255] (but not 0) so that char(asc(s)) works even
  85.   on machines with signed char types.
  86. ----
  87. #! /bin/sh
  88. # This is a shell archive.  Remove anything before this line, then feed it
  89. # into a shell via "sh file" or similar.  To overwrite existing files,
  90. # type "sh file -c".
  91. # Contents:  norwgian.h patch.08.B
  92. # Wrapped by kent@sparky on Wed Sep  8 07:12:55 1993
  93. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
  94. echo If this archive is complete, you will see the following message:
  95. echo '          "shar: End of archive 1 (of 3)."'
  96. if test -f 'norwgian.h' -a "${1}" != "-c" ; then 
  97.   echo shar: Will not clobber existing file \"'norwgian.h'\"
  98. else
  99.   echo shar: Extracting \"'norwgian.h'\" \(3088 characters\)
  100.   sed "s/^X//" >'norwgian.h' <<'END_OF_FILE'
  101. X/***************************************************************/
  102. X/*                                                             */
  103. X/*  NORWGIAN.H                                                 */
  104. X/*                                                             */
  105. X/*  Support for the Norwegian language.                        */
  106. X/*                                                             */
  107. X/*  This file is part of REMIND.                               */
  108. X/*  This file is Copyright (C) 1993 by Trygve Randen.          */
  109. X/*                                                             */
  110. X/***************************************************************/
  111. X
  112. X/* The very first define in a language support file must be L_LANGNAME: */
  113. X#define L_LANGNAME "Norwegian"
  114. X
  115. X/* Day names */
  116. X#ifdef ISOLATIN1
  117. X#  define L_SUNDAY "S\370ndag"
  118. X#else
  119. X#  define L_SUNDAY "Soendag"
  120. X#endif
  121. X#define L_MONDAY "Mandag"
  122. X#define L_TUESDAY "Tirsdag"
  123. X#define L_WEDNESDAY "Onsdag"
  124. X#define L_THURSDAY "Torsdag"
  125. X#define L_FRIDAY "Fredag"
  126. X#ifdef ISOLATIN1
  127. X#  define L_SATURDAY "L\370rdag"
  128. X#else
  129. X#  define L_SATURDAY "Loerdag"
  130. X#endif
  131. X
  132. X/* Day initials - first letter only */
  133. X#define L_DAYINIT "SMTOTFL"
  134. X
  135. X/* Month names */
  136. X#define L_JAN "Januar"
  137. X#define L_FEB "Februar"
  138. X#define L_MAR "Mars"
  139. X#define L_APR "April"
  140. X#define L_MAY "Mai"
  141. X#define L_JUN "Juni"
  142. X#define L_JUL "Juli"
  143. X#define L_AUG "August"
  144. X#define L_SEP "September"
  145. X#define L_OCT "Oktober"
  146. X#define L_NOV "November"
  147. X#define L_DEC "Desember"
  148. X
  149. X/* Today and tomorrow */
  150. X#define L_TODAY "i dag"
  151. X#define L_TOMORROW "i morgen"
  152. X
  153. X/* The default banner */
  154. X#ifdef ISOLATIN1
  155. X#  define L_BANNER "P\345minnelse for %w, %d. %m, %y%o:"
  156. X#else
  157. X#  define L_BANNER "Paaminnelse for %w, %d. %m, %y%o:"
  158. X#endif
  159. X
  160. X/* "am" and "pm" */
  161. X#define L_AM "am"
  162. X#define L_PM "pm"
  163. X
  164. X/*** The following are only used in dosubst.c ***/
  165. X#ifdef L_IN_DOSUBST
  166. X
  167. X/* Ago and from now */
  168. X#define L_AGO "siden"
  169. X#ifdef ISOLATIN1
  170. X#  define L_FROMNOW "fra n\345"
  171. X#else
  172. X#  define L_FROMNOW "fra naa"
  173. X#endif
  174. X
  175. X/* "in %d days' time" */
  176. X#define L_INXDAYS "om %d dager"
  177. X
  178. X/* "on" as in "on date..." */
  179. X#define L_ON "den"
  180. X
  181. X/* Pluralizing - this is a problem for many languages and may require
  182. X   a more drastic fix */
  183. X#define L_PLURAL "er"
  184. X
  185. X/* Minutes, hours, at, etc */
  186. X#ifdef ISOLATIN1
  187. X#  define L_NOW "n\345"
  188. X#else
  189. X#  define L_NOW "naa"
  190. X#endif
  191. X#define L_AT "kl."
  192. X#define L_MINUTE "minutt"
  193. X#define L_HOUR "time"
  194. X#define L_IS "er"
  195. X#define L_WAS "var"
  196. X#define L_AND "og"
  197. X/* What to add to make "hour" plural */
  198. X#define L_HPLU "r"  
  199. X/* What to add to make "minute" plural */
  200. X#define L_MPLU "er"
  201. X
  202. X/* Define any overrides here, such as L_ORDINAL_OVERRIDE, L_A_OVER, etc.
  203. X   See the file dosubst.c for more info. */
  204. X#define L_ORDINAL_OVERRIDE              plu = ".";
  205. X#define L_A_OVER                        sprintf(s, "%s %s, den %d. %s %d", L_ON, DayName[jul%7], d, MonthName[m], y);
  206. X#define L_G_OVER                        sprintf(s, "%s %s, den %d. %s", L_ON, DayName[jul%7], d, MonthName[m]);
  207. X#define L_U_OVER                        L_A_OVER
  208. X#define L_V_OVER                        L_G_OVER
  209. X
  210. X
  211. X#endif /* L_IN_DOSUBST */
  212. END_OF_FILE
  213.   if test 3088 -ne `wc -c <'norwgian.h'`; then
  214.     echo shar: \"'norwgian.h'\" unpacked with wrong size!
  215.   fi
  216.   # end of 'norwgian.h'
  217. fi
  218. if test -f 'patch.08.B' -a "${1}" != "-c" ; then 
  219.   echo shar: Will not clobber existing file \"'patch.08.B'\"
  220. else
  221.   echo shar: Extracting \"'patch.08.B'\" \(52275 characters\)
  222.   sed "s/^X//" >'patch.08.B' <<'END_OF_FILE'
  223. X*** ../prev/README.DOS    Mon Jun 28 12:29:28 1993
  224. X--- ./README.DOS    Thu Aug 19 17:06:36 1993
  225. X***************
  226. X*** 20,33 ****
  227. X  
  228. X  OTHER LANGUAGE SUPPORT
  229. X  
  230. X! Remind has limited support for languages other than English.  See the file
  231. X! "lang.h" for details.  Only the substitution filter and names of days and
  232. X! months are affected - error and usage messages are still in English.
  233. X  
  234. X  If you add support for a non-English language, Remind will accept both the
  235. X  English and non-English names of months and weekdays in an input script.
  236. X  However, you should not rely on this feature if you want to write portable
  237. X  Remind scripts.
  238. X  
  239. X  Take a look at the files "english.h" and "german.h" if you want to add
  240. X  support for your favourite language.  If you do add another language
  241. X--- 20,39 ----
  242. X  
  243. X  OTHER LANGUAGE SUPPORT
  244. X  
  245. X! Remind has support for languages other than English.  See the file
  246. X! "lang.h" for details.  The language support may vary - you can change
  247. X! only the substitution filter, or you can translate all of the usage
  248. X! instructions and error messages as well.  See "french.h" for an
  249. X  
  250. X  If you add support for a non-English language, Remind will accept both the
  251. X  English and non-English names of months and weekdays in an input script.
  252. X  However, you should not rely on this feature if you want to write portable
  253. X  Remind scripts.
  254. X+ 
  255. X+ At a minimum, you should support month and day names in the foreign
  256. X+ language, and should modify the substitution filter appropriately.
  257. X+ If you are truly diligent, you can translate usage and error messages
  258. X+ too.
  259. X  
  260. X  Take a look at the files "english.h" and "german.h" if you want to add
  261. X  support for your favourite language.  If you do add another language
  262. X*** ../prev/README.OS2    Mon Jun 28 12:30:19 1993
  263. X--- ./README.OS2    Thu Aug 19 17:06:14 1993
  264. X***************
  265. X*** 28,41 ****
  266. X  
  267. X  OTHER LANGUAGE SUPPORT
  268. X  
  269. X! Remind has limited support for languages other than English.  See the file
  270. X! "lang.h" for details.  Only the substitution filter and names of days and
  271. X! months are affected - error and usage messages are still in English.
  272. X  
  273. X  If you add support for a non-English language, Remind will accept both the
  274. X  English and non-English names of months and weekdays in an input script.
  275. X  However, you should not rely on this feature if you want to write portable
  276. X  Remind scripts.
  277. X  
  278. X  Take a look at the files "english.h" and "german.h" if you want to add
  279. X  support for your favourite language.  If you do add another language
  280. X--- 28,48 ----
  281. X  
  282. X  OTHER LANGUAGE SUPPORT
  283. X  
  284. X! Remind has support for languages other than English.  See the file
  285. X! "lang.h" for details.  The language support may vary - you can change
  286. X! only the substitution filter, or you can translate all of the usage
  287. X! instructions and error messages as well.  See "french.h" for an
  288. X! example of the latter.
  289. X  
  290. X  If you add support for a non-English language, Remind will accept both the
  291. X  English and non-English names of months and weekdays in an input script.
  292. X  However, you should not rely on this feature if you want to write portable
  293. X  Remind scripts.
  294. X+ 
  295. X+ At a minimum, you should support month and day names in the foreign
  296. X+ language, and should modify the substitution filter appropriately.
  297. X+ If you are truly diligent, you can translate usage and error messages
  298. X+ too.
  299. X  
  300. X  Take a look at the files "english.h" and "german.h" if you want to add
  301. X  support for your favourite language.  If you do add another language
  302. X*** ../prev/README.UNIX    Mon Jun 28 12:29:27 1993
  303. X--- ./README.UNIX    Thu Aug 19 17:05:59 1993
  304. X***************
  305. X*** 58,71 ****
  306. X  
  307. X  OTHER LANGUAGE SUPPORT
  308. X  
  309. X! Remind has limited support for languages other than English.  See the file
  310. X! "lang.h" for details.  Only the substitution filter and names of days and
  311. X! months are affected - error and usage messages are still in English.
  312. X  
  313. X  If you add support for a non-English language, Remind will accept both the
  314. X  English and non-English names of months and weekdays in an input script.
  315. X  However, you should not rely on this feature if you want to write portable
  316. X  Remind scripts.
  317. X  
  318. X  Take a look at the files "english.h" and "german.h" if you want to add
  319. X  support for your favourite language.  If you do add another language
  320. X--- 58,78 ----
  321. X  
  322. X  OTHER LANGUAGE SUPPORT
  323. X  
  324. X! Remind has support for languages other than English.  See the file
  325. X! "lang.h" for details.  The language support may vary - you can change
  326. X! only the substitution filter, or you can translate all of the usage
  327. X! instructions and error messages as well.  See "french.h" for an
  328. X! example of the latter.
  329. X  
  330. X  If you add support for a non-English language, Remind will accept both the
  331. X  English and non-English names of months and weekdays in an input script.
  332. X  However, you should not rely on this feature if you want to write portable
  333. X  Remind scripts.
  334. X+ 
  335. X+ At a minimum, you should support month and day names in the foreign
  336. X+ language, and should modify the substitution filter appropriately.
  337. X+ If you are truly diligent, you can translate usage and error messages
  338. X+ too.
  339. X  
  340. X  Take a look at the files "english.h" and "german.h" if you want to add
  341. X  support for your favourite language.  If you do add another language
  342. X*** ../prev/WHATSNEW.30    Mon Jul 19 10:59:32 1993
  343. X--- ./WHATSNEW.30    Thu Aug 19 16:57:45 1993
  344. X***************
  345. X*** 1,5 ****
  346. X--- 1,57 ----
  347. X  CHANGES TO REMIND
  348. X  
  349. X+ * Version 3.0 Patch 8
  350. X+ 
  351. X+ + MAJOR ENHANCEMENTS
  352. X+ 
  353. X+ - Changed the code to more fully support foreign languages - error
  354. X+   messages and usage instructions can now be changed.  All changes can
  355. X+   be localized in the appropriate language.h files.
  356. X+ 
  357. X+ - Added support for the French language, courtesy of Laurent Duperval.
  358. X+   Note that the French support is more complete than for other languages -
  359. X+   French usage instructions and error messages are supported.
  360. X+ 
  361. X+ - Added support for the Norwegian language, courtesy of Trygve Randen.
  362. X+ 
  363. X+ + MINOR ENHANCEMENTS
  364. X+ 
  365. X+ - Added code for the functions timelocal() and timegm(), courtesy of
  366. X+   Lucio de Re.  This is for those very few machines whose libraries
  367. X+   include neither those functions nor mktime().
  368. X+ 
  369. X+ - Added the filedate() function.
  370. X+ 
  371. X+ - Allowed the filename to be specified as "-" to cause Remind to take
  372. X+   its input from the standard input stream.
  373. X+ 
  374. X+ - Added the "MSF" keyword to cause reminders to be formatted automatically.
  375. X+   This keyword paragraph-fills reminder text following user specifications.
  376. X+   Based on a suggestion by Ken McGlothlen.
  377. X+ 
  378. X+ - Added the "-e" option to Rem2PS, allowing the PostScript calendar
  379. X+   to fill the entire page.  Thanks to Arthur G. Yaffe.
  380. X+ 
  381. X+ + BUG FIXES
  382. X+ 
  383. X+ - Corrected the Hebrew holidays Tzom Gedalia, Tzom Tevet, Ta'anit
  384. X+   Esther, Tzom Tamuz and Tisha B'Av so they won't occur on Saturday.
  385. X+   Corrections made following the algorithm in "Calendrical Calculations"
  386. X+   by Nachum Dershowitz and Edward M. Reingold.
  387. X+ 
  388. X+ - Changed the dutch.h language file as suggested by Erik-Jan Vens.  Made
  389. X+   month and day names lower-case; corrected the spelling of oktober.
  390. X+ 
  391. X+ - Changed HashVal in var.c to use unsigned arithmetic - it's conceivable
  392. X+   that a machine with signed chars could cause problems otherwise.
  393. X+ 
  394. X+ - Changed the LONG_* macros in config.h to LON_* to avoid conflicts
  395. X+   with names defined by ANSI C.  Thanks to David W. Sanderson.
  396. X+ 
  397. X+ - Allowed the built-in function char() to accept numbers in the
  398. X+   range [-128, 255] (but not 0) so that char(asc(s)) works even
  399. X+   on machines with signed char types.
  400. X+ 
  401. X  * Version 3.0 Patch 7
  402. X  
  403. X  + MAJOR ENHANCEMENTS
  404. X*** ../prev/calendar.c    Mon Jun 28 13:08:26 1993
  405. X--- ./calendar.c    Thu Aug 19 16:55:52 1993
  406. X***************
  407. X*** 479,485 ****
  408. X  
  409. X     r=OpenFile(InitialFile);
  410. X     if (r) {
  411. X!       fprintf(ErrFp, "Can't read %s: %s\n", InitialFile, ErrMsg[r]);
  412. X        exit(1);
  413. X     }
  414. X  
  415. X--- 479,485 ----
  416. X  
  417. X     r=OpenFile(InitialFile);
  418. X     if (r) {
  419. X!       fprintf(ErrFp, "%s %s: %s\n", ErrMsg[E_ERR_READING], InitialFile, ErrMsg[r]);
  420. X        exit(1);
  421. X     }
  422. X  
  423. X***************
  424. X*** 487,493 ****
  425. X        r = ReadLine();
  426. X        if (r == E_EOF) return;
  427. X        if (r) {
  428. X!      Eprint("Error reading file: %s", ErrMsg[r]);
  429. X       exit(1);
  430. X        }
  431. X        s = FindInitialToken(&tok, CurLine);
  432. X--- 487,493 ----
  433. X        r = ReadLine();
  434. X        if (r == E_EOF) return;
  435. X        if (r) {
  436. X!      Eprint("%s: %s", ErrMsg[E_ERR_READING], ErrMsg[r]);
  437. X       exit(1);
  438. X        }
  439. X        s = FindInitialToken(&tok, CurLine);
  440. X*** ../prev/config.h    Mon Jun 28 12:29:29 1993
  441. X--- ./config.h    Wed Aug 18 12:56:55 1993
  442. X***************
  443. X*** 12,19 ****
  444. X  /***************************************************************/
  445. X  
  446. X  /*---------------------------------------------------------------------*/
  447. X! /* LAT_DEG, LAT_MIN and LAT_SEC:  Latitude of your location            */
  448. X! /* LONG_DEG, LONG_MIN and LONG_SEC: Longitude of your location         */
  449. X  /* For latitude, north is positive, south is negative.                 */
  450. X  /* For longitude, west is positive, east is negative.                  */
  451. X  /* NOTE:  For negative numbers, all three of DEG, MIN, SEC should be   */
  452. X--- 12,19 ----
  453. X  /***************************************************************/
  454. X  
  455. X  /*---------------------------------------------------------------------*/
  456. X! /* LAT_DEG, LAT_MIN and LAT_SEC: Latitude of your location             */
  457. X! /* LON_DEG, LON_MIN and LON_SEC: Longitude of your location            */
  458. X  /* For latitude, north is positive, south is negative.                 */
  459. X  /* For longitude, west is positive, east is negative.                  */
  460. X  /* NOTE:  For negative numbers, all three of DEG, MIN, SEC should be   */
  461. X***************
  462. X*** 21,32 ****
  463. X  /*        DEG=-20, MIN=-22 and SEC=-33.                                */
  464. X  /* The default values are initially set to Ottawa, Ontario, Canada.    */
  465. X  /*---------------------------------------------------------------------*/
  466. X! #define LAT_DEG  45
  467. X! #define LAT_MIN  24
  468. X! #define LAT_SEC  00
  469. X! #define LONG_DEG 75
  470. X! #define LONG_MIN 39
  471. X! #define LONG_SEC  0
  472. X  
  473. X  /*---------------------------------------------------------------------*/
  474. X  /* HAVE_MKTIME: Define this if your C library includes the mktime()    */
  475. X--- 21,32 ----
  476. X  /*        DEG=-20, MIN=-22 and SEC=-33.                                */
  477. X  /* The default values are initially set to Ottawa, Ontario, Canada.    */
  478. X  /*---------------------------------------------------------------------*/
  479. X! #define LAT_DEG 45
  480. X! #define LAT_MIN 24
  481. X! #define LAT_SEC  0
  482. X! #define LON_DEG 75
  483. X! #define LON_MIN 39
  484. X! #define LON_SEC  0
  485. X  
  486. X  /*---------------------------------------------------------------------*/
  487. X  /* HAVE_MKTIME: Define this if your C library includes the mktime()    */
  488. X***************
  489. X*** 34,39 ****
  490. X--- 34,47 ----
  491. X  /*              style time manipulations.                              */
  492. X  /*---------------------------------------------------------------------*/
  493. X  #define HAVE_MKTIME 1
  494. X+ 
  495. X+ /*---------------------------------------------------------------------*/
  496. X+ /* NEED_TIMEGM: If your C library does not have mktime() and it ALSO   */
  497. X+ /*              does not have timelocal() or timegm(), uncomment the   */
  498. X+ /*              next line.  If HAVE_MKTIME is defined, NEED_TIMEGM is  */
  499. X+ /*              ignored.  Very few systems should require NEED_TIMEGM. */
  500. X+ /*---------------------------------------------------------------------*/
  501. X+ /* #define NEED_TIMEGM 1 */
  502. X  
  503. X  /*---------------------------------------------------------------------*/
  504. X  /* DEFAULT_PAGE:  The default page size to use for Rem2PS.             */
  505. X*** ../prev/defs.rem    Fri Jul 16 15:28:09 1993
  506. X--- ./defs.rem    Mon Aug 23 11:54:35 1993
  507. X***************
  508. X*** 25,32 ****
  509. X  ################################################
  510. X  # Ensure required version of remind is used... #
  511. X  ################################################
  512. X! IF version() < "03.00.07"
  513. X!    ERRMSG This file requires at least version 03.00.07 of Remind.%
  514. X     ERRMSG This version is version [version()].
  515. X     EXIT
  516. X  ENDIF
  517. X--- 25,32 ----
  518. X  ################################################
  519. X  # Ensure required version of remind is used... #
  520. X  ################################################
  521. X! IF version() < "03.00.08"
  522. X!    ERRMSG This file requires at least version 03.00.08 of Remind.%
  523. X     ERRMSG This version is version [version()].
  524. X     EXIT
  525. X  ENDIF
  526. X***************
  527. X*** 111,117 ****
  528. X  # Change the timezone to your timezone - the default is   #
  529. X  # for EST which is 5 hours (300 minutes) behind UTC.      #
  530. X  # The code is correct for places in which Daylight Savings#
  531. X! # Time begins on the last Sunday in March and ends on the #
  532. X  # last Sunday in October.                                 #
  533. X  ###########################################################
  534. X  
  535. X--- 111,117 ----
  536. X  # Change the timezone to your timezone - the default is   #
  537. X  # for EST which is 5 hours (300 minutes) behind UTC.      #
  538. X  # The code is correct for places in which Daylight Savings#
  539. X! # Time begins on the last Sunday in April and ends on the #
  540. X  # last Sunday in October.                                 #
  541. X  ###########################################################
  542. X  
  543. X***************
  544. X*** 121,127 ****
  545. X  
  546. X      # Use --8 rather than --7 because we want the last day BEFORE
  547. X      # the time switch occurs.
  548. X!     REM Sun 1 Apr --8 SATISFY 1
  549. X      SET BegDst TRIGDATE()
  550. X  
  551. X      REM Sun 1 Nov --8 SATISFY 1
  552. X--- 121,127 ----
  553. X  
  554. X      # Use --8 rather than --7 because we want the last day BEFORE
  555. X      # the time switch occurs.
  556. X!     REM Sun 1 May --8 SATISFY 1
  557. X      SET BegDst TRIGDATE()
  558. X  
  559. X      REM Sun 1 Nov --8 SATISFY 1
  560. X***************
  561. X*** 276,281 ****
  562. X--- 276,299 ----
  563. X  REM 8 Jan 1993 *14 SATISFY [_IsMortDate(TRIGDATE())] \
  564. X      CAL Mortgage payment
  565. X  
  566. X+ ##########################################################################
  567. X+ #                                         #
  568. X+ # On our UNIX system, I run a program which queries the university       #
  569. X+ # library and creates a file called ".booksdue".  This file is           #
  570. X+ # a REMIND script to tell me when my library books are due.  Here's      #
  571. X+ # an example from my reminder file - it shows the use of filedate().     #
  572. X+ # When the .booksdue file is at least 7 days old, I create a new version #
  573. X+ # by querying the library computer.  Note the use of realtoday() rather  #
  574. X+ # than today.                                    #
  575. X+ #                                         #
  576. X+ ##########################################################################
  577. X+ 
  578. X+ IF !$RunOff && !$CalMode && !$SimpleCal
  579. X+    IF REALTODAY()-FILEDATE("/home/dfs/.booksdue") >= 7
  580. X+       REM RUN /home/dfs/bilge/library/getbooks
  581. X+    ENDIF
  582. X+ ENDIF
  583. X+ 
  584. X  #PSSTUFF
  585. X  ##########################################################################
  586. X  #                                         #
  587. X***************
  588. X*** 298,304 ****
  589. X  closepath 0.95 setgray fill 0.0 setgray"
  590. X  
  591. X  # The following reminder will shade the Saturday and Sunday calendar
  592. X! # entries. 
  593. X  REM Sat Sun PS [shade]
  594. X  
  595. X  # The following will fill in the Hebrew dates on the calendar.  For this
  596. X--- 316,322 ----
  597. X  closepath 0.95 setgray fill 0.0 setgray"
  598. X  
  599. X  # The following reminder will shade the Saturday and Sunday calendar
  600. X! # entries.
  601. X  REM Sat Sun PS [shade]
  602. X  
  603. X  # The following will fill in the Hebrew dates on the calendar.  For this
  604. X***************
  605. X*** 390,396 ****
  606. X  # dates were obtained from "The First Jewish Catalog" by Richard Siegel     #
  607. X  # and Michael and Sharon Strassfeld, published by the Jewish Publication #
  608. X  # Society of America.  The Reform version of the calendar was guessed     #
  609. X! # at by David Skoll based on experience.  I welcome corrections.         #
  610. X  #                                     #
  611. X  ##########################################################################
  612. X  
  613. X--- 408,416 ----
  614. X  # dates were obtained from "The First Jewish Catalog" by Richard Siegel     #
  615. X  # and Michael and Sharon Strassfeld, published by the Jewish Publication #
  616. X  # Society of America.  The Reform version of the calendar was guessed     #
  617. X! # at by David Skoll based on experience.  Additional corrections were    #
  618. X! # made from the paper "Calendrical Calculations" by Nachum Dershowitz    #
  619. X! # and Edward M. Reingold.  Any further corrections are welcome.          #
  620. X  #                                     #
  621. X  ##########################################################################
  622. X  
  623. X***************
  624. X*** 415,420 ****
  625. X--- 435,444 ----
  626. X  
  627. X  # Convenient function definition to save typing
  628. X  FSET _h(x, y) TRIGGER(HEBDATE(x,y))
  629. X+ FSET _h2(x, y) HEBDATE(x, y, TODAY()-7)
  630. X+ FSET _PastSat(x, y) IIF(WKDAYNUM(_h2(x,y))!=6, \
  631. X+             TRIGGER(_h2(x,y)), \
  632. X+             TRIGGER(_h2(x,y)+1))
  633. X  
  634. X  # Default values in case InIsrael and Reform are not set
  635. X  SET InIsrael VALUE("InIsrael", 0)
  636. X***************
  637. X*** 425,431 ****
  638. X  # No RH-2 or Tzom Gedalia in Reform
  639. X  IF !Reform
  640. X     [_h(2,  "Tishrey")] ++4 MSG %"Rosh Hashana 2%" is %b.
  641. X!    [_h(3,  "Tishrey")] ++4 MSG %"Tzom Gedalia%" is %b.
  642. X  ENDIF
  643. X  
  644. X  [_h(10, "Tishrey")] ++4 MSG %"Yom Kippur%" is %b.
  645. X--- 449,455 ----
  646. X  # No RH-2 or Tzom Gedalia in Reform
  647. X  IF !Reform
  648. X     [_h(2,  "Tishrey")] ++4 MSG %"Rosh Hashana 2%" is %b.
  649. X!    [_PastSat(3,  "Tishrey")] ++4 MSG %"Tzom Gedalia%" is %b.
  650. X  ENDIF
  651. X  
  652. X  [_h(10, "Tishrey")] ++4 MSG %"Yom Kippur%" is %b.
  653. X***************
  654. X*** 457,468 ****
  655. X  
  656. X  # Not sure about Reform's position on the next one.
  657. X  IF !Reform
  658. X!    [_h(10, "Tevet")] ++4 MSG %"Asara B'Tevet%" is %b.
  659. X  ENDIF
  660. X  
  661. X  [_h(15, "Shvat")] ++4 MSG %"Tu B'Shvat%" is %b.
  662. X  [_h(15, "Adar A")] ++4 MSG %"Purim Katan%" is %b.
  663. X! [_h(13, "Adar")] ++4 MSG %"Fast of Esther%" is %b.
  664. X  [_h(14, "Adar")] ++4 MSG %"Purim%" is %b.
  665. X  [_h(15, "Nisan")] ++4 MSG %"Pesach%" is %b.
  666. X  
  667. X--- 481,499 ----
  668. X  
  669. X  # Not sure about Reform's position on the next one.
  670. X  IF !Reform
  671. X! # The fast is moved to the 11th if the 10th is a Saturday
  672. X!    REM [_PastSat(10, "Tevet")] MSG %"Tzom Tevet%" is %b.
  673. X  ENDIF
  674. X  
  675. X  [_h(15, "Shvat")] ++4 MSG %"Tu B'Shvat%" is %b.
  676. X  [_h(15, "Adar A")] ++4 MSG %"Purim Katan%" is %b.
  677. X! 
  678. X! # If Purim is on Sunday, then Fast of Esther is 11 Adar.
  679. X! IF WKDAYNUM(_h2(13, "Adar")) != 6
  680. X!    REM [TRIGGER(_h2(13, "Adar"))] ++4 MSG %"Fast of Esther%" is %b.
  681. X! ELSE
  682. X!    REM [TRIGGER(_h2(11, "Adar"))] ++4 MSG %"Fast of Esther%" is %b.
  683. X! ENDIF
  684. X  [_h(14, "Adar")] ++4 MSG %"Purim%" is %b.
  685. X  [_h(15, "Nisan")] ++4 MSG %"Pesach%" is %b.
  686. X  
  687. X***************
  688. X*** 494,501 ****
  689. X  
  690. X  # Fairly sure Reform Jews don't observe the next two
  691. X  IF !Reform
  692. X!    [_h(17, "Tamuz")] ++4 MSG %"Fast of 17th of Tammuz%" is %b.
  693. X!    [_h(9,  "Av")] ++4 MSG %"Tish'a B'Av%" is %b.
  694. X  ENDIF
  695. X  
  696. X  # Counting the omer - do the whole spiel, i.e:
  697. X--- 525,534 ----
  698. X  
  699. X  # Fairly sure Reform Jews don't observe the next two
  700. X  IF !Reform
  701. X! # Tzom Tamuz and Tish'a B'Av are moved to Sunday if they normally
  702. X! # fall on a Saturday
  703. X!    [_PastSat(17, "Tamuz")] ++4 MSG %"Tzom Tammuz%" is %b.
  704. X!    [_PastSat(9,  "Av")] ++4 MSG %"Tish'a B'Av%" is %b.
  705. X  ENDIF
  706. X  
  707. X  # Counting the omer - do the whole spiel, i.e:
  708. X*** ../prev/dorem.c    Mon Jun 28 12:58:03 1993
  709. X--- ./dorem.c    Wed Aug 25 13:06:00 1993
  710. X***************
  711. X*** 137,162 ****
  712. X        FindToken(TokBuffer, &tok);
  713. X        switch(tok.type) {
  714. X       case T_WkDay:
  715. X!         if (trig->wd & (1 << tok.val)) {
  716. X!            Eprint("Weekday specified twice");
  717. X!            return E_PARSE_ERR;
  718. X!         }
  719. X          trig->wd |= (1 << tok.val);
  720. X          break;
  721. X  
  722. X       case T_Month:
  723. X!         if (trig->m != NO_MON) {
  724. X!            Eprint("Month specified twice");
  725. X!            return E_PARSE_ERR;
  726. X!         }
  727. X          trig->m = tok.val;
  728. X          break;
  729. X  
  730. X       case T_Skip:
  731. X!         if (trig->skip != NO_SKIP) {
  732. X!            Eprint("Only use one of BEFORE, AFTER or SKIP");
  733. X!            return E_PARSE_ERR;
  734. X!         }
  735. X          trig->skip = tok.val;
  736. X          break;
  737. X  
  738. X--- 137,153 ----
  739. X        FindToken(TokBuffer, &tok);
  740. X        switch(tok.type) {
  741. X       case T_WkDay:
  742. X!         if (trig->wd & (1 << tok.val)) return E_WD_TWICE;
  743. X          trig->wd |= (1 << tok.val);
  744. X          break;
  745. X  
  746. X       case T_Month:
  747. X!         if (trig->m != NO_MON) return E_MON_TWICE;
  748. X          trig->m = tok.val;
  749. X          break;
  750. X  
  751. X       case T_Skip:
  752. X!         if (trig->skip != NO_SKIP) return E_SKIP_ERR;
  753. X          trig->skip = tok.val;
  754. X          break;
  755. X  
  756. X***************
  757. X*** 172,181 ****
  758. X  
  759. X       case T_RemType:
  760. X          trig->typ = tok.val;
  761. X!         if (s->isnested) {
  762. X!            Eprint("Can't nest '%s' in expression", TokBuffer);
  763. X!            return E_PARSE_ERR;
  764. X!             }
  765. X          if (trig->scanfrom == NO_DATE) trig->scanfrom = JulianToday;
  766. X          return OK;
  767. X  
  768. X--- 163,169 ----
  769. X  
  770. X       case T_RemType:
  771. X          trig->typ = tok.val;
  772. X!         if (s->isnested) return E_CANT_NEST_RTYPE;
  773. X          if (trig->scanfrom == NO_DATE) trig->scanfrom = JulianToday;
  774. X          return OK;
  775. X  
  776. X***************
  777. X*** 185,234 ****
  778. X          break;
  779. X  
  780. X       case T_Year:
  781. X!         if (trig->y != NO_YR) {
  782. X!            Eprint("Year specified twice");
  783. X!            return E_PARSE_ERR;
  784. X!         }
  785. X          trig->y = tok.val;
  786. X          break;
  787. X  
  788. X       case T_Day:
  789. X!         if (trig->d != NO_DAY) {
  790. X!            Eprint("Day of month specified twice");
  791. X!            return E_PARSE_ERR;
  792. X!         }
  793. X          trig->d = tok.val;
  794. X          break;
  795. X  
  796. X       case T_Rep:
  797. X!         if (trig->rep != NO_REP) {
  798. X!            Eprint("Repeat value specified twice");
  799. X!            return E_PARSE_ERR;
  800. X!         }
  801. X          trig->rep = tok.val;
  802. X          break;
  803. X  
  804. X       case T_Delta:
  805. X!         if (trig->delta != NO_DELTA) {
  806. X!            Eprint("Delta value specified twice");
  807. X!            return E_PARSE_ERR;
  808. X!         }
  809. X          trig->delta = tok.val;
  810. X          break;
  811. X  
  812. X       case T_Back:
  813. X!         if (trig->back != NO_BACK) {
  814. X!            Eprint("Back value specified twice");
  815. X!            return E_PARSE_ERR;
  816. X!         }
  817. X          trig->back = tok.val;
  818. X          break;
  819. X  
  820. X       case T_Once:
  821. X!         if (trig->once != NO_ONCE) {
  822. X!            Eprint("ONCE specified twice.  (Hah.)");
  823. X!            return E_PARSE_ERR;
  824. X!         }
  825. X          trig->once = ONCE_ONCE;
  826. X          break;
  827. X  
  828. X--- 173,204 ----
  829. X          break;
  830. X  
  831. X       case T_Year:
  832. X!         if (trig->y != NO_YR) return E_YR_TWICE;
  833. X          trig->y = tok.val;
  834. X          break;
  835. X  
  836. X       case T_Day:
  837. X!         if (trig->d != NO_DAY) return E_DAY_TWICE;
  838. X          trig->d = tok.val;
  839. X          break;
  840. X  
  841. X       case T_Rep:
  842. X!         if (trig->rep != NO_REP) return E_REP_TWICE;
  843. X          trig->rep = tok.val;
  844. X          break;
  845. X  
  846. X       case T_Delta:
  847. X!         if (trig->delta != NO_DELTA) return E_DELTA_TWICE;
  848. X          trig->delta = tok.val;
  849. X          break;
  850. X  
  851. X       case T_Back:
  852. X!         if (trig->back != NO_BACK) return E_BACK_TWICE;
  853. X          trig->back = tok.val;
  854. X          break;
  855. X  
  856. X       case T_Once:
  857. X!         if (trig->once != NO_ONCE) return E_ONCE_TWICE;
  858. X          trig->once = ONCE_ONCE;
  859. X          break;
  860. X  
  861. X***************
  862. X*** 242,249 ****
  863. X          return OK;
  864. X  
  865. X       default:
  866. X!         Eprint("Unknown token in trigger: %s", TokBuffer);
  867. X!         return E_PARSE_ERR;
  868. X        }
  869. X     }
  870. X  }
  871. X--- 212,219 ----
  872. X          return OK;
  873. X  
  874. X       default:
  875. X!         Eprint("%s: %s", ErrMsg[E_UNKNOWN_TOKEN], TokBuffer);
  876. X!         return E_UNKNOWN_TOKEN;
  877. X        }
  878. X     }
  879. X  }
  880. X***************
  881. X*** 282,291 ****
  882. X          break;
  883. X  
  884. X           default:
  885. X!             if (tim->ttime == NO_TIME) {
  886. X!                Eprint("Expecting time after AT.");
  887. X!                return E_PARSE_ERR;
  888. X!         }
  889. X  /* Save in global variable */
  890. X          LastTriggerTime = tim->ttime;
  891. X          PushToken(TokBuffer);
  892. X--- 252,258 ----
  893. X          break;
  894. X  
  895. X           default:
  896. X!             if (tim->ttime == NO_TIME) return E_EXPECT_TIME;
  897. X  /* Save in global variable */
  898. X          LastTriggerTime = tim->ttime;
  899. X          PushToken(TokBuffer);
  900. X***************
  901. X*** 347,356 ****
  902. X     Token tok;
  903. X     int r;
  904. X  
  905. X!    if (t->until != NO_UNTIL) {
  906. X!       Eprint("Cannot specify UNTIL twice");
  907. X!       return E_PARSE_ERR;
  908. X!    }
  909. X  
  910. X     while(1) {
  911. X        r = ParseToken(s, TokBuffer);
  912. X--- 314,320 ----
  913. X     Token tok;
  914. X     int r;
  915. X  
  916. X!    if (t->until != NO_UNTIL) return E_UNTIL_TWICE;
  917. X  
  918. X     while(1) {
  919. X        r = ParseToken(s, TokBuffer);
  920. X***************
  921. X*** 359,366 ****
  922. X        switch(tok.type) {
  923. X       case T_Year:
  924. X          if (y != NO_YR) {
  925. X!            Eprint("Year specified twice in UNTIL");
  926. X!            return E_PARSE_ERR;
  927. X          }
  928. X          y = tok.val;
  929. X          break;
  930. X--- 323,330 ----
  931. X        switch(tok.type) {
  932. X       case T_Year:
  933. X          if (y != NO_YR) {
  934. X!            Eprint("UNTIL: %s", ErrMsg[E_YR_TWICE]);
  935. X!            return E_YR_TWICE;
  936. X          }
  937. X          y = tok.val;
  938. X          break;
  939. X***************
  940. X*** 367,374 ****
  941. X  
  942. X       case T_Month:
  943. X          if (m != NO_MON) {
  944. X!            Eprint("Month specified twice in UNTIL");
  945. X!            return E_PARSE_ERR;
  946. X          }
  947. X          m = tok.val;
  948. X          break;
  949. X--- 331,338 ----
  950. X  
  951. X       case T_Month:
  952. X          if (m != NO_MON) {
  953. X!            Eprint("UNTIL: %s", ErrMsg[E_MON_TWICE]);
  954. X!            return E_MON_TWICE;
  955. X          }
  956. X          m = tok.val;
  957. X          break;
  958. X***************
  959. X*** 375,382 ****
  960. X  
  961. X       case T_Day:
  962. X          if (d != NO_DAY) {
  963. X!            Eprint("Day specified twice in UNTIL");
  964. X!            return E_PARSE_ERR;
  965. X          }
  966. X          d = tok.val;
  967. X          break;
  968. X--- 339,346 ----
  969. X  
  970. X       case T_Day:
  971. X          if (d != NO_DAY) {
  972. X!            Eprint("UNTIL: %s", ErrMsg[E_DAY_TWICE]);
  973. X!            return E_DAY_TWICE;
  974. X          }
  975. X          d = tok.val;
  976. X          break;
  977. X***************
  978. X*** 383,390 ****
  979. X  
  980. X       default:
  981. X          if (y == NO_YR || m == NO_MON || d == NO_DAY) {
  982. X!            Eprint("Incompletely specified UNTIL");
  983. X!            return E_PARSE_ERR;
  984. X          }
  985. X          if (!DateOK(y, m, d)) return E_BAD_DATE;
  986. X          t->until = Julian(y, m, d);
  987. X--- 347,354 ----
  988. X  
  989. X       default:
  990. X          if (y == NO_YR || m == NO_MON || d == NO_DAY) {
  991. X!            Eprint("UNTIL: %s", ErrMsg[E_INCOMPLETE]);
  992. X!            return E_INCOMPLETE;
  993. X          }
  994. X          if (!DateOK(y, m, d)) return E_BAD_DATE;
  995. X          t->until = Julian(y, m, d);
  996. X***************
  997. X*** 414,423 ****
  998. X     Token tok;
  999. X     int r;
  1000. X  
  1001. X!    if (t->scanfrom != NO_DATE) {
  1002. X!       Eprint("Cannot specify SCANFROM twice");
  1003. X!       return E_PARSE_ERR;
  1004. X!    }
  1005. X  
  1006. X     while(1) {
  1007. X        r = ParseToken(s, TokBuffer);
  1008. X--- 378,384 ----
  1009. X     Token tok;
  1010. X     int r;
  1011. X  
  1012. X!    if (t->scanfrom != NO_DATE) return E_SCAN_TWICE;
  1013. X  
  1014. X     while(1) {
  1015. X        r = ParseToken(s, TokBuffer);
  1016. X***************
  1017. X*** 426,433 ****
  1018. X        switch(tok.type) {
  1019. X       case T_Year:
  1020. X          if (y != NO_YR) {
  1021. X!            Eprint("Year specified twice in SCANFROM");
  1022. X!            return E_PARSE_ERR;
  1023. X          }
  1024. X          y = tok.val;
  1025. X          break;
  1026. X--- 387,394 ----
  1027. X        switch(tok.type) {
  1028. X       case T_Year:
  1029. X          if (y != NO_YR) {
  1030. X!            Eprint("SCANFROM: %s", ErrMsg[E_YR_TWICE]);
  1031. X!            return E_YR_TWICE;
  1032. X          }
  1033. X          y = tok.val;
  1034. X          break;
  1035. X***************
  1036. X*** 434,441 ****
  1037. X  
  1038. X       case T_Month:
  1039. X          if (m != NO_MON) {
  1040. X!            Eprint("Month specified twice in SCANFROM");
  1041. X!            return E_PARSE_ERR;
  1042. X          }
  1043. X          m = tok.val;
  1044. X          break;
  1045. X--- 395,402 ----
  1046. X  
  1047. X       case T_Month:
  1048. X          if (m != NO_MON) {
  1049. X!            Eprint("SCANFROM: %s", ErrMsg[E_MON_TWICE]);
  1050. X!            return E_MON_TWICE;
  1051. X          }
  1052. X          m = tok.val;
  1053. X          break;
  1054. X***************
  1055. X*** 442,449 ****
  1056. X  
  1057. X       case T_Day:
  1058. X          if (d != NO_DAY) {
  1059. X!            Eprint("Day specified twice in SCANFROM");
  1060. X!            return E_PARSE_ERR;
  1061. X          }
  1062. X          d = tok.val;
  1063. X          break;
  1064. X--- 403,410 ----
  1065. X  
  1066. X       case T_Day:
  1067. X          if (d != NO_DAY) {
  1068. X!            Eprint("SCANFROM: %s", ErrMsg[E_DAY_TWICE]);
  1069. X!            return E_DAY_TWICE;
  1070. X          }
  1071. X          d = tok.val;
  1072. X          break;
  1073. X***************
  1074. X*** 450,457 ****
  1075. X  
  1076. X       default:
  1077. X          if (y == NO_YR || m == NO_MON || d == NO_DAY) {
  1078. X!            Eprint("Incompletely specified SCANFROM");
  1079. X!            return E_PARSE_ERR;
  1080. X          }
  1081. X          if (!DateOK(y, m, d)) return E_BAD_DATE;
  1082. X          t->scanfrom = Julian(y, m, d);
  1083. X--- 411,418 ----
  1084. X  
  1085. X       default:
  1086. X          if (y == NO_YR || m == NO_MON || d == NO_DAY) {
  1087. X!            Eprint("SCANFROM: %s", ErrMsg[E_INCOMPLETE]);
  1088. X!            return E_INCOMPLETE;
  1089. X          }
  1090. X          if (!DateOK(y, m, d)) return E_BAD_DATE;
  1091. X          t->scanfrom = Julian(y, m, d);
  1092. X***************
  1093. X*** 484,490 ****
  1094. X        return OK;
  1095. X  
  1096. X  /* If it's a MSG-type reminder, and no -k option was used, issue the banner. */
  1097. X!    if (t->typ == MSG_TYPE && !NumTriggered && !NextMode && !MsgCommand) {
  1098. X        if (!DoSubstFromString(Banner, SubstBuffer, JulianToday, NO_TIME))
  1099. X           if (*SubstBuffer) printf("%s\n", SubstBuffer);
  1100. X     }
  1101. X--- 445,452 ----
  1102. X        return OK;
  1103. X  
  1104. X  /* If it's a MSG-type reminder, and no -k option was used, issue the banner. */
  1105. X!    if ((t->typ == MSG_TYPE || t->typ == MSF_TYPE) 
  1106. X!        && !NumTriggered && !NextMode && !MsgCommand) {
  1107. X        if (!DoSubstFromString(Banner, SubstBuffer, JulianToday, NO_TIME))
  1108. X           if (*SubstBuffer) printf("%s\n", SubstBuffer);
  1109. X     }
  1110. X***************
  1111. X*** 515,523 ****
  1112. X     }
  1113. X  
  1114. X  /* Otherwise, issue the reminder now */
  1115. X!    if (t->typ == MSG_TYPE) {
  1116. X        if (!MsgCommand)
  1117. X!          printf("%s\n", SubstBuffer);
  1118. X        else {
  1119. X           char buf[LINELEN+TOKSIZE];
  1120. X           sprintf(buf, MsgCommand, SubstBuffer);
  1121. X--- 477,488 ----
  1122. X     }
  1123. X  
  1124. X  /* Otherwise, issue the reminder now */
  1125. X!    if (t->typ == MSG_TYPE || t->typ == MSF_TYPE) {
  1126. X        if (!MsgCommand)
  1127. X!          if (t->typ == MSG_TYPE)
  1128. X!             printf("%s\n", SubstBuffer);
  1129. X!      else
  1130. X!         FillParagraph(SubstBuffer);
  1131. X        else {
  1132. X           char buf[LINELEN+TOKSIZE];
  1133. X           sprintf(buf, MsgCommand, SubstBuffer);
  1134. X*** ../prev/dutch.h    Mon Jun 28 12:29:36 1993
  1135. X--- ./dutch.h    Fri Jul 23 11:32:26 1993
  1136. X***************
  1137. X*** 8,13 ****
  1138. X--- 8,15 ----
  1139. X  /*                                                             */
  1140. X  /*  Modified slightly by David Skoll                           */
  1141. X  /*                                                             */
  1142. X+ /*  Further corrections by Erik-Jan Vens                       */
  1143. X+ /*                                                             */
  1144. X  /*  This file is part of REMIND.                               */
  1145. X  /*  Copyright (C) 1992, 1993 by David F. Skoll.                */
  1146. X  /*                                                             */
  1147. X***************
  1148. X*** 17,46 ****
  1149. X  #define L_LANGNAME "Dutch"
  1150. X  
  1151. X  /* Day names */
  1152. X! #define L_SUNDAY "Zondag"
  1153. X! #define L_MONDAY "Maandag"
  1154. X! #define L_TUESDAY "Dinsdag"
  1155. X! #define L_WEDNESDAY "Woensdag"
  1156. X! #define L_THURSDAY "Donderdag"
  1157. X! #define L_FRIDAY "Vrijdag"
  1158. X! #define L_SATURDAY "Zaterdag"
  1159. X  
  1160. X  /* Day initials - first letter only */
  1161. X! #define L_DAYINIT "ZMDWDVZ"
  1162. X  
  1163. X  /* Month names */
  1164. X! #define L_JAN "Januari"
  1165. X! #define L_FEB "Februari"
  1166. X! #define L_MAR "Maart"
  1167. X! #define L_APR "April"
  1168. X! #define L_MAY "Mei"
  1169. X! #define L_JUN "Juni"
  1170. X! #define L_JUL "Juli"
  1171. X! #define L_AUG "Augustus"
  1172. X! #define L_SEP "September"
  1173. X! #define L_OCT "October"
  1174. X! #define L_NOV "November"
  1175. X! #define L_DEC "December"
  1176. X  
  1177. X  /* Today and tomorrow */
  1178. X  #define L_TODAY "vandaag"
  1179. X--- 19,48 ----
  1180. X  #define L_LANGNAME "Dutch"
  1181. X  
  1182. X  /* Day names */
  1183. X! #define L_SUNDAY "zondag"
  1184. X! #define L_MONDAY "maandag"
  1185. X! #define L_TUESDAY "dinsdag"
  1186. X! #define L_WEDNESDAY "woensdag"
  1187. X! #define L_THURSDAY "donderdag"
  1188. X! #define L_FRIDAY "vrijdag"
  1189. X! #define L_SATURDAY "zaterdag"
  1190. X  
  1191. X  /* Day initials - first letter only */
  1192. X! #define L_DAYINIT "zmdwdvz"
  1193. X  
  1194. X  /* Month names */
  1195. X! #define L_JAN "januari"
  1196. X! #define L_FEB "februari"
  1197. X! #define L_MAR "maart"
  1198. X! #define L_APR "april"
  1199. X! #define L_MAY "mei"
  1200. X! #define L_JUN "juni"
  1201. X! #define L_JUL "juli"
  1202. X! #define L_AUG "augustus"
  1203. X! #define L_SEP "september"
  1204. X! #define L_OCT "oktober"
  1205. X! #define L_NOV "november"
  1206. X! #define L_DEC "december"
  1207. X  
  1208. X  /* Today and tomorrow */
  1209. X  #define L_TODAY "vandaag"
  1210. X*** ../prev/err.h    Mon Jun 28 12:29:30 1993
  1211. X--- ./err.h    Fri Aug 20 11:43:18 1993
  1212. X***************
  1213. X*** 9,14 ****
  1214. X--- 9,19 ----
  1215. X  /*                                                             */
  1216. X  /***************************************************************/
  1217. X  
  1218. X+ /* Note that not all of the "errors" are really errors - some are just
  1219. X+    messages for information purposes.  Constants beginning with M_ should
  1220. X+    never be returned as error indicators - they should only be used to
  1221. X+    index the ErrMsg array. */
  1222. X+ 
  1223. X  #define OK                    0
  1224. X  #define E_MISS_END            1
  1225. X  #define E_MISS_QUOTE          2
  1226. X***************
  1227. X*** 58,63 ****
  1228. X--- 63,119 ----
  1229. X                                     as a REM statement, also. */
  1230. X  #define E_CANT_MODIFY        45
  1231. X  #define E_MKTIME_PROBLEM     46
  1232. X+ #define E_REDEF_FUNC         47
  1233. X+ #define E_CANTNEST_FDEF      48
  1234. X+ #define E_REP_FULSPEC        49
  1235. X+ #define E_YR_TWICE         50
  1236. X+ #define E_MON_TWICE         51
  1237. X+ #define E_DAY_TWICE         52
  1238. X+ #define E_UNKNOWN_TOKEN         53
  1239. X+ #define E_SPEC_MON_DAY         54
  1240. X+ #define E_2MANY_PART         55
  1241. X+ #define E_2MANY_FULL         56
  1242. X+ #define E_PUSH_NOPOP         57
  1243. X+ #define E_ERR_READING         58
  1244. X+ #define E_EXPECTING_EOL         59
  1245. X+ #define E_BAD_HEBDATE         60
  1246. X+ #define E_IIF_ODD         61
  1247. X+ #define E_MISS_ENDIF         62
  1248. X+ #define E_EXPECT_COMMA         63
  1249. X+ #define E_WD_TWICE         64
  1250. X+ #define E_SKIP_ERR         65
  1251. X+ #define E_CANT_NEST_RTYPE    66
  1252. X+ #define E_REP_TWICE         67
  1253. X+ #define E_DELTA_TWICE         68
  1254. X+ #define E_BACK_TWICE         69
  1255. X+ #define E_ONCE_TWICE         70
  1256. X+ #define E_EXPECT_TIME         71
  1257. X+ #define E_UNTIL_TWICE         72
  1258. X+ #define E_INCOMPLETE         73
  1259. X+ #define E_SCAN_TWICE         74
  1260. X+ #define E_VAR             75
  1261. X+ #define E_VAL             76
  1262. X+ #define E_UNDEF             77
  1263. X+ #define E_ENTER_FUN         78
  1264. X+ #define E_LEAVE_FUN         79
  1265. X+ #define E_EXPIRED         80
  1266. X+ #define E_CANTFORK         81
  1267. X+ #define E_CANTACCESS         82
  1268. X+ #define M_BAD_SYS_DATE         83
  1269. X+ #define M_BAD_DB_FLAG         84
  1270. X+ #define M_BAD_OPTION         85
  1271. X+ #define M_BAD_USER         86
  1272. X+ #define M_NO_CHG_GID         87
  1273. X+ #define M_NO_CHG_UID         88
  1274. X+ #define M_NOMEM_ENV         89
  1275. X+ #define E_MISS_EQ         90
  1276. X+ #define E_MISS_VAR         91
  1277. X+ #define E_MISS_EXPR         92
  1278. X+ #define M_CANTSET_ACCESS     93
  1279. X+ #define M_I_OPTION         94
  1280. X+ #define E_NOREMINDERS         95
  1281. X+ #define M_QUEUED         96
  1282. X+ 
  1283. X  #ifdef MK_GLOBALS
  1284. X  #undef EXTERN
  1285. X  #define EXTERN
  1286. X***************
  1287. X*** 66,71 ****
  1288. X--- 122,128 ----
  1289. X  #define EXTERN extern
  1290. X  #endif
  1291. X  
  1292. X+ #ifndef L_ERR_OVERRIDE
  1293. X  EXTERN char *ErrMsg[]
  1294. X  
  1295. X  #ifdef MK_GLOBALS
  1296. X***************
  1297. X*** 116,122 ****
  1298. X     "Recursive function call detected",
  1299. X     "",
  1300. X     "Cannot modify system variable",
  1301. X!    "C library function can't represent date/time"
  1302. X  }
  1303. X! #endif
  1304. X  ;
  1305. X--- 173,230 ----
  1306. X     "Recursive function call detected",
  1307. X     "",
  1308. X     "Cannot modify system variable",
  1309. X!    "C library function can't represent date/time",
  1310. X!    "Attempt to redefine built-in function",
  1311. X!    "Can't nest function definition in expression",
  1312. X!    "Must fully specify date to use repeat factor",
  1313. X!    "Year specified twice",
  1314. X!    "Month specified twice",
  1315. X!    "Day specified twice",
  1316. X!    "Unknown token",
  1317. X!    "Must specify month and day in OMIT command",
  1318. X!    "Too many partial OMITs",
  1319. X!    "Too many full OMITs",
  1320. X!    "Warning: PUSH-OMIT-CONTEXT without matching POP-OMIT-CONTEXT",
  1321. X!    "Error reading file",
  1322. X!    "Expecting end-of-line",
  1323. X!    "Invalid Hebrew date",
  1324. X!    "IIF needs odd number of arguments",
  1325. X!    "Warning: Missing ENDIF",
  1326. X!    "Expecting comma",
  1327. X!    "Weekday specified twice",
  1328. X!    "Only use one of BEFORE, AFTER or SKIP",
  1329. X!    "Can't nest MSG, MSF, RUN, etc. in expression",
  1330. X!    "Repeat value specified twice",
  1331. X!    "Delta value specified twice",
  1332. X!    "Back value specified twice",
  1333. X!    "ONCE keyword used twice. (Hah.)",
  1334. X!    "Expecting time after AT",
  1335. X!    "UNTIL keyword used twice",
  1336. X!    "Incomplete date specification",
  1337. X!    "SCANFROM keyword used twice",
  1338. X!    "Variable",
  1339. X!    "Value",
  1340. X!    "*UNDEFINED*",
  1341. X!    "Entering UserFN",
  1342. X!    "Leaving UserFN",
  1343. X!    "Expired",
  1344. X!    "fork() failed - can't do queued reminders",
  1345. X!    "Can't access file",
  1346. X!    "Illegal system date: Year is less than %d\n",
  1347. X!    "Unknown debug flag '%c'\n",
  1348. X!    "Unknown option '%c'\n",
  1349. X!    "Unknown user '%s'\n",
  1350. X!    "Could not change gid to %d\n",
  1351. X!    "Could not change uid to %d\n",
  1352. X!    "Out of memory for environment\n",
  1353. X!    "Missing '=' sign",
  1354. X!    "Missing variable name",
  1355. X!    "Missing expression",
  1356. X!    "Can't reset access date of %s\n",
  1357. X!    "Remind: '-i' option: %s\n",
  1358. X!    "No reminders.",
  1359. X!    "%d reminder(s) queued for later today.\n"
  1360. X  }
  1361. X! #endif /* MK_GLOBALS */
  1362. X  ;
  1363. X+ #endif /* L_ERR_OVERRIDE */
  1364. X*** ../prev/expr.c    Mon Jun 28 12:29:43 1993
  1365. X--- ./expr.c    Thu Aug 19 16:24:24 1993
  1366. X***************
  1367. X*** 349,356 ****
  1368. X             if (*ExprBuf == ')') break;
  1369. X             else if (*ExprBuf != ',') {
  1370. X                if (!f) free(ufname);
  1371. X!            Eprint("Expecting comma, found '%c'", *ExprBuf);
  1372. X!               return E_ILLEGAL_CHAR;
  1373. X                 }
  1374. X              }
  1375. X          if (f) r = CallFunc(f, args);
  1376. X--- 349,356 ----
  1377. X             if (*ExprBuf == ')') break;
  1378. X             else if (*ExprBuf != ',') {
  1379. X                if (!f) free(ufname);
  1380. X!            Eprint("%s: '%c'", ErrMsg[E_EXPECT_COMMA], *ExprBuf);
  1381. X!               return E_EXPECT_COMMA;
  1382. X                 }
  1383. X              }
  1384. X          if (f) r = CallFunc(f, args);
  1385. X***************
  1386. X*** 392,398 ****
  1387. X          else
  1388. X             r=(op.func)();
  1389. X            if (r) {
  1390. X!            Eprint("Operator '%s' %s", op.name, ErrMsg[r]);
  1391. X             return r;
  1392. X              }
  1393. X       }
  1394. X--- 392,398 ----
  1395. X          else
  1396. X             r=(op.func)();
  1397. X            if (r) {
  1398. X!            Eprint("'%s': %s", op.name, ErrMsg[r]);
  1399. X             return r;
  1400. X              }
  1401. X       }
  1402. X***************
  1403. X*** 412,418 ****
  1404. X       else
  1405. X          r=(op2.func)();
  1406. X       if (r) {
  1407. X!         Eprint("Operator '%s' %s", op2.name, ErrMsg[r]);
  1408. X          return r;
  1409. X           }
  1410. X        }
  1411. X--- 412,418 ----
  1412. X       else
  1413. X          r=(op2.func)();
  1414. X       if (r) {
  1415. X!         Eprint("'%s': %s", op2.name, ErrMsg[r]);
  1416. X          return r;
  1417. X           }
  1418. X        }
  1419. X*** ../prev/files.c    Mon Jun 28 12:29:44 1993
  1420. X--- ./files.c    Thu Aug 26 10:47:48 1993
  1421. X***************
  1422. X*** 38,43 ****
  1423. X--- 38,47 ----
  1424. X  #include "globals.h"
  1425. X  #include "err.h"
  1426. X  
  1427. X+ 
  1428. X+ /* Convenient macro for closing files */
  1429. X+ #define FCLOSE(fp) (((fp)&&((fp)!=stdin)) ? (fclose(fp),(fp)=NULL) : ((fp)=NULL))
  1430. X+ 
  1431. X  /* Define the structures needed by the file caching system */
  1432. X  typedef struct cache {
  1433. X     struct cache *next;
  1434. X***************
  1435. X*** 124,140 ****
  1436. X  {
  1437. X     int l;
  1438. X     char *ptr;
  1439. X  
  1440. X     *LineBuffer = (char) 0;
  1441. X     l = 0;
  1442. X     ptr = LineBuffer;
  1443. X     while(fp) {
  1444. X!       (void) fgets(ptr, LINELEN-l, fp);
  1445. X        LineNo++;
  1446. X        if (ferror(fp)) return E_IO_ERR;
  1447. X!       if (feof(fp)) {
  1448. X!          fclose(fp);
  1449. X!      fp = NULL;
  1450. X        }
  1451. X        l = strlen(LineBuffer);
  1452. X        if (l && (LineBuffer[l-1] == '\n')) LineBuffer[--l] = '\0';
  1453. X--- 128,144 ----
  1454. X  {
  1455. X     int l;
  1456. X     char *ptr;
  1457. X+    char *tmp;
  1458. X  
  1459. X     *LineBuffer = (char) 0;
  1460. X     l = 0;
  1461. X     ptr = LineBuffer;
  1462. X     while(fp) {
  1463. X!       tmp=fgets(ptr, LINELEN-l, fp);
  1464. X        LineNo++;
  1465. X        if (ferror(fp)) return E_IO_ERR;
  1466. X!       if (feof(fp) || !tmp) {
  1467. X!          FCLOSE(fp);
  1468. X        }
  1469. X        l = strlen(LineBuffer);
  1470. X        if (l && (LineBuffer[l-1] == '\n')) LineBuffer[--l] = '\0';
  1471. X***************
  1472. X*** 181,187 ****
  1473. X        }
  1474. X        h = h->next;
  1475. X     }
  1476. X!    fp = fopen(fname, "r");
  1477. X     if (!fp) return E_CANT_OPEN;
  1478. X     CLine = NULL;
  1479. X     if (ShouldCache) {
  1480. X--- 185,197 ----
  1481. X        }
  1482. X        h = h->next;
  1483. X     }
  1484. X! 
  1485. X! /* If it's a dash, then it's stdin */
  1486. X!    if (!strcmp(fname, "-")) {
  1487. X!       fp = stdin;
  1488. X!    } else {
  1489. X!       fp = fopen(fname, "r");
  1490. X!    }
  1491. X     if (!fp) return E_CANT_OPEN;
  1492. X     CLine = NULL;
  1493. X     if (ShouldCache) {
  1494. X***************
  1495. X*** 191,197 ****
  1496. X           fp = NULL;
  1497. X       CLine = CachedFiles->cache;
  1498. X        } else {
  1499. X!          fp = fopen(fname, "r");
  1500. X       if (!fp) return E_CANT_OPEN;
  1501. X        }
  1502. X     }
  1503. X--- 201,210 ----
  1504. X           fp = NULL;
  1505. X       CLine = CachedFiles->cache;
  1506. X        } else {
  1507. X!          if (strcmp(fname, "-"))
  1508. X!             fp = fopen(fname, "r");
  1509. X!          else
  1510. X!         fp = stdin;
  1511. X       if (!fp) return E_CANT_OPEN;
  1512. X        }
  1513. X     }
  1514. X***************
  1515. X*** 224,234 ****
  1516. X  /* Create a file header */
  1517. X     cf = NEW(CachedFile);
  1518. X     cf->cache = NULL;
  1519. X!    if (!cf) { ShouldCache = 0; fclose(fp); return E_NO_MEM; }
  1520. X     cf->filename = StrDup(fname);
  1521. X     if (!cf->filename) {
  1522. X        ShouldCache = 0;
  1523. X!       fclose(fp);
  1524. X        free(cf);
  1525. X        return E_NO_MEM;
  1526. X     }
  1527. X--- 237,247 ----
  1528. X  /* Create a file header */
  1529. X     cf = NEW(CachedFile);
  1530. X     cf->cache = NULL;
  1531. X!    if (!cf) { ShouldCache = 0; FCLOSE(fp); return E_NO_MEM; }
  1532. X     cf->filename = StrDup(fname);
  1533. X     if (!cf->filename) {
  1534. X        ShouldCache = 0;
  1535. X!       FCLOSE(fp);
  1536. X        free(cf);
  1537. X        return E_NO_MEM;
  1538. X     }
  1539. X***************
  1540. X*** 239,245 ****
  1541. X        if (r) {
  1542. X           DestroyCache(cf);
  1543. X       ShouldCache = 0;
  1544. X!      if(fp) fclose(fp);
  1545. X       return r;
  1546. X        }
  1547. X  /* Skip blank chars */
  1548. X--- 252,258 ----
  1549. X        if (r) {
  1550. X           DestroyCache(cf);
  1551. X       ShouldCache = 0;
  1552. X!      FCLOSE(fp);
  1553. X       return r;
  1554. X        }
  1555. X  /* Skip blank chars */
  1556. X***************
  1557. X*** 252,258 ****
  1558. X          if (!cf->cache) {
  1559. X             DestroyCache(cf);
  1560. X             ShouldCache = 0;
  1561. X!            if(fp) fclose(fp);
  1562. X             return E_NO_MEM;
  1563. X              }
  1564. X          cl = cf->cache;
  1565. X--- 265,271 ----
  1566. X          if (!cf->cache) {
  1567. X             DestroyCache(cf);
  1568. X             ShouldCache = 0;
  1569. X!            FCLOSE(fp);
  1570. X             return E_NO_MEM;
  1571. X              }
  1572. X          cl = cf->cache;
  1573. X***************
  1574. X*** 261,267 ****
  1575. X          if (!cl->next) {
  1576. X             DestroyCache(cf);
  1577. X             ShouldCache = 0;
  1578. X!            if(fp) fclose(fp);
  1579. X             return E_NO_MEM;
  1580. X              }
  1581. X          cl = cl->next;
  1582. X--- 274,280 ----
  1583. X          if (!cl->next) {
  1584. X             DestroyCache(cf);
  1585. X             ShouldCache = 0;
  1586. X!            FCLOSE(fp);
  1587. X             return E_NO_MEM;
  1588. X              }
  1589. X          cl = cl->next;
  1590. X***************
  1591. X*** 272,278 ****
  1592. X       if (!cl->text) {
  1593. X          DestroyCache(cf);
  1594. X          ShouldCache = 0;
  1595. X!         if(fp) fclose(fp);
  1596. X          return E_NO_MEM;
  1597. X           }
  1598. X        }
  1599. X--- 285,291 ----
  1600. X       if (!cl->text) {
  1601. X          DestroyCache(cf);
  1602. X          ShouldCache = 0;
  1603. X!         FCLOSE(fp);
  1604. X          return E_NO_MEM;
  1605. X           }
  1606. X        }
  1607. X***************
  1608. X*** 299,305 ****
  1609. X  {
  1610. X     IncludeStruct *i;
  1611. X  
  1612. X!    if (!Hush && NumIfs) Eprint("Warning: Missing ENDIF");
  1613. X     if (!IStackPtr) return E_EOF;
  1614. X     IStackPtr--;
  1615. X     i = &IStack[IStackPtr];
  1616. X--- 312,318 ----
  1617. X  {
  1618. X     IncludeStruct *i;
  1619. X  
  1620. X!    if (!Hush && NumIfs) Eprint("%s", ErrMsg[E_MISS_ENDIF]);
  1621. X     if (!IStackPtr) return E_EOF;
  1622. X     IStackPtr--;
  1623. X     i = &IStack[IStackPtr];
  1624. X***************
  1625. X*** 312,320 ****
  1626. X     STRSET(FileName, i->filename);
  1627. X     if (!CLine && (i->offset != -1L)) {
  1628. X     /* We must open the file, then seek to specified position */
  1629. X!       fp = fopen(i->filename, "r");
  1630. X        if (!fp) return E_CANT_OPEN;
  1631. X!       (void) fseek(fp, i->offset, 0);  /* Trust that it works... */
  1632. X     }
  1633. X     free(i->filename);
  1634. X     return OK;
  1635. X--- 325,337 ----
  1636. X     STRSET(FileName, i->filename);
  1637. X     if (!CLine && (i->offset != -1L)) {
  1638. X     /* We must open the file, then seek to specified position */
  1639. X!       if (strcmp(i->filename, "-"))
  1640. X!          fp = fopen(i->filename, "r");
  1641. X!       else
  1642. X!          fp = stdin;
  1643. X        if (!fp) return E_CANT_OPEN;
  1644. X!       if (fp != stdin)
  1645. X!          (void) fseek(fp, i->offset, 0);  /* Trust that it works... */
  1646. X     }
  1647. X     free(i->filename);
  1648. X     return OK;
  1649. X***************
  1650. X*** 376,383 ****
  1651. X     i->offset = -1L;
  1652. X     if (fp) {
  1653. X        i->offset = ftell(fp);
  1654. X!       fclose(fp);
  1655. X!       fp = (FILE *) NULL;
  1656. X     }
  1657. X  
  1658. X     IStackPtr++;
  1659. X--- 393,399 ----
  1660. X     i->offset = -1L;
  1661. X     if (fp) {
  1662. X        i->offset = ftell(fp);
  1663. X!       FCLOSE(fp);
  1664. X     }
  1665. X  
  1666. X     IStackPtr++;
  1667. X***************
  1668. X*** 388,393 ****
  1669. X--- 404,410 ----
  1670. X     }
  1671. X     /* Ugh!  We failed!  */
  1672. X     if ( (r=PopFile()) ) return r;
  1673. X+    Eprint("%s: %s", ErrMsg[E_CANT_OPEN], fname);
  1674. X     return E_CANT_OPEN;
  1675. X  }
  1676. X  
  1677. X***************
  1678. X*** 468,483 ****
  1679. X  #else /* Must be MSC */
  1680. X     if (utime(fname, (struct utimbuf *) NULL)) {
  1681. X  #endif       
  1682. X!       fprintf(ErrFp, "Can't reset access date of %s\n", fname);
  1683. X  
  1684. X  #ifdef __TURBOC__
  1685. X!       if (f) fclose(f);
  1686. X  #endif
  1687. X        return -1;
  1688. X     }
  1689. X  
  1690. X  #ifdef __TURBOC__
  1691. X!    fclose(f);
  1692. X  #endif
  1693. X  
  1694. X     return 0;
  1695. X--- 485,500 ----
  1696. X  #else /* Must be MSC */
  1697. X     if (utime(fname, (struct utimbuf *) NULL)) {
  1698. X  #endif       
  1699. X!       fprintf(ErrFp, ErrMsg[M_CANTSET_ACCESS], fname);
  1700. X  
  1701. X  #ifdef __TURBOC__
  1702. X!       if (f) FCLOSE(f);
  1703. X  #endif
  1704. X        return -1;
  1705. X     }
  1706. X  
  1707. X  #ifdef __TURBOC__
  1708. X!    FCLOSE(f);
  1709. X  #endif
  1710. X  
  1711. X     return 0;
  1712. X*** ../prev/funcs.c    Fri Jul 16 15:23:44 1993
  1713. X--- ./funcs.c    Thu Aug 19 16:58:12 1993
  1714. X***************
  1715. X*** 27,32 ****
  1716. X--- 27,35 ----
  1717. X  #include <sys/file.h>
  1718. X  #endif
  1719. X  #endif
  1720. X+ #include <sys/types.h>
  1721. X+ #include <sys/stat.h>
  1722. X+ #include <time.h>
  1723. X  #ifdef __MSDOS__
  1724. X  #include <io.h>
  1725. X  #define R_OK 4
  1726. X***************
  1727. X*** 60,65 ****
  1728. X--- 63,69 ----
  1729. X  PRIVATE    int    FDefined    ARGS ((void));
  1730. X  PRIVATE    int    FDosubst    ARGS ((void));
  1731. X  PRIVATE    int    FEasterdate    ARGS ((void));
  1732. X+ PRIVATE int    FFiledate    ARGS ((void));
  1733. X  PRIVATE    int    FFiledir    ARGS ((void));
  1734. X  PRIVATE    int    FFilename    ARGS ((void));
  1735. X  PRIVATE    int    FGetenv        ARGS ((void));
  1736. X***************
  1737. X*** 170,175 ****
  1738. X--- 174,180 ----
  1739. X      {   "defined",    1,    1,    FDefined },
  1740. X      {   "dosubst",    1,    3,    FDosubst },
  1741. X      {   "easterdate",    1,    1,    FEasterdate },
  1742. X+     {    "filedate",    1,    1,    FFiledate },
  1743. X      {    "filedir",    0,    0,    FFiledir },
  1744. X      {   "filename",    0,    0,    FFilename },
  1745. X      {   "getenv",    1,    1,    FGetenv },
  1746. X***************
  1747. X*** 532,538 ****
  1748. X  /* Special case of one arg - if given ascii value 0, create empty string */
  1749. X     if (Nargs == 1) {
  1750. X        if (ARG(0).type != INT_TYPE) return E_BAD_TYPE;
  1751. X!       if (ARG(0).v.val < 0) return E_2LOW;
  1752. X        if (ARG(0).v.val > 255) return E_2HIGH;
  1753. X        len = ARG(0).v.val ? 2 : 1;
  1754. X        RetVal.v.str = (char *) malloc(len);
  1755. X--- 537,543 ----
  1756. X  /* Special case of one arg - if given ascii value 0, create empty string */
  1757. X     if (Nargs == 1) {
  1758. X        if (ARG(0).type != INT_TYPE) return E_BAD_TYPE;
  1759. X!       if (ARG(0).v.val < -128) return E_2LOW;
  1760. X        if (ARG(0).v.val > 255) return E_2HIGH;
  1761. X        len = ARG(0).v.val ? 2 : 1;
  1762. X        RetVal.v.str = (char *) malloc(len);
  1763. X***************
  1764. X*** 548,554 ****
  1765. X     RetVal.type = STR_TYPE;
  1766. X     for (i=0; i<Nargs; i++) {
  1767. X       if (ARG(i).type != INT_TYPE) return E_BAD_TYPE;
  1768. X!      if (ARG(i).v.val < 1) return E_2LOW;
  1769. X       if (ARG(i).v.val > 255) return E_2HIGH;
  1770. X       *(RetVal.v.str + i) = ARG(i).v.val;
  1771. X     }
  1772. X--- 553,559 ----
  1773. X     RetVal.type = STR_TYPE;
  1774. X     for (i=0; i<Nargs; i++) {
  1775. X       if (ARG(i).type != INT_TYPE) return E_BAD_TYPE;
  1776. X!      if (ARG(i).v.val < -128 || ARG(i).v.val == 0) return E_2LOW;
  1777. X       if (ARG(i).v.val > 255) return E_2HIGH;
  1778. X       *(RetVal.v.str + i) = ARG(i).v.val;
  1779. X     }
  1780. X***************
  1781. X*** 1348,1357 ****
  1782. X     int istrue;
  1783. X     int arg;
  1784. X  
  1785. X!    if (!(Nargs % 2)) {
  1786. X!       Eprint("IIF needs odd number of args");
  1787. X!       return E_2FEW_ARGS;
  1788. X!    }
  1789. X  
  1790. X     for (arg=0; arg<Nargs-1; arg += 2) {
  1791. X        if (ARG(arg).type != STR_TYPE && ARG(arg).type != INT_TYPE)
  1792. X--- 1353,1359 ----
  1793. X     int istrue;
  1794. X     int arg;
  1795. X  
  1796. X!    if (!(Nargs % 2)) return E_IIF_ODD;
  1797. X  
  1798. X     for (arg=0; arg<Nargs-1; arg += 2) {
  1799. X        if (ARG(arg).type != STR_TYPE && ARG(arg).type != INT_TYPE)
  1800. X***************
  1801. X*** 1621,1630 ****
  1802. X     if (ARG(0).type != INT_TYPE || ARG(1).type != STR_TYPE) return E_BAD_TYPE;
  1803. X     day = ARG(0).v.val;
  1804. X     mon = HebNameToNum(ARG(1).v.str);
  1805. X!    if (mon < 0) {
  1806. X!       Eprint("Invalid Hebrew month");
  1807. X!       return E_BAD_DATE;
  1808. X!    }
  1809. X     if (Nargs == 2) {
  1810. X        r = GetNextHebrewDate(JulianToday, mon, day, 0, 0, &ans);
  1811. X        if (r) return r;
  1812. X--- 1623,1629 ----
  1813. X     if (ARG(0).type != INT_TYPE || ARG(1).type != STR_TYPE) return E_BAD_TYPE;
  1814. X     day = ARG(0).v.val;
  1815. X     mon = HebNameToNum(ARG(1).v.str);
  1816. X!    if (mon < 0) return E_BAD_HEBDATE;
  1817. X     if (Nargs == 2) {
  1818. X        r = GetNextHebrewDate(JulianToday, mon, day, 0, 0, &ans);
  1819. X        if (r) return r;
  1820. X***************
  1821. X*** 2005,2008 ****
  1822. X--- 2004,2046 ----
  1823. X  #endif
  1824. X  {
  1825. X     return FSun(0);
  1826. X+ }
  1827. X+ 
  1828. X+ /***************************************************************/
  1829. X+ /*                                                             */
  1830. X+ /*  FFiledate                                                  */
  1831. X+ /*                                                             */
  1832. X+ /*  Return modification date of a file                         */
  1833. X+ /*                                                             */
  1834. X+ /***************************************************************/
  1835. X+ #ifdef HAVE_PROTOS
  1836. X+ PRIVATE int FFiledate(void)
  1837. X+ #else
  1838. X+ static int FFiledate()
  1839. X+ #endif
  1840. X+ {
  1841. X+    struct stat statbuf;
  1842. X+    struct tm *t1;
  1843. X+ 
  1844. X+    RetVal.type = DATE_TYPE;
  1845. X+ 
  1846. X+    if (ARG(0).type != STR_TYPE) return E_BAD_TYPE;
  1847. X+ 
  1848. X+    if (stat(ARG(0).v.str, &statbuf)) {
  1849. X+       RetVal.v.val = 0;
  1850. X+       return OK;
  1851. X+    }
  1852. X+ 
  1853. X+ #ifdef __TURBOC__
  1854. X+    t1 = localtime( (time_t *) &(statbuf.st_mtime) );
  1855. X+ #else
  1856. X+    t1 = localtime(&(statbuf.st_mtime));
  1857. X+ #endif
  1858. X+ 
  1859. X+    if (t1->tm_year + 1900 < BASE)
  1860. X+       RetVal.v.val=0;
  1861. X+    else
  1862. X+       RetVal.v.val=Julian(t1->tm_year+1900, t1->tm_mon, t1->tm_mday);
  1863. X+ 
  1864. X+    return OK;
  1865. X  }
  1866. X*** ../prev/globals.h    Mon Jun 28 12:29:31 1993
  1867. X--- ./globals.h    Thu Aug 19 15:46:05 1993
  1868. X***************
  1869. X*** 10,16 ****
  1870. X  /*  Copyright (C) 1992, 1993 by David F. Skoll.                */
  1871. X  /*                                                             */
  1872. X  /***************************************************************/
  1873. X- #include "lang.h"
  1874. X  #ifdef MK_GLOBALS
  1875. X  #undef EXTERN
  1876. X  #define EXTERN
  1877. X--- 10,15 ----
  1878. X***************
  1879. X*** 49,55 ****
  1880. X  EXTERN  INIT(    int     InfiniteDelta, 0);
  1881. X  EXTERN  INIT(   int     RunDisabled, 0);
  1882. X  EXTERN  INIT(   int     IgnoreOnce, 0);
  1883. X- EXTERN  INIT(   char    Banner[LINELEN], L_BANNER);
  1884. X  EXTERN  INIT(   int     SortByTime, 0);
  1885. X  EXTERN  INIT(   int     SortByDate, 0);
  1886. X  
  1887. X--- 48,53 ----
  1888. X***************
  1889. X*** 66,71 ****
  1890. X--- 64,70 ----
  1891. X  EXTERN  INIT(   int     ScFormat, SC_AMPM);
  1892. X  EXTERN  INIT(   int     MaxSatIter, 150);
  1893. X  EXTERN  INIT(    char    *FileName, NULL);
  1894. X+ EXTERN    INIT(    int    UseStdin, 0);
  1895. X  EXTERN  FILE *ErrFp;
  1896. X  EXTERN  INIT(   int     NumIfs,    0);
  1897. X  EXTERN  INIT(   unsigned int IfFlags,   0);
  1898. X***************
  1899. X*** 84,97 ****
  1900. X  EXTERN  INIT(    int      LatDeg, LAT_DEG);
  1901. X  EXTERN  INIT(    int      LatMin, LAT_MIN);
  1902. X  EXTERN  INIT(    int      LatSec, LAT_SEC);
  1903. X! EXTERN  INIT(    int      LongDeg, LONG_DEG);
  1904. X! EXTERN  INIT(    int      LongMin, LONG_MIN);
  1905. X! EXTERN  INIT(    int      LongSec, LONG_SEC);
  1906. X  
  1907. X  /* UTC calculation stuff */
  1908. X  EXTERN  INIT(    int      MinsFromUTC, 0);
  1909. X  EXTERN    INIT(    int      CalculateUTC, 1);
  1910. X  EXTERN  INIT(   int      FoldYear, 0);
  1911. X  /* List of months */
  1912. X  EXTERN    char    *MonthName[]
  1913. X  #ifdef MK_GLOBALS
  1914. X--- 83,108 ----
  1915. X  EXTERN  INIT(    int      LatDeg, LAT_DEG);
  1916. X  EXTERN  INIT(    int      LatMin, LAT_MIN);
  1917. X  EXTERN  INIT(    int      LatSec, LAT_SEC);
  1918. X! EXTERN  INIT(    int      LongDeg, LON_DEG);
  1919. X! EXTERN  INIT(    int      LongMin, LON_MIN);
  1920. X! EXTERN  INIT(    int      LongSec, LON_SEC);
  1921. X  
  1922. X  /* UTC calculation stuff */
  1923. X  EXTERN  INIT(    int      MinsFromUTC, 0);
  1924. X  EXTERN    INIT(    int      CalculateUTC, 1);
  1925. X  EXTERN  INIT(   int      FoldYear, 0);
  1926. X+ 
  1927. X+ /* Parameters for formatting MSGF reminders */
  1928. X+ EXTERN  INIT(   int      FormWidth, 72);
  1929. X+ EXTERN    INIT(    int      FirstIndent, 0);
  1930. X+ EXTERN    INIT(    int      SubsIndent, 0);
  1931. X+ 
  1932. X+ /* We need the language stuff here... */
  1933. X+ 
  1934. X+ #include "lang.h"
  1935. X+ 
  1936. X+ EXTERN  INIT(   char    Banner[LINELEN], L_BANNER);
  1937. X+ 
  1938. X  /* List of months */
  1939. X  EXTERN    char    *MonthName[]
  1940. X  #ifdef MK_GLOBALS
  1941. X*** ../prev/hbcal.c    Mon Jun 28 12:29:49 1993
  1942. X--- ./hbcal.c    Thu Aug 19 16:21:14 1993
  1943. X***************
  1944. X*** 344,351 ****
  1945. X     /* Do some error checking */
  1946. X     if (din < 1 || din > MaxMonLen[min] || min < 0 || min > 13) {
  1947. X        *dout = -1;
  1948. X!       Eprint("Invalid Hebrew date");
  1949. X!       return E_BAD_DATE;
  1950. X     }
  1951. X  
  1952. X     ylen = DaysInHebYear(yin);
  1953. X--- 344,350 ----
  1954. X     /* Do some error checking */
  1955. X     if (din < 1 || din > MaxMonLen[min] || min < 0 || min > 13) {
  1956. X        *dout = -1;
  1957. X!       return E_BAD_HEBDATE;
  1958. X     }
  1959. X  
  1960. X     ylen = DaysInHebYear(yin);
  1961. X***************
  1962. X*** 512,529 ****
  1963. X  /* Check for Adar A */
  1964. X     if (m == ADARA && monlen[m] == 0) {
  1965. X        Eprint("No Adar A in %d", y);
  1966. X!       return E_BAD_DATE;
  1967. X     }
  1968. X  
  1969. X  
  1970. X     if (d < 1 || d > MaxMonLen[m] || m < 0 || m > 13) {
  1971. X!       Eprint("Invalid Hebrew date");
  1972. X!       return E_BAD_DATE;
  1973. X     }
  1974. X  
  1975. X     if (d > monlen[m]) {
  1976. X!       Eprint("No %d %s %d", d, HebMonthNames[m], y);
  1977. X!       return E_BAD_DATE;
  1978. X     }
  1979. X  
  1980. X  /* If the jahrzeit was in Adar A, we always use JAHR_BACKWARD */
  1981. X--- 511,527 ----
  1982. X  /* Check for Adar A */
  1983. X     if (m == ADARA && monlen[m] == 0) {
  1984. X        Eprint("No Adar A in %d", y);
  1985. X!       return E_BAD_HEBDATE;
  1986. X     }
  1987. X  
  1988. X  
  1989. X     if (d < 1 || d > MaxMonLen[m] || m < 0 || m > 13) {
  1990. X!       return E_BAD_HEBDATE;
  1991. X     }
  1992. X  
  1993. X     if (d > monlen[m]) {
  1994. X!       Eprint("%d %s %d: %s", d, HebMonthNames[m], y, ErrMsg[E_BAD_HEBDATE]);
  1995. X!       return E_BAD_HEBDATE;
  1996. X     }
  1997. X  
  1998. X  /* If the jahrzeit was in Adar A, we always use JAHR_BACKWARD */
  1999. END_OF_FILE
  2000.   if test 52275 -ne `wc -c <'patch.08.B'`; then
  2001.     echo shar: \"'patch.08.B'\" unpacked with wrong size!
  2002.   elif test -f 'patch.08.A' && test -f 'patch.08.C'; then
  2003.     echo shar: Combining  \"'patch.08'\" \(120124 characters\)
  2004.     cat 'patch.08.A' 'patch.08.B' 'patch.08.C' > 'patch.08'
  2005.     if test 120124 -ne `wc -c <'patch.08'`; then
  2006.       echo shar: \"'patch.08'\" combined with wrong size!
  2007.     else
  2008.       rm patch.08.A patch.08.B patch.08.C
  2009.     fi
  2010.   fi
  2011.   # end of 'patch.08.B'
  2012. fi
  2013. echo shar: End of archive 1 \(of 3\).
  2014. cp /dev/null ark1isdone
  2015. MISSING=""
  2016. for I in 1 2 3 ; do
  2017.     if test ! -f ark${I}isdone ; then
  2018.     MISSING="${MISSING} ${I}"
  2019.     fi
  2020. done
  2021. if test "${MISSING}" = "" ; then
  2022.     echo You have unpacked all 3 archives.
  2023.     rm -f ark[1-9]isdone
  2024. else
  2025.     echo You still must unpack the following archives:
  2026.     echo "        " ${MISSING}
  2027. fi
  2028. exit 0
  2029. exit 0 # Just in case...
  2030.