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 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 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 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