Importing usr.bin/ul

No Minix-specific changes needed.

Change-Id: I7b8f970b8b2bbdeb5cf88ab5163d1a80c4279c4b
This commit is contained in:
Thomas Cort 2013-11-13 07:42:20 -05:00
parent f1b0deacf3
commit a501098bf5
6 changed files with 603 additions and 1 deletions

View file

@ -531,6 +531,7 @@
./usr/bin/ttn minix-sys
./usr/bin/tty minix-sys
./usr/bin/udpstat minix-sys
./usr/bin/ul minix-sys
./usr/bin/uname minix-sys
./usr/bin/uncompress minix-sys
./usr/bin/unexpand minix-sys
@ -2127,6 +2128,7 @@
./usr/man/man1/truncate.1 minix-sys
./usr/man/man1/tsort.1 minix-sys
./usr/man/man1/tty.1 minix-sys
./usr/man/man1/ul.1 minix-sys
./usr/man/man1/umask.1 minix-sys
./usr/man/man1/umount.1 minix-sys
./usr/man/man1/uname.1 minix-sys

View file

@ -232,6 +232,7 @@
2012/10/17 12:00:00,usr.bin/tr
2012/10/17 12:00:00,usr.bin/tsort
2012/10/17 12:00:00,usr.bin/tty
2012/10/17 12:00:00,usr.bin/ul
2012/10/17 12:00:00,usr.bin/unifdef
2010/10/06 07:59:18,usr.bin/uniq
2013/10/23 12:00:00,usr.bin/units

View file

@ -26,7 +26,7 @@ SUBDIR= asa \
sdiff sed seq shlock \
shuffle sort split stat su \
tee tic tput \
tr tsort tty unexpand unifdef \
tr tsort tty ul unexpand unifdef \
toproto \
uniq units unvis unzip users \
uuidgen vis \

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

@ -0,0 +1,8 @@
# $NetBSD: Makefile,v 1.6 2010/02/03 15:34:46 roy Exp $
# @(#)Makefile 8.1 (Berkeley) 6/6/93
PROG= ul
DPADD= ${LIBTERMINFO}
LDADD= -lterminfo
.include <bsd.prog.mk>

105
usr.bin/ul/ul.1 Normal file
View file

