MicroShellというライブラリのバッファ編集機能に惹かれて強引にSerialクラスっぽくラップしたもの

https://www.cubeatsystems.com/microshell/index.html 様に感謝 やっつけすぎて申し訳ないが技量が足りない...

Committer:
beingblock
Date:
Thu Oct 19 07:39:57 2017 +0000
Revision:
0:ff53d8f5146a
??

Who changed what in which revision?

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