1219b2ee8SDavid du Colombier #include <u.h> 2219b2ee8SDavid du Colombier #include <libc.h> 3219b2ee8SDavid du Colombier #include <bio.h> 4219b2ee8SDavid du Colombier #include "../common/common.h" 5219b2ee8SDavid du Colombier #include "tr2post.h" 6219b2ee8SDavid du Colombier 7219b2ee8SDavid du Colombier void 8219b2ee8SDavid du Colombier conv(Biobufhdr *Bp) { 9219b2ee8SDavid du Colombier long c, n; 10219b2ee8SDavid du Colombier int r; 11219b2ee8SDavid du Colombier char special[10]; 12*7dd7cddfSDavid du Colombier int save; 13219b2ee8SDavid du Colombier 14219b2ee8SDavid du Colombier inputlineno = 1; 15219b2ee8SDavid du Colombier if (debug) Bprint(Bstderr, "conv(Biobufhdr *Bp=0x%x)\n", Bp); 16219b2ee8SDavid du Colombier while ((r = Bgetrune(Bp)) >= 0) { 17219b2ee8SDavid du Colombier /* Bprint(Bstderr, "r=<%c>,0x%x\n", r, r); */ 18219b2ee8SDavid du Colombier /* Bflush(Bstderr); */ 19219b2ee8SDavid du Colombier switch (r) { 20219b2ee8SDavid du Colombier case 's': /* set point size */ 21219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &fontsize, 0); 22219b2ee8SDavid du Colombier break; 23219b2ee8SDavid du Colombier case 'f': /* set font to postion */ 24219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &fontpos, 0); 25*7dd7cddfSDavid du Colombier save = inputlineno; 26219b2ee8SDavid du Colombier settrfont(); 27*7dd7cddfSDavid du Colombier inputlineno = save; /* ugh */ 28219b2ee8SDavid du Colombier break; 29219b2ee8SDavid du Colombier case 'c': /* print rune */ 30219b2ee8SDavid du Colombier r = Bgetrune(Bp); 31219b2ee8SDavid du Colombier runeout(r); 32219b2ee8SDavid du Colombier break; 33219b2ee8SDavid du Colombier case 'C': /* print special character */ 34219b2ee8SDavid du Colombier Bgetfield(Bp, 's', special, 10); 35219b2ee8SDavid du Colombier specialout(special); 36219b2ee8SDavid du Colombier break; 37219b2ee8SDavid du Colombier case 'N': /* print character with numeric value from current font */ 38219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &n, 0); 39219b2ee8SDavid du Colombier break; 40219b2ee8SDavid du Colombier case 'H': /* go to absolute horizontal position */ 41219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &n, 0); 42219b2ee8SDavid du Colombier hgoto(n); 43219b2ee8SDavid du Colombier break; 44219b2ee8SDavid du Colombier case 'V': /* go to absolute vertical position */ 45219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &n, 0); 46219b2ee8SDavid du Colombier vgoto(n); 47219b2ee8SDavid du Colombier break; 48219b2ee8SDavid du Colombier case 'h': /* go to relative horizontal position */ 49219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &n, 0); 50219b2ee8SDavid du Colombier hmot(n); 51219b2ee8SDavid du Colombier break; 52219b2ee8SDavid du Colombier case 'v': /* go to relative vertical position */ 53219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &n, 0); 54219b2ee8SDavid du Colombier vmot(n); 55219b2ee8SDavid du Colombier break; 56219b2ee8SDavid du Colombier case '0': case '1': case '2': case '3': case '4': 57219b2ee8SDavid du Colombier case '5': case '6': case '7': case '8': case '9': 58219b2ee8SDavid du Colombier /* move right nn units, then print character c */ 59219b2ee8SDavid du Colombier n = (r - '0') * 10; 60219b2ee8SDavid du Colombier r = Bgetrune(Bp); 61219b2ee8SDavid du Colombier if (r < 0) 62219b2ee8SDavid du Colombier error(FATAL, "EOF or error reading input\n"); 63219b2ee8SDavid du Colombier else if (r < '0' || r > '9') 64219b2ee8SDavid du Colombier error(FATAL, "integer expected\n"); 65219b2ee8SDavid du Colombier n += r - '0'; 66219b2ee8SDavid du Colombier r = Bgetrune(Bp); 67219b2ee8SDavid du Colombier hmot(n); 68219b2ee8SDavid du Colombier runeout(r); 69219b2ee8SDavid du Colombier break; 70219b2ee8SDavid du Colombier case 'p': /* begin page */ 71219b2ee8SDavid du Colombier Bgetfield(Bp, 'd', &n, 0); 72219b2ee8SDavid du Colombier endpage(); 73219b2ee8SDavid du Colombier startpage(); 74219b2ee8SDavid du Colombier break; 75219b2ee8SDavid du Colombier case 'n': /* end of line (information only 'b a' follows) */ 76219b2ee8SDavid du Colombier Brdline(Bp, '\n'); /* toss rest of line */ 77219b2ee8SDavid du Colombier inputlineno++; 78219b2ee8SDavid du Colombier break; 79219b2ee8SDavid du Colombier case 'w': /* paddable word space (information only) */ 80219b2ee8SDavid du Colombier break; 81219b2ee8SDavid du Colombier case 'D': /* graphics function */ 82219b2ee8SDavid du Colombier draw(Bp); 83219b2ee8SDavid du Colombier break; 84219b2ee8SDavid du Colombier case 'x': /* device control functions */ 85219b2ee8SDavid du Colombier devcntl(Bp); 86219b2ee8SDavid du Colombier break; 87219b2ee8SDavid du Colombier case '#': /* comment */ 88219b2ee8SDavid du Colombier Brdline(Bp, '\n'); /* toss rest of line */ 89219b2ee8SDavid du Colombier case '\n': 90219b2ee8SDavid du Colombier inputlineno++; 91219b2ee8SDavid du Colombier break; 92219b2ee8SDavid du Colombier default: 93219b2ee8SDavid du Colombier error(WARNING, "unknown troff function <%c>\n", r); 94219b2ee8SDavid du Colombier break; 95219b2ee8SDavid du Colombier } 96219b2ee8SDavid du Colombier } 97219b2ee8SDavid du Colombier endpage(); 98219b2ee8SDavid du Colombier if (debug) Bprint(Bstderr, "r=0x%x\n", r); 99219b2ee8SDavid du Colombier if (debug) Bprint(Bstderr, "leaving conv\n"); 100219b2ee8SDavid du Colombier } 101