DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T i

⟦8966b9b11⟧ TextFile

    Length: 8894 (0x22be)
    Types: TextFile
    Names: »infosub.c«

Derivation

└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
    └─⟦e7f64e0c0⟧ »EurOpenD3/mail/vmh.tar.Z« 
        └─⟦dcb95597f⟧ 
            └─⟦this⟧ »infosub.c« 

TextFile

#ifndef lint
static char rcsid[] =
	"$Header: infosub.c,v 2.6 86/02/16 15:08:12 deboor Exp $";

static char notice[] =
	"This program is in the public domain and is available for unlimited \
distribution as long as this notice is enclosed.";
#endif

/*
 * routine for creating an individual INFO structure.
 *
 * $Source: /c/support/deboor/usr/src/old/vmh/RCS/infosub.c,v $
 * $Revision: 2.6 $
 * $Author: deboor $
 *
 * FUNCTIONS:
 *	infosub		scan a single message
 */

#include "vmh.h"

static	char	*myname = (char *) 0;


struct	dayt	{
	u_char	day,
		month,
		year;
} *parsedat();

/*
** off_t
** offtonb (soff, str) off_t soff; char *str;
**	skips the first word (series of non-blank) of str and
**	then moves to the first non-blank after that. the offset
**	of this character is returned. If there is no second word,
**	-1 is returned.
*/
static off_t
offtonb (soff, str)
	off_t	soff;
	char	*str;
{
	register char	*cp;

	for (cp = str; *cp && !isspace (*cp); cp++)
		;
	if (! *cp)
		return ((off_t) -1);
	for (;*cp && isspace (*cp); cp++)
		;
	if (! *cp)
		return ((off_t) -1);
	return (soff + cp - str);
}

INFO *
infosub(inb, innum)
	register FILE	*inb;      /* Open msg file (not the folder) */
	int		innum;      /* Msg number of the current msg */
{

	char		buf[BUFSIZ];	/* enlarge? */
	register INFO	*srec;
	register off_t	cpos;
	off_t		fromoff = -1,
			tooff = -1;
	int		readsubj = FALSE,
			readdate = FALSE,
			readfrom = FALSE,
			readto = FALSE;
	int		sc;
	char		*cp;
	struct	dayt	*dt;
	struct stat	sb;		/* owner and group x bit determine if */
					/*  msg is "seen" or "replied"        */
					/* THIS IS A HACK. Sequences? */

	if(!myname)
		myname = getenv("USER");
	buf[0] = '\0';
	srec = AllocST(INFO);	/* get a info record */
	srec->i_subject = srec->i_path = srec->i_body = (off_t) -1;
	srec->i_mnum = innum;

	/*
	 * stat the open message, and make note of owner and group
	 *      execute bits.
	 */
	if( fstat( fileno(inb), &sb ) != 0 )
		punt( "infosub: Can't fstat msg" );
	if( IfSeen(sb.st_mode))
		srec->i_seen = 1;
	if( IfReply(sb.st_mode))
		srec->i_replied = 1;
	srec->i_size = sb.st_size;
	srec->i_mtime = sb.st_mtime;

	for(;;) {
		cpos = ftell (inb);
		sc = readheader (buf, sizeof(buf), inb, RH_NONL);
		if (! sc) {	/* => out of headers */
			srec->i_body = cpos+1;
			break;
		} else {
			switch (buf[0]) {
			case 'f': case 'F':
				if (uprf (buf, "from:") && ! readfrom) {
			from:
					readfrom = TRUE;
					if (! isme (buf)) {
						fromoff = offtonb (cpos, buf);
						srec->i_fromMe = 0;
					} else {
						srec->i_fromMe = 1;
					}
				} else if (uprf (buf, "forwarded:")) {
					srec->i_forwarded = 1;
				}
				break;
			case 'd': case 'D':
				if (uprf (buf, "date:") && !readdate) {
			date:
					for (cp = buf; *cp && *cp != ':'; cp++)
						;
/* hmmm.... */
					dt = parsedat (cp++);
					srec->i_month = dt->month;
					srec->i_day = dt->day;
					srec->i_year = dt->year;
					readdate = TRUE;
				}; break;
			case 's': case 'S':
				if (uprf (buf, "subject:") && !readsubj) {
			subject:
					srec->i_subject = offtonb (cpos, buf);
					readsubj = TRUE;
				}; break;
			case 't': case 'T':
				if (uprf (buf, "to:") && !readto){
			to:
					tooff = offtonb (cpos, buf);
					readto = TRUE;
				}; break;
			case 'r': case 'R':
				if (uprf (buf, "replied:")) {
					srec->i_replied = 1;
				} else if (uprf (buf, "resent:")) {
					srec->i_resent = 1;
				} else if (uprf (buf, "resent-from:")) {
					goto from;
				} else if (uprf (buf, "resent-to:")) {
					goto to;
				} else if (uprf (buf, "resent-subject:")) {
					goto subject;
				} else if (uprf (buf, "resent-date:")) {
					goto date;
				}
			} /* switch */

			if (sc < 0)
				while (fgets (buf, sizeof(buf), inb) &&
					! index (buf, '\n'))
					;
		}
	}
	/* set i_fromMe here */
	srec->i_path = (srec->i_fromMe ? tooff : fromoff);
	return (srec);
}

