1 #ifndef lint 2 /* 3 static char sccsid[] = "@(#)n2.c 2.1 (CWI) 85/07/18"; 4 */ 5 static char sccsid[] = "@(#)n2.c 2.2 (Berkeley) 11/03/90"; 6 #endif lint 7 /* 8 * n2.c 9 * 10 * output, cleanup 11 */ 12 13 #include "tdef.h" 14 #include <sgtty.h> 15 #include <signal.h> 16 #ifdef NROFF 17 #include "tw.h" 18 #endif 19 #include <setjmp.h> 20 #include "ext.h" 21 22 extern jmp_buf sjbuf; 23 int toolate; 24 int error; 25 26 pchar(i) 27 register tchar i; 28 { 29 register int j; 30 static int hx = 0; /* records if have seen HX */ 31 32 if (hx) { 33 hx = 0; 34 j = absmot(i); 35 if (isnmot(i)) { 36 if (j > dip->blss) 37 dip->blss = j; 38 } else { 39 if (j > dip->alss) 40 dip->alss = j; 41 ralss = dip->alss; 42 } 43 return; 44 } 45 if (ismot(i)) { 46 pchar1(i); 47 return; 48 } 49 switch (j = cbits(i)) { 50 case 0: 51 case IMP: 52 case RIGHT: 53 case LEFT: 54 return; 55 case HX: 56 hx = 1; 57 return; 58 case PRESC: 59 if (dip == &d[0]) 60 j = eschar; /* fall through */ 61 default: 62 setcbits(i, trtab[j]); 63 } 64 pchar1(i); 65 } 66 67 68 pchar1(i) 69 register tchar i; 70 { 71 register j; 72 73 j = cbits(i); 74 if (dip != &d[0]) { 75 wbf(i); 76 dip->op = offset; 77 return; 78 } 79 if (!tflg && !print) { 80 if (j == '\n') 81 dip->alss = dip->blss = 0; 82 return; 83 } 84 if (no_out || j == FILLER) 85 return; 86 if (tflg) { /* transparent mode, undiverted */ 87 fdprintf(ptid, "%c", j); 88 return; 89 } 90 #ifndef NROFF 91 if (ascii) 92 outascii(i); 93 else 94 #endif 95 ptout(i); 96 } 97 98 outascii(i) /* print i in best-guess ascii */ 99 tchar i; 100 { 101 static int seendraw; 102 int j = cbits(i); 103 104 if (ismot(i)) { 105 if(!seendraw) { 106 oput(' '); 107 } 108 return; 109 } 110 if (j < 0177 && j >= 040) { 111 if(!seendraw) { 112 oput(j); 113 return; 114 } else { 115 switch(j) { 116 case DRAWCIRCLE: oputs("CIRCLE "); 117 break; 118 case DRAWELLIPSE: oputs("ELLIPSE "); 119 break; 120 case DRAWLINE: oputs("LINE "); 121 break; 122 case DRAWSPLINE: oputs("SPLINE "); 123 break; 124 case DRAWARC: oputs("ARC "); 125 break; 126 case '.':oputs("."); 127 /* 128 if(seendraw == 2) 129 seendraw = 0; 130 else 131 seendraw++; 132 */ 133 break; 134 default: oputs("UNKNOWN "); flusho(); 135 errprint("Unknown 0%o %c function", j,j); 136 break; 137 } 138 return; 139 } 140 } 141 if( j < 040) { 142 switch(j) { 143 case SLANT: 144 case CHARHT: 145 case WORDSP: 146 case HX: 147 return; 148 case DRAWFCN: 149 if(seendraw == 1){ 150 seendraw = 0; 151 } else { 152 oputs("DRAWFUNCTION ");flusho(); 153 seendraw++; 154 } 155 /* 156 errprint("Seendraw %d", seendraw); 157 */ 158 return; 159 case '\n': 160 oput(j); 161 return; 162 default: 163 errprint("Unknown (2) 0%o function", j); 164 return; 165 } 166 } 167 if (j == HYPHEN || j == MINUS) 168 oput('-'); 169 else if (j == LIG_FI) 170 oputs("fi"); 171 else if (j == LIG_FL) 172 oputs("fl"); 173 else if (j == LIG_FF) 174 oputs("ff"); 175 else if (j == LIG_FFI) 176 oputs("ffi"); 177 else if (j == LIG_FFL) 178 oputs("ffl"); 179 else { 180 oput('\\'); 181 oput('('); 182 oput(chname[chtab[j-128]]); 183 oput(chname[chtab[j-128]+1]); 184 } 185 } 186 187 oputs(i) 188 register char *i; 189 { 190 while (*i != 0) 191 oput(*i++); 192 } 193 194 done(x) 195 int x; 196 { 197 register i; 198 199 error |= x; 200 app = ds = lgf = 0; 201 if (i = em) { 202 donef = -1; 203 em = 0; 204 if (control(i, 0)) 205 longjmp(sjbuf, 1); 206 } 207 if (!nfo) 208 done3(0); 209 mflg = 0; 210 dip = &d[0]; 211 if (woff) 212 wbt((tchar)0); 213 if (pendw) 214 getword(1); 215 pendnf = 0; 216 if (donef == 1) 217 done1(0); 218 donef = 1; 219 ip = 0; 220 frame = stk; 221 nxf = frame + 1; 222 if (!ejf) 223 tbreak(); 224 nflush++; 225 eject((struct s *)0); 226 longjmp(sjbuf, 1); 227 } 228 229 230 done1(x) 231 int x; 232 { 233 error |= x; 234 if (numtab[NL].val) { 235 trap = 0; 236 eject((struct s *)0); 237 longjmp(sjbuf, 1); 238 } 239 if (nofeed) { 240 ptlead(); 241 flusho(); 242 done3(0); 243 } else { 244 if (!gflag) 245 pttrailer(); 246 done2(0); 247 } 248 } 249 250 251 done2(x) 252 int x; 253 { 254 ptlead(); 255 #ifndef NROFF 256 if (!ascii) 257 ptstop(); 258 #endif 259 flusho(); 260 done3(x); 261 } 262 263 done3(x) 264 int x; 265 { 266 error |= x; 267 signal(SIGINT, SIG_IGN); 268 signal(SIGTERM, SIG_IGN); 269 #ifdef NROFF 270 twdone(); 271 #endif 272 if (quiet) { 273 ttys.sg_flags |= ECHO; 274 stty(0, &ttys); 275 } 276 if (ascii) 277 mesg(1); 278 exit(error); 279 } 280 281 282 edone(x) 283 int x; 284 { 285 frame = stk; 286 nxf = frame + 1; 287 ip = 0; 288 done(x); 289 } 290 291 292 293 casepi() 294 { 295 register i; 296 int id[2]; 297 298 if (toolate || skip() || !getname() || pipe(id) == -1 || (i = fork()) == -1) { 299 errprint("Pipe not created."); 300 return; 301 } 302 ptid = fdopen(id[1], "w"); 303 if (i > 0) { 304 close(id[0]); 305 toolate++; 306 pipeflg++; 307 return; 308 } 309 close(0); 310 dup(id[0]); 311 close(id[1]); 312 execl(nextf, nextf, 0); 313 errprint("Cannot exec %s", nextf); 314 exit(-4); 315 } 316