Importing usr.bin/head
This commit is contained in:
		
							parent
							
								
									d5a4c35980
								
							
						
					
					
						commit
						ab046ee6ea
					
				@ -10,7 +10,7 @@ SUBDIR=	add_route arp ash at backup basename btrace \
 | 
				
			|||||||
	dhrystone diff dirname diskctl dumpcore \
 | 
						dhrystone diff dirname diskctl dumpcore \
 | 
				
			||||||
	eject env expand factor fbdctl \
 | 
						eject env expand factor fbdctl \
 | 
				
			||||||
	find finger fingerd fix fold format fortune fsck.mfs \
 | 
						find finger fingerd fix fold format fortune fsck.mfs \
 | 
				
			||||||
	ftp101 gcore gcov-pull getty grep head hexdump host \
 | 
						ftp101 gcore gcov-pull getty grep hexdump host \
 | 
				
			||||||
	hostaddr id ifconfig ifdef \
 | 
						hostaddr id ifconfig ifdef \
 | 
				
			||||||
	intr ipcrm ipcs irdpd isoread last \
 | 
						intr ipcrm ipcs irdpd isoread last \
 | 
				
			||||||
	less loadkeys loadramdisk logger look lp \
 | 
						less loadkeys loadramdisk logger look lp \
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +0,0 @@
 | 
				
			|||||||
PROG=	head
 | 
					 | 
				
			||||||
MAN=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.include <bsd.prog.mk>
 | 
					 | 
				
			||||||
@ -1,88 +0,0 @@
 | 
				
			|||||||
/* head - print the first few lines of a file	Author: Andy Tanenbaum */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <errno.h>
 | 
					 | 
				
			||||||
#include <stdlib.h>
 | 
					 | 
				
			||||||
#include <stdio.h>
 | 
					 | 
				
			||||||
#include <string.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define DEFAULT 10
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int main(int argc, char **argv);
 | 
					 | 
				
			||||||
void do_file(int n, FILE *f);
 | 
					 | 
				
			||||||
