Use err(3) instead of local redefintion. Add usage() as a separate

function. Rewrote man page in mdoc format.
This commit is contained in:
charnier 1997-07-18 06:43:15 +00:00
parent 41ee770120
commit 7cb730f7e3
2 changed files with 75 additions and 79 deletions

View File

@ -31,97 +31,98 @@
.\"
.\" @(#)lam.1 8.1 (Berkeley) 6/6/93
.\"
.TH LAM 1 "June 6, 1993"
.UC 4
.SH NAME
lam \- laminate files
.SH SYNOPSIS
.B lam [ \-[fp]
min.max
.B ] [ \-s
sepstring
.B ] [ \-t
c
.B ]
file ...
.SH DESCRIPTION
.I Lam
.Dd June 6, 1993
.Dt LAM 1
.Os
.Sh NAME
.Nm lam
.Nd laminate files
.Sh SYNOPSIS
.Nm
.Op Fl f Ar min.max
.Op Fl s Ar sepstring
.Op Fl t Ar c
.Ar file ...
.Nm lam
.Op Fl p Ar min.max
.Op Fl s Ar sepstring
.Op Fl t Ar c
.Ar file ...
.Sh DESCRIPTION
.Nm Lam
copies the named files side by side onto the standard output.
The
.IR n -th
.Em n-th
input lines from the input
.IR file s
.Ar files
are considered fragments of the single long
.IR n -th
.Em n-th
output line into which they are assembled.
The name `\fB\-\fP' means the standard input, and may be repeated.
.PP
.Pp
Normally, each option affects only the
.I file
.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.
.IP \fB\-f\fP\ min.max
.Bl -tag -width indent
.It Fl f Ar min.max
Print line fragments according to the format string
.IR min.max ,
.Ar min.max ,
where
.I min
.Ar min
is the minimum field width and
.I max
.Ar max
the maximum field width.
If
.I min
.Ar min
begins with a zero, zeros will be added to make up the field width,
and if it begins with a `\-', the fragment will be left-adjusted
within the field.
.IP \fB\-p\fP\ min.max
Like \fB\-f\fP,
.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.
.IP \fB\-s\fP\ sepstring
.It Fl s Ar sepstring
Print
.I sepstring
.Ar sepstring
before printing line fragments from the next file.
This option may appear after the last file.
.IP \fB\-t\fP\ c
.It Fl t Ar c
The input line terminator is
.I c
.Ar c
instead of a newline.
The newline normally appended to each output line is omitted.
.PP
.El
.Pp
To print files simultaneously for easy viewing use
.IR pr (1).
.SH EXAMPLES
.de IC
.IP
.ss 36
.ft B
..
.de NC
.br
.ss 12
.PP
..
.PP
.Xr pr 1 .
.Sh EXAMPLES
The command
.IC
.Bd -literal
lam file1 file2 file3 file4
.NC
.Ed
joins 4 files together along each line.
To merge the lines from four different files use
.IC
.Bd -literal
lam file1 \-S "\\
.br
" file2 file3 file4
.NC
.Ed
Every 2 lines of a file may be joined on one line with
.IC
.Bd -literal
lam \- \- < file
.NC
.Ed
and a form letter with substitutions keyed by `@' can be done with
.IC
.Bd -literal
lam \-t @ letter changes
.NC
.SH SEE ALSO
join(1), pr(1), printf(3)
.Ed
.Sh SEE ALSO
.Xr join 1 ,
.Xr pr 1 ,
.Xr printf 3

View File

@ -32,13 +32,17 @@
*/
#ifndef lint
static char copyright[] =
static const char copyright[] =
"@(#) Copyright (c) 1993\n\
The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
#ifndef lint
#if 0
static char sccsid[] = "@(#)lam.c 8.1 (Berkeley) 6/6/93";
#endif
static const char rcsid[] =
"$Id$";
#endif /* not lint */
/*
@ -46,6 +50,7 @@ static char sccsid[] = "@(#)lam.c 8.1 (Berkeley) 6/6/93";
* Author: John Kunze, UCB
*/
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -67,10 +72,10 @@ int nofinalnl; /* normally append \n to each output line */
char line[BIGBUFSIZ];
char *linep;
void error __P((char *, char *));
char *gatherline __P((struct openfile *));
void getargs __P((char *[]));
char *pad __P((struct openfile *));
static void usage __P((void));
int
main(argc, argv)
@ -81,7 +86,7 @@ main(argc, argv)
getargs(argv);
if (!morefiles)
error("lam - laminate files", "");
usage();
for (;;) {
linep = line;
for (ip = input; ip->fp != NULL; ip++)
@ -113,8 +118,7 @@ getargs(av)
if (*p == '-')
ip->fp = stdin;
else if ((ip->fp = fopen(p, "r")) == NULL) {
perror(p);
exit(1);
err(1, p);
}
ip->pad = P;
if (!ip->sepstring)
@ -131,14 +135,14 @@ getargs(av)
if (*++p || (p = *++av))
ip->sepstring = p;
else
error("Need string after -%s", c);
errx(1, "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);
errx(1, "need character after -%s", c);
T = (*c == 'T' ? 1 : 0);
nofinalnl = 1;
break;
@ -150,15 +154,15 @@ getargs(av)
if (*++p || (p = *++av)) {
fmtp += strlen(fmtp) + 1;
if (fmtp > fmtbuf + BUFSIZ)
error("No more format space", "");
errx(1, "no more format space");
sprintf(fmtp, "%%%ss", p);
ip->format = fmtp;
}
else
error("Need string after -%s", c);
errx(1, "need string after -%s", c);
break;
default:
error("What do you mean by -%s?", c);
errx(1, "what do you mean by -%s?", c);
break;
}
}
@ -214,20 +218,11 @@ gatherline(ip)
return (lp);
}
void
error(msg, s)
char *msg, *s;
static void
usage()
{
fprintf(stderr, "lam: ");
fprintf(stderr, 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");
fprintf(stderr, "%s\n%s\n",
"usage: lam [ -f min.max ] [ -s sepstring ] [ -t c ] file ...",
" lam [ -p min.max ] [ -s sepstring ] [ -t c ] file ...");
exit(1);
}