xref: /netbsd/usr.bin/head/head.c (revision f7c6bf57)
161f28255Scgd /*
261f28255Scgd  * Copyright (c) 1980, 1987 Regents of the University of California.
361f28255Scgd  * All rights reserved.
461f28255Scgd  *
561f28255Scgd  * Redistribution and use in source and binary forms, with or without
661f28255Scgd  * modification, are permitted provided that the following conditions
761f28255Scgd  * are met:
861f28255Scgd  * 1. Redistributions of source code must retain the above copyright
961f28255Scgd  *    notice, this list of conditions and the following disclaimer.
1061f28255Scgd  * 2. Redistributions in binary form must reproduce the above copyright
1161f28255Scgd  *    notice, this list of conditions and the following disclaimer in the
1261f28255Scgd  *    documentation and/or other materials provided with the distribution.
1361f28255Scgd  * 3. All advertising materials mentioning features or use of this software
1461f28255Scgd  *    must display the following acknowledgement:
1561f28255Scgd  *	This product includes software developed by the University of
1661f28255Scgd  *	California, Berkeley and its contributors.
1761f28255Scgd  * 4. Neither the name of the University nor the names of its contributors
1861f28255Scgd  *    may be used to endorse or promote products derived from this software
1961f28255Scgd  *    without specific prior written permission.
2061f28255Scgd  *
2161f28255Scgd  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2261f28255Scgd  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2361f28255Scgd  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2461f28255Scgd  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2561f28255Scgd  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2661f28255Scgd  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2761f28255Scgd  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2861f28255Scgd  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2961f28255Scgd  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3061f28255Scgd  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3161f28255Scgd  * SUCH DAMAGE.
3261f28255Scgd  */
3361f28255Scgd 
3461f28255Scgd #ifndef lint
3561f28255Scgd char copyright[] =
3661f28255Scgd "@(#) Copyright (c) 1980, 1987 Regents of the University of California.\n\
3761f28255Scgd  All rights reserved.\n";
3861f28255Scgd #endif /* not lint */
3961f28255Scgd 
4061f28255Scgd #ifndef lint
41e9d867efSmycroft /*static char sccsid[] = "from: @(#)head.c	5.5 (Berkeley) 6/1/90";*/
42*f7c6bf57Sjtc static char rcsid[] = "$Id: head.c,v 1.4 1993/08/27 22:30:27 jtc Exp $";
4361f28255Scgd #endif /* not lint */
4461f28255Scgd 
4561f28255Scgd #include <stdio.h>
46aab7593aSjtc #include <stdlib.h>
4761f28255Scgd #include <ctype.h>
48aab7593aSjtc 
49aab7593aSjtc static void usage ();
50aab7593aSjtc 
5161f28255Scgd /*
5261f28255Scgd  * head - give the first few lines of a stream or of each of a set of files
5361f28255Scgd  *
5461f28255Scgd  * Bill Joy UCB August 24, 1977
5561f28255Scgd  */
5661f28255Scgd 
57*f7c6bf57Sjtc int
5861f28255Scgd main(argc, argv)
5961f28255Scgd 	int	argc;
6061f28255Scgd 	char	**argv;
6161f28255Scgd {
6261f28255Scgd 	register int	ch, cnt;
6361f28255Scgd 	int	firsttime, linecnt = 10;
6461f28255Scgd 
65aab7593aSjtc 	/* handle obsolete -number syntax */
66aab7593aSjtc 	if (argc > 1 && argv[1][0] == '-' && isdigit(argv[1][1])) {
6761f28255Scgd 		if ((linecnt = atoi(argv[1] + 1)) < 0) {
68aab7593aSjtc 			usage ();
6961f28255Scgd 		}
70aab7593aSjtc 		argc--; argv++;
7161f28255Scgd 	}
72aab7593aSjtc 
73aab7593aSjtc 	while ((ch = getopt (argc, argv, "n:")) != EOF)
74aab7593aSjtc 		switch (ch) {
75aab7593aSjtc 		case 'n':
76aab7593aSjtc 			if ((linecnt = atoi(optarg)) < 0)
77aab7593aSjtc 				usage ();
78aab7593aSjtc 			break;
79aab7593aSjtc 
80aab7593aSjtc 		default:
81aab7593aSjtc 			usage();
82aab7593aSjtc 		}
83aab7593aSjtc 	argc -= optind, argv += optind;
84aab7593aSjtc 
8561f28255Scgd 	/* setlinebuf(stdout); */
86aab7593aSjtc 	for (firsttime = 1; ; firsttime = 0) {
8761f28255Scgd 		if (!*argv) {
8861f28255Scgd 			if (!firsttime)
8961f28255Scgd 				exit(0);
9061f28255Scgd 		}
9161f28255Scgd 		else {
9261f28255Scgd 			if (!freopen(*argv, "r", stdin)) {
9361f28255Scgd 				fprintf(stderr, "head: can't read %s.\n", *argv);
9461f28255Scgd 				exit(1);
9561f28255Scgd 			}
9661f28255Scgd 			if (argc > 1) {
9761f28255Scgd 				if (!firsttime)
9861f28255Scgd 					putchar('\n');
9961f28255Scgd 				printf("==> %s <==\n", *argv);
10061f28255Scgd 			}
10161f28255Scgd 			++argv;
10261f28255Scgd 		}
10361f28255Scgd 		for (cnt = linecnt; cnt; --cnt)
10461f28255Scgd 			while ((ch = getchar()) != EOF)
10561f28255Scgd 				if (putchar(ch) == '\n')
10661f28255Scgd 					break;
10761f28255Scgd 	}
10861f28255Scgd 	/*NOTREACHED*/
10961f28255Scgd }
110aab7593aSjtc 
111aab7593aSjtc 
112aab7593aSjtc static void
113aab7593aSjtc usage ()
114aab7593aSjtc {
115aab7593aSjtc 	fputs("usage: head [-n line_count] [file ...]\n", stderr);
116aab7593aSjtc 	exit(1);
117aab7593aSjtc }
118aab7593aSjtc 
119