BSD 4_3_Reno release
[unix-history] / usr / src / usr.bin / split / split.c
index 203b9cc..318db8b 100644 (file)
@@ -1,4 +1,31 @@
-static char *sccsid = "@(#)split.c     4.3 (Berkeley) %G%";
+/*
+ * Copyright (c) 1987 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that: (1) source distributions retain this entire copyright
+ * notice and comment, and (2) distributions including binaries display
+ * the following acknowledgement:  ``This product includes software
+ * developed by the University of California, Berkeley and its contributors''
+ * in the documentation or other materials provided with the distribution
+ * and in all advertising materials mentioning features or use of this
+ * software. Neither the name of the University nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#ifndef lint
+char copyright[] =
+"@(#) Copyright (c) 1987 Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+static char sccsid[] = "@(#)split.c    4.8 (Berkeley) 6/1/90";
+#endif /* not lint */
 
 #include <sys/param.h>
 #include <sys/file.h>
 
 #include <sys/param.h>
 #include <sys/file.h>
@@ -7,7 +34,6 @@ static char *sccsid = "@(#)split.c     4.3 (Berkeley) %G%";
 
 #define DEFLINE        1000                    /* default num lines per file */
 #define ERR    -1                      /* general error */
 
 #define DEFLINE        1000                    /* default num lines per file */
 #define ERR    -1                      /* general error */
-#define ERREXIT        0                       /* error exit */
 #define NO     0                       /* no/false */
 #define OK     0                       /* okay exit */
 #define YES    1                       /* yes/true */
 #define NO     0                       /* no/false */
 #define OK     0                       /* okay exit */
 #define YES    1                       /* yes/true */
@@ -20,51 +46,51 @@ static short        file_open;              /* if a file open */
 static char    bfr[MAXBSIZE],          /* I/O buffer */
                fname[MAXPATHLEN];      /* file name */
 
 static char    bfr[MAXBSIZE],          /* I/O buffer */
                fname[MAXPATHLEN];      /* file name */
 
-main(argc,argv)
-int    argc;
-char   **argv;
+main(argc, argv)
+       int argc;
+       char **argv;
 {
 {
-       register int    cnt;            /* general counter */
-       long    atol();
-       char    *strcpy();
+       register int cnt;
+       long atol();
+       char *strcpy();
 
 
-       for (cnt = 1;cnt < argc;++cnt) {
+       for (cnt = 1; cnt < argc; ++cnt) {
                if (argv[cnt][0] == '-')
                        switch(argv[cnt][1]) {
                if (argv[cnt][0] == '-')
                        switch(argv[cnt][1]) {
-                               case 0:         /* stdin by request */
-                                       if (ifd != ERR)
-                                               usage();
-                                       ifd = 0;
-                                       break;
-                               case 'b':       /* byte count split */
-                                       if (numlines)
-                                               usage();
-                                       if (!argv[cnt][2])
-                                               bytecnt = atol(argv[++cnt]);
-                                       else
-                                               bytecnt = atol(argv[cnt] + 2);
-                                       if (bytecnt <= 0) {
-                                               fputs("split: byte count must be greater than zero.\n",stderr);
-                                               usage();
-                                       }
-                                       break;
-                               default:
-                                       if (!isdigit(argv[cnt][1]) || bytecnt)
-                                               usage();
-                                       if ((numlines = atol(argv[cnt] + 2)) <= 0) {
-                                               fputs("split: line count must be greater than zero.\n",stderr);
-                                               usage();
-                                       }
-                                       break;
+                       case 0:         /* stdin by request */
+                               if (ifd != ERR)
+                                       usage();
+                               ifd = 0;
+                               break;
+                       case 'b':       /* byte count split */
+                               if (numlines)
+                                       usage();
+                               if (!argv[cnt][2])
+                                       bytecnt = atol(argv[++cnt]);
+                               else
+                                       bytecnt = atol(argv[cnt] + 2);
+                               if (bytecnt <= 0) {
+                                       fputs("split: byte count must be greater than zero.\n", stderr);
+                                       usage();
+                               }
+                               break;
+                       default:
+                               if (!isdigit(argv[cnt][1]) || bytecnt)
+                                       usage();
+                               if ((numlines = atol(argv[cnt] + 1)) <= 0) {
+                                       fputs("split: line count must be greater than zero.\n", stderr);
+                                       usage();
+                               }
+                               break;
                        }
                else if (ifd == ERR) {          /* input file */
                        }
                else if (ifd == ERR) {          /* input file */
-                       if ((ifd = open(argv[cnt],O_RDONLY,0)) < 0) {
+                       if ((ifd = open(argv[cnt], O_RDONLY, 0)) < 0) {
                                perror(argv[cnt]);
                                perror(argv[cnt]);
-                               exit(ERREXIT);
+                               exit(1);
                        }
                }
                else if (!*fname)               /* output file prefix */
                        }
                }
                else if (!*fname)               /* output file prefix */
-                       strcpy(fname,argv[cnt]);
+                       strcpy(fname, argv[cnt]);
                else
                        usage();
        }
                else
                        usage();
        }
@@ -75,52 +101,55 @@ char       **argv;
        if (!numlines)
                numlines = DEFLINE;
        split2();
        if (!numlines)
                numlines = DEFLINE;
        split2();
+       exit(0);
 }
 
 /*
  * split1 --
  *     split by bytes
  */
 }
 
 /*
  * split1 --
  *     split by bytes
  */
