Have you tried to develop a key input feature on your small embedded platform with a serial input? It is not so easy to implement correctly because the input methodology is using a complicated protocol known as VT100. In my recent project "Natural Tiny Shell (NT-Shell)" provides VT100 compatible terminal control features for small embedded systems. However, the middleware is still large for small embedded processors such as 8-bit MCUs, 16-bit MCUs and also for small 32-bit MCUs like Cortex-M0. This "MicroShell" middleware provides a minimal terminal control for the platforms.
core/microshell.c@0:e91b984e285d, 2017-02-05 (annotated)
- Committer:
- shintamainjp
- Date:
- Sun Feb 05 03:55:01 2017 +0000
- Revision:
- 0:e91b984e285d
first commitment.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shintamainjp | 0:e91b984e285d | 1 | /** |
shintamainjp | 0:e91b984e285d | 2 | * @file microshell.c |
shintamainjp | 0:e91b984e285d | 3 | * @author Shinichiro Nakamura (CuBeatSystems) |
shintamainjp | 0:e91b984e285d | 4 | * =============================================================== |
shintamainjp | 0:e91b984e285d | 5 | * MicroShell (Version 0.0.1) |
shintamainjp | 0:e91b984e285d | 6 | * Copyright (c) 2016, 2017 Shinichiro Nakamura (CuBeatSystems) |
shintamainjp | 0:e91b984e285d | 7 | * =============================================================== |
shintamainjp | 0:e91b984e285d | 8 | * The MIT License : https://opensource.org/licenses/MIT |
shintamainjp | 0:e91b984e285d | 9 | * |
shintamainjp | 0:e91b984e285d | 10 | * Copyright (c) 2016, 2017 Shinichiro Nakamura (CuBeatSystems) |
shintamainjp | 0:e91b984e285d | 11 | * |
shintamainjp | 0:e91b984e285d | 12 | * Permission is hereby granted, free of charge, to any person |
shintamainjp | 0:e91b984e285d | 13 | * obtaining a copy of this software and associated documentation |
shintamainjp | 0:e91b984e285d | 14 | * files (the "Software"), to deal in the Software without |
shintamainjp | 0:e91b984e285d | 15 | * restriction, including without limitation the rights to use, |
shintamainjp | 0:e91b984e285d | 16 | * copy, modify, merge, publish, distribute, sublicense, and/or |
shintamainjp | 0:e91b984e285d | 17 | * sell copies of the Software, and to permit persons to whom the |
shintamainjp | 0:e91b984e285d | 18 | * Software is furnished to do so, subject to the following |
shintamainjp | 0:e91b984e285d | 19 | * conditions: |
shintamainjp | 0:e91b984e285d | 20 | * |
shintamainjp | 0:e91b984e285d | 21 | * The above copyright notice and this permission notice shall be |
shintamainjp | 0:e91b984e285d | 22 | * included in all copies or substantial portions of the Software. |
shintamainjp | 0:e91b984e285d | 23 | * |
shintamainjp | 0:e91b984e285d | 24 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
shintamainjp | 0:e91b984e285d | 25 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
shintamainjp | 0:e91b984e285d | 26 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
shintamainjp | 0:e91b984e285d | 27 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
shintamainjp | 0:e91b984e285d | 28 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
shintamainjp | 0:e91b984e285d | 29 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
shintamainjp | 0:e91b984e285d | 30 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
shintamainjp | 0:e91b984e285d | 31 | * OTHER DEALINGS IN THE SOFTWARE. |
shintamainjp | 0:e91b984e285d | 32 | */ |
shintamainjp | 0:e91b984e285d | 33 | |
shintamainjp | 0:e91b984e285d | 34 | #include "microshell.h" |
shintamainjp | 0:e91b984e285d | 35 | |
shintamainjp | 0:e91b984e285d | 36 | #define PRINT_ACTION_ENABLED (0) |
shintamainjp | 0:e91b984e285d | 37 | #define PRINT_CODE_ENABLED (0) |
shintamainjp | 0:e91b984e285d | 38 | |
shintamainjp | 0:e91b984e285d | 39 | #if PRINT_ACTION_ENABLED |
shintamainjp | 0:e91b984e285d | 40 | |
shintamainjp | 0:e91b984e285d | 41 | static void uart_puts(MICROSHELL *handle, char *str) |
shintamainjp | 0:e91b984e285d | 42 | { |
shintamainjp | 0:e91b984e285d | 43 | while (*str) { |
shintamainjp | 0:e91b984e285d | 44 | handle->uart_putc(*str++); |
shintamainjp | 0:e91b984e285d | 45 | } |
shintamainjp | 0:e91b984e285d | 46 | } |
shintamainjp | 0:e91b984e285d | 47 | |
shintamainjp | 0:e91b984e285d | 48 | static void print_action(MICROSHELL *handle, MSCORE_ACTION action) |
shintamainjp | 0:e91b984e285d | 49 | { |
shintamainjp | 0:e91b984e285d | 50 | switch (action) { |
shintamainjp | 0:e91b984e285d | 51 | case MSCORE_ACTION_IGNORE: uart_puts(handle, "[IGNORE]"); break; |
shintamainjp | 0:e91b984e285d | 52 | case MSCORE_ACTION_DISPLAYABLE: uart_puts(handle, "[DISPLAYABLE]"); break; |
shintamainjp | 0:e91b984e285d | 53 | case MSCORE_ACTION_INSERT: uart_puts(handle, "[INSERT]"); break; |
shintamainjp | 0:e91b984e285d | 54 | case MSCORE_ACTION_ENTER: uart_puts(handle, "[ENTER]"); break; |
shintamainjp | 0:e91b984e285d | 55 | case MSCORE_ACTION_TAB: uart_puts(handle, "[TAB]"); break; |
shintamainjp | 0:e91b984e285d | 56 | case MSCORE_ACTION_BS: uart_puts(handle, "[BS]"); break; |
shintamainjp | 0:e91b984e285d | 57 | case MSCORE_ACTION_DEL: uart_puts(handle, "[DEL]"); break; |
shintamainjp | 0:e91b984e285d | 58 | case MSCORE_ACTION_CTRL_A: uart_puts(handle, "[Ctrl+A]"); break; |
shintamainjp | 0:e91b984e285d | 59 | case MSCORE_ACTION_CTRL_B: uart_puts(handle, "[Ctrl+B]"); break; |
shintamainjp | 0:e91b984e285d | 60 | case MSCORE_ACTION_CTRL_C: uart_puts(handle, "[Ctrl+C]"); break; |
shintamainjp | 0:e91b984e285d | 61 | case MSCORE_ACTION_CTRL_D: uart_puts(handle, "[Ctrl+D]"); break; |
shintamainjp | 0:e91b984e285d | 62 | case MSCORE_ACTION_CTRL_E: uart_puts(handle, "[Ctrl+E]"); break; |
shintamainjp | 0:e91b984e285d | 63 | case MSCORE_ACTION_CTRL_F: uart_puts(handle, "[Ctrl+F]"); break; |
shintamainjp | 0:e91b984e285d | 64 | case MSCORE_ACTION_CTRL_G: uart_puts(handle, "[Ctrl+G]"); break; |
shintamainjp | 0:e91b984e285d | 65 | case MSCORE_ACTION_CTRL_H: uart_puts(handle, "[Ctrl+H]"); break; |
shintamainjp | 0:e91b984e285d | 66 | case MSCORE_ACTION_CTRL_I: uart_puts(handle, "[Ctrl+I]"); break; |
shintamainjp | 0:e91b984e285d | 67 | case MSCORE_ACTION_CTRL_J: uart_puts(handle, "[Ctrl+J]"); break; |
shintamainjp | 0:e91b984e285d | 68 | case MSCORE_ACTION_CTRL_K: uart_puts(handle, "[Ctrl+K]"); break; |
shintamainjp | 0:e91b984e285d | 69 | case MSCORE_ACTION_CTRL_L: uart_puts(handle, "[Ctrl+L]"); break; |
shintamainjp | 0:e91b984e285d | 70 | case MSCORE_ACTION_CTRL_M: uart_puts(handle, "[Ctrl+M]"); break; |
shintamainjp | 0:e91b984e285d | 71 | case MSCORE_ACTION_CTRL_N: uart_puts(handle, "[Ctrl+N]"); break; |
shintamainjp | 0:e91b984e285d | 72 | case MSCORE_ACTION_CTRL_O: uart_puts(handle, "[Ctrl+O]"); break; |
shintamainjp | 0:e91b984e285d | 73 | case MSCORE_ACTION_CTRL_P: uart_puts(handle, "[Ctrl+P]"); break; |
shintamainjp | 0:e91b984e285d | 74 | case MSCORE_ACTION_CTRL_Q: uart_puts(handle, "[Ctrl+Q]"); break; |
shintamainjp | 0:e91b984e285d | 75 | case MSCORE_ACTION_CTRL_R: uart_puts(handle, "[Ctrl+R]"); break; |
shintamainjp | 0:e91b984e285d | 76 | case MSCORE_ACTION_CTRL_S: uart_puts(handle, "[Ctrl+S]"); break; |
shintamainjp | 0:e91b984e285d | 77 | case MSCORE_ACTION_CTRL_T: uart_puts(handle, "[Ctrl+T]"); break; |
shintamainjp | 0:e91b984e285d | 78 | case MSCORE_ACTION_CTRL_U: uart_puts(handle, "[Ctrl+U]"); break; |
shintamainjp | 0:e91b984e285d | 79 | case MSCORE_ACTION_CTRL_V: uart_puts(handle, "[Ctrl+V]"); break; |
shintamainjp | 0:e91b984e285d | 80 | case MSCORE_ACTION_CTRL_W: uart_puts(handle, "[Ctrl+W]"); break; |
shintamainjp | 0:e91b984e285d | 81 | case MSCORE_ACTION_CTRL_X: uart_puts(handle, "[Ctrl+X]"); break; |
shintamainjp | 0:e91b984e285d | 82 | case MSCORE_ACTION_CTRL_Y: uart_puts(handle, "[Ctrl+Y]"); break; |
shintamainjp | 0:e91b984e285d | 83 | case MSCORE_ACTION_CTRL_Z: uart_puts(handle, "[Ctrl+Z]"); break; |
shintamainjp | 0:e91b984e285d | 84 | case MSCORE_ACTION_F1: uart_puts(handle, "[F1]"); break; |
shintamainjp | 0:e91b984e285d | 85 | case MSCORE_ACTION_F2: uart_puts(handle, "[F2]"); break; |
shintamainjp | 0:e91b984e285d | 86 | case MSCORE_ACTION_F3: uart_puts(handle, "[F3]"); break; |
shintamainjp | 0:e91b984e285d | 87 | case MSCORE_ACTION_F4: uart_puts(handle, "[F4]"); break; |
shintamainjp | 0:e91b984e285d | 88 | case MSCORE_ACTION_F5: uart_puts(handle, "[F5]"); break; |
shintamainjp | 0:e91b984e285d | 89 | case MSCORE_ACTION_F6: uart_puts(handle, "[F6]"); break; |
shintamainjp | 0:e91b984e285d | 90 | case MSCORE_ACTION_F7: uart_puts(handle, "[F7]"); break; |
shintamainjp | 0:e91b984e285d | 91 | case MSCORE_ACTION_F8: uart_puts(handle, "[F8]"); break; |
shintamainjp | 0:e91b984e285d | 92 | case MSCORE_ACTION_F9: uart_puts(handle, "[F9]"); break; |
shintamainjp | 0:e91b984e285d | 93 | case MSCORE_ACTION_F10: uart_puts(handle, "[F10]"); break; |
shintamainjp | 0:e91b984e285d | 94 | case MSCORE_ACTION_F11: uart_puts(handle, "[F11]"); break; |
shintamainjp | 0:e91b984e285d | 95 | case MSCORE_ACTION_F12: uart_puts(handle, "[F12]"); break; |
shintamainjp | 0:e91b984e285d | 96 | case MSCORE_ACTION_ARROW_LEFT: uart_puts(handle, "[<]"); break; |
shintamainjp | 0:e91b984e285d | 97 | case MSCORE_ACTION_ARROW_RIGHT: uart_puts(handle, "[>]"); break; |
shintamainjp | 0:e91b984e285d | 98 | case MSCORE_ACTION_ARROW_UP: uart_puts(handle, "[UP]"); break; |
shintamainjp | 0:e91b984e285d | 99 | case MSCORE_ACTION_ARROW_DOWN: uart_puts(handle, "[DOWN]"); break; |
shintamainjp | 0:e91b984e285d | 100 | case MSCORE_ACTION_HOME: uart_puts(handle, "[HOME]"); break; |
shintamainjp | 0:e91b984e285d | 101 | case MSCORE_ACTION_END: uart_puts(handle, "[END]"); break; |
shintamainjp | 0:e91b984e285d | 102 | case MSCORE_ACTION_PAGE_UP: uart_puts(handle, "[PAGE UP]"); break; |
shintamainjp | 0:e91b984e285d | 103 | case MSCORE_ACTION_PAGE_DOWN: uart_puts(handle, "[PAGE DOWN]"); break; |
shintamainjp | 0:e91b984e285d | 104 | } |
shintamainjp | 0:e91b984e285d | 105 | } |
shintamainjp | 0:e91b984e285d | 106 | |
shintamainjp | 0:e91b984e285d | 107 | #endif |
shintamainjp | 0:e91b984e285d | 108 | |
shintamainjp | 0:e91b984e285d | 109 | #if PRINT_CODE_ENABLED |
shintamainjp | 0:e91b984e285d | 110 | |
shintamainjp | 0:e91b984e285d | 111 | static void print_code(MICROSHELL *handle, char c) |
shintamainjp | 0:e91b984e285d | 112 | { |
shintamainjp | 0:e91b984e285d | 113 | static const char *txt = "0123456789ABCDEF"; |
shintamainjp | 0:e91b984e285d | 114 | handle->uart_putc('['); |
shintamainjp | 0:e91b984e285d | 115 | handle->uart_putc('0'); |
shintamainjp | 0:e91b984e285d | 116 | handle->uart_putc('x'); |
shintamainjp | 0:e91b984e285d | 117 | handle->uart_putc(txt[(((unsigned char)c) >> 4) & 0x0F]); |
shintamainjp | 0:e91b984e285d | 118 | handle->uart_putc(txt[(((unsigned char)c) >> 0) & 0x0F]); |
shintamainjp | 0:e91b984e285d | 119 | handle->uart_putc(']'); |
shintamainjp | 0:e91b984e285d | 120 | } |
shintamainjp | 0:e91b984e285d | 121 | |
shintamainjp | 0:e91b984e285d | 122 | #endif |
shintamainjp | 0:e91b984e285d | 123 | |
shintamainjp | 0:e91b984e285d | 124 | static char *copy_forward(char *buf, int ofs_src, int ofs_des, int siz) |
shintamainjp | 0:e91b984e285d | 125 | { |
shintamainjp | 0:e91b984e285d | 126 | int i; |
shintamainjp | 0:e91b984e285d | 127 | char *p_src = buf + ofs_src; |
shintamainjp | 0:e91b984e285d | 128 | char *p_des = buf + ofs_des; |
shintamainjp | 0:e91b984e285d | 129 | for (i = 0; i < siz; i++) { |
shintamainjp | 0:e91b984e285d | 130 | *p_des++ = *p_src++; |
shintamainjp | 0:e91b984e285d | 131 | } |
shintamainjp | 0:e91b984e285d | 132 | return buf; |
shintamainjp | 0:e91b984e285d | 133 | } |
shintamainjp | 0:e91b984e285d | 134 | |
shintamainjp | 0:e91b984e285d | 135 | static char *copy_backward(char *buf, int ofs_src, int ofs_des, int siz) |
shintamainjp | 0:e91b984e285d | 136 | { |
shintamainjp | 0:e91b984e285d | 137 | int i; |
shintamainjp | 0:e91b984e285d | 138 | char *p_src = buf + ofs_src + siz; |
shintamainjp | 0:e91b984e285d | 139 | char *p_des = buf + ofs_des + siz; |
shintamainjp | 0:e91b984e285d | 140 | for (i = 0; i < siz; i++) { |
shintamainjp | 0:e91b984e285d | 141 | *p_des-- = *p_src--; |
shintamainjp | 0:e91b984e285d | 142 | } |
shintamainjp | 0:e91b984e285d | 143 | return buf; |
shintamainjp | 0:e91b984e285d | 144 | } |
shintamainjp | 0:e91b984e285d | 145 | |
shintamainjp | 0:e91b984e285d | 146 | static char *clean_buffer(char *buf, int siz) |
shintamainjp | 0:e91b984e285d | 147 | { |
shintamainjp | 0:e91b984e285d | 148 | int i; |
shintamainjp | 0:e91b984e285d | 149 | char *p = buf; |
shintamainjp | 0:e91b984e285d | 150 | for (i = 0; i < siz; i++) { |
shintamainjp | 0:e91b984e285d | 151 | *p++ = 0; |
shintamainjp | 0:e91b984e285d | 152 | } |
shintamainjp | 0:e91b984e285d | 153 | return buf; |
shintamainjp | 0:e91b984e285d | 154 | } |
shintamainjp | 0:e91b984e285d | 155 | |
shintamainjp | 0:e91b984e285d | 156 | static int print_buffer(MICROSHELL *handle, char *buf, int ofs) |
shintamainjp | 0:e91b984e285d | 157 | { |
shintamainjp | 0:e91b984e285d | 158 | int cnt = 0; |
shintamainjp | 0:e91b984e285d | 159 | char *p = buf + ofs; |
shintamainjp | 0:e91b984e285d | 160 | while (*p) { |
shintamainjp | 0:e91b984e285d | 161 | handle->uart_putc(*p++); |
shintamainjp | 0:e91b984e285d | 162 | cnt++; |
shintamainjp | 0:e91b984e285d | 163 | } |
shintamainjp | 0:e91b984e285d | 164 | return cnt; |
shintamainjp | 0:e91b984e285d | 165 | } |
shintamainjp | 0:e91b984e285d | 166 | |
shintamainjp | 0:e91b984e285d | 167 | static int print_char(MICROSHELL *handle, char c) |
shintamainjp | 0:e91b984e285d | 168 | { |
shintamainjp | 0:e91b984e285d | 169 | handle->uart_putc(c); |
shintamainjp | 0:e91b984e285d | 170 | return 1; |
shintamainjp | 0:e91b984e285d | 171 | } |
shintamainjp | 0:e91b984e285d | 172 | |
shintamainjp | 0:e91b984e285d | 173 | static void print_return(MICROSHELL *handle) |
shintamainjp | 0:e91b984e285d | 174 | { |
shintamainjp | 0:e91b984e285d | 175 | handle->uart_putc('\r'); |
shintamainjp | 0:e91b984e285d | 176 | handle->uart_putc('\n'); |
shintamainjp | 0:e91b984e285d | 177 | } |
shintamainjp | 0:e91b984e285d | 178 | |
shintamainjp | 0:e91b984e285d | 179 | static void cursor_left(MICROSHELL *handle, int n) |
shintamainjp | 0:e91b984e285d | 180 | { |
shintamainjp | 0:e91b984e285d | 181 | int i; |
shintamainjp | 0:e91b984e285d | 182 | for (i = 0; i < n; i++) { |
shintamainjp | 0:e91b984e285d | 183 | handle->uart_putc('\x1B'); |
shintamainjp | 0:e91b984e285d | 184 | handle->uart_putc('['); |
shintamainjp | 0:e91b984e285d | 185 | handle->uart_putc('D'); |
shintamainjp | 0:e91b984e285d | 186 | } |
shintamainjp | 0:e91b984e285d | 187 | } |
shintamainjp | 0:e91b984e285d | 188 | |
shintamainjp | 0:e91b984e285d | 189 | static void cursor_right(MICROSHELL *handle, int n) |
shintamainjp | 0:e91b984e285d | 190 | { |
shintamainjp | 0:e91b984e285d | 191 | int i; |
shintamainjp | 0:e91b984e285d | 192 | for (i = 0; i < n; i++) { |
shintamainjp | 0:e91b984e285d | 193 | handle->uart_putc('\x1B'); |
shintamainjp | 0:e91b984e285d | 194 | handle->uart_putc('['); |
shintamainjp | 0:e91b984e285d | 195 | handle->uart_putc('C'); |
shintamainjp | 0:e91b984e285d | 196 | } |
shintamainjp | 0:e91b984e285d | 197 | } |
shintamainjp | 0:e91b984e285d | 198 | |
shintamainjp | 0:e91b984e285d | 199 | void microshell_init(MICROSHELL *handle, MICROSHELL_UART_PUTC uart_putc, MICROSHELL_UART_GETC uart_getc, MICROSHELL_ACTION_HOOK action_hook) |
shintamainjp | 0:e91b984e285d | 200 | { |
shintamainjp | 0:e91b984e285d | 201 | mscore_init(&(handle->mscore)); |
shintamainjp | 0:e91b984e285d | 202 | handle->uart_putc = uart_putc; |
shintamainjp | 0:e91b984e285d | 203 | handle->uart_getc = uart_getc; |
shintamainjp | 0:e91b984e285d | 204 | handle->action_hook = action_hook; |
shintamainjp | 0:e91b984e285d | 205 | } |
shintamainjp | 0:e91b984e285d | 206 | |
shintamainjp | 0:e91b984e285d | 207 | char *microshell_getline(MICROSHELL *handle, char *buf, int siz) |
shintamainjp | 0:e91b984e285d | 208 | { |
shintamainjp | 0:e91b984e285d | 209 | char *ptr = buf; |
shintamainjp | 0:e91b984e285d | 210 | int pos = 0; |
shintamainjp | 0:e91b984e285d | 211 | int len = 0; |
shintamainjp | 0:e91b984e285d | 212 | clean_buffer(buf, siz); |
shintamainjp | 0:e91b984e285d | 213 | while (1) { |
shintamainjp | 0:e91b984e285d | 214 | char c = handle->uart_getc(); |
shintamainjp | 0:e91b984e285d | 215 | MSCORE_ACTION action = mscore_push(&(handle->mscore), c); |
shintamainjp | 0:e91b984e285d | 216 | if (handle->action_hook) { |
shintamainjp | 0:e91b984e285d | 217 | handle->action_hook(action); |
shintamainjp | 0:e91b984e285d | 218 | } |
shintamainjp | 0:e91b984e285d | 219 | #if PRINT_ACTION_ENABLED |
shintamainjp | 0:e91b984e285d | 220 | print_action(handle, action); |
shintamainjp | 0:e91b984e285d | 221 | #endif |
shintamainjp | 0:e91b984e285d | 222 | #if PRINT_CODE_ENABLED |
shintamainjp | 0:e91b984e285d | 223 | print_code(handle, c); |
shintamainjp | 0:e91b984e285d | 224 | #endif |
shintamainjp | 0:e91b984e285d | 225 | switch (action) { |
shintamainjp | 0:e91b984e285d | 226 | case MSCORE_ACTION_DISPLAYABLE: |
shintamainjp | 0:e91b984e285d | 227 | { |
shintamainjp | 0:e91b984e285d | 228 | int n = 0; |
shintamainjp | 0:e91b984e285d | 229 | copy_backward(buf, pos - 1, pos - 0, len - pos + 1); |
shintamainjp | 0:e91b984e285d | 230 | handle->uart_putc(c); |
shintamainjp | 0:e91b984e285d | 231 | *ptr++ = c; |
shintamainjp | 0:e91b984e285d | 232 | pos++; |
shintamainjp | 0:e91b984e285d | 233 | len++; |
shintamainjp | 0:e91b984e285d | 234 | n += print_buffer(handle, buf, pos); |
shintamainjp | 0:e91b984e285d | 235 | cursor_left(handle, n); |
shintamainjp | 0:e91b984e285d | 236 | if (len >= siz - 1) { |
shintamainjp | 0:e91b984e285d | 237 | print_return(handle); |
shintamainjp | 0:e91b984e285d | 238 | goto end; |
shintamainjp | 0:e91b984e285d | 239 | } |
shintamainjp | 0:e91b984e285d | 240 | } |
shintamainjp | 0:e91b984e285d | 241 | break; |
shintamainjp | 0:e91b984e285d | 242 | case MSCORE_ACTION_ENTER: |
shintamainjp | 0:e91b984e285d | 243 | case MSCORE_ACTION_CTRL_J: |
shintamainjp | 0:e91b984e285d | 244 | print_return(handle); |
shintamainjp | 0:e91b984e285d | 245 | goto end; |
shintamainjp | 0:e91b984e285d | 246 | break; |
shintamainjp | 0:e91b984e285d | 247 | case MSCORE_ACTION_CTRL_C: |
shintamainjp | 0:e91b984e285d | 248 | clean_buffer(buf, siz); |
shintamainjp | 0:e91b984e285d | 249 | print_char(handle, '^'); |
shintamainjp | 0:e91b984e285d | 250 | print_char(handle, 'C'); |
shintamainjp | 0:e91b984e285d | 251 | print_return(handle); |
shintamainjp | 0:e91b984e285d | 252 | goto end; |
shintamainjp | 0:e91b984e285d | 253 | break; |
shintamainjp | 0:e91b984e285d | 254 | case MSCORE_ACTION_BS: |
shintamainjp | 0:e91b984e285d | 255 | case MSCORE_ACTION_CTRL_H: |
shintamainjp | 0:e91b984e285d | 256 | if (pos > 0) { |
shintamainjp | 0:e91b984e285d | 257 | int n = 0; |
shintamainjp | 0:e91b984e285d | 258 | copy_forward(buf, pos, pos - 1, len - pos + 1); |
shintamainjp | 0:e91b984e285d | 259 | ptr--; |
shintamainjp | 0:e91b984e285d | 260 | pos--; |
shintamainjp | 0:e91b984e285d | 261 | len--; |
shintamainjp | 0:e91b984e285d | 262 | cursor_left(handle, 1); |
shintamainjp | 0:e91b984e285d | 263 | n += print_buffer(handle, buf, pos); |
shintamainjp | 0:e91b984e285d | 264 | n += print_char(handle, ' '); |
shintamainjp | 0:e91b984e285d | 265 | cursor_left(handle, n); |
shintamainjp | 0:e91b984e285d | 266 | } |
shintamainjp | 0:e91b984e285d | 267 | break; |
shintamainjp | 0:e91b984e285d | 268 | case MSCORE_ACTION_DEL: |
shintamainjp | 0:e91b984e285d | 269 | case MSCORE_ACTION_CTRL_D: |
shintamainjp | 0:e91b984e285d | 270 | if (len > 0) { |
shintamainjp | 0:e91b984e285d | 271 | int n = 0; |
shintamainjp | 0:e91b984e285d | 272 | copy_forward(buf, pos + 1, pos + 0, len - pos + 1); |
shintamainjp | 0:e91b984e285d | 273 | len--; |
shintamainjp | 0:e91b984e285d | 274 | n += print_buffer(handle, buf, pos); |
shintamainjp | 0:e91b984e285d | 275 | n += print_char(handle, ' '); |
shintamainjp | 0:e91b984e285d | 276 | cursor_left(handle, n); |
shintamainjp | 0:e91b984e285d | 277 | } |
shintamainjp | 0:e91b984e285d | 278 | break; |
shintamainjp | 0:e91b984e285d | 279 | case MSCORE_ACTION_ARROW_LEFT: |
shintamainjp | 0:e91b984e285d | 280 | case MSCORE_ACTION_CTRL_B: |
shintamainjp | 0:e91b984e285d | 281 | if (pos > 0) { |
shintamainjp | 0:e91b984e285d | 282 | ptr--; |
shintamainjp | 0:e91b984e285d | 283 | pos--; |
shintamainjp | 0:e91b984e285d | 284 | cursor_left(handle, 1); |
shintamainjp | 0:e91b984e285d | 285 | } |
shintamainjp | 0:e91b984e285d | 286 | break; |
shintamainjp | 0:e91b984e285d | 287 | case MSCORE_ACTION_ARROW_RIGHT: |
shintamainjp | 0:e91b984e285d | 288 | case MSCORE_ACTION_CTRL_F: |
shintamainjp | 0:e91b984e285d | 289 | if (pos < len) { |
shintamainjp | 0:e91b984e285d | 290 | ptr++; |
shintamainjp | 0:e91b984e285d | 291 | pos++; |
shintamainjp | 0:e91b984e285d | 292 | cursor_right(handle, 1); |
shintamainjp | 0:e91b984e285d | 293 | } |
shintamainjp | 0:e91b984e285d | 294 | break; |
shintamainjp | 0:e91b984e285d | 295 | case MSCORE_ACTION_HOME: |
shintamainjp | 0:e91b984e285d | 296 | case MSCORE_ACTION_CTRL_A: |
shintamainjp | 0:e91b984e285d | 297 | if (pos > 0) { |
shintamainjp | 0:e91b984e285d | 298 | int n = pos; |
shintamainjp | 0:e91b984e285d | 299 | ptr -= n; |
shintamainjp | 0:e91b984e285d | 300 | pos = 0; |
shintamainjp | 0:e91b984e285d | 301 | cursor_left(handle, n); |
shintamainjp | 0:e91b984e285d | 302 | } |
shintamainjp | 0:e91b984e285d | 303 | break; |
shintamainjp | 0:e91b984e285d | 304 | case MSCORE_ACTION_END: |
shintamainjp | 0:e91b984e285d | 305 | case MSCORE_ACTION_CTRL_E: |
shintamainjp | 0:e91b984e285d | 306 | if (pos < len) { |
shintamainjp | 0:e91b984e285d | 307 | int n = len - pos; |
shintamainjp | 0:e91b984e285d | 308 | ptr += n; |
shintamainjp | 0:e91b984e285d | 309 | pos = len; |
shintamainjp | 0:e91b984e285d | 310 | cursor_right(handle, n); |
shintamainjp | 0:e91b984e285d | 311 | } |
shintamainjp | 0:e91b984e285d | 312 | break; |
shintamainjp | 0:e91b984e285d | 313 | default: |
shintamainjp | 0:e91b984e285d | 314 | break; |
shintamainjp | 0:e91b984e285d | 315 | } |
shintamainjp | 0:e91b984e285d | 316 | } |
shintamainjp | 0:e91b984e285d | 317 | |
shintamainjp | 0:e91b984e285d | 318 | end: |
shintamainjp | 0:e91b984e285d | 319 | return buf; |
shintamainjp | 0:e91b984e285d | 320 | } |
shintamainjp | 0:e91b984e285d | 321 | |
shintamainjp | 0:e91b984e285d | 322 |