home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
bdsc
/
bdsc-3
/
append1.c
< prev
next >
Wrap
Text File
|
1994-07-13
|
2KB
|
78 lines
/*
APPEND.C
Written by Leor Zolman, BD Software, 9/82
Usage:
A>append <new_text> <dest_file>
Appends the given new text onto the existing dest file,
using CP/M 2.2x random-record I/O to keep from having to
read through the entire destination file.
The new-text file is loaded into memory before appending,
so it has to be short enough to fit into memory.
If the dest-file doesn't exist, it is created anew.
*/
#include "bdscio.h"
char *tbuffer;
main(argc, argv)
char **argv;
{
int lastsec, esize, i, j;
int fdcurr, fdentry;
char *eptr;
unsigned tbufsize;
tbuffer = endext();
tbufsize = topofmem() - endext() - 500;
if (argc != 3)
exit(puts("Usage: append <new_text> <dest_file>\n"));
if ((fdcurr = open(argv[2],2)) == ERROR) {
printf("Creating a new current workfile: %s...\n",argv[2]);
fdcurr = creat(argv[2]);
tbuffer[0] = CPMEOF;
lastsec = 0;
} else {
lastsec = rcfsiz(fdcurr) - 1;
seek (fdcurr, lastsec, 0);
if (read(fdcurr, tbuffer, 1) < 0) {
printf("Can't read %s\n",argv[2]);
exit();
}
}
for (i = 0; tbuffer[i] != CPMEOF; i++); /* find EOF */
if ((fdentry = open(argv[1],0)) == ERROR) {
printf("Can't open %s to append\n",argv[1]);
fabort(fdcurr);
exit();
}
esize = read(fdentry, tbuffer + i, (tbufsize - SECSIZ)) * SECSIZ;
close(fdentry);
for (eptr = tbuffer + i + esize - SECSIZ; *eptr != CPMEOF; eptr++)
if (eptr == tbuffer + i + esize) {
*eptr++ = CPMEOF;
break;
}
seek(fdcurr, lastsec, 0);
if (write(fdcurr, tbuffer, (j = (eptr - tbuffer)/128 + 1)) != j) {
printf("Write error; disk probably full\n");
fabort(fdcurr);
exit();
}
close(fdcurr);
printf("%s successfully updated.\n",argv[2]);
}