-static
 split1()
 {
 split1()
 {
-       register long   bcnt;           /* byte counter */
-       register int    dist,           /* buffer offset */
-                       len;            /* read length */
-       register char   *C;             /* tmp pointer into buffer */
+       register long bcnt;
+       register int dist, len;
+       register char *C;
 
        for (bcnt = 0;;)
 
        for (bcnt = 0;;)
-               switch(len = read(ifd,bfr,MAXBSIZE)) {
-                       case 0:
-                               exit(OK);
-                       case ERR:
-                               perror("read");
-                               exit(ERREXIT);
-                       default:
-                               if (!file_open) {
+               switch(len = read(ifd, bfr, MAXBSIZE)) {
+               case 0:
+                       exit(OK);
+               case ERR:
+                       perror("read");
+                       exit(1);
+               default:
+                       if (!file_open) {
+                               newfile();
+                               file_open = YES;
+                       }
+                       if (bcnt + len >= bytecnt) {
+                               dist = bytecnt - bcnt;
+                               if (write(ofd, bfr, dist) != dist)
+                                       wrerror();
+                               len -= dist;
+                               for (C = bfr + dist; len >= bytecnt; len -= bytecnt, C += bytecnt) {
                                        newfile();
                                        newfile();
-                                       file_open = YES;
-                               }
-                               if (bcnt + len >= bytecnt) {
-                                       dist = bytecnt - bcnt;
-                                       write(ofd,bfr,dist);
-                                       len -= dist;
-                                       for (C = bfr + dist;len >= bytecnt;len -= bytecnt,C += bytecnt) {
-                                               newfile();
-                                               write(ofd,C,(int)bytecnt);
-                                       }
-                                       if (len) {
-                                               newfile();
-                                               write(ofd,C,len);
-                                       }
-                                       else
-                                               file_open = NO;
-                                       bcnt = len;
+                                       if (write(ofd, C, (int)bytecnt) != bytecnt)
+                                               wrerror();
                                }
                                }
-                               else {
-                                       bcnt += len;
-                                       write(ofd,bfr,len);
+                               if (len) {
+                                       newfile();
+                                       if (write(ofd, C, len) != len)
+                                               wrerror();
                                }
                                }
+                               else
+                                       file_open = NO;
+                               bcnt = len;
+                       }
+                       else {
+                               bcnt += len;
+                               if (write(ofd, bfr, len) != len)
+                                       wrerror();
+                       }
                }
 }
 
                }
 }
 
@@ -128,38 +157,41 @@ split1()
  * split2 --
  *     split by lines
  */
  * split2 --
  *     split by lines
  */
