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