home *** CD-ROM | disk | FTP | other *** search
- /*
- 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]);
- }