PatchworkOS
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 8
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
147
153static inline void ansi_sending_init(ansi_sending_t* ansi)
154{
155 memset(ansi->buffer, 0, sizeof(ansi->buffer));
156 ansi->length = 0;
157 memset(ansi->parameters, 0, sizeof(ansi->parameters));
158 ansi->paramCount = 0;
159 ansi->command = '\0';
160 ansi->ascii = false;
161}
162
170static inline bool ansi_sending_parse(ansi_sending_t* ansi, char chr)
171{
172 ansi->buffer[ansi->length++] = chr;
173 ansi->buffer[ansi->length] = '\0';
174
175 if (ansi->length == 1)
176 {
177 switch (ansi->buffer[0])
178 {
179 case '\033':
180 ansi->parameters[0] = 0; // Reset
181 ansi->paramCount = 0;
182 return false;
183 default:
184 ansi->command = ansi->buffer[0];
185 ansi->ascii = true;
186 ansi->length = 0;
187 ansi->paramCount = 0;
188 return true;
189 }
190 }
191
192 if (ansi->length == 2)
193 {
194 if (ansi->buffer[1] == '[')
195 {
196 return false;
197 }
198 else
199 {
200 ansi_sending_init(ansi);
201 return false;
202 }
203 }
204
205 if (ansi->length >= ANSI_MAX_LENGTH - 1)
206 {
207 ansi_sending_init(ansi);
208 return false;
209 }
210
211 if (isdigit(ansi->buffer[ansi->length - 1]))
212 {
213 ansi->parameters[ansi->paramCount] =
214 ansi->parameters[ansi->paramCount] * 10 + (ansi->buffer[ansi->length - 1] - '0');
215 return false;
216 }
217 else if (ansi->buffer[ansi->length - 1] == ';')
218 {
219 if (ansi->paramCount >= ANSI_MAX_LENGTH - 1)
220 {
221 ansi_sending_init(ansi);
222 return false;
223 }
224 ansi->paramCount++;
225 return false;
226 }
227 else
228 {
229 ansi->command = ansi->buffer[ansi->length - 1];
230 ansi->ascii = false;
231 ansi->length = 0;
232 ansi->paramCount++;
233 return true;
234 }
235}
236
_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:170
static void ansi_sending_init(ansi_sending_t *ansi)
Initialize an ANSI sending structure.
Definition ansi.h:153
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
EFI_PHYSICAL_ADDRESS buffer
Definition mem.c:15
static kbd_t * kbd
Definition ps2_kbd.c:10
#define ANSI_MAX_LENGTH
Definition ansi.h:6
__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
uint8_t paramCount
Definition ansi.h:143
bool ascii
Definition ansi.h:145
char buffer[ANSI_MAX_LENGTH]
Definition ansi.h:140
uint8_t length
Definition ansi.h:141
char command
Definition ansi.h:144
uint8_t parameters[ANSI_MAX_LENGTH]
Definition ansi.h:142
Keyboard event.
Definition event.h:138
kbd_mods_t mods
Definition kbd.h:35