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