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.

Dependents:   MicroShellExample

Committer:
shintamainjp
Date:
Sun Feb 05 03:55:01 2017 +0000
Revision:
0:e91b984e285d
first commitment.

Who changed what in which revision?

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