v16i073: ECU 3 log-to-Excel spreadsheet, Part02/02
wht at n4hgf.Mt-Park.GA.US
wht at n4hgf.Mt-Park.GA.US
Sun Jan 13 08:02:41 AEST 1991
Submitted-by: wht at 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 at 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 at 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 at 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 at uunet.uu.net.
More information about the Comp.sources.misc
mailing list