@ -0,0 +1,105 @@
.\" $NetBSD: ul.1,v 1.11 2012/04/21 12:27:30 roy Exp $
.\"
.\" Copyright (c) 1980, 1991, 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.
.\"
.\" @(#)ul.1 8.1 (Berkeley) 6/6/93
.\"
.Dd April 5, 2012
.Dt UL 1
.Os
.Sh NAME
.Nm ul
.Nd do underlining
.Sh SYNOPSIS
.Nm
.Op Fl i
.Op Fl t Ar terminal
.Op Ar name Ar ...
.Sh DESCRIPTION
.Nm
reads the named files (or standard input if none are given)
and translates occurrences of underscores to the sequence
which indicates underlining for the terminal in use, as specified
by the environment variable
.Ev TERM .
The file
.Pa /usr/share/misc/terminfo
is read to determine the appropriate sequences for underlining.
If the terminal is incapable of underlining, but is capable of
a standout mode then that is used instead.
If the terminal can overstrike,
or handles underlining automatically,
.Nm
degenerates to
.Xr cat 1 .
If the terminal cannot underline, underlining is ignored.
.Pp
The following options are available:
.Bl -tag -width Ds
.It Fl i
Underlining is indicated by a separate line containing appropriate
dashes `\-'; this is useful when you want to look at the underlining
which is present in an
.Xr nroff 1
output stream on a crt-terminal.
.It Fl t Ar terminal
Overrides the terminal type specified in the environment with
.Ar terminal .
.El
.Sh ENVIRONMENT
The following environment variable is used:
.Bl -tag -width TERM
.It Ev TERM
The
.Ev TERM
variable is used to relate a tty device
with its device capability description (see
.Xr terminfo 5 ) .
.Ev TERM
is set at login time, either by the default terminal type
specified in
.Pa /etc/ttys
or as set during the login process by the user in their
.Pa login
file (see for example
.Xr csh 1 Ns 's Ic setenv ) .
.El
.Sh SEE ALSO
.Xr colcrt 1 ,
.Xr man 1 ,
.Xr nroff 1
.Sh HISTORY
The
.Nm
command appeared in
.Bx 3.0 .
.Sh BUGS
.Xr nroff 1
usually outputs a series of backspaces and underlines intermixed
with the text to indicate underlining. No attempt is made to optimize
the backward motion.

486
usr.bin/ul/ul.c Normal file
View file

@ -0,0 +1,486 @@
/* $NetBSD: ul.c,v 1.16 2012/03/20 20:34:59 matt Exp $ */
/*
* Copyright (c) 1980, 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) 1980, 1993\
The Regents of the University of California. All rights reserved.");
#endif /* not lint */
#ifndef lint
#if 0
static char sccsid[] = "@(#)ul.c 8.1 (Berkeley) 6/6/93";
#endif
__RCSID("$NetBSD: ul.c,v 1.16 2012/03/20 20:34:59 matt Exp $");
#endif /* not lint */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <term.h>
#include <unistd.h>
#define IESC '\033'
#define SO '\016'
#define SI '\017'
#define HFWD '9'
#define HREV '8'
#define FREV '7'
#define MAXBUF 512
#define NORMAL 000
#define ALTSET 001 /* Reverse */
#define SUPERSC 002 /* Dim */
#define SUBSC 004 /* Dim | Ul */
#define UNDERL 010 /* Ul */
#define BOLD 020 /* Bold */
struct tinfo *info;
int must_overstrike;
const char *CURS_UP, *CURS_RIGHT, *CURS_LEFT,
*ENTER_STANDOUT, *EXIT_STANDOUT, *ENTER_UNDERLINE, *EXIT_UNDERLINE,
*ENTER_DIM, *ENTER_BOLD, *ENTER_REVERSE, *UNDER_CHAR, *EXIT_ATTRIBUTES;
struct CHAR {
char c_mode;
char c_char;
} ;
struct CHAR obuf[MAXBUF];
int col, maxcol;
int mode;
int halfpos;
int upln;
int iflag;
int main __P((int, char **));
void filter __P((FILE *));
void flushln __P((void));
void fwd __P((void));
void iattr __P((void));
void initbuf __P((void));
void initcap __P((void));
void outc __P((int));
int outchar __P((int));
void overstrike __P((void));
void reverse __P((void));
void setulmode __P((int));
#define PRINT(s) if (s == NULL) /* void */; else tputs(s, 1, outchar)
int
main(int argc, char **argv)
{
int c;
const char *termtype;
FILE *f;
termtype = getenv("TERM");
if (termtype == NULL || (argv[0][0] == 'c' && !isatty(1)))
termtype = "lpr";
while ((c=getopt(argc, argv, "it:T:")) != -1)
switch(c) {
case 't':
case 'T': /* for nroff compatibility */
termtype = optarg;
break;
case 'i':
iflag = 1;
break;
default:
fprintf(stderr,
"usage: %s [ -i ] [ -tTerm ] file...\n",
argv[0]);
exit(1);
}
setupterm(termtype, 0, NULL);
if ((over_strike && enter_bold_mode == NULL) ||
(transparent_underline && enter_underline_mode == NULL &&
underline_char == NULL))
initbuf();
if (optind == argc)
filter(stdin);
else for (; optind<argc; optind++) {
f = fopen(argv[optind],"r");
if (f == NULL) {
perror(argv[optind]);
exit(1);
}
filter(f);
fclose(f);
}
exit(0);
}
void
filter(FILE *f)
{
int c;
while ((c = getc(f)) != EOF) switch(c) {
case '\b':
if (col > 0)
col--;
continue;
case '\t':
col = (col+8) & ~07;
if (col > maxcol)
maxcol = col;
continue;
case '\r':
col = 0;
continue;
case SO:
mode |= ALTSET;
continue;
case SI:
mode &= ~ALTSET;
continue;
case IESC:
switch (c = getc(f)) {
case HREV:
if (halfpos == 0) {
mode |= SUPERSC;
halfpos--;
} else if (halfpos > 0) {
mode &= ~SUBSC;
halfpos--;
} else {
halfpos = 0;
reverse();
}
continue;
case HFWD:
if (halfpos == 0) {
mode |= SUBSC;
halfpos++;
} else if (halfpos < 0) {
mode &= ~SUPERSC;
halfpos++;
} else {
halfpos = 0;
fwd();
}
continue;
case FREV:
reverse();
continue;
default:
fprintf(stderr,
"Unknown escape sequence in input: %o, %o\n",
IESC, c);
exit(1);
}
continue;
case '_':
if (obuf[col].c_char)
obuf[col].c_mode |= UNDERL | mode;
else
obuf[col].c_char = '_';
case ' ':
col++;
if (col > maxcol)
maxcol = col;
continue;
case '\n':
flushln();
continue;
case '\f':
flushln();
putchar('\f');
continue;
default:
if (c < ' ') /* non printing */
continue;
if (obuf[col].c_char == '\0') {
obuf[col].c_char = c;
obuf[col].c_mode = mode;
} else if (obuf[col].c_char == '_') {
obuf[col].c_char = c;
obuf[col].c_mode |= UNDERL|mode;
} else if (obuf[col].c_char == c)
obuf[col].c_mode |= BOLD|mode;
else
obuf[col].c_mode = mode;
col++;
if (col > maxcol)
maxcol = col;
continue;
}
if (maxcol)
flushln();
}
void
flushln(void)
{
int lastmode;
int i;
int hadmodes = 0;
lastmode = NORMAL;
for (i=0; i<maxcol; i++) {
if (obuf[i].c_mode != lastmode) {
hadmodes++;
setulmode(obuf[i].c_mode);
lastmode = obuf[i].c_mode;
}
if (obuf[i].c_char == '\0') {
if (upln) {
PRINT(cursor_right);
}
else {
outc(' ');
}
} else
outc(obuf[i].c_char);
}
if (lastmode != NORMAL) {
setulmode(0);
}
if (must_overstrike && hadmodes)
overstrike();
putchar('\n');
if (iflag && hadmodes)
iattr();
(void)fflush(stdout);
if (upln)
upln--;
initbuf();
}
/*
* For terminals that can overstrike, overstrike underlines and bolds.
* We don't do anything with halfline ups and downs, or Greek.
*/
void
overstrike(void)
{
int i;
char lbuf[256];
char *cp = lbuf;
int hadbold=0;
/* Set up overstrike buffer */
for (i=0; i<maxcol; i++)
switch (obuf[i].c_mode) {
case NORMAL:
default:
*cp++ = ' ';
break;
case UNDERL:
*cp++ = '_';
break;
case BOLD:
*cp++ = obuf[i].c_char;
hadbold=1;
break;
}
putchar('\r');
for (*cp=' '; *cp==' '; cp--)
*cp = 0;
for (cp=lbuf; *cp; cp++)
putchar(*cp);
if (hadbold) {
putchar('\r');
for (cp=lbuf; *cp; cp++)
putchar(*cp=='_' ? ' ' : *cp);
putchar('\r');
for (cp=lbuf; *cp; cp++)
putchar(*cp=='_' ? ' ' : *cp);
}
}
void
iattr(void)
{
int i;
char lbuf[256];
char *cp = lbuf;
for (i=0; i<maxcol; i++)
switch (obuf[i].c_mode) {
case NORMAL: *cp++ = ' '; break;
case ALTSET: *cp++ = 'g'; break;
case SUPERSC: *cp++ = '^'; break;
case SUBSC: *cp++ = 'v'; break;
case UNDERL: *cp++ = '_'; break;
case BOLD: *cp++ = '!'; break;
default: *cp++ = 'X'; break;
}
for (*cp=' '; *cp==' '; cp--)
*cp = 0;
for (cp=lbuf; *cp; cp++)
putchar(*cp);
putchar('\n');
}
void
initbuf(void)
{
memset((char *)obuf, 0, sizeof (obuf)); /* depends on NORMAL == 0 */
col = 0;
maxcol = 0;
mode &= ALTSET;
}
void
fwd(void)
{
int oldcol, oldmax;
oldcol = col;
oldmax = maxcol;
flushln();
col = oldcol;
maxcol = oldmax;
}
void
reverse(void)
{
upln++;
fwd();
PRINT(cursor_up);
PRINT(cursor_up);
upln++;
}
int
outchar(int c)
{
return (putchar(c & 0177));
}
static int curmode = 0;
void
outc(int c)
{
putchar(c);
if (underline_char && !enter_underline_mode && (curmode & UNDERL)) {
if (cursor_left)
PRINT(cursor_left);
else
putchar('\b');
PRINT(underline_char);
}
}
void
setulmode(int newmode)
{
if (!iflag) {
if (curmode != NORMAL && newmode != NORMAL)
setulmode(NORMAL);
switch (newmode) {
case NORMAL:
switch(curmode) {
case NORMAL:
break;
case UNDERL:
if (enter_underline_mode)
PRINT(exit_underline_mode);
else
PRINT(exit_standout_mode);
break;
default:
/* This includes standout */
if (exit_attribute_mode)
PRINT(exit_attribute_mode);
else
PRINT(exit_standout_mode);
break;
}
break;
case ALTSET:
if (enter_reverse_mode)
PRINT(enter_reverse_mode);
else
PRINT(enter_standout_mode);
break;
case SUPERSC:
/*
* This only works on a few terminals.
* It should be fixed.
*/
PRINT(enter_underline_mode);
PRINT(enter_dim_mode);
break;
case SUBSC:
if (enter_dim_mode)
PRINT(enter_dim_mode);
else
PRINT(enter_standout_mode);
break;
case UNDERL:
if (enter_underline_mode)
PRINT(enter_underline_mode);
else
PRINT(enter_standout_mode);
break;
case BOLD:
if (enter_bold_mode)
PRINT(enter_bold_mode);
else
PRINT(enter_reverse_mode);
break;
default:
/*
* We should have some provision here for multiple modes
* on at once. This will have to come later.
*/
PRINT(enter_standout_mode);
break;
}
}
curmode = newmode;
}