BSD 4_4 release
[unix-history] / usr / src / usr.bin / paste / paste.c
index 53a434b..7f17e1d 100644 (file)
@@ -1,44 +1,59 @@
 /*
 /*
- * Copyright (c) 1989 The Regents of the University of California.
- * All rights reserved.
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
  *
  * This code is derived from software contributed to Berkeley by
  * Adam S. Moskowitz of Menlo Consulting.
  *
  *
  * This code is derived from software contributed to Berkeley by
  * Adam S. Moskowitz of Menlo Consulting.
  *
- * 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 MERCHANTABILITY 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
-char copyright[] =
-"@(#) Copyright (c) 1989 The Regents of the University of California.\n\
- All rights reserved.\n";
+static char copyright[] =
+"@(#) Copyright (c) 1989, 1993\n\
      The Regents of the University of California.  All rights reserved.\n";
 #endif /* not lint */
 
 #ifndef lint
 #endif /* not lint */
 
 #ifndef lint
-static char sccsid[] = "@(#)paste.c    5.1 (Berkeley) %G%";
+static char sccsid[] = "@(#)paste.c    8.1 (Berkeley) 6/6/93";
 #endif /* not lint */
 
 #include <sys/types.h>
 #include <errno.h>
 #include <limits.h>
 #include <stdio.h>
 #endif /* not lint */
 
 #include <sys/types.h>
 #include <errno.h>
 #include <limits.h>
 #include <stdio.h>
-#include <strings.h>
+#include <string.h>
 
 
-extern int errno;
 char *delim;
 int delimcnt;
 
 char *delim;
 int delimcnt;
 
-main (argc, argv)
+main(argc, argv)
        int argc;
        char **argv;
 {
        int argc;
        char **argv;
 {
@@ -89,7 +104,7 @@ parallel(argv)
        register char ch, *p;
        LIST *head, *tmp;
        int opencnt, output;
        register char ch, *p;
        LIST *head, *tmp;
        int opencnt, output;
-       char buf[LINE_MAX + 1], *malloc();
+       char buf[_POSIX2_LINE_MAX + 1], *malloc();
 
        for (cnt = 0, head = NULL; p = *argv; ++argv, ++cnt) {
                if (!(lp = (LIST *)malloc((u_int)sizeof(LIST)))) {
 
        for (cnt = 0, head = NULL; p = *argv; ++argv, ++cnt) {
                if (!(lp = (LIST *)malloc((u_int)sizeof(LIST)))) {
@@ -115,18 +130,20 @@ parallel(argv)
        }
 
        for (opencnt = cnt; opencnt;) {
        }
 
        for (opencnt = cnt; opencnt;) {
-               for (cnt = -1, output = 0, lp = head; lp; lp = lp->next) {
+               for (output = 0, lp = head; lp; lp = lp->next) {
                        if (!lp->fp) {
                        if (!lp->fp) {
-                               if (cnt == -1)
-                                       cnt = 0;
+                               if (output && lp->cnt &&
+                                   (ch = delim[(lp->cnt - 1) % delimcnt]))
+                                       putchar(ch);
                                continue;
                        }
                        if (!fgets(buf, sizeof(buf), lp->fp)) {
                                if (!--opencnt)
                                        break;
                                lp->fp = NULL;
                                continue;
                        }
                        if (!fgets(buf, sizeof(buf), lp->fp)) {
                                if (!--opencnt)
                                        break;
                                lp->fp = NULL;
-                               if (cnt == -1)
-                                       cnt = 0;
+                               if (output && lp->cnt &&
+                                   (ch = delim[(lp->cnt - 1) % delimcnt]))
+                                       putchar(ch);
                                continue;
                        }
                        if (!(p = index(buf, '\n'))) {
                                continue;
                        }
                        if (!(p = index(buf, '\n'))) {
@@ -136,12 +153,17 @@ parallel(argv)
                                exit(1);
                        }
                        *p = '\0';
                                exit(1);
                        }
                        *p = '\0';
-                       if (cnt == -1)
-                               cnt = 0;
-                       else for (; cnt < lp->cnt; ++cnt)
-                               if (ch = delim[cnt % delimcnt])
-                                       putchar(ch);
-                       output = 1;
+                       /*
+                        * make sure that we don't print any delimiters
+                        * unless there's a non-empty file.
+                        */
+                       if (!output) {
+                               output = 1;
+                               for (cnt = 0; cnt < lp->cnt; ++cnt)
+                                       if (ch = delim[cnt % delimcnt])
+                                               putchar(ch);
+                       } else if (ch = delim[(lp->cnt - 1) % delimcnt])
+                               putchar(ch);
                        (void)printf("%s", buf);
                }
                if (output)
                        (void)printf("%s", buf);
                }
                if (output)
@@ -155,12 +177,12 @@ sequential(argv)
        register FILE *fp;
        register int cnt;
        register char ch, *p, *dp;
        register FILE *fp;
        register int cnt;
        register char ch, *p, *dp;
-       char buf[LINE_MAX + 1];
+       char buf[_POSIX2_LINE_MAX + 1];
 
        for (; p = *argv; ++argv) {
                if (p[0] == '-' && !p[1])
                        fp = stdin;
 
        for (; p = *argv; ++argv) {
                if (p[0] == '-' && !p[1])
                        fp = stdin;
-               if (!(fp = fopen(p, "r"))) {
+               else if (!(fp = fopen(p, "r"))) {
                        (void)fprintf(stderr, "paste: %s: %s.\n", p,
                            strerror(errno));
                        continue;
                        (void)fprintf(stderr, "paste: %s: %s.\n", p,
                            strerror(errno));
                        continue;