[comp.sys.tahoe] Need utils: head,yes,& nroff

jay@hqda-ai.ARPA (Jay Hiser) (06/27/88)

I'm responsible for 3 CCI 6/32s that run SysV (CCI's rel. 2.22).  I'm
looking for replacements for some of the utils that I'm used to with
BSD.

head: the opposite of 'tail'.   Shouldn't be hard to implement this in
c, but I don't want to reinvent the wheel.  Thought this was part of
'std' unix, but its not in my sys's docs.

yes: pipe the output to some other program that expects 'y' or 'n'.
I've got a file full of 'y\n' that essentially duplicates yes's
function, but it doesn't seem as neat as yes.

nroff: I realize that this has been unbundled (dwb?) from SysV. I
still need to format man pages.  Our OA sys can handle virtually all
my formatting needs, except for nroff -man.  Maybe this could be a GNU
application some day?

Anybody have an alternate source for this useful stuff?  Thanks,

gwyn@brl-smoke.ARPA (Doug Gwyn ) (06/27/88)

In article <6007@hqda-ai.ARPA> jay@hqda-ai.ARPA (Jay Hiser) writes:
>head: the opposite of 'tail'.

if [ $# -eq 0 ]
then	n=10
else	case $1 in
	[0-9]*)	n=$1;	shift;;
	*)	n=10;;
	esac
fi
exec sed -e ${n}q $*

lkb@theceg.UUCP (Lawrence Keith Blische) (06/28/88)

From article <8171@brl-smoke.ARPA>, by gwyn@brl-smoke.ARPA (Doug Gwyn ):
> In article <6007@hqda-ai.ARPA> jay@hqda-ai.ARPA (Jay Hiser) writes:
>>head: the opposite of 'tail'.
> 
> if [ $# -eq 0 ]
> then	n=10
> else	case $1 in
> 	[0-9]*)	n=$1;	shift;;
> 	*)	n=10;;
> 	esac
> fi
> exec sed -e ${n}q $*

I don't want to start the "whose's head is best" :-) war but
the following version seems to better adhere to the BSD SYNOPSIS 
given in my Berkeley (4.3) doc for head(1):

	head [-count] [file ...]

It also overcomes a descrepency between my SysV sed(1) man page
(which indicates that sed takes multiple input files) and reality
(which says it dosen't :-( ).

: Bourne Shell Script
if [ $# -eq 0 ]
then	sed 10q
else	case $1 in
	-[0-9]*)	n="`echo $1|cut -c2-`"
			shift;;
	*)		n="10";;
	esac
	for file in $*
	do
		sed ${n}q $file
	done
fi
----------------------------------------------------------------------
Larry Blische			      ...!cp1!sarin\
The Computer Engineering Group, Inc.		    !wb3ffv!theceg!lkb
+1 301 282 5876 (9-5 ET)	         ...!aplcen/

leo@philmds.UUCP (Leo de Wit) (06/29/88)

In article <8171@brl-smoke.ARPA> gwyn@brl.arpa (Doug Gwyn (VLD/VMB) <gwyn>) writes:
>In article <6007@hqda-ai.ARPA> jay@hqda-ai.ARPA (Jay Hiser) writes:
>>head: the opposite of 'tail'.
>
>if [ $# -eq 0 ]
>then	n=10
>else	case $1 in
>	[0-9]*)	n=$1;	shift;;
>	*)	n=10;;
>	esac
>fi
>exec sed -e ${n}q $*

I like that. He (Jay) also writes:
>yes: pipe the output to some other program that expects 'y' or 'n'.

#!/bin/sh
# yes - be repetitively affirmative

case $# in
0) set y;;
esac

exec sed '
: again
p
b again' <<EOT
$1
EOT

Now there is still nroff to take care of. Anybody feels an urge to
add his "one"-liner, using sed 8-) ?

      Leo.

bostic@OKEEFFE.BERKELEY.EDU (Keith Bostic) (07/01/88)

The BSD version of head(1), while not PD, is freely redistributable.  And
has just recently been cleaned up.  Enjoy.  Forget about sed.

--keith

# This is a shell archive.  Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file".  Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
#	head.c
#
echo x - head.c
sed 's/^X//' >head.c << 'END-of-head.c'
X/*
X * Copyright (c) 1980, 1987 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that the above copyright notice and this paragraph are
X * duplicated in all such forms and that any documentation,
X * advertising materials, and other materials related to such
X * distribution and use acknowledge that the software was developed
X * by the University of California, Berkeley.  The name of the
X * University may not be used to endorse or promote products derived
X * from this software without specific prior written permission.
X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
X * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
X */
X
X#ifndef lint
Xchar copyright[] =
X"@(#) Copyright (c) 1980, 1987 Regents of the University of California.\n\
X All rights reserved.\n";
X#endif /* not lint */
X
X#ifndef lint
Xstatic char sccsid[] = "@(#)head.c	5.4 (Berkeley) 6/29/88";
X#endif /* not lint */
X
X#include <stdio.h>
X#include <ctype.h>
X/*
X * head - give the first few lines of a stream or of each of a set of files
X *
X * Bill Joy UCB August 24, 1977
X */
X
Xmain(argc, argv)
X	int	argc;
X	char	**argv;
X{
X	register int	ch, cnt;
X	int	firsttime, linecnt = 10;
X
X	if (argc > 1 && argv[1][0] == '-') {
X		if (!isdigit(argv[1][1])) {
X			fprintf(stderr, "head: illegal option -- %c\n", argv[1][1]);
X			goto usage;
X		}
X		if ((linecnt = atoi(argv[1] + 1)) < 0) {
Xusage:			fputs("usage: head [-line_count] [file ...]\n", stderr);
X			exit(1);
X		}
X		--argc; ++argv;
X	}
X	/* setlinebuf(stdout); */
X	for (firsttime = 1, --argc, ++argv;; firsttime = 0) {
X		if (!*argv) {
X			if (!firsttime)
X				exit(0);
X		}
X		else {
X			if (!freopen(*argv, "r", stdin)) {
X				fprintf(stderr, "head: can't read %s.\n", *argv);
X				exit(1);
X			}
X			if (argc > 1) {
X				if (!firsttime)
X					putchar('\n');
X				printf("==> %s <==\n", *argv);
X			}
X			++argv;
X		}
X		for (cnt = linecnt; cnt; --cnt)
X			while ((ch = getchar()) != EOF)
X				if (putchar(ch) == '\n')
X					break;
X	}
X	/*NOTREACHED*/
X}
END-of-head.c
exit