#include #include #include #include /* * ralph * * A filter to read stdin and write latin-1 diacriticals as * quasi troff to stdout. * * © Boyd Roberts 2004 */ /* map latin-1 to troff diacriticals */ static Rune *tab[256] = { [0xe0] L"`a", L"'a", L"^a", 0, 0, 0, 0, L"ç", [0xe8] L"`e", L"'e", L"^e", 0, 0, 0, L"^i", 0, [0xf0] 0, 0, 0, 0, 0, 0, L":o", 0, }; /* troff string [diacritical] prefix */ char *tp = "\\*"; void main(int argc, char *argv[]) { Biobuf bin; Biobuf bout; Biobuf *in; Biobuf *out; int c; int e; USED(argc); USED(argv); Binit(in = &bin, 0, OREAD); Binit(out = &bout, 1, OWRITE); e = 0; while ((c = Bgetc(in)) >= 0) { Rune *r; if (isascii(c)) { /* damn windows' CRs */ if (c != '\r' && Bputc(out, c) < 0) { e = 1; break; } continue; } if ((r = tab[c]) == 0) { fprint(2, "ralph: unknown latin-1 0x%02x\n", c); exits("update latin-1 table"); } /* single Rune or troff diacritical */ if (runestrlen(r) == 1) { if (Bprint(out, "%C", *r) == Beof) e = 1; } else if (Bprint(out, "%s%S", tp, r) == Beof) e = 1; if (e) break; } if (!e && Bflush(out) < 0) e = 1; exits(e ? "i/o error" : ""); }