/* * UNG's Not GNU * * Copyright (c) 2022, Jakob Kaivo * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* TODO: Track down XPG/3 or 4 to get a more accurate description of requirements */ #define _POSIX_C_SOURCE 2 #include #include #include #include #include #include #include #define CHARACTER_WIDTH 9 #define CHARACTER_HEIGHT 8 static char letters[UCHAR_MAX][CHARACTER_HEIGHT][CHARACTER_WIDTH] = { [' '] = { " ", " ", " ", " ", " ", " ", " ", " ", }, ['!'] = { " ! ", " ! ", " ! ", " ! ", " ! ", " ", " ! ", " ", }, ['"'] = { " \"\" \"\" ", " \"\" \"\" ", " ", " ", " ", " ", " ", " ", }, ['#'] = { " ", " # # ", " ###### ", " # # ", " ###### ", " # # ", " ", " ", }, ['$'] = { " $$$$ ", " $ $ $ ", " $ $ ", " $$$$ ", " $ $ ", " $ $ $ ", " $$$$ ", " ", }, ['%'] = { " %% % ", " %% % ", " % ", " % ", " % ", " % %% ", " % %% ", " ", }, ['&'] = { " && ", " & & ", " & & ", " && ", " & && ", " & & ", " &&& & ", " ", }, ['\''] ={ " '' ", " '' ", " ", " ", " ", " ", " ", " ", }, ['('] = { " ( ", " ( ", " ( ", " ( ", " ( ", " ( ", " ( ", " ", }, [')'] = { " ) ", " ) ", " ) ", " ) ", " ) ", " ) ", " ) ", " ", }, ['*'] = { " ", " * * ", " * * ", " ****** ", " * * ", " * * ", " ", " ", }, ['+'] = { " ", " + ", " + ", " +++++ ", " + ", " + ", " ", " ", }, [','] = { " ", " ", " ", " ", " ", " ", " ,, ", " , ", }, ['_'] = { " ", " ", " ", " ", " ", " ", " ______ ", " ", }, ['.'] = { " ", " ", " ", " ", " ", " .. ", " .. ", " ", }, ['/'] = { " ", " / ", " / ", " / ", " / ", " / ", " / ", " ", }, ['0'] = { " 00 ", " 0 0 ", " 0 0 ", " 0 0 ", " 0 0 ", " 0 0 ", " 00 ", " " }, ['1'] = { " 1 ", " 11 ", " 1 ", " 1 ", " 1 ", " 1 ", " 111 ", " " }, ['2'] = { " 2222 ", " 2 2 ", " 2 ", " 2 ", " 2 ", " 2 ", " 222222 ", " ", }, ['A'] = { " AA ", " A A ", " A A ", " AAAAAA ", " A A ", " A A ", " A A ", " ", }, ['B'] = { " BBBBB ", " B B ", " B B ", " BBBBB ", " B B ", " B B ", " BBBBB ", " " }, ['C'] = { " CCCC ", " C ", " C ", " C ", " C ", " C ", " CCCC ", " " }, ['D'] = { " DDDD ", " D D ", " D D ", " D D ", " D D ", " D D ", " DDDD ", " " }, ['E'] = { " EEEEEE ", " E ", " E ", " EEEE ", " E ", " E ", " EEEEEE ", " " }, ['F'] = { " FFFFFF ", " F ", " F ", " FFFF ", " F ", " F ", " F ", " " }, ['G'] = { " GGGG ", " G G ", " G ", " G GGR ", " G G ", " G G ", " GGGG ", " " }, ['H'] = { " H H ", " H H ", " H H ", " HHHHHH ", " H H ", " H H ", " H H ", " " }, ['I'] = { " III ", " I ", " I ", " I ", " I ", " I ", " III ", " " }, ['J'] = { " J ", " J ", " J ", " J ", " J ", " J J ", " JJJJ ", " " }, ['K'] = { " K K ", " K K ", " KKK ", " K K ", " K K ", " K K ", " K K ", " " }, ['L'] = { " L ", " L ", " L ", " L ", " L ", " L ", " LLLLLL ", " " }, ['M'] = { " M M ", " MM MM ", " M MM M ", " M M ", " M M ", " M M ", " M M ", " ", }, ['N'] = { " N N ", " NN N ", " N N N ", " N N N ", " N NN ", " N N ", " N N ", " ", }, ['O'] = { " OOOO ", " O O ", " O O ", " O O ", " O O ", " O O ", " OOOO ", " " }, ['P'] = { " PPPPP ", " P P ", " P P ", " PPPPP ", " P ", " P ", " P ", " " }, ['Q'] = { " QQQQ ", " Q Q ", " Q Q ", " Q Q ", " Q Q Q ", " Q Q ", " QQQ Q ", " " }, ['R'] = { " RRRRR ", " R R ", " R R ", " RRRRR ", " R R ", " R R ", " R R ", " ", }, ['S'] = { " SSSS ", " S S ", " S ", " SSSS ", " S ", " S S ", " SSSS ", " ", }, ['T'] = { " TTTTTT ", " T ", " T ", " T ", " T ", " T ", " T ", " " }, ['U'] = { " U U ", " U U ", " U U ", " U U ", " U U ", " U U ", " UUUU ", " ", }, ['V'] = { " V V ", " V V ", " V V ", " V V ", " V V ", " V V ", " VV ", " ", }, ['W'] = { " W W ", " W W ", " W W ", " W W ", " W W ", " W WW W ", " W W ", " ", }, ['X'] = { " X X ", " X X ", " X X ", " XX ", " X X ", " X X ", " X X ", " ", }, ['Y'] = { " Y Y ", " Y Y ", " Y Y ", " Y ", " Y ", " Y ", " Y ", " " }, ['Z'] = { " ZZZZZZ ", " Z ", " Z ", " Z ", " Z ", " Z ", " ZZZZZZ ", " ", }, ['a'] = { " ", " ", " aaa ", " a ", " aaaa ", " a a ", " aaa a ", " ", }, ['b'] = { " b ", " b ", " b ", " bbbbb ", " b b ", " b b ", " bbbbb ", " " }, ['c'] = { " ", " ", " cccc ", " c ", " c ", " c ", " cccc ", " " }, ['d'] = { " d ", " d ", " d ", " ddddd ", " d d ", " d d ", " ddddd ", " " }, ['e'] = { " ", " ", " eeee ", " e e ", " eeeeee ", " e ", " eeee ", " " }, ['f'] = { " ff ", " f f ", " f ", " fff ", " f ", " f ", " f ", " " }, ['g'] = { " ", " ", " gggg ", " g g ", " g g ", " ggggg ", " g ", " gggg " }, ['h'] = { " h ", " h ", " h ", " hhhhh ", " h h ", " h h ", " h h ", " " }, ['i'] = { " ", " i ", " ", " i ", " i ", " i ", " i ", " " }, ['j'] = { " ", " j ", " ", " j ", " j ", " j ", " j j ", " jjjj " }, ['k'] = { " k ", " k ", " k k ", " k k ", " kkkk ", " k k ", " k k ", " " }, ['l'] = { " l ", " l ", " l ", " l ", " l ", " l ", " l ", " " }, ['m'] = { " ", " ", " mm m ", " m mm m ", " m m m ", " m m ", " m m ", " ", }, ['n'] = { " ", " ", " nnnnn ", " n n ", " n n ", " n n ", " n n ", " ", }, ['o'] = { " ", " ", " oooo ", " o o ", " o o ", " o o ", " oooo ", " " }, ['p'] = { " ", " ", " ppppp ", " p p ", " p p ", " ppppp ", " p ", " p " }, ['q'] = { " ", " ", " qqqq ", " q q ", " q q ", " qqqqq ", " q ", " q " }, ['r'] = { " ", " ", " r rrr ", " rr r ", " r ", " r ", " r ", " ", }, ['s'] = { " ", " ", " ssss ", " s ", " ssss ", " s ", " ssss ", " ", }, ['t'] = { " t ", " t ", " ttttt ", " t ", " t ", " t ", " t ", " " }, ['u'] = { " ", " ", " u u ", " u u ", " u u ", " u u ", " uuuuu ", " ", }, ['v'] = { " ", " ", " ", " v v ", " v v ", " v v ", " vv ", " ", }, ['w'] = { " ", " ", " ", " w w ", " w w ", " w ww w ", " w w ", " ", }, ['x'] = { " ", " ", " x x ", " x x ", " xx ", " x x ", " x x ", " ", }, ['y'] = { " ", " ", " u y ", " u y ", " y y ", " yyyyy ", " y ", " yyyy " }, ['z'] = { " ", " ", " zzzz ", " z ", " z ", " z ", " zzzz ", " ", }, ['?'] = { " ???? ", " ? ? ", " ? ", " ? ", " ? ", " ", " ? ", " ", }, }; static void banner(char *s, size_t columns) { size_t slen = strlen(s); for (size_t i = 0; i < slen; i++) { if (!isprint(s[i]) || s[i] < 0 || i > UCHAR_MAX) { s[i] = '?'; } } for (size_t row = 0; row < CHARACTER_HEIGHT; row++) { for (size_t i = 0; i < columns / CHARACTER_WIDTH && i < slen; i++) { fputs(letters[(size_t)s[i]][row], stdout); } putchar('\n'); } } int main(int argc, char *argv[]) { setlocale(LC_ALL, ""); int c; while ((c = getopt(argc, argv, "")) != -1) { switch(c) { default: return 1; } } if (optind >= argc) { fprintf(stderr, "banner: missing operands\n"); return 1; } size_t columns = 80; char *colenv = getenv("COLUMNS"); if (colenv) { columns = atoi(colenv); } while (optind < argc) { banner(argv[optind++], columns); } return 0; }