/* * Return TRUE if we can represent the whole of the given string either * in the output charset or as named characters; FALSE otherwise. */ static int troff_ok(int charset, wchar_t *string) { wchar_t test[2]; while (*string) { test[0] = *string; test[1] = 0; if (!cvt_ok(charset, test) && !troffchar(*string)) return FALSE; string++; } return TRUE; }
void process(Biobuf *b, char *name) { int c, r, v, i; char *p; cno = 0; prevlineH = res; filename = name; for(;;){ c = getc(b); switch(c){ case Beof: /* go to ground state */ attr = 0; emit('\n'); return; case '\n': break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': v = c-'0'; c = getc(b); if(c<'0' || '9'<c) sysfatal("illegal character motion at %s:#%d", filename, cno); v = v*10 + (c-'0'); hp += v; /* fall through to character case */ case 'c': indent(); r = getc(b); emithtmlchar(r); break; case 'D': /* draw line; ignore */ do c = getc(b); while(c!='\n' && c!= Beof); break; case 'f': v = setnum(b, "font", 0, Nfont); switchfont(v); break; case 'h': v = setnum(b, "hpos", -20000, 20000); /* generate spaces if motion is large and within a line */ if(!atnewline && v>2*72) for(i=0; i<v; i+=72) emitstr(" "); hp += v; break; case 'n': setnum(b, "n1", -10000, 10000); //Bprint(&bout, " N1=%d", v); getc(b); /* space separates */ setnum(b, "n2", -10000, 10000); atnewline = 1; if(!didP && hp < (Wid-1)*res) /* if line is less than 19" long, probably need a line break */ emitstr("<br>"); emit('\n'); break; case 'p': page = setnum(b, "ps", -10000, 10000); break; case 's': ps = setnum(b, "ps", 1, 1000); break; case 'v': vp += setnum(b, "vpos", -10000, 10000); /* BUG: ignore motion */ break; case 'x': xcmd(b); break; case 'w': emit(' '); break; case 'C': indent(); p = getstr(b); emitstr(troffchar(p)); break; case 'H': hp = setnum(b, "hpos", 0, 20000); //Bprint(&bout, " H=%d ", hp); break; case 'V': vp = setnum(b, "vpos", 0, 10000); break; default: fprint(2, "dhtml: unknown directive %c(0x%.2ux) at %s:#%d\n", c, c, filename, cno); return; } } }