1*219b2ee8SDavid du Colombier #include <u.h> 2*219b2ee8SDavid du Colombier #include <libc.h> 3*219b2ee8SDavid du Colombier #include <bio.h> 4*219b2ee8SDavid du Colombier #include "../common/common.h" 5*219b2ee8SDavid du Colombier #include "tr2post.h" 6*219b2ee8SDavid du Colombier 7*219b2ee8SDavid du Colombier void 8*219b2ee8SDavid du Colombier conv(Biobufhdr *Bp) { 9*219b2ee8SDavid du Colombier long c, n; 10*219b2ee8SDavid du Colombier int r; 11*219b2ee8SDavid du Colombier char special[10]; 12*219b2ee8SDavid du Colombier 13*219b2ee8SDavid du Colombier inputlineno = 1; 14*219b2ee8SDavid du Colombier if (debug) Bprint(Bstderr, "conv(Biobufhdr *Bp=0x%x)\n", Bp); 15*219b2ee8SDavid du Colombier while ((r = Bgetrune(Bp)) >= 0) { 16*219b2ee8SDavid du Colombier /* Bprint(Bstderr, "r=<%c>,0x%x\n", r, r); */ 17*219b2ee8SDavid du Colombier /* Bflush(Bstderr); */ 18*219b2ee8SDavid du Colombier switch (r) { 19*219b2ee8SDavid du Colombier case 's': /* set point size */ 20*219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &fontsize, 0); 21*219b2ee8SDavid du Colombier break; 22*219b2ee8SDavid du Colombier case 'f': /* set font to postion */ 23*219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &fontpos, 0); 24*219b2ee8SDavid du Colombier settrfont(); 25*219b2ee8SDavid du Colombier break; 26*219b2ee8SDavid du Colombier case 'c': /* print rune */ 27*219b2ee8SDavid du Colombier r = Bgetrune(Bp); 28*219b2ee8SDavid du Colombier runeout(r); 29*219b2ee8SDavid du Colombier break; 30*219b2ee8SDavid du Colombier case 'C': /* print special character */ 31*219b2ee8SDavid du Colombier Bgetfield(Bp, 's', special, 10); 32*219b2ee8SDavid du Colombier specialout(special); 33*219b2ee8SDavid du Colombier break; 34*219b2ee8SDavid du Colombier case 'N': /* print character with numeric value from current font */ 35*219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &n, 0); 36*219b2ee8SDavid du Colombier break; 37*219b2ee8SDavid du Colombier case 'H': /* go to absolute horizontal position */ 38*219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &n, 0); 39*219b2ee8SDavid du Colombier hgoto(n); 40*219b2ee8SDavid du Colombier break; 41*219b2ee8SDavid du Colombier case 'V': /* go to absolute vertical position */ 42*219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &n, 0); 43*219b2ee8SDavid du Colombier vgoto(n); 44*219b2ee8SDavid du Colombier break; 45*219b2ee8SDavid du Colombier case 'h': /* go to relative horizontal position */ 46*219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &n, 0); 47*219b2ee8SDavid du Colombier hmot(n); 48*219b2ee8SDavid du Colombier break; 49*219b2ee8SDavid du Colombier case 'v': /* go to relative vertical position */ 50*219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &n, 0); 51*219b2ee8SDavid du Colombier vmot(n); 52*219b2ee8SDavid du Colombier break; 53*219b2ee8SDavid du Colombier case '0': case '1': case '2': case '3': case '4': 54*219b2ee8SDavid du Colombier case '5': case '6': case '7': case '8': case '9': 55*219b2ee8SDavid du Colombier /* move right nn units, then print character c */ 56*219b2ee8SDavid du Colombier n = (r - '0') * 10; 57*219b2ee8SDavid du Colombier r = Bgetrune(Bp); 58*219b2ee8SDavid du Colombier if (r < 0) 59*219b2ee8SDavid du Colombier error(FATAL, "EOF or error reading input\n"); 60*219b2ee8SDavid du Colombier else if (r < '0' || r > '9') 61*219b2ee8SDavid du Colombier error(FATAL, "integer expected\n"); 62*219b2ee8SDavid du Colombier n += r - '0'; 63*219b2ee8SDavid du Colombier r = Bgetrune(Bp); 64*219b2ee8SDavid du Colombier hmot(n); 65*219b2ee8SDavid du Colombier runeout(r); 66*219b2ee8SDavid du Colombier break; 67*219b2ee8SDavid du Colombier case 'p': /* begin page */ 68*219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &n, 0); 69*219b2ee8SDavid du Colombier endpage(); 70*219b2ee8SDavid du Colombier startpage(); 71*219b2ee8SDavid du Colombier break; 72*219b2ee8SDavid du Colombier case 'n': /* end of line (information only 'b a' follows) */ 73*219b2ee8SDavid du Colombier Brdline(Bp, '\n'); /* toss rest of line */ 74*219b2ee8SDavid du Colombier inputlineno++; 75*219b2ee8SDavid du Colombier break; 76*219b2ee8SDavid du Colombier case 'w': /* paddable word space (information only) */ 77*219b2ee8SDavid du Colombier break; 78*219b2ee8SDavid du Colombier case 'D': /* graphics function */ 79*219b2ee8SDavid du Colombier draw(Bp); 80*219b2ee8SDavid du Colombier break; 81*219b2ee8SDavid du Colombier case 'x': /* device control functions */ 82*219b2ee8SDavid du Colombier devcntl(Bp); 83*219b2ee8SDavid du Colombier break; 84*219b2ee8SDavid du Colombier case '#': /* comment */ 85*219b2ee8SDavid du Colombier Brdline(Bp, '\n'); /* toss rest of line */ 86*219b2ee8SDavid du Colombier case '\n': 87*219b2ee8SDavid du Colombier inputlineno++; 88*219b2ee8SDavid du Colombier break; 89*219b2ee8SDavid du Colombier default: 90*219b2ee8SDavid du Colombier error(WARNING, "unknown troff function <%c>\n", r); 91*219b2ee8SDavid du Colombier break; 92*219b2ee8SDavid du Colombier } 93*219b2ee8SDavid du Colombier } 94*219b2ee8SDavid du Colombier endpage(); 95*219b2ee8SDavid du Colombier if (debug) Bprint(Bstderr, "r=0x%x\n", r); 96*219b2ee8SDavid du Colombier if (debug) Bprint(Bstderr, "leaving conv\n"); 97*219b2ee8SDavid du Colombier } 98