1 /* 2 * Copyright (c) 1980, 1987, 1992, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * %sccs.include.redist.c% 6 */ 7 8 #ifndef lint 9 static char copyright[] = 10 "@(#) Copyright (c) 1980, 1987, 1992, 1993\n\ 11 The Regents of the University of California. All rights reserved.\n"; 12 #endif /* not lint */ 13 14 #ifndef lint 15 static char sccsid[] = "@(#)head.c 8.1 (Berkeley) 06/06/93"; 16 #endif /* not lint */ 17 18 #include <sys/types.h> 19 #include <errno.h> 20 #include <stdlib.h> 21 #include <string.h> 22 #include <stdio.h> 23 #include <ctype.h> 24 25 /* 26 * head - give the first few lines of a stream or of each of a set of files 27 * 28 * Bill Joy UCB August 24, 1977 29 */ 30 31 void err __P((int, const char *, ...)); 32 void head __P((FILE *, int)); 33 void obsolete __P((char *[])); 34 void usage __P((void)); 35 36 int eval; 37 38 int 39 main(argc, argv) 40 int argc; 41 char *argv[]; 42 { 43 register int ch; 44 FILE *fp; 45 int first, linecnt; 46 char *ep; 47 48 obsolete(argv); 49 linecnt = 10; 50 while ((ch = getopt(argc, argv, "n:")) != EOF) 51 switch(ch) { 52 case 'n': 53 linecnt = strtol(optarg, &ep, 10); 54 if (*ep || linecnt <= 0) 55 err(1, "illegal line count -- %s", optarg); 56 break; 57 case '?': 58 default: 59 usage(); 60 } 61 argc -= optind; 62 argv += optind; 63 64 if (*argv) 65 for (first = 1; *argv; ++argv) { 66 if ((fp = fopen(*argv, "r")) == NULL) { 67 err(0, "%s: %s", *argv, strerror(errno)); 68 continue; 69 } 70 if (argc > 1) { 71 (void)printf("%s==> %s <==\n", 72 first ? "" : "\n", *argv); 73 first = 0; 74 } 75 head(fp, linecnt); 76 (void)fclose(fp); 77 } 78 else 79 head(stdin, linecnt); 80 exit(eval); 81 } 82 83 void 84 head(fp, cnt) 85 FILE *fp; 86 register int cnt; 87 { 88 register int ch; 89 90 while (cnt--) 91 while ((ch = getc(fp)) != EOF) { 92 if (putchar(ch) == EOF) 93 err(1, "stdout: %s", strerror(errno)); 94 if (ch == '\n') 95 break; 96 } 97 } 98 99 void 100 obsolete(argv) 101 char *argv[]; 102 { 103 char *ap; 104 105 while (ap = *++argv) { 106 /* Return if "--" or not "-[0-9]*". */ 107 if (ap[0] != '-' || ap[1] == '-' || !isdigit(ap[1])) 108 return; 109 if ((ap = malloc(strlen(*argv) + 2)) == NULL) 110 err(1, "%s", strerror(errno)); 111 ap[0] = '-'; 112 ap[1] = 'n'; 113 (void)strcpy(ap + 2, *argv + 1); 114 *argv = ap; 115 } 116 } 117 118 void 119 usage() 120 { 121 (void)fprintf(stderr, "usage: head [-n lines] [file ...]\n"); 122 exit(1); 123 } 124 125 #if __STDC__ 126 #include <stdarg.h> 127 #else 128 #include <varargs.h> 129 #endif 130 131 void 132 #if __STDC__ 133 err(int fatal, const char *fmt, ...) 134 #else 135 err(fatal, fmt, va_alist) 136 int fatal; 137 char *fmt; 138 va_dcl 139 #endif 140 { 141 va_list ap; 142 #if __STDC__ 143 va_start(ap, fmt); 144 #else 145 va_start(ap); 146 #endif 147 (void)fprintf(stderr, "head: "); 148 (void)vfprintf(stderr, fmt, ap); 149 va_end(ap); 150 (void)fprintf(stderr, "\n"); 151 if (fatal) 152 exit(1); 153 eval = 1; 154 } 155