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