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 r

⟦9a1237c5d⟧ TextFile

    Length: 3810 (0xee2)
    Types: TextFile
    Names: »rfc2UTC.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« 
        └─⟦e5a54fb17⟧ 
            └─⟦this⟧ »pp-5.0/Lib/format/rfc2UTC.c« 

TextFile

/* rfc2UTC.c - Converts an RFC string into UTC structure */

# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/format/RCS/rfc2UTC.c,v 5.0 90/09/20 16:05:16 pp Exp Locker: pp $";
# endif

/*
 * $Header: /cs/research/pp/hubris/pp-beta/Lib/format/RCS/rfc2UTC.c,v 5.0 90/09/20 16:05:16 pp Exp Locker: pp $
 *
 * $Log:	rfc2UTC.c,v $
 * Revision 5.0  90/09/20  16:05:16  pp
 * rcsforce : 5.0 public release
 * 
 */



#include "util.h"
#include <isode/cmd_srch.h>
#include "mta.h"


extern CMD_TABLE        tbl_month[];

/* ---------------------  Begin  Routines  -------------------------------- */




/*
This routine converts a RFC 822 standard time string like:
	"Tue, 16 Aug 88 10:23:21 BST"
into a UTC structure. Where "Tue," is optional.
*/

extern char *index ();

static void getzone ();

int rfc2UTC (str, utc)
char    *str;
UTC     *utc;
{
	UTC     ut;
	char    *cp, *cp2;
	char    tbuf[LINESIZE];
	int     n;


	PP_DBG (("Lib/rfc2UTC (%s)", str));

	ut = (UTC) smalloc (sizeof *ut);
	bzero ((char *)ut, sizeof *ut);
	*utc = NULL;

	cp = str;
#define skips(c)        while (isspace (*c)) c++
#define skipsp(c)       while (isspace (*c) || ispunct(*c)) c++;

	skips (cp);

	if (isalpha (*cp)) {
		while(isalpha (*cp))
			cp ++;
		skipsp (cp);
	}


	/* month day */
	if (isdigit (*cp)) {
		n = 0;
		while (isdigit (*cp))
			n = n * 10 + (*cp++ - '0');
		ut -> ut_mday = n;
		skips (cp);
	}
	else {
		PP_LOG (LLOG_EXCEPTIONS, ("Bad month day '%s'", str));
		free(ut);
		return NOTOK;
	}

	/* Month */
	if (isalpha (*cp)) {
		for (cp2 = tbuf; isalpha(*cp); *cp2 ++ = *cp++)
			continue;
		*cp2 = NULL;
		ut -> ut_mon = cmd_srch (tbuf, tbl_month) + 1;
		skips (cp);
	}
	else    {
		free(ut);
		return NOTOK;
	}

	/* -- Year -- */
	if (isdigit (*cp)) {
		n = 0;
		while (isdigit (*cp))
			n = n * 10 + (*cp ++ - '0');
		if (n < 100)
			ut -> ut_year = 1900 + n;
		else
			ut -> ut_year = n;
		skips (cp);
	}
	else {
		free (ut);
		return NOTOK;
	}

	if (isdigit (*cp)) {
		n = 0;
		while (isdigit(*cp))
			n = n * 10 + (*cp++ - '0');
		ut -> ut_hour = n;
		skips (cp);
	}

	/* -- Minute & Secs -- */
	if (*cp == ':') {
		cp ++;
		n = 0;
		while (isdigit (*cp))
			n = n * 10 + (*cp++ - '0');
		ut -> ut_min = n;
		skips (cp);
	}
	if (*cp == ':') {
		cp ++;
		n = 0;
		while (isdigit (*cp))
			n = n * 10 + (*cp ++ - '0');
		ut -> ut_sec = n;
		ut -> ut_flags |= UT_SEC;
		skips (cp);
	}

	getzone (cp, ut);

	*utc = ut;
	PP_DBG (("Lib/rfc2UTC returns (%.22s)", utct2str (ut)));

	return OK;
}



static CMD_TABLE        zone_tbl[] = {  /* some of the more popular zones... */
	"GMT",  0,
	"UT",   0,
	"WET",  0,
	"WDT",  1,
	"BST",  1,
	"EST",  -5,
	"EDT",  -4,
	"CST",  -6,
	"CDT",  -5,
	"MST",  -7,
	"MDT",  -6,
	"PST",  -8,
	"PDT",  -7,
	"Z",    0,
	"A",    -1,
	"B",    -2,
	"C",    -3,
	"D",    -4,
	"E",    -5,
	"F",    -6,
	"G",    -7,
	"H",    -8,
	"I",    -9,
	"K",    -10,
	"L",    -11,
	"M",    -12,
	"N",    1,
	"O",    2,
	"P",    3,
	"Q",    4,
	"R",    5,
	"S",    6,
	"T",    7,
	"U",    8,
	"V",    9,
	"W",    10,
	"X",    11,
	"Y",    12,
	0,      -99
};

static void getzone (bp, ut)
char    *bp;
UTC     ut;
{
	int     hours, mins;
	char    *cp, zbuf[64];

	while (isspace (*bp))
		bp ++;

	if (*bp == '+' || *bp == '-') { /* offset TZ */
		if (sscanf (bp, "%*c%02d%02d", &hours, &mins) != 2)
			return;
		ut -> ut_zone = 60 * hours + mins;
		if (*bp == '-')
			ut -> ut_zone = - ut -> ut_zone;

		ut -> ut_flags |= UT_ZONE;
		return;
	}
	if (isupper(*bp)) {     /* 'real' TZ (e.g. BST) */
		for (cp = zbuf; isupper(*bp); )
		      *cp++ = *bp ++;
		*cp = 0;
		if ((hours = cmd_srch (zbuf, zone_tbl)) != -99) {
			ut -> ut_flags |= UT_ZONE;
			ut -> ut_zone = hours * 60;
			return;
		}
	}
	PP_LOG (LLOG_EXCEPTIONS, ("Unknown timezone syntax %s", bp));
}