home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Overload
/
ShartewareOverload.cdr
/
progm
/
cpgms.zip
/
PCFUPD.C
< prev
next >
Wrap
C/C++ Source or Header
|
1985-11-17
|
7KB
|
272 lines
#include "stdio.h"
#define EOF 0x1a
#define ERROR 0
#define CPMEOF 0X1A
#define MAXINDX 50
#define MAXDATA 1024
#define NULL 0
#define EOS 0
#define DeSmet 1
char *documentation[] = {
"pcfupd updates a PC-FILE III data file.",
" pcfupd [flags] [file] [<file] ",
"",
"Flags are single characters preceeded by '-':",
" - none are yet defined",
"",
"Input is from the given file.",
"Output is to stdout. To print add >PRN: to your command.",
0 };
int dbug = 0;
struct {
char fname[12];
int flen;
int fpos;
} fields[MAXINDX];
int totlen = 0;
int nflds = 0;
int indxlen, datalen;
main(argc, argv)
char *argv[];
{
register char *p, fstrng[12];
register int c, i;
int nfile;
char tolower();
FILE *f, fdta, fidx;
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 'D':
case 'd':
dbug++;
break;
default:
usage("Unknown flag");
}
}
argv[i] = 0;
--nfile;
}
}
if (nfile == 0)
puts("PC-FILE data filename missing\n");
else if (nfile > 1)
usage("Too many filenames");
else {
strncpy(fstrng, p, sizeof(fstrng)-4);
strncat(fstrng, ".HDR", sizeof(fstrng));
if ((f=fopen(fstrng, "r")) == NULL)
cant(fstrng);
else {
loadpc(f, fstrng);
fclose(f);
}
}
strncpy(fstrng, p, sizeof(fstrng)-4);
strncat(fstrng, ".DTA", sizeof(fstrng));
if ((fdta=fopen(fstrng, "r")) == NULL) {
cant(fstrng);
exit(1);
}
strncpy(fstrng, p, sizeof(fstrng)-4);
strncat(fstrng, ".INX", sizeof(fstrng));
if ((fidx=fopen(fstrng, "r")) == NULL) {
cant(fstrng);
exit(1);
}
else {
pcfupd(fdta, fidx, p);
fclose(fdta);
fclose(fidx);
}
}
/*******************************************************/
usage(s)
char *s;
{
puts("?LIST-E-");
puts(s);
puts("\n");
puts("Usage: pcfupd [-wul] [file] [<file] [>file]. \n");
puts(" pcfupd ? for help\n");
exit(1);
}
/*******************************************************/
loadpc(fp, fn)
FILE *fp; /* File to process */
char *fn; /* File name (for -f option) */
/*
* load PC-FILE III field definitions fron <file>.HDR.
*/
{
char c, *fgets(), lstrng[10];
int iflg, i, fgetc();
totlen = 0;
while ((c=fgetc(fp)) != EOF && nflds < MAXINDX) {
/* get rest of name */
fields[nflds].fname[0] = c;
for(i = 1; i < sizeof(fields[0].fname); ++i) {
if ((c = fgetc(fp)) == EOF)
error("I/O Error on <file>.HDR","");
fields[nflds].fname[i] = c;
if ((c == '\r') || (c == '\n') || (c == EOS))
break;
}
/* remove trailing blanks */
if (fields[nflds].fname[i-1] == ' ')
while (fields[nflds].fname[i-1] == ' ')
i--;
fields[nflds].fname[i] = EOS;
/* remove trailing trash */
while (c != '\n')
if ((c = fgetc(fp)) == EOF)
error("I/O Error on <file>.HDR","");
/* get length of field */
if(fgets(lstrng,sizeof(lstrng),fp) == NULL)
error("Read error on <file>.HDR","");
fields[nflds].flen = atoi(lstrng);
/* get position of field */
fields[nflds].fpos = totlen;
totlen += fields[nflds].flen;
if (dbug > 1)
printf(" n=%s l=%d p=%d\n", fields[nflds].fname,
fields[nflds].flen, fields[nflds].fpos);
/* bump the pointer and continue */
nflds++;
}
}
/*******************************************************/
pcfupd(fdta, fidx, fn)
FILE *fdta, *fidx; /* Files to process */
char *fn; /* File name */
/*
* update a PC-FILE III data file.
*/
{
char c, indxrec[MAXINDX*2+4], datarec[MAXDATA], lstrng[5];
int imod, irecs, drecs, *idxptr;
long dtask1, dtask2, idxsk1, idxsk2, lseek();
drecs = irecs = 0;
indxlen = (nflds * 2) + 4; /* length of *.INX recs */
datalen = totlen + 1; /* length of *.DTA recs */
idxptr = &indxrec[nflds*2-1]; /* location of pointer */
if (dbug)
printf(" indxlen=%d, datalen=%d\n", indxlen, datalen);
if (indxlen > sizeof(indxrec))
error("Index rec size too large\n","");
if (datalen > sizeof(datarec))
error("Data rec size too large\n","");
/* read an index record */
idxsk1 = lseek(fidx,0l,0); /* get starting position */
while (fread(indxrec,indxlen,1,fidx) != NULL) {
/* ignore deleted records */
if (indxrec[1] == indxrec[2] && indxrec[1] == '/')
continue;
else
irecs++;
imod = 0;
/* update the index entry, if necessary. */
/* (insert update code here) */
/* set imod != zero if re-write necessary */
/* re-write the index entry, if necessary. */
if (imod) {
idxsk2 = lseek(fidx,0l,1); /* save pos of next record */
if (lseek(fidx, idxsk1, 0)) /* locate addr to re-write */
error("Seek error on index file","");
if (fwrite(indxrec, indxlen,1,fidx) == NULL)
error("Re-write failed on index file","");
if (lseek(fidx, idxsk2, 0)) /* reposition for next read */
error("Seek error2 on index file","");
}
imod = 1;
/* select based on index entry, if desired */
/* (insert selection code here) */
/* set imod == zero if read not necessary */
/* read the data file record, if necessary. */
if (imod) {
strncpy(lstrng,*idxptr,4); /* move to work area */
lstrng[4] = EOS; /* end of string */
dtask1 = (atoi(lstrng) - 1) * datalen;
if (dbug)
printf("dtask1=%d, idxptr=%d\n", dtask1, *idxptr);
if (dtask1 >= 0) {
if (lseek(fidx, dtask1, 0)) /* locate for re-write */
error("Seek error on data file","");
if (fgets(datarec,datalen,fdta) == NULL)
error("Read error on data file\n","");
drecs++;
} else
error("Seek addr < zero\n","");
imod = 0;
/* update the data record, if necessary. */
/* (insert update code here) */
/* set imod != zero if re-write necessary */
imod = 1; /*debug*/
/* re-write the data entry, if necessary. */
if (imod) {
if (dbug)
printf("dtask1 on rewrite=%d\n", dtask1);
if (lseek(fdta, dtask1, 0)) /* loc addr to re-write */
error("Seek error on data file","");
if (fwrite(datarec, datalen,1,fdta) == NULL)
error("Re-write failed on data file","");
}
}
}
}