xref: /dpdk/lib/cmdline/cmdline_vt100.c (revision 30a1de105a5f40d77b344a891c4a68f79e815c43)
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