#include #include #include /* String.h on Plan 9; libString.h on p9p. */ #include /* Each glyph has one char string for each of 4 rows. */ typedef struct Glyph Glyph; struct Glyph { char *row[4]; }; /* Add as many as you like; if you go above 128, redefine glyphs */ Glyph glyphs[128] = { {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, {" ", " ", " ", " "}, /* ␣ */ {"╷", "│", "•", " "}, /* ! */ {"╵╵", " ", " ", " "}, /* " */ {" ", "┼┼", "┼┼", " "}, /* # */ {"╭┼╮", "╰┼╮", "╰┼╯", " "}, /* $ */ {" ", "•╱", "╱•", " "}, /* % */ {"╭─", "├┼", "╰╯", " "}, /* & */ {"┐", " ", " ", " "}, /* ' */ {"╭╴", "│ ", "╰╴", " "}, /* ( */ {"╶╮", " │", "╶╯", " "}, /* ) */ {"╷", "╳", "╵", " "}, /* * */ {" ", "┼", " ", " "}, /* + */ {" ", " ", "╯", " "}, /* , */ {" ", "╶╴", " ", " "}, /* - */ {" ", " ", "•", " "}, /* . */ {" ╱", " ╱ ", "��� ", " "}, /* / */ {"╭╮", "││", "╰╯", " "}, /* 0 */ {" ┐", " │", " ┴", " "}, /* 1 */ {"╭╮", "╭╯", "└╴", " "}, /* 2 */ {"╶╮", " ┤", "╶╯", " "}, /* 3 */ {"╷╷", "╰┤", " ╵", " "}, /* 4 */ {"┌╴", "╰╮", "╰╯", " "}, /* 5 */ {"╭╮", "├╮", "╰╯", " "}, /* 6 */ {"─┐", " │", " │", " "}, /* 7 */ {"╭╮", "├┤", "╰╯", " "}, /* 8 */ {"╭╮", "╰┤", " ╯", " "}, /* 9 */ {" ", "•", "•", " "}, /* : */ {" ", "•", "╯", " "}, /* ; */ {" ", "╱", "╲", " "}, /* < */ {" ", "╶╴", "╶╴", " "}, /* = */ {" ", "╲", "╱", " "}, /* > */ {"╭─╮", " ╭╯", " • ", " "}, /* ? */ {"╭─╮", "│╭┤", "╰╰┘", " "}, /* @ */ {"╭╮", "├┤", "╵╵", " "}, /* A */ {"┌╮", "├┤", "└╯", " "}, /* B */ {"╭╮", "│ ", "╰╯", " "}, /* C */ {"┌╮", "││", "└╯", " "}, /* D */ {"╭─", "├╴", "╰─", " "}, /* E */ {"╭─", "├╴", "╵ ", " "}, /* F */ {"╭╮", "│┬", "╰╯", " "}, /* G */ {"╷╷", "├┤", "╵╵", " "}, /* H */ {"┬", "│", "┴", " "}, /* I */ {"╶┬", " │", "╰╯", " "}, /* J */ {"╷╱", "│╲", "╵ ", " "}, /* K */ {"╷ ", "│ ", "└╴", " "}, /* L */ {"┌┬╮", "│╵│", "╵ ╵", " "}, /* M */ {"┌╮", "││", "╵╵", " "}, /* N */ {"╭╮", "││", "╰╯", " "}, /* O */ {"╭╮", "├╯", "╵ ", " "}, /* P */ {"╭╮", "││", "╰╲", " "}, /* Q */ {"┌╮", "├╯", "╵╵", " "}, /* R */ {"╭╮", "╰╮", "╰╯", " "}, /* S */ {"┬", "│", "│", " "}, /* T */ {"╷╷", "││", "╰╯", " "}, /* U */ {"╷╷", "││", "╲┘", " "}, /* V */ {"╷ ╷", "│╷│", "╰┴╯", " "}, /* W */ {" ", "╲╱", "╱╲", " "}, /* X */ {"╷╷", "╰┤", " │", " "}, /* Y */ {"╶─╱", " ╱ ", "╱─╴", " "}, /* Z */ {"┌╴", "│ ", "└╴", " "}, /* [ */ {"╲ ", " ╲ ", " ╲", " "}, /* \ */ {"╶┐", " │", "╶┘", " "}, /* ] */ {"╱╲", " ", " ", " "}, /* ^ */ {" ", " ", " ", "──"}, /* _ */ {"└", " ", " ", " "}, /* ` */ {" ", "╭╮", "╰┘", " "}, /* a */ {"╷ ", "├╮", "╰╯", " "}, /* b */ {" ", "╭╴", "╰╴", " "}, /* c */ {" ╷", "╭┤", "╰╯", " "}, /* d */ {" ", "╭╮", "╰╴", " "}, /* e */ {"╭╴", "├ ", "╵ ", " "}, /* f */ {" ", "╭╮", "╰┤", " ╯"}, /* g */ {"╷ ", "├╮", "╵╵", " "}, /* h */ {"╷", "╷", "╵", " "}, /* i */ {"╷", "╷", "│", "╯"}, /* j */ {"╷ ", "│╱", "╵╲", " "}, /* k */ {"╷", "│", "╵", " "}, /* l */ {" ", "┌┬╮", "╵╵╵", " "}, /* m */ {" ", "┌╮", "╵╵", " "}, /* n */ {" ", "╭╮", "╰╯", " "}, /* o */ {" ", "╭╮", "├╯", "╵ "}, /* p */ {" ", "╭╮", "╰┤", " ╵"}, /* q */ {" ", "╭╴", "╵ ", " "}, /* r */ {" ", "╭╴", "╶╯", " "}, /* s */ {"╷ ", "├╴", "╰╴", " "}, /* t */ {" ", "╷╷", "╰╯", " "}, /* u */ {" ", " ", "╲╱", " "}, /* v */ {" ", "╷ ╷", "╰┴╯", " "}, /* w */ {" ", " ", "╳", " "}, /* x */ {" ", "╷╷", "╰┤", " ╯"}, /* y */ {" ", "╶╱", "╱╴", " "}, /* z */ {"╭", "┤", "╰", " "}, /* { */ {"│", "│", "│", " "}, /* | */ {"╮", "├", "╯", " "}, /* } */ {" ", "╭╮ ", " ╰╯", " "} /* ~ */ }; void usage(void) { fprint(2, "usage: linebanner [-l n] text [text...]\n"); exits("usage"); } int main(int argc, char **argv) { int row, pos, len, slen, c; String* line; len = 30; line = s_new(); ARGBEGIN { case 'l': len = atoi(EARGF(usage())); } ARGEND if(argc < 1) usage(); for (; argc--; argv++) { slen = strlen(*argv); if (slen < len) len = slen; for (row = 0; row < 4; row++) { s_reset(line); for (pos = 0; pos < len; pos++) { c = (*argv)[pos]; if (c <= sizeof(glyphs)) s_append(line, glyphs[c].row[row]); } print("%s\n", s_to_c(line)); } } s_free(line); return 0; }