void usage(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int main(argc, argv)
 | 
					 | 
				
			||||||
int argc;
 | 
					 | 
				
			||||||
char *argv[];
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  FILE *f;
 | 
					 | 
				
			||||||
  int legacy, n, k, nfiles;
 | 
					 | 
				
			||||||
  char *ptr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* Check for flags.  One can only specify how many lines to print. */
 | 
					 | 
				
			||||||
  k = 1;
 | 
					 | 
				
			||||||
  n = DEFAULT;
 | 
					 | 
				
			||||||
  legacy = 0;
 | 
					 | 
				
			||||||
  for (k = 1; k < argc && argv[k][0] == '-'; k++) {
 | 
					 | 
				
			||||||
	ptr = &argv[k][1];
 | 
					 | 
				
			||||||
	if (ptr[0] == 'n' && ptr[1] == 0) {
 | 
					 | 
				
			||||||
		k++;
 | 
					 | 
				
			||||||
		if (k >= argc) usage();
 | 
					 | 
				
			||||||
		ptr = argv[k];
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	else if (ptr[0] == '-' && ptr[1] == 0) {
 | 
					 | 
				
			||||||
		k++;
 | 
					 | 
				
			||||||
		break;	
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	else if (++legacy > 1) usage();
 | 
					 | 
				
			||||||
	n = atoi(ptr);
 | 
					 | 
				
			||||||
	if (n <= 0) usage();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  nfiles = argc - k;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (nfiles == 0) {
 | 
					 | 
				
			||||||
	/* Print standard input only. */
 | 
					 | 
				
			||||||
	do_file(n, stdin);
 | 
					 | 
				
			||||||
	exit(0);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* One or more files have been listed explicitly. */
 | 
					 | 
				
			||||||
  while (k < argc) {
 | 
					 | 
				
			||||||
	if (nfiles > 1) printf("==> %s <==\n", argv[k]);
 | 
					 | 
				
			||||||
	if ((f = fopen(argv[k], "r")) == NULL)
 | 
					 | 
				
			||||||
		fprintf(stderr, "%s: cannot open %s: %s\n",
 | 
					 | 
				
			||||||
			argv[0], argv[k], strerror(errno));
 | 
					 | 
				
			||||||
	else {
 | 
					 | 
				
			||||||
		do_file(n, f);
 | 
					 | 
				
			||||||
		fclose(f);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	k++;
 | 
					 | 
				
			||||||
	if (k < argc) printf("\n");
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  return(0);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void do_file(n, f)
 | 
					 | 
				
			||||||
int n;
 | 
					 | 
				
			||||||
FILE *f;
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  int c;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* Print the first 'n' lines of a file. */
 | 
					 | 
				
			||||||
  while (n) switch (c = getc(f)) {
 | 
					 | 
				
			||||||
	    case EOF:
 | 
					 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
	    case '\n':
 | 
					 | 
				
			||||||
		--n;
 | 
					 | 
				
			||||||
	    default:	putc((char) c, stdout);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void usage()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  fprintf(stderr, "Usage: head [-lines | -n lines] [file ...]\n");
 | 
					 | 
				
			||||||
  exit(1);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -6,7 +6,7 @@ MAN=	ash.1 at.1 basename.1 \
 | 
				
			|||||||
	dumpcore.1 eject.1 \
 | 
						dumpcore.1 eject.1 \
 | 
				
			||||||
	env.1 expand.1 factor.1 \
 | 
						env.1 expand.1 factor.1 \
 | 
				
			||||||
	finger.1 flexdoc.1 fold.1 format.1 fortune.1 \
 | 
						finger.1 flexdoc.1 fold.1 format.1 fortune.1 \
 | 
				
			||||||
	fsck.mfs.1 head.1 host.1 hostaddr.1 ifdef.1 \
 | 
						fsck.mfs.1 host.1 hostaddr.1 ifdef.1 \
 | 
				
			||||||
	isodir.1 isoinfo.1 isoread.1 \
 | 
						isodir.1 isoinfo.1 isoread.1 \
 | 
				
			||||||
	last.1 loadfont.1 loadkeys.1 logger.1 \
 | 
						last.1 loadfont.1 loadkeys.1 logger.1 \
 | 
				
			||||||
	look.1 lp.1 lspci.1 mail.1  \
 | 
						look.1 lp.1 lspci.1 mail.1  \
 | 
				
			||||||
 | 
				
			|||||||
@ -1,37 +0,0 @@
 | 
				
			|||||||
.TH HEAD 1
 | 
					 | 
				
			||||||
.SH NAME
 | 
					 | 
				
			||||||
head \- print the first few lines of a file
 | 
					 | 
				
			||||||
.SH SYNOPSIS
 | 
					 | 
				
			||||||
\fBhead\fR [\fB\-\fIn\fR | \fB\-n\fR \fIn\fR]\fR [\fIfile\fR] ...\fR
 | 
					 | 
				
			||||||
.br
 | 
					 | 
				
			||||||
.de FL
 | 
					 | 
				
			||||||
.TP
 | 
					 | 
				
			||||||
\\fB\\$1\\fR
 | 
					 | 
				
			||||||
\\$2
 | 
					 | 
				
			||||||
..
 | 
					 | 
				
			||||||
.de EX
 | 
					 | 
				
			||||||
.TP 20
 | 
					 | 
				
			||||||
\\fB\\$1\\fR
 | 
					 | 
				
			||||||
# \\$2
 | 
					 | 
				
			||||||
..
 | 
					 | 
				
			||||||
.SH OPTIONS
 | 
					 | 
				
			||||||
.TP 5
 | 
					 | 
				
			||||||
.B \-n \fIn\fR
 | 
					 | 
				
			||||||
# How many lines to print
 | 
					 | 
				
			||||||
.TP 5
 | 
					 | 
				
			||||||
.B \-\fIn\fR
 | 
					 | 
				
			||||||
# How many lines to print (backwards-compatible)
 | 
					 | 
				
			||||||
.SH EXAMPLES
 | 
					 | 
				
			||||||
.TP 20
 | 
					 | 
				
			||||||
.B head \-n 6
 | 
					 | 
				
			||||||
# Print first 6 lines of \fIstdin\fR
 | 
					 | 
				
			||||||
.TP 20
 | 
					 | 
				
			||||||
.B head \-1 file1 file2
 | 
					 | 
				
			||||||
# Print first line of two files
 | 
					 | 
				
			||||||
.SH DESCRIPTION
 | 
					 | 
				
			||||||
.PP
 | 
					 | 
				
			||||||
The first few lines of one or more files are printed.
 | 
					 | 
				
			||||||
The default count is 10 lines.
 | 
					 | 
				
			||||||
The default file is \fIstdin\fR.
 | 
					 | 
				
			||||||
.SH "SEE ALSO"
 | 
					 | 
				
			||||||
.BR tail (1).
 | 
					 | 
				
			||||||
@ -130,6 +130,7 @@
 | 
				
			|||||||
2012/10/17 12:00:00,usr.bin/col
 | 
					2012/10/17 12:00:00,usr.bin/col
 | 
				
			||||||
2012/10/17 12:00:00,usr.bin/ctags
 | 
					2012/10/17 12:00:00,usr.bin/ctags
 | 
				
			||||||
2011/09/01 13:37:33,usr.bin/du
 | 
					2011/09/01 13:37:33,usr.bin/du
 | 
				
			||||||
 | 
					2013/03/18 12:00:00,usr.bin/head
 | 
				
			||||||
2012/10/17 12:00:00,usr.bin/genassym
 | 
					2012/10/17 12:00:00,usr.bin/genassym
 | 
				
			||||||
2013/03/09 12:00:00,usr.bin/getopt
 | 
					2013/03/09 12:00:00,usr.bin/getopt
 | 
				
			||||||
2012/10/17 12:00:00,usr.bin/gzip
 | 
					2012/10/17 12:00:00,usr.bin/gzip
 | 
				
			||||||
 | 
				
			|||||||
@ -11,7 +11,7 @@ SUBDIR= \
 | 
				
			|||||||
	du \
 | 
						du \
 | 
				
			||||||
	\
 | 
						\
 | 
				
			||||||
	\
 | 
						\
 | 
				
			||||||
	genassym getopt \
 | 
						genassym getopt head \
 | 
				
			||||||
	indent infocmp join \
 | 
						indent infocmp join \
 | 
				
			||||||
	ldd \
 | 
						ldd \
 | 
				
			||||||
	login lorder m4 \
 | 
						login lorder m4 \
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										6
									
								
								usr.bin/head/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								usr.bin/head/Makefile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					#	$NetBSD: Makefile,v 1.4 1997/10/18 13:15:18 mrg Exp $
 | 
				
			||||||
 | 
					#	from: @(#)Makefile	8.1 (Berkeley) 6/6/93
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PROG=	head
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.include <bsd.prog.mk>
 | 
				
			||||||
							
								
								
									
										97
									
								
								usr.bin/head/head.1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								usr.bin/head/head.1
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,97 @@
 | 
				
			|||||||
 | 
					.\"	$NetBSD: head.1,v 1.12 2004/05/04 23:44:21 wiz Exp $
 | 
				
			||||||
 | 
					.\"
 | 
				
			||||||
 | 
					.\" Copyright (c) 1980, 1990, 1993
 | 
				
			||||||
 | 
					.\"	The 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. 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.
 | 
				
			||||||
 | 
					.\"
 | 
				
			||||||
 | 
					.\"	from: @(#)head.1	8.1 (Berkeley) 6/6/93
 | 
				
			||||||
 | 
					.\"
 | 
				
			||||||
 | 
					.Dd May 4, 2004
 | 
				
			||||||
 | 
					.Dt HEAD 1
 | 
				
			||||||
 | 
					.Os
 | 
				
			||||||
 | 
					.Sh NAME
 | 
				
			||||||
 | 
					.Nm head
 | 
				
			||||||
 | 
					.Nd display first lines of a file
 | 
				
			||||||
 | 
					.Sh SYNOPSIS
 | 
				
			||||||
 | 
					.Nm
 | 
				
			||||||
 | 
					.Op Fl qv
 | 
				
			||||||
 | 
					.Op Fl n Ar count
 | 
				
			||||||
 | 
					.Op Fl c Ar byte_count
 | 
				
			||||||
 | 
					.Op Ar file ...
 | 
				
			||||||
 | 
					.Sh DESCRIPTION
 | 
				
			||||||
 | 
					This filter displays the first
 | 
				
			||||||
 | 
					.Ar count
 | 
				
			||||||
 | 
					lines of each of the specified files, or of the standard input if no
 | 
				
			||||||
 | 
					files are specified.
 | 
				
			||||||
 | 
					If
 | 
				
			||||||
 | 
					.Ar count
 | 
				
			||||||
 | 
					is omitted it defaults to 10.
 | 
				
			||||||
 | 
					If
 | 
				
			||||||
 | 
					.Fl c Ar byte_count
 | 
				
			||||||
 | 
					is specified,
 | 
				
			||||||
 | 
					.Nm
 | 
				
			||||||
 | 
					counts bytes instead of lines.
 | 
				
			||||||
 | 
					.Pp
 | 
				
			||||||
 | 
					If more than a single file is specified, or the
 | 
				
			||||||
 | 
					.Fl v
 | 
				
			||||||
 | 
					option is used, each file is preceded by a header consisting of the string
 | 
				
			||||||
 | 
					.Dq ==\*[Gt] XXX \*[Le]=
 | 
				
			||||||
 | 
					where
 | 
				
			||||||
 | 
					.Dq XXX
 | 
				
			||||||
 | 
					is the name of the file.
 | 
				
			||||||
 | 
					The
 | 
				
			||||||
 | 
					.Fl q
 | 
				
			||||||
 | 
					flag disables the printing of the header in all cases.
 | 
				
			||||||
 | 
					.Pp
 | 
				
			||||||
 | 
					The
 | 
				
			||||||
 | 
					.Nm
 | 
				
			||||||
 | 
					utility exits 0 on success, and \*[Gt]0 if an error occurs.
 | 
				
			||||||
 | 
					.Sh COMPATIBILITY
 | 
				
			||||||
 | 
					The historic command line syntax of
 | 
				
			||||||
 | 
					.Nm
 | 
				
			||||||
 | 
					is supported by this implementation.
 | 
				
			||||||
 | 
					.Pp
 | 
				
			||||||
 | 
					This command is mostly compatible with GNU extensions to
 | 
				
			||||||
 | 
					.Nm .
 | 
				
			||||||
 | 
					.Sh SEE ALSO
 | 
				
			||||||
 | 
					.Xr tail 1
 | 
				
			||||||
 | 
					.Sh STANDARDS
 | 
				
			||||||
 | 
					The
 | 
				
			||||||
 | 
					.Nm
 | 
				
			||||||
 | 
					utility conforms to
 | 
				
			||||||
 | 
					.St -p1003.2-92 .
 | 
				
			||||||
 | 
					.Sh HISTORY
 | 
				
			||||||
 | 
					The
 | 
				
			||||||
 | 
					.Nm
 | 
				
			||||||
 | 
					utility appeared in
 | 
				
			||||||
 | 
					.Bx 3.0 .
 | 
				
			||||||
 | 
					It was enhanced to include the
 | 
				
			||||||
 | 
					.Fl c ,
 | 
				
			||||||
 | 
					.Fl q ,
 | 
				
			||||||
 | 
					and
 | 
				
			||||||
 | 
					.Fl v
 | 
				
			||||||
 | 
					options for
 | 
				
			||||||
 | 
					.Nx 2.1 .
 | 
				
			||||||
							
								
								
									
										204
									
								
								usr.bin/head/head.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										204
									
								
								usr.bin/head/head.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,204 @@
 | 
				
			|||||||
 | 
					/*	$NetBSD: head.c,v 1.23 2010/03/31 21:55:23 joerg Exp $	*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 1980, 1987, 1992, 1993
 | 
				
			||||||
 | 
					 *	The 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. 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.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <sys/cdefs.h>
 | 
				
			||||||
 | 
					#ifndef lint
 | 
				
			||||||
 | 
					__COPYRIGHT("@(#) Copyright (c) 1980, 1987, 1992, 1993\
 | 
				
			||||||
 | 
					 The Regents of the University of California.  All rights reserved.");
 | 
				
			||||||
 | 
					#endif /* not lint */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef lint
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					static char sccsid[] = "@(#)head.c	8.2 (Berkeley) 5/4/95";
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					__RCSID("$NetBSD: head.c,v 1.23 2010/03/31 21:55:23 joerg Exp $");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif /* not lint */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <ctype.h>
 | 
				
			||||||
 | 
					#include <err.h>
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <inttypes.h>
 | 
				
			||||||
 | 
					#include <limits.h>
 | 
				
			||||||
 | 
					#include <locale.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * head - give the first few lines of a stream or of each of a set of files
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Bill Joy UCB August 24, 1977
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void head(FILE *, intmax_t, intmax_t);
 | 
				
			||||||
 | 
					static void obsolete(char *[]);
 | 
				
			||||||
 | 
					__dead static void usage(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					main(int argc, char *argv[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int ch;
 | 
				
			||||||
 | 
						FILE *fp;
 | 
				
			||||||
 | 
						int first;
 | 
				
			||||||
 | 
						uintmax_t linecnt;
 | 
				
			||||||
 | 
						uintmax_t bytecnt;
 | 
				
			||||||
 | 
						char *ep;
 | 
				
			||||||
 | 
						int eval = 0;
 | 
				
			||||||
 | 
						int qflag = 0;
 | 
				
			||||||
 | 
						int vflag = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						(void)setlocale(LC_ALL, "");
 | 
				
			||||||
 | 
						obsolete(argv);
 | 
				
			||||||
 | 
						linecnt = 10;
 | 
				
			||||||
 | 
						bytecnt = 0;
 | 
				
			||||||
 | 
						while ((ch = getopt(argc, argv, "c:n:qv")) != -1)
 | 
				
			||||||
 | 
							switch(ch) {
 | 
				
			||||||
 | 
							case 'c':
 | 
				
			||||||
 | 
								errno = 0;
 | 
				
			||||||
 | 
								bytecnt = strtoimax(optarg, &ep, 10);
 | 
				
			||||||
 | 
								if ((bytecnt == INTMAX_MAX && errno == ERANGE) ||
 | 
				
			||||||
 | 
								    *ep || bytecnt <= 0)
 | 
				
			||||||
 | 
									errx(1, "illegal byte count -- %s", optarg);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case 'n':
 | 
				
			||||||
 | 
								errno = 0;
 | 
				
			||||||
 | 
								linecnt = strtoimax(optarg, &ep, 10);
 | 
				
			||||||
 | 
								if ((linecnt == INTMAX_MAX && errno == ERANGE) ||
 | 
				
			||||||
 | 
								    *ep || linecnt <= 0)
 | 
				
			||||||
 | 
									errx(1, "illegal line count -- %s", optarg);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case 'q':
 | 
				
			||||||
 | 
								qflag = 1;
 | 
				
			||||||
 | 
								vflag = 0;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case 'v':
 | 
				
			||||||
 | 
								qflag = 0;
 | 
				
			||||||
 | 
								vflag = 1;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case '?':
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								usage();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						argc -= optind;
 | 
				
			||||||
 | 
						argv += optind;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (*argv)
 | 
				
			||||||
 | 
							for (first = 1; *argv; ++argv) {
 | 
				
			||||||
 | 
								if ((fp = fopen(*argv, "r")) == NULL) {
 | 
				
			||||||
 | 
									warn("%s", *argv);
 | 
				
			||||||
 | 
									eval = 1;
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if (vflag || (qflag == 0 && argc > 1)) {
 | 
				
			||||||
 | 
									(void)printf("%s==> %s <==\n",
 | 
				
			||||||
 | 
									    first ? "" : "\n", *argv);
 | 
				
			||||||
 | 
									first = 0;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								head(fp, linecnt, bytecnt);
 | 
				
			||||||
 | 
								(void)fclose(fp);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							head(stdin, linecnt, bytecnt);
 | 
				
			||||||
 | 
						exit(eval);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					head(FILE *fp, intmax_t cnt, intmax_t bytecnt)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char buf[65536];
 | 
				
			||||||
 | 
						size_t len, rv, rv2;
 | 
				
			||||||
 | 
						int ch;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (bytecnt) {
 | 
				
			||||||
 | 
							while (bytecnt) {
 | 
				
			||||||
 | 
								len = sizeof(buf);
 | 
				
			||||||
 | 
								if (bytecnt > (intmax_t)sizeof(buf))
 | 
				
			||||||
 | 
									len = sizeof(buf);
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									len = bytecnt;
 | 
				
			||||||
 | 
								rv = fread(buf, 1, len, fp);
 | 
				
			||||||
 | 
								if (rv == 0)
 | 
				
			||||||
 | 
									break; /* Distinguish EOF and error? */
 | 
				
			||||||
 | 
								rv2 = fwrite(buf, 1, rv, stdout);
 | 
				
			||||||
 | 
								if (rv2 != rv) {
 | 
				
			||||||
 | 
									if (feof(stdout))
 | 
				
			||||||
 | 
										errx(1, "EOF on stdout");
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
										err(1, "failure writing to stdout");
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								bytecnt -= rv;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							while ((ch = getc(fp)) != EOF) {
 | 
				
			||||||
 | 
								if (putchar(ch) == EOF)
 | 
				
			||||||
 | 
									err(1, "stdout");
 | 
				
			||||||
 | 
								if (ch == '\n' && --cnt == 0)
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					obsolete(char *argv[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char *ap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while ((ap = *++argv)) {
 | 
				
			||||||
 | 
							/* Return if "--" or not "-[0-9]*". */
 | 
				
			||||||
 | 
							if (ap[0] != '-' || ap[1] == '-' ||
 | 
				
			||||||
 | 
							    !isdigit((unsigned char)ap[1]))
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							if ((ap = malloc(strlen(*argv) + 2)) == NULL)
 | 
				
			||||||
 | 
								err(1, NULL);
 | 
				
			||||||
 | 
							ap[0] = '-';
 | 
				
			||||||
 | 
							ap[1] = 'n';
 | 
				
			||||||
 | 
							(void)strcpy(ap + 2, *argv + 1);
 | 
				
			||||||
 | 
							*argv = ap;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					usage(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						(void)fprintf(stderr, "usage: %s [-n lines] [file ...]\n",
 | 
				
			||||||
 | 
						    getprogname());
 | 
				
			||||||
 | 
						exit(1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user