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