Possible TROFF speedup

Chris Torek chris at umcp-cs.UUCP
Tue Aug 27 21:47:18 AEST 1985


I had a set of n/troff changes for 4.1BSD that gave a ~10% improvement,
as I recall.  Let me see if I can find them....  Ah, here we go.
Please note that these are for 4.1BSD; I haven't reinstalled them
in 4.2 myself (perhaps someone else has), and we don't run System N.

First, add the following at the end of tdef.h:
-------------------------------------------------------------------
/* NOTE: THIS WON'T WORK UNDER NON-VMUNIX!! */
/* Troff spends about 20% of its time in getch() and getch0(); this
   is an attempt to speed that up. */
#ifdef	FAST
int	_ch_, ch, nlflg, ch0, nchar, rchar, app;
int	*rbuf, Buf[NBLIST*BLK + NEV*EVS], *olinep;
filep	roff;

#define	getch()	(ch?((((_ch_=ch)&CMASK)=='\n'?nlflg++:0),ch=0,_ch_):\
		    nlflg?'\n':_getch_())
#define	getch0() (ch0?(_ch_=ch0,ch0=0,_ch_):nchar?(--nchar,rchar):_getch0_())
#define	rbf0(p) (((p)&~(BLK-1))==roff?rbuf[(p)&(BLK-1)]:\
		 (roff=(p)&(~(BLK-1)),rbuf= &Buf[roff],rbuf[p&(BLK-1)]))
#define	rbf()	(((_ch_=rbf0(ip))==0?(app?0:(_ch_=popi()))\
				    :(ip=incoff(ip))),_ch_)
#define wbt(i)	(wbf(i),wbfl())

#ifdef NROFF
int oline[LNSIZE+1];

#define ptout(i) ((olinep>= &oline[LNSIZE]?0:(*olinep++=(i))),\
		  ((i)&CMASK)=='\n'?_ptout_(i):0)
#else (TROFF)
#define	ptout(i) (((i)&CMASK)!='\n'?*olinep++=(i):_ptout_())
#endif NROFF

#endif	FAST
-------------------------------------------------------------------
Now, the RCS diffs for the other files.  There are some other changes
in here; you can try using just the code that is conditional on FAST,
if you wish.

RCS file: RCS/n1.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -c2 -r1.1 -r1.2
*** /tmp/,RCSt1001198	Tue Aug 27 07:37:26 1985
--- /tmp/,RCSt2001198	Tue Aug 27 07:37:28 1985
***************
*** 142,145
  int acctf;
  #endif
  
  main(argc,argv)

--- 142,146 -----
  int acctf;
  #endif
+ char *getenv();
  
  main(argc,argv)
***************
*** 250,253
  			dpn = 0;
  			continue;
  #endif
  		default:

--- 251,260 -----
  			dpn = 0;
  			continue;
+ 		case 'F':
+ 			{
+ 			  extern char *fontfile;
+ 			  fontfile = &argv[0][2];
+ 			}
+ 			continue;
  #endif
  		default:
