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 mscore.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 "mscore.h"
beingblock 0:ff53d8f5146a 35 #include "msconf.h"
beingblock 0:ff53d8f5146a 36
beingblock 0:ff53d8f5146a 37 typedef char * MSCORE_STREAM;
beingblock 0:ff53d8f5146a 38
beingblock 0:ff53d8f5146a 39 typedef struct {
beingblock 0:ff53d8f5146a 40 MSCORE_STREAM stream;
beingblock 0:ff53d8f5146a 41 MSCORE_ACTION action;
beingblock 0:ff53d8f5146a 42 } MSCORE_KEYMAP;
beingblock 0:ff53d8f5146a 43
beingblock 0:ff53d8f5146a 44 static const MSCORE_KEYMAP kmlist[] = {
beingblock 0:ff53d8f5146a 45 #if MSCONF_KEYMAP_SWAP_BS_DEL
beingblock 0:ff53d8f5146a 46 { "\x7f", MSCORE_ACTION_BS },
beingblock 0:ff53d8f5146a 47 { "\x1b\x5b\x33\x7e", MSCORE_ACTION_DEL },
beingblock 0:ff53d8f5146a 48 #else
beingblock 0:ff53d8f5146a 49 { "\x08", MSCORE_ACTION_BS },
beingblock 0:ff53d8f5146a 50 { "\x7f", MSCORE_ACTION_DEL },
beingblock 0:ff53d8f5146a 51 #endif
beingblock 0:ff53d8f5146a 52 { "\x09", MSCORE_ACTION_TAB },
beingblock 0:ff53d8f5146a 53 { "\x1b\x5b\x32\x7e", MSCORE_ACTION_INSERT },
beingblock 0:ff53d8f5146a 54 { "\x0d", MSCORE_ACTION_ENTER },
beingblock 0:ff53d8f5146a 55 #if MSCONF_KEYMAP_USE_CTRL
beingblock 0:ff53d8f5146a 56 { "\x01", MSCORE_ACTION_CTRL_A },
beingblock 0:ff53d8f5146a 57 { "\x02", MSCORE_ACTION_CTRL_B },
beingblock 0:ff53d8f5146a 58 { "\x03", MSCORE_ACTION_CTRL_C },
beingblock 0:ff53d8f5146a 59 { "\x04", MSCORE_ACTION_CTRL_D },
beingblock 0:ff53d8f5146a 60 { "\x05", MSCORE_ACTION_CTRL_E },
beingblock 0:ff53d8f5146a 61 { "\x06", MSCORE_ACTION_CTRL_F },
beingblock 0:ff53d8f5146a 62 { "\x07", MSCORE_ACTION_CTRL_G },
beingblock 0:ff53d8f5146a 63 { "\x08", MSCORE_ACTION_CTRL_H },
beingblock 0:ff53d8f5146a 64 { "\x09", MSCORE_ACTION_CTRL_I },
beingblock 0:ff53d8f5146a 65 { "\x0a", MSCORE_ACTION_CTRL_J },
beingblock 0:ff53d8f5146a 66 { "\x0b", MSCORE_ACTION_CTRL_K },
beingblock 0:ff53d8f5146a 67 { "\x0c", MSCORE_ACTION_CTRL_L },
beingblock 0:ff53d8f5146a 68 { "\x0d", MSCORE_ACTION_CTRL_M },
beingblock 0:ff53d8f5146a 69 { "\x0e", MSCORE_ACTION_CTRL_N },
beingblock 0:ff53d8f5146a 70 { "\x0f", MSCORE_ACTION_CTRL_O },
beingblock 0:ff53d8f5146a 71 { "\x10", MSCORE_ACTION_CTRL_P },
beingblock 0:ff53d8f5146a 72 { "\x11", MSCORE_ACTION_CTRL_Q },
beingblock 0:ff53d8f5146a 73 { "\x12", MSCORE_ACTION_CTRL_R },
beingblock 0:ff53d8f5146a 74 { "\x13", MSCORE_ACTION_CTRL_S },
beingblock 0:ff53d8f5146a 75 { "\x14", MSCORE_ACTION_CTRL_T },
beingblock 0:ff53d8f5146a 76 { "\x15", MSCORE_ACTION_CTRL_U },
beingblock 0:ff53d8f5146a 77 { "\x16", MSCORE_ACTION_CTRL_V },
beingblock 0:ff53d8f5146a 78 { "\x17", MSCORE_ACTION_CTRL_W },
beingblock 0:ff53d8f5146a 79 { "\x18", MSCORE_ACTION_CTRL_X },
beingblock 0:ff53d8f5146a 80 { "\x19", MSCORE_ACTION_CTRL_Y },
beingblock 0:ff53d8f5146a 81 { "\x1a", MSCORE_ACTION_CTRL_Z },
beingblock 0:ff53d8f5146a 82 #endif
beingblock 0:ff53d8f5146a 83 #if MSCONF_KEYMAP_USE_FUNCTION
beingblock 0:ff53d8f5146a 84 { "\x1b\x5b\x31\x31\x7e", MSCORE_ACTION_F1 },
beingblock 0:ff53d8f5146a 85 { "\x1b\x5b\x31\x32\x7e", MSCORE_ACTION_F2 },
beingblock 0:ff53d8f5146a 86 { "\x1b\x5b\x31\x33\x7e", MSCORE_ACTION_F3 },
beingblock 0:ff53d8f5146a 87 { "\x1b\x5b\x31\x34\x7e", MSCORE_ACTION_F4 },
beingblock 0:ff53d8f5146a 88 { "\x1b\x5b\x31\x35\x7e", MSCORE_ACTION_F5 },
beingblock 0:ff53d8f5146a 89 { "\x1b\x5b\x31\x37\x7e", MSCORE_ACTION_F6 },
beingblock 0:ff53d8f5146a 90 { "\x1b\x5b\x31\x38\x7e", MSCORE_ACTION_F7 },
beingblock 0:ff53d8f5146a 91 { "\x1b\x5b\x31\x39\x7e", MSCORE_ACTION_F8 },
beingblock 0:ff53d8f5146a 92 { "\x1b\x5b\x32\x30\x7e", MSCORE_ACTION_F9 },
beingblock 0:ff53d8f5146a 93 { "\x1b\x5b\x32\x31\x7e", MSCORE_ACTION_F10 },
beingblock 0:ff53d8f5146a 94 { "\x1b\x5b\x32\x32\x7e", MSCORE_ACTION_F11 },
beingblock 0:ff53d8f5146a 95 { "\x1b\x5b\x32\x33\x7e", MSCORE_ACTION_F12 },
beingblock 0:ff53d8f5146a 96 { "\x1b\x4f\x50", MSCORE_ACTION_F1 },
beingblock 0:ff53d8f5146a 97 { "\x1b\x4f\x51", MSCORE_ACTION_F2 },
beingblock 0:ff53d8f5146a 98 { "\x1b\x4f\x52", MSCORE_ACTION_F3 },
beingblock 0:ff53d8f5146a 99 { "\x1b\x4f\x53", MSCORE_ACTION_F4 },
beingblock 0:ff53d8f5146a 100 { "\x1b\x5b\x31\x35\x7e", MSCORE_ACTION_F5 },
beingblock 0:ff53d8f5146a 101 { "\x1b\x5b\x31\x37\x7e", MSCORE_ACTION_F6 },
beingblock 0:ff53d8f5146a 102 { "\x1b\x5b\x31\x38\x7e", MSCORE_ACTION_F7 },
beingblock 0:ff53d8f5146a 103 { "\x1b\x5b\x31\x39\x7e", MSCORE_ACTION_F8 },
beingblock 0:ff53d8f5146a 104 { "\x1b\x5b\x32\x31\x7e", MSCORE_ACTION_F9 },
beingblock 0:ff53d8f5146a 105 { "\x1b\x5b\x32\x32\x7e", MSCORE_ACTION_F10 },
beingblock 0:ff53d8f5146a 106 { "\x1b\x5b\x32\x33\x7e", MSCORE_ACTION_F11 },
beingblock 0:ff53d8f5146a 107 { "\x1b\x5b\x32\x34\x7e", MSCORE_ACTION_F12 },
beingblock 0:ff53d8f5146a 108 #endif
beingblock 0:ff53d8f5146a 109 #if MSCONF_KEYMAP_USE_ARROW
beingblock 0:ff53d8f5146a 110 { "\x1b\x5b\x41", MSCORE_ACTION_ARROW_UP },
beingblock 0:ff53d8f5146a 111 { "\x1b\x5b\x42", MSCORE_ACTION_ARROW_DOWN },
beingblock 0:ff53d8f5146a 112 { "\x1b\x5b\x43", MSCORE_ACTION_ARROW_RIGHT },
beingblock 0:ff53d8f5146a 113 { "\x1b\x5b\x44", MSCORE_ACTION_ARROW_LEFT },
beingblock 0:ff53d8f5146a 114 #endif
beingblock 0:ff53d8f5146a 115 #if MSCONF_KEYMAP_USE_HOME_END
beingblock 0:ff53d8f5146a 116 { "\x1b\x4f\x48", MSCORE_ACTION_HOME },
beingblock 0:ff53d8f5146a 117 { "\x1b\x4f\x46", MSCORE_ACTION_END },
beingblock 0:ff53d8f5146a 118 { "\x1b[1~", MSCORE_ACTION_HOME },
beingblock 0:ff53d8f5146a 119 { "\x1b[4~", MSCORE_ACTION_END },
beingblock 0:ff53d8f5146a 120 #endif
beingblock 0:ff53d8f5146a 121 #if MSCONF_KEYMAP_USE_PAGE
beingblock 0:ff53d8f5146a 122 { "\x1b\x5b\x35\x7e", MSCORE_ACTION_PAGE_UP },
beingblock 0:ff53d8f5146a 123 { "\x1b\x5b\x36\x7e", MSCORE_ACTION_PAGE_DOWN },
beingblock 0:ff53d8f5146a 124 #endif
beingblock 0:ff53d8f5146a 125 };
beingblock 0:ff53d8f5146a 126
beingblock 0:ff53d8f5146a 127 static int buf_length(char *buf)
beingblock 0:ff53d8f5146a 128 {
beingblock 0:ff53d8f5146a 129 int n = 0;
beingblock 0:ff53d8f5146a 130 while (*buf++) {
beingblock 0:ff53d8f5146a 131 n++;
beingblock 0:ff53d8f5146a 132 }
beingblock 0:ff53d8f5146a 133 return n;
beingblock 0:ff53d8f5146a 134 }
beingblock 0:ff53d8f5146a 135
beingblock 0:ff53d8f5146a 136 static int buf_match(char *a, char *b, int n)
beingblock 0:ff53d8f5146a 137 {
beingblock 0:ff53d8f5146a 138 int i;
beingblock 0:ff53d8f5146a 139 for (i = 0; i < n; i++) {
beingblock 0:ff53d8f5146a 140 if (*a++ != *b++) {
beingblock 0:ff53d8f5146a 141 return 0;
beingblock 0:ff53d8f5146a 142 }
beingblock 0:ff53d8f5146a 143 }
beingblock 0:ff53d8f5146a 144 return 1;
beingblock 0:ff53d8f5146a 145 }
beingblock 0:ff53d8f5146a 146
beingblock 0:ff53d8f5146a 147 static int buf_clear(char *buf, int n)
beingblock 0:ff53d8f5146a 148 {
beingblock 0:ff53d8f5146a 149 int i;
beingblock 0:ff53d8f5146a 150 for (i = 0; i < n; i++) {
beingblock 0:ff53d8f5146a 151 buf[i] = 0;
beingblock 0:ff53d8f5146a 152 }
beingblock 0:ff53d8f5146a 153 return 1;
beingblock 0:ff53d8f5146a 154 }
beingblock 0:ff53d8f5146a 155
beingblock 0:ff53d8f5146a 156 void mscore_init(MSCORE *handle)
beingblock 0:ff53d8f5146a 157 {
beingblock 0:ff53d8f5146a 158 buf_clear(handle->keybuf, MSCORE_BUFFER_SIZE);
beingblock 0:ff53d8f5146a 159 handle->keycnt = 0;
beingblock 0:ff53d8f5146a 160 }
beingblock 0:ff53d8f5146a 161
beingblock 0:ff53d8f5146a 162 MSCORE_ACTION mscore_push(MSCORE *handle, char c)
beingblock 0:ff53d8f5146a 163 {
beingblock 0:ff53d8f5146a 164 int match = 0;
beingblock 0:ff53d8f5146a 165 handle->keybuf[handle->keycnt++] = c;
beingblock 0:ff53d8f5146a 166 const MSCORE_KEYMAP *p = &kmlist[0];
beingblock 0:ff53d8f5146a 167 const int N = sizeof(kmlist) / sizeof(kmlist[0]);
beingblock 0:ff53d8f5146a 168 int i;
beingblock 0:ff53d8f5146a 169 for (i = 0; i < N; i++) {
beingblock 0:ff53d8f5146a 170 if (handle->keycnt == buf_length(p->stream)) {
beingblock 0:ff53d8f5146a 171 if (buf_match(p->stream, handle->keybuf, handle->keycnt)) {
beingblock 0:ff53d8f5146a 172 handle->keycnt = 0;
beingblock 0:ff53d8f5146a 173 buf_clear(handle->keybuf, MSCORE_BUFFER_SIZE);
beingblock 0:ff53d8f5146a 174 return p->action;
beingblock 0:ff53d8f5146a 175 }
beingblock 0:ff53d8f5146a 176 } else {
beingblock 0:ff53d8f5146a 177 if (buf_match(p->stream, handle->keybuf, handle->keycnt)) {
beingblock 0:ff53d8f5146a 178 match = 1;
beingblock 0:ff53d8f5146a 179 break;
beingblock 0:ff53d8f5146a 180 }
beingblock 0:ff53d8f5146a 181 }
beingblock 0:ff53d8f5146a 182 p++;
beingblock 0:ff53d8f5146a 183 }
beingblock 0:ff53d8f5146a 184 if (!match) {
beingblock 0:ff53d8f5146a 185 handle->keycnt = 0;
beingblock 0:ff53d8f5146a 186 buf_clear(handle->keybuf, MSCORE_BUFFER_SIZE);
beingblock 0:ff53d8f5146a 187 if ((' ' <= c) && (c <= '~')) {
beingblock 0:ff53d8f5146a 188 return MSCORE_ACTION_DISPLAYABLE;
beingblock 0:ff53d8f5146a 189 }
beingblock 0:ff53d8f5146a 190 }
beingblock 0:ff53d8f5146a 191 return MSCORE_ACTION_IGNORE;
beingblock 0:ff53d8f5146a 192 }
beingblock 0:ff53d8f5146a 193