[net.sources] Arpatime on UNIX SYSIII/Masscomp/etc.

sob@neuro1.UUCP (Stan Barber) (10/17/85)

The following shar archive is what I use to generate arpatime strings
on our masscomp. I also know it works on Sperry 5000 and Sun.

Have fun!
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	Makefile
#	atime.c
#	dtime.c
#	tws.h
# This archive created: Wed Oct 16 17:48:31 1985
export PATH; PATH=/bin:$PATH
if test -f 'Makefile'
then
	echo shar: will not over-write existing file "'Makefile'"
else
cat << \SHAR_EOF > 'Makefile'
CFLAGS= -DMASSCOMP 

atime: dtime.o atime.o
	cc -o atime dtime.o atime.o


SHAR_EOF
fi # end of overwriting check
if test -f 'atime.c'
then
	echo shar: will not over-write existing file "'atime.c'"
else
cat << \SHAR_EOF > 'atime.c'
#include <stdio.h>

main()
{

printf("%s\n",dtimenow());

}
SHAR_EOF
fi # end of overwriting check
if test -f 'dtime.c'
then
	echo shar: will not over-write existing file "'dtime.c'"
else
cat << \SHAR_EOF > 'dtime.c'
/* dtime.c - routines to do ``ARPA-style'' time structures */

#include "tws.h"
#include <stdio.h>
#include <sys/types.h>
#include <sys/timeb.h>
#ifndef	BSD42
#include <time.h>
#else	BSD42
#include <sys/time.h>
#endif	BSD42

/*  */

#define	abs(a)	(a >= 0 ? a : -a)

/*  */

static char *month[] = {
    "Jan", "Feb", "Mar", "Apr", "May", "Jun",
    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

static char *day[] = {
    "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
};

/*  */

struct keywd {
    char   *key;
    int     value;
};

#define	NZONES	(sizeof (zones)/sizeof (struct keywd))

static struct keywd zones[] = {	/* order sensitive */
    "UT", 0,
    "EST", -5, "CST", -6,  "MST", -7, "PST", -8, "PDT", -9,
    "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
};


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

/*  */

char   *dtime (clock)
long   *clock;
{
    return dasctime (dlocaltime (clock));
}


char *dtimenow()
{
    long    clock;

    time (&clock);
    return dtime (&clock);
}


char   *dctime (tw)
struct tws *tw;
{
    static char buffer[25];

    if (!tw)
	return NULL;

    sprintf (buffer, "%.3s %.3s %02d %02d:%02d:%02d %.4d\n",
	    day[tw -> tw_wday], month[tw -> tw_mon], tw -> tw_mday,
	    tw -> tw_hour, tw -> tw_min, tw -> tw_sec,
	    tw -> tw_year >= 100 ? tw -> tw_year : 1900 + tw -> tw_year);

    return buffer;
}

/*  */

struct tws *dlocaltime (clock)
long   *clock;
{
    struct tm  *tm;
    struct timeb    tb;
    static struct tws   tw;

    if (!clock)
	return NULL;

    tm = localtime (clock);
    tw.tw_sec = tm -> tm_sec;
    tw.tw_min = tm -> tm_min;
    tw.tw_hour = tm -> tm_hour;
    tw.tw_mday = tm -> tm_mday;
    tw.tw_mon = tm -> tm_mon;
    tw.tw_year = tm -> tm_year;
    tw.tw_wday = tm -> tm_wday;
    tw.tw_yday = tm -> tm_yday;
    tw.tw_isdst = tm -> tm_isdst;

    ftime (&tb);
    tw.tw_zone = -tb.timezone;
    tw.tw_sday = 0;

    return (&tw);
}

/*  */

char   *dasctime (tw)
struct tws *tw;
{
    static char buffer[80],
                result[80];

    if (!tw)
	return NULL;

    sprintf (buffer, "%02d %s %02d %02d:%02d:%02d %s",
	    tw -> tw_mday, month[tw -> tw_mon], tw -> tw_year,
	    tw -> tw_hour, tw -> tw_min, tw -> tw_sec,
	    dtimezone (tw -> tw_zone, tw -> tw_isdst));

    if (tw -> tw_sday > 0)
	sprintf (result, "%s, %s", day[tw -> tw_wday], buffer);
    else
	if (tw -> tw_sday < 0)
	    strcpy (result, buffer);
	else
/*	    sprintf (result, "%s (%s)", buffer, day[tw -> tw_wday]);*/
	    sprintf (result, "%s, %s", day[tw -> tw_wday], buffer);
    return result;
}

/*  */

char   *dtimezone (zone, dst)
int     zone,
        dst;
{
    int     i,
            j,
            hours,
            mins;
    static char buffer[10];

    if (zone < 0) {
	mins = -((-zone) % 60);
	hours = -((-zone) / 60);
    }
    else {
	mins = zone % 60;
	hours = zone / 60;
    }
#ifndef MASSCOMP
    if (dst)
	hours -= 1;
#endif
    if (mins == 0)
	for (i = 0, j = NZONES; i < j; i++)
	    if (zones[i].value == hours) {
		strcpy (buffer, zones[i].key);
		if (dst && buffer[1] == 'S')
		    buffer[1] = 'D';
		return buffer;
	    }

    sprintf (buffer, "%s%02d%02d",
	    zone < 0 ? "-" : "+", abs (hours), abs (mins));
    return buffer;
}
SHAR_EOF
fi # end of overwriting check
if test -f 'tws.h'
then
	echo shar: will not over-write existing file "'tws.h'"
else
cat << \SHAR_EOF > 'tws.h'
/* tws.h */

struct tws {
    int     tw_sec;
    int     tw_min;
    int     tw_hour;
    int     tw_mday;
    int     tw_mon;
    int     tw_year;
    int     tw_wday;
    int     tw_yday;
    int     tw_isdst;
    int     tw_zone;
    int     tw_sday;
};

char   *dtime (), *dasctime (), *dtimezone (), *dctime (), *dtimenow ();
struct tws *dlocaltime (), *dparsetime ();
SHAR_EOF
fi # end of overwriting check
#	End of shell archive
exit 0

-- 
Stan		uucp:{ihnp4!shell,rice}!neuro1!sob     Opinions expressed
Olan		ARPA:sob@rice.arpa		       here are ONLY mine &
Barber		CIS:71565,623   BBS:(713)660-9262      noone else's.