[comp.sources.misc] v16i073: ECU 3 log-to-Excel spreadsheet, Part02/02

wht@n4hgf.Mt-Park.GA.US (01/13/91)

Submitted-by: wht@n4hgf.Mt-Park.GA.US
Posting-number: Volume 16, Issue 73
Archive-name: ecu3-excel/part02

#!/bin/sh
# This is part 02 of ecu3-excel
# ============= excel/ecuxls.c ==============
if test ! -d 'excel'; then
    echo 'x - creating directory excel'
    mkdir 'excel'
fi
if test -f 'excel/ecuxls.c' -a X"$1" != X"-c"; then
	echo 'x - skipping excel/ecuxls.c (File already exists)'
else
echo 'x - extracting excel/ecuxls.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'excel/ecuxls.c' &&
X/* CHK=0x149E */
Xchar *revision = "1.00";
X/*+-------------------------------------------------------------------------
X	ecuxls.c - place ECU log info in Excel spreadsheets
X	wht@n4hgf.Mt-Park.GA.US
X
X  Defined functions:
X	ce_list_add(tce)
X	ce_list_remove(tce)
X	ce_list_search(pid)
X	get_home_dir(home_dir)
X	log_connect(logbuf)
X	log_disconnect(x,logbuf)
X	log_receive(x,logbuf)
X	main(argc,argv)
X	make_brFONT(name,height,attr)
X	make_brFORMAT(picture)
X	make_brLABEL(str)
X	make_brNAME_area(name,firstrow,firstcol,rows,cols)
X	make_brNAME_cell(name,row,col)
X	rearranged_date(date)
X	strlwr(str)
X	xls_append(filename)
X	xls_create_Clog(filename)
X	xls_create_Rlog(filename)
X	xls_get_brDIMENSION(x,dimension)
X	xls_now(now)
X	xls_write_Clog_record(x,row,date,sys,phone,secs)
X	xls_write_Rlog_record(x,row,date,from,length,name)
X	xls_write_br(x,bhdr)
X	xls_write_eof_and_close(x)
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:01-01-1990-16:19-wht@n4hgf-creation */
X
X#include <stdio.h>
X#ifdef NULL
X#undef NULL
X#endif
X#include <sys/types.h>
X#include <sys/stat.h>
X#include <ctype.h>
X#include <errno.h>
X#include <fcntl.h>
X#include <malloc.h>
X#include <memory.h>
X#include <signal.h>
X#include <string.h>
X#include <time.h>
X#include <pwd.h>
X
X#include "biff.h"
X
Xlong atol();
X
Xtypedef struct xls_file
X{
X	char filename[128];
X	FILE *fp;
X	long dimension_fpos;
X	int first_data_row;
X	int last_data_row;
X} XLS_FILE;
X
Xtypedef struct ce		/* connection linked list entry */
X{
X	struct ce *prev;
X	struct ce *next;	/* we don't need double links, but logic was handy */
X	int pid;			/* ecu pid for a connection */
X	char sys[32];		/* system connected to */
X	char date[32];
X} CE;
X
X#if defined(__STDC__)
Xvoid ce_list_add(struct ce *);
Xvoid ce_list_remove(struct ce *);
Xstruct ce *ce_list_search(int);
Xint get_home_dir(char *);
Xvoid strlwr(char *);
Xdouble xls_now(long);
Xstruct brLABEL *make_brLABEL(char *);
Xstruct brFONT *make_brFONT(char *,int,int);
Xstruct brFORMAT *make_brFORMAT(char *);
Xstruct brNAME *make_brNAME_cell(char *,int,int);
Xstruct brNAME *make_brNAME_area(char *,int,int,int,int);
Xlong xls_write_br(struct xls_file *,struct bhdr *);
Xlong xls_get_brDIMENSION(struct xls_file *,struct brDIMENSION *);
Xstruct xls_file *xls_append(char *);
Xstruct xls_file *xls_create_Rlog(char *);
Xlong xls_write_Rlog_record(struct xls_file *,int,char *,char *,long,char *);
Xstruct xls_file *xls_create_Clog(char *);
Xlong xls_write_Clog_record(struct xls_file *,int,char *,char *,char *,long);
Xvoid xls_write_eof_and_close(struct xls_file *);
Xchar *rearranged_date(char *);
Xvoid log_connect(char *);
Xint log_disconnect(struct xls_file *,char *);
Xvoid log_receive(struct xls_file *,char *);
Xint main(int,char **);
X#else
Xvoid ce_list_add();
Xvoid ce_list_remove();
Xstruct ce *ce_list_search();
Xint get_home_dir();
Xvoid strlwr();
Xdouble xls_now();
Xstruct brLABEL *make_brLABEL();
Xstruct brFONT *make_brFONT();
Xstruct brFORMAT *make_brFORMAT();
Xstruct brNAME *make_brNAME_cell();
Xstruct brNAME *make_brNAME_area();
Xlong xls_write_br();
Xlong xls_get_brDIMENSION();
Xstruct xls_file *xls_append();
Xstruct xls_file *xls_create_Rlog();
Xlong xls_write_Rlog_record();
Xstruct xls_file *xls_create_Clog();
Xlong xls_write_Clog_record();
Xvoid xls_write_eof_and_close();
Xchar *rearranged_date();
Xvoid log_connect();
Xint log_disconnect();
Xvoid log_receive();
X#endif
X
X#define HEADER_ROW			0
X#define HEADER_COL			0
X
X#define LABEL_ROW			1
X#define Rlog_DATE_COL		0
X#define Rlog_FROM_COL		1
X#define Rlog_LENGTH_COL		2
X#define Rlog_NAME_COL		3
X
X#define Clog_DATE_COL		0
X#define Clog_SYS_COL		1
X#define Clog_PHONE_COL		2
X#define Clog_TIME_COL		3
X
X#define TOTAL_DATA_ROWS	4000
X
X#define FONT_HELV10			0
X#define FONT_HELV10_BOLD	1
X
X#define FORMAT_GENERAL		0
X#define Rlog_FORMAT_DATE	1
X#define Clog_FORMAT_TIME	1
X#define FORMAT_COUNT		1	/* do not count "General" */
X
XCE *ce_list_head = (CE *)0;
X
X/*+-------------------------------------------------------------------------
X	ce_list_add(tce) -- add to linked list
X--------------------------------------------------------------------------*/
Xvoid
Xce_list_add(tce)
XCE *tce;
X{
Xregister CE *this = tce;
Xregister CE *prev;
Xregister CE *next;
X
X/* if empty, init list with this one and quit */
X	if(ce_list_head == (CE *)0)
X	{
X		ce_list_head = this;
X		this->prev = (CE *)0;
X		this->next = (CE *)0;
X		return;
X	}
X
X/* list not empty */
X	prev = (CE *)0;		/* no previous yet */
X	next = ce_list_head;	/* init next to top of list */
X
X	while(next->pid < this->pid)
X	{
X		prev = next;
X		next = prev->next;
X		if(next == (CE *)0)
X			break;
X	}
X
X	if(prev)		/* if non-zero, we will not update the list head */
X	{
X		this->next = prev->next;
X		this->prev = prev;
X		prev->next = this;
X		if(next)
X			next->prev = this;
X	}
X	else	/* 'this' is to become the new list head (1st element) */
X	{
X		this->next = next;
X		this->prev = (CE *)0;
X		if(next)
X			next->prev = this;
X		ce_list_head = this;
X	}
X
X}	/* end of ce_list_add */
X
X/*+-------------------------------------------------------------------------
X	ce_list_remove(tce) -- remove from linked list
X--------------------------------------------------------------------------*/
Xvoid
Xce_list_remove(tce)
Xregister CE *tce;
X{
Xregister CE *prev;
Xregister CE *next;
X
X	prev = (CE *)0;	/* there is no previous now */
X
X	if((next = ce_list_head) == (CE *)0)	/* if empty list */
X		return;
X
X	while(next != tce)
X	{
X		prev = next;
X		next = prev->next;
X		if(next == (CE *)0)
X			return;
X	}
X
X/* unlink */
X	if(prev)		/* if non-zero, we will not update the list head */
X	{
X		prev->next = tce->next;
X		if(tce->next)
X			(tce->next)->prev = prev;
X	}
X	else
X	{
X		ce_list_head = tce->next;
X		if(tce->next)
X			(tce->next)->prev = (CE *)0;
X	}
X
X	tce->next = (CE *)0;
X	tce->prev = (CE *)0;
X
X}	/* end of ce_list_remove */
X
X/*+-----------------------------------------------------------------------
X	CE *ce_list_search(pid)
X------------------------------------------------------------------------*/
XCE *
Xce_list_search(pid)
Xint pid;
X{
Xregister CE *tce;
X
X	tce = ce_list_head;
X	while(tce)
X	{
X		if(tce->pid == pid)
X			return(tce);
X		tce = tce->next;
X	}
X	return(tce);
X
X}	/* end of ce_list_search */
X
X/*+-----------------------------------------------------------------------
X	get_home_dir(home_dir):  leave plenty of room for result!
X------------------------------------------------------------------------*/
Xint
Xget_home_dir(home_dir)
Xchar *home_dir;
X{
Xstatic char home_directory[256] = "";
Xstruct passwd *pwent;
Xstruct passwd *getpwuid();
X
X	if(home_directory[0])
X	{
X		strcpy(home_dir,home_directory);
X		return(0);
X	}
X
X	if(!(pwent = getpwuid(getuid())))
X	{
X		perror("cannot get password entry for you!!");
X		exit(255);
X	}
X	strcpy(home_directory,pwent->pw_dir);
X	strcpy(home_dir,pwent->pw_dir);
X	endpwent();
X	return(0);
X
X}	/* end of get_home_dir */
X
X/*+-------------------------------------------------------------------------
X	strlwr(str) - make all alpha chars in string lower case
X--------------------------------------------------------------------------*/
Xvoid
Xstrlwr(str)
Xregister char *str;
X{
X	while(*str)
X	{
X		if(isupper(*str))
X			*str = tolower(*str);
X		str++;
X	}
X
X}	/* end of strlwr */
X
X/*+-------------------------------------------------------------------------
X	xls_now(now) - get time of day in local STANDARD time in XLS units
X--------------------------------------------------------------------------*/
Xdouble
Xxls_now(now)
Xtime_t now;
X{
Xdouble xlsNow;
X
X#define EPOCH_DATE		25569	/* 1/1/70 Midnight in XLS units */
X
X	tzset();
X	now -= timezone;
X	xlsNow = (double)EPOCH_DATE + ((double)now / (double)86400.0);
X	return(xlsNow);
X
X}	/* end of xls_now */
X
X/*+-------------------------------------------------------------------------
X	make_brLABEL(str) - convert null terminated string to brLABEL
Xcaller needs to plug rw, col and rgbAttr (they all contain 0 at return,
Xexcept rgbAttr[0], which has rgbAttr0_fLocked set)
X--------------------------------------------------------------------------*/
XbrLABEL *
Xmake_brLABEL(str)
Xchar *str;
X{
Xregister int len = strlen(str);
Xregister brLABEL *br = (brLABEL *)calloc(1,sizeof(brLABEL) + len - 1);
X
X	if(!br)
X	{
X		fprintf(stderr,"make_brLABEL: could not get memory for '%s'\n",str);
X		return(br);
X	}
X
X	br->type = btLABEL;
X	br->length = sizeof(brLABEL) - sizeof(BHDR) + len - 1;
X	br->cch = len;
X	br->rgbAttr[0] = rgbAttr0_fLocked;
X	memcpy((char *)br->rgch,str,(unsigned)len);
X	return(br);
X
X}	/* end of make_brLABEL */
X
X/*+-------------------------------------------------------------------------
X	make_brFONT(name,height,attr)
X--------------------------------------------------------------------------*/
XbrFONT *
Xmake_brFONT(name,height,attr)
Xchar *name;
Xint height;
Xint attr;
X{
Xregister int len = strlen(name);
Xregister brFONT *br = (brFONT *)calloc(1,sizeof(brFONT) + len - 1);
X
X	if(!br)
X	{
X		fprintf(stderr,"make_brFONT: could not get memory for '%s'\n",name);
X		return(br);
X	}
X
X	br->type = btFONT;
X	br->length = sizeof(brFONT) - sizeof(BHDR) + len - 1;
X	br->dy = (UINT16)height;
X	br->grbit = (UINT16)attr;
X	br->cch = len;
X	memcpy((char *)br->rgch,name,(unsigned)len);
X	return(br);
X
X}	/* end of make_brFONT */
X
X/*+-------------------------------------------------------------------------
X	make_brFORMAT(picture) - convert null terminated picture to brFORMAT
X--------------------------------------------------------------------------*/
XbrFORMAT *
Xmake_brFORMAT(picture)
Xchar *picture;
X{
Xregister int len = strlen(picture);
Xregister brFORMAT *br = (brFORMAT *)calloc(1,sizeof(brFORMAT) + len - 1);
X
X	if(!br)
X	{
X		fprintf(stderr,"make_brFORMAT: could not get memory for '%s'\n",
X			picture);
X		return(br);
X	}
X
X	br->type = btFORMAT;
X	br->length = sizeof(brFORMAT) - sizeof(BHDR) + len - 1;
X	br->cch = len;
X	memcpy((char *)br->rgch,picture,(unsigned)len);
X	return(br);
X
X}	/* end of make_brFORMAT */
X
X/*+-------------------------------------------------------------------------
X	make_brNAME_cell(name,row,col)
X--------------------------------------------------------------------------*/
XbrNAME *
Xmake_brNAME_cell(name,row,col)
Xchar *name;
Xint row;
Xint col;
X{
Xregister int len = strlen(name);
XopRefN *op;
Xint len2 = sizeof(brNAME)-1+len + sizeof(*op) + 1;
Xregister brNAME *br = (brNAME *)calloc(1,len2);
X
X	if(!br)
X	{
X		fprintf(stderr,"make_brNAME: could not get memory for '%s'\n",name);
X		return(br);
X	}
X
X	br->type = btNAME;
X	br->length = len2 - sizeof(BHDR);
X	br->cch = (UINT8)len;
X	br->cce = (UINT8)sizeof(opRefN);
X	memcpy((char *)br->rgch,name,(unsigned)len);
X	op = (opRefN *)((char *)(br + 1) + len - 1);
X	op->op = ptgRefN;
X	op->grbitRw = (UINT16)row & 0x3FFF;
X	op->col = (UINT8)col;
X	*((char *)(op + 1)) = br->cce;
X	return(br);
X
X}	/* end of make_brNAME_cell */
X
X/*+-------------------------------------------------------------------------
X	make_brNAME_area(name,firstrow,firstcol,rows,cols)
X--------------------------------------------------------------------------*/
XbrNAME *
Xmake_brNAME_area(name,firstrow,firstcol,rows,cols)
Xchar *name;
Xint firstrow;
Xint firstcol;
Xint rows;
Xint cols;
X{
Xregister int len = strlen(name);
XopAreaN *op;
Xint len2 = sizeof(brNAME)-1+len + sizeof(*op) + 1;
Xregister brNAME *br = (brNAME *)calloc(1,len2);
X
X	if(!br)
X	{
X		fprintf(stderr,"make_brNAME: could not get memory for '%s'\n",name);
X		return(br);
X	}
X
X	br->type = btNAME;
X	br->length = len2 - sizeof(BHDR);
X	br->cch = (UINT8)len;
X	br->cce = (UINT8)sizeof(opAreaN);
X	memcpy((char *)br->rgch,name,(unsigned)len);
X	op = (opAreaN *)((char *)(br + 1) + len - 1);
X	op->op = ptgAreaN;
X	op->grbitRwFirst = (UINT16)firstrow & 0x3FFF;
X	op->grbitRwLast = (op->grbitRwFirst + rows - 1) & 0x3FFF;
X	op->colFirst = (UINT8)firstcol;
X	op->colLast = (UINT8)firstcol + cols - 1;
X	*((char *)(op + 1)) = br->cce;
X	return(br);
X
X}	/* end of make_brNAME_area */
X
X/*+-------------------------------------------------------------------------
X	xls_write_br(x,bhdr)
X--------------------------------------------------------------------------*/
Xlong
Xxls_write_br(x,bhdr)
XXLS_FILE *x;
Xregister BHDR *bhdr;
X{
Xregister int len = bhdr->length + sizeof(BHDR);
Xlong fpos = ftell(x->fp);
X
X	if(fwrite((char *)bhdr,1,len,x->fp) != len)
X	{
X		fprintf(stderr,"xls_write_br type=%d len=%d ",bhdr->type,len);
X		perror(x->filename);
X		return(-1);
X	}
X	return(fpos);
X
X}	/* end of xls_write_br */
X
X/*+-------------------------------------------------------------------------
X	xls_get_brDIMENSION(x,handler)
X--------------------------------------------------------------------------*/
Xlong
Xxls_get_brDIMENSION(x,dimension)
XXLS_FILE *x;
XbrDIMENSION *dimension;
X{
Xlong fpos;
XUINT8 buf[2080];
XBHDR *bhdr = (BHDR *)buf;
X
X	fseek(x->fp,0L,SEEK_SET);
X	do 
X	{
X		fpos = ftell(x->fp);
X		if(fread((char *)buf,1,sizeof(BHDR),x->fp) != sizeof(BHDR))
X		{
X			fprintf(stderr,"xls get dimension short read 1\n");
X			return(-1);
X		}
X		if(fread((char *)buf + sizeof(BHDR),1,(size_t)bhdr->length,x->fp) !=
X			(size_t)bhdr->length)
X		{
X			fprintf(stderr,"xls get dimension short read 2\n");
X			return(-1);
X		}
X		if((bhdr->type == btDIMENSION) &&
X			(bhdr->length == (sizeof(brDIMENSION) - sizeof(BHDR))))
X		{
X			memcpy((char *)dimension,(char *)bhdr,sizeof(brDIMENSION));
X			return(fpos);
X		}
X	} while(bhdr->type != btEOF);
X
X	fprintf(stderr,"xls get dimension found none to get\n");
X	return(-1);
X
X}	/* end of xls_get_brDIMENSION */
X
X/*+-------------------------------------------------------------------------
X	xls_append(filename)
X
Xreturns -1 or next user data row number to write
X--------------------------------------------------------------------------*/
XXLS_FILE *
Xxls_append(filename)
Xchar *filename;
X{
XbrDIMENSION dimension;
Xint row;
XXLS_FILE *x = (XLS_FILE *)malloc(sizeof(XLS_FILE));
X
X	if(!x)
X	{
X		fprintf(stderr,"memory error\n");
X		return((XLS_FILE *)0);
X	}
X
X	strcpy(x->filename,filename);
X	x->dimension_fpos = -1;
X	x->first_data_row = LABEL_ROW + 1;
X	x->last_data_row = -1;
X
X	if(!(x->fp = fopen(filename,"r+")))
X	{
X		fprintf(stderr,"xls_append could not open '%s'\n",filename);
X		perror(filename);
X		return((XLS_FILE *)0);
X	}
X
X	if((x->dimension_fpos = xls_get_brDIMENSION(x,&dimension)) < 0)
X	{
X		fprintf(stderr,"xls_append thinks '%s' is corrupt\n",filename);
X		perror(filename);
X		fclose(x->fp);
X		return((XLS_FILE *)0);
X	}
X
X	if((row = dimension.rwMac - x->first_data_row) < 0)
X	{
X		fprintf(stderr,"xls_append unexpected next row in '%s'\n",filename);
X		perror(filename);
X		fclose(x->fp);
X		return((XLS_FILE *)0);
X	}
X
X	if(fseek(x->fp,-4L,SEEK_END))
X	{
X		fprintf(stderr,"xls_append could not seek on '%s'\n",filename);
X		perror(filename);
X		fclose(x->fp);
X		return((XLS_FILE *)0);
X	}
X
X	if(fgetc(x->fp) != btEOF)
X	{
X		fprintf(stderr,"xls_append found corrupt '%s'\n",filename);
X		perror(filename);
X		fclose(x->fp);
X		return((XLS_FILE *)0);
X	}
X	fseek(x->fp,-4L,SEEK_END);
X
X	x->last_data_row = row;
X	return(x);
X
X}	/* end of xls_append */
X
X/*+-------------------------------------------------------------------------
X	xls_create_Rlog(filename)
X--------------------------------------------------------------------------*/
XXLS_FILE *
Xxls_create_Rlog(filename)
Xchar *filename;
X{
Xint err;
XbrBOF bof;
XbrCOLWIDTH cw;
XbrDIMENSION dim;
XbrFONT *font;
XbrFORMAT *fmt;
XbrFORMATCOUNT fc;
XbrLABEL *label;
XbrNAME *name;
Xchar *sHEADER_fmt =
X	"ECU Received File Log - created %02d-%02d-%04d %02d:%02d:%02d";
Xchar *sDATE = "Date";
Xchar *sFROM = "From";
Xchar *sLENGTH = "Length";
Xchar *sNAME = "Name";
Xchar s80[80];
Xtime_t now;
Xstruct tm *lt;
XXLS_FILE *x = (XLS_FILE *)malloc(sizeof(XLS_FILE));
X
X	if(!x)
X	{
X		fprintf(stderr,"memory error\n");
X		return((XLS_FILE *)0);
X	}
X
X	strcpy(x->filename,filename);
X	x->dimension_fpos = -1;
X	x->first_data_row = LABEL_ROW + 1;
X	x->last_data_row = -1;
X
X	unlink(filename);
X	if(!(x->fp = fopen(filename,"w+")))
X	{
X		fprintf(stderr,"xls_create_Rlog could not open '%s'\n",filename);
X		perror(filename);
X		free((char *)x);
X		return((XLS_FILE *)0);
X	}
X
X	chmod(filename,0644);	/* only writable by owner */
X
X	/* BOF */
X	bof.type = btBOF;
X	bof.length = sizeof(brBOF) - sizeof(BHDR);
X	bof.vers = versExcel;
X	bof.dt = dtWorksheet;
X	if(xls_write_br(x,(BHDR *)&bof) < 0)
X		goto ERROR_EXIT;
X
X	/* HELV 10 font */
X	if(!(font = make_brFONT("Helv",200,0)))
X		goto ERROR_EXIT;
X	err = xls_write_br(x,(BHDR *)font) < 0;
X	free((char *)font);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* HELV 10 BOLD font */
X	if(!(font = make_brFONT("Helv",200,fBold)))
X		goto ERROR_EXIT;
X	err = xls_write_br(x,(BHDR *)font) < 0;
X	free((char *)font);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* column 0 width */
X	cw.type = btCOLWIDTH;
X	cw.length = sizeof(brCOLWIDTH) - sizeof(BHDR);
X	cw.colFirst = Rlog_DATE_COL;		/* 1st col in range */
X	cw.colLast = Rlog_DATE_COL;		/* last col in range */
X	cw.dz = 3766;				/* column width */
X	if(xls_write_br(x,(BHDR *)&cw) < 0)
X		goto ERROR_EXIT;
X
X	/* column 1 width */
X	cw.type = btCOLWIDTH;
X	cw.length = sizeof(brCOLWIDTH) - sizeof(BHDR);
X	cw.colFirst = Rlog_FROM_COL;		/* 1st col in range */
X	cw.colLast = Rlog_FROM_COL;		/* last col in range */
X	cw.dz = 3766;				/* column width */
X	if(xls_write_br(x,(BHDR *)&cw) < 0)
X		goto ERROR_EXIT;
X
X	/* column 2 width */
X	cw.type = btCOLWIDTH;
X	cw.length = sizeof(brCOLWIDTH) - sizeof(BHDR);
X	cw.colFirst = Rlog_LENGTH_COL;	/* 1st col in range */
X	cw.colLast = Rlog_LENGTH_COL;	/* last col in range */
X	cw.dz = 2230;				/* column width */
X	if(xls_write_br(x,(BHDR *)&cw) < 0)
X		goto ERROR_EXIT;
X
X	/* column 3 width */
X	cw.type = btCOLWIDTH;
X	cw.length = sizeof(brCOLWIDTH) - sizeof(BHDR);
X	cw.colFirst = Rlog_NAME_COL;		/* 1st col in range */
X	cw.colLast = Rlog_NAME_COL;		/* last col in range */
X	cw.dz = 8374;				/* column width */
X	if(xls_write_br(x,(BHDR *)&cw) < 0)
X		goto ERROR_EXIT;
X
X	/* FORMATCOUNT */
X	fc.type = btFORMATCOUNT;
X	fc.length = sizeof(brFORMATCOUNT) - sizeof(BHDR);
X	fc.FmtCount = FORMAT_COUNT;
X	if(xls_write_br(x,(BHDR *)&fc) < 0)
X		goto ERROR_EXIT;
X
X	/* "General" FORMAT */
X	if(!(fmt = make_brFORMAT("General")))
X		goto ERROR_EXIT;
X	err = xls_write_br(x,(BHDR *)fmt) < 0;
X	free((char *)fmt);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* date FORMAT */
X	if(!(fmt = make_brFORMAT("yyyy-mm-dd hh:mm")))
X		goto ERROR_EXIT;
X	err = xls_write_br(x,(BHDR *)fmt) < 0;
X	free((char *)fmt);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* "DATE" NAME */
X	if(!(name = make_brNAME_area(sDATE,x->first_data_row,Rlog_DATE_COL,
X			TOTAL_DATA_ROWS,1)))
X	{
X		goto ERROR_EXIT;
X	}
X	err = xls_write_br(x,(BHDR *)name) < 0;
X	free((char *)name);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* "FROM" NAME */
X	if(!(name = make_brNAME_area(sFROM,x->first_data_row,Rlog_FROM_COL,
X			TOTAL_DATA_ROWS,1)))
X	{
X		goto ERROR_EXIT;
X	}
X	err = xls_write_br(x,(BHDR *)name) < 0;
X	free((char *)name);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* "LENGTH" NAME */
X	if(!(name = make_brNAME_area(sLENGTH,x->first_data_row,Rlog_LENGTH_COL,
X			TOTAL_DATA_ROWS,1)))
X	{
X		goto ERROR_EXIT;
X	}
X	err = xls_write_br(x,(BHDR *)name) < 0;
X	free((char *)name);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* "NAME" NAME */
X	if(!(name = make_brNAME_area(sNAME,x->first_data_row,Rlog_NAME_COL,
X			TOTAL_DATA_ROWS,1)))
X	{
X		goto ERROR_EXIT;
X	}
X	err = xls_write_br(x,(BHDR *)name) < 0;
X	free((char *)name);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* DIMENSION */
X	dim.type = btDIMENSION;
X	dim.length = sizeof(brDIMENSION) - sizeof(BHDR);
X	dim.rwMic = 0;				/* first defined row */
X	dim.rwMac = x->first_data_row;	/* last row + 1 */
X	dim.colMic = 0;				/* first col */
X	dim.colMac = 4;				/* last row + 1 */
X	if((x->dimension_fpos = xls_write_br(x,(BHDR *)&dim)) < 0)
X		goto ERROR_EXIT;
X
X	/* HEADER */
X	time(&now);
X	lt = localtime(&now);
X	sprintf(s80,sHEADER_fmt,
X		lt->tm_mon + 1,lt->tm_mday,lt->tm_year + 1900,
X		lt->tm_hour,lt->tm_min,lt->tm_sec);
X	if(!(label = make_brLABEL(s80)))
X		goto ERROR_EXIT;
X	label->rw = HEADER_ROW;
X	label->col = HEADER_COL;
X	label->rgbAttr[1] = (FONT_HELV10_BOLD << 6) | FORMAT_GENERAL;
X	err = xls_write_br(x,(BHDR *)label) < 0;
X	free((char *)label);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* DATE */
X	if(!(label = make_brLABEL(sDATE)))
X		goto ERROR_EXIT;
X	label->rw = LABEL_ROW;
X	label->col = Rlog_DATE_COL;
X	label->rgbAttr[1] = (FONT_HELV10_BOLD << 6) | FORMAT_GENERAL;
X	label->rgbAttr[2] = alc_LEFT;
X	err = xls_write_br(x,(BHDR *)label) < 0;
X	free((char *)label);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* FROM */
X	if(!(label = make_brLABEL(sFROM)))
X		goto ERROR_EXIT;
X	label->rw = LABEL_ROW;
X	label->col = Rlog_FROM_COL;
X	label->rgbAttr[1] = (FONT_HELV10_BOLD << 6) | FORMAT_GENERAL;
X	label->rgbAttr[2] = alc_LEFT;
X	err = xls_write_br(x,(BHDR *)label) < 0;
X	free((char *)label);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* LENGTH */
X	if(!(label = make_brLABEL(sLENGTH)))
X		goto ERROR_EXIT;
X	label->rw = LABEL_ROW;
X	label->col = Rlog_LENGTH_COL;
X	label->rgbAttr[1] = (FONT_HELV10_BOLD << 6) | FORMAT_GENERAL;
X	label->rgbAttr[2] = alc_LEFT;
X	err = xls_write_br(x,(BHDR *)label) < 0;
X	free((char *)label);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* NAME */
X	if(!(label = make_brLABEL(sNAME)))
X		goto ERROR_EXIT;
X	label->rw = LABEL_ROW;
X	label->col = Rlog_NAME_COL;
X	label->rgbAttr[1] = (FONT_HELV10_BOLD << 6) | FORMAT_GENERAL;
X	label->rgbAttr[2] = alc_LEFT;
X	err = xls_write_br(x,(BHDR *)label) < 0;
X	free((char *)label);
X	if(err)
X		goto ERROR_EXIT;
X
X	return(x);
X
XERROR_EXIT:
X	fprintf(stderr,"xls_create_Rlog of '%s' aborted due to error\n",filename);
X	fclose(x->fp);
X	unlink(filename);
X	free((char *)x);
X	return((XLS_FILE *)0);
X
X}	/* end of xls_create_Rlog */
X
X/*+-------------------------------------------------------------------------
X	xls_write_Rlog_record(x,row,date,from,length,name)
X
X  returns file position of written record or -1 if error
X--------------------------------------------------------------------------*/
Xlong
Xxls_write_Rlog_record(x,row,date,from,length,name)
XXLS_FILE *x;
Xint row;
Xchar *date;
Xchar *from;
Xlong length;
Xchar *name;
X{
XbrNUMBER num;
XbrLABEL *label;
Xlong fpos = ftell(x->fp);
Xint err;
X
X	/* DATE */
X	if(!(label = make_brLABEL(date)))
X		return(-1);
X	label->rw = x->first_data_row + row;
X	label->col = Rlog_DATE_COL;
X	label->rgbAttr[1] = (FONT_HELV10 << 6) | FORMAT_GENERAL;
X	err = xls_write_br(x,(BHDR *)label) < 0;
X	free((char *)label);
X	if(err)
X		return(-1);
X
X	/* FROM */
X	if(!(label = make_brLABEL(from)))
X		return(-1);
X	label->rw = x->first_data_row + row;
X	label->col = Rlog_FROM_COL;
X	label->rgbAttr[1] = (FONT_HELV10 << 6) | FORMAT_GENERAL;
X	err = xls_write_br(x,(BHDR *)label) < 0;
X	free((char *)label);
X	if(err)
X		return(-1);
X
X	/* LENGTH */
X	num.type = btNUMBER;
X	num.length = sizeof(brNUMBER) - sizeof(BHDR);
X	num.rw = x->first_data_row + row;
X	num.col = Rlog_LENGTH_COL;
X	num.num = (double)length;
X	num.rgbAttr[0] = rgbAttr0_fLocked;
X	num.rgbAttr[1] = (FONT_HELV10 << 6) | FORMAT_GENERAL;
X	num.rgbAttr[2] = 0;
X	if(xls_write_br(x,(BHDR *)&num) < 0)
X		return(-1);
X
X	/* NAME */
X	if(!(label = make_brLABEL(name)))
X		return(-1);
X	label->rw = x->first_data_row + row;
X	label->col = Rlog_NAME_COL;
X	label->rgbAttr[1] = (FONT_HELV10 << 6) | FORMAT_GENERAL;
X	err = xls_write_br(x,(BHDR *)label) < 0;
X	free((char *)label);
X	if(err)
X		return(-1);
X
X	x->last_data_row = row;
X
X	return(fpos);
X
X}	/* end of xls_write_Rlog_record */
X
X/*+-------------------------------------------------------------------------
X	xls_create_Clog(filename)
X--------------------------------------------------------------------------*/
XXLS_FILE *
Xxls_create_Clog(filename)
Xchar *filename;
X{
Xint err;
XbrBOF bof;
XbrCOLWIDTH cw;
XbrDIMENSION dim;
XbrFONT *font;
XbrFORMAT *fmt;
XbrFORMATCOUNT fc;
XbrLABEL *label;
XbrNAME *name;
Xchar *sHEADER_fmt =
X	"ECU Connection Log - created %02d-%02d-%04d %02d:%02d:%02d";
Xchar *sDATE = "Date";
Xchar *sSYS = "System";
Xchar *sPHONE = "Phone";
Xchar *sTIME = "Time";
Xchar s80[80];
Xtime_t now;
Xstruct tm *lt;
XXLS_FILE *x = (XLS_FILE *)malloc(sizeof(XLS_FILE));
X
X	if(!x)
X	{
X		fprintf(stderr,"memory error\n");
X		return((XLS_FILE *)0);
X	}
X
X	strcpy(x->filename,filename);
X	x->dimension_fpos = -1;
X	x->first_data_row = LABEL_ROW + 1;
X	x->last_data_row = -1;
X
X	unlink(filename);
X	if(!(x->fp = fopen(filename,"w+")))
X	{
X		fprintf(stderr,"xls_create_Clog could not open '%s'\n",filename);
X		perror(filename);
X		free((char *)x);
X		return((XLS_FILE *)0);
X	}
X
X	chmod(filename,0644);	/* only writable by owner */
X
X	/* BOF */
X	bof.type = btBOF;
X	bof.length = sizeof(brBOF) - sizeof(BHDR);
X	bof.vers = versExcel;
X	bof.dt = dtWorksheet;
X	if(xls_write_br(x,(BHDR *)&bof) < 0)
X		goto ERROR_EXIT;
X
X	/* HELV 10 font */
X	if(!(font = make_brFONT("Helv",200,0)))
X		goto ERROR_EXIT;
X	err = xls_write_br(x,(BHDR *)font) < 0;
X	free((char *)font);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* HELV 10 BOLD font */
X	if(!(font = make_brFONT("Helv",200,fBold)))
X		goto ERROR_EXIT;
X	err = xls_write_br(x,(BHDR *)font) < 0;
X	free((char *)font);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* column 0 width */
X	cw.type = btCOLWIDTH;
X	cw.length = sizeof(brCOLWIDTH) - sizeof(BHDR);
X	cw.colFirst = Clog_DATE_COL;		/* 1st col in range */
X	cw.colLast = Clog_DATE_COL;		/* last col in range */
X	cw.dz = 3766;				/* column width */
X	if(xls_write_br(x,(BHDR *)&cw) < 0)
X		goto ERROR_EXIT;
X
X	/* column 1 width */
X	cw.type = btCOLWIDTH;
X	cw.length = sizeof(brCOLWIDTH) - sizeof(BHDR);
X	cw.colFirst = Clog_SYS_COL;		/* 1st col in range */
X	cw.colLast = Clog_SYS_COL;		/* last col in range */
X	cw.dz = 3766;				/* column width */
X	if(xls_write_br(x,(BHDR *)&cw) < 0)
X		goto ERROR_EXIT;
X
X	/* column 2 width */
X	cw.type = btCOLWIDTH;
X	cw.length = sizeof(brCOLWIDTH) - sizeof(BHDR);
X	cw.colFirst = Clog_PHONE_COL;	/* 1st col in range */
X	cw.colLast = Clog_PHONE_COL;	/* last col in range */
X	cw.dz = 3766;				/* column width */
X	if(xls_write_br(x,(BHDR *)&cw) < 0)
X		goto ERROR_EXIT;
X
X	/* column 3 width */
X	cw.type = btCOLWIDTH;
X	cw.length = sizeof(brCOLWIDTH) - sizeof(BHDR);
X	cw.colFirst = Clog_TIME_COL;		/* 1st col in range */
X	cw.colLast = Clog_TIME_COL;		/* last col in range */
X	cw.dz = 1974;				/* column width */
X	if(xls_write_br(x,(BHDR *)&cw) < 0)
X		goto ERROR_EXIT;
X
X	/* FORMATCOUNT */
X	fc.type = btFORMATCOUNT;
X	fc.length = sizeof(brFORMATCOUNT) - sizeof(BHDR);
X	fc.FmtCount = FORMAT_COUNT;
X	if(xls_write_br(x,(BHDR *)&fc) < 0)
X		goto ERROR_EXIT;
X
X	/* "General" FORMAT */
X	if(!(fmt = make_brFORMAT("General")))
X		goto ERROR_EXIT;
X	err = xls_write_br(x,(BHDR *)fmt) < 0;
X	free((char *)fmt);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* time FORMAT */
X	if(!(fmt = make_brFORMAT("hh:mm:ss")))	/* Clog_FORMAT_TIME */
X		goto ERROR_EXIT;
X	err = xls_write_br(x,(BHDR *)fmt) < 0;
X	free((char *)fmt);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* "DATE" NAME */
X	if(!(name = make_brNAME_area(sDATE,x->first_data_row,Clog_DATE_COL,
X			TOTAL_DATA_ROWS,1)))
X	{
X		goto ERROR_EXIT;
X	}
X	err = xls_write_br(x,(BHDR *)name) < 0;
X	free((char *)name);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* "SYS" NAME */
X	if(!(name = make_brNAME_area(sSYS,x->first_data_row,Clog_SYS_COL,
X			TOTAL_DATA_ROWS,1)))
X	{
X		goto ERROR_EXIT;
X	}
X	err = xls_write_br(x,(BHDR *)name) < 0;
X	free((char *)name);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* "PHONE" NAME */
X	if(!(name = make_brNAME_area(sPHONE,x->first_data_row,Clog_PHONE_COL,
X			TOTAL_DATA_ROWS,1)))
X	{
X		goto ERROR_EXIT;
X	}
X	err = xls_write_br(x,(BHDR *)name) < 0;
X	free((char *)name);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* "TIME" NAME */
X	if(!(name = make_brNAME_area(sTIME,x->first_data_row,Clog_TIME_COL,
X			TOTAL_DATA_ROWS,1)))
X	{
X		goto ERROR_EXIT;
X	}
X	err = xls_write_br(x,(BHDR *)name) < 0;
X	free((char *)name);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* DIMENSION */
X	dim.type = btDIMENSION;
X	dim.length = sizeof(brDIMENSION) - sizeof(BHDR);
X	dim.rwMic = 0;				/* first defined row */
X	dim.rwMac = x->first_data_row;	/* last row + 1 */
X	dim.colMic = 0;				/* first col */
X	dim.colMac = 4;				/* last row + 1 */
X	if((x->dimension_fpos = xls_write_br(x,(BHDR *)&dim)) < 0)
X		goto ERROR_EXIT;
X
X	/* HEADER */
X	time(&now);
X	lt = localtime(&now);
X	sprintf(s80,sHEADER_fmt,
X		lt->tm_mon + 1,lt->tm_mday,lt->tm_year + 1900,
X		lt->tm_hour,lt->tm_min,lt->tm_sec);
X	if(!(label = make_brLABEL(s80)))
X		goto ERROR_EXIT;
X	label->rw = HEADER_ROW;
X	label->col = HEADER_COL;
X	label->rgbAttr[1] = (FONT_HELV10_BOLD << 6) | FORMAT_GENERAL;
X	err = xls_write_br(x,(BHDR *)label) < 0;
X	free((char *)label);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* DATE */
X	if(!(label = make_brLABEL(sDATE)))
X		goto ERROR_EXIT;
X	label->rw = LABEL_ROW;
X	label->col = Clog_DATE_COL;
X	label->rgbAttr[1] = (FONT_HELV10_BOLD << 6) | FORMAT_GENERAL;
X	label->rgbAttr[2] = alc_LEFT;
X	err = xls_write_br(x,(BHDR *)label) < 0;
X	free((char *)label);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* SYS */
X	if(!(label = make_brLABEL(sSYS)))
X		goto ERROR_EXIT;
X	label->rw = LABEL_ROW;
X	label->col = Clog_SYS_COL;
X	label->rgbAttr[1] = (FONT_HELV10_BOLD << 6) | FORMAT_GENERAL;
X	label->rgbAttr[2] = alc_LEFT;
X	err = xls_write_br(x,(BHDR *)label) < 0;
X	free((char *)label);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* PHONE */
X	if(!(label = make_brLABEL(sPHONE)))
X		goto ERROR_EXIT;
X	label->rw = LABEL_ROW;
X	label->col = Clog_PHONE_COL;
X	label->rgbAttr[1] = (FONT_HELV10_BOLD << 6) | FORMAT_GENERAL;
X	label->rgbAttr[2] = alc_LEFT;
X	err = xls_write_br(x,(BHDR *)label) < 0;
X	free((char *)label);
X	if(err)
X		goto ERROR_EXIT;
X
X	/* TIME */
X	if(!(label = make_brLABEL(sTIME)))
X		goto ERROR_EXIT;
X	label->rw = LABEL_ROW;
X	label->col = Clog_TIME_COL;
X	label->rgbAttr[1] = (FONT_HELV10_BOLD << 6) | FORMAT_GENERAL;
X	label->rgbAttr[2] = alc_LEFT;
X	err = xls_write_br(x,(BHDR *)label) < 0;
X	free((char *)label);
X	if(err)
X		goto ERROR_EXIT;
X
X	return(x);
X
XERROR_EXIT:
X	fprintf(stderr,"xls_create_Clog of '%s' aborted due to error\n",filename);
X	fclose(x->fp);
X	unlink(filename);
X	free((char *)x);
X	return((XLS_FILE *)0);
X
X}	/* end of xls_create_Clog */
X
X/*+-------------------------------------------------------------------------
X	xls_write_Clog_record(x,row,date,sys,secs)
X
X  returns file position of written record or -1 if error
X--------------------------------------------------------------------------*/
Xlong
Xxls_write_Clog_record(x,row,date,sys,phone,secs)
XXLS_FILE *x;
Xint row;
Xchar *date;
Xchar *sys;
Xchar *phone;
Xlong secs;
X{
XbrNUMBER num;
XbrLABEL *label;
Xlong fpos = ftell(x->fp);
Xint err;
X
X	/* DATE */
X	if(!(label = make_brLABEL(date)))
X		return(-1);
X	label->rw = x->first_data_row + row;
X	label->col = Clog_DATE_COL;
X	label->rgbAttr[1] = (FONT_HELV10 << 6) | FORMAT_GENERAL;
X	err = xls_write_br(x,(BHDR *)label) < 0;
X	free((char *)label);
X	if(err)
X		return(-1);
X
X	/* SYS */
X	if(!(label = make_brLABEL(sys)))
X		return(-1);
X	label->rw = x->first_data_row + row;
X	label->col = Clog_SYS_COL;
X	label->rgbAttr[1] = (FONT_HELV10 << 6) | FORMAT_GENERAL;
X	err = xls_write_br(x,(BHDR *)label) < 0;
X	free((char *)label);
X	if(err)
X		return(-1);
X
X	/* PHONE */
X	if(!(label = make_brLABEL(phone)))
X		return(-1);
X	label->rw = x->first_data_row + row;
X	label->col = Clog_PHONE_COL;
X	label->rgbAttr[1] = (FONT_HELV10 << 6) | FORMAT_GENERAL;
X	err = xls_write_br(x,(BHDR *)label) < 0;
X	free((char *)label);
X	if(err)
X		return(-1);
X
X	/* TIME */
X	num.type = btNUMBER;
X	num.length = sizeof(brNUMBER) - sizeof(BHDR);
X	num.rw = x->first_data_row + row;
X	num.col = Clog_TIME_COL;
X	num.num = (double)secs / (3600.0 * 24.0);
X	num.rgbAttr[0] = rgbAttr0_fLocked;
X	num.rgbAttr[1] = (FONT_HELV10 << 6) | Clog_FORMAT_TIME;
X	num.rgbAttr[2] = 0;
X	if(xls_write_br(x,(BHDR *)&num) < 0)
X		return(-1);
X
X	x->last_data_row = row;
X
X	return(fpos);
X
X}	/* end of xls_write_Clog_record */
X
X/*+-------------------------------------------------------------------------
X	xls_write_eof_and_close(x)
X--------------------------------------------------------------------------*/
Xvoid
Xxls_write_eof_and_close(x)
XXLS_FILE *x;
X{
XbrDIMENSION dimension;
X
X	if(!x->fp)
X	{
X		fprintf(stderr,"xls_write_and_close: no file open!\n");
X		return;
X	}
X
X	fputc(btEOF,x->fp);
X	fputc(0,x->fp);
X	fputc(0,x->fp);
X	fputc(0,x->fp);
X
X	if(x->last_data_row >= 0)
X	{
X 		if(x->dimension_fpos >= 0)
X		{
X			memset((char *)&dimension,0,sizeof(brDIMENSION));
X			errno = 0;
X			if(fseek(x->fp,x->dimension_fpos,SEEK_SET))
X				perror("xls_write_eof_and_close seek 1 error");
X			else if(fread((char *)&dimension,1,sizeof(brDIMENSION),x->fp) !=
X				sizeof(brDIMENSION))
X			{
X				perror("xls_write_eof_and_close dim read error");
X			}
X			dimension.rwMac = ++x->last_data_row +
X				x->first_data_row;
X			if(dimension.type == btDIMENSION)
X			{
X				if(fseek(x->fp,x->dimension_fpos,SEEK_SET))
X					perror("xls_write_eof_and_close seek 2 error");
X				else if(fwrite((char *)&dimension,1,
X						sizeof(brDIMENSION),x->fp) != sizeof(brDIMENSION))
X				{
X					perror("xls_write_eof_and_close dim write error");
X				}
X			}
X			else
X				fprintf(stderr,"xls_write_eof_and_close dim write fail\n");
X		}
X		else
X			fprintf(stderr,"xls_write_eof_and_close no dim fpos\n");
X	}
X	else
X		fprintf(stderr,"xls_write_eof_and_close no last row\n");
X	x->last_data_row = -1;
X	x->dimension_fpos = -1;
X
X	fclose(x->fp);
X	x->fp = (FILE *)0;
X
X}	/* end of xls_write_eof_and_close */
X
X/*+-------------------------------------------------------------------------
X	rearranged_date(date)
X
X0000000000111111
X0123456789012345
X12-28-1990-17:08
X1990-12-28 17:08
X--------------------------------------------------------------------------*/
Xchar *
Xrearranged_date(date)
Xchar *date;
X{
Xstatic char rd[] = "####-##-## ##:##";
X
X	memcpy(rd +  0,date +  6,4);
X	memcpy(rd +  5,date +  0,5);
X	memcpy(rd + 11,date + 11,5);
X	return(rd);
X
X}	/* end of rearranged_date */
X
X/*+-------------------------------------------------------------------------
X	log_connect(logbuf)
X
X00000000001111111111222222222233
X01234567890123456789012345678901
X12-28-1990-17:06-01455-CONNECT tridom (426-0624) 9600 baud
X--------------------------------------------------------------------------*/
Xvoid
Xlog_connect(logbuf)
Xchar *logbuf;
X{
Xchar *sys = logbuf + 31;
Xint pid = atoi(logbuf + 17);
XCE *ce = ce_list_search(pid);
Xchar *cptr;
X
X	if(ce)
X	{
X		fprintf(stderr,"warning: connect to %s pid %d without disconnect\n",
X			ce->sys,pid);
X		ce_list_remove(ce);
X		free((char *)ce);
X	}
X
X	if(!(ce = (CE *)malloc(sizeof(CE))))
X	{
X		fprintf(stderr,"memory allocation error\n");
X		exit(250);
X	}
X
X	if(cptr = strchr(sys,' '))
X		*cptr = 0;
X
X	strncpy(ce->sys,sys,sizeof(ce->sys));
X	ce->sys[sizeof(ce->sys) - 1] = 0;
X	strcpy(ce->date,rearranged_date(logbuf));
X	ce->pid = pid;
X	ce_list_add(ce);
X
X}	/* end of log_connect */
X
X/*+-------------------------------------------------------------------------
X	log_disconnect(x,logbuf)
X
X00000000001111111111222222222233333
X01234567890123456789012345678901234
X12-28-1990-17:08-01455-DISCONNECT tridom (426-0624) 144 00:02:24
X--------------------------------------------------------------------------*/
Xlog_disconnect(x,logbuf)
XXLS_FILE *x;
Xchar *logbuf;
X{
Xchar *cptr;
Xchar date[128];
Xint pid = atoi(logbuf + 17);
XCE *ce = ce_list_search(pid);
Xchar *sys = logbuf + 34;
Xlong secs = 0L;
Xchar *phone = "";
X
X	if(cptr = strchr(sys,' '))
X	{
X		*cptr = 0;
X		cptr += 2;
X		phone = cptr;
X		if(cptr = strrchr(phone,')'))
X		{
X			*cptr = 0;
X			cptr++;
X			secs = atol(cptr);
X		}
X	}
X
X	if(ce)
X	{
X		strcpy(date,ce->date);
X		if(strcmp(ce->sys,sys))
X		{
X			fprintf(stderr,
X				"warning: system mismatch conn(%s) != disc(%s) pid %d\n",
X				ce->sys,sys,pid);
X		}
X		ce_list_remove(ce);
X		free((char *)ce);
X	}
X	else
X		strcpy(date,rearranged_date(logbuf));
X
X	xls_write_Clog_record(x,++x->last_data_row,date,sys,phone,secs);
X
X}	/* end of log_disconnect */
X
X/*+-------------------------------------------------------------------------
X	log_receive(x,logbuf)
X
X00000000001111111111222222222233333333334
X01234567890123456789012345678901234567890
X12-28-1990-17:08-01455-RECEIVE success: mbox (8016 bytes)
X--------------------------------------------------------------------------*/
Xvoid
Xlog_receive(x,logbuf)
XXLS_FILE *x;
Xchar *logbuf;
X{
Xchar *cptr;
Xchar *date = rearranged_date(logbuf);
Xint pid = atoi(logbuf + 17);
XCE *ce = ce_list_search(pid);
Xchar *from = (ce) ? ce->sys : "??";
Xlong length = 0L;
Xchar *name = logbuf + 40;
X
X	if(cptr = strchr(name,' '))
X	{
X		*cptr = 0;
X		cptr += 2;
X		length = atol(cptr);
X	}
X	xls_write_Rlog_record(x,++x->last_data_row,date,from,length,name);
X
X}	/* end of log_receive */
X
X/*+-------------------------------------------------------------------------
X	main(argc,argv)
X
X000000000011111111112222
X012345678901234567890123
X12-28-1990-17:06-01455-CONNECT tridom (426-0624) 9600 baud
X12-28-1990-17:08-01455-RECEIVE success: mbox (8016 bytes)
X12-28-1990-17:08-01455-DISCONNECT tridom (426-0624) 144 00:02:24
X--------------------------------------------------------------------------*/
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X{
Xint itmp;
Xint row;
Xint errflg = 0;
Xdouble Biffdate;
Xdouble Avg;
Xdouble Min;
Xdouble Max;
Xint Sampq;
Xchar *fnRlog = "ecurlog.xls";
XXLS_FILE *xRlog;
Xchar *fnClog = "ecuclog.xls";
XXLS_FILE *xClog;
XFILE *fp_log;
Xchar logname[256];
Xchar logbuf[256];
XCE *tce;
Xextern char *optarg;
Xextern int optind;
X
X	logname[0] = 0;
X
X	while((itmp = getopt(argc,argv,"l:")) != -1)
X	{
X		switch(itmp)
X		{
X			case 'l':
X				strcpy(logname,optarg);
X				break;
X			case '?':
X				errflg++;
X				break;
X		}
X	}
X
X	if(errflg)
X	{
X		(void)fprintf(stderr,"usage: ecuxls [-l logfile]\n");
X		(void)fprintf(stderr,"default log file is ~/.ecu/log\n");
X		exit(254);
X	}
X
X	if(!logname[0])
X	{
X		get_home_dir(logname);
X		strcat(logname,"/.ecu/log");
X	}
X
X	fprintf(stderr,"ecuxls %s: %s -> (ecurlog.xls,ecuclog.xls)\n",
X		revision,logname);
X
X	if(!(fp_log = fopen(logname,"r")))
X	{
X		perror(logname);
X		exit(1);
X	}
X	if(!(xRlog = xls_create_Rlog(fnRlog)))
X	{
X		perror(fnRlog);
X		exit(2);
X	}
X	if(!(xClog = xls_create_Clog(fnClog)))
X	{
X		perror(fnClog);
X		exit(2);
X	}
X
X	while(fgets(logbuf,sizeof(logbuf),fp_log))
X	{
X		logbuf[strlen(logbuf) - 1] = 0;
X		if(!strncmp(logbuf + 23,"RECEIVE success",15))
X			log_receive(xRlog,logbuf);
X		else if(!strncmp(logbuf + 23,"CONNECT",7))
X			log_connect(logbuf);
X		else if(!strncmp(logbuf + 23,"DISCONNECT",10))
X			log_disconnect(xClog,logbuf);
X	}
X
X	xls_write_eof_and_close(xRlog);
X	xls_write_eof_and_close(xClog);
X	fclose(fp_log);
X
X	tce = ce_list_head;
X	while(tce)
X	{
X		fprintf(stderr,"warning: connect to %s pid %d without disconnect\n",
X			tce->sys,tce->pid);
X		tce = tce->next;
X	}
X
X	exit(0);
X}	/* end of main */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of ecuxls.c */
SHAR_EOF
chmod 0644 excel/ecuxls.c ||
echo 'restore of excel/ecuxls.c failed'
Wc_c="`wc -c < 'excel/ecuxls.c'`"
test 37790 -eq "$Wc_c" ||
	echo 'excel/ecuxls.c: original size 37790, current size' "$Wc_c"
