This is bsplit.c in view mode; [Download] [Up]
#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); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.