1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2010-2014 Intel Corporation.
3 * Copyright (c) 2009, Olivier MATZ <zer0@droids-corp.org>
4 * All rights reserved.
5 */
6
7 #include <stdint.h>
8 #include <stdio.h>
9 #include <string.h>
10
11 #include "cmdline_vt100.h"
12
13 const char *cmdline_vt100_commands[] = {
14 vt100_up_arr,
15 vt100_down_arr,
16 vt100_right_arr,
17 vt100_left_arr,
18 "\177",
19 "\n",
20 "\001",
21 "\005",
22 "\013",
23 "\031",
24 "\003",
25 "\006",
26 "\002",
27 vt100_suppr,
28 vt100_tab,
29 "\004",
30 "\014",
31 "\r",
32 "\033\177",
33 vt100_word_left,
34 vt100_word_right,
35 "?",
36 "\027",
37 "\020",
38 "\016",
39 "\033\144",
40 vt100_bs,
41 };
42
43 void
vt100_init(struct cmdline_vt100 * vt)44 vt100_init(struct cmdline_vt100 *vt)
45 {
46 if (!vt)
47 return;
48 vt->state = CMDLINE_VT100_INIT;
49 }
50
51
52 static int
match_command(char * buf,unsigned int size)53 match_command(char *buf, unsigned int size)
54 {
55 const char *cmd;
56 size_t cmdlen;
57 unsigned int i = 0;
58
59 for (i=0 ; i<sizeof(cmdline_vt100_commands)/sizeof(const char *) ; i++) {
60 cmd = *(cmdline_vt100_commands + i);
61
62 cmdlen = strnlen(cmd, CMDLINE_VT100_BUF_SIZE);
63 if (size == cmdlen &&
64 !strncmp(buf, cmd, cmdlen)) {
65 return i;
66 }
67 }
68
69 return -1;
70 }
71
72 int
vt100_parser(struct cmdline_vt100 * vt,char ch)73 vt100_parser(struct cmdline_vt100 *vt, char ch)
74 {
75 unsigned int size;
76 uint8_t c = (uint8_t) ch;
77
78 if (!vt)
79 return -1;
80
81 if (vt->bufpos >= CMDLINE_VT100_BUF_SIZE) {
82 vt->state = CMDLINE_VT100_INIT;
83 vt->bufpos = 0;
84 }
85
86 vt->buf[vt->bufpos++] = c;
87 size = vt->bufpos;
88
89 switch (vt->state) {
90 case CMDLINE_VT100_INIT:
91 if (c == 033) {
92 vt->state = CMDLINE_VT100_ESCAPE;
93 }
94 else {
95 vt->bufpos = 0;
96 goto match_command;
97 }
98 break;
99
100 case CMDLINE_VT100_ESCAPE:
101 if (c == 0133) {
102 vt->state = CMDLINE_VT100_ESCAPE_CSI;
103 }
104 else if (c >= 060 && c <= 0177) { /* XXX 0177 ? */
105 vt->bufpos = 0;
106 vt->state = CMDLINE_VT100_INIT;
107 goto match_command;
108 }
109 break;
110
111 case CMDLINE_VT100_ESCAPE_CSI:
112 if (c >= 0100 && c <= 0176) {
113 vt->bufpos = 0;
114 vt->state = CMDLINE_VT100_INIT;
115 goto match_command;
116 }
117 break;
118
119 default:
120 vt->bufpos = 0;
121 break;
122 }
123
124 return -2;
125
126 match_command:
127 return match_command(vt->buf, size);
128 }
129