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