#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <vis.h>
#define EDGE "___________"
static void usage(void);
static void putppt(int);
static int getppt(const char *buf);
void
usage(void)
{
fprintf(stderr, "usage: %s [string ...]\n", getprogname());
fprintf(stderr, "usage: %s -d [-b]\n", getprogname());
exit(1);
}
int
main(int argc, char **argv)
{
char *p, buf[132];
int c, start, seenl, dflag, bflag;
setgid(getgid());
dflag = bflag = 0;
while ((c = getopt(argc, argv, "bdh")) != -1)
switch(c) {
case 'd':
dflag = 1;
break;
case 'b':
bflag = 1;
break;
case 'h':
default:
usage();
}
if (bflag && !dflag)
usage();
argc -= optind;
argv += optind;
if (dflag) {
if (argc > 0)
usage();
seenl = start = 0;
while (fgets(buf, sizeof(buf), stdin) != NULL) {
c = getppt(buf);
if (c == -2)
continue;
if (c == -1) {
if (start)
putchar('x');
continue;
}
start = 1;
if (bflag)
putchar(c);
else {
char vbuf[5];
vis(vbuf, c, VIS_NOSLASH, 0);
fputs(vbuf, stdout);
}
seenl = (c == '\n');
}
if (!feof(stdin))
err(1, "fgets");
if (!seenl && !bflag)
putchar('\n');
} else {
puts(EDGE);
if (argc > 0)
while ((p = *argv++)) {
for (; *p != '\0'; ++p)
putppt((int)*p);
if (*argv)
putppt((int)' ');
}
else while ((c = getchar()) != EOF)
putppt(c);
puts(EDGE);
}
return 0;
}
void
putppt(int c)
{
int i;
putchar('|');
for (i = 7; i >= 0; i--) {
if (i == 2)
putchar('.');
if ((c & (1 << i)) != 0)
putchar('o');
else
putchar(' ');
}
putchar('|');
putchar('\n');
}
int
getppt(const char *buf)
{
int c;
if (strncmp(buf, EDGE, strlen(EDGE)) == 0)
return (-2);
if (strlen(buf) < 12 || buf[0] != '|' || buf[10] != '|' ||
buf[6] != '.' || strspn(buf, "| o.") < 11)
return (-1);
c = 0;
if (buf[1] != ' ')
c |= 0200;
if (buf[2] != ' ')
c |= 0100;
if (buf[3] != ' ')
c |= 0040;
if (buf[4] != ' ')
c |= 0020;
if (buf[5] != ' ')
c |= 0010;
if (buf[7] != ' ')
c |= 0004;
if (buf[8] != ' ')
c |= 0002;
if (buf[9] != ' ')
c |= 0001;
return (c);
}