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 <stdio.h> 5*219b2ee8SDavid du Colombier #include "../common/common.h" 6*219b2ee8SDavid du Colombier #include "tr2post.h" 7*219b2ee8SDavid du Colombier 8*219b2ee8SDavid du Colombier char devname[20] = { 'u', 't', 'f', '\0' }; 9*219b2ee8SDavid du Colombier int resolution; 10*219b2ee8SDavid du Colombier int minx, miny; 11*219b2ee8SDavid du Colombier 12*219b2ee8SDavid du Colombier struct sjt { 13*219b2ee8SDavid du Colombier char *str; 14*219b2ee8SDavid du Colombier void (*func)(void *); 15*219b2ee8SDavid du Colombier }; 16*219b2ee8SDavid du Colombier 17*219b2ee8SDavid du Colombier /* I won't need this if getfields can replace sscanf 18*219b2ee8SDavid du Colombier 19*219b2ee8SDavid du Colombier extern void picture(Biobufhdr *); 20*219b2ee8SDavid du Colombier extern void notavail(char *); 21*219b2ee8SDavid du Colombier 22*219b2ee8SDavid du Colombier void 23*219b2ee8SDavid du Colombier PSInclude(Biobufhdr *inp) { 24*219b2ee8SDavid du Colombier char buf[256]; 25*219b2ee8SDavid du Colombier 26*219b2ee8SDavid du Colombier Bgetfield(inp, 's', buf, 256); 27*219b2ee8SDavid du Colombier if(pageon()) { 28*219b2ee8SDavid du Colombier endstring(); 29*219b2ee8SDavid du Colombier Bprint(Bstdout, "%s\n", buf); 30*219b2ee8SDavid du Colombier } 31*219b2ee8SDavid du Colombier } 32*219b2ee8SDavid du Colombier 33*219b2ee8SDavid du Colombier struct sjt specialjumptable[] = { 34*219b2ee8SDavid du Colombier {"PI", picture}, 35*219b2ee8SDavid du Colombier {"PictureInclusion", picture}, 36*219b2ee8SDavid du Colombier {"InlinePicture", NULL}, 37*219b2ee8SDavid du Colombier {"BeginPath", NULL}, 38*219b2ee8SDavid du Colombier {"DrawPath", NULL}, 39*219b2ee8SDavid du Colombier {"BeginObject", NULL}, 40*219b2ee8SDavid du Colombier {"EndObject", NULL}, 41*219b2ee8SDavid du Colombier {"NewBaseline", NULL}, 42*219b2ee8SDavid du Colombier {"DrawText", NULL}, 43*219b2ee8SDavid du Colombier {"SetText", NULL}, 44*219b2ee8SDavid du Colombier {"SetColor", NULL}, 45*219b2ee8SDavid du Colombier {"INFO", NULL}, 46*219b2ee8SDavid du Colombier {"PS", PSInclude}, 47*219b2ee8SDavid du Colombier {"Postscript", PSInclude}, 48*219b2ee8SDavid du Colombier {"ExportPS", notavail("ExportPS")}, 49*219b2ee8SDavid du Colombier {NULL, NULL} 50*219b2ee8SDavid du Colombier }; 51*219b2ee8SDavid du Colombier */ 52*219b2ee8SDavid du Colombier 53*219b2ee8SDavid du Colombier void 54*219b2ee8SDavid du Colombier devcntl(Biobufhdr *inp) { 55*219b2ee8SDavid du Colombier 56*219b2ee8SDavid du Colombier char cmd[50], buf[256], str[MAXTOKENSIZE], *line; 57*219b2ee8SDavid du Colombier int c, n, linelen; 58*219b2ee8SDavid du Colombier 59*219b2ee8SDavid du Colombier /* 60*219b2ee8SDavid du Colombier * 61*219b2ee8SDavid du Colombier * Interpret device control commands, ignoring any we don't recognize. The 62*219b2ee8SDavid du Colombier * "x X ..." commands are a device dependent collection generated by troff's 63*219b2ee8SDavid du Colombier * \X'...' request. 64*219b2ee8SDavid du Colombier * 65*219b2ee8SDavid du Colombier */ 66*219b2ee8SDavid du Colombier 67*219b2ee8SDavid du Colombier Bgetfield(inp, 's', cmd, 50); 68*219b2ee8SDavid du Colombier if (debug) Bprint(Bstderr, "devcntl(cmd=%s)\n", cmd); 69*219b2ee8SDavid du Colombier switch (cmd[0]) { 70*219b2ee8SDavid du Colombier case 'f': /* mount font in a position */ 71*219b2ee8SDavid du Colombier Bgetfield(inp, 'd', &n, 0); 72*219b2ee8SDavid du Colombier Bgetfield(inp, 's', str, 100); 73*219b2ee8SDavid du Colombier mountfont(n, str); 74*219b2ee8SDavid du Colombier break; 75*219b2ee8SDavid du Colombier 76*219b2ee8SDavid du Colombier case 'i': /* initialize */ 77*219b2ee8SDavid du Colombier initialize(); 78*219b2ee8SDavid du Colombier break; 79*219b2ee8SDavid du Colombier 80*219b2ee8SDavid du Colombier case 'p': /* pause */ 81*219b2ee8SDavid du Colombier break; 82*219b2ee8SDavid du Colombier 83*219b2ee8SDavid du Colombier case 'r': /* resolution assumed when prepared */ 84*219b2ee8SDavid du Colombier Bgetfield(inp, 'd', &resolution, 0); 85*219b2ee8SDavid du Colombier Bgetfield(inp, 'd', &minx, 0); 86*219b2ee8SDavid du Colombier Bgetfield(inp, 'd', &miny, 0); 87*219b2ee8SDavid du Colombier break; 88*219b2ee8SDavid du Colombier 89*219b2ee8SDavid du Colombier case 's': /* stop */ 90*219b2ee8SDavid du Colombier case 't': /* trailer */ 91*219b2ee8SDavid du Colombier /* flushtext(); */ 92*219b2ee8SDavid du Colombier break; 93*219b2ee8SDavid du Colombier 94*219b2ee8SDavid du Colombier case 'H': /* char height */ 95*219b2ee8SDavid du Colombier Bgetfield(inp, 'd', &n, 0); 96*219b2ee8SDavid du Colombier /* charhgt(n); */ 97*219b2ee8SDavid du Colombier break; 98*219b2ee8SDavid du Colombier 99*219b2ee8SDavid du Colombier case 'S': /* slant */ 100*219b2ee8SDavid du Colombier Bgetfield(inp, 'd', &n, 0); 101*219b2ee8SDavid du Colombier /* t_slant(n); */ 102*219b2ee8SDavid du Colombier break; 103*219b2ee8SDavid du Colombier 104*219b2ee8SDavid du Colombier case 'T': /* device name */ 105*219b2ee8SDavid du Colombier Bgetfield(inp, 's', &devname, 16); 106*219b2ee8SDavid du Colombier if (debug) Bprint(Bstderr, "devname=%s\n", devname); 107*219b2ee8SDavid du Colombier break; 108*219b2ee8SDavid du Colombier 109*219b2ee8SDavid du Colombier case 'E': /* input encoding - not in troff yet */ 110*219b2ee8SDavid du Colombier Bgetfield(inp, 's', &str, 100); 111*219b2ee8SDavid du Colombier /* if ( strcmp(str, "UTF") == 0 ) 112*219b2ee8SDavid du Colombier reading = UTFENCODING; 113*219b2ee8SDavid du Colombier else reading = ONEBYTE; 114*219b2ee8SDavid du Colombier */ 115*219b2ee8SDavid du Colombier break; 116*219b2ee8SDavid du Colombier 117*219b2ee8SDavid du Colombier case 'X': /* copy through - from troff */ 118*219b2ee8SDavid du Colombier if (Bgetfield(inp, 's', str, MAXTOKENSIZE-1) <= 0) 119*219b2ee8SDavid du Colombier error(FATAL, "incomplete devcntl line\n"); 120*219b2ee8SDavid du Colombier if ((line = Brdline(inp, '\n')) == 0) 121*219b2ee8SDavid du Colombier error(FATAL, "incomplete devcntl line\n"); 122*219b2ee8SDavid du Colombier strncpy(buf, line, Blinelen(inp)-1); 123*219b2ee8SDavid du Colombier buf[Blinelen(inp)-1] = '\0'; 124*219b2ee8SDavid du Colombier Bungetc(inp); 125*219b2ee8SDavid du Colombier 126*219b2ee8SDavid du Colombier if (strncmp(str, "PI", sizeof("PI")-1) == 0 || strncmp(str, "PictureInclusion", sizeof("PictureInclusion")-1) == 0) { 127*219b2ee8SDavid du Colombier picture(inp, str); 128*219b2ee8SDavid du Colombier } else if (strncmp(str, "InlinePicture", sizeof("InlinePicture")-1) == 0) { 129*219b2ee8SDavid du Colombier error(FATAL, "InlinePicture not implemented yet.\n"); 130*219b2ee8SDavid du Colombier /* inlinepic(inp, buf); */ 131*219b2ee8SDavid du Colombier } else if (strncmp(str, "BeginPath", sizeof("BeginPath")-1) == 0) { 132*219b2ee8SDavid du Colombier error(FATAL, "BeginPath not implemented yet.\n"); 133*219b2ee8SDavid du Colombier /* beginpath(buf, FALSE); */ 134*219b2ee8SDavid du Colombier } else if (strncmp(str, "DrawPath", sizeof("DrawPath")-1) == 0) { 135*219b2ee8SDavid du Colombier error(FATAL, "DrawPath not implemented yet.\n"); 136*219b2ee8SDavid du Colombier /* drawpath(buf, FALSE); */ 137*219b2ee8SDavid du Colombier } else if (strncmp(str, "BeginObject", sizeof("BeginObject")-1) == 0) { 138*219b2ee8SDavid du Colombier error(FATAL, "BeginObject not implemented yet.\n"); 139*219b2ee8SDavid du Colombier /* beginpath(buf, TRUE); */ 140*219b2ee8SDavid du Colombier } else if (strncmp(str, "EndObject", sizeof("EndObject")-1) == 0) { 141*219b2ee8SDavid du Colombier error(FATAL, "EndObject not implemented yet.\n"); 142*219b2ee8SDavid du Colombier /* drawpath(buf, TRUE); */ 143*219b2ee8SDavid du Colombier } else if (strncmp(str, "NewBaseline", sizeof("NewBaseline")-1) == 0) { 144*219b2ee8SDavid du Colombier error(FATAL, "NewBaseline not implemented yet.\n"); 145*219b2ee8SDavid du Colombier /* newbaseline(buf); */ 146*219b2ee8SDavid du Colombier } else if (strncmp(str, "DrawText", sizeof("DrawText")-1) == 0) { 147*219b2ee8SDavid du Colombier error(FATAL, "DrawText not implemented yet.\n"); 148*219b2ee8SDavid du Colombier /* drawtext(buf); */ 149*219b2ee8SDavid du Colombier } else if (strncmp(str, "SetText", sizeof("SetText")-1) == 0) { 150*219b2ee8SDavid du Colombier error(FATAL, "SetText not implemented yet.\n"); 151*219b2ee8SDavid du Colombier /* settext(buf); */ 152*219b2ee8SDavid du Colombier } else if (strncmp(str, "SetColor", sizeof("SetColor")-1) == 0) { 153*219b2ee8SDavid du Colombier error(FATAL, "SetColor not implemented yet.\n"); 154*219b2ee8SDavid du Colombier /* newcolor(buf); */ 155*219b2ee8SDavid du Colombier /* setcolor(); */ 156*219b2ee8SDavid du Colombier } else if (strncmp(str, "INFO", sizeof("INFO")-1) == 0) { 157*219b2ee8SDavid du Colombier error(FATAL, "INFO not implemented yet.\n"); 158*219b2ee8SDavid du Colombier /* flushtext(); */ 159*219b2ee8SDavid du Colombier /* Bprint(outp, "%%INFO%s", buf); */ 160*219b2ee8SDavid du Colombier } else if (strncmp(str, "PS", sizeof("PS")-1) == 0 || strncmp(str, "PostScript", sizeof("PostScript")-1) == 0) { 161*219b2ee8SDavid du Colombier if(pageon()) { 162*219b2ee8SDavid du Colombier endstring(); 163*219b2ee8SDavid du Colombier Bprint(Bstdout, "%s\n", buf); 164*219b2ee8SDavid du Colombier } 165*219b2ee8SDavid du Colombier } else if (strncmp(str, "ExportPS", sizeof("ExportPS")-1) == 0) { /* dangerous!! */ 166*219b2ee8SDavid du Colombier error(FATAL, "ExportPS not implemented yet.\n"); 167*219b2ee8SDavid du Colombier /* if (Bfildes(outp) == 1) { */ 168*219b2ee8SDavid du Colombier /* restore(); */ 169*219b2ee8SDavid du Colombier /* Bprint(outp, "%s", buf); */ 170*219b2ee8SDavid du Colombier /* save(); */ 171*219b2ee8SDavid du Colombier /* } */ 172*219b2ee8SDavid du Colombier } 173*219b2ee8SDavid du Colombier /* else 174*219b2ee8SDavid du Colombier error(WARNING, "Unknown string <%s %s> after x X\n", str, buf); 175*219b2ee8SDavid du Colombier */ 176*219b2ee8SDavid du Colombier 177*219b2ee8SDavid du Colombier break; 178*219b2ee8SDavid du Colombier } 179*219b2ee8SDavid du Colombier while ((c = Bgetc(inp)) != '\n' && c != Beof); 180*219b2ee8SDavid du Colombier inputlineno++; 181*219b2ee8SDavid du Colombier } 182*219b2ee8SDavid du Colombier 183