fi
# ============= excel/log ==============
if test -f 'excel/log' -a X"$1" != X"-c"; then
	echo 'x - skipping excel/log (File already exists)'
else
echo 'x - extracting excel/log (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'excel/log' &&
X01-09-1555-12123-04460-CONNECT tridom (555-1212) 9600 baud
X01-09-1555-12126-04460-DISCONNECT tridom (555-1212) 7327 02:02:07
X01-09-1555-12125-05555-CONNECT n4vu (555-1212V) 9600 baud
X01-09-1555-12128-05555-DISCONNECT n4vu (555-1212V) 187 00:03:07
X01-09-1555-12121-05588-CONNECT n4vu (555-1212V) 9600 baud
X01-09-1555-12123-05588-DISCONNECT n4vu (555-1212V) 113 00:01:53
X01-09-1555-12121-05838-CONNECT p1so (555-1212PF) 9600 baud
X01-09-1555-12121-05838-DISCONNECT p1so (555-1212PF) 23 00:00:23
X01-09-1555-12122-05838-CONNECT kd4nc (555-1212C) 19200 baud
X01-09-1555-12126-05838-RECEIVE success: afterlint.c (4060 bytes)
X01-09-1555-12126-05838-RECEIVE success: ecu.c (9889 bytes)
X01-09-1555-12126-05838-RECEIVE success: ecu.h (4175 bytes)
X01-09-1555-12126-05838-RECEIVE success: ecuicmd.c (12787 bytes)
X01-09-1555-12127-05838-RECEIVE success: eculine.c (23999 bytes)
X01-09-1555-12128-05838-RECEIVE success: ecuphone.c (48334 bytes)
X01-09-1555-12128-05838-RECEIVE success: ecurcvr.c (31419 bytes)
X01-09-1555-12128-05838-RECEIVE success: ecushm.h (3040 bytes)
X01-09-1555-12129-05838-RECEIVE success: ecuvmin.h (585 bytes)
X01-09-1555-12129-05838-RECEIVE success: ecuxenix.c (14172 bytes)
X01-09-1555-12129-05838-RECEIVE success: gint.c (6599 bytes)
X01-09-1555-12120-05838-RECEIVE success: lint_args.h (27013 bytes)
X01-09-1555-12120-05838-RECEIVE success: pcmd.c (24245 bytes)
X01-09-1555-12120-05838-RECEIVE success: pprintf.c (3525 bytes)
X01-09-1555-12121-05838-RECEIVE success: stdio_lint.h (1286 bytes)
X01-09-1555-12122-05838-DISCONNECT kd4nc (555-1212C) 7238 02:00:38
SHAR_EOF
chmod 0644 excel/log ||
echo 'restore of excel/log failed'
Wc_c="`wc -c < 'excel/log'`"
test 1563 -eq "$Wc_c" ||
	echo 'excel/log: original size 1563, current size' "$Wc_c"
fi
exit 0

exit 0 # Just in case...
-- 
Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
Sterling Software, IMD           UUCP:     uunet!sparky!kent
Phone:    (402) 291-8300         FAX:      (402) 291-4362
Please send comp.sources.misc-related mail to kent@uunet.uu.net.