***************
*** 418,421
  {
  	static int mode;
  
  	if (ttyp==0)

--- 425,430 -----
  {
  	static int mode;
+ 	char *tbptr;
+ 	char tbuf[1024];
  
  	/* 11-3-83 EMA & BNI
***************
*** 419,422
  	static int mode;
  
  	if (ttyp==0)
  		return;

--- 428,440 -----
  	char tbuf[1024];
  
+ 	/* 11-3-83 EMA & BNI
+ 	   Added following check so that messages are only turned off
+ 	   if the output is going to the terminal, and the terminal
+ 	   is a hard copy terminal or of unknown type */
+ 
+ 	tbptr = getenv ("TERM");
+ 	if (! isatty(2) || (tgetent (tbuf,tbptr) > 0) && ! tgetflag("hc"))
+ 		return;
+ 
  	if (ttyp==0)
  		return;
***************
*** 449,453
  {
  	register i,j;
! 	extern filep boff();
  
  	i = a;

--- 467,471 -----
  {
  	register i,j;
! /*	extern filep boff(); */
  
  	i = a;
***************
*** 473,477
  	return(i);
  }
! getch(){
  	register int i, j, k;
  

--- 491,497 -----
  	return(i);
  }
! 
! #ifndef	FAST
! getch () {
  	register int i, j, k;
  
***************
*** 477,480
  
  	level++;
  g0:
  	if(ch){

--- 497,509 -----
  
  	level++;
+ #else	FAST
+ _getch_ () {
+ 	register int i, j, k;
+ 
+ 	level++;
+ 	/* when we get here we know ch and nlflag are both zero */
+ 	goto gfast;
+ #endif	FAST
+ 
  g0:
  	if(ch){
***************
*** 490,493
  	}
  
  	if((k = (i = getch0()) & CMASK) != ESC){
  		if(i & MOT)goto g2;

--- 519,523 -----
  	}
  
+ gfast:
  	if((k = (i = getch0()) & CMASK) != ESC){
  		if(i & MOT)goto g2;
***************
*** 702,706
  }
  char ifilt[32] = {0,001,002,003,0,005,006,007,010,011,012};
! getch0(){
  	register int i, j;
  

--- 732,738 -----
  }
  char ifilt[32] = {0,001,002,003,0,005,006,007,010,011,012};
! 
! #ifndef	FAST
! getch0 () {
  	register int i, j;
  
***************
*** 707,710
  	if(ch0){i=ch0; ch0=0; return(i);}
  	if(nchar){nchar--; return(rchar);}
  
  again:

--- 739,746 -----
  	if(ch0){i=ch0; ch0=0; return(i);}
  	if(nchar){nchar--; return(rchar);}
+ #else	FAST
+ _getch0_ () {
+ 	register int i, j;
+ #endif	FAST
  
  again:
===================================================================
RCS file: RCS/n3.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -c2 -r1.1 -r1.2
*** /tmp/,RCSt1001198	Tue Aug 27 07:37:36 1985
--- /tmp/,RCSt2001198	Tue Aug 27 07:37:37 1985
***************
*** 16,19
  */
  
  unsigned blist[NBLIST];
  extern struct s *frame, *stk, *nxf;

--- 16,22 -----
  */
  
+ #define	blisti(i)	(((i)-NEV*EVS)/(BLK))
+ #define	boff(i)		(((filep)i)*BLK + NEV*EVS)
+ 
  unsigned blist[NBLIST];
  extern struct s *frame, *stk, *nxf;
***************
*** 134,138
  }
  findmn(i)
! int i;
  {
  	register j;

--- 137,141 -----
  }
  findmn(i)
! register i;
  {
  	register j;
***************
*** 137,140
  {
  	register j;
  
  	for(j=0;j<NM;j++){

--- 140,144 -----
  {
  	register j;
+ 	register struct contab *p;
  
  	for (p = contab; p < &contab[NM]; p++)
***************
*** 138,145
  	register j;
  
! 	for(j=0;j<NM;j++){
! 		if(i == (contab[j].rq & ~MMASK))break;
! 	}
! 	if(j==NM)j = -1;
  	return(j);
  }

--- 142,151 -----
  	register struct contab *p;
  
! 	for (p = contab; p < &contab[NM]; p++)
! 		if (i == (p->rq & ~MMASK))
! 			break;
! 	j = p - contab;
! 	if (j == NM)
! 		j = -1;
  	return(j);
  }
***************
*** 147,151
  int i;
  {
- 	extern filep boff();
  	if(i >= 0){
  		if(contab[i].rq & MMASK)ffree(((filep)contab[i].x.mx)<<BLKBITS);

--- 153,156 -----
  int i;
  {
  	if(i >= 0){
  		if(contab[i].rq & MMASK)ffree(((filep)contab[i].x.mx)<<BLKBITS);
***************
*** 158,162
  {
  	register i;
- 	extern filep boff();
  	register filep savip;
  	extern filep alloc();

--- 163,166 -----
  {
  	register i;
  	register filep savip;
  	extern filep alloc();
***************
*** 274,278
  {
  	register i;
- 	extern filep boff();
  	filep j;
  

--- 278,281 -----
  {
  	register i;
  	filep j;
  
***************
*** 299,307
  	blist[j] = 0;
  }
! filep boff(i)
! int i;
! {
! 	return(((filep)i)*BLK + NEV*EVS);
! }
  wbt(i)
  int i;

--- 302,306 -----
  	blist[j] = 0;
  }
! #ifndef	FAST
  wbt(i)
  int i;
***************
*** 310,313
  	wbfl();
  }
  wbf(i)
  int i;

--- 309,313 -----
  	wbfl();
  }
+ #endif	FAST
  wbf(i)
  int i;
***************
*** 346,354
  	woff = 0;
  }
! blisti(i)
! filep i;
! {
! 	return((i-NEV*EVS)/(BLK));
! }
  rbf(){
  	register i;

--- 346,351 -----
  	woff = 0;
  }
! 
! #ifndef	FAST
  rbf(){
  	register i;
***************
*** 362,365
  	return(i);
  }
  rbf0(p)
  filep p;

--- 359,363 -----
  	return(i);
  }
+ 
  rbf0(p)
  filep p;
***************
*** 378,381
  	return(rbuf[p & (BLK-1)]);
  }
  filep incoff(p)
  filep p;

--- 376,381 -----
  	return(rbuf[p & (BLK-1)]);
  }
+ #endif	FAST
+ 
  filep incoff(p)
  register filep p;
***************
*** 379,383
  }
  filep incoff(p)
! filep p;
  {
  	register i;

--- 379,383 -----
  
  filep incoff(p)
! register filep p;
  {
  	register i;
***************
*** 382,388
  {
  	register i;
! 	register filep j;
! 	if(!((j = (++p)) & (BLK-1))){
! 		if((i = blist[blisti(--p)]) == -1){
  			prstr("Bad storage allocation.\n");
  			done2(-5);

--- 382,388 -----
  {
  	register i;
! 
! 	if (!(++p & (BLK-1))) {
! 		if ((i = blist[blisti(--p)]) == -1) {
  			prstr("Bad storage allocation.\n");
  			done2(-5);
***************
*** 388,392
  			done2(-5);
  		}
! 		j = ((filep)i)<<BLKBITS;
  	}
  	return(j);

--- 388,392 -----
  			done2(-5);
  		}
! 		p = ((filep) i) << BLKBITS;
  	}
  	return p;
***************
*** 390,394
  		j = ((filep)i)<<BLKBITS;
  	}
! 	return(j);
  }
  popi(){

--- 390,394 -----
  		p = ((filep) i) << BLKBITS;
  	}
! 	return p;
  }
  
***************
*** 392,395
  	return(j);
  }
  popi(){
  	register struct s *p;

--- 392,396 -----
  	return p;
  }
+ 
  popi(){
  	register struct s *p;
===================================================================
RCS file: RCS/t6.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -c2 -r1.1 -r1.2
*** /tmp/,RCSt1001198	Tue Aug 27 07:37:42 1985
--- /tmp/,RCSt2001198	Tue Aug 27 07:37:44 1985
***************
*** 49,54
  extern int ch0;
  extern int lg;
! char fontfile[] = "/usr/lib/font/ftXX";
! int ffi = 16;
  extern int bd;
  extern int level;

--- 49,54 -----
  extern int ch0;
  extern int lg;
! char *fontfile = "/usr/lib/font/ftXX";
! int ffi = 0;
  extern int bd;
  extern int level;
***************
*** 110,114
  }
  getcw(i)
! int i;
  {
  	register j,k;

--- 110,114 -----
  }
  getcw(i)
! register i;
  {
  	register j,k;
***************
*** 506,509
  	if(((i = (getch() & CMASK) - '0' -1) < 0) || (i >3)){prstr("fp: bad font position\n"); return;}
  	if(skip() || !(j = getrq())){prstr("fp: no font name\n"); return;}
  	fontfile[ffi] = j & BMASK;
  	fontfile[ffi+1] = j>>BYTE;

--- 506,512 -----
  	if(((i = (getch() & CMASK) - '0' -1) < 0) || (i >3)){prstr("fp: bad font position\n"); return;}
  	if(skip() || !(j = getrq())){prstr("fp: no font name\n"); return;}
+ 	if (ffi == 0)
+ 		while (fontfile[ffi] != 'X')
+ 			ffi++;
  	fontfile[ffi] = j & BMASK;
  	fontfile[ffi+1] = j>>BYTE;
===================================================================
RCS file: RCS/n10.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -c2 -r1.1 -r1.2
*** /tmp/,RCSt1001198	Tue Aug 27 07:37:48 1985
--- /tmp/,RCSt2001198	Tue Aug 27 07:37:49 1985
***************
*** 82,88
  	}
  }
! ptout(i)
! int i;
! {
  	*olinep++ = i;
  	if(olinep >= &oline[LNSIZE])olinep--;

--- 82,88 -----
  	}
  }
! 
! #ifndef	FAST
! ptout (i) int i; {
  	*olinep++ = i;
  	if(olinep >= &oline[LNSIZE])olinep--;
***************
*** 88,91
  	if(olinep >= &oline[LNSIZE])olinep--;
  	if((i&CMASK) != '\n')return;
  	olinep--;
  	lead += dip->blss + lss - t.Newline;

--- 88,94 -----
  	if(olinep >= &oline[LNSIZE])olinep--;
  	if((i&CMASK) != '\n')return;
+ #else	FAST
+ _ptout_ () {
+ #endif	FAST
  	olinep--;
  	lead += dip->blss + lss - t.Newline;
***************
*** 144,147
  		}
  	}
  	if(xfont == ulfont){
  		for(k=w/t.Char;k>0;k--)oput('_');

--- 147,157 -----
  		}
  	}
+ 
+ 	/*
+ 	 * This next section of code was moved to after the characters are
+ 	 * output, so that underlining follows the characters, which is the
+ 	 * way the Printronix printer likes it. 2/24/81 FLB
+ 	 *
+ 
  	if(xfont == ulfont){
  		for(k=w/t.Char;k>0;k--)oput('_');
***************
*** 148,151
  		for(k=w/t.Char;k>0;k--)oput('\b');
  	}
  	while(*codep != 0){
  		if(*codep & 0200){

--- 158,165 -----
  		for(k=w/t.Char;k>0;k--)oput('\b');
  	}
+ 
+ 	 *
+ 	 */
+ 
  	while(*codep != 0){
  		if(*codep & 0200){
***************
*** 161,164
  	}
  	if(!w)for(k=phyw/t.Char;k>0;k--)oput('\b');
  	}
  }

--- 175,189 -----
  	}
  	if(!w)for(k=phyw/t.Char;k>0;k--)oput('\b');
+ 
+ 	/*
+ 	 * Do underlining here.
+ 	 * See previous comment as regards underlining.
+ 	 */
+ 
+ 	if(xfont == ulfont){
+ 		for(k=w/t.Char;k>0;k--)oput('\b');
+ 		for(k=w/t.Char;k>0;k--)oput('_');
+ 	}
+ 
  	}
  }
===================================================================
RCS file: RCS/t10.c,v
retrieving revision 1.1
retrieving revision 1.3
diff -c2 -r1.1 -r1.3
*** /tmp/,RCSt1001198	Tue Aug 27 07:37:52 1985
--- /tmp/,RCSt2001198	Tue Aug 27 07:37:53 1985
***************
*** 66,70
  	oput(0140); /*some initial lead*/
  }
