Importing usr.bin/lam

No Minix-specific changes needed.

Change-Id: Ib3b0f922be8e170153660d308b541036507c0251
This commit is contained in:
Thomas Cort 2013-10-30 12:09:54 -04:00
parent ce982eb757
commit 1ac41e3f19
6 changed files with 373 additions and 1 deletions

View file

@ -364,6 +364,7 @@
./usr/bin/join minix-sys
./usr/bin/kill minix-sys obsolete
./usr/bin/kyua minix-sys kyua
./usr/bin/lam minix-sys
./usr/bin/last minix-sys
./usr/bin/ld minix-sys binutils
./usr/bin/ldd minix-sys
@ -1951,6 +1952,7 @@
./usr/man/man1/kyua-report-html.1 minix-sys kyua
./usr/man/man1/kyua-test.1 minix-sys kyua
./usr/man/man1/kyua-tester.1 minix-sys kyua
./usr/man/man1/lam.1 minix-sys
./usr/man/man1/last.1 minix-sys
./usr/man/man1/ld.1 minix-sys binutils
./usr/man/man1/ldd.1 minix-sys

View file

@ -175,6 +175,7 @@
2012/10/17 12:00:00,usr.bin/indent
2012/10/17 12:00:00,usr.bin/infocmp
2012/10/17 12:00:00,usr.bin/join
2012/10/17 12:00:00,usr.bin/lam
2011/01/17 18:11:10,usr.bin/ldd
2013/10/18 12:00:00,usr.bin/leave
2012/10/17 12:00:00,usr.bin/lock

View file

@ -13,7 +13,7 @@ SUBDIR= asa \
finger fold from \
fsplit ftp genassym getopt \
head hexdump indent infocmp join \
ldd leave \
lam ldd leave \
lock login logname lorder m4 \
machine make man mesg \
mkdep mkstr mktemp \

8
usr.bin/lam/Makefile Normal file
View file

@ -0,0 +1,8 @@
# $NetBSD: Makefile,v 1.5 2011/08/16 10:37:21 christos Exp $
# @(#)Makefile 8.1 (Berkeley) 6/6/93
PROG= lam
COPTS.lam.c += -Wno-format-nonliteral
.include <bsd.prog.mk>

128
usr.bin/lam/lam.1 Normal file
View file

@ -0,0 +1,128 @@
.\" $NetBSD: lam.1,v 1.7 2010/04/05 21:18:56 joerg Exp $
.\"
.\" Copyright (c) 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.
.\"
.\" @(#)lam.1 8.1 (Berkeley) 6/6/93
.\"
.Dd December 1, 2001
.Dt LAM 1
.Os
.Sh NAME
.Nm lam
.Nd laminate files
.Sh SYNOPSIS
.Nm
.Op Fl f Ar min.max
.Op Fl p Ar min.max
.Op Fl s Ar sepstring
.Op Fl t Ar c
.Ar file ...
.Sh DESCRIPTION
.Nm
copies the named files side by side onto the standard output.
The
.Em n Ns -th
input lines from the input
.Ar files
are considered fragments of the single long
.Em n Ns -th
output line into which they are assembled.
The name
.Dq \&-
means the standard input, and may be repeated.
.Pp
Normally, each option affects only the
.Ar file
after it.
If the option letter is capitalized it affects all subsequent files
until it appears again uncapitalized.
The options are described below.
.Pp
.Bl -tag -width "-s sepstring" -compact
.It Fl f Ar min.max
Print line fragments according to the format string
.Ar min.max ,
where
.Ar min
is the minimum field width and
.Ar max
the maximum field width.
If
.Ar min
begins with a zero, zeros will be added to make up the field width,
and if it begins with a
.Sq \&- ,
the fragment will be left-adjusted
within the field.
.It Fl p Ar min.max
Like
.Fl f ,
but pad this file's field when end-of-file is reached
and other files are still active.
.It Fl s Ar sepstring
Print
.Ar sepstring
before printing line fragments from the next file.
This option may appear after the last file.
.It Fl t Ar c
The input line terminator is
.Ar c
instead of a newline.
The newline normally appended to each output line is omitted.
.El
.Pp
To print files simultaneously for easy viewing use
.Xr pr 1 .
.Sh EXAMPLES
The command
.Bd -literal -offset indent
lam file1 file2 file3 file4
.Ed
.Pp
joins 4 files together along each line.
To merge the lines from four different files use
.Bd -literal -offset indent
lam file1 \-S "\e
" file2 file3 file4
.Ed
.Pp
Every 2 lines of a file may be joined on one line with
.Bd -literal -offset indent
lam \- \- \*[Lt] file
.Ed
.Pp
and a form letter with substitutions keyed by
.Sq \&@
can be done with
.Bd -literal -offset indent
lam \-t @ letter changes
.Ed
.Sh SEE ALSO
.Xr join 1 ,
.Xr pr 1 ,
.Xr printf 3

233
usr.bin/lam/lam.c Normal file
View file

