home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Overload
/
ShartewareOverload.cdr
/
progm
/
cpgms.zip
/
123DUMP.C
next >
Wrap
C/C++ Source or Header
|
1985-11-17
|
9KB
|
422 lines
#include "stdio.h"
char *documentation[] = {
"123dump prints a set of files with headings.",
" 123dump [flags] file_list [>file]",
"",
"Flags are single characters preceeded by '-':",
" -m Display macro definitions",
" -h Print headings switch. Normally, on.",
" -v Verbose. Show file stats on stderr.",
" -lnnn Line length (nnn).",
" -pnnn Page length (nnn).",
" -tnnn Tab stop every nnn columns.",
"The file_list is a list of files (wildcards are acceptable).",
"",
"Output is to stdout. To print add >PRN: to your command.",
0 };
#define DeSmet 1
#define MSDOS 1
#define LMAX 256
#ifndef stdin
#define stdin STDIN
#define stdout STDOUT
#define stderr STDERR
#endif
int mflag;
int nflag;
int hflag;
int vflag;
int nfile;
int pflag = 56;
int tflag = 4;
int lflag = 80;
char sbuf[LMAX];
struct rnamtb {
char rname[16];
int rrow;
int rcol;};
struct rnamtb rtbl[30];
int rmax;
int rndx;
int debug = 0; /* Set for debug code */
char *pp;
/* char *colnam[] = {"A","B","C","D","E","F","G","H","I","J","K",
"L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
"AA","AB","AC","AD","AE","AF","AG","AH","AI","AJ","AK","AL",
"AM","AN","AO","AP","AQ","AR","AS","AT","AU","AV","AW","AX",
"AY","AZ",
"BA","BB","BC","BD","BE","BF","BG","BH","BI","BJ","BK","BL",
"BM","BN","BO","BP","BQ","BR","BS","BT","BU","BV","BW","BX",
"BY","BZ",
"CA","CB","CC","CD","CE","CF","CG","CH","CI","CJ","CK","CL",
"CM","CN","CO","CP","CQ","CR","CS","CT","CU","CV","CW","CX",
"CY","CZ",
"DA","DB","DC","DD","DE","DF","DG","DH","DI","DJ","DK","DL",
"DM","DN","DO","DP","DQ","DR","DS","DT","DU","DV","DW","DX",
"DY","DZ",
"EA","EB","EC","ED","EE","EF","EG","EH","EI","EJ","EK","EL",
"EM","EN","EO","EP","EQ","ER","ES","ET","EU","EV","EW","EX",
"EY","EZ",
"FA","FB","FC","FD","FE","FF","FG","FH","FI","FJ","FK","FL",
"FM","FN","FO","FP","FQ","FR","FS","FT","FU","FV","FW","FX",
"FY","FZ",
"GA","GB","GC","GD","GE","GF","GG","GH","GI","GJ","GK","GL",
"GM","GN","GO","GP","GQ","GR","GS","GT","GU","GV","GW","GX",
"GY","GZ",
"HA","HB","HC","HD","HE","HF","HG","HH","HI","HJ","HK","HL",
"HM","HN","HO","HP","HQ","HR","HS","HT","HU","HV","HW","HX",
"HY","HZ",
"IA","IB","IC","ID","IE","IF","IG","IH","II","IJ","IK","IL",
"IM","IN","IO","IP","IQ","IR","IS","IT","IU","IV","IW","IX",
"IY","IZ"}; */
/*******************************************************/
main(argc, argv)
char *argv[];
{
register char *p;
register int c, i;
char *fexpnd();
FILE *f;
if (argc <= 1)
usage("No arguments");
if (argc == 2 && argv[1][0] == '?' && argv[1][1] == 0) {
help(documentation);
return;
}
nfile = argc-1;
for (i=1; i < argc; ++i) {
p = argv[i];
if (*p == '-') {
++p;
while (c = *p++) {
switch(tolower(c)) {
case '?':
help(documentation);
break;
case 'M':
case 'm':
++mflag;
break;
case 'D':
case 'd':
++debug;
break;
case 'N':
case 'n':
++nflag;
break;
case 'H':
case 'h':
++hflag;
break;
case 'V':
case 'v':
++vflag;
break;
case 'L':
case 'l':
lflag=atoi(p);
if (lflag > 132 | lflag < 9)
error("Line size must be 9 - 132\n","");
while (*p != '\0') /* skip value */
p++;
break;
case 'P':
case 'p':
pflag=atoi(p)-4; /* -4 to allow for heading */
if (pflag < 1)
error("Page size must be > 4","");
while (*p != '\0') /* skip value */
p++;
break;
case 'T':
case 't':
tflag=atoi(p);
while (*p != '\0') /* skip value */
p++;
break;
default:
usage("Unknown flag");
}
}
argv[i] = 0;
--nfile;
}
}
if (nfile == 0)
dmp123(stdin, 0);
else {
for (i=1; i < argc; ++i) {
#if MSDOS
if (argv[i])
while (p = fexpnd(argv[i])) {
#else
if (p = argv[i]) {
#endif
if ((f=fopen(p, "r")) == NULL)
cant(p);
else {
dmp123(f, p);
fclose(f);
}
}
}
}
}
/*******************************************************/
usage(s)
char *s;
{
fprintf(stderr, "?123DUMP-E-%s\n", s);
fprintf(stderr,
"Usage: 123dump [-whnv] [-lnnn] [-pnnn] [-tnnn] [file ...]. \n");
fprintf(stderr,
" 123dump ? for help\n");
exit(1);
}
int lno;
int pageno;
/*******************************************************/
dmp123(fp, fn)
FILE *fp; /* File to process */
char *fn; /* File name (for -f option) */
/*
* Dump information from and about a Lotus 123 worksheet
*/
{
int ndx, itype, ilen;
pageno = 0;
lno = pflag + 1;
rmax = -1; /* reset macro table */
while ((itype = getint(fp)) != 0x01) {
ilen = getint(fp); /* record length */
switch(itype) {
case 0x00: /* header */
skipby(fp,ilen);
break;
case 0x06: /* range record */
skipby(fp,ilen);
break;
case 0x0b: /* range name record */
if (ilen != 0x18) { /* range name is 24 bytes */
skipby(fp,ilen);
break;
}
proc0b(fp,fn,ilen);
break;
case 0x0d: /* integer cell */
skipby(fp,ilen);
break;
case 0x0e: /* double precision cell */
skipby(fp,ilen);
break;
case 0x0f: /* character string cell */
proc0f(fp,fn,ilen);
break;
case 0x10: /* formula cell */
skipby(fp,ilen);
break;
default:
skipby(fp,ilen);
}
}
/* search for unmatched macro definitions */
for (rndx = 0;rndx <= rmax; rndx++)
if (' ' != rtbl[rndx].rname[1]) {
sprintf(sbuf,"\n %-20s %d/%d\t string not in worksheet",
rtbl[rndx].rname,rtbl[rndx].rcol,rtbl[rndx].rrow);
prt123(fn);
}
if (vflag)
fprintf(stderr,"Worksheet %s has been processed\n", fn);
}
/*******************************************************/
skipby(fp,len)
FILE *fp; /* File to process */
int len;
/*
* Read and discard <len> bytes from file <fp>.
*/
{
char c;
while (len--)
c = fgetc(fp);
}
/*******************************************************/
proc0b(fp,fn,ilen)
FILE *fp; /* File to process */
char *fn;
int ilen;
/*
* Process type 0x0b records (range name recs).
*/
{
int ndx, icolb, icole, irowb, irowe;
char mname[17];
ndx = 0;
while (mname[ndx++] = fgetc(fp)) ;
if (ndx < 16)
skipby(fp,16 - ndx);
icolb = getint(fp)+1;
irowb = getint(fp)+1;
icole = getint(fp)+1;
irowe = getint(fp)+1;
/* printf("\n %-20s %s%d .. %s%d ",mname,colnam[icolb],irowb,colnam[icole],irowe); */
if (mflag && (mname[0] == '\\')) {
rmax++;
strcpy(rtbl[rmax].rname,mname); /* name */
rtbl[rmax].rrow = irowb; /* row[rmax] */
rtbl[rmax].rcol = icolb; /* column */
}
if (!mflag) {
sprintf(sbuf,"\n %-20s %d/%d .. %d/%d",mname,icolb,irowb,icole,irowe);
prt123(fn);
}
}
/*******************************************************/
proc0f(fp,fn,ilen)
FILE *fp; /* File to process */
char *fn;
int ilen;
/*
* Process type 0x0f records (range name recs).
*/
{
int ndx, icolb, irowb;
char stbuf[LMAX];
skipby(fp,1); /* skip format byte */
icolb = getint(fp) + 1; /* starting column */
irowb = getint(fp) + 1; /* starting row */
for (ndx = 0; (stbuf[ndx++] = fgetc(fp)) && (ndx < LMAX) ;)
; /* copy string to save area */
/* search for macro definition for this string */
for (rndx = 0;rndx <= rmax; rndx++)
if ((icolb == rtbl[rndx].rcol) &&
(irowb == rtbl[rndx].rrow)) {
sprintf(sbuf,"\n %-20s %d/%d ",rtbl[rndx].rname,
icolb,irowb);
strncat(sbuf,stbuf,LMAX);
prt123(fn);
rtbl[rndx].rname[1] = ' '; /* mark macro printed */
}
}
/*******************************************************/
prt123(fn)
char *fn;
/*
* Print information from and about a Lotus 123 worksheet
*/
{
char date[9], time[9], lbuf[LMAX];
int llen, rlen;
dates(date); /* get date and time from operating system */
times(time);
if (!hflag && lno > pflag) {
printf("\f \n %-44s %s %s Page %d\n\n",fn,date,time,++pageno);
lno = 0;
}
llen = lflag;
rlen = strlen(sbuf);
for (;rlen > 0;rlen-=llen) {
++lno;
strncpy(lbuf,sbuf,llen); /* limit output line length */
if (lbuf[llen-1] != '\0') {
lbuf[llen] = '\n'; /* in case len(lbuf) > llen */
lbuf[llen+1] = '\0';
}
printf("%s", lbuf);
if (rlen > llen) {
strncpy(sbuf,sbuf+llen,llen); /* discard part printed */
printf(" ");
llen = lflag - 8;
}
}
}