! ptout(i)
  int i;
  {

--- 66,75 -----
  	oput(0140); /*some initial lead*/
  }
! 
! #ifndef	FAST
! ptout (i)
! #else	FAST
! _ptout_ (i)
! #endif	FAST
  int i;
  {
***************
*** 73,76
  	int psl[16];
  
  	if((i & CMASK) != '\n'){
  		*olinep++ = i;

--- 78,82 -----
  	int psl[16];
  
+ #ifndef	FAST
  	if((i & CMASK) != '\n'){
  		*olinep++ = i;
***************
*** 77,80
  		return;
  	}
  	if(olinep == oline){
  		lead += lss;

--- 83,87 -----
  		return;
  	}
+ #endif	FAST
  	if(olinep == oline){
  		lead += lss;
***************
*** 149,153
  }
  ptout0(i)
! int i;
  {
  	register j, k, w;

--- 156,160 -----
  }
  ptout0(i)
! register int i;
  {
  	register j, k, w;
***************
*** 275,279
  	while(k > 0){
  		if((i=127) > k)i = k;
! 		if(((j = (esct + i*(1-2*escm))) > (46*72+18-T_IESC)) ||
  		   (j < 0))break;
  /*

--- 282,290 -----
  	while(k > 0){
  		if((i=127) > k)i = k;
! 		/*
! 		 * the magic number in the next line is
! 		 * # of inches max line length * #picas/inch * #bu's/pica
! 		 */
! 		if(((j = (esct + i*(1-2*escm))) > (12*6*72+18-T_IESC)) ||
  		   (j < 0))break;
  /*
-- 
In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 4251)
UUCP:	seismo!umcp-cs!chris
CSNet:	chris at umcp-cs		ARPA:	chris at maryland



More information about the Comp.unix.wizards mailing list