|
|
BSD 4.3tahoe
/*
* Copyright (c) 1983 Eric P. Allman
* Copyright (c) 1988 Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#ifndef lint
static char sccsid[] = "@(#)arpadate.c 5.9 (Berkeley) 6/30/88";
#endif /* not lint */
# include "conf.h"
# ifdef USG
# include <time.h>
# else
# include <sys/time.h>
# include <sys/types.h>
# include <sys/timeb.h>
# endif USG
# include "useful.h"
# ifdef USG
# define OLDTIME
# endif USG
/*
** ARPADATE -- Create date in ARPANET format
**
** Parameters:
** ud -- unix style date string. if NULL, one is created.
**
** Returns:
** pointer to an ARPANET date field
**
** Side Effects:
** none
**
** WARNING:
** date is stored in a local buffer -- subsequent
** calls will overwrite.
**
** Bugs:
** Timezone is computed from local time, rather than
** from whereever (and whenever) the message was sent.
** To do better is very hard.
**
** Some sites are now inserting the timezone into the
** local date. This routine should figure out what
** the format is and work appropriately.
*/
char *
arpadate(ud)
register char *ud;
{
register char *p;
register char *q;
static char b[40];
extern char *ctime();
register int i;
extern struct tm *localtime();
extern bool fconvert();
# ifdef OLDTIME
long t;
extern long time();
# else OLDTIME
struct timeb t;
extern struct timeb *ftime();
# endif OLDTIME
# ifdef USG
extern char *tzname[2];
# endif USG
/*
** Get current time.
** This will be used if a null argument is passed and
** to resolve the timezone.
*/
# ifdef OLDTIME
(void) time(&t);
if (ud == NULL)
ud = ctime(&t);
# else
ftime(&t);
if (ud == NULL)
ud = ctime(&t.time);
# endif OLDTIME
/*
** Crack the UNIX date line in a singularly unoriginal way.
*/
q = b;
p = &ud[0]; /* Mon */
*q++ = *p++;
*q++ = *p++;
*q++ = *p++;
*q++ = ',';
*q++ = ' ';
p = &ud[8]; /* 16 */
if (*p == ' ')
p++;
else
*q++ = *p++;
*q++ = *p++;
*q++ = ' ';
p = &ud[4]; /* Sep */
*q++ = *p++;
*q++ = *p++;
*q++ = *p++;
*q++ = ' ';
p = &ud[22]; /* 79 */
*q++ = *p++;
*q++ = *p++;
*q++ = ' ';
p = &ud[11]; /* 01:03:52 */
for (i = 8; i > 0; i--)
*q++ = *p++;
/* -PST or -PDT */
# ifdef USG
if (localtime(&t)->tm_isdst)
p = tzname[1];
else
p = tzname[0];
# else
p = localtime(&t.time)->tm_zone;
# endif USG
if ((strncmp(p, "GMT", 3) == 0 || strncmp(p, "gmt", 3) == 0) &&
p[3] != '\0')
{
/* hours from GMT */
p += 3;
*q++ = *p++;
if (p[1] == ':')
*q++ = '0';
else
*q++ = *p++;
*q++ = *p++;
p++; /* skip ``:'' */
*q++ = *p++;
*q++ = *p++;
*q = '\0';
}
else if (!fconvert(p, q))
{
*q++ = ' ';
*q++ = *p++;
*q++ = *p++;
*q++ = *p++;
*q = '\0';
}
return (b);
}
/*
** FCONVERT -- convert foreign timezones to ARPA timezones
**
** This routine is essentially from Teus Hagen.
**
** Parameters:
** a -- timezone as returned from UNIX.
** b -- place to put ARPA-style timezone.
**
** Returns:
** TRUE -- if a conversion was made (and b was filled in).
** FALSE -- if this is not a recognized local time.
**
** Side Effects:
** none.
*/
/* UNIX to arpa conversion table */
struct foreign
{
char *f_from;
char *f_to;
};
static struct foreign Foreign[] =
{
{ "EET", "+0200" }, /* eastern europe */
{ "MET", "+0100" }, /* middle europe */
{ "WET", "GMT" }, /* western europe */
{ "EET DST", "+0300" }, /* daylight saving times */
{ "MET DST", "+0200" },
{ "WET DST", "+0100" },
{ NULL, NULL }
};
bool
fconvert(a, b)
register char *a;
register char *b;
{
register struct foreign *euptr;
register char *p;
for (euptr = Foreign; euptr->f_from != NULL; euptr++)
{
if (!strcasecmp(euptr->f_from, a))
{
p = euptr->f_to;
*b++ = ' ';
while (*p != '\0')
*b++ = *p++;
*b = '\0';
return (TRUE);
}
}
return (FALSE);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.