home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / misc / volume33 / remind / part03 < prev    next >
Encoding:
Text File  |  1992-11-10  |  10.5 KB  |  448 lines

  1. Newsgroups: comp.sources.misc
  2. From: dfs@doe.carleton.ca (David F. Skoll)
  3. Subject:  v33i060:  remind - A replacement for calendar, Part03/12
  4. Message-ID: <1992Nov10.041835.844@sparky.imd.sterling.com>
  5. X-Md4-Signature: 1c4a36d390adc3b60376e75dbe5847ca
  6. Date: Tue, 10 Nov 1992 04:18:35 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: dfs@doe.carleton.ca (David F. Skoll)
  10. Posting-number: Volume 33, Issue 60
  11. Archive-name: remind/part03
  12. Environment: UNIX, MS-DOS
  13. Supersedes: remind: Volume 17, Issue 3-6
  14.  
  15. #!/bin/sh
  16. # This is part 03 of Remind 03.00.00
  17. if touch 2>&1 | fgrep 'amc' > /dev/null
  18.  then TOUCH=touch
  19.  else TOUCH=true
  20. fi
  21. # ============= dosubst.c ==============
  22. if test X"$1" != X"-c" -a -f 'dosubst.c'; then
  23.     echo "File already exists: skipping 'dosubst.c'"
  24. else
  25. echo "x - extracting dosubst.c (Text)"
  26. sed 's/^X//' << 'SHAR_EOF' > dosubst.c &&
  27. X/***************************************************************/
  28. X/*                                                             */
  29. X/*  DOSUBST.C                                                  */
  30. X/*                                                             */
  31. X/*  This performs all the "%" substitution functions when      */
  32. X/*  reminders are triggered.                                   */
  33. X/*                                                             */
  34. X/*  This file is part of REMIND.                               */
  35. X/*  Copyright (C) 1992 by David F. Skoll.                      */
  36. X/*                                                             */
  37. X/***************************************************************/
  38. X#include <stdio.h>
  39. X#include <ctype.h>
  40. X#include "config.h"
  41. X#ifdef HAVE_STDLIB_H
  42. X#include <stdlib.h>
  43. X#endif
  44. X#ifdef HAVE_MALLOC_H
  45. X#include <malloc.h>
  46. X#endif
  47. X#include "globals.h"
  48. X#include "err.h"
  49. X#include "types.h"
  50. X#include "protos.h"
  51. X
  52. X#define UPPER(c) ( ((c) >= 'a' && (c) <= 'z') ? (c) - 'a' + 'A' : (c) )
  53. X#define ABS(x) ( (x) < 0 ? -(x) : (x) )
  54. X#ifndef NL
  55. X#define NL "\n"
  56. X#endif
  57. X
  58. Xstatic char TODAY[] = "today";
  59. Xstatic char TOMORROW[] = "tomorrow";
  60. X
  61. X/***************************************************************/
  62. X/*                                                             */
  63. X/*  DoSubst                                                    */
  64. X/*                                                             */
  65. X/*  Process the % escapes in the reminder.  If                 */
  66. X/*  mode==NORMAL_MODE, ignore the %" sequence.  If             */
  67. X/*  mode==CAL_MODE, process the %" sequence.                   */
  68. X/*                                                             */
  69. X/***************************************************************/
  70. X
  71. X#ifdef HAVE_PROTOS
  72. XPUBLIC int DoSubst(ParsePtr p, char *out, Trigger *t, TimeTrig *tt, int jul, int mode)
  73. X#else
  74. Xint DoSubst(p, out, t, tt, jul, mode)
  75. XParsePtr p;
  76. Xchar *out;
  77. XTrigger *t;
  78. XTimeTrig *tt;
  79. Xint jul, mode;
  80. X#endif
  81. X{
  82. X   int diff = jul - JulianToday;
  83. X   int curtime = SystemTime() / 60;
  84. X   int err, done;
  85. X   int c;
  86. X   int d, m, y;
  87. X   int tim = tt->ttime;
  88. X   int h, min, hh, ch, cmin, chh;
  89. X   char *pm, *cpm;
  90. X   int tdiff, adiff, mdiff, hdiff;
  91. X   char *mplu, *hplu, *when, *plu;
  92. X   int has_quote = 0;
  93. X   char *s = out;
  94. X   char *os;
  95. X
  96. X   FromJulian(jul, &y, &m, &d);
  97. X
  98. X   if (tim == NO_TIME) tim = curtime;
  99. X   tdiff = tim - curtime;
  100. X   adiff = ABS(tdiff);
  101. X   mdiff = adiff % 60;
  102. X   hdiff = adiff / 60;
  103. X   mplu = (mdiff == 1 ? "" : "s");
  104. X   hplu = (hdiff == 1 ? "" : "s");
  105. X   when = (tdiff < 0 ? "ago" : "from now");
  106. X   
  107. X   h = tim / 60;
  108. X   min = tim % 60;
  109. X
  110. X   pm = (h < 12) ? "am" : "pm";
  111. X   hh = (h == 12) ? 12 : h % 12;
  112. X   
  113. X   ch = curtime / 60;
  114. X   cmin = curtime % 60;
  115. X
  116. X   cpm = (ch < 12) ? "am" : "pm";
  117. X   chh = (ch == 12) ? 12 : ch % 12;
  118. X
  119. X   switch(d) {
  120. X      case 1:
  121. X      case 21:
  122. X      case 31: plu = "st"; break;
  123. X      
  124. X      case 2:
  125. X      case 22: plu = "nd"; break;
  126. X      
  127. X      case 3:
  128. X      case 23: plu = "rd"; break;
  129. X      
  130. X      default: plu = "th"; break;
  131. X   }
  132. X      
  133. X   
  134. X   while(1) {
  135. X      c = ParseChar(p, &err, 0);
  136. X      if (err) return err;
  137. X      if (c == '\n') continue;
  138. X      if (!c) {
  139. X         if (mode != CAL_MODE) *s++ = '\n';
  140. X     *s++ = 0;
  141. X     break;
  142. X      }
  143. X      if (c != '%') {
  144. X         *s++ = c;
  145. X     continue;
  146. X      }
  147. X      c = ParseChar(p, &err, 0);
  148. X      if (err) return err;
  149. X      if (!c) {
  150. X     *s++ = 0;
  151. X     break;
  152. X      }
  153. X      os = s;
  154. X      done = 0;
  155. X      if (diff <= 1) {
  156. X         switch(UPPER(c)) {
  157. X            case 'A':
  158. X            case 'B':
  159. X        case 'C':
  160. X        case 'E':
  161. X        case 'F':
  162. X        case 'G':
  163. X        case 'H':
  164. X        case 'I':
  165. X        case 'J':
  166. X        case 'K':
  167. X        case 'L':
  168. X        case 'U':
  169. X        case 'V': sprintf(s, "%s", (diff ? TOMORROW : TODAY));
  170. X                 s += strlen(s);
  171. X                 done = 1;
  172. X                  break;
  173. X             
  174. X            default: done = 0;
  175. X         }
  176. X      }
  177. X     
  178. X      if (!done) switch(UPPER(c)) {
  179. X         case 'A':
  180. X            sprintf(s, "on %s, %d %s, %d", DayName[jul%7], d,
  181. X            MonthName[m], y);
  182. X            s += strlen(s);
  183. X        break;
  184. X           
  185. X     case 'B':
  186. X            sprintf(s, "in %d days' time", diff);
  187. X        s += strlen(s);
  188. X            break;
  189. X           
  190. X     case 'C':
  191. X        sprintf(s, "on %s", DayName[jul%7]);
  192. X        s += strlen(s);
  193. X        break;
  194. X
  195. X     case 'D':
  196. X        sprintf(s, "%d", d);
  197. X        s += strlen(s);
  198. X        break;
  199. X
  200. X     case 'E':
  201. X        sprintf(s, "on %02d/%02d/%04d", d, m+1, y);
  202. X        s += strlen(s);
  203. X        break;
  204. X
  205. X     case 'F':
  206. X        sprintf(s, "on %02d/%02d/%04d", m+1, d, y);
  207. X        s += strlen(s);
  208. X        break;
  209. X
  210. X     case 'G':
  211. X        sprintf(s, "on %s, %d %s", DayName[jul%7], d, MonthName[m]);
  212. X        s += strlen(s);
  213. X        break;
  214. X
  215. X     case 'H':
  216. X        sprintf(s, "on %02d/%02d", d, m+1);
  217. X        s += strlen(s);
  218. X        break;
  219. X
  220. X     case 'I':
  221. X        sprintf(s, "on %02d/%02d", m+1, d);
  222. X        s += strlen(s);
  223. X        break;
  224. X
  225. X     case 'J':
  226. X        sprintf(s, "on %s, %s %d%s, %d", DayName[jul%7],
  227. X               MonthName[m], d, plu, y);
  228. X        s += strlen(s);
  229. X        break;
  230. X
  231. X     case 'K':
  232. X        sprintf(s, "on %s, %s %d%s", DayName[jul%7],
  233. X               MonthName[m], d, plu);
  234. X        s += strlen(s);
  235. X        break;
  236. X
  237. X     case 'L':
  238. X        sprintf(s, "on %04d/%02d/%02d", y, m+1, d);
  239. X        s += strlen(s);
  240. X        break;
  241. X
  242. X     case 'M':
  243. X        sprintf(s, "%s", MonthName[m]);
  244. X        s += strlen(s);
  245. X        break;
  246. X
  247. X     case 'N':
  248. X        sprintf(s, "%d", m+1);
  249. X        s += strlen(s);
  250. X        break;
  251. X
  252. X     case 'O':
  253. X        if (RealToday == JulianToday) sprintf(s, " (today)");
  254. X        s += strlen(s);
  255. X        break;
  256. X
  257. X     case 'P':
  258. X        sprintf(s, (diff == 1 ? "" : "s"));
  259. X        s += strlen(s);
  260. X        break;
  261. X
  262. X     case 'Q':
  263. X        sprintf(s, (diff == 1 ? "'s" : "s'"));
  264. X        s += strlen(s);
  265. X        break;
  266. X
  267. X     case 'R':
  268. X        sprintf(s, "%02d", d);
  269. X        s += strlen(s);
  270. X        break;
  271. X
  272. X     case 'S':
  273. X        sprintf(s, plu);
  274. X        s += strlen(s);
  275. X        break;
  276. X
  277. X     case 'T':
  278. X        sprintf(s, "%02d", m+1);
  279. X        s += strlen(s);
  280. X        break;
  281. X
  282. X     case 'U':
  283. X        sprintf(s, "on %s, %d%s %s, %d", DayName[jul%7], d,
  284. X               plu, MonthName[m], y);
  285. X        s += strlen(s);
  286. X        break;
  287. X
  288. X     case 'V':
  289. X        sprintf(s, "on %s, %d%s %s", DayName[jul%7], d, plu,
  290. X               MonthName[m]);
  291. X        s += strlen(s);
  292. X        break;
  293. X
  294. X     case 'W':
  295. X        sprintf(s, DayName[jul%7]);
  296. X        s += strlen(s);
  297. X        break;
  298. X
  299. X     case 'X':
  300. X        sprintf(s, "%d", diff);
  301. X        s += strlen(s);
  302. X        break;
  303. X
  304. X     case 'Y':
  305. X        sprintf(s, "%d", y);
  306. X        s += strlen(s);
  307. X        break;
  308. X
  309. X     case 'Z':
  310. X        sprintf(s, "%d", y % 100);
  311. X        s += strlen(s);
  312. X        break;
  313. X
  314. X     case '1':
  315. X        if (tdiff == 0) 
  316. X           sprintf(s, "now");
  317. X        else if (hdiff == 0) 
  318. X           sprintf(s, "%d minute%s %s", mdiff, mplu, when);
  319. X        else if (mdiff == 0)
  320. X           sprintf(s, "%d hour%s %s", hdiff, hplu, when);
  321. X        else
  322. X           sprintf(s, "%d hour%s and %d minute%s %s", hdiff, hplu, mdiff, mplu, when);
  323. X        s += strlen(s);
  324. X        break;
  325. X
  326. X     case '2':
  327. X        sprintf(s, "at %d:%02d%s", hh, min, pm);
  328. X        s += strlen(s);
  329. X        break;
  330. X
  331. X     case '3': sprintf(s, "at %02d:%02d", h, min);
  332. X        s += strlen(s);
  333. X        break;
  334. X
  335. X     case '4': sprintf(s, "%d", tdiff);
  336. X        s += strlen(s);
  337. X        break;
  338. X
  339. X     case '5': sprintf(s, "%d", adiff);
  340. X        s += strlen(s);
  341. X        break;
  342. X
  343. X     case '6': sprintf(s, when);
  344. X        s += strlen(s);
  345. X        break;
  346. X
  347. X     case '7': sprintf(s, "%d", hdiff);
  348. X        s += strlen(s);
  349. X        break;
  350. X
  351. X     case '8': sprintf(s, "%d", mdiff);
  352. X        s += strlen(s);
  353. X        break;
  354. X
  355. X     case '9': sprintf(s, mplu);
  356. X        s += strlen(s);
  357. X        break;
  358. X
  359. X     case '0': sprintf(s, hplu);
  360. X        s += strlen(s);
  361. X        break;
  362. X
  363. X     case '!': sprintf(s, (tdiff >= 0 ? "is" : "was"));
  364. X        s += strlen(s);
  365. X        break;
  366. X
  367. X     case '@': sprintf(s, "%d:%02d%s", chh, cmin, cpm);
  368. X        s += strlen(s);
  369. X        break;
  370. X
  371. X     case '#': sprintf(s, "%02d:%02d", ch, cmin);
  372. X        s += strlen(s);
  373. X        break;
  374. X
  375. X         case '_': sprintf(s, "%s", NL);
  376. X        s += strlen(s);
  377. X        break;
  378. X
  379. X     case QUOTE_MARKER:
  380. X        /* Swallow any QUOTE_MARKERs which may somehow creep in... */
  381. X        break;
  382. X
  383. X     case '"':
  384. X        *s++ = QUOTE_MARKER;
  385. X        has_quote = 1;
  386. X        break;
  387. X
  388. X         default:
  389. X        *s++ = c;
  390. X      }
  391. X      if (isupper(c)) *os = UPPER(*os);
  392. X   }
  393. X
  394. X/* We're outside the big while loop.  The only way to get here is for c to
  395. X   be null.  Now we go through and delete %" sequences, if it's the
  396. X   NORMAL_MODE, or retain only things within a %" sequence if it's the
  397. X   CAL_MODE. */
  398. X
  399. X/* If there are NO quotes, then:  If CAL_MODE && RUN_TYPE, we don't want the
  400. X   reminder in the calendar.  Zero the output buffer and quit. */
  401. X   if (!has_quote) {
  402. X      if (mode == CAL_MODE && t->typ == RUN_TYPE) *out = 0;
  403. X      return OK;
  404. X   }
  405. X
  406. X/* There ARE quotes.  If in CAL_MODE, delete everything before first quote
  407. X   and after second quote.  If in NORMAL_MODE, delete the %" sequences. */
  408. X
  409. X   s = out;
  410. X   os = out;
  411. X   if (mode == NORMAL_MODE) {
  412. X      while (*s) {
  413. X         if (*s != QUOTE_MARKER) *os++ = *s;
  414. X     s++;
  415. X      }
  416. X      *os = 0;
  417. X   } else {
  418. X
  419. X/* Skip past the quote marker */
  420. X      while (*s && (*s != QUOTE_MARKER)) s++;
  421. X
  422. X/* Security check... actually, *s must == QUOTE_MARKER at this point, but
  423. X   it doesn't hurt to make it a bit robust. */
  424. X      if (*s) s++;
  425. X
  426. X/* Copy the output until the next QUOTE_MARKER */
  427. X      while (*s && (*s != QUOTE_MARKER)) *os++ = *s++;
  428. X      *os = 0;
  429. X   }
  430. X
  431. X   return OK;
  432. X}
  433. X   
  434. X
  435. SHAR_EOF
  436. $TOUCH -am 1109141292 dosubst.c &&
  437. chmod 0600 dosubst.c ||
  438. echo "restore of dosubst.c failed"
  439. set `wc -c dosubst.c`;Wc_c=$1
  440. if test "$Wc_c" != "9144"; then
  441.     echo original size 9144, current size $Wc_c
  442. fi
  443. fi
  444. echo "End of part 3, continue with part 4"
  445. exit 0
  446.  
  447. exit 0 # Just in case...
  448.