christos@theory.tn.cornell.edu (Christos S. Zoulas) (03/07/91)
Hello, I just happened to be on a system V box that did not come with nroff, so ported 4.3BSD nroff for it. The only problem was that nroff contains code to read the term ``.o'' files which are in "a.out" format, but couldn't read the ``.o'' files in "COFF" format. The following patch adds COFF support to nroff, and support for boldfacing. [the boldfacing patch is courtesy of Lawrence Crowl <crowl@cs.rochester.edu>] You'll need to define COFF in your Makefile if you are on a system V machine. christos *** n10.c.dist Tue Jan 31 18:45:56 1989 --- n10.c Wed Mar 6 18:12:48 1991 *************** *** 1,3 **** --- 1,4 ---- + #ifndef lint static char sccsid[] = "@(#)n10.c 4.2 4/17/85"; #endif lint *************** *** 10,15 **** --- 11,21 ---- #include "v.h" extern #include "tw.h" + #ifdef COFF + #include <aouthdr.h> + #include <filehdr.h> + #include <scnhdr.h> + #endif /* nroff10.c *************** *** 49,54 **** --- 55,64 ---- char *q; int x[8]; extern char *setbrk(); + #ifdef COFF + struct scnhdr sec; + struct filehdr hdr; + #endif if(((i=open(termtab,0)) < 0) && (i=open("/usr/lib/term/tab37",0)) < 0){ prstr("Cannot open "); *************** *** 56,61 **** --- 66,72 ---- prstr("\n"); exit(-1); } + #ifndef COFF read(i,(char *)x,8*sizeof(int)); read(i,(char *)&t.bset,j = sizeof(int)*((int *)&t.zzz - &t.bset)); x[2] -= j; *************** *** 71,76 **** --- 82,144 ---- dtab = 8 * t.Em; for(i=0; i<16; i++)tabtab[i] = dtab * (i+1); if(eqflg)t.Adj = t.Hor; + #else + if (read(i, (char *) &hdr, sizeof(struct filehdr)) != + sizeof(struct filehdr)) { + prstr("Error reading "); + prstr(termtab); + prstr(" file header.\n"); + exit(-1); + } + if (!ISCOFF(hdr.f_magic)) { + prstr("Error reading "); + prstr(termtab); + prstr(" (not a coff file)\n"); + exit(-1); + } + while (hdr.f_opthdr--) if (read(i, (char *) &sec, 1) != 1) { + prstr("Error reading "); + prstr(termtab); + prstr(" optional header.\n"); + exit(-1); + } + if (read(i, (char *) &sec, sizeof(struct scnhdr)) != + sizeof(struct scnhdr)) { + prstr("Error reading "); + prstr(termtab); + prstr(" section header.\n"); + exit(-1); + } + if (strcmp(sec.s_name, _DATA) != 0) { + prstr("Wrong section type "); + prstr(sec.s_name); + prstr(" in "); + prstr(termtab); + prstr(".\n"); + exit(-1); + } + + if (lseek(i, sec.s_scnptr, 0) == -1) { + prstr("Error seeking to data section in "); + prstr(termtab); + prstr(".\n"); + exit(-1); + } + read(i,(char *)&t.bset,j = sizeof(int)*((int *)&t.zzz - &t.bset)); + x[2] -= j; + q = setbrk(x[2]); + lseek(i,(long)t.twinit + sec.s_scnptr,0); + i = read(i,q,x[2]); + j = q - t.twinit; + for(p = &t.twinit; p < &t.zzz; p++){ + if(*p)*p += j;else *p = ""; + } + sps = EM; + ics = EM*2; + dtab = 8 * t.Em; + for(i=0; i<16; i++)tabtab[i] = dtab * (i+1); + if(eqflg)t.Adj = t.Hor; + #endif /* COFF */ } twdone(){ obufp = obuf; *************** *** 113,118 **** --- 181,192 ---- register char *codep; extern char *plot(); int *q, w, j, phyw; + int underlining_ok; /* boolean, true iff we are allowed to + underline this character, we interpret this + to also mean allow simulating boldface using + backspacing */ + int bold_toggle; /* boolean, true iff the terminal has hardware + bolding capability */ for(q=oline; q<olinep; q++){ if((i = *q) & MOT){ *************** *** 131,136 **** --- 205,211 ---- continue; } codep = t.codetab[k-32]; + underlining_ok = (*codep & 0200); w = t.Char * (*codep++ & 0177); phyw = w; if(i&ZBIT)w = 0; *************** *** 137,143 **** if(*codep && (esc || lead))move(); esct += w; if(i&074000)xfont = (i>>9) & 03; ! if(*t.bdon & 0377){ if(!bdmode && (xfont == 2)){ oputs(t.bdon); bdmode++; --- 212,219 ---- if(*codep && (esc || lead))move(); esct += w; if(i&074000)xfont = (i>>9) & 03; ! bold_toggle = t.bdon && (*t.bdon & 0377); ! if(bold_toggle){ if(!bdmode && (xfont == 2)){ oputs(t.bdon); bdmode++; *************** *** 147,156 **** bdmode = 0; } } - if(xfont == ulfont){ - for(k=w/t.Char;k>0;k--)oput('_'); - for(k=w/t.Char;k>0;k--)oput('\b'); - } while(*codep != 0){ if(*codep & 0200){ codep = plot(codep); --- 223,228 ---- *************** *** 158,166 **** oput(' '); }else{ if(plotmode)oputs(t.plotoff); ! *obufp++ = *codep++; ! if(obufp == (obuf + OBUFSZ + ascii - 1))flusho(); ! /* oput(*codep++);*/ } } if(!w)for(k=phyw/t.Char;k>0;k--)oput('\b'); --- 230,245 ---- oput(' '); }else{ if(plotmode)oputs(t.plotoff); ! if(underlining_ok){ ! if(xfont == ulfont){ ! oput('_'); ! oput('\b'); ! }else if(xfont == 2 && !bold_toggle){ ! oput(*codep); ! oput('\b'); ! } ! } ! oput(*codep++); } } if(!w)for(k=phyw/t.Char;k>0;k--)oput('\b'); -- +------------------------------------------------------------------------+ | Christos Zoulas | 389 Theory Center, Electrical Engineering, | | christos@ee.cornell.edu | Cornell University, Ithaca NY 14853. | | christos@crnlee.bitnet | Phone: (607) 255 0302 | Fax: (607) 254 4565 |