home *** CD-ROM | disk | FTP | other *** search
- Newsgroups: comp.sources.misc
- From: dfs@doe.carleton.ca (David F. Skoll)
- Subject: v33i060: remind - A replacement for calendar, Part03/12
- Message-ID: <1992Nov10.041835.844@sparky.imd.sterling.com>
- X-Md4-Signature: 1c4a36d390adc3b60376e75dbe5847ca
- Date: Tue, 10 Nov 1992 04:18:35 GMT
- Approved: kent@sparky.imd.sterling.com
-
- Submitted-by: dfs@doe.carleton.ca (David F. Skoll)
- Posting-number: Volume 33, Issue 60
- Archive-name: remind/part03
- Environment: UNIX, MS-DOS
- Supersedes: remind: Volume 17, Issue 3-6
-
- #!/bin/sh
- # This is part 03 of Remind 03.00.00
- if touch 2>&1 | fgrep 'amc' > /dev/null
- then TOUCH=touch
- else TOUCH=true
- fi
- # ============= dosubst.c ==============
- if test X"$1" != X"-c" -a -f 'dosubst.c'; then
- echo "File already exists: skipping 'dosubst.c'"
- else
- echo "x - extracting dosubst.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > dosubst.c &&
- X/***************************************************************/
- X/* */
- X/* DOSUBST.C */
- X/* */
- X/* This performs all the "%" substitution functions when */
- X/* reminders are triggered. */
- X/* */
- X/* This file is part of REMIND. */
- X/* Copyright (C) 1992 by David F. Skoll. */
- X/* */
- X/***************************************************************/
- X#include <stdio.h>
- X#include <ctype.h>
- X#include "config.h"
- X#ifdef HAVE_STDLIB_H
- X#include <stdlib.h>
- X#endif
- X#ifdef HAVE_MALLOC_H
- X#include <malloc.h>
- X#endif
- X#include "globals.h"
- X#include "err.h"
- X#include "types.h"
- X#include "protos.h"
- X
- X#define UPPER(c) ( ((c) >= 'a' && (c) <= 'z') ? (c) - 'a' + 'A' : (c) )
- X#define ABS(x) ( (x) < 0 ? -(x) : (x) )
- X#ifndef NL
- X#define NL "\n"
- X#endif
- X
- Xstatic char TODAY[] = "today";
- Xstatic char TOMORROW[] = "tomorrow";
- X
- X/***************************************************************/
- X/* */
- X/* DoSubst */
- X/* */
- X/* Process the % escapes in the reminder. If */
- X/* mode==NORMAL_MODE, ignore the %" sequence. If */
- X/* mode==CAL_MODE, process the %" sequence. */
- X/* */
- X/***************************************************************/
- X
- X#ifdef HAVE_PROTOS
- XPUBLIC int DoSubst(ParsePtr p, char *out, Trigger *t, TimeTrig *tt, int jul, int mode)
- X#else
- Xint DoSubst(p, out, t, tt, jul, mode)
- XParsePtr p;
- Xchar *out;
- XTrigger *t;
- XTimeTrig *tt;
- Xint jul, mode;
- X#endif
- X{
- X int diff = jul - JulianToday;
- X int curtime = SystemTime() / 60;
- X int err, done;
- X int c;
- X int d, m, y;
- X int tim = tt->ttime;
- X int h, min, hh, ch, cmin, chh;
- X char *pm, *cpm;
- X int tdiff, adiff, mdiff, hdiff;
- X char *mplu, *hplu, *when, *plu;
- X int has_quote = 0;
- X char *s = out;
- X char *os;
- X
- X FromJulian(jul, &y, &m, &d);
- X
- X if (tim == NO_TIME) tim = curtime;
- X tdiff = tim - curtime;
- X adiff = ABS(tdiff);
- X mdiff = adiff % 60;
- X hdiff = adiff / 60;
- X mplu = (mdiff == 1 ? "" : "s");
- X hplu = (hdiff == 1 ? "" : "s");
- X when = (tdiff < 0 ? "ago" : "from now");
- X
- X h = tim / 60;
- X min = tim % 60;
- X
- X pm = (h < 12) ? "am" : "pm";
- X hh = (h == 12) ? 12 : h % 12;
- X
- X ch = curtime / 60;
- X cmin = curtime % 60;
- X
- X cpm = (ch < 12) ? "am" : "pm";
- X chh = (ch == 12) ? 12 : ch % 12;
- X
- X switch(d) {
- X case 1:
- X case 21:
- X case 31: plu = "st"; break;
- X
- X case 2:
- X case 22: plu = "nd"; break;
- X
- X case 3:
- X case 23: plu = "rd"; break;
- X
- X default: plu = "th"; break;
- X }
- X
- X
- X while(1) {
- X c = ParseChar(p, &err, 0);
- X if (err) return err;
- X if (c == '\n') continue;
- X if (!c) {
- X if (mode != CAL_MODE) *s++ = '\n';
- X *s++ = 0;
- X break;
- X }
- X if (c != '%') {
- X *s++ = c;
- X continue;
- X }
- X c = ParseChar(p, &err, 0);
- X if (err) return err;
- X if (!c) {
- X *s++ = 0;
- X break;
- X }
- X os = s;
- X done = 0;
- X if (diff <= 1) {
- X switch(UPPER(c)) {
- X case 'A':
- X case 'B':
- X case 'C':
- X case 'E':
- X case 'F':
- X case 'G':
- X case 'H':
- X case 'I':
- X case 'J':
- X case 'K':
- X case 'L':
- X case 'U':
- X case 'V': sprintf(s, "%s", (diff ? TOMORROW : TODAY));
- X s += strlen(s);
- X done = 1;
- X break;
- X
- X default: done = 0;
- X }
- X }
- X
- X if (!done) switch(UPPER(c)) {
- X case 'A':
- X sprintf(s, "on %s, %d %s, %d", DayName[jul%7], d,
- X MonthName[m], y);
- X s += strlen(s);
- X break;
- X
- X case 'B':
- X sprintf(s, "in %d days' time", diff);
- X s += strlen(s);
- X break;
- X
- X case 'C':
- X sprintf(s, "on %s", DayName[jul%7]);
- X s += strlen(s);
- X break;
- X
- X case 'D':
- X sprintf(s, "%d", d);
- X s += strlen(s);
- X break;
- X
- X case 'E':
- X sprintf(s, "on %02d/%02d/%04d", d, m+1, y);
- X s += strlen(s);
- X break;
- X
- X case 'F':
- X sprintf(s, "on %02d/%02d/%04d", m+1, d, y);
- X s += strlen(s);
- X break;
- X
- X case 'G':
- X sprintf(s, "on %s, %d %s", DayName[jul%7], d, MonthName[m]);
- X s += strlen(s);
- X break;
- X
- X case 'H':
- X sprintf(s, "on %02d/%02d", d, m+1);
- X s += strlen(s);
- X break;
- X
- X case 'I':
- X sprintf(s, "on %02d/%02d", m+1, d);
- X s += strlen(s);
- X break;
- X
- X case 'J':
- X sprintf(s, "on %s, %s %d%s, %d", DayName[jul%7],
- X MonthName[m], d, plu, y);
- X s += strlen(s);
- X break;
- X
- X case 'K':
- X sprintf(s, "on %s, %s %d%s", DayName[jul%7],
- X MonthName[m], d, plu);
- X s += strlen(s);
- X break;
- X
- X case 'L':
- X sprintf(s, "on %04d/%02d/%02d", y, m+1, d);
- X s += strlen(s);
- X break;
- X
- X case 'M':
- X sprintf(s, "%s", MonthName[m]);
- X s += strlen(s);
- X break;
- X
- X case 'N':
- X sprintf(s, "%d", m+1);
- X s += strlen(s);
- X break;
- X
- X case 'O':
- X if (RealToday == JulianToday) sprintf(s, " (today)");
- X s += strlen(s);
- X break;
- X
- X case 'P':
- X sprintf(s, (diff == 1 ? "" : "s"));
- X s += strlen(s);
- X break;
- X
- X case 'Q':
- X sprintf(s, (diff == 1 ? "'s" : "s'"));
- X s += strlen(s);
- X break;
- X
- X case 'R':
- X sprintf(s, "%02d", d);
- X s += strlen(s);
- X break;
- X
- X case 'S':
- X sprintf(s, plu);
- X s += strlen(s);
- X break;
- X
- X case 'T':
- X sprintf(s, "%02d", m+1);
- X s += strlen(s);
- X break;
- X
- X case 'U':
- X sprintf(s, "on %s, %d%s %s, %d", DayName[jul%7], d,
- X plu, MonthName[m], y);
- X s += strlen(s);
- X break;
- X
- X case 'V':
- X sprintf(s, "on %s, %d%s %s", DayName[jul%7], d, plu,
- X MonthName[m]);
- X s += strlen(s);
- X break;
- X
- X case 'W':
- X sprintf(s, DayName[jul%7]);
- X s += strlen(s);
- X break;
- X
- X case 'X':
- X sprintf(s, "%d", diff);
- X s += strlen(s);
- X break;
- X
- X case 'Y':
- X sprintf(s, "%d", y);
- X s += strlen(s);
- X break;
- X
- X case 'Z':
- X sprintf(s, "%d", y % 100);
- X s += strlen(s);
- X break;
- X
- X case '1':
- X if (tdiff == 0)
- X sprintf(s, "now");
- X else if (hdiff == 0)
- X sprintf(s, "%d minute%s %s", mdiff, mplu, when);
- X else if (mdiff == 0)
- X sprintf(s, "%d hour%s %s", hdiff, hplu, when);
- X else
- X sprintf(s, "%d hour%s and %d minute%s %s", hdiff, hplu, mdiff, mplu, when);
- X s += strlen(s);
- X break;
- X
- X case '2':
- X sprintf(s, "at %d:%02d%s", hh, min, pm);
- X s += strlen(s);
- X break;
- X
- X case '3': sprintf(s, "at %02d:%02d", h, min);
- X s += strlen(s);
- X break;
- X
- X case '4': sprintf(s, "%d", tdiff);
- X s += strlen(s);
- X break;
- X
- X case '5': sprintf(s, "%d", adiff);
- X s += strlen(s);
- X break;
- X
- X case '6': sprintf(s, when);
- X s += strlen(s);
- X break;
- X
- X case '7': sprintf(s, "%d", hdiff);
- X s += strlen(s);
- X break;
- X
- X case '8': sprintf(s, "%d", mdiff);
- X s += strlen(s);
- X break;
- X
- X case '9': sprintf(s, mplu);
- X s += strlen(s);
- X break;
- X
- X case '0': sprintf(s, hplu);
- X s += strlen(s);
- X break;
- X
- X case '!': sprintf(s, (tdiff >= 0 ? "is" : "was"));
- X s += strlen(s);
- X break;
- X
- X case '@': sprintf(s, "%d:%02d%s", chh, cmin, cpm);
- X s += strlen(s);
- X break;
- X
- X case '#': sprintf(s, "%02d:%02d", ch, cmin);
- X s += strlen(s);
- X break;
- X
- X case '_': sprintf(s, "%s", NL);
- X s += strlen(s);
- X break;
- X
- X case QUOTE_MARKER:
- X /* Swallow any QUOTE_MARKERs which may somehow creep in... */
- X break;
- X
- X case '"':
- X *s++ = QUOTE_MARKER;
- X has_quote = 1;
- X break;
- X
- X default:
- X *s++ = c;
- X }
- X if (isupper(c)) *os = UPPER(*os);
- X }
- X
- X/* We're outside the big while loop. The only way to get here is for c to
- X be null. Now we go through and delete %" sequences, if it's the
- X NORMAL_MODE, or retain only things within a %" sequence if it's the
- X CAL_MODE. */
- X
- X/* If there are NO quotes, then: If CAL_MODE && RUN_TYPE, we don't want the
- X reminder in the calendar. Zero the output buffer and quit. */
- X if (!has_quote) {
- X if (mode == CAL_MODE && t->typ == RUN_TYPE) *out = 0;
- X return OK;
- X }
- X
- X/* There ARE quotes. If in CAL_MODE, delete everything before first quote
- X and after second quote. If in NORMAL_MODE, delete the %" sequences. */
- X
- X s = out;
- X os = out;
- X if (mode == NORMAL_MODE) {
- X while (*s) {
- X if (*s != QUOTE_MARKER) *os++ = *s;
- X s++;
- X }
- X *os = 0;
- X } else {
- X
- X/* Skip past the quote marker */
- X while (*s && (*s != QUOTE_MARKER)) s++;
- X
- X/* Security check... actually, *s must == QUOTE_MARKER at this point, but
- X it doesn't hurt to make it a bit robust. */
- X if (*s) s++;
- X
- X/* Copy the output until the next QUOTE_MARKER */
- X while (*s && (*s != QUOTE_MARKER)) *os++ = *s++;
- X *os = 0;
- X }
- X
- X return OK;
- X}
- X
- X
- SHAR_EOF
- $TOUCH -am 1109141292 dosubst.c &&
- chmod 0600 dosubst.c ||
- echo "restore of dosubst.c failed"
- set `wc -c dosubst.c`;Wc_c=$1
- if test "$Wc_c" != "9144"; then
- echo original size 9144, current size $Wc_c
- fi
- fi
- echo "End of part 3, continue with part 4"
- exit 0
-
- exit 0 # Just in case...
-