v03i044: backspace filter
chad at anasaz.UUCP
chad at anasaz.UUCP
Wed Jun 8 16:35:22 AEST 1988
comp.sources.misc: Volume 3, Issue 44
Submitted-By: "A. Nonymous" <chad at anasaz.UUCP>
Archive-Name: nobs
[Why not "col -b"? ++bsa]
This is a filter that has probably been written a thousand times, but
here is another version. It is used to clean up nroff output
generated for the default TTY37 terminal for printing on a printer
that cannot backspace (or one that beats itself silly when it does):
nroff -man foo.1 | nobs > foo.man
It has been tested on SysVr2, but should work anywhere.
----(cut)--------(cut)--------(cut)--------(cut)--------(cut)----
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of shell archive."
# Contents: Makefile nobs.c
# Wrapped by chad at anasaz on Tue Jun 7 20:13:35 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(238 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
X# %M% for nobs
X
XBINDIR = /usr/local/bin
XTARGET = nobs
X
X$(TARGET): nobs.c
X $(CC) $(CFLAGS) -o $(TARGET) nobs.c
X
Xinstall: nobs
X strip nobs
X @-rm $(BINDIR)/$(TARGET)
X ln $(TARGET) $(BINDIR)
X touch install
X
XLint: nobs.c
X lint -p nobs.c >Lint
END_OF_FILE
if test 238 -ne `wc -c <'Makefile'`; then
echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'nobs.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'nobs.c'\"
else
echo shar: Extracting \"'nobs.c'\" \(2474 characters\)
sed "s/^X//" >'nobs.c' <<'END_OF_FILE'
X/* nobs.c - Simple backspace filter - 1.1 */
X
X/*
X** This program will take lines containing overstrike pragmas of
X** the form <char><bs><char> and convert them to individual lines of
X** output with a return but no line feed between them.
X** Useful in filtering nroff output to line printers that cannot
X** back space (or on which back spaces are expensive).
X*/
X
X/*
X** Author:
X** Chad R. Larson This program is placed in the
X** DCF, Inc. Public Domain. You may do with
X** 14623 North 49th Place it as you please.
X** Scottsdale, AZ 85254
X*/
X
X#include <stdio.h>
X
X#define LINESIZE 512 /* maximum line length */
X#define MAXOVER 8 /* maximum number of overstrikes */
X
X/* forward references */
Xvoid exit();
Xchar *memset();
X
Xstatic char input[LINESIZE]; /* input line buffer */
Xstatic char output[MAXOVER][LINESIZE]; /* output line buffers */
X
Xvoid main()
X{
X int line; /* output buffer array index */
X int in_dex; /* offset into input buffer */
X int out_dex; /* offset into output buffer */
X int line_count; /* number of output lines */
X int strip; /* trailing space strip index */
X char chr; /* single character storage */
X
X /* loop through the input lines */
X while ( fgets(input, LINESIZE, stdin) != (char *)NULL ) {
X
X /* init output buffers to blanks */
X memset( output, ' ', sizeof(output) );
X
X /* slide through input line, dropping bs chars */
X out_dex = -1; /* reset array pointers */
X in_dex = 0;
X line = 0;
X line_count = 0;
X
X while ( ( chr = input[in_dex++] ) && chr != '\n' ) {
X if (chr != '\b') {
X line = 0; /* back to main line */
X output[line][++out_dex] = chr; /* stuff the character */
X } else { /* got backspace */
X ++line; /* select output buffer */
X if (line == MAXOVER) {
X fprintf(stderr, "Too many overstrikes!\n");
X exit(1);
X }
X output[line][out_dex] = input[in_dex++];
X line_count = (line_count < line) ? line : line_count;
X }
X } /* end of input line */
X
X /* print the output buffers */
X for (line = 0; line <= line_count; line++) {
X strip = out_dex;
X while (output[line][strip] == ' ') /* strip trailing spaces */
X --strip;
X ++strip; /* point past string end */
X if (line < line_count) /* new line or return? */
X output[line][strip] = '\r';
X else
X output[line][strip] = '\n';
X output[line][++strip] = '\0'; /* terminate string */
X fputs (output[line], stdout); /* print it */
X }
X
X } /* end of file */
X exit(0);
X
X} /* end of main */
END_OF_FILE
if test 2474 -ne `wc -c <'nobs.c'`; then
echo shar: \"'nobs.c'\" unpacked with wrong size!
fi
# end of 'nobs.c'
fi
echo shar: End of shell archive.
exit 0
More information about the Comp.sources.misc
mailing list