[net.micro.atari16] KKiillll those double characters!

mdoerr@uklirb.UUCP (10/21/86)

# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar:	Shell Archiver
# Run the following text with /bin/sh to create:
#	RMBS.DOC
#	RMBS.C
#
# This archive created:  Oct 21, 1986 -- 12:39:52
# By:	a friendly ATARI ST hacker  (using that wonderful machine :-)
#
echo shar: extracting RMBS.DOC
sed 's/^XX//' << \SHAR_EOF > RMBS.DOC
XXKKiillll those double characters!
XX
XXI finally got tired of the horrible sounds my C.Itoh 8510A printer is doing,
XXwhen printing proff'ed documents in incremental print mode. To cure the
XXproblem, I've written a simple filter to convert overstrike sequences to
XXthe corresponding printer control codes. As there have been some requests
XXfor such a utility, I'm posting the program to the net.
XX
XXThis is a true filter, i.e. reading from stdin and writing to stdout. Watch
XXout for the problems, that Megamax-C is having with I/O-Redirection. The
XXTTP-Application runs fine from the DESKTOP and any COMMAND shell, that
XXdoesn't do redirection of its own. I ran into problems with the COMMAND.PRG,
XXthat comes with the developers kit and the Michtron shell. I suspect problems
XXwith the Beckmeyer shell, too. The filter works nicely with the COMMAND.TOS,
XXthat has been posted by franco@iuvax (thanx a lot!) many months ago.
XXBTW: Lattice-C is also doing I/O-Redirection of its own. Expect similiar 
XXproblems as with Megamax-C.
XX
XXThe filter does a little more than is absolutely necessary. I suppose it can
XXhandle nroff output, too. But this hasn't been tested, yet.
XX
XXSend     v v v
XX       /-------\
XX     O-|  bug  |    reports to   ...!seismo!unido!uklirb!mdoerr
XX       \-------/
XX         ^ ^ ^
XX
SHAR_EOF
if test 1279 -ne "`wc -c RMBS.DOC`"
then
echo shar: error transmitting RMBS.DOC '(should have been 1279 characters)'
fi
echo shar: extracting RMBS.C
sed 's/^XX//' << \SHAR_EOF > RMBS.C
XX/*	rmbs.c	(V.1.0)
XX *
XX *	Rmbs converts the output of text formatters like proff or nroff
XX *	(not tested) into a form that is less harmful to the mechanics
XX *	of a modern matrix printer. These formatters highlight text by a
XX *	technique called overstriking. Rmbs tries to detect the character
XX *	sequences that are output for bold, bold and underlined and 
XX *	underlined text and converts them to the corresponding control
XX *	codes of the printer.
XX *
XX *	Proff outputs the following sequences:
XX *	Bold:			'char' '\b' 'char'
XX *	Underlined:		'_' '\b' 'char'
XX *	Bold & Underlined:	'_' '\b' '_' '\b' 'char' '\b' 'char'
XX *	This implies an ambiguity that cannot be easily resolved: What
XX *	does '_' '\b' '_' stand for? Is it a bold or an underlined '_'?
XX *	For ease of coding I've decided, that it's a bold '_'.
XX *
XX *	Because the printer control codes are hardwired into the program, 
XX *	you must build a different version of the program for every printer
XX *	you have. As most people (including me) have only one printer, I
XX *	didn't want to bother with a suitable data base of printer codes.
XX *
XX *	Although there's a high probability, that there's no true original
XX *	idea in this program, you should give me credit, if you debug,
XX *	modify, enhance, or give it away. Lightning shall strike your
XX *	computer(s), if you sell this program or any close derivatives
XX *	for profit.
XX *
XX *	Michael Doerr	(uucp: ...!seismo!unido!uklirb!mdoerr)
XX *	University of Kaiserslautern (West Germany)
XX */
XX
XX/* This is the only printer specific part of the program. Change the
XX * control codes according to your printer manual.
XX * These codes are for the C.Itoh 8510A:
XX */
XX#define	BOLD_ON		"\033!"
XX#define	BOLD_OFF	"\033\""
XX#define	ULIN_ON		"\033X"
XX#define	ULIN_OFF	"\033Y"
XX
XX
XX#include <stdio.h>
XX
XX/* character attributes */
XX#define	NONE		0
XX#define	BOLD		1
XX#define	ULIN		2
XX
XXtypedef	int	WORD;
XXtypedef	char	BYTE;
XXtypedef	union	{
XX    WORD	w;
XX    struct	{
XX	BYTE    ch;
XX	BYTE    attrib;
XX    } s;
XX} elem;
XX
XX#define	line_len	300
XXelem	line[line_len];
XX
XXmain(argc, argv)
XXint	argc;
XXchar	**argv;
XX{
XX    int     i, high;
XX    BYTE    ch;
XX
XX    for (i = 0; i < line_len;)
XX	line[i++].w = 0;
XX    i = high = 0;
XX
XX    while ((ch = getchar) != EOF)
XX    {
XX	if (ch == '\n')
XX	{
XX	    print_line(high);
XX	    i = high = 0;
XX	    continue;
XX	}
XX	else if (ch == '\b')
XX	    i--;
XX	else if (line[i].s.ch == '\0')
XX	    line[i++].s.ch = ch;
XX	else if (line[i].s.ch == ch)
XX	    line[i++].s.attrib |= BOLD;
XX	else if (line[i].s.ch == '_')
XX	{
XX	    line[i].s.ch = ch;
XX	    line[i++].s.attrib |= ULIN;
XX	}
XX	else if (ch == '_')
XX	    line[i++].s.attrib |= ULIN;
XX	if (i < 0)
XX	    i = 0;
XX	else if (high < i)
XX	    high = i;
XX	if (i == line_len)
XX	    i = line_len-1;
XX    } /* while */
XX    if (high > 0)
XX	print_line(high);
XX} /* main */
XX
XXprint_line(high)
XXint	high;
XX{
XX    int     i;
XX    BYTE    new, old = NONE;
XX
XX    for (i = 0; i < high;)
XX    {
XX	if (old != (new = line[i].s.attrib))
XX	{
XX	    change_state(old, new);
XX	    old = new;
XX	}
XX	putchar(line[i].s.ch);
XX	line[i++].w = 0;
XX    }
XX    if (old != NONE)
XX	change_state(old, NONE);
XX    putchar('\n');
XX} /* print_line */
XX
XX#define	putstr(str)	char *s = str; s--; while(*++s) putchar(*s)
XX
XXchange_state(old, new)
XXBYTE	old, new;
XX{
XX    if ((old ^ new) & BOLD)
XX    {
XX	if (new & BOLD)
XX	{   putstr(BOLD_ON);	}
XX	else
XX	{   putstr(BOLD_OFF);	}
XX    }
XX    if ((old ^ new) & ULIN)
XX    {
XX	if (new & ULIN)
XX	{   putstr(ULIN_ON);	}
XX	else
XX	{   putstr(ULIN_OFF);	}
XX    }
XX}
XX
SHAR_EOF
if test 3413 -ne "`wc -c RMBS.C`"
then
echo shar: error transmitting RMBS.C '(should have been 3413 characters)'
fi
# End of shell archive
exit 0