/*
 * isme (addr)
 * register char *addr;
 *	this will eventually return TRUE if the passed  addr  is the
 *	person. haven't figured out yet how to go about it.
 */
static int
isme (addr)
	register char	*addr;
{
	if (strindex (myname, addr) != -1)	/* use searchline() ? */
		return 1;
	return (0);
}

struct	tm	*localtime();
time_t		time();

/*
 * dperm[] is an array of the day-of-the-year of the first day of the month
 */
int	dperm[] = {
	0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
};

static struct dayt *
parsedat(dbuf)
	register char *dbuf;
{
	register char		*cp;
	
	register		pnum;	/* partial number */
	static struct tm	*locvec = (struct tm *) 0;
	time_t			now;
	struct tm		dt;
	static struct	dayt	date;

	if(!locvec) {
		now = time((time_t *)0);
		Bcopy (localtime(&now), locvec = AllocS(tm), sizeof(struct tm));
	}

	/* Collect the various fields of the date */
	for (cp = dbuf; *cp && ! isdigit (*cp); cp++)
		;
	if (! *cp)
		goto baddate;

	/* get the day */
	for (pnum = 0; isdigit (*cp); cp++)
		pnum = pnum * 10 + *cp - '0';
	dt.tm_mday = pnum;

	/* get the month */
	while (*cp && !isalpha(*cp))
		cp++;
	
	if (! *cp)
		goto baddate;

	if ((dt.tm_mon = findmonth (cp)) == 0)
		dt.tm_mon = locvec->tm_mon+1; /* + 1 ? */

	/* get the year */
	while (*cp && !isdigit(*cp))	/* skip over month and wsp */
		cp++;

	if (! *cp)
		goto baddate;

	for (pnum = 0; isdigit(*cp); cp++)
		pnum = pnum * 10 + *cp - '0';
	dt.tm_year = pnum;
	date.day	= (u_char) dt.tm_mday;
	date.month	= (u_char) dt.tm_mon;
	date.year	= (u_char) dt.tm_year % 100;
	return (&date);

baddate:
	date.day = date.month = date.year = (u_char) 0;
	return (&date);

#ifdef notdef
	
	while (*cp && ! isdigit (*cp))
		cp++;

	if (! *cp)
		goto baddate;

	for (pnum = 0; isdigit (*cp); cp++)
		pnum = pnum * 10 + *cp - '0';
	dt.tm_hour = pnum;

	while (*cp && ! isdigit(*cp))
		cp++;

	if (! *cp)
		goto baddate;

	for (pnum = 0; isdigit (*cp); cp++)
		pnum = pnum * 10 + *cp - '0';
	
	while (*cp && !isspace (*cp))
		cp++;
	while (*cp && isspace(*cp))
		cp++;
	tz = cp;
	while (*cp && !isspace(*cp))
		cp++;
	*cp = '\0';
	
	/* 86400 s/day = 60s/min * 60 min/hr * 24hr/day */
	now = (dt.tm_hour * 60 + pnum) * 60 +
		86400 * (dperm[dt.tm_mon - 1] + (dt.tm_mday - 1) +
			365 * (dt.tm_year - (dt.tm_year > 100 ? 1970 : 70)));
	return (adjtime(now, tz));
baddate:
	return (time ((long *) 0));
#endif notdef
}

