]> Zhao Yanbai Git Server - minix.git/commitdiff
Importing usr.bin/lam 93/1093/1
authorThomas Cort <tcort@minix3.org>
Wed, 30 Oct 2013 16:09:54 +0000 (12:09 -0400)
committerThomas Cort <tcort@minix3.org>
Wed, 30 Oct 2013 16:09:54 +0000 (12:09 -0400)
No Minix-specific changes needed.

Change-Id: Ib3b0f922be8e170153660d308b541036507c0251

distrib/sets/lists/minix/mi
releasetools/nbsd_ports
usr.bin/Makefile
usr.bin/lam/Makefile [new file with mode: 0644]
usr.bin/lam/lam.1 [new file with mode: 0644]
usr.bin/lam/lam.c [new file with mode: 0644]

index 09b4739a1de2fee7734bc8a814f2477fa8e2574b..fafc3ddfce52358f0dc40ccd15c0b05242964b15 100644 (file)
 ./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
 ./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
index 8befb3655d887406e0453571b60d5cb1f5710b0d..0e53993b26ed665e5c935c87e0d828073c189011 100644 (file)
 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
index 8dc1f051a2f00390f7f5a69ebf2d2b4803747594..094e696a26d167db49e573c9649a70821fadc807 100644 (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 \
diff --git a/usr.bin/lam/Makefile b/usr.bin/lam/Makefile
new file mode 100644 (file)
index 0000000..88e77b2
--- /dev/null
@@ -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>
diff --git a/usr.bin/lam/lam.1 b/usr.bin/lam/lam.1
new file mode 100644 (file)
index 0000000..6a67cce
--- /dev/null
@@ -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
diff --git a/usr.bin/lam/lam.c b/usr.bin/lam/lam.c
new file mode 100644 (file)
index 0000000..662eefe
--- /dev/null
@@ -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);
+}