[comp.text] 8-bit nroff fixes

jack@cadre.dsl.PITTSBURGH.EDU (Jack Nelson) (08/02/87)

Here is a diff -c of n10.c of nroff code (from BSD 2.9, but almost
the same as BSD 4.3) which allows access to printer fonts above 0200;
this is nice if you want to use math or foreign language capabilities
of a laserjet, for example, but keep the speed and simplicity of nroff.
  All nroff terminal tables will still work.  What this code does is
extend the use of character constant \200 in the code.term table
to act as an escape, telling nroff that the next character should
be output as a high-ascii code, not used as a plot motion command.
The \200 can be used anywhere in the output string of the description
to quote the next character, as well as in its usual place at the
second character to start plot mode for other reasons.
  For the HP laserjet, series II, plot mode should be defined
as HMI zero and VMI zero, I think.  Then each movement is governed
by the description string, i.e. it overprints unless you move the
cursor.
  Here are the diffs, and a slightly tested table for laserjet
based mostly on xerox model and data from Eric Allman's paper
posted to the net last year.
UUCP: { akgua | allegra | cmcl2 | idis | ihnp4 | mi-cec | pitt |
	psuvax1 | sun | sunrise | vax135 } ! cadre ! nelslab ! jack
ARPA: jack@cadre.dsl.pittsburgh.edu
John P. Nelson, M.D., 3811 O'Hara St, Pittsburgh, PA 15213, t:412-624-1769
Dept. of Psychiatry, U. of Pittsburgh

#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
#	n10.diffc
#	tabhplj.c
#	code.hplj
# This archive created: Fri Jul 17 15:00:13 1987
export PATH; PATH=/bin:/usr/bin:$PATH
if test -f 'n10.diffc'
then
	echo shar: "will not over-write existing file 'n10.diffc'"