static struct mtab {	/* a 'trie' of sorts. */
	char		kc;
	struct	mtab	*ntbl;
	int		mno;
} jutbl[] = {		/* months which begin with 'ju' */
	'n',	0,	6,	/* june */
	'l',	0,	7,	/* july */
	'\0',	0,	0,
}, jtbl[] = {		/* months which begin with 'j' */
	'a',	0,	1,	/* january */
	'u',	jutbl,	0,	/* june or july */
	'\0',	0,	0,
}, matbl[] = {		/* begin with 'ma' */
	'r',	0,	3,	/* march */
	'y',	0,	5,	/* may */
	'\0',	0,	0,
}, mtbl[] = {		/* begin with 'm' */
	'a',	matbl,	0,	/* may or march */
	'\0',	0,	0,
}, atbl[] = {		/* begin with 'a' */
	'u',	0,	8,	/* august */
	'p',	0,	4,	/* april */
	'\0',	0,	0,
}, fchr[] = {		/* first character */
	'j',	jtbl,	0,	/* january, june or july */
	'm',	mtbl,	0,	/* march or may */
	'a',	atbl,	0,	/* april or august */
	'f',	0,	2,	/* february */
	's',	0,	9,	/* september */
	'o',	0,	10,	/* october */
	'n',	0,	11,	/* november */
	'd',	0,	12,	/* december */
	'\0',	0,	0,
};

static int
findmonth(str)
	char	*str;
{
	register char	*cp = str;
	register	mno;
	register struct	mtab	*tbl;
	register	n;

	tbl = fchr;
	while (*cp) {
		if (isupper(*cp))
			*cp = tolower(*cp);
		cp++;
	}
	for (cp = str, mno = n = 0; !mno && tbl[n].kc; n++) {
		if (*cp == tbl[n].kc) {
			if (tbl[n].ntbl) {
				tbl = tbl[n].ntbl;
				n = -1;	/* voids the n++ above */
			} else {
				mno = tbl[n].mno;
			}
			cp++;	/* advance to next letter */
		}
	}
	return mno;
}
#ifdef notdef
struct tzone {
	char	*z_nam;
	int	z_hour;
	int	z_min;
};
struct tzone zonetab[] = {
     {  "GMT",   0,       0,    },
     {  "NST",  -3,     -30,    },
     {  "AST",  -4,       0,    },
     {  "ADT",  -3,       0,    },
     {  "EST",  -5,       0,    },
     {  "EDT",  -4,       0,    },
     {  "CST",  -6,       0,    },
     {  "CDT",  -5,       0,    },
     {  "MST",  -7,       0,    },
     {  "MDT",  -6,       0,    },
     {  "PST",  -8,       0,    },
     {  "PDT",  -7,       0,    },
     {  "YST",  -9,       0,    },
     {  "YDT",  -8,       0,    },
     {  "HST", -10,       0,    },
     {  "HDT",  -9,       0,    },
     {  "BST", -11,       0,    },
     {  "BDT", -10,       0,    },
     {  "Z",     0,       0,    },
     {  "A",    -1,       0,    },
     {  "M",   -12,       0,    },
     {  "N",     1,       0,    },
     {  "Y",    12,       0,    },
     {  0                       }
 };

/* adjust for timezone */
static time_t
adjtime(tyme, tz)
	time_t	tyme;
	char	*tz;
{
	register	i;
	register	adj = 0;

	for (i = 0; !adj && zonetab[i].z_nam; i++) {
		if (! strcmp (tz, zonetab[i].z_nam)) {
			adj = (zonetab[i].z_hour * 60 + zonetab[i].z_min) * 60;
		}
	}
	return (tyme - adj);
}
#endif notdef