home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 2 / 2026 < prev    next >
Encoding:
Internet Message Format  |  1990-12-28  |  37.1 KB

  1. From: dfs@doe.carleton.ca (David F. Skoll)
  2. Newsgroups: alt.sources
  3. Subject: REMIND 2.0 01/03
  4. Message-ID: <dfs.657485915@yar>
  5. Date: 1 Nov 90 18:58:35 GMT
  6.  
  7. REMIND is a sophisticated reminder service, with many more features than
  8. the Unix calendar command.  It includes the ability to specify holidays,
  9. advance warning of reminders, sophisticated date specifications, and
  10. the ability to format output in a convenient way.
  11.  
  12. REMIND was written originally for MS-DOS and then ported to Unix.
  13. It has been compiled on a Sun 3 and a Sun 4, as well as under Microsoft
  14. C (5.1) for MS-DOS.  It should work with minimal modifications on most
  15. Unix systems.
  16. ----------------- CUT HERE ------------------------
  17. #!/bin/sh
  18. # This is Remind 2.0, a shell archive (shar 3.32)
  19. # made 11/01/1990 18:55 UTC by dfs@yar
  20. # Source directory /enterprise/navigation/dfs/work/.rem/merged
  21. #
  22. # existing files will NOT be overwritten
  23. #
  24. # This shar contains:
  25. # length  mode       name
  26. # ------ ---------- ------------------------------------------
  27. #    368 -rw------- Makefile
  28. #    643 -rw------- README.DOS
  29. #    897 -rw------- README.UNIX
  30. #   1609 -rw------- defines.h
  31. #   5618 -rw------- dorem.c
  32. #   9292 -rw------- dosubst.c
  33. #   7981 -rw------- files.c
  34. #   1315 -rw------- globals.h
  35. #   3904 -rw------- init.c
  36. #  18810 -rw------- main.c
  37. #   8674 -rw------- nextdate.c
  38. #   1377 -rw------- protos.h
  39. #  22384 -rw------- remind.1
  40. #    665 -rw------- remind.mak
  41. #
  42. if touch 2>&1 | fgrep 'amc' > /dev/null
  43.  then TOUCH=touch
  44.  else TOUCH=true
  45. fi
  46. # ============= Makefile ==============
  47. if test X"$1" != X"-c" -a -f 'Makefile'; then
  48.     echo "File already exists: skipping 'Makefile'"
  49. else
  50. sed 's/^X//' << 'SHAR_EOF' > Makefile &&
  51. X# Makefile for REMIND - simple file
  52. X
  53. X#WARNING: Don't remove the -DUNIX
  54. XCFLAGS= -O -DUNIX
  55. X
  56. Xall: dorem.o files.o main.o nextdate.o init.o dosubst.o
  57. X    $(LINK.c) -o remind dorem.o files.o main.o nextdate.o init.o dosubst.o
  58. X
  59. Xdorem.o: dorem.c
  60. X
  61. Xfiles.o: files.c
  62. X
  63. Xmain.o:  main.c
  64. X
  65. Xnextdate.o: nextdate.c
  66. X
  67. Xinit.o: init.c
  68. X
  69. Xdosubst.o: dosubst.c
  70. X
  71. Xclean:
  72. X    rm -f *.o core *~ remind
  73. X
  74. SHAR_EOF
  75. $TOUCH -am 1101133790 Makefile &&
  76. chmod 0600 Makefile ||
  77. echo "restore of Makefile failed"
  78. set `wc -c Makefile`;Wc_c=$1
  79. if test "$Wc_c" != "368"; then
  80.     echo original size 368, current size $Wc_c
  81. fi
  82. fi
  83. # ============= README.DOS ==============
  84. if test X"$1" != X"-c" -a -f 'README.DOS'; then
  85.     echo "File already exists: skipping 'README.DOS'"
  86. else
  87. sed 's/^X//' << 'SHAR_EOF' > README.DOS &&
  88. XREMIND 2.0 for MS-DOS
  89. X
  90. XREMIND was originally written for MS-DOS.  To compile it, you need
  91. Xthe Microsoft C compiler (at least version 5.1) and the Microsoft
  92. XMAKE utility.
  93. X
  94. XTo compile the software, simply go to the source directory and type:
  95. X
  96. XMAKE REMIND.MAK
  97. X
  98. XNote that the MS-DOS version of REMIND operates slightly differently from
  99. Xthe UNIX version:  MS-DOS has no concept of file access date.  Thus, to
  100. Ximplement the "ONCE" keyword, REMIND will change the modification date
  101. Xof the top-level reminder file after it has run.  This is equivalent to
  102. Xperforming a "touch" of the file after running REMIND.
  103. X--
  104. XDavid F. Skoll <dfs@doe.carleton.ca>
  105. X
  106. SHAR_EOF
  107. $TOUCH -am 1101134590 README.DOS &&
  108. chmod 0600 README.DOS ||
  109. echo "restore of README.DOS failed"
  110. set `wc -c README.DOS`;Wc_c=$1
  111. if test "$Wc_c" != "643"; then
  112.     echo original size 643, current size $Wc_c
  113. fi
  114. fi
  115. # ============= README.UNIX ==============
  116. if test X"$1" != X"-c" -a -f 'README.UNIX'; then
  117.     echo "File already exists: skipping 'README.UNIX'"
  118. else
  119. sed 's/^X//' << 'SHAR_EOF' > README.UNIX &&
  120. XREMIND version 2.0 for UNIX
  121. X
  122. XTo compile REMIND, just go to the source directory and type "make".
  123. XThis creates the executable file "remind".  You can type  "make CC=gcc"
  124. Xif you want to use the Gnu C Compiler.
  125. X
  126. XThe Makefile is very simply and naive.
  127. X
  128. XREMIND has only been compiled on Sun3s and Sun4s under Sun OS 4.0.
  129. XHowever, it makes very few system calls and should work on most BSD systems.
  130. XIt shouldn't take too much hacking to get REMIND to work on almost any
  131. Xsystem.  The troublesome files are main.c which gets the current system
  132. Xdate, and files.c which opens and closes files.
  133. X
  134. XOnce remind has been compiled, install it in your favourite system directory.
  135. XThe manual is in the file "remind.1".  You can install it in the appropriate
  136. Xman page directory.  Remember to change the file suffix if you install it
  137. Xin the "l" (local) or "n" (new) directory.
  138. X--
  139. XDavid F. Skoll <dfs@doe.carleton.ca>
  140. SHAR_EOF
  141. $TOUCH -am 1101133690 README.UNIX &&
  142. chmod 0600 README.UNIX ||
  143. echo "restore of README.UNIX failed"
  144. set `wc -c README.UNIX`;Wc_c=$1
  145. if test "$Wc_c" != "897"; then
  146.     echo original size 897, current size $Wc_c
  147. fi
  148. fi
  149. # ============= defines.h ==============
  150. if test X"$1" != X"-c" -a -f 'defines.h'; then
  151.     echo "File already exists: skipping 'defines.h'"
  152. else
  153. sed 's/^X//' << 'SHAR_EOF' > defines.h &&
  154. X/***************************************************************/
  155. X/*                                                             */
  156. X/*  DEFINES.H                                                  */
  157. X/*                                                             */
  158. X/*  Contains macros and #defines for REMIND program.           */
  159. X/*                                                             */
  160. X/*  By David Skoll - 30 Sept 1990.                             */
  161. X/*                                                             */
  162. X/***************************************************************/
  163. X
  164. X/* User-definable variables.  BASE *must* be a year for which the
  165. X   first of January is a Monday!!!  FOMITSIZE and POMITSIZE control
  166. X   the number of fully-specified (dd-mm-yy) and partially-specified
  167. X   (dd-mm) holidays. */
  168. X#define BASE 1990
  169. X#define FOMITSIZE 100
  170. X#define POMITSIZE 75
  171. X
  172. X/* Useful macros */
  173. X
  174. X#define upper(c) ( ((c) >= 'a' && (c) <= 'z') ? ((c)-32) : (c) )
  175. X#define DaysInYear(y) (((y) % 4) ? 365 : ((!((y) % 100) && ((y) % 400)) ? 365 : 366 ))
  176. X#define IsLeapYear(y) (((y) % 4) ? 0 : ((!((y) % 100) && ((y) % 400)) ? 0 : 1 ))
  177. X#define DaysInMonth(m, y) ((m) != 1 ? MonthDays[m] : 28 + IsLeapYear(y))
  178. X
  179. X/* Bit masks for constraint map */
  180. X#define DAY_M 1
  181. X#define MONTH_M 2
  182. X#define YEAR_M 4
  183. X#define WKDAY_M 8
  184. X
  185. Xenum Token_t { Unknown_t, Year_t, Month_t, Day_t, WkDay_t, Msg_t, Run_t,
  186. X           Omit_t, Banner_t, Rem_t, Delta_t, Back_t, Once_t, Include_t, Eol_t };
  187. X               
  188. X/* Define the Token structure */
  189. X
  190. Xtypedef struct {
  191. X   char *str;
  192. X   enum Token_t type;
  193. X   int val;
  194. X} Token;
  195. X#ifndef UNIX
  196. X
  197. X#endif UNIX
  198. SHAR_EOF
  199. $TOUCH -am 1024164690 defines.h &&
  200. chmod 0600 defines.h ||
  201. echo "restore of defines.h failed"
  202. set `wc -c defines.h`;Wc_c=$1
  203. if test "$Wc_c" != "1609"; then
  204.     echo original size 1609, current size $Wc_c
  205. fi
  206. fi
  207. # ============= dorem.c ==============
  208. if test X"$1" != X"-c" -a -f 'dorem.c'; then
  209.     echo "File already exists: skipping 'dorem.c'"
  210. else
  211. sed 's/^X//' << 'SHAR_EOF' > dorem.c &&
  212. X#include <stdio.h>
  213. X#ifndef UNIX
  214. X#include <stdlib.h>
  215. X#endif UNIX
  216. X#include <ctype.h>
  217. X#include "defines.h"
  218. X#include "globals.h"
  219. X#include "protos.h"
  220. X
  221. X/***************************************************************/
  222. X/*                                                             */
  223. X/*  int DoRem(char **s)                                        */
  224. X/*                                                             */
  225. X/*  Process a reminder.  Return 0 if reminder not emitted,     */
  226. X/*  positive if emitted, or negative if in the past and        */
  227. X/*  will never be emitted.                                     */
  228. X/*                                                             */
  229. X/***************************************************************/
  230. X#ifndef UNIX
  231. Xint DoRem(char **s)
  232. X#else UNIX
  233. Xint DoRem(s)
  234. Xchar **s;
  235. X     
  236. X#endif UNIX
  237. X{
  238. X   int d, m, y, wd, cons, delta, back, omit, done, i, jul, once;
  239. X   int d2, m2, y2;
  240. X   Token tok;
  241. X   int trigger;
  242. X
  243. X   d = m = y = back = delta = -1;
  244. X   cons = wd = omit = once = 0;
  245. X
  246. X
  247. X   done = 0;
  248. X   while (!done) {
  249. X      tok = ParseToken(s);
  250. X      switch (tok.type) {
  251. X     case Eol_t:
  252. X        Eprint("Missing MSG or RUN in reminder.\n");
  253. X        return 0;
  254. X
  255. X     case Omit_t:
  256. X     case Run_t:
  257. X     case Msg_t: done = 1; break;
  258. X
  259. X     case Unknown_t:
  260. X        Eprint("Unknown token %s in reminder.\n", tok.str);
  261. X        return 0;
  262. X
  263. X     case Banner_t:
  264. X        Eprint("BANNER can't be used here.\n");
  265. X        return 0;
  266. X
  267. X     case WkDay_t:
  268. X        if (wd & (1 << tok.val)) {
  269. X           Eprint("%s duplicated.\n", tok.str);
  270. X           return 0;
  271. X        }
  272. X        wd |= 1 << tok.val;
  273. X        cons |= WKDAY_M;
  274. X        break;
  275. X
  276. X     case Year_t:
  277. X        if (y != -1) {
  278. X           Eprint("Year specified twice.\n");
  279. X           return 0;
  280. X        }
  281. X        y = tok.val;
  282. X        cons |= YEAR_M;
  283. X        break;
  284. X
  285. X     case Month_t:
  286. X        if (m != -1) {
  287. X           Eprint("Month specified twice.\n");
  288. X           return 0;
  289. X        }
  290. X        m = tok.val;
  291. X        cons |= MONTH_M;
  292. X        break;
  293. X
  294. X     case Day_t:
  295. X        if (d != -1) {
  296. X           Eprint("Day specified twice.\n");
  297. X           return 0;
  298. X        }
  299. X        d = tok.val;
  300. X        cons |= DAY_M;
  301. X        break;
  302. X
  303. X     case Delta_t:
  304. X        if (delta != -1) {
  305. X           Eprint("Delta specified twice.\n");
  306. X           return 0;
  307. X        }
  308. X        delta = tok.val;
  309. X        break;
  310. X
  311. X     case Back_t:
  312. X        if (back != -1) {
  313. X           Eprint("Back specified twice.\n");
  314. X           return 0;
  315. X        }
  316. X        back = tok.val;
  317. X        break;
  318. X
  319. X     case Once_t:
  320. X        if (once) {
  321. X           Eprint("ONCE specified twice.  (How's that for an error message??)\n");
  322. X           return 0;
  323. X        }
  324. X        once = 1;
  325. X        break;
  326. X
  327. X     default:
  328. X        Eprint("Software error: Token %s, type %d, val %d",
  329. X            tok.str, tok.type, tok.val);
  330. X        return 0;
  331. X      }
  332. X   }
  333. X   if (tok.type == Omit_t) {
  334. X      done = 0;
  335. X      while (!done) {
  336. X     tok = ParseToken(s);
  337. X     switch(tok.type) {
  338. X
  339. X        case Msg_t:
  340. X        case Run_t: done = 1; break;
  341. X
  342. X        case Eol_t:
  343. X           Eprint("Missing MSG or RUN in reminder.\n");
  344. X           return 0;
  345. X
  346. X        case WkDay_t:
  347. X           if (omit & (1 << tok.val)) {
  348. X          Eprint("%s duplicated.\n", tok.str);
  349. X          return 0;
  350. X           }
  351. X           omit |= 1 << tok.val;
  352. X           break;
  353. X
  354. X        default:
  355. X           Eprint("Only weekdays are valid after a local OMIT.\n");
  356. X           return 0;
  357. X     }
  358. X      }
  359. X   }
  360. X   
  361. X   if (d != -1 && m != -1 && CheckDate(d, m, y)) {
  362. X      Eprint("Illegal date specification.\n");
  363. X      return 0;
  364. X   }
  365. X   if (y != -1 && (y < BASE || y > BASE + 85)) {
  366. X      Eprint("Illegal date specification.\n");
  367. X      return 0;
  368. X   }
  369. X
  370. X   /* Print some helpful stuff if debugging */
  371. X   if (Debug) {
  372. X      if (back > 7) Eprint("Warning: 'back' > 7 could slow execution severely.\n");
  373. X      if (delta > 30 && (omit || NumFullOmit || NumPartOmit))
  374. X     Eprint("Warning: 'delta' > 30 with OMITs could slow execution severely.\n");
  375. X   }
  376. X
  377. X   if (omit == 127) {
  378. X      Eprint("Can't omit every day!\n");
  379. X      return 0;
  380. X   } 
  381. X
  382. X   if (IgOnce) once = 0; 
  383. X   
  384. X   /* Check if we can quickly determine reminder is not to be emitted */
  385. X   if (once && !Debug && !Purge && (LastRun == JulianToday)) return 0;
  386. X
  387. X   i = TryNextDate(&d2, &m2, &y2, CurDay, CurMon, CurYear,
  388. X           d, m, y, wd, cons, 0);
  389. X   if (i) {
  390. X      if (Debug) Eprint("Reminder has expired.\n");
  391. X      return -1;
  392. X   }
  393. X
  394. X   /* Tweak the back and delta values to their defaults */
  395. X   if (back == -1) back = 0;
  396. X   if (delta == -1) delta = 0;
  397. X
  398. X   jul = Julian(d2, m2, y2);
  399. X   if (back) {
  400. X      jul = MoveBack(jul, back, d2, m2, y2, omit);
  401. X      while (jul < JulianToday) {
  402. X     i = TryNextDate(&d2, &m2, &y2, d2, m2, y2,
  403. X             d, m, y, wd, cons, 1);
  404. X     if (i) {
  405. X        if (Debug) Eprint("Reminder has expired.\n");
  406. X        return -1;
  407. X     }
  408. X         jul = Julian(d2, m2, y2);
  409. X     jul = MoveBack(jul, back, d2, m2, y2, omit);
  410. X      }
  411. X      FromJulian(jul, &d2, &m2, &y2);
  412. X   }
  413. X   
  414. X   /* Figure out if the reminder should be triggered */
  415. X   
  416. X   trigger = MoveBack(jul, delta, d2, m2, y2, omit);
  417. X
  418. X   if(Debug) {
  419. X      Eprint("%sTrigger date: %s, %d %s, %d.\n", 
  420. X              (trigger <= JulianToday ? "*" : ""), DayName[jul % 7], 
  421. X          d2, MonthName[m2], y2);
  422. X      return 0;
  423. X   }
  424. X   if (Purge || (once && (LastRun == JulianToday))) return 0;
  425. X   while (isspace(**s)) (*s)++;
  426. X   if (trigger <= JulianToday && !(tok.type == Run_t && IgRun)) { /* Trigger a reminder */
  427. X      if (NumEmitted == 0 && !Purge && !Debug) {
  428. X         DoSubst(Banner, WorkBuf, CurDay, CurMon, CurYear, JulianToday, Msg_t);
  429. X     printf("%s\n", WorkBuf);
  430. X      }
  431. X      
  432. X      DoSubst(*s, WorkBuf, d2, m2, y2, jul, tok.type);
  433. X      if (tok.type == Msg_t) printf("%s\n", WorkBuf);
  434. X      else if (tok.type == Run_t) system(WorkBuf);
  435. X      else Eprint("Error: Invalid token type %d\n", tok.type);
  436. X      return 1;
  437. X   } else return 0;
  438. X
  439. X}
  440. X#ifndef UNIX
  441. X
  442. X#endif UNIX
  443. SHAR_EOF
  444. $TOUCH -am 1024164690 dorem.c &&
  445. chmod 0600 dorem.c ||
  446. echo "restore of dorem.c failed"
  447. set `wc -c dorem.c`;Wc_c=$1
  448. if test "$Wc_c" != "5618"; then
  449.     echo original size 5618, current size $Wc_c
  450. fi
  451. fi
  452. # ============= dosubst.c ==============
  453. if test X"$1" != X"-c" -a -f 'dosubst.c'; then
  454.     echo "File already exists: skipping 'dosubst.c'"
  455. else
  456. sed 's/^X//' << 'SHAR_EOF' > dosubst.c &&
  457. X#include <ctype.h>
  458. X#include <stdio.h>
  459. X#include "defines.h"
  460. X#include "globals.h"
  461. X#include "protos.h"
  462. X
  463. X
  464. X/***************************************************************/
  465. X/*                                                             */
  466. X/*  DOSUBST.C                                                  */
  467. X/*                                                             */
  468. X/*  Performs line substitution for reminders.                  */
  469. X/*                                                             */
  470. X/***************************************************************/
  471. X
  472. Xstatic char TODAY[] = "today";
  473. Xstatic char TOMORROW[] = "tomorrow";
  474. X
  475. X#ifndef UNIX
  476. Xint DoSubst(char *src, char *dst, int d, int m, int y, int jul, enum Token_t t)
  477. X#else UNIX
  478. Xint DoSubst(src, dst, d, m, y, jul, t)
  479. X     char *src;
  480. X     char *dst;
  481. X     int d;
  482. X     int m;
  483. X     int y;
  484. X     int jul;
  485. X     enum Token_t t;
  486. X#endif UNIX
  487. X{
  488. X   int diff = jul - JulianToday;
  489. X   char c;
  490. X   char *od;
  491. X   int wkday = jul % 7;
  492. X   char *plu;
  493. X   int done;
  494. X#ifndef UNIX
  495. X   
  496. X#else UNIX
  497. X   char *origDst = dst;
  498. X      
  499. X#endif UNIX
  500. X   *dst = 0;
  501. X   
  502. X   switch(d) {
  503. X      case 1:
  504. X      case 21:
  505. X      case 31: plu = "st"; break;
  506. X      
  507. X      case 2:
  508. X      case 22: plu = "nd"; break;
  509. X      
  510. X      case 3:  plu = "rd"; break;
  511. X      
  512. X      default: plu = "th"; break;
  513. X   }
  514. X      
  515. X   
  516. X   while (c = *src++) {
  517. X#ifndef UNIX
  518. X      if (c != '%') *dst++ = c;
  519. X      else {
  520. X#else UNIX
  521. X     if (c != '%') { *dst++ = c; *dst = 0; }
  522. X     else {
  523. X#endif UNIX
  524. X         od = dst;
  525. X         c = *src++;
  526. X     done = 0;
  527. X         if (diff <= 1) {
  528. X            switch(upper(c)) {
  529. X               case 'A':
  530. X               case 'B':
  531. X           case 'C':
  532. X           case 'E':
  533. X           case 'F':
  534. X           case 'G':
  535. X           case 'H':
  536. X           case 'I':
  537. X           case 'J':
  538. X           case 'L':
  539. X           case 'U':
  540. X#ifndef UNIX
  541. X           case 'V': dst += sprintf(dst, "%s", (diff ? TOMORROW : TODAY));
  542. X                     done = 1;
  543. X#else UNIX
  544. X           case 'V': (void) sprintf(dst, "%s", (diff ? TOMORROW : TODAY));
  545. X                 dst = origDst + strlen(origDst);
  546. X                 done = 1;
  547. X#endif UNIX
  548. X                  break;
  549. X             
  550. X               default: done = 0;
  551. X            }
  552. X     }         
  553. X     
  554. X     if (!done) switch(upper(c)) {
  555. X        case 0: *dst = 0; return 0;
  556. X        
  557. X           case 'A':
  558. X#ifndef UNIX
  559. X               dst += sprintf(dst, "on %s, %d %s, %d", DayName[wkday], d,
  560. X#else UNIX
  561. X               (void) sprintf(dst, "on %s, %d %s, %d", DayName[wkday], d,
  562. X#endif UNIX
  563. X                      MonthName[m], y);
  564. X#ifdef UNIX
  565. X               dst = origDst + strlen(origDst);
  566. X#endif UNIX
  567. X           break;
  568. X           
  569. X        case 'B':
  570. X#ifndef UNIX
  571. X               dst += sprintf(dst, "in %d days' time", diff);
  572. X           break;
  573. X#else UNIX
  574. X               (void) sprintf(dst, "in %d days' time", diff);
  575. X           dst = origDst + strlen(origDst);
  576. X               break;
  577. X#endif UNIX
  578. X           
  579. X        case 'C':
  580. X#ifndef UNIX
  581. X               dst += sprintf(dst, "on %s", DayName[wkday]);
  582. X#else UNIX
  583. X               (void) sprintf(dst, "on %s", DayName[wkday]);
  584. X               dst = origDst + strlen(origDst);
  585. X#endif UNIX
  586. X           break;
  587. X           
  588. X        case 'D':
  589. X#ifndef UNIX
  590. X           dst += sprintf(dst, "%d", d);
  591. X           break;
  592. X#else UNIX
  593. X           (void) sprintf(dst, "%d", d);
  594. X           dst = origDst + strlen(origDst);
  595. X               break;
  596. X#endif UNIX
  597. X           
  598. X        case 'E':
  599. X#ifndef UNIX
  600. X           dst += sprintf(dst, "on %02d/%02d/%04d", d, m+1, y);
  601. X           break;
  602. X#else UNIX
  603. X           (void) sprintf(dst, "on %02d/%02d/%04d", d, m+1, y);
  604. X           dst = origDst + strlen(origDst);
  605. X               break;
  606. X#endif UNIX
  607. X           
  608. X        case 'F':
  609. X#ifndef UNIX
  610. X           dst += sprintf(dst, "on %02d/%02d/%04d", m+1, d, y);
  611. X           break;
  612. X#else UNIX
  613. X           (void) sprintf(dst, "on %02d/%02d/%04d", m+1, d, y);
  614. X           dst = origDst + strlen(origDst);
  615. X               break;
  616. X#endif UNIX
  617. X
  618. X        case 'G':
  619. X#ifndef UNIX
  620. X               dst += sprintf(dst, "on %s, %d %s", DayName[wkday], d, MonthName[m]);
  621. X           break;
  622. X#else UNIX
  623. X               (void) sprintf(dst, "on %s, %d %s", DayName[wkday], d, MonthName[m]);
  624. X           dst = origDst + strlen(origDst);
  625. X               break;
  626. X#endif UNIX
  627. X           
  628. X        case 'H':
  629. X#ifndef UNIX
  630. X               dst += sprintf(dst, "on %02d/%02d", d, m+1);
  631. X           break;
  632. X#else UNIX
  633. X               (void) sprintf(dst, "on %02d/%02d", d, m+1);
  634. X           dst = origDst + strlen(origDst);
  635. X               break;
  636. X#endif UNIX
  637. X
  638. X        case 'I':
  639. X#ifndef UNIX
  640. X               dst += sprintf(dst, "on %02d/%02d", m+1, d);
  641. X           break;
  642. X#else UNIX
  643. X               (void) sprintf(dst, "on %02d/%02d", m+1, d);
  644. X           dst = origDst + strlen(origDst);
  645. X               break;
  646. X#endif UNIX
  647. X           
  648. X        case 'J':
  649. X#ifndef UNIX
  650. X               dst += sprintf(dst, "on %s, %s %d%s, %d", DayName[wkday],
  651. X#else UNIX
  652. X               (void) sprintf(dst, "on %s, %s %d%s, %d", DayName[wkday],
  653. X#endif UNIX
  654. X                      MonthName[m], d, plu, y);
  655. X#ifdef UNIX
  656. X               dst = origDst + strlen(origDst);
  657. X#endif UNIX
  658. X               break;
  659. X        
  660. X        case 'K':
  661. X#ifndef UNIX
  662. X           dst += sprintf(dst, "on %s, %s %d%s", DayName[wkday],
  663. X#else UNIX
  664. X           (void) sprintf(dst, "on %s, %s %d%s", DayName[wkday],
  665. X#endif UNIX
  666. X                          MonthName[m], d, plu);
  667. X#ifndef UNIX
  668. X           break;
  669. X#else UNIX
  670. X           dst = origDst + strlen(origDst);
  671. X               break;
  672. X#endif UNIX
  673. X                         
  674. X            case 'L':
  675. X#ifndef UNIX
  676. X           dst += sprintf(dst, "on %04d/%02d/%02d", y, m+1, d);
  677. X           break;
  678. X#else UNIX
  679. X           (void) sprintf(dst, "on %04d/%02d/%02d", y, m+1, d);
  680. X           dst = origDst + strlen(origDst);
  681. X               break;
  682. X#endif UNIX
  683. X           
  684. X        case 'M':
  685. X#ifndef UNIX
  686. X           dst += sprintf(dst, "%s", MonthName[m]);
  687. X           break;
  688. X#else UNIX
  689. X           (void) sprintf(dst, "%s", MonthName[m]);
  690. X           dst = origDst + strlen(origDst);
  691. X               break;
  692. X#endif UNIX
  693. X           
  694. X        case 'N':
  695. X#ifndef UNIX
  696. X           dst += sprintf(dst, "%d", m+1);
  697. X           break;
  698. X#else UNIX
  699. X           (void) sprintf(dst, "%d", m+1);
  700. X           dst = origDst + strlen(origDst);
  701. X               break;
  702. X#endif UNIX
  703. X
  704. X        case 'O':
  705. X#ifndef UNIX
  706. X               if (RealToday == JulianToday) dst += sprintf(dst, " (today)");
  707. X#else UNIX
  708. X               if (RealToday == JulianToday) (void) sprintf(dst, " (today)");
  709. X               dst = origDst + strlen(origDst);
  710. X#endif UNIX
  711. X               break;
  712. X           
  713. X        case 'P':
  714. X#ifndef UNIX
  715. X           dst += sprintf(dst, (diff == 1 ? "" : "s"));
  716. X           break;
  717. X#else UNIX
  718. X           (void) sprintf(dst, (diff == 1 ? "" : "s"));
  719. X           dst = origDst + strlen(origDst);
  720. X               break;
  721. X#endif UNIX
  722. X           
  723. X        case 'Q':
  724. X#ifndef UNIX
  725. X           dst += sprintf(dst, (diff == 1 ? "'s" : "s'"));
  726. X           break;
  727. X#else UNIX
  728. X           (void) sprintf(dst, (diff == 1 ? "'s" : "s'"));
  729. X           dst = origDst + strlen(origDst);
  730. X               break;
  731. X#endif UNIX
  732. X           
  733. X        case 'R':
  734. X#ifndef UNIX
  735. X           dst += sprintf(dst, "%02d", d);
  736. X           break;
  737. X#else UNIX
  738. X           (void) sprintf(dst, "%02d", d);
  739. X           dst = origDst + strlen(origDst);
  740. X               break;
  741. X#endif UNIX
  742. X           
  743. X        case 'S':
  744. X#ifndef UNIX
  745. X           dst += sprintf(dst, plu);
  746. X           break;
  747. X#else UNIX
  748. X           (void) sprintf(dst, plu);
  749. X           dst = origDst + strlen(origDst);
  750. X               break;
  751. X#endif UNIX
  752. X           
  753. X        case 'T':
  754. X#ifndef UNIX
  755. X           dst += sprintf(dst, "%02d", m+1);
  756. X           break;
  757. X#else UNIX
  758. X           (void) sprintf(dst, "%02d", m+1);
  759. X           dst = origDst + strlen(origDst);
  760. X               break;
  761. X#endif UNIX
  762. X           
  763. X        case 'U':
  764. X#ifndef UNIX
  765. X           dst += sprintf(dst, "on %s, %d%s %s, %d", DayName[wkday], d,
  766. X#else UNIX
  767. X           (void) sprintf(dst, "on %s, %d%s %s, %d", DayName[wkday], d,
  768. X#endif UNIX
  769. X                          plu, MonthName[m], y);
  770. X#ifndef UNIX
  771. X           break;
  772. X#else UNIX
  773. X           dst = origDst + strlen(origDst);
  774. X               break;
  775. X#endif UNIX
  776. X           
  777. X        case 'V':
  778. X#ifndef UNIX
  779. X           dst += sprintf(dst, "on %s, %d%s %s", DayName[wkday], d, plu,
  780. X#else UNIX
  781. X           (void) sprintf(dst, "on %s, %d%s %s", DayName[wkday], d, plu,
  782. X#endif UNIX
  783. X                          MonthName[m]);
  784. X#ifndef UNIX
  785. X           break;
  786. X#else UNIX
  787. X           dst = origDst + strlen(origDst);
  788. X               break;
  789. X#endif UNIX
  790. X           
  791. X        case 'W':
  792. X#ifndef UNIX
  793. X           dst += sprintf(dst, DayName[wkday]);
  794. X           break;
  795. X#else UNIX
  796. X           (void) sprintf(dst, DayName[wkday]);
  797. X           dst = origDst + strlen(origDst);
  798. X               break;
  799. X#endif UNIX
  800. X           
  801. X        case 'X':
  802. X#ifndef UNIX
  803. X           dst += sprintf(dst, "%d", diff);
  804. X           break;
  805. X#else UNIX
  806. X           (void) sprintf(dst, "%d", diff);
  807. X           dst = origDst + strlen(origDst);
  808. X               break;
  809. X#endif UNIX
  810. X           
  811. X        case 'Y':
  812. X#ifndef UNIX
  813. X           dst += sprintf(dst, "%d", y);
  814. X           break;
  815. X#else UNIX
  816. X           (void) sprintf(dst, "%d", y);
  817. X           dst = origDst + strlen(origDst);
  818. X               break;
  819. X#endif UNIX
  820. X           
  821. X        case 'Z':
  822. X#ifndef UNIX
  823. X           dst += sprintf(dst, "%d", y % 100);
  824. X           break;
  825. X#else UNIX
  826. X           (void) sprintf(dst, "%d", y % 100);
  827. X           dst = origDst + strlen(origDst);
  828. X               break;
  829. X#endif UNIX
  830. X           
  831. X        default:
  832. X           *dst++ = c;
  833. X#ifndef UNIX
  834. X         }
  835. X#else UNIX
  836. X           *dst = 0;
  837. X     }
  838. X#endif UNIX
  839. X     if (isupper(c)) *od = upper(*od);
  840. X      }
  841. X   }
  842. X   if (t == Msg_t) *dst++ = '\n';
  843. X   *dst = 0;
  844. X   return 0;
  845. X}   
  846. X#ifndef UNIX
  847. X
  848. X#endif UNIX
  849. SHAR_EOF
  850. $TOUCH -am 1024164690 dosubst.c &&
  851. chmod 0600 dosubst.c ||
  852. echo "restore of dosubst.c failed"
  853. set `wc -c dosubst.c`;Wc_c=$1
  854. if test "$Wc_c" != "9292"; then
  855.     echo original size 9292, current size $Wc_c
  856. fi
  857. fi
  858. # ============= files.c ==============
  859. if test X"$1" != X"-c" -a -f 'files.c'; then
  860.     echo "File already exists: skipping 'files.c'"
  861. else
  862. sed 's/^X//' << 'SHAR_EOF' > files.c &&
  863. X#include <stdio.h>
  864. X#ifndef UNIX
  865. X#include <stdlib.h>
  866. X#endif UNIX
  867. X#include <string.h>
  868. X#include <malloc.h>
  869. X#ifndef UNIX
  870. X#include <dos.h>
  871. X#endif UNIX
  872. X#include <fcntl.h>
  873. X#ifdef UNIX
  874. X#include <sys/types.h>
  875. X#include <sys/stat.h>
  876. X#include <time.h>
  877. X#endif UNIX
  878. X#include "defines.h"
  879. X#include "globals.h"
  880. X#include "protos.h"
  881. X
  882. X#ifndef UNIX
  883. Xstatic int PopFile(void);
  884. X#else UNIX
  885. Xstatic int PopFile();
  886. X#endif UNIX
  887. X
  888. X/***************************************************************/
  889. X/*                                                             */
  890. X/*  FILES.C                                                    */
  891. X/*                                                             */
  892. X/*  All the routines for opening initial file, getting         */
  893. X/*  and settting initial file's date, closing files,           */
  894. X/*  handling INCLUDE commands, etc.                            */
  895. X/*                                                             */
  896. X/***************************************************************/
  897. X
  898. X/* Define the structure for saving info about a file */
  899. Xtypedef struct {
  900. X   long offset;
  901. X   int  curline;
  902. X   char *name;
  903. X} FileSave;
  904. X
  905. X#define MAXINCLUDE 10
  906. X/* Set up array of MAXINCLUDE file save areas */
  907. Xstatic FileSave stack[MAXINCLUDE];
  908. Xstatic int      SP;
  909. X
  910. Xstatic FILE *fp;
  911. X
  912. X/***************************************************************/
  913. X/*                                                             */
  914. X/*  OpenFile                                                   */
  915. X/*                                                             */
  916. X/*  Open the named file, initialize stack, get file date.      */
  917. X/*  If there's a problem, print an error msg and die.          */
  918. X/*                                                             */
  919. X/***************************************************************/
  920. X#ifndef UNIX
  921. Xvoid OpenFile(char *s)
  922. X#else UNIX
  923. Xvoid OpenFile(s)
  924. X     char *s;
  925. X     
  926. X#endif UNIX
  927. X{
  928. X   unsigned date, time;
  929. X#ifndef UNIX
  930. X   unsigned handle;
  931. X#endif UNIX
  932. X   int d, m, y;
  933. X#ifndef UNIX
  934. X   
  935. X   /* Get the file's modification date */
  936. X   if(_dos_open(s, O_RDONLY, &handle)) {
  937. X      fprintf(stderr, "remind: Can't open %s.\n", s);
  938. X      exit(1);
  939. X#else UNIX
  940. X   struct stat t;
  941. X   struct tm *t1;
  942. X      
  943. X   /* Get the file's access date */
  944. X   if (stat(s, &t)) {
  945. X     fprintf(stderr, "remind: Can't find file %s.\n", s);
  946. X     exit(1);
  947. X#endif UNIX
  948. X   }
  949. X#ifndef UNIX
  950. X   _dos_getftime(handle, &date, &time);
  951. X   d = date & 0x1F;
  952. X   m = (date >> 5) & 0xF;
  953. X   y = (date >> 9) + 1980;
  954. X#else UNIX
  955. X   t1 = localtime(&(t.st_atime));
  956. X#endif UNIX
  957. X   
  958. X#ifndef UNIX
  959. X   if (y < BASE) LastRun = 0; else LastRun = Julian(d, m-1, y);
  960. X   _dos_close(handle);
  961. X#else UNIX
  962. X   y = t1->tm_year + 1900;
  963. X   m = t1->tm_mon;
  964. X   d = t1->tm_mday;
  965. X   
  966. X   if (y < BASE) LastRun = 0; else LastRun = Julian(d, m, y);
  967. X#endif UNIX
  968. X   fp = fopen(s, "r");
  969. X   if (fp == NULL) {
  970. X      fprintf(stderr, "remind: Can't open %s.\n", s);
  971. X      exit(1);
  972. X   }
  973. X   
  974. X   CurLine = 0;
  975. X   strcpy(FileName, s);
  976. X   SP = 0;
  977. X   
  978. X   return;
  979. X}   
  980. X
  981. X/***************************************************************/
  982. X/*                                                             */
  983. X/*  DoInclude                                                  */
  984. X/*                                                             */
  985. X/*  Push the state of the current file and open a new file.    */
  986. X/*                                                             */
  987. X/***************************************************************/
  988. X#ifndef UNIX
  989. Xvoid DoInclude(char **s)
  990. X#else UNIX
  991. Xvoid DoInclude(s)
  992. X     char **s;
  993. X     
  994. X#endif UNIX
  995. X{
  996. X   Token tok;
  997. X   tok = ParseToken(s);
  998. X   
  999. X   /* First, check if there's room on the stack */
  1000. X   if (SP == MAXINCLUDE) {
  1001. X      Eprint("Too many levels of INCLUDE\n");
  1002. X      return;
  1003. X   }
  1004. X   
  1005. X   /* Save current data */
  1006. X#ifndef UNIX
  1007. X   stack[SP].offset = ftell(fp) - 1L;
  1008. X#else UNIX
  1009. X   stack[SP].offset = ftell(fp);
  1010. X#endif UNIX
  1011. X   stack[SP].curline = CurLine;
  1012. X   stack[SP].name = (char *) malloc(strlen(FileName)+1);
  1013. X   if (stack[SP].name == NULL) {
  1014. X      Eprint("Out of memory for INCLUDE\n");
  1015. X      return;
  1016. X   }
  1017. X   strcpy(stack[SP].name, FileName);
  1018. X   
  1019. X   SP++;
  1020. X   
  1021. X   /* Close the current file */
  1022. X   fclose(fp);
  1023. X   
  1024. X   /* Open the new file */
  1025. X   fp = fopen(tok.str, "r");
  1026. X   if (fp == NULL) {
  1027. X      Eprint("Can't open %s for INCLUDE\n", tok.str);
  1028. X      PopFile();
  1029. X      return;
  1030. X   }
  1031. X   if (Debug || Purge) {
  1032. X      Eprint("INCLUDING file %s\n", tok.str);
  1033. X   }
  1034. X   
  1035. X   /* Set the global variables */
  1036. X   CurLine = 0;
  1037. X   strcpy(FileName, tok.str);
  1038. X   return;
  1039. X}
  1040. X
  1041. X/***************************************************************/
  1042. X/*                                                             */
  1043. X/*  PopFile                                                    */
  1044. X/*                                                             */
  1045. X/*  Pop to the previous file, if there is one.  Return 0 for   */
  1046. X/*  OK, non-zero for no more files.  If we can't pop back      */
  1047. X/*  to a file, print an error message and die.                 */
  1048. X/*                                                             */
  1049. X/***************************************************************/
  1050. X#ifndef UNIX
  1051. Xstatic int PopFile(void)
  1052. X#else UNIX
  1053. Xstatic int PopFile()
  1054. X#endif UNIX
  1055. X{
  1056. X#ifndef UNIX
  1057. X   unsigned handle, date, time;
  1058. X   struct dostime_t t;
  1059. X#endif UNIX
  1060. X
  1061. X   if (fp) fclose(fp);
  1062. X#ifndef UNIX
  1063. X   if (!SP) {
  1064. X      if (!Debug && !Purge && (JulianToday == RealToday)) {
  1065. X         if (_dos_open(FileName, O_RDONLY, &handle)) {
  1066. X            fprintf(stderr, "Could not reset date of %s", FileName);
  1067. X            return 1;
  1068. X         }
  1069. X     _dos_gettime(&t);
  1070. X     date = CurDay;
  1071. X     date |= (CurMon + 1) << 5;
  1072. X     date |= (CurYear - 1980) << 9;
  1073. X     time = t.second / 2;
  1074. X     time |= t.minute << 5;
  1075. X     time |= t.hour << 11;
  1076. X     _dos_setftime(handle, date, time);
  1077. X      }
  1078. X      return 1;
  1079. X   }
  1080. X      
  1081. X#else UNIX
  1082. X   if (!SP) return -1;
  1083. X         
  1084. X#endif UNIX
  1085. X   SP--;
  1086. X   fp = fopen(stack[SP].name, "r");
  1087. X   if (fp == NULL) {
  1088. X      Eprint("Argh! Can't return to %s from INCLUDE file %s", stack[SP].name, FileName);
  1089. X      exit(1);
  1090. X   }
  1091. X#ifndef UNIX
  1092. X   if (fseek(fp, stack[SP].offset, SEEK_SET)) {
  1093. X#else UNIX
  1094. X   if (fseek(fp, stack[SP].offset, 0)) {
  1095. X#endif UNIX
  1096. X      Eprint("Argh! Can't fseek %s after returning from INCLUDE file %s", stack[SP].name, FileName);
  1097. X      exit(1);
  1098. X   }
  1099. X   
  1100. X   if (Debug || Purge) {
  1101. X      Eprint("Returning to file %s\n", stack[SP].name);
  1102. X   }
  1103. X   CurLine = stack[SP].curline;
  1104. X   strcpy(FileName, stack[SP].name);
  1105. X   free(stack[SP].name);
  1106. X   return 0;
  1107. X}
  1108. X/***************************************************************/
  1109. X/*                                                             */
  1110. X/*  ReadLine                                                   */
  1111. X/*                                                             */
  1112. X/*  Reads a line from the file.  If EOF, pops to previous file */
  1113. X/*  if there was one.  Returns 0 if more input, non-zero       */
  1114. X/*  if no more input.  Updates CurLine.                        */
  1115. X/*                                                             */
  1116. X/***************************************************************/
  1117. Xint ReadLine()
  1118. X{
  1119. X   int done = 0;
  1120. X   
  1121. X   Fresh = 1;
  1122. X   while (!done) {
  1123. X      CurLine++;
  1124. X      if (fgets(Line, 256, fp) == NULL) {
  1125. X         if (ferror(fp)) Eprint("Error reading %s", FileName);
  1126. X     if (PopFile()) return 1;
  1127. X      } else {
  1128. X         /* Remove the newline */
  1129. X         if (*Line && (*(Line + strlen(Line)-1)=='\n'))
  1130. X            *(Line + strlen(Line)-1) = 0;
  1131. X         done = 1;
  1132. X      }     
  1133. X   }
  1134. X   return 0;
  1135. X}
  1136. X
  1137. X#ifndef UNIX
  1138. X/***************************************************************/
  1139. X/*                                                             */
  1140. X/*  TopLevel - Returns 1 if current file is top level, 0       */
  1141. X/*  if it is INCLUDEd.                                         */
  1142. X/*                                                             */
  1143. X/***************************************************************/
  1144. Xint TopLevel(void) { return (SP == 0); }
  1145. X
  1146. X#else UNIX
  1147. Xint TopLevel()
  1148. X{
  1149. X  return (SP == 0);
  1150. X}
  1151. X#endif UNIX
  1152. SHAR_EOF
  1153. $TOUCH -am 1024164690 files.c &&
  1154. chmod 0600 files.c ||
  1155. echo "restore of files.c failed"
  1156. set `wc -c files.c`;Wc_c=$1
  1157. if test "$Wc_c" != "7981"; then
  1158.     echo original size 7981, current size $Wc_c
  1159. fi
  1160. fi
  1161. # ============= globals.h ==============
  1162. if test X"$1" != X"-c" -a -f 'globals.h'; then
  1163.     echo "File already exists: skipping 'globals.h'"
  1164. else
  1165. sed 's/^X//' << 'SHAR_EOF' > globals.h &&
  1166. X/***************************************************************/
  1167. X/*                                                             */
  1168. X/*  GLOBALS.H                                                  */
  1169. X/*                                                             */
  1170. X/*  Global variables for REMIND.                               */
  1171. X/*                                                             */
  1172. X/*  By David Skoll - 30 Sept. 1990                             */
  1173. X/*                                                             */
  1174. X/***************************************************************/
  1175. X
  1176. Xextern char *MonthName[];
  1177. Xextern char *DayName[];
  1178. Xextern Token keywd[];
  1179. Xextern int   MonthDays[];
  1180. Xextern int   MonthIndex[2][12];
  1181. Xextern int   FullOmitArray[];
  1182. Xextern int   PartOmitArray[];
  1183. Xextern char  Line[];
  1184. Xextern char  WorkBuf[];
  1185. Xextern int   Fresh;
  1186. Xextern int   Purge;
  1187. Xextern int   Debug;
  1188. Xextern int   Verbose;
  1189. Xextern char  FileName[];
  1190. Xextern int   CurLine;
  1191. Xextern int   NumEmitted;
  1192. Xextern int   NumRem;
  1193. Xextern int   NumFullOmit;
  1194. Xextern int   NumPartOmit;
  1195. Xextern int   JulianToday;
  1196. Xextern int   LastRun;
  1197. Xextern int   CurYear;
  1198. Xextern int   CurMon;
  1199. Xextern int   CurDay;
  1200. Xextern char  Banner[];
  1201. Xextern int   RealToday;
  1202. Xextern int   IgRun;
  1203. X#ifndef UNIX
  1204. Xextern int   IgOnce;
  1205. X#else UNIX
  1206. Xextern int   IgOnce;
  1207. X#endif UNIX
  1208. SHAR_EOF
  1209. $TOUCH -am 1024164690 globals.h &&
  1210. chmod 0600 globals.h ||
  1211. echo "restore of globals.h failed"
  1212. set `wc -c globals.h`;Wc_c=$1
  1213. if test "$Wc_c" != "1315"; then
  1214.     echo original size 1315, current size $Wc_c
  1215. fi
  1216. fi
  1217. # ============= init.c ==============
  1218. if test X"$1" != X"-c" -a -f 'init.c'; then
  1219.     echo "File already exists: skipping 'init.c'"
  1220. else
  1221. sed 's/^X//' << 'SHAR_EOF' > init.c &&
  1222. X#include <stdio.h>
  1223. X#ifndef UNIX
  1224. X#include <stdlib.h>
  1225. X#endif UNIX
  1226. X#include <string.h>
  1227. X#include "defines.h"
  1228. X#include "globals.h"
  1229. X#include "protos.h"
  1230. X
  1231. Xstatic char ErrMsg[] = "\n\t\tREMIND version 2.0 (C) 1990 by David Skoll.\n\nUsage: REMIND [-p | -d] [-v] [-o] [-r] filename [date]\n\n";
  1232. Xstatic char DPMsg[] = "Debug and Purge options conflict - Purge chosen.\n";
  1233. X/***************************************************************/
  1234. X/*                                                             */
  1235. X/*  void initialize(int argc, char *argv[])                    */
  1236. X/*                                                             */
  1237. X/*  Reads command line options, sets appropriate flags         */
  1238. X/*  and FileName.  Also exits with error if invoked            */
  1239. X/*  incorrectly.                                               */
  1240. X/*                                                             */
  1241. X/***************************************************************/
  1242. X#ifndef UNIX
  1243. Xvoid initialize(int argc, char *argv[])
  1244. X#else UNIX
  1245. Xvoid initialize(argc, argv)
  1246. X     int argc;
  1247. X     char *argv[];
  1248. X#endif UNIX
  1249. X{
  1250. X   int i;
  1251. X   char *s;
  1252. X   int d, m, y;
  1253. X   Token tok;
  1254. X
  1255. X   Debug   = 0;
  1256. X   Purge   = 0;
  1257. X   Verbose = 0;
  1258. X   IgOnce  = 0;
  1259. X   IgRun   = 0;
  1260. X
  1261. X   if(argc == 1) {
  1262. X      fprintf(stderr, ErrMsg);
  1263. X      exit(1);
  1264. X   }
  1265. X
  1266. X   i = 1;
  1267. X   s = argv[i];
  1268. X
  1269. X   /* Process options */
  1270. X   while (*s == '-') {
  1271. X      while (*++s) {
  1272. X         switch(upper(*s)) {
  1273. X
  1274. X            case 'P':  Purge = 1;
  1275. X                     if (Debug) {
  1276. X                        Debug = 0;
  1277. X                        fprintf(stderr, DPMsg);
  1278. X                     }
  1279. X             break;
  1280. X             
  1281. X            case 'D': Debug = 1;
  1282. X                  if (Purge) {
  1283. X                 Debug = 0;
  1284. X             fprintf(stderr, DPMsg);
  1285. X              }
  1286. X              break;
  1287. X
  1288. X        case 'V': Verbose = 1; break;
  1289. X
  1290. X        case 'O': IgOnce = 1; break;
  1291. X
  1292. X        case 'R': IgRun = 1; break;
  1293. X        
  1294. X        default: fprintf(stderr, "Unknown option '%c' ignored.\n", *s);
  1295. X     }                  
  1296. X      }
  1297. X      i++;
  1298. X      if (i >= argc) {
  1299. X         fprintf(stderr, ErrMsg);
  1300. X     exit(1);
  1301. X      }
  1302. X      s = argv[i];
  1303. X   }     
  1304. X   
  1305. X   /* Set FileName */
  1306. X   strcpy(FileName, argv[i++]);
  1307. X   
  1308. X   /* Get date, if supplied */
  1309. X   if (i < argc) {
  1310. X      *WorkBuf = 0;
  1311. X      while (i < argc) {
  1312. X         strcat(WorkBuf, argv[i++]);
  1313. X     strcat(WorkBuf, " ");
  1314. X      }
  1315. X      /* Parse the date */
  1316. X      d = m = y = -1;
  1317. X      tok.type = Unknown_t;
  1318. X      s = WorkBuf;
  1319. X      while (tok.type != Eol_t) {
  1320. X         tok = ParseToken(&s);
  1321. X     switch(tok.type) {
  1322. X        
  1323. X        case Eol_t: break;
  1324. X        
  1325. X        case Year_t: if (y == -1) 
  1326. X                        y = tok.val;
  1327. X             else {
  1328. X                fprintf(stderr, "Year specified twice!\n");
  1329. X                exit(1);
  1330. X             }
  1331. X             break;
  1332. X             
  1333. X        case Month_t: if (m == -1) 
  1334. X                        m = tok.val;
  1335. X             else {
  1336. X                fprintf(stderr, "Month specified twice!\n");
  1337. X                exit(1);
  1338. X             }
  1339. X             break;
  1340. X             
  1341. X        case Day_t: if (d == -1) 
  1342. X                        d = tok.val;
  1343. X             else {
  1344. X                fprintf(stderr, "Day specified twice!\n");
  1345. X                exit(1);
  1346. X             }
  1347. X             break;
  1348. X       
  1349. X            default: fprintf(stderr, "Illegal token %s on command line.\n", tok.str);
  1350. X                 exit(1);
  1351. X   
  1352. X         }
  1353. X      } 
  1354. X      
  1355. X      if (d == -1 || m == -1 || y == -1) {
  1356. X         fprintf(stderr, "Date on command line must be fully specified.\n");
  1357. X     exit(1);
  1358. X      }
  1359. X      if (CheckDate(d, m, y)) {
  1360. X         fprintf(stderr, "Illegal date on command line.\n");
  1361. X     exit(1);
  1362. X      }
  1363. X      
  1364. X      CurDay = d;
  1365. X      CurMon = m;
  1366. X      CurYear = y;
  1367. X      JulianToday = Julian(d, m, y);
  1368. X   }
  1369. X   OpenFile(FileName);
  1370. X   if (Debug) {
  1371. X      FromJulian(LastRun, &d, &m, &y);
  1372. X#ifndef UNIX
  1373. X      fprintf(stderr, "\nFile %s last modified on %s, %d %s, %d\n", FileName,
  1374. X#else UNIX
  1375. X      fprintf(stderr, "\nFile %s last accessed on %s, %d %s, %d\n", FileName,
  1376. X#endif UNIX
  1377. X                       DayName[LastRun % 7], d, MonthName[m], y);
  1378. X   }           
  1379. X   return;
  1380. X}
  1381. X#ifndef UNIX
  1382. X      
  1383. X#endif UNIX
  1384. SHAR_EOF
  1385. $TOUCH -am 1024164690 init.c &&
  1386. chmod 0600 init.c ||
  1387. echo "restore of init.c failed"
  1388. set `wc -c init.c`;Wc_c=$1
  1389. if test "$Wc_c" != "3904"; then
  1390.     echo original size 3904, current size $Wc_c
  1391. fi
  1392. fi
  1393. echo "End of part 1, continue with part 2"
  1394. exit 0
  1395.