BSD 4_3_Net_2 release
[unix-history] / usr / src / usr.bin / head / head.c
index b80d94d..cbedc34 100644 (file)
@@ -1,75 +1,94 @@
-static char *sccsid = "@(#)head.c      4.2 (Berkeley) %G%";
+/*
+ * Copyright (c) 1980, 1987 Regents of the University of California.
+ * All rights reserved.
+ *
+ * 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
+char copyright[] =
+"@(#) Copyright (c) 1980, 1987 Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+static char sccsid[] = "@(#)head.c     5.5 (Berkeley) 6/1/90";
+#endif /* not lint */
+
 #include <stdio.h>
 #include <stdio.h>
+#include <ctype.h>
 /*
  * head - give the first few lines of a stream or of each of a set of files
  *
  * Bill Joy UCB August 24, 1977
  */
 
 /*
  * head - give the first few lines of a stream or of each of a set of files
  *
  * Bill Joy UCB August 24, 1977
  */
 
-int    linecnt = 10;
-int    argc;
-
-main(Argc, argv)
-       int Argc;
-       char *argv[];
+main(argc, argv)
+       int     argc;
+       char    **argv;
 {
 {
-       register int argc;
-       char *name;
-       register char *argp;
-       static int around;
+       register int    ch, cnt;
+       int     firsttime, linecnt = 10;
 
 
-       Argc--, argv++;
-       argc = Argc;
-       do {
-               while (argc > 0 && argv[0][0] == '-') {
-                       linecnt = getnum(argv[0] + 1);
-                       argc--, argv++, Argc--;
+       if (argc > 1 && argv[1][0] == '-') {
+               if (!isdigit(argv[1][1])) {
+                       fprintf(stderr, "head: illegal option -- %c\n", argv[1][1]);
+                       goto usage;
+               }
+               if ((linecnt = atoi(argv[1] + 1)) < 0) {
+usage:                 fputs("usage: head [-line_count] [file ...]\n", stderr);
+                       exit(1);
+               }
+               --argc; ++argv;
+       }
+       /* setlinebuf(stdout); */
+       for (firsttime = 1, --argc, ++argv;; firsttime = 0) {
+               if (!*argv) {
+                       if (!firsttime)
+                               exit(0);
                }
                }
-               if (argc == 0 && around)
-                       break;
-               if (argc > 0) {
-                       close(0);
-                       if (freopen(argv[0], "r", stdin) == NULL) {
-                               perror(argv[0]);
+               else {
+                       if (!freopen(*argv, "r", stdin)) {
+                               fprintf(stderr, "head: can't read %s.\n", *argv);
                                exit(1);
                        }
                                exit(1);
                        }
-                       name = argv[0];
-                       argc--, argv++;
-               } else
-                       name = 0;
-               if (around)
-                       putchar('\n');
-               around++;
-               if (Argc > 1 && name)
-                       printf("==> %s <==\n", name);
-               copyout(linecnt);
-               fflush(stdout);
-       } while (argc > 0);
-}
-
-copyout(cnt)
-       register int cnt;
-{
-       register int c;
-       char lbuf[BUFSIZ];
-
-       while (cnt > 0 && fgets(lbuf, sizeof lbuf, stdin) != 0) {
-               printf("%s", lbuf);
-               fflush(stdout);
-               cnt--;
-       }
-}
-
-getnum(cp)
-       register char *cp;
-{
-       register int i;
-
-       for (i = 0; *cp >= '0' && *cp <= '9'; cp++)
-               i *= 10, i += *cp - '0';
-       if (*cp) {
-               fprintf(stderr, "Badly formed number\n");
-               exit(1);
+                       if (argc > 1) {
+                               if (!firsttime)
+                                       putchar('\n');
+                               printf("==> %s <==\n", *argv);
+                       }
+                       ++argv;
+               }
+               for (cnt = linecnt; cnt; --cnt)
+                       while ((ch = getchar()) != EOF)
+                               if (putchar(ch) == '\n')
+                                       break;
        }
        }
-       return (i);
+       /*NOTREACHED*/
 }
 }