|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include <bio.h> | 
|  | #include "../common/common.h" | 
|  | #include "tr2post.h" | 
|  |  | 
|  | void | 
|  | conv(Biobuf *Bp) { | 
|  | long n; | 
|  | int r; | 
|  | char special[10]; | 
|  | int save; | 
|  |  | 
|  | inputlineno = 1; | 
|  | if (debug) Bprint(Bstderr, "conv(Biobufhdr *Bp=0x%x)\n", Bp); | 
|  | while ((r = Bgetrune(Bp)) >= 0) { | 
|  | /* Bprint(Bstderr, "r=<%c>,0x%x\n", r, r); */ | 
|  | /*		Bflush(Bstderr); */ | 
|  | switch (r) { | 
|  | case 's':	/* set point size */ | 
|  | Bgetfield(Bp, 'd', &fontsize, 0); | 
|  | break; | 
|  | case 'f':	/* set font to postion */ | 
|  | Bgetfield(Bp, 'd', &fontpos, 0); | 
|  | save = inputlineno; | 
|  | settrfont(); | 
|  | inputlineno = save;	/* ugh */ | 
|  | break; | 
|  | case 'c':	/* print rune */ | 
|  | r = Bgetrune(Bp); | 
|  | runeout(r); | 
|  | break; | 
|  | case 'C':	/* print special character */ | 
|  | Bgetfield(Bp, 's', special, 10); | 
|  | specialout(special); | 
|  | break; | 
|  | case 'N':	/* print character with numeric value from current font */ | 
|  | Bgetfield(Bp, 'd', &n, 0); | 
|  | break; | 
|  | case 'H':	/* go to absolute horizontal position */ | 
|  | Bgetfield(Bp, 'd', &n, 0); | 
|  | hgoto(n); | 
|  | break; | 
|  | case 'V':	/* go to absolute vertical position */ | 
|  | Bgetfield(Bp, 'd', &n, 0); | 
|  | vgoto(n); | 
|  | break; | 
|  | case 'h':	/* go to relative horizontal position */ | 
|  | Bgetfield(Bp, 'd', &n, 0); | 
|  | hmot(n); | 
|  | break; | 
|  | case 'v':	/* go to relative vertical position */ | 
|  | Bgetfield(Bp, 'd', &n, 0); | 
|  | vmot(n); | 
|  | break; | 
|  | case '0': case '1': case '2': case '3': case '4': | 
|  | case '5': case '6': case '7': case '8': case '9': | 
|  | /* move right nn units, then print character c */ | 
|  | n = (r - '0') * 10; | 
|  | r = Bgetrune(Bp); | 
|  | if (r < 0) | 
|  | error(FATAL, "EOF or error reading input\n"); | 
|  | else if (r < '0' || r > '9') | 
|  | error(FATAL, "integer expected\n"); | 
|  | n += r - '0'; | 
|  | r = Bgetrune(Bp); | 
|  | hmot(n); | 
|  | runeout(r); | 
|  | break; | 
|  | case 'p':	/* begin page */ | 
|  | Bgetfield(Bp, 'd', &n, 0); | 
|  | endpage(); | 
|  | startpage(); | 
|  | break; | 
|  | case 'n':	/* end of line (information only 'b a' follows) */ | 
|  | Brdline(Bp, '\n');	/* toss rest of line */ | 
|  | inputlineno++; | 
|  | break; | 
|  | case 'w':	/* paddable word space (information only) */ | 
|  | break; | 
|  | case 'D':	/* graphics function */ | 
|  | draw(Bp); | 
|  | break; | 
|  | case 'x':	/* device control functions */ | 
|  | devcntl(Bp); | 
|  | break; | 
|  | case '#':	/* comment */ | 
|  | Brdline(Bp, '\n');	/* toss rest of line */ | 
|  | case '\n': | 
|  | inputlineno++; | 
|  | break; | 
|  | default: | 
|  | error(WARNING, "unknown troff function <%c>\n", r); | 
|  | break; | 
|  | } | 
|  | } | 
|  | endpage(); | 
|  | if (debug) Bprint(Bstderr, "r=0x%x\n", r); | 
|  | if (debug) Bprint(Bstderr, "leaving conv\n"); | 
|  | } |