summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/recorder/keyboard.c60
1 files changed, 28 insertions, 32 deletions
diff --git a/apps/recorder/keyboard.c b/apps/recorder/keyboard.c
index 109f7452a4..e31c9201a3 100644
--- a/apps/recorder/keyboard.c
+++ b/apps/recorder/keyboard.c
@@ -221,11 +221,8 @@ static bool morse_mode = false;
221int load_kbd(unsigned char* filename) 221int load_kbd(unsigned char* filename)
222{ 222{
223 int fd, count, l; 223 int fd, count, l;
224 int i[NB_SCREENS]; 224 int i = 0;
225 unsigned char buf[4]; 225 unsigned char buf[4];
226
227 FOR_NB_SCREENS(l)
228 i[l] = 0;
229 226
230 if (filename == NULL) { 227 if (filename == NULL) {
231 kbd_loaded = false; 228 kbd_loaded = false;
@@ -236,40 +233,39 @@ int load_kbd(unsigned char* filename)
236 if (fd < 0) 233 if (fd < 0)
237 return 1; 234 return 1;
238 235
239 FOR_NB_SCREENS(l) 236 while (read(fd, buf, 1) == 1 && i < KBD_BUF_SIZE) {
240 { 237 /* check how many bytes to read */
241 while (read(fd, buf, 1) == 1 && i[l] < KBD_BUF_SIZE) { 238 if (buf[0] < 0x80) {
242 /* check how many bytes to read */ 239 count = 0;
243 if (buf[0] < 0x80) { 240 } else if (buf[0] < 0xe0) {
244 count = 0; 241 count = 1;
245 } else if (buf[0] < 0xe0) { 242 } else if (buf[0] < 0xf0) {
246 count = 1; 243 count = 2;
247 } else if (buf[0] < 0xf0) { 244 } else if (buf[0] < 0xf5) {
248 count = 2; 245 count = 3;
249 } else if (buf[0] < 0xf5) { 246 } else {
250 count = 3; 247 /* Invalid size. */
251 } else { 248 continue;
252 /* Invalid size. */ 249 }
253 continue;
254 }
255
256 if (read(fd, &buf[1], count) != count) {
257 close(fd);
258 kbd_loaded = false;
259 return 1;
260 }
261 250
262 utf8decode(buf, &param[l].kbd_buf[i[l]]); 251 if (read(fd, &buf[1], count) != count) {
263 if (param[l].kbd_buf[i[l]] != 0xFEFF && 252 close(fd);
264 param[l].kbd_buf[i[l]] != '\r') /*skip BOM & carriage returns */ 253 kbd_loaded = false;
265 i[l]++; 254 return 1;
266 } 255 }
256
257 FOR_NB_SCREENS(l)
258 utf8decode(buf, &param[l].kbd_buf[i]);
259
260 if (param[0].kbd_buf[i] != 0xFEFF && param[0].kbd_buf[i] != '\n' &&
261 param[0].kbd_buf[i] != '\r') /*skip BOM & newlines */
262 i++;
267 } 263 }
268 264
269 close(fd); 265 close(fd);
270 kbd_loaded = true; 266 kbd_loaded = true;
271 FOR_NB_SCREENS(l) 267 FOR_NB_SCREENS(l)
272 param[l].nchars = i[l]; 268 param[l].nchars = i;
273 return 0; 269 return 0;
274 270
275} 271}