else
cat << \SHAR_EOF > 'n10.diffc'
*** n10.c.org	Fri Jul 10 17:29:16 1981
--- n10.c	Thu Jul 16 16:14:30 1987
***************
*** 167,172
  {
  	register int i;
  	register char *j, *k;
  
  	if(!plotmode)oputs(t.ploton);
  	k = x;

--- 167,175 -----
  {
  	register int i;
  	register char *j, *k;
+ 	int bit8flg;
+ #	define	TRUE	(1)
+ #	define	FALSE	(0)
  
  	if(!plotmode)oputs(t.ploton);
  	k = x;
***************
*** 170,176
  
  	if(!plotmode)oputs(t.ploton);
  	k = x;
! 	if((*k & 0377) == 0200)k++;
  	for(; *k; k++){
  		if(*k & 0200){
  			if(*k & 0100){

--- 173,182 -----
  
  	if(!plotmode)oputs(t.ploton);
  	k = x;
! 	if((*k & 0377) == 0200){
! 		k++;
! 		bit8flg = TRUE;
! 	} else bit8flg = FALSE;
  	for(; *k; k++){
  		if((*k & 0377) == 0200){
  			bit8flg = TRUE;
***************
*** 172,178
  	k = x;
  	if((*k & 0377) == 0200)k++;
  	for(; *k; k++){
! 		if(*k & 0200){
  			if(*k & 0100){
  				if(*k & 040)j = t.up; else j = t.down;
  			}else{

--- 178,188 -----
  		bit8flg = TRUE;
  	} else bit8flg = FALSE;
  	for(; *k; k++){
! 		if((*k & 0377) == 0200){
! 			bit8flg = TRUE;
! 			continue;
! 		}
! 		if((*k & 0200) && (bit8flg == FALSE)){
  			if(*k & 0100){
  				if(*k & 040)j = t.up; else j = t.down;
  			}else{
***************
*** 180,186
  			}
  			if(!(i = *k & 037))return(++k);
  			while(i--)oputs(j);
! 		}else oput(*k);
  	}
  	return(k);
  }

--- 190,199 -----
  			}
  			if(!(i = *k & 037))return(++k);
  			while(i--)oputs(j);
! 		}else{
! 			oput(*k);
! 			bit8flg = FALSE;
! 		}
  	}
  	return(k);
  }
SHAR_EOF
chmod +x 'n10.diffc'
fi
if test -f 'tabhplj.c'
then
	echo shar: "will not over-write existing file 'tabhplj.c'"
else
cat << \SHAR_EOF > 'tabhplj.c'
/*	tabhplj.c	4.1	83/08/05	*/
#define INCH 240
/*
 * Hewlett Packard laser-jet series II
 * nroff driving table
 * by J. P. Nelson 7-9-87
 * Because the c:itoh will backspace only in incremental mode,
 * need to write a program to place commands Esc[ and Esc] around ^H.
 * If you want true underline mode instead of _^Hx_^Hy, etc.,
 * have the script first replace _^Hx with EscXxEscY, etc.
 * Further refinements are possible to clean up files and
 * minimize throughput (e.g., delete all EscYEscX pairs).
 * In the terminal initialization (twinit) and exit (twrest)
 * strings, EscN sets 10-pitch. Twrest clears by commanding
 * Esc Y, Esc", and Esc$ to clear ul, bold, and "greek",
 * Esc] to restore logic-seek print, Escf and EscT24 to restore
 * forward linefeed at 6 lines/inch, Esc< for bidirectional
 * print, EscN, and ^M (\015) to clear the print buffer.
 * Since the itoh has no keyboard, you have to run it through
 * a video terminal or micro printer port.
 * The first twinit code (Esc`) and the last twrest code
 * (Esca) set the (proper) "transparent" or "buffered" print
 * mode for tvi950 and tvi925 and Freedom 100. This mode
 * is necessary on intelligent terminals to keep all the Esc
 * codes in the driver tables from scrambling the terminal's
 * brains.  (If you have a dumb terminal, almost any print
 * mode should be safe. Smart terminals without buffered print,
 * such as the tvi920, present problems.)
 * If you have a different terminal,
 * the shell script should also replace these codes with those
 * appropriate for your machine.  If you are using an sed
 * stream for the script, make sure to use single quotes to
 * isolate the ` from the shell.
 */
struct {
	int bset;
	int breset;
	int Hor;
	int Vert;
	int Newline;
	int Char;
	int Em;
	int Halfline;
	int Adj;
	char *twinit;
	char *twrest;
	char *twnl;
	char *hlr;
	char *hlf;
	char *flr;
	char *bdon;
	char *bdoff;
	char *ploton;
	char *plotoff;
	char *up;
	char *down;
	char *right;
	char *left;
	char *codetab[256-32];
	int zzz;
	} t = {
/*bset*/	0,
/*breset*/	0177420,
/*Hor*/		INCH/60,
/*Vert*/	INCH/48,
/*Newline*/	INCH/6,
/*Char*/	INCH/10,
/*Em*/		INCH/10,
/*Halfline*/	INCH/12,
/*Adj*/		INCH/10,
/*twinit*/	"",		/* jpn: do it with filters */
/*twrest*/	"",
/*twnl*/	"\015\n",
/*hlr*/		"\033&a-0.5R",
/*hlf*/		"\033&a+0.5R",
/*flr*/         "\033&a-1.0R",
/*bdon*/	"\033(s3B",
/*bdoff*/	"\033(s0B",
/*ploton*/	"\033&k0H\033&l0C",
/*plotoff*/	"\033&k10H\033&l8C",
/*up*/		"\033&a-15V",
/*down*/	"\033&a+15V",
/*right*/	"\033&a+12H",
/*left*/	"\033&a-12H",
/*codetab*/
#include "code.hplj"
SHAR_EOF
chmod +x 'tabhplj.c'
fi
if test -f 'code.hplj'
then
	echo shar: "will not over-write existing file 'code.hplj'"
else
cat << \SHAR_EOF > 'code.hplj'
/*	code.hplj 	jpn	7-10-87	*/
"\001 ",	/*space*/
"\001!",	/*!*/
"\001\"",	/*"*/
"\001#",	/*#*/
"\001$",	/*$*/
"\001%",	/*%*/
"\001&",	/*&*/
"\001'",	/*' close*/
"\001(",	/*(*/
"\001)",	/*)*/
"\001*",	/***/
"\001+",	/*+*/
"\001,",	/*,*/
"\001-",	/*- hyphen*/
"\001.",	/*.*/
"\001/",	/*/*/
"\2010",	/*0*/
"\2011",	/*1*/
"\2012",	/*2*/
"\2013",	/*3*/
"\2014",	/*4*/
"\2015",	/*5*/
"\2016",	/*6*/
"\2017",	/*7*/
"\2018",	/*8*/
"\2019",	/*9*/
"\001:",	/*:*/
"\001;",	/*;*/
"\001<",	/*<*/
"\001=",	/*=*/
"\001>",	/*>*/
"\001?",	/*?*/
"\001@",	/*@*/
"\201A",	/*A*/
"\201B",	/*B*/
"\201C",	/*C*/
"\201D",	/*D*/
"\201E",	/*E*/
"\201F",	/*F*/
"\201G",	/*G*/
"\201H",	/*H*/
"\201I",	/*I*/
"\201J",	/*J*/
"\201K",	/*K*/
"\201L",	/*L*/
"\201M",	/*M*/
"\201N",	/*N*/
"\201O",	/*O*/
"\201P",	/*P*/
"\201Q",	/*Q*/
"\201R",	/*R*/
"\201S",	/*S*/
"\201T",	/*T*/
"\201U",	/*U*/
"\201V",	/*V*/
"\201W",	/*W*/
"\201X",	/*X*/
"\201Y",	/*Y*/
"\201Z",	/*Z*/
"\001[",	/*[*/
"\001\\",	/*\*/
"\001]",	/*]*/
"\001^",	/*^*/
"\001\137",	/*_ dash*/
"\001`",	/*` open*/
"\201a",	/*a*/
"\201b",	/*b*/
"\201c",	/*c*/
"\201d",	/*d*/
"\201e",	/*e*/
"\201f",	/*f*/
"\201g",	/*g*/
"\201h",	/*h*/
"\201i",	/*i*/
"\201j",	/*j*/
"\201k",	/*k*/
"\201l",	/*l*/
"\201m",	/*m*/
"\201n",	/*n*/
"\201o",	/*o*/
"\201p",	/*p*/
"\201q",	/*q*/
"\201r",	/*r*/
"\201s",	/*s*/
"\201t",	/*t*/
"\201u",	/*u*/
"\201v",	/*v*/
"\201w",	/*w*/
"\201x",	/*x*/
"\201y",	/*y*/
"\201z",	/*z*/
"\001{",	/*{*/
"\001|",	/*|*/
"\001}",	/*}*/
"\001~",	/*~*/
"\000\0",	/*narrow sp*/
"\001-",	/*hyphen*/
"\001\200\362",	/*bullet*/
"\001\200\374",	/*square*/
"\001\200\366",	/*3/4 em dash*/
"\001\200\260",	/*rule--should properly be up one unit*/
"\001\200\367",	/*1/4*/
"\001\200\370",	/*1/2*/
"\001\200\365",	/*3/4*/
"\001-",	/*minus*/
"\202\033&a-20Hf\033&a-45Hi",	 /*fi*/
"\202\033&a-20Hf\033&a-45Hl",	/*fl*/
"\202\033&a-20Hf\033&a-45Hf",	/*ff*/
"\203\033&a-30Hf\033&a-45Hf\033&a-45Hi",	 /*ffi*/
"\203\033&a-30Hf\033&a-45Hf\033&a-45Hl",	 /*ffl*/
"\001\200\263",	 /*degree*/
"\001|\b\342-\302",	/*dagger*/
"\001\200\275",	 /*section*/
"\001\200\250",	 /*foot mark*/
"\001\200\250",	 /*acute accent*/
"\001\200\251",	 /*grave accent*/
"\001\137",	/*underrule*/
"\001/",	 /*slash (longer)*/
"\000\0",	/*half narrow space*/
"\001 ",	/*unpaddable space*/
"\001\241c\202(\241",			/*alpha*/
"\001\200B\242\302|\202\342",		/*beta*/
"\001\200)\201/\241",			/*gamma*/
"\001\200o\343<\303",			/*delta*/
"\001C\b-",				/*epsilon*/
"\001\200c\201\301,\241\344<\303",	/*zeta*/
"\001\200n\202\302|\242\342",		/*eta*/
"\001O\b\341-\301",			/*theta*/
"\001i",				/*iota*/
"\001k",				/*kappa*/
"\001\200\\\304\241'\301\241'\345\202", /*lambda*/
"\001\200\363",			/*mu*/
"\001\241(\203/\242",			/*nu*/
"\001\200c\201\301,\241\343c\241\301`\201\301", /*xi*/
"\001o",				/*omicron*/
"\001\341-\303\"\301\"\343",		/*pi*/
"\001\200o\242\302|\342\202",		/*rho*/
"\001\200o\301\202~\341\242",		/*sigma*/
"\001\200t\301\202~\243~\201\341",	/*tau*/
"\001v",				/*upsilon*/
"\001o\b/",				/*phi*/
"\001x",				/*chi*/
"\001\200/-\302\202'\244'\202\342",	/*psi*/
"\001\241u\203u\242",			/*omega*/
"\001\242|\202\344-\304\202`\242",	/*Gamma*/
"\001\242/\303-\204-\343\\\242",	/*Delta*/
"\001O\b=",				/*Theta*/
"\001\242/\204\\\242",			/*Lambda*/
"\001-\b\342_\345_\307",		/*Xi*/
"\001\242[]\204[]\242\343-\303",	/*Pi*/
"\001\341>\303-\346-\304",		/*Sigma*/
"\000\0",				/**/
"\001Y",				/*Upsilon*/
"\001o\b[\b]",				/*Phi*/
"\001\200[]-\302\202'\244`\202\342",	/*Psi*/
"\001\200O\302\241-\202-\241\342",	/*Omega*/
"\001/\b\242v\202",		/*square root*/
"\001\033Z",			/*\(ts yields logical not*/
"\001\350_\310",		/*root en*/
"\001>\b_",			/*>=*/
"\001<\b_",			/*<=*/
"\001=\b_",			/*identically equal*/
"\001-",			/*equation minus*/
"\001=\b~",			/*approx =*/
"\001\241~\202~\241",		/*approximates*/
"\001=\b/",			/*not equal*/
"\002-\242-\202>",		/*right arrow*/
"\002<\b\202-\242\200-",	/*left arrow*/
"\001|\b^",			/*up arrow*/
"\001|\b\302v\342",		/*down arrow*/
"\001=",			/*equation equal*/
"\001x",			/*multiply*/
"\001:\b-",			/*divide*/
"\001\200\376",			/*plus-minus*/
"\001\243|\203_\203|\243",		/*cup (union)*/
"\001\243|\203\351_\311\203|\243",	/*cap (intersection)*/
"\001\243(\203\302-\345-\303",		/*subset of*/
"\001\302-\345-\303\203)\243",		/*superset of*/
"\001_\b\243(\203\302-\345-\303",	/*improper subset*/
"\001_\b\302-\345-\303\203)\243",	/*improper superset*/
"\002o\242o\202",			/*infinity*/
"\001\200o\201\301`\241\341`\241\341`\201\301", /*partial derivative*/
"\001\242\\\343-\204-\303/\242", 	/*gradient*/
"\001\200-\202\341,\301\242",		/*not*/
"\001\200|'\202`\243\306'\241`\202\346", /*integral sign*/
"\002o\242c\202",		/*proportional to*/
"\001O\b/",			/*empty set*/
"\001<\b\341-\302",		/*member of*/
"\001+",			/*equation plus*/
"\003\200OR",			/*registered*/
"\003\200Oc",			/*copyright*/
"\001|",			/*box rule */
"\001\200\277",			/*cent sign*/
"\001|\b\342=\302",		/*double dagger*/
"\002=>",			/*right hand*/
"\002<=",			/*left hand*/
"\001*",			/*math * */
"\001\\",			/*\(bs yields unkeyable char*/
"\001|",			/*or (was star)*/
"\001O",			/*circle*/
"\001|",			/*left top (of big curly)*/
"\001|",			/*left bottom*/
"\001|",			/*right top*/
"\001|",			/*right bot*/
"\001|",			/*left center of big curly bracket*/
"\001|",			/*right center of big curly bracket*/
"\001|",			/*bold vertical*/
"\001|",			/*left floor (left bot of big sq bract)*/
"\001|",			/*right floor (rb of ")*/
"\001|",			/*left ceiling (lt of ")*/
"\001|",			/*right ceiling (rt of ")*/
"\001\033\046O\033\044",	/*superscript 0 */
"\001\033\046P\033\044",	/*superscript 1 */
"\001\033\046Q\033\044",	/*superscript 2 */
"\001\033\046R\033\044",	/*superscript 3 */
"\001\033\046S\033\044",	/*superscript 4 */
"\001\033\046T\033\044",	/*superscript 5 */
"\001\033\046U\033\044",	/*superscript 6 */
"\001\033\046V\033\044",	/*superscript 7 */
"\001\033\046W\033\044",	/*superscript 8 */
"\001\033\046X\033\044",	/*superscript 9 */
};
SHAR_EOF
chmod +x 'code.hplj'
fi
exit 0
#	End of shell archive

-- 
UUCP: { akgua | allegra | cmcl2 | idis | ihnp4 | mi-cec | pitt | psuvax1 | sun | sunrise | vax135 } ! cadre ! nelslab ! jack
ARPA: jack@cadre.dsl.pittsburgh.edu
John P. Nelson, M.D., 3811 O'Hara St, Pittsburgh, PA 15213, t:412-624-1769 Dept. of Psychiatry, U. of Pittsburgh

pls@sortac.UUCP (Pat Sullivan) (08/05/87)

In article <760@cadre.dsl.PITTSBURGH.EDU> jack@cadre.dsl.PITTSBURGH.EDU (Jack Nelson) writes:
>
>Here is a diff -c of n10.c of nroff code (from BSD 2.9, but almost
>the same as BSD 4.3) which allows access to printer fonts above 0200;

In DWB Release 2, the '%' character is an undocumented escape character
which tells nroff to send out the following character code even if it is
greater than 0200.  If this "feature" is present in older versions, it
may be simpler than rebuilding nroff.  Following is an excerpt from our
nterm file for a LaserJet with an HP "M" cartridge; note the '%' used
to escape character codes greater than 0200:
    ...
charset
ae 1 %\327
AE 1 %\323
yn 1 %\274
bp 1 %\273
em 1 %\366
hy 1 -
\- 1 %\366
bu 1 %\374
sq 2 []
bx 1 %\374
ru 1 _
14 1 %\367
12 1 %\370
   ...

============================================================
Pat Sullivan - {akgua|ihnp4}!sortac!pls - voice 404-257-7382

rroot@edm.UUCP (08/15/87)

In article <760@cadre.dsl.PITTSBURGH.EDU>, jack@cadre.dsl.PITTSBURGH.EDU (Jack Nelson) writes:
> 
> Here is a diff -c of n10.c of nroff code (from BSD 2.9, but almost
> the same as BSD 4.3) which allows access to printer fonts above 0200;
> this is nice if you want to use math or foreign language capabilities
> of a laserjet, for example, but keep the speed and simplicity of nroff.

Since we don't have a source licence for the system that uses our 
laserjet, I used a different approach: an escape code which indicates
that the next character should have its high bit set. The program is then
sent thru a post-processor (in the 'lp' driver) which eats the prefix char
and bit-twiddles the next character).   The nice thing about this is that
it requires no source license.   The bad thing about it is that there areis 
then two characters that cannot be sent to the printer: 0x80 and your escape
code. (0x80 would require being able to embed a null char....).

    If anyone is interested in this kludge, send me a message.
If I get enough requests, then I will just post it.
-- 
-------------
 Stephen Samuel 			Disclaimer: You betcha!
  {ihnp4,ubc-vision,seismo!mnetor,vax135}!alberta!edm!steve
  BITNET: USERZXCV@UQV-MTS