Changeset da2bd08 in mainline for uspace/app/bdsh/input.c
- Timestamp:
- 2009-11-29T14:53:18Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 272f88f0, 8b5001b
- Parents:
- 025759c
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/bdsh/input.c
r025759c rda2bd08 38 38 #include <vfs/vfs.h> 39 39 #include <errno.h> 40 #include <assert.h> 40 41 #include <bool.h> 41 42 … … 47 48 #include "exec.h" 48 49 50 #define HISTORY_LEN 10 51 49 52 typedef struct { 50 53 wchar_t buffer[INPUT_MAX]; … … 53 56 int nc; 54 57 int pos; 58 59 char *history[1 + HISTORY_LEN]; 60 int hnum; 61 int hpos; 55 62 } tinput_t; 56 63 … … 125 132 } 126 133 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 127 147 static void tinput_position_caret(tinput_t *ti) 128 148 { … … 235 255 236 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; 237 316 } 238 317 … … 295 374 tinput_seek_max(ti, seek_forward); 296 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; 297 382 } 298 383 } … … 306 391 putchar('\n'); 307 392 308 ti->buffer[ti->nc] = '\0'; 309 str = malloc(STR_BOUNDS(ti->nc) + 1); 310 if (str == NULL) 311 return NULL; 312 313 wstr_nstr(str, ti->buffer, STR_BOUNDS(ti->nc) + 1); 393 str = tinput_get_str(ti); 394 if (str_cmp(str, "") != 0) 395 tinput_history_insert(ti, str); 396 397 ti->hpos = 0; 314 398 315 399 return str; … … 337 421 return; 338 422 } 423 424 void input_init(void) 425 { 426 tinput_init(&tinput); 427 }
Note:
See TracChangeset
for help on using the changeset viewer.