Changes in / [272f88f0:a1622091] in mainline
- Location:
- uspace
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/bdsh/input.c
r272f88f0 ra1622091 38 38 #include <vfs/vfs.h> 39 39 #include <errno.h> 40 #include <assert.h>41 40 #include <bool.h> 42 41 … … 48 47 #include "exec.h" 49 48 50 #define HISTORY_LEN 1051 52 49 typedef struct { 53 50 wchar_t buffer[INPUT_MAX]; … … 56 53 int nc; 57 54 int pos; 58 59 char *history[1 + HISTORY_LEN];60 int hnum;61 int hpos;62 55 } tinput_t; 56 57 typedef enum { 58 seek_cell, 59 seek_max 60 } seek_dist_t; 63 61 64 62 typedef enum { … … 132 130 } 133 131 134 static char *tinput_get_str(tinput_t *ti)135 {136 char *str;137 138 str = malloc(STR_BOUNDS(ti->nc) + 1);139 if (str == NULL)140 return NULL;141 142 wstr_nstr(str, ti->buffer, STR_BOUNDS(ti->nc) + 1);143 144 return str;145 }146 147 132 static void tinput_position_caret(tinput_t *ti) 148 133 { … … 198 183 } 199 184 200 static void tinput_seek_cell(tinput_t *ti, seek_dir_t dir) 201 { 202 if (dir == seek_forward) { 203 if (ti->pos < ti->nc) 204 ti->pos += 1; 205 } else { 206 if (ti->pos > 0) 207 ti->pos -= 1; 208 } 185 static void tinput_seek(tinput_t *ti, seek_dir_t dir, seek_dist_t dist) 186 { 187 switch (dist) { 188 case seek_cell: 189 ti->pos += dir; 190 break; 191 case seek_max: 192 if (dir == seek_backward) 193 ti->pos = 0; 194 else 195 ti->pos = ti->nc; 196 break; 197 } 198 199 if (ti->pos < 0) ti->pos = 0; 200 if (ti->pos > ti->nc) ti->pos = ti->nc; 209 201 210 202 tinput_position_caret(ti); 211 }212 213 static void tinput_seek_word(tinput_t *ti, seek_dir_t dir)214 {215 if (dir == seek_forward) {216 if (ti->pos == ti->nc)217 return;218 219 while (1) {220 ti->pos += 1;221 222 if (ti->pos == ti->nc)223 break;224 225 if (ti->buffer[ti->pos - 1] == ' ' &&226 ti->buffer[ti->pos] != ' ')227 break;228 }229 } else {230 if (ti->pos == 0)231 return;232 233 while (1) {234 ti->pos -= 1;235 236 if (ti->pos == 0)237 break;238 239 if (ti->buffer[ti->pos - 1] == ' ' &&240 ti->buffer[ti->pos] != ' ')241 break;242 }243 244 }245 246 tinput_position_caret(ti);247 }248 249 static void tinput_seek_max(tinput_t *ti, seek_dir_t dir)250 {251 if (dir == seek_backward)252 ti->pos = 0;253 else254 ti->pos = ti->nc;255 256 tinput_position_caret(ti);257 }258 259 static void tinput_history_insert(tinput_t *ti, char *str)260 {261 int i;262 263 if (ti->hnum < HISTORY_LEN) {264 ti->hnum += 1;265 } else {266 if (ti->history[HISTORY_LEN] != NULL)267 free(ti->history[HISTORY_LEN]);268 }269 270 for (i = ti->hnum; i > 1; --i)271 ti->history[i] = ti->history[i - 1];272 273 ti->history[1] = str_dup(str);274 275 if (ti->history[0] != NULL) {276 free(ti->history[0]);277 ti->history[0] = NULL;278 }279 }280 281 static void tinput_set_str(tinput_t *ti, char *str)282 {283 str_to_wstr(ti->buffer, INPUT_MAX, str);284 ti->nc = wstr_length(ti->buffer);285 ti->pos = ti->nc;286 }287 288 static void tinput_history_seek(tinput_t *ti, int offs)289 {290 int pad;291 292 if (ti->hpos + offs < 0 || ti->hpos + offs > ti->hnum)293 return;294 295 if (ti->history[ti->hpos] != NULL) {296 free(ti->history[ti->hpos]);297 ti->history[ti->hpos] = NULL;298 }299 300 ti->history[ti->hpos] = tinput_get_str(ti);301 ti->hpos += offs;302 303 pad = ti->nc - str_length(ti->history[ti->hpos]);304 if (pad < 0) pad = 0;305 306 tinput_set_str(ti, ti->history[ti->hpos]);307 tinput_display_tail(ti, 0, pad);308 tinput_position_caret(ti);309 }310 311 static void tinput_init(tinput_t *ti)312 {313 ti->hnum = 0;314 ti->hpos = 0;315 ti->history[0] = NULL;316 203 } 317 204 … … 339 226 continue; 340 227 341 if ((ev.mods & KM_CTRL) != 0 && 342 (ev.mods & (KM_ALT | KM_SHIFT)) == 0) { 343 switch (ev.key) { 344 case KC_LEFT: 345 tinput_seek_word(ti, seek_backward); 346 break; 347 case KC_RIGHT: 348 tinput_seek_word(ti, seek_forward); 349 break; 350 } 228 if ((ev.mods & (KM_CTRL | KM_ALT | KM_SHIFT)) != 0) 229 continue; 230 231 switch(ev.key) { 232 case KC_ENTER: 233 case KC_NENTER: 234 goto done; 235 case KC_BACKSPACE: 236 tinput_backspace(ti); 237 break; 238 case KC_DELETE: 239 tinput_delete(ti); 240 break; 241 case KC_LEFT: 242 tinput_seek(ti, seek_backward, seek_cell); 243 break; 244 case KC_RIGHT: 245 tinput_seek(ti, seek_forward, seek_cell); 246 247 break; 248 case KC_HOME: 249 tinput_seek(ti, seek_backward, seek_max); 250 break; 251 case KC_END: 252 tinput_seek(ti, seek_forward, seek_max); 253 break; 351 254 } 352 353 if ((ev.mods & (KM_CTRL | KM_ALT | KM_SHIFT)) == 0) {354 switch (ev.key) {355 case KC_ENTER:356 case KC_NENTER:357 goto done;358 case KC_BACKSPACE:359 tinput_backspace(ti);360 break;361 case KC_DELETE:362 tinput_delete(ti);363 break;364 case KC_LEFT:365 tinput_seek_cell(ti, seek_backward);366 break;367 case KC_RIGHT:368 tinput_seek_cell(ti, seek_forward);369 break;370 case KC_HOME:371 tinput_seek_max(ti, seek_backward);372 break;373 case KC_END:374 tinput_seek_max(ti, seek_forward);375 break;376 case KC_UP:377 tinput_history_seek(ti, +1);378 break;379 case KC_DOWN:380 tinput_history_seek(ti, -1);381 break;382 }383 }384 385 255 if (ev.c >= ' ') { 386 256 tinput_insert_char(ti, ev.c); … … 391 261 putchar('\n'); 392 262 393 str = tinput_get_str(ti); 394 if (str_cmp(str, "") != 0) 395 tinput_history_insert(ti, str); 396 397 ti->hpos = 0; 263 ti->buffer[ti->nc] = '\0'; 264 str = malloc(STR_BOUNDS(ti->nc) + 1); 265 if (str == NULL) 266 return NULL; 267 268 wstr_nstr(str, ti->buffer, STR_BOUNDS(ti->nc) + 1); 398 269 399 270 return str; … … 421 292 return; 422 293 } 423 424 void input_init(void)425 {426 tinput_init(&tinput);427 } -
uspace/app/bdsh/input.h
r272f88f0 ra1622091 8 8 extern void get_input(cliuser_t *); 9 9 extern int tok_input(cliuser_t *); 10 extern void input_init(void);11 10 12 11 #endif -
uspace/app/bdsh/scli.c
r272f88f0 ra1622091 64 64 usr->prompt = (char *) NULL; 65 65 usr->lasterr = 0; 66 67 input_init();68 69 66 return (int) cli_set_prompt(usr); 70 67 } -
uspace/lib/libc/generic/string.c
r272f88f0 ra1622091 583 583 } 584 584 585 /** Convert string to wide string.586 *587 * Convert string @a src to wide string. The output is written to the588 * buffer specified by @a dest and @a size, which must have non-zero589 * size. The output will always be null-terminated.590 *591 * @param dest Destination buffer.592 * @param dlen Length of destination buffer (number of wchars).593 * @param src Source string.594 */595 void str_to_wstr(wchar_t *dest, size_t dlen, const char *src)596 {597 size_t offset;598 size_t di;599 wchar_t c;600 601 assert(dlen > 0);602 603 offset = 0;604 di = 0;605 606 do {607 if (di >= dlen - 1)608 break;609 610 c = str_decode(src, &offset, STR_NO_LIMIT);611 dest[di++] = c;612 } while (c != '\0');613 614 dest[dlen - 1] = '\0';615 }616 617 585 /** Find first occurence of character in string. 618 586 * -
uspace/lib/libc/include/string.h
r272f88f0 ra1622091 74 74 75 75 extern void wstr_nstr(char *dst, const wchar_t *src, size_t size); 76 extern void str_to_wstr(wchar_t *dest, size_t dlen, const char *src);77 76 78 77 extern char *str_chr(const char *str, wchar_t ch);
Note:
See TracChangeset
for help on using the changeset viewer.