home *** CD-ROM | disk | FTP | other *** search
- #ifndef lint
- static char* rcs_id = "$Id: bsplit.c,v 1.1 1992/09/05 15:26:05 arrouye Exp arrouye $";
- #endif
-
- /*
- * $Header: /tmp_mnt/users/mistral2/arrouye/sevy-src/RCS/bsplit.c,v 1.1 1992/09/05 15:26:05 arrouye Exp arrouye $
- * $Revision: 1.1 $ $State: Exp $
- *
- * $Author: arrouye $ $Date: 1992/09/05 15:26:05 $ $Locked$
- *
- */
-
- /*
- * $Log: bsplit.c,v $
- * Revision 1.1 1992/09/05 15:26:05 arrouye
- * Initial revision
- *
- * Changed Fri Apr 15 07:44:19 MET DST 1994 to support multiple sizes.
-
- *
- */
-
- #include <unistd.h>
- #include <fcntl.h>
- #include <ctype.h>
- #include <stdio.h>
- #include <string.h>
-
- #include <sys/param.h>
-
- #ifndef CHUNK
- #define CHUNK (32 * 1024)
- #endif
-
- #ifndef OUT
- #define OUT "bx"
- #endif
-
- #ifndef OUTSUFFIX
- #define OUTSUFFIX "aaa"
- #endif
-
- struct blksize_elem {
- int blksize;
- struct blksize_elem* next;
- };
-
- static void usage(pname)
- char* pname; {
-
- fprintf(stderr,
- "usage: %s [-n] [-blksize[b|k|m]] [input|- [oprefix [osuffix]]]\n", pname);
- exit(1);
- }
-
- static int size(sz)
- char* sz; {
-
- int thesize;
-
- for (thesize = 0; *sz && isdigit(*sz); ++sz) {
- thesize = thesize * 10 + *sz - '0';
- }
-
- if (*sz) {
- if (sz[1]) {
- thesize = -1;
- } else {
- switch (islower(*sz) ? *sz : tolower(*sz)) {
- case 'm':
- thesize = thesize * 1024;
-
- case 'k':
- thesize = thesize * 1024;
- break;
-
- case 'b':
- break;
-
- default:
- thesize = -1;
- break;
- }
- }
- }
-
- return thesize;
- }
-
- static int bsplit(pname, ifile, oprefix, osuffix, blksz, alphabetic)
- char* pname;
- char* ifile;
- char* oprefix;
- char* osuffix;
- struct blksize_elem* blksz;
- int alphabetic; {
-
- char outfile[MAXPATHLEN];
- char* outletter;
-
- char* pool;
- int ninpool;
- int res;
-
- int filenum = 1;
-
- int fd;
- int fmdsk;
-
- int size = 0;
-
- struct blksize_elem sentinel;
-
- sentinel.next = blksz, blksz = &sentinel;
-
- if (strcmp(ifile, "-")) {
- fd = open(ifile, O_RDONLY);
- if (fd == -1) {
- fprintf(stderr, "%s: cannot open %s\n", pname, ifile);
- res = 4;
- goto end;
- }
- } else {
- fd = 0;
- }
-
- if (alphabetic) {
- strcpy(outfile, oprefix);
- strcat(outfile, osuffix);
- outletter = outfile + (strlen(outfile) - 1);
- --*outletter;
- }
-
- do {
- int out;
- int num;
-
- if (blksz->next) {
- blksz = blksz->next;
-
- if (!(size = blksz->blksize)) {
- fprintf(stderr, "%s: zero block size\n", pname);
- return 7;
- }
- }
-
- for (ninpool = 1; size && !(pool = (char*) malloc(size));
- ++ninpool, size /= 2)
- ;
-
- if (!size) {
- fprintf(stderr, "%s: not enough memory\n", pname);
- return 3;
- }
-
- if (alphabetic) {
- char* theletter = outletter;
- do {
- if (++*theletter > 'z') {
- *theletter = OUTSUFFIX[strlen(OUTSUFFIX) -
- (outletter - theletter) - 1];
- --theletter;
- } else {
- break;
- }
- } while (outletter - theletter < strlen(OUTSUFFIX));
-
- if (outletter - theletter == strlen(OUTSUFFIX)) {
- fprintf(stderr, "%s: cannot generate filename after %s\n",
- pname, outfile);
- res = 5;
- goto end;
- }
- } else {
- sprintf(outfile, "%s%d", oprefix, filenum++);
- }
-
- out = creat(outfile, 0666);
- if (out == -1) {
- fprintf(stderr, "%s: cannot create %s\n", pname, outfile);
- res = 6;
- goto end;
- }
-
- for (fmdsk = 1, num = ninpool; fmdsk && num; --num) {
- if ((fmdsk = read(fd, pool, size)) > 0) {
- write(out, pool, fmdsk);
- } else if (fmdsk == -1) {
- fprintf(stderr, "%s: error reading %s\n", pname, ifile);
- res = 7;
- goto end;
- }
- }
-
- close(out);
- } while (fmdsk == size);
-
- close(fd);
-
- end:
- free(pool);
- return res;
- }
-
- main(argc, argv)
- int argc;
- char** argv; {
-
- char* pname = *argv++;
- struct blksize_elem* blksz = (struct blksize_elem*) 0;
- struct blksize_elem* lstsz = blksz;
- char* ifile;
- char* oprefix = OUT;
- char* osuffix = OUTSUFFIX;
-
- int alphabetic = 1;
-
- if (*argv && !strcmp(*argv, "-n")) {
- alphabetic = 0;
- ++argv;
- }
-
- while (*argv && **argv == '-' && (*argv)[1]) {
- /* Block size */
-
- int thesize = size(*argv++ + 1);
-
- if (!thesize) {
- fprintf(stderr, "%s: bad size %s\n", pname, blksz);
- return 2;
- } else if (thesize == -1) {
- usage(pname);
- } else {
- struct blksize_elem* el =
- (struct blksize_elem*) malloc(sizeof(struct blksize_elem));
-
- if (!el) {
- fprintf(stderr, "%s: not enough memory\n", pname);
- exit(3);
- } else {
- el->blksize = thesize;
- el->next = (struct blksize_elem*) 0;
-
- if (lstsz) {
- lstsz->next = el;
- } else {
- blksz = lstsz = el;
- }
- }
- }
- }
-
- if (!*argv) {
- ifile = "-";
- } else {
- ifile = *argv++;
- }
-
- if (*argv) {
- oprefix = *argv++;
- }
-
- if (*argv) {
- osuffix = *argv++;
- }
-
- if (*argv) {
- usage(pname);
- }
-
- if (!blksz) {
- struct blksize_elem* el =
- (struct blksize_elem*) malloc(sizeof(struct blksize_elem));
-
- if (!el) {
- fprintf(stderr, "%s: not enough memory\n", pname);
- exit(3);
- } else {
- el->blksize = CHUNK;
- el->next = (struct blksize_elem*) 0;
-
- blksz = lstsz = el;
- }
- }
-
- return bsplit(pname, ifile, oprefix, osuffix, blksz, alphabetic);
- }
-
-