Annotation of coherent/d/bin/split.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * split.c
                      3:  * Usage: split [ -n ] [ infile [ outfile ]]
                      4:  *
                      5:  * split copies its input file into n-line pieces
                      6:  * with output filenames ending in "aa", "ab", ... "zz".
                      7:  * "n" (default 1000) is the number of lines per output file,
                      8:  * "infile" (default or "-" is standard input) is the file to read,
                      9:  * "outfile" (default "x") is the initial part of the output file name.
                     10:  * A "-n" option beginning with 'c' (e.g. "-c100000") splits
                     11:  * a binary file into characters instead of an ASCII file into lines.
                     12:  */
                     13: 
                     14: #include <stdio.h>
                     15: 
                     16: /*
                     17:  * Globals.
                     18:  */
                     19: int    binary = 0;             /* 0 for ASCII lines, 1 for binary characters */
                     20: long   chunk = 1000L;          /* number of lines or chars per output file */
                     21: FILE   *ifp = stdin;           /* input file pointer */
                     22: char   *outname = "xaa";       /* first output filename */
                     23: 
                     24: /*
                     25:  * Functions.
                     26:  */
                     27: long   atol();
                     28: void   copy();
                     29: void   fatal();
                     30: char   *malloc();
                     31: void   nextname();
                     32: void   options();
                     33: char   *strcat();
                     34: char   *strcpy();
                     35: 
                     36: main(argc, argv) int argc; char *argv[];
                     37: {
                     38:        register int c;
                     39:        register FILE *ofp;
                     40:        register char *mode;
                     41:        register char *tail;
                     42: 
                     43:        options(argc, argv);
                     44:        tail = outname + strlen(outname) - 1;
                     45:        mode = (binary) ? "wb" : "w";
                     46:        while (!feof(ifp) && (c = getc(ifp)) != EOF) {
                     47:                ungetc(c, ifp);
                     48:                if ((ofp = fopen(outname, mode)) == NULL)
                     49:                        fatal("split: cannot open output file \"%s\"\n",
                     50:                                outname);
                     51:                copy(ofp);
                     52:                if (fclose(ofp) == EOF)
                     53:                        fatal("split: cannot close output file \"%s\"\n",
                     54:                                outname);
                     55:                nextname(tail);
                     56:        }
                     57:        exit(0);
                     58: }
                     59: 
                     60: /*
                     61:  * Copy "chunk" lines or characters from "ifp" to "ofp".
                     62:  */
                     63: void copy(ofp) register FILE *ofp;
                     64: {
                     65:        register int c;
                     66:        register long num;
                     67: 
                     68:        for (num = chunk; (c = getc(ifp)) != EOF; ) {
                     69:                putc(c, ofp);
                     70:                if ((binary || c == '\n') && --num <= 0)
                     71:                        return;
                     72:        }
                     73: }
                     74: 
                     75: /*
                     76:  * Cry and die.
                     77:  * Avoids the nonportable "%r" format by assuming char * "cp" follows "fmt".
                     78:  * The second argument is omitted if the "fmt" does not require it.
                     79:  */
                     80: void fatal(fmt, cp) register char *fmt, *cp;
                     81: {
                     82:        fprintf(stderr, fmt, cp);
                     83:        exit(1);
                     84: }
                     85: 
                     86: /*
                     87:  * Set "outname" to the next output file name.
                     88:  * If there are no more output files, issue an error message and exit.
                     89:  */
                     90: void nextname(cp) register char *cp;
                     91: {
                     92:        if (++*cp <= 'z')
                     93:                return;
                     94:        *cp = 'a';
                     95:        if (++*--cp <= 'z')
                     96:                return;
                     97:        fatal("split: too many output files\n");
                     98: }
                     99: 
                    100: /*
                    101:  * Process command line options and initialize globals.
                    102:  */
                    103: void options(argc, argv) register int argc; register char *argv[];
                    104: {
                    105:        register char *cp;
                    106: 
                    107:        if (--argc > 0 && **++argv == '-') {
                    108:                cp = ++*argv;
                    109:                if (*cp == 'c') {
                    110:                        binary = 1;
                    111:                        ++cp;
                    112:                }
                    113:                chunk = atol(cp);
                    114:                ++argv;
                    115:                --argc;
                    116:        }
                    117:        if (chunk <= 0L || argc > 2)
                    118:                fatal("Usage: split [ -n ] [ infile [ outfile ]]\n");
                    119:        if (argc > 0) {
                    120:                cp = *argv++;
                    121:                if (strcmp(cp, "-") != 0
                    122:                 && (ifp = fopen(cp, (binary) ? "rb" : "r")) == NULL)
                    123:                        fatal("split: cannot open input file \"%s\"\n", cp);
                    124:        }
                    125:        if (argc > 1) {
                    126:                cp = *argv++;
                    127:                if ((outname = malloc(strlen(cp) + 3)) == NULL)
                    128:                        fatal("split: \"%s\" too long\n", cp);
                    129:                strcpy(outname, cp);
                    130:                strcat(outname, "aa");
                    131:        }
                    132: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.