banner命令的处理是什么?

时间:2009-03-16 23:25:02

标签: unix standards

在某些版本的UNIX和Linux中,有一个横幅命令(通常是/ usr / bin / banner)可以输出这样的输出:

 #####  #######    #     #####  #    #
#     #    #      # #   #     # #   #
#          #     #   #  #       #  #
 #####     #    #     # #       ###
      #    #    ####### #       #  #
#     #    #    #     # #     # #   #
 #####     #    #     #  #####  #    #

在其他版本中,banner命令(经常是/ usr / games / banner)会打印一张ENORMOUS横幅,就像你在1980年制作的Printshop一样,适合在生日派对上使用。

我倾向于喜欢在我的脚本中使用横幅,但由于这个问题它本身就是不可移植的。 UNIX中的“banner”部分是什么,为什么不是POSIX标准的一部分?这是一些BSD与SysV的区别,但为什么还没有解决?

我知道有一个figlet可以复制我喜欢的横幅。但我对这个命令的问题是可移植性。横幅应该成为UNIX,恕我直言的一部分,即使他们需要在不同的名称下包含这两个版本(尽管理想情况下行为应该合并到一个命令中,并带有一个选项期望的输出)。

如果我使用横幅广告,那么我在脚本的可移植性方面是不是很幸运?

8 个答案:

答案 0 :(得分:15)

在Unices中,没有什么比直接C更容易移植。

您可能会发现我的粗略草稿比分发中的更容易修改和扩展(由于隐含的版权,如果没有别的)。此代码旨在易于阅读和理解,无需任何评论。

[不要害怕那个大阵列,实际代码很短。在最底部有“注释”,用于可视化和构建位图。如果你能理解为什么空格角色尽管被编码为反斜杠,那么你就能理解整个事物。其余的只是填写字母表。]

#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                                           #
*/

答案 1 :(得分:10)

所需的横幅是System V横幅, 安装sysvbanner包来获取它, 至少在Ubuntu 11上

答案 2 :(得分:8)

这是一个受@luser droog代码启发的shell实现。它不符合POSIX,但适用于ksh93和bash,这使得它足够便携,适用于大多数当前的Unix实现。

#!/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

答案 3 :(得分:7)

总是FIGLet。为unix,windows,dos,mac等提供源代码。希望这能指向正确的方向。

此外,还有TOIlet,可以认为是figlet ++。

答案 4 :(得分:6)

对于unix系统来说,这并不是必不可少的,我不确定为什么它会成为标准的一部分。还有许多其他事情可以说是标准制定机构应该关注的重点。

如果系统上没有它,您可以简单地安装它或构建一个等效的。

在debian上有一个横幅克隆,它有一个包含155行代码的单个c文件,其中大部分只是字形。源可以在包页面上找到。 http://packages.debian.org/testing/misc/sysvbanner

使用您选择的脚本语言构建另一个克隆应该不会太困难。

答案 5 :(得分:6)

因为当POSIX标准化时存在两种不同的行为,早在80年代后期,标准中省略了banner。这不是必要的,并且没有一个普遍的标准可以选择作为“标准”。

是的,如果你在脚本中使用banner,那你就不走运了。跨平台的行为不可靠。

答案 6 :(得分:4)

来自bsdmainutils软件包版本8.0.13的banner命令现在称为printerbanner,位于/ usr / bin / printerbanner。

答案 7 :(得分:1)

如果有人有兴趣,这里是Java版本。它会生成一个String,无论您使用的是System.out.println()还是您选择的Logging框架,它都取决于您。

public class Banner {
    public static String print(String s, char stdCh) {
        StringBuilder sb = new StringBuilder();
        for (int row = 0; row < 8; row++) {
            sb.append('\n');
            for (char ch : s.toCharArray()) {
                int enc = CHAR_LIST.indexOf(ch);
                if (enc < 0) continue;
                for (int col = 0; col < 8; col++) {
                    sb.append(isPresent(row, enc, col) ? charToPrint(ch, stdCh) : ' ');
                }
            }
        }
        return sb.append('\n').toString();
    }

    private static char charToPrint(char ch, char stdCh) {
        return ch != ' ' && stdCh != 0 ? stdCh : ch;
    }

    private static boolean isPresent(int row, int enc, int col) {
        return (map[enc][row] & 1 << col) != 0;
    }

    // @formatter:off
    private static final String CHAR_LIST = " 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.,:!/\\|+-*=";

    private static int        A = 1<<0;
    private static int        B = 1<<1;
    private static int        C = 1<<2;
    private static int        D = 1<<3;
    private static int        E = 1<<4;
    private static int        F = 1<<5;
    private static int        G = 1<<6;
    private static int        H = 1<<7;

    // define the 'font'
    private static int[][] map = new int[][] {
        /* */ {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}
    };

    /*
       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                                           #
    */

    // @formatter:on
}