1 1.1 jakllsch /* $NetBSD: boxdraw.c,v 1.1.1.2 2018/08/16 18:17:47 jmcneill Exp $ */ 2 1.1 jakllsch 3 1.1 jakllsch /*++ 4 1.1 jakllsch 5 1.1 jakllsch Copyright (c) 1998 Intel Corporation 6 1.1 jakllsch 7 1.1 jakllsch Module Name: 8 1.1 jakllsch 9 1.1 jakllsch BoxDraw.c 10 1.1 jakllsch 11 1.1 jakllsch Abstract: 12 1.1 jakllsch Lib functions to support Box Draw Unicode code pages. 13 1.1 jakllsch 14 1.1 jakllsch 15 1.1 jakllsch 16 1.1 jakllsch Revision History 17 1.1 jakllsch 18 1.1 jakllsch --*/ 19 1.1 jakllsch 20 1.1 jakllsch #include "lib.h" 21 1.1 jakllsch 22 1.1 jakllsch typedef struct { 23 1.1 jakllsch CHAR16 Unicode; 24 1.1 jakllsch CHAR8 PcAnsi; 25 1.1 jakllsch CHAR8 Ascii; 26 1.1 jakllsch } UNICODE_TO_CHAR; 27 1.1 jakllsch 28 1.1 jakllsch 29 1.1 jakllsch // 30 1.1 jakllsch // This list is used to define the valid extend chars. 31 1.1 jakllsch // It also provides a mapping from Unicode to PCANSI or 32 1.1 jakllsch // ASCII. The ASCII mapping we just made up. 33 1.1 jakllsch // 34 1.1 jakllsch // 35 1.1 jakllsch 36 1.1 jakllsch STATIC UNICODE_TO_CHAR UnicodeToPcAnsiOrAscii[] = { 37 1.1 jakllsch { BOXDRAW_HORIZONTAL, 0xc4, L'-'}, 38 1.1 jakllsch { BOXDRAW_VERTICAL, 0xb3, L'|'}, 39 1.1 jakllsch { BOXDRAW_DOWN_RIGHT, 0xda, L'/'}, 40 1.1 jakllsch { BOXDRAW_DOWN_LEFT, 0xbf, L'\\'}, 41 1.1 jakllsch { BOXDRAW_UP_RIGHT, 0xc0, L'\\'}, 42 1.1 jakllsch { BOXDRAW_UP_LEFT, 0xd9, L'/'}, 43 1.1 jakllsch { BOXDRAW_VERTICAL_RIGHT, 0xc3, L'|'}, 44 1.1 jakllsch { BOXDRAW_VERTICAL_LEFT, 0xb4, L'|'}, 45 1.1 jakllsch { BOXDRAW_DOWN_HORIZONTAL, 0xc2, L'+'}, 46 1.1 jakllsch { BOXDRAW_UP_HORIZONTAL, 0xc1, L'+'}, 47 1.1 jakllsch { BOXDRAW_VERTICAL_HORIZONTAL, 0xc5, L'+'}, 48 1.1 jakllsch { BOXDRAW_DOUBLE_HORIZONTAL, 0xcd, L'-'}, 49 1.1 jakllsch { BOXDRAW_DOUBLE_VERTICAL, 0xba, L'|'}, 50 1.1 jakllsch { BOXDRAW_DOWN_RIGHT_DOUBLE, 0xd5, L'/'}, 51 1.1 jakllsch { BOXDRAW_DOWN_DOUBLE_RIGHT, 0xd6, L'/'}, 52 1.1 jakllsch { BOXDRAW_DOUBLE_DOWN_RIGHT, 0xc9, L'/'}, 53 1.1 jakllsch { BOXDRAW_DOWN_LEFT_DOUBLE, 0xb8, L'\\'}, 54 1.1 jakllsch { BOXDRAW_DOWN_DOUBLE_LEFT, 0xb7, L'\\'}, 55 1.1 jakllsch { BOXDRAW_DOUBLE_DOWN_LEFT, 0xbb, L'\\'}, 56 1.1 jakllsch { BOXDRAW_UP_RIGHT_DOUBLE, 0xd4, L'\\'}, 57 1.1 jakllsch { BOXDRAW_UP_DOUBLE_RIGHT, 0xd3, L'\\'}, 58 1.1 jakllsch { BOXDRAW_DOUBLE_UP_RIGHT, 0xc8, L'\\'}, 59 1.1 jakllsch { BOXDRAW_UP_LEFT_DOUBLE, 0xbe, L'/'}, 60 1.1 jakllsch { BOXDRAW_UP_DOUBLE_LEFT, 0xbd, L'/'}, 61 1.1 jakllsch { BOXDRAW_DOUBLE_UP_LEFT, 0xbc, L'/'}, 62 1.1 jakllsch { BOXDRAW_VERTICAL_RIGHT_DOUBLE, 0xc6, L'|'}, 63 1.1 jakllsch { BOXDRAW_VERTICAL_DOUBLE_RIGHT, 0xc7, L'|'}, 64 1.1 jakllsch { BOXDRAW_DOUBLE_VERTICAL_RIGHT, 0xcc, L'|'}, 65 1.1 jakllsch { BOXDRAW_VERTICAL_LEFT_DOUBLE, 0xb5, L'|'}, 66 1.1 jakllsch { BOXDRAW_VERTICAL_DOUBLE_LEFT, 0xb6, L'|'}, 67 1.1 jakllsch { BOXDRAW_DOUBLE_VERTICAL_LEFT, 0xb9, L'|'}, 68 1.1 jakllsch { BOXDRAW_DOWN_HORIZONTAL_DOUBLE, 0xd1, L'+'}, 69 1.1 jakllsch { BOXDRAW_DOWN_DOUBLE_HORIZONTAL, 0xd2, L'+'}, 70 1.1 jakllsch { BOXDRAW_DOUBLE_DOWN_HORIZONTAL, 0xcb, L'+'}, 71 1.1 jakllsch { BOXDRAW_UP_HORIZONTAL_DOUBLE, 0xcf, L'+'}, 72 1.1 jakllsch { BOXDRAW_UP_DOUBLE_HORIZONTAL, 0xd0, L'+'}, 73 1.1 jakllsch { BOXDRAW_DOUBLE_UP_HORIZONTAL, 0xca, L'+'}, 74 1.1 jakllsch { BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE, 0xd8, L'+'}, 75 1.1 jakllsch { BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL, 0xd7, L'+'}, 76 1.1 jakllsch { BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL, 0xce, L'+'}, 77 1.1 jakllsch 78 1.1 jakllsch { BLOCKELEMENT_FULL_BLOCK, 0xdb, L'*'}, 79 1.1 jakllsch { BLOCKELEMENT_LIGHT_SHADE, 0xb0, L'+'}, 80 1.1 jakllsch 81 1.1 jakllsch { GEOMETRICSHAPE_UP_TRIANGLE, 0x1e, L'^'}, 82 1.1 jakllsch { GEOMETRICSHAPE_RIGHT_TRIANGLE, 0x10, L'>'}, 83 1.1 jakllsch { GEOMETRICSHAPE_DOWN_TRIANGLE, 0x1f, L'v'}, 84 1.1 jakllsch { GEOMETRICSHAPE_LEFT_TRIANGLE, 0x11, L'<'}, 85 1.1 jakllsch 86 1.1 jakllsch /* BugBug: Left Arrow is an ESC. We can not make it print 87 1.1 jakllsch on a PCANSI terminal. If we can make left arrow 88 1.1 jakllsch come out on PC ANSI we can add it back. 89 1.1 jakllsch 90 1.1 jakllsch { ARROW_LEFT, 0x1b, L'<'}, 91 1.1 jakllsch */ 92 1.1 jakllsch 93 1.1 jakllsch { ARROW_UP, 0x18, L'^'}, 94 1.1 jakllsch 95 1.1 jakllsch /* BugBut: Took out left arrow so right has to go too. 96 1.1 jakllsch { ARROW_RIGHT, 0x1a, L'>'}, 97 1.1 jakllsch */ 98 1.1 jakllsch { ARROW_DOWN, 0x19, L'v'}, 99 1.1 jakllsch 100 1.1.1.2 jmcneill { 0x0000, 0x00, L'\0' } 101 1.1 jakllsch }; 102 1.1 jakllsch 103 1.1 jakllsch 104 1.1 jakllsch BOOLEAN 105 1.1 jakllsch LibIsValidTextGraphics ( 106 1.1 jakllsch IN CHAR16 Graphic, 107 1.1 jakllsch OUT CHAR8 *PcAnsi, OPTIONAL 108 1.1 jakllsch OUT CHAR8 *Ascii OPTIONAL 109 1.1 jakllsch ) 110 1.1 jakllsch /*++ 111 1.1 jakllsch 112 1.1 jakllsch Routine Description: 113 1.1 jakllsch 114 1.1 jakllsch Detects if a Unicode char is for Box Drawing text graphics. 115 1.1 jakllsch 116 1.1 jakllsch Arguments: 117 1.1 jakllsch 118 1.1 jakllsch Grphic - Unicode char to test. 119 1.1 jakllsch 120 1.1 jakllsch PcAnsi - Optional pointer to return PCANSI equivalent of Graphic. 121 1.1 jakllsch 122 1.1 jakllsch Asci - Optional pointer to return Ascii equivalent of Graphic. 123 1.1 jakllsch 124 1.1 jakllsch Returns: 125 1.1 jakllsch 126 1.1 jakllsch TRUE if Gpaphic is a supported Unicode Box Drawing character. 127 1.1 jakllsch 128 1.1 jakllsch --*/{ 129 1.1 jakllsch UNICODE_TO_CHAR *Table; 130 1.1 jakllsch 131 1.1 jakllsch if ((((Graphic & 0xff00) != 0x2500) && ((Graphic & 0xff00) != 0x2100))) { 132 1.1 jakllsch 133 1.1 jakllsch // 134 1.1 jakllsch // Unicode drawing code charts are all in the 0x25xx range, 135 1.1 jakllsch // arrows are 0x21xx 136 1.1 jakllsch // 137 1.1 jakllsch return FALSE; 138 1.1 jakllsch } 139 1.1 jakllsch 140 1.1 jakllsch for (Table = UnicodeToPcAnsiOrAscii; Table->Unicode != 0x0000; Table++) { 141 1.1 jakllsch if (Graphic == Table->Unicode) { 142 1.1 jakllsch if (PcAnsi) { 143 1.1 jakllsch *PcAnsi = Table->PcAnsi; 144 1.1 jakllsch } 145 1.1 jakllsch if (Ascii) { 146 1.1 jakllsch *Ascii = Table->Ascii; 147 1.1 jakllsch } 148 1.1 jakllsch return TRUE; 149 1.1 jakllsch } 150 1.1 jakllsch } 151 1.1 jakllsch return FALSE; 152 1.1 jakllsch } 153 1.1 jakllsch 154 1.1 jakllsch BOOLEAN 155 1.1 jakllsch IsValidAscii ( 156 1.1 jakllsch IN CHAR16 Ascii 157 1.1 jakllsch ) 158 1.1 jakllsch { 159 1.1 jakllsch if ((Ascii >= 0x20) && (Ascii <= 0x7f)) { 160 1.1 jakllsch return TRUE; 161 1.1 jakllsch } 162 1.1 jakllsch return FALSE; 163 1.1 jakllsch } 164 1.1 jakllsch 165 1.1 jakllsch BOOLEAN 166 1.1 jakllsch IsValidEfiCntlChar ( 167 1.1 jakllsch IN CHAR16 c 168 1.1 jakllsch ) 169 1.1 jakllsch { 170 1.1 jakllsch if (c == CHAR_NULL || c == CHAR_BACKSPACE || c == CHAR_LINEFEED || c == CHAR_CARRIAGE_RETURN) { 171 1.1 jakllsch return TRUE; 172 1.1 jakllsch } 173 1.1 jakllsch return FALSE; 174 1.1 jakllsch } 175 1.1 jakllsch 176