-static
 split2()
 {
 split2()
 {
-       register char   *Ce,                    /* start/end pointers */
-                       *Cs;
-       register long   lcnt;                   /* line counter */
-       register int    len;                    /* read length */
+       register char *Ce, *Cs;
+       register long lcnt;
+       register int len, bcnt;
 
        for (lcnt = 0;;)
 
        for (lcnt = 0;;)
-               switch(len = read(ifd,bfr,MAXBSIZE)) {
-                       case 0:
-                               exit(0);
-                       case ERR:
-                               perror("read");
-                               break;
-                       default:
-                               if (!file_open) {
-                                       newfile();
-                                       file_open = YES;
+               switch(len = read(ifd, bfr, MAXBSIZE)) {
+               case 0:
+                       exit(0);
+               case ERR:
+                       perror("read");
+                       exit(1);
+               default:
+                       if (!file_open) {
+                               newfile();
+                               file_open = YES;
+                       }
+                       for (Cs = Ce = bfr; len--; Ce++)
+                               if (*Ce == '\n' && ++lcnt == numlines) {
+                                       bcnt = Ce - Cs + 1;
+                                       if (write(ofd, Cs, bcnt) != bcnt)
+                                               wrerror();
+                                       lcnt = 0;
+                                       Cs = Ce + 1;
+                                       if (len)
+                                               newfile();
+                                       else
+                                               file_open = NO;
                                }
                                }
-                               for (Cs = Ce = bfr;len--;Ce++)
-                                       if (*Ce == '\n' && ++lcnt == numlines) {
-                                               write(ofd,Cs,(int)(Ce - Cs) + 1);
-                                               lcnt = 0;
-                                               Cs = Ce + 1;
-                                               if (len)
-                                                       newfile();
-                                               else
-                                                       file_open = NO;
-                                       }
-                               if (Cs < Ce)
-                                       write(ofd,Cs,(int)(Ce - Cs));
+                       if (Cs < Ce) {
+                               bcnt = Ce - Cs;
+                               if (write(ofd, Cs, bcnt) != bcnt)
+                                       wrerror();
+                       }
                }
 }
 
                }
 }
 
@@ -167,12 +199,11 @@ split2()
  * newfile --
  *     open a new file
  */
  * newfile --
  *     open a new file
  */
-static
 newfile()
 {
 newfile()
 {
-       static long     fnum;           /* file name counter */
-       static short    defname;        /* using default name, "x" */
-       static char     *fpnt;          /* output file name pointer */
+       static long fnum;
+       static short defname;
+       static char *fpnt;
 
        if (ofd == ERR) {
                if (fname[0]) {
 
        if (ofd == ERR) {
                if (fname[0]) {
@@ -193,8 +224,8 @@ newfile()
 #define MAXFILES       676
        if (fnum == MAXFILES) {
                if (!defname || fname[0] == 'z') {
 #define MAXFILES       676
        if (fnum == MAXFILES) {
                if (!defname || fname[0] == 'z') {
-                       fputs("split: too many files.\n",stderr);
-                       exit(ERREXIT);
+                       fputs("split: too many files.\n", stderr);
+                       exit(1);
                }
                ++fname[0];
                fnum = 0;
                }
                ++fname[0];
                fnum = 0;
@@ -202,8 +233,8 @@ newfile()
        fpnt[0] = fnum / 26 + 'a';
        fpnt[1] = fnum % 26 + 'a';
        ++fnum;
        fpnt[0] = fnum / 26 + 'a';
        fpnt[1] = fnum % 26 + 'a';
        ++fnum;
-       if (!freopen(fname,"w",stdout)) {
-               fprintf(stderr,"split: unable to write to %s.\n",fname);
+       if (!freopen(fname, "w", stdout)) {
+               fprintf(stderr, "split: unable to write to %s.\n", fname);
                exit(ERR);
        }
 }
                exit(ERR);
        }
 }
@@ -212,9 +243,18 @@ newfile()
  * usage --
  *     print usage message and die
  */
  * usage --
  *     print usage message and die
  */
-static
 usage()
 {
 usage()
 {
-       fputs("usage: split [-] [-#] [-b byte_count] [file [prefix]]\n",stderr);
-       exit(ERREXIT);
+       fputs("usage: split [-] [-#] [-b byte_count] [file [prefix]]\n", stderr);
+       exit(1);
+}
+
+/*
+ * wrerror --
+ *     write error
+ */
+wrerror()
+{
+       perror("split: write");
+       exit(1);
 }
 }