From 9742ba2568acfe43f8504607d0d92faf0ed0d7db Mon Sep 17 00:00:00 2001 From: Thomas Cort Date: Tue, 12 Nov 2013 14:11:32 -0500 Subject: [PATCH] Importing usr.bin/fpr No Minix-specific changes needed. Change-Id: I2169284c68309de78d89d9f3c678f340ff066c7e --- distrib/sets/lists/minix/mi | 2 + releasetools/nbsd_ports | 1 + usr.bin/Makefile | 2 +- usr.bin/fpr/Makefile | 6 + usr.bin/fpr/fpr.1 | 83 ++++++++ usr.bin/fpr/fpr.c | 378 ++++++++++++++++++++++++++++++++++++ 6 files changed, 471 insertions(+), 1 deletion(-) create mode 100644 usr.bin/fpr/Makefile create mode 100644 usr.bin/fpr/fpr.1 create mode 100644 usr.bin/fpr/fpr.c diff --git a/distrib/sets/lists/minix/mi b/distrib/sets/lists/minix/mi index 883401ccb..9e2ccc3a5 100644 --- a/distrib/sets/lists/minix/mi +++ b/distrib/sets/lists/minix/mi @@ -321,6 +321,7 @@ ./usr/bin/fold minix-sys ./usr/bin/format minix-sys ./usr/bin/fortune minix-sys +./usr/bin/fpr minix-sys ./usr/bin/from minix-sys ./usr/bin/fsplit minix-sys ./usr/bin/fstat minix-sys @@ -1920,6 +1921,7 @@ ./usr/man/man1/for.1 minix-sys ./usr/man/man1/format.1 minix-sys ./usr/man/man1/fortune.1 minix-sys +./usr/man/man1/fpr.1 minix-sys ./usr/man/man1/from.1 minix-sys ./usr/man/man1/fsck.mfs.1 minix-sys ./usr/man/man1/fsplit.1 minix-sys diff --git a/releasetools/nbsd_ports b/releasetools/nbsd_ports index ca05b4b6e..0a82f3e4c 100644 --- a/releasetools/nbsd_ports +++ b/releasetools/nbsd_ports @@ -168,6 +168,7 @@ 2013/10/17 12:00:00,usr.bin/env 2013/05/31 12:00:00,usr.bin/finger 2012/10/17 12:00:00,usr.bin/fold +2012/10/17 12:00:00,usr.bin/fpr 2013/03/22 12:00:00,usr.bin/from 2012/10/17 12:00:00,usr.bin/fsplit 2013/04/05 12:00:00,usr.bin/ftp diff --git a/usr.bin/Makefile b/usr.bin/Makefile index 04c9916df..07f6dc2ac 100644 --- a/usr.bin/Makefile +++ b/usr.bin/Makefile @@ -10,7 +10,7 @@ SUBDIR= asa \ column comm csplit ctags cut \ dirname du \ env expand \ - finger fold from \ + finger fold fpr from \ fsplit ftp genassym getopt \ head hexdump id indent infocmp join jot \ lam ldd leave \ diff --git a/usr.bin/fpr/Makefile b/usr.bin/fpr/Makefile new file mode 100644 index 000000000..6bef8922f --- /dev/null +++ b/usr.bin/fpr/Makefile @@ -0,0 +1,6 @@ +# @(#)Makefile 8.1 (Berkeley) 6/6/93 +# $NetBSD: Makefile,v 1.3 1995/09/01 01:34:13 jtc Exp $ + +PROG= fpr + +.include diff --git a/usr.bin/fpr/fpr.1 b/usr.bin/fpr/fpr.1 new file mode 100644 index 000000000..a24cf1496 --- /dev/null +++ b/usr.bin/fpr/fpr.1 @@ -0,0 +1,83 @@ +.\" $NetBSD: fpr.1,v 1.12 2012/03/22 07:58:18 wiz Exp $ +.\" +.\" Copyright (c) 1989, 1990, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" This code is derived from software contributed to Berkeley by +.\" Robert Corbett. +.\" 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. +.\" +.\" @(#)fpr.1 8.1 (Berkeley) 6/6/93 +.\" +.Dd June 6, 1993 +.Dt FPR 1 +.Os +.Sh NAME +.Nm fpr +.Nd print Fortran file +.Sh SYNOPSIS +.Nm +.Sh DESCRIPTION +.Nm +is a filter that transforms files formatted according to +Fortran's carriage control conventions into files formatted +according to +.Ux +line printer conventions. +.Pp +.Nm +copies its input onto its output, replacing the carriage +control characters with characters that will produce the intended +effects when printed using +.Xr lpr 1 . +The first character of each line determines the vertical spacing as follows: +.Bd -ragged -offset indent -compact +.Bl -column Blank "To first line of next page" +.It Blank One line +.It 0 Two lines +.It 1 To first line of next page +.It + \&No advance +.El +.Ed +.Pp +A blank line is treated as if its first character is a blank. +A blank that appears as a carriage control character is deleted. +A zero is changed to a newline. +A one is changed to a form feed. +The effects of a +.Sq + +are simulated using backspaces. +.Sh EXAMPLES +.Dl a.out \&| fpr \&| lpr +.Pp +.Dl fpr \*[Lt] f77.output \&| lpr +.Sh HISTORY +The +.Nm +command +appeared in +.Bx 4.2 . +.Sh BUGS +Results are undefined for input lines longer than 170 characters. diff --git a/usr.bin/fpr/fpr.c b/usr.bin/fpr/fpr.c new file mode 100644 index 000000000..ed7081153 --- /dev/null +++ b/usr.bin/fpr/fpr.c @@ -0,0 +1,378 @@ +/* $NetBSD: fpr.c,v 1.9 2011/09/04 20:26:17 joerg Exp $ */ + +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Robert Corbett. + * + * 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 +#ifndef lint +__COPYRIGHT("@(#) Copyright (c) 1989, 1993\ + The Regents of the University of California. All rights reserved."); +#endif /* not lint */ + +#ifndef lint +#if 0 +static char sccsid[] = "@(#)fpr.c 8.1 (Berkeley) 6/6/93"; +#endif +__RCSID("$NetBSD: fpr.c,v 1.9 2011/09/04 20:26:17 joerg Exp $"); +#endif /* not lint */ + +#include +#include +#include + +#define BLANK ' ' +#define TAB '\t' +#define NUL '\000' +#define FF '\f' +#define BS '\b' +#define CR '\r' +#define VTAB '\013' +#define EOL '\n' + +#define TRUE 1 +#define FALSE 0 + +#define MAXCOL 170 +#define TABSIZE 8 +#define INITWIDTH 8 + +typedef +struct column { + int count; + int width; + char *str; +} + COLUMN; + +static char cc; +static char saved; +static int length; +static char *text; +static int highcol; +static COLUMN *line; +static int maxpos; +static int maxcol; + +static void flush(void); +static void get_text(void); +static void init(void); +__dead static void nospace(void); +static void savech(int); + +int +main(int argc, char **argv) +{ + int ch; + char ateof; + int i; + int errorcount; + + init(); + errorcount = 0; + ateof = FALSE; + + switch (ch = getchar()) { + case EOF: + exit(0); + case EOL: + cc = NUL; + ungetc((int) EOL, stdin); + break; + case BLANK: + cc = NUL; + break; + case '1': + cc = FF; + break; + case '0': + cc = EOL; + break; + case '+': + cc = CR; + break; + default: + errorcount = 1; + cc = NUL; + ungetc(ch, stdin); + break; + } + + while (!ateof) { + get_text(); + switch (ch = getchar()) { + case EOF: + flush(); + ateof = TRUE; + break; + case EOL: + flush(); + cc = NUL; + ungetc((int) EOL, stdin); + break; + case BLANK: + flush(); + cc = NUL; + break; + case '1': + flush(); + cc = FF; + break; + case '0': + flush(); + cc = EOL; + break; + case '+': + for (i = 0; i < length; i++) + savech(i); + break; + default: + errorcount++; + flush(); + cc = NUL; + ungetc(ch, stdin); + break; + } + } + + if (errorcount) + fprintf(stderr, "Illegal carriage control - %d line%s.\n", + errorcount, errorcount == 1 ? "" : "s"); + + exit(0); +} + +static void +init(void) +{ + COLUMN *cp; + COLUMN *cend; + char *sp; + + length = 0; + maxpos = MAXCOL; + sp = malloc((unsigned) maxpos); + if (sp == NULL) + nospace(); + text = sp; + + highcol = -1; + maxcol = MAXCOL; + line = calloc(maxcol, sizeof(COLUMN)); + if (line == NULL) + nospace(); + cp = line; + cend = line + (maxcol - 1); + while (cp <= cend) { + cp->width = INITWIDTH; + sp = calloc(INITWIDTH, sizeof(char)); + if (sp == NULL) + nospace(); + cp->str = sp; + cp++; + } +} + +static void +get_text(void) +{ + int i; + char ateol; + int ch; + int pos; + char *n; + + i = 0; + ateol = FALSE; + + while (!ateol) { + switch (ch = getchar()) { + case EOL: + case EOF: + ateol = TRUE; + break; + case TAB: + pos = (1 + i / TABSIZE) * TABSIZE; + if (pos > maxpos) { + n = realloc(text, (unsigned)(pos + 10)); + if (n == NULL) + nospace(); + text = n; + maxpos = pos + 10; + } + while (i < pos) { + text[i] = BLANK; + i++; + } + break; + case BS: + if (i > 0) { + i--; + savech(i); + } + break; + case CR: + while (i > 0) { + i--; + savech(i); + } + break; + case FF: + case VTAB: + flush(); + cc = ch; + i = 0; + break; + default: + if (i >= maxpos) { + n = realloc(text, (unsigned)(i + 10)); + if (n == NULL) + nospace(); + maxpos = i + 10; + } + text[i] = ch; + i++; + break; + } + } + + length = i; +} + +static void +savech(int col) +{ + char ch; + int oldmax; + COLUMN *cp; + COLUMN *cend; + char *sp; + int newcount; + COLUMN *newline; + + ch = text[col]; + if (ch == BLANK) + return; + + saved = TRUE; + + if (col >= highcol) + highcol = col; + + if (col >= maxcol) { + newline = realloc(line, (unsigned) (col + 10) * sizeof(COLUMN)); + if (newline == NULL) + nospace(); + line = newline; + oldmax = maxcol; + maxcol = col + 10; + cp = line + oldmax; + cend = line + (maxcol - 1); + while (cp <= cend) { + cp->width = INITWIDTH; + cp->count = 0; + sp = calloc(INITWIDTH, sizeof(char)); + if (sp == NULL) + nospace(); + cp->str = sp; + cp++; + } + } + cp = line + col; + newcount = cp->count + 1; + if (newcount > cp->width) { + cp->width = newcount; + sp = realloc(cp->str, (unsigned) newcount * sizeof(char)); + if (sp == NULL) + nospace(); + cp->str = sp; + } + cp->count = newcount; + cp->str[newcount - 1] = ch; +} + +static void +flush(void) +{ + int i; + int anchor; + int height; + int j; + + if (cc != NUL) + putchar(cc); + + if (!saved) { + i = length; + while (i > 0 && text[i - 1] == BLANK) + i--; + length = i; + for (i = 0; i < length; i++) + putchar(text[i]); + putchar(EOL); + return; + } + for (i = 0; i < length; i++) + savech(i); + + anchor = 0; + while (anchor <= highcol) { + height = line[anchor].count; + if (height == 0) { + putchar(BLANK); + anchor++; + } else if (height == 1) { + putchar(*(line[anchor].str)); + line[anchor].count = 0; + anchor++; + } else { + i = anchor; + while (i < highcol && line[i + 1].count > 1) + i++; + for (j = anchor; j <= i; j++) { + height = line[j].count - 1; + putchar(line[j].str[height]); + line[j].count = height; + } + for (j = anchor; j <= i; j++) + putchar(BS); + } + } + + putchar(EOL); + highcol = -1; +} + +static void +nospace(void) +{ + errx(1, "Storage limit exceeded."); +}