@ -0,0 +1,233 @@
/* $NetBSD: lam.c,v 1.8 2011/09/04 20:28:09 joerg Exp $ */
/*-
* Copyright (c) 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) 1993\
The Regents of the University of California. All rights reserved.");
#endif /* not lint */
#ifndef lint
#if 0
static char sccsid[] = "@(#)lam.c 8.1 (Berkeley) 6/6/93";
#endif
__RCSID("$NetBSD: lam.c,v 1.8 2011/09/04 20:28:09 joerg Exp $");
#endif /* not lint */
/*
* lam - laminate files
* Author: John Kunze, UCB
*/
#include <ctype.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXOFILES 20
#define BIGBUFSIZ 5 * BUFSIZ
struct openfile { /* open file structure */
FILE *fp; /* file pointer */
short eof; /* eof flag */
short pad; /* pad flag for missing columns */
char eol; /* end of line character */
const char *sepstring; /* string to print before each line */
const char *format; /* printf(3) style string spec. */
} input[MAXOFILES];
static int morefiles; /* set by getargs(), changed by gatherline() */
static int nofinalnl; /* normally append \n to each output line */
static char line[BIGBUFSIZ];
static char *linep;
__dead static void error(const char *, const char *);
static char *gatherline(struct openfile *);
static void getargs(char *[]);
static char *pad(struct openfile *);
int
main(int argc, char *argv[])
{
struct openfile *ip;
getargs(argv);
if (!morefiles)
error("lam - laminate files", "");
for (;;) {
linep = line;
for (ip = input; ip->fp != NULL; ip++)
linep = gatherline(ip);
if (!morefiles)
exit(0);
fputs(line, stdout);
fputs(ip->sepstring, stdout);
if (!nofinalnl)
putchar('\n');
}
}
static void
getargs(char *av[])
{
struct openfile *ip = input;
char *p, *c;
static char fmtbuf[BUFSIZ];
char *fmtp = fmtbuf;
int P, S, F, T;
P = S = F = T = 0; /* capitalized options */
while ((p = *++av) != NULL) {
if (*p != '-' || !p[1]) {
if (++morefiles >= MAXOFILES)
errx(1, "too many input files");
if (*p == '-')
ip->fp = stdin;
else if ((ip->fp = fopen(p, "r")) == NULL)
errx(1, "open %s", p);
ip->pad = P;
if (!ip->sepstring)
ip->sepstring = (S ? (ip-1)->sepstring : "");
if (!ip->format)
ip->format = ((P || F) ? (ip-1)->format : "%s");
if (!ip->eol)
ip->eol = (T ? (ip-1)->eol : '\n');
ip++;
continue;
}
c = ++p;
switch (tolower((unsigned char) *c)) {
case 's':
if (*++p || (p = *++av))
ip->sepstring = p;
else
error("Need string after -%s", c);
S = (*c == 'S' ? 1 : 0);
break;
case 't':
if (*++p || (p = *++av))
ip->eol = *p;
else
error("Need character after -%s", c);
T = (*c == 'T' ? 1 : 0);
nofinalnl = 1;
break;
case 'p':
ip->pad = 1;
P = (*c == 'P' ? 1 : 0);
/* FALLTHROUGH */
case 'f':
F = (*c == 'F' ? 1 : 0);
if (*++p || (p = *++av)) {
fmtp += strlen(fmtp) + 1;
if (fmtp >= fmtbuf + sizeof(fmtbuf))
errx(1, "no more format space");
/* restrict format string to only valid width formatters */
if (strspn(p, "-.0123456789") != strlen(p))
errx(1, "invalid format string `%s'", p);
if (snprintf(fmtp, fmtbuf + sizeof(fmtbuf) - fmtp, "%%%ss", p)
>= fmtbuf + sizeof(fmtbuf) - fmtp)
errx(1, "no more format space");
sprintf(fmtp, "%%%ss", p);
ip->format = fmtp;
}
else
error("Need string after -%s", c);
break;
default:
error("What do you mean by -%s?", c);
break;
}
}
ip->fp = NULL;
if (!ip->sepstring)
ip->sepstring = "";
}
static char *
pad(struct openfile *ip)
{
char *lp = linep;
strlcpy(lp, ip->sepstring, line + sizeof(line) - lp);
lp += strlen(lp);
if (ip->pad) {
snprintf(lp, line + sizeof(line) - lp, ip->format, "");
lp += strlen(lp);
}
return (lp);
}
static char *
gatherline(struct openfile *ip)
{
char s[BUFSIZ];
int c;
char *p;
char *lp = linep;
char *end = s + sizeof(s) - 1;
if (ip->eof)
return (pad(ip));
for (p = s; (c = fgetc(ip->fp)) != EOF && p < end; p++)
if ((*p = c) == ip->eol)
break;
*p = '\0';
if (c == EOF) {
ip->eof = 1;
if (ip->fp == stdin)
fclose(stdin);
morefiles--;
return (pad(ip));
}
strlcpy(lp, ip->sepstring, line + sizeof(line) - lp);
lp += strlen(lp);
snprintf(lp, line + sizeof(line) - lp, ip->format, s);
lp += strlen(lp);
return (lp);
}
static void
error(const char *msg, const char *s)
{
warnx(msg, s);
fprintf(stderr,
"\nUsage: lam [ -[fp] min.max ] [ -s sepstring ] [ -t c ] file ...\n");
if (strncmp("lam - ", msg, 6) == 0)
fprintf(stderr, "Options:\n\t%s\t%s\t%s\t%s\t%s",
"-f min.max field widths for file fragments\n",
"-p min.max like -f, but pad missing fragments\n",
"-s sepstring fragment separator\n",
"-t c input line terminator is c, no \\n after output lines\n",
"Capitalized options affect more than one file.\n");
exit(1);
}