date and time created 88/10/21 13:48:19 by bostic
[unix-history] / usr / src / usr.bin / head / head.c
index 8ac9085..c21be49 100644 (file)
@@ -1,90 +1,78 @@
 /*
 /*
- * Copyright (c) 1980 Regents of the University of California.
- * All rights reserved.  The Berkeley software License Agreement
- * specifies the terms and conditions for redistribution.
+ * Copyright (c) 1980, 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.
  */
 
 #ifndef lint
 char copyright[] =
  */
 
 #ifndef lint
 char copyright[] =
-"@(#) Copyright (c) 1980 Regents of the University of California.\n\
+"@(#) Copyright (c) 1980, 1987 Regents of the University of California.\n\
  All rights reserved.\n";
  All rights reserved.\n";
-#endif not lint
+#endif /* not lint */
 
 #ifndef lint
 
 #ifndef lint
-static char sccsid[] = "@(#)head.c     5.1 (Berkeley) %G%";
-#endif not lint
+static char sccsid[] = "@(#)head.c     5.4 (Berkeley) %G%";
+#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*/
 }
 }