In some versions of UNIX and Linux there\'s a banner command (usually /usr/bin/banner) that prints great output like this:
##### ####### # ##### #
Here is a shell implementation inspired from @luser droog's code. It is not POSIX compliant but works with both ksh93 and bash, which make it portable enough for most current Unix implementations.
#!/bin/ksh93
# or #!/bin/bash
A=$((1<<0))
B=$((1<<1))
C=$((1<<2))
D=$((1<<3))
E=$((1<<4))
F=$((1<<5))
G=$((1<<6))
H=$((1<<7))
function outLine
{
typeset r=0 scan
for scan
do
typeset l=${#scan}
typeset line=0
for ((p=0; p<l; p++))
do
line="$((line+${scan:$p:1}))"
done
for ((column=0; column<8; column++))
do
[[ $((line & (1<<column))) == 0 ]] && n=" " || n="#"
raw[r]="${raw[r]}$n"
done
r=$((r+1))
done
}
function outChar
{
case "$1" in
(" ") outLine "" "" "" "" "" "" "" "" ;;
("0") outLine "BCDEF" "AFG" "AEG" "ADG" "ACG" "ABG" "BCDEF" "" ;;
("1") outLine "F" "EF" "F" "F" "F" "F" "F" "" ;;
("2") outLine "BCDEF" "AG" "G" "CDEF" "B" "A" "ABCDEFG" "" ;;
("3") outLine "BCDEF" "AG" "G" "CDEF" "G" "AG" "BCDEF" "" ;;
("4") outLine "AF" "AF" "AF" "BCDEFG" "F" "F" "F" "" ;;
("5") outLine "ABCDEFG" "A" "A" "ABCDEF" "G" "AG" "BCDEF" "" ;;
("6") outLine "BCDEF" "A" "A" "BCDEF" "AG" "AG" "BCDEF" "" ;;
("7") outLine "BCDEFG" "G" "F" "E" "D" "C" "B" "" ;;
("8") outLine "BCDEF" "AG" "AG" "BCDEF" "AG" "AG" "BCDEF" "" ;;
("9") outLine "BCDEF" "AG" "AG" "BCDEF" "G" "G" "BCDEF" "" ;;
("a") outLine "" "" "BCDE" "F" "BCDEF" "AF" "BCDEG" "" ;;
("b") outLine "B" "B" "BCDEF" "BG" "BG" "BG" "ACDEF" "" ;;
("c") outLine "" "" "CDE" "BF" "A" "BF" "CDE" "" ;;
("d") outLine "F" "F" "BCDEF" "AF" "AF" "AF" "BCDEG" "" ;;
("e") outLine "" "" "BCDE" "AF" "ABCDEF" "A" "BCDE" "" ;;
("f") outLine "CDE" "B" "B" "ABCD" "B" "B" "B" "" ;;
("g") outLine "" "" "BCDEG" "AF" "AF" "BCDE" "F" "BCDE" ;;
("h") outLine "B" "B" "BCDE" "BF" "BF" "BF" "ABF" "" ;;
("i") outLine "C" "" "BC" "C" "C" "C" "ABCDE" "" ;;
("j") outLine "D" "" "CD" "D" "D" "D" "AD" "BC" ;;
("k") outLine "B" "BE" "BD" "BC" "BD" "BE" "ABEF" "" ;;
("l") outLine "AB" "B" "B" "B" "B" "B" "ABC" "" ;;
("m") outLine "" "" "ACEF" "ABDG" "ADG" "ADG" "ADG" "" ;;
("n") outLine "" "" "BDE" "BCF" "BF" "BF" "BF" "" ;;
("o") outLine "" "" "BCDE" "AF" "AF" "AF" "BCDE" "" ;;
("p") outLine "" "" "ABCDE" "BF" "BF" "BCDE" "B" "AB" ;;
("q") outLine "" "" "BCDEG" "AF" "AF" "BCDE" "F" "FG" ;;
("r") outLine "" "" "ABDE" "BCF" "B" "B" "AB" "" ;;
("s") outLine "" "" "BCDE" "A" "BCDE" "F" "ABCDE" "" ;;
("t") outLine "C" "C" "ABCDE" "C" "C" "C" "DE" "" ;;
("u") outLine "" "" "AF" "AF" "AF" "AF" "BCDEG" "" ;;
("v") outLine "" "" "AG" "BF" "BF" "CE" "D" "" ;;
("w") outLine "" "" "AG" "AG" "ADG" "ADG" "BCEF" "" ;;
("x") outLine "" "" "AF" "BE" "CD" "BE" "AF" "" ;;
("y") outLine "" "" "BF" "BF" "BF" "CDE" "E" "BCD" ;;
("z") outLine "" "" "ABCDEF" "E" "D" "C" "BCDEFG" "" ;;
("A") outLine "D" "CE" "BF" "AG" "ABCDEFG" "AG" "AG" "" ;;
("B") outLine "ABCDE" "AF" "AF" "ABCDE" "AF" "AF" "ABCDE" "" ;;
("C") outLine "CDE" "BF" "A" "A" "A" "BF" "CDE" "" ;;
("D") outLine "ABCD" "AE" "AF" "AF" "AF" "AE" "ABCD" "" ;;
("E") outLine "ABCDEF" "A" "A" "ABCDE" "A" "A" "ABCDEF" "" ;;
("F") outLine "ABCDEF" "A" "A" "ABCDE" "A" "A" "A" "" ;;
("G") outLine "CDE" "BF" "A" "A" "AEFG" "BFG" "CDEG" "" ;;
("H") outLine "AG" "AG" "AG" "ABCDEFG" "AG" "AG" "AG" "" ;;
("I") outLine "ABCDE" "C" "C" "C" "C" "C" "ABCDE" "" ;;
("J") outLine "BCDEF" "D" "D" "D" "D" "BD" "C" "" ;;
("K") outLine "AF" "AE" "AD" "ABC" "AD" "AE" "AF" "" ;;
("L") outLine "A" "A" "A" "A" "A" "A" "ABCDEF" "" ;;
("M") outLine "ABFG" "ACEG" "ADG" "AG" "AG" "AG" "AG" "" ;;
("N") outLine "AG" "ABG" "ACG" "ADG" "AEG" "AFG" "AG" "" ;;
("O") outLine "CDE" "BF" "AG" "AG" "AG" "BF" "CDE" "" ;;
("P") outLine "ABCDE" "AF" "AF" "ABCDE" "A" "A" "A" "" ;;
("Q") outLine "CDE" "BF" "AG" "AG" "ACG" "BDF" "CDE" "FG" ;;
("R") outLine "ABCD" "AE" "AE" "ABCD" "AE" "AF" "AF" "" ;;
("S") outLine "CDE" "BF" "C" "D" "E" "BF" "CDE" "" ;;
("T") outLine "ABCDEFG" "D" "D" "D" "D" "D" "D" "" ;;
("U") outLine "AG" "AG" "AG" "AG" "AG" "BF" "CDE" "" ;;
("V") outLine "AG" "AG" "BF" "BF" "CE" "CE" "D" "" ;;
("W") outLine "AG" "AG" "AG" "AG" "ADG" "ACEG" "BF" "" ;;
("X") outLine "AG" "AG" "BF" "CDE" "BF" "AG" "AG" "" ;;
("Y") outLine "AG" "AG" "BF" "CE" "D" "D" "D" "" ;;
("Z") outLine "ABCDEFG" "F" "E" "D" "C" "B" "ABCDEFG" "" ;;
(".") outLine "" "" "" "" "" "" "D" "" ;;
(",") outLine "" "" "" "" "" "E" "E" "D" ;;
(":") outLine "" "" "" "" "D" "" "D" "" ;;
("!") outLine "D" "D" "D" "D" "D" "" "D" "" ;;
("/") outLine "G" "F" "E" "D" "C" "B" "A" "" ;;
("\\") outLine "A" "B" "C" "D" "E" "F" "G" "" ;;
("|") outLine "D" "D" "D" "D" "D" "D" "D" "D" ;;
("+") outLine "" "D" "D" "BCDEF" "D" "D" "" "" ;;
("-") outLine "" "" "" "BCDEF" "" "" "" "" ;;
("*") outLine "" "BDF" "CDE" "D" "CDE" "BDF" "" "" ;;
("=") outLine "" "" "BCDEF" "" "BCDEF" "" "" "" ;;
(*) outLine "ABCDEFGH" "AH" "AH" "AH" "AH" "AH" "AH" "ABCDEFGH" ;;
esac
}
function outArg
{
typeset l=${#1} c r
for ((c=0; c<l; c++))
do
outChar "${1:$c:1}"
done
echo
[ -z "$COLUMNS" ] && COLUMNS=$(tput cols 2>/dev/null)
for ((r=0; r<8; r++))
do
printf "%-*.*s\n" "${COLUMNS:-80}" "${COLUMNS:-80}" "${raw[r]}"
raw[r]=""
done
}
for i
do
outArg "$i"
echo
done
Nothing is more portable across Unices as straight C.
You might find my rough draft here easier to modify and extend than one from a distribution (due to the implicit copyright if nothing else). This code was designed to be easy to read and understand without any comments.
[Don't be afraid of that big array, the actual code is very short. And at the very bottom there are "comments" which were used to visualize and construct the bitmaps. If you can understand why the space character works despite being coded as a backslash, then you understand the whole thing. The rest is just filling out the alphabet.]
#include <stdio.h>
#include <string.h>
enum {
A = 1<<0,
B = 1<<1,
C = 1<<2,
D = 1<<3,
E = 1<<4,
F = 1<<5,
G = 1<<6,
H = 1<<7,
};
char vec[] = " 0123456789"
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
".,:!/\\|+-*=";
unsigned char map[sizeof(vec)][8] = {
/* */ {A, B, C, D, E, F, G, H}, /* :) */
/*0*/ {B|C|D|E|F, A|F|G, A|E|G, A|D|G, A|C|G, A|B|G, B|C|D|E|F, 0},
/*1*/ {G, F|G, G, G, G, G, G, 0},
/*2*/ {B|C|D|E|F, A|G, G, C|D|E|F, B, A, A|B|C|D|E|F|G, 0},
/*3*/ {B|C|D|E|F, A|G, G, C|D|E|F, G, A|G, B|C|D|E|F, 0},
/*4*/ {A|F, A|F, A|F, B|C|D|E|F|G, F, F, F, 0},
/*5*/ {A|B|C|D|E|F|G, A, A, B|C|D|E|F, G, A|G, B|C|D|E|F, 0},
/*6*/ {B|C|D|E|F, A, A, A|B|C|D|E|F, A|G, A|G, B|C|D|E|F, 0},
/*7*/ {B|C|D|E|F|G, G, F, E, D, C, B, 0},
/*8*/ {B|C|D|E|F, A|G, A|G, B|C|D|E|F, A|G, A|G, B|C|D|E|F, 0},
/*9*/ {B|C|D|E|F, A|G, A|G, B|C|D|E|F|G, G, G, B|C|D|E|F, 0},
/*a*/ {0, 0, B|C|D|E, F, B|C|D|E|F, A|F, B|C|D|E|G, 0},
/*b*/ {B, B, B, B|C|D|E|F, B|G, B|G, A|C|D|E|F, 0},
/*c*/ {0, 0, C|D|E, B|F, A, A, B|F, C|D|E},
/*d*/ {F, F, F, B|C|D|E|F, A|F, A|F, B|C|D|E|G, 0},
/*e*/ {0, 0, B|C|D|E, A|F, A|B|C|D|E|F, A, B|C|D|E, 0},
/*f*/ {C|D|E, B, B, A|B|C|D, B, B, B, 0},
/*g*/ {0, 0, B|C|D|E|G, A|F, A|F, B|C|D|E, F, B|C|D|E},
/*h*/ {B, B, B, B|C|D|E, B|F, B|F, A|B|F, 0},
/*i*/ {0, C, 0, B|C, C, C, A|B|C|D|E, 0},
/*j*/ {0, D, 0, D, D, D, A|D, B|C},
/*k*/ {B, B|E, B|D, B|C, B|D, B|E, A|B|E|F, 0},
/*l*/ {A|B, B, B, B, B, B, A|B|C, 0},
/*m*/ {0, 0, 0, A|C|E|F, A|B|D|G, A|D|G, A|D|G, 0},
/*n*/ {0, 0, 0, B|D|E, B|C|F, B|F, B|F, 0},
/*o*/ {0, 0, B|C|D|E, A|F, A|F, A|F, B|C|D|E, 0},
/*p*/ {0, 0, A|B|C|D|E, B|F, B|F, B|C|D|E, B, A|B},
/*q*/ {0, 0, B|C|D|E|G, A|F, A|F, B|C|D|E, F, F|G},
/*r*/ {0, 0, A|B|D|E, B|C|F, B, B, A|B, 0},
/*s*/ {0, 0, B|C|D|E, A, B|C|D|E, F, A|B|C|D|E, 0},
/*t*/ {0, C, C, A|B|C|D|E, C, C, D|E, 0},
/*u*/ {0, 0, A|F, A|F, A|F, A|F, B|C|D|E|G, 0},
/*v*/ {0, 0, A|G, B|F, B|F, C|E, D, 0},
/*w*/ {0, 0, A|G, A|G, A|D|G, A|D|G, B|C|E|F, 0},
/*x*/ {0, 0, A|F, B|E, C|D, B|E, A|F, 0},
/*y*/ {0, 0, B|F, B|F, B|F, C|F, A|D|E, B|C|D},
/*z*/ {0, 0, A|B|C|D|E|F, E, D, C, B|C|D|E|F|G, 0},
/*A*/ {D, C|E, B|F, A|G, A|B|C|D|E|F|G, A|G, A|G, 0},
/*B*/ {A|B|C|D|E, A|F, A|F, A|B|C|D|E, A|F, A|F, A|B|C|D|E, 0},
/*C*/ {C|D|E, B|F, A, A, A, B|F, C|D|E, 0},
/*D*/ {A|B|C|D, A|E, A|F, A|F, A|F, A|E, A|B|C|D, 0},
/*E*/ {A|B|C|D|E|F, A, A, A|B|C|D|E, A, A, A|B|C|D|E|F, 0},
/*F*/ {A|B|C|D|E|F, A, A, A|B|C|D|E, A, A, A, 0},
/*G*/ {C|D|E, B|F, A, A, A|E|F|G, B|F|G, C|D|E|G, 0},
/*H*/ {A|G, A|G, A|G, A|B|C|D|E|F|G, A|G, A|G, A|G, 0},
/*I*/ {A|B|C|D|E, C, C, C, C, C, A|B|C|D|E, 0},
/*J*/ {A|B|C|D|E, C, C, C, C, C, A|C, B},
/*K*/ {A|F, A|E, A|D, A|B|C, A|D, A|E, A|F, 0},
/*L*/ {A, A, A, A, A, A, A|B|C|D|E|F, 0},
/*M*/ {A|B|F|G, A|C|E|G, A|D|G, A|G, A|G, A|G, A|G, 0},
/*N*/ {A|G, A|B|G, A|C|G, A|D|G, A|E|G, A|F|G, A|G, 0},
/*O*/ {C|D|E, B|F, A|G, A|G, A|G, B|F, C|D|E, 0},
/*P*/ {A|B|C|D, A|E, A|E, A|B|C|D, A, A, A, 0},
/*Q*/ {C|D|E, B|F, A|G, A|G, A|C|G, B|D|F, C|D|E, F|G},
/*R*/ {A|B|C|D, A|E, A|E, A|B|C|D, A|E, A|F, A|F, 0},
/*S*/ {C|D|E, B|F, C, D, E, B|F, C|D|E, 0},
/*T*/ {A|B|C|D|E|F|G, D, D, D, D, D, D, 0},
/*U*/ {A|G, A|G, A|G, A|G, A|G, B|F, C|D|E, 0},
/*V*/ {A|G, A|G, B|F, B|F, C|E, C|E, D, 0},
/*W*/ {A|G, A|G, A|G, A|G, A|D|G, A|C|E|G, B|F, 0},
/*X*/ {A|G, A|G, B|F, C|D|E, B|F, A|G, A|G, 0},
/*Y*/ {A|G, A|G, B|F, C|E, D, D, D, 0},
/*Z*/ {A|B|C|D|E|F|G, F, E, D, C, B, A|B|C|D|E|F|G, 0},
/*.*/ {0, 0, 0, 0, 0, 0, D, 0},
/*,*/ {0, 0, 0, 0, 0, E, E, D},
/*:*/ {0, 0, 0, 0, D, 0, D, 0},
/*!*/ {D, D, D, D, D, 0, D, 0},
/*/ */ {G, F, E, D, C, B, A, 0},
/*\\*/ {A, B, C, D, E, F, G, 0},
/*|*/ {D, D, D, D, D, D, D, D},
/*+*/ {0, D, D, B|C|D|E|F, D, D, 0, 0},
/*-*/ {0, 0, 0, B|C|D|E|F, 0, 0, 0, 0},
/***/ {0, B|D|F, C|D|E, D, C|D|E, B|D|F, 0, 0},
/*=*/ {0, 0, B|C|D|E|F, 0, B|C|D|E|F, 0, 0, 0}
};
int enc(int c) { return strchr(vec,c)-vec; }
void show(char *s) {
int row,col;
char *sp;
for (row=0; row<8; row++, putchar('\n'))
for (sp = s; *sp; sp++)
if (strchr(vec,*sp)!=NULL)
for (col=0; col<8; col++)
putchar(map[enc(*sp)][row] & 1<<col ? *sp:' ');
}
int main(int c,char **v) {
for (--c,++v;*v;v++,c--) show(*v);
return 0;
}
/*
01234567 01234567 01234567 01234567 01234567 01234567
0 ##### # ### #
1 # # # # #
2 # # #### # # #### # #
3 ##### # ##### ##### # # ####
4 # # ##### # # # # # # #
5 # # # # # # # #### # #
6 ##### #### # # #### # # ## #
7 ####
*/
/*
01234567 01234567 01234567 01234567 01234567 01234567
0 #
1 # # # #
2 # # # ##### #### #
3 ## # ## ### ## # # # #
4 # # # # # # # # # # #
5 # # # # # # # #### ####
6 ##### # # ## ## ## # # # #
7 ## ## ##
*/
/*
01234567 01234567 01234567 01234567 01234567 01234567
0
1
2 ## ## #### # # # # ###### # #
3 ## # # # # # # # # #
4 # #### ## # # # # # #
5 # # # # # # # # # #
6 ## ##### # # # ## ###### ## ##
7 ###
*/
/*
01234567 01234567 01234567 01234567 01234567 01234567
0 # ##### ### #### ##### # #
1 # # # # # # # # # # #
2 # # # # # # # # # #
3 # # ##### # # # # # #
4 ##### # # # # # # # # #
5 # # # # # # # # # # # # #
6 # # ##### ### #### # # # #
7 #
*/