PatchworkOS  28a9544
A non-POSIX operating system.
Loading...
Searching...
No Matches
ansi.h
Go to the documentation of this file.
1#pragma once
2
3#include <ctype.h>
5#include <stdbool.h>
6#include <stdint.h>
7#include <string.h>
8
20#define ANSI_MAX_LENGTH 32
21
31
40static inline void ansi_kbd_to_receiving(ansi_receiving_t* ansi, const event_kbd_t* kbd)
41{
42 switch (kbd->code)
43 {
44 case KBD_BACKSPACE:
45 ansi->buffer[0] = '\b';
46 ansi->length = 1;
47 break;
48 case KBD_ENTER:
49 ansi->buffer[0] = '\n';
50 ansi->length = 1;
51 break;
52 case KBD_TAB:
53 ansi->buffer[0] = '\t';
54 ansi->length = 1;
55 break;
56 case KBD_DELETE:
57 ansi->buffer[0] = '\033';
58 ansi->buffer[1] = '[';
59 ansi->buffer[2] = '3';
60 ansi->buffer[3] = '~';
61 ansi->length = 4;
62 break;
63 case KBD_UP:
64 ansi->buffer[0] = '\033';
65 ansi->buffer[1] = '[';
66 ansi->buffer[2] = 'A';
67 ansi->length = 3;
68 break;
69 case KBD_DOWN:
70 ansi->buffer[0] = '\033';
71 ansi->buffer[1] = '[';
72 ansi->buffer[2] = 'B';
73 ansi->length = 3;
74 break;
75 case KBD_RIGHT:
76 ansi->buffer[0] = '\033';
77 ansi->buffer[1] = '[';
78 ansi->buffer[2] = 'C';
79 ansi->length = 3;
80 break;
81 case KBD_LEFT:
82 ansi->buffer[0] = '\033';
83 ansi->buffer[1] = '[';
84 ansi->buffer[2] = 'D';
85 ansi->length = 3;
86 break;
87 case KBD_PAGE_UP:
88 ansi->buffer[0] = '\033';
89 ansi->buffer[1] = '[';
90 ansi->buffer[2] = '5';
91 ansi->buffer[3] = '~';
92 ansi->length = 4;
93 break;
94 case KBD_PAGE_DOWN:
95 ansi->buffer[0] = '\033';
96 ansi->buffer[1] = '[';
97 ansi->buffer[2] = '6';
98 ansi->buffer[3] = '~';
99 ansi->length = 4;
100 ;
101 break;
102 case KBD_HOME:
103 ansi->buffer[0] = '\033';
104 ansi->buffer[1] = '[';
105 ansi->buffer[2] = '7';
106 ansi->buffer[3] = '~';
107 ansi->length = 4;
108 break;
109 case KBD_END:
110 ansi->buffer[0] = '\033';
111 ansi->buffer[1] = '[';
112 ansi->buffer[2] = '8';
113 ansi->buffer[3] = '~';
114 ansi->length = 4;
115 break;
116 default:
117 if (kbd->mods & KBD_MOD_CTRL && kbd->code == KBD_C)
118 {
119 ansi->buffer[0] = '\003';
120 ansi->length = 1;
121 return;
122 }
123 if (kbd->ascii >= 32 && kbd->ascii < 126)
124 {
125 ansi->buffer[0] = kbd->ascii;
126 ansi->length = 1;
127 return;
128 }
129 ansi->length = 0;
130 break;
131 }
132}
133
148
154static inline void ansi_sending_init(ansi_sending_t* ansi)
155{
156 memset(ansi->buffer, 0, sizeof(ansi->buffer));
157 ansi->length = 0;
158 memset(ansi->parameters, 0, sizeof(ansi->parameters));
159 ansi->paramCount = 0;
160 ansi->command = '\0';
161 ansi->ascii = false;
162}
163
171static inline bool ansi_sending_parse(ansi_sending_t* ansi, char chr)
172{
173 ansi->buffer[ansi->length++] = chr;
174 ansi->buffer[ansi->length] = '\0';
175
176 if (ansi->length == 1)
177 {
178 switch (ansi->buffer[0])
179 {
180 case '\033':
181 ansi->parameters[0] = 0; // Reset
182 ansi->paramCount = 0;
183 ansi->extended = false;
184 return false;
185 default:
186 ansi->command = ansi->buffer[0];
187 ansi->ascii = true;
188 ansi->extended = false;
189 ansi->length = 0;
190 ansi->paramCount = 0;
191 return true;
192 }
193 }
194
195 if (ansi->length == 2)
196 {
197 if (ansi->buffer[1] == '[')
198 {
199 return false;
200 }
201 else
202 {
203 ansi_sending_init(ansi);
204 return false;
205 }
206 }
207
208 if (ansi->length == 3 && ansi->buffer[2] == '?')
209 {
210 ansi->extended = true;
211 return false;
212 }
213
214 if (ansi->length >= ANSI_MAX_LENGTH - 1)
215 {
216 ansi_sending_init(ansi);
217 return false;
218 }
219
220 if (isdigit(ansi->buffer[ansi->length - 1]))
221 {
222 ansi->parameters[ansi->paramCount] =
223 ansi->parameters[ansi->paramCount] * 10 + (ansi->buffer[ansi->length - 1] - '0');
224 return false;
225 }
226 else if (ansi->buffer[ansi->length - 1] == ';')
227 {
228 if (ansi->paramCount >= ANSI_MAX_LENGTH - 1)
229 {
230 ansi_sending_init(ansi);
231 return false;
232 }
233 ansi->paramCount++;
234 return false;
235 }
236 else
237 {
238 ansi->command = ansi->buffer[ansi->length - 1];
239 ansi->ascii = false;
240 ansi->length = 0;
241 ansi->paramCount++;
242 return true;
243 }
244}
245
_PUBLIC int isdigit(int c)
Definition isdigit.c:5
@ KBD_LEFT
Left arrow key.
Definition kbd.h:112
@ KBD_DOWN
Down arrow key.
Definition kbd.h:113
@ KBD_HOME
Home key.
Definition kbd.h:106
@ KBD_TAB
Tab key.
Definition kbd.h:73
@ KBD_BACKSPACE
Backspace key.
Definition kbd.h:72
@ KBD_RIGHT
Right arrow key.
Definition kbd.h:111
@ KBD_ENTER
Enter key.
Definition kbd.h:70
@ KBD_UP
Up arrow key.
Definition kbd.h:114
@ KBD_END
End key.
Definition kbd.h:109
@ KBD_C
Key C.
Definition kbd.h:34
@ KBD_PAGE_DOWN
Page Down key.
Definition kbd.h:110
@ KBD_DELETE
Delete key.
Definition kbd.h:108
@ KBD_PAGE_UP
Page Up key.
Definition kbd.h:107
@ KBD_MOD_CTRL
Control modifier.
Definition kbd.h:301
static bool ansi_sending_parse(ansi_sending_t *ansi, char chr)
Parse a character for ANSI sending.
Definition ansi.h:171
static void ansi_sending_init(ansi_sending_t *ansi)
Initialize an ANSI sending structure.
Definition ansi.h:154
static void ansi_kbd_to_receiving(ansi_receiving_t *ansi, const event_kbd_t *kbd)
Convert a keycode to an ANSI receiving sequence.
Definition ansi.h:40
#define ANSI_MAX_LENGTH
The size we use for buffers when parsing ANSI sequences.
Definition ansi.h:20
EFI_PHYSICAL_ADDRESS buffer
Definition mem.c:15
static kbd_t * kbd
Definition ps2_kbd.c:10
__UINT32_TYPE__ uint32_t
Definition stdint.h:15
__UINT8_TYPE__ uint8_t
Definition stdint.h:11
_PUBLIC void * memset(void *s, int c, size_t n)
Definition memset.c:4
ANSI receiving structure.
Definition ansi.h:27
uint8_t length
Definition ansi.h:29
char buffer[ANSI_MAX_LENGTH]
Definition ansi.h:28
ANSI sending structure.
Definition ansi.h:139
bool extended
The command contains a '?' indicating an extended command.
Definition ansi.h:146
bool ascii
Definition ansi.h:145
char buffer[ANSI_MAX_LENGTH]
Definition ansi.h:140
uint32_t length
Definition ansi.h:141
uint32_t parameters[ANSI_MAX_LENGTH]
Definition ansi.h:142
char command
Definition ansi.h:144
uint32_t paramCount
Definition ansi.h:143
Keyboard event.
Definition event.h:138
kbd_mods_t mods
Definition kbd.h:35