]> git.proxmox.com Git - mirror_edk2.git/blob - EdkCompatibilityPkg/Foundation/Library/Dxe/Print/BoxDraw.c
86b0216818559b57ec2f971d8c20d6fe52f39762
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / Dxe / Print / BoxDraw.c
1 /*++
2
3 Copyright (c) 2004, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12 Module Name:
13
14 BoxDraw.c
15
16 Abstract:
17 Lib functions to support Box Draw Unicode code pages.
18
19
20
21 Revision History
22
23 --*/
24
25 #include "Tiano.h"
26 #include "EfiDriverLib.h"
27
28
29
30 typedef struct {
31 CHAR16 Unicode;
32 CHAR8 PcAnsi;
33 CHAR8 Ascii;
34 } UNICODE_TO_CHAR;
35
36
37 //
38 // This list is used to define the valid extend chars.
39 // It also provides a mapping from Unicode to PCANSI or
40 // ASCII. The ASCII mapping we just made up.
41 //
42 //
43
44 static UNICODE_TO_CHAR UnicodeToPcAnsiOrAscii[] = {
45 {BOXDRAW_HORIZONTAL, 0xc4, L'-'},
46 {BOXDRAW_VERTICAL, 0xb3, L'|'},
47 {BOXDRAW_DOWN_RIGHT, 0xda, L'/'},
48 {BOXDRAW_DOWN_LEFT, 0xbf, L'\\'},
49 {BOXDRAW_UP_RIGHT, 0xc0, L'\\'},
50 {BOXDRAW_UP_LEFT, 0xd9, L'/'},
51 {BOXDRAW_VERTICAL_RIGHT, 0xc3, L'|'},
52 {BOXDRAW_VERTICAL_LEFT, 0xb4, L'|'},
53 {BOXDRAW_DOWN_HORIZONTAL, 0xc2, L'+'},
54 {BOXDRAW_UP_HORIZONTAL, 0xc1, L'+'},
55 {BOXDRAW_VERTICAL_HORIZONTAL, 0xc5, L'+'},
56 {BOXDRAW_DOUBLE_HORIZONTAL, 0xcd, L'-'},
57 {BOXDRAW_DOUBLE_VERTICAL, 0xba, L'|'},
58 {BOXDRAW_DOWN_RIGHT_DOUBLE, 0xd5, L'/'},
59 {BOXDRAW_DOWN_DOUBLE_RIGHT, 0xd6, L'/'},
60 {BOXDRAW_DOUBLE_DOWN_RIGHT, 0xc9, L'/'},
61 {BOXDRAW_DOWN_LEFT_DOUBLE, 0xb8, L'\\'},
62 {BOXDRAW_DOWN_DOUBLE_LEFT, 0xb7, L'\\'},
63 {BOXDRAW_DOUBLE_DOWN_LEFT, 0xbb, L'\\'},
64 {BOXDRAW_UP_RIGHT_DOUBLE, 0xd4, L'\\'},
65 {BOXDRAW_UP_DOUBLE_RIGHT, 0xd3, L'\\'},
66 {BOXDRAW_DOUBLE_UP_RIGHT, 0xc8, L'\\'},
67 {BOXDRAW_UP_LEFT_DOUBLE, 0xbe, L'/'},
68 {BOXDRAW_UP_DOUBLE_LEFT, 0xbd, L'/'},
69 {BOXDRAW_DOUBLE_UP_LEFT, 0xbc, L'/'},
70 {BOXDRAW_VERTICAL_RIGHT_DOUBLE, 0xc6, L'|'},
71 {BOXDRAW_VERTICAL_DOUBLE_RIGHT, 0xc7, L'|'},
72 {BOXDRAW_DOUBLE_VERTICAL_RIGHT, 0xcc, L'|'},
73 {BOXDRAW_VERTICAL_LEFT_DOUBLE, 0xb5, L'|'},
74 {BOXDRAW_VERTICAL_DOUBLE_LEFT, 0xb6, L'|'},
75 {BOXDRAW_DOUBLE_VERTICAL_LEFT, 0xb9, L'|'},
76 {BOXDRAW_DOWN_HORIZONTAL_DOUBLE, 0xd1, L'+'},
77 {BOXDRAW_DOWN_DOUBLE_HORIZONTAL, 0xd2, L'+'},
78 {BOXDRAW_DOUBLE_DOWN_HORIZONTAL, 0xcb, L'+'},
79 {BOXDRAW_UP_HORIZONTAL_DOUBLE, 0xcf, L'+'},
80 {BOXDRAW_UP_DOUBLE_HORIZONTAL, 0xd0, L'+'},
81 {BOXDRAW_DOUBLE_UP_HORIZONTAL, 0xca, L'+'},
82 {BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE, 0xd8, L'+'},
83 {BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL, 0xd7, L'+'},
84 {BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL, 0xce, L'+'},
85
86 {BLOCKELEMENT_FULL_BLOCK, 0xdb, L'*'},
87 {BLOCKELEMENT_LIGHT_SHADE, 0xb0, L'+'},
88
89 {GEOMETRICSHAPE_UP_TRIANGLE, 0x1e, L'^'},
90 {GEOMETRICSHAPE_RIGHT_TRIANGLE, 0x10, L'>'},
91 {GEOMETRICSHAPE_DOWN_TRIANGLE, 0x1f, L'v'},
92 {GEOMETRICSHAPE_LEFT_TRIANGLE, 0x11, L'<'},
93
94 {ARROW_LEFT, 0x3c, L'<'},
95
96 {ARROW_UP, 0x18, L'^'},
97
98 {ARROW_RIGHT, 0x3e, L'>'},
99
100 {ARROW_DOWN, 0x19, L'v'},
101
102 {0x0000, 0x00, L'\0'},
103 };
104
105
106 BOOLEAN
107 LibIsValidTextGraphics (
108 IN CHAR16 Graphic,
109 OUT CHAR8 *PcAnsi, OPTIONAL
110 OUT CHAR8 *Ascii OPTIONAL
111 )
112 /*++
113
114 Routine Description:
115
116 Detects if a Unicode char is for Box Drawing text graphics.
117
118 Arguments:
119
120 Grphic - Unicode char to test.
121
122 PcAnsi - Optional pointer to return PCANSI equivalent of Graphic.
123
124 Asci - Optional pointer to return Ascii equivalent of Graphic.
125
126 Returns:
127
128 TRUE if Gpaphic is a supported Unicode Box Drawing character.
129
130 --*/
131 {
132 UNICODE_TO_CHAR *Table;
133
134 if ((((Graphic & 0xff00) != 0x2500) && ((Graphic & 0xff00) != 0x2100))) {
135
136 //
137 // Unicode drawing code charts are all in the 0x25xx range,
138 // arrows are 0x21xx
139 //
140 return FALSE;
141 }
142
143 for (Table = UnicodeToPcAnsiOrAscii; Table->Unicode != 0x0000; Table++) {
144 if (Graphic == Table->Unicode) {
145 if (PcAnsi != NULL) {
146 *PcAnsi = Table->PcAnsi;
147 }
148 if (Ascii != NULL) {
149 *Ascii = Table->Ascii;
150 }
151 return TRUE;
152 }
153 }
154 return FALSE;
155 }
156
157
158 BOOLEAN
159 IsValidAscii (
160 IN CHAR16 Ascii
161 )
162 /*++
163
164 Routine Description:
165
166 Is it valid ascii char?
167
168 Arguments:
169
170 Ascii - The char to check
171
172 Returns:
173
174 TRUE - Is a ascii char
175 FALSE - Not a ascii char
176
177 --*/
178 {
179 if ((Ascii >= 0x20) && (Ascii <= 0x7f)) {
180 return TRUE;
181 }
182 return FALSE;
183 }
184
185
186 BOOLEAN
187 IsValidEfiCntlChar (
188 IN CHAR16 CharC
189 )
190 /*++
191
192 Routine Description:
193
194 Is it valid EFI control char?
195
196 Arguments:
197
198 Ascii - The char to check
199
200 Returns:
201
202 TRUE - Is a valid EFI control char
203 FALSE - Not a valid EFI control char
204
205 --*/
206 {
207 if (CharC == CHAR_NULL || CharC == CHAR_BACKSPACE || CharC == CHAR_LINEFEED || CharC == CHAR_CARRIAGE_RETURN) {
208 return TRUE;
209 }
210 return FALSE;
211 }
212