#include <u.h>
#include <libc.h>
#include <bio.h>
#include <ctype.h>
/*
* 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" : "");
}
|