386BSD 0.1 development
[unix-history] / usr / src / usr.bin / split / split.c
index 1ca83e4..698f5c2 100644 (file)
@@ -2,17 +2,33 @@
  * Copyright (c) 1987 Regents of the University of California.
  * All rights reserved.
  *
  * Copyright (c) 1987 Regents of the University of California.
  * All rights reserved.
  *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley.  The name of the
- * University may not 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 MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. 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 BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  */
 
 #ifndef lint
  */
 
 #ifndef lint
@@ -22,7 +38,7 @@ char copyright[] =
 #endif /* not lint */
 
 #ifndef lint
 #endif /* not lint */
 
 #ifndef lint
-static char sccsid[] = "@(#)split.c    4.6 (Berkeley) %G%";
+static char sccsid[] = "@(#)split.c    4.8 (Berkeley) 6/1/90";
 #endif /* not lint */
 
 #include <sys/param.h>
 #endif /* not lint */
 
 #include <sys/param.h>
@@ -32,7 +48,6 @@ static char sccsid[] = "@(#)split.c   4.6 (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 */
@@ -46,12 +61,12 @@ static char bfr[MAXBSIZE],          /* I/O buffer */
                fname[MAXPATHLEN];      /* file name */
 
 main(argc, argv)
                fname[MAXPATHLEN];      /* file name */
 
 main(argc, argv)
-       int     argc;
-       char    **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) {
                if (argv[cnt][0] == '-')
 
        for (cnt = 1; cnt < argc; ++cnt) {
                if (argv[cnt][0] == '-')
@@ -85,7 +100,7 @@ main(argc, argv)
                else if (ifd == ERR) {          /* input file */
                        if ((ifd = open(argv[cnt], O_RDONLY, 0)) < 0) {
                                perror(argv[cnt]);
                else if (ifd == ERR) {          /* input file */
                        if ((ifd = open(argv[cnt], O_RDONLY, 0)) < 0) {
                                perror(argv[cnt]);
-                               exit(ERREXIT);
+                               exit(1);
                        }
                }
                else if (!*fname)               /* output file prefix */
                        }
                }
                else if (!*fname)               /* output file prefix */
@@ -100,19 +115,18 @@ main(argc, 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;;)
                switch(len = read(ifd, bfr, MAXBSIZE)) {
 
        for (bcnt = 0;;)
                switch(len = read(ifd, bfr, MAXBSIZE)) {
@@ -120,7 +134,7 @@ split1()
                        exit(OK);
                case ERR:
                        perror("read");
                        exit(OK);
                case ERR:
                        perror("read");
-                       exit(ERREXIT);
+                       exit(1);
                default:
                        if (!file_open) {
                                newfile();
                default:
                        if (!file_open) {
                                newfile();
@@ -128,15 +142,18 @@ split1()
                        }
                        if (bcnt + len >= bytecnt) {
                                dist = bytecnt - bcnt;
                        }
                        if (bcnt + len >= bytecnt) {
                                dist = bytecnt - bcnt;
-                               write(ofd, bfr, dist);
+                               if (write(ofd, bfr, dist) != dist)
+                                       wrerror();
                                len -= dist;
                                for (C = bfr + dist; len >= bytecnt; len -= bytecnt, C += bytecnt) {
                                        newfile();
                                len -= dist;
                                for (C = bfr + dist; len >= bytecnt; len -= bytecnt, C += bytecnt) {
                                        newfile();
-                                       write(ofd, C, (int)bytecnt);
+                                       if (write(ofd, C, (int)bytecnt) != bytecnt)
+                                               wrerror();
                                }
                                if (len) {
                                        newfile();
                                }
                                if (len) {
                                        newfile();
-                                       write(ofd, C, len);
+                                       if (write(ofd, C, len) != len)
+                                               wrerror();
                                }
                                else
                                        file_open = NO;
                                }
                                else
                                        file_open = NO;
@@ -144,7 +161,8 @@ split1()
                        }
                        else {
                                bcnt += len;
                        }
                        else {
                                bcnt += len;
-                               write(ofd, bfr, len);
+                               if (write(ofd, bfr, len) != len)
+                                       wrerror();
                        }
                }
 }
                        }
                }
 }
@@ -153,13 +171,11 @@ 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;;)
                switch(len = read(ifd, bfr, MAXBSIZE)) {
 
        for (lcnt = 0;;)
                switch(len = read(ifd, bfr, MAXBSIZE)) {
@@ -167,7 +183,7 @@ split2()
                        exit(0);
                case ERR:
                        perror("read");
                        exit(0);
                case ERR:
                        perror("read");
-                       break;
+                       exit(1);
                default:
                        if (!file_open) {
                                newfile();
                default:
                        if (!file_open) {
                                newfile();
@@ -175,7 +191,9 @@ split2()
                        }
                        for (Cs = Ce = bfr; len--; Ce++)
                                if (*Ce == '\n' && ++lcnt == numlines) {
                        }
                        for (Cs = Ce = bfr; len--; Ce++)
                                if (*Ce == '\n' && ++lcnt == numlines) {
-                                       write(ofd, Cs, (int)(Ce - Cs) + 1);
+                                       bcnt = Ce - Cs + 1;
+                                       if (write(ofd, Cs, bcnt) != bcnt)
+                                               wrerror();
                                        lcnt = 0;
                                        Cs = Ce + 1;
                                        if (len)
                                        lcnt = 0;
                                        Cs = Ce + 1;
                                        if (len)
@@ -183,8 +201,11 @@ split2()
                                        else
                                                file_open = NO;
                                }
                                        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();
+                       }
                }
 }
 
                }
 }
 
@@ -192,12 +213,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]) {
@@ -219,7 +239,7 @@ newfile()
        if (fnum == MAXFILES) {
                if (!defname || fname[0] == 'z') {
                        fputs("split: too many files.\n", stderr);
        if (fnum == MAXFILES) {
                if (!defname || fname[0] == 'z') {
                        fputs("split: too many files.\n", stderr);
-                       exit(ERREXIT);
+                       exit(1);
                }
                ++fname[0];
                fnum = 0;
                }
                ++fname[0];
                fnum = 0;
@@ -237,9 +257,18 @@ newfile()
  * usage --
  *     print usage message and die
  */
  * usage --
  *     print usage message and die
  */
-static
 usage()
 {
        fputs("usage: split [-] [-#] [-b byte_count] [file [prefix]]\n", stderr);
 usage()
 {
        fputs("usage: split [-] [-#] [-b byte_count] [file [prefix]]\n", stderr);
-       exit(ERREXIT);
+       exit(1);
+}
+
+/*
+ * wrerror --
+ *     write error
+ */
+wrerror()
+{
+       perror("split: write");
+       exit(1);
 }
 }