Changes in / [f0348c8:33fc3ae] in mainline
- Files:
-
- 3 deleted
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/Makefile
rf0348c8 r33fc3ae 196 196 generic/src/console/chardev.c \ 197 197 generic/src/console/console.c \ 198 generic/src/console/prompt.c \199 198 generic/src/cpu/cpu.c \ 200 199 generic/src/ddi/ddi.c \ -
kernel/generic/include/debug.h
rf0348c8 r33fc3ae 37 37 38 38 #include <panic.h> 39 #include <symtab _lookup.h>39 #include <symtab.h> 40 40 41 41 #define CALLER ((uintptr_t) __builtin_return_address(0)) -
kernel/generic/include/symtab.h
rf0348c8 r33fc3ae 36 36 #define KERN_SYMTAB_H_ 37 37 38 #include <symtab_lookup.h> 39 #include <console/chardev.h> 38 #include <typedefs.h> 40 39 40 #define MAX_SYMBOL_NAME 64 41 42 struct symtab_entry { 43 uint64_t address_le; 44 char symbol_name[MAX_SYMBOL_NAME]; 45 }; 46 47 extern int symtab_name_lookup(uintptr_t, const char **, uintptr_t *); 48 extern const char *symtab_fmt_name_lookup(uintptr_t); 49 extern int symtab_addr_lookup(const char *, uintptr_t *); 41 50 extern void symtab_print_search(const char *); 42 extern int symtab_compl(char *, size_t, indev_t *); 51 extern int symtab_compl(char *, size_t); 52 53 #ifdef CONFIG_SYMTAB 54 55 /** Symtable linked together by build process 56 * 57 */ 58 extern struct symtab_entry symbol_table[]; 59 60 #endif /* CONFIG_SYMTAB */ 43 61 44 62 #endif -
kernel/generic/src/console/kconsole.c
rf0348c8 r33fc3ae 43 43 #include <console/chardev.h> 44 44 #include <console/cmd.h> 45 #include <console/prompt.h>46 45 #include <print.h> 47 46 #include <panic.h> … … 202 201 * 203 202 */ 204 NO_TRACE static int cmdtab_compl(char *input, size_t size , indev_t * indev)203 NO_TRACE static int cmdtab_compl(char *input, size_t size) 205 204 { 206 205 const char *name = input; 207 206 208 207 size_t found = 0; 209 /* Maximum Match Length : Length of longest matching common substring in210 case more than one match is found */211 size_t max_match_len = size;212 size_t max_match_len_tmp = size;213 size_t input_len = str_length(input);214 208 link_t *pos = NULL; 215 209 const char *hint; 216 210 char *output = malloc(MAX_CMDLINE, 0); 217 size_t hints_to_show = MAX_TAB_HINTS - 1;218 size_t total_hints_shown = 0;219 bool continue_showing_hints = true;220 211 221 212 output[0] = 0; … … 227 218 pos = pos->next; 228 219 found++; 229 }230 231 /* If possible completions are more than MAX_TAB_HINTS, ask user whether to display them or not. */232 if (found > MAX_TAB_HINTS) {233 printf("\n");234 continue_showing_hints = console_prompt_display_all_hints(indev, found);235 220 } 236 221 … … 240 225 while (cmdtab_search_one(name, &pos)) { 241 226 cmd_info_t *hlp = list_get_instance(pos, cmd_info_t, link); 242 243 if (continue_showing_hints) { 244 printf("%s (%s)\n", hlp->name, hlp->description); 245 --hints_to_show; 246 ++total_hints_shown; 247 248 if (hints_to_show == 0 && total_hints_shown != found) { /* Time to ask user to continue */ 249 continue_showing_hints = console_prompt_more_hints(indev, &hints_to_show); 250 } 251 } 252 227 printf("%s (%s)\n", hlp->name, hlp->description); 253 228 pos = pos->next; 254 for(max_match_len_tmp = 0; output[max_match_len_tmp] == hlp->name[input_len + max_match_len_tmp] 255 && max_match_len_tmp < max_match_len; ++max_match_len_tmp); 256 max_match_len = max_match_len_tmp; 257 } 258 /* keep only the characters common in all completions */ 259 output[max_match_len] = 0; 229 } 260 230 } 261 231 … … 324 294 if (beg == 0) { 325 295 /* Command completion */ 326 found = cmdtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE) , indev);296 found = cmdtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE)); 327 297 } else { 328 298 /* Symbol completion */ 329 found = symtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE) , indev);299 found = symtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE)); 330 300 } 331 301 332 302 if (found == 0) 333 303 continue; 334 335 /* We have hints, may be many. In case of more than one hint, 336 tmp will contain the common prefix. */ 304 305 if (found > 1) { 306 /* No unique hint, list was printed */ 307 printf("%s> ", prompt); 308 printf("%ls", current); 309 print_cc('\b', wstr_length(current) - position); 310 continue; 311 } 312 313 /* We have a hint */ 314 337 315 size_t off = 0; 338 316 size_t i = 0; … … 342 320 i++; 343 321 } 344 345 if (found > 1) {346 /* No unique hint, list was printed */347 printf("%s> ", prompt);348 printf("%ls", current);349 position += str_length(tmp);350 print_cc('\b', wstr_length(current) - position);351 continue;352 }353 354 /* We have a hint */355 322 356 323 printf("%ls", current + position); … … 573 540 /** Parse command line. 574 541 * 575 * @param cmdline Command line as read from input device. 542 * @param cmdline Command line as read from input device. 576 543 * @param size Size (in bytes) of the string. 577 544 * -
kernel/generic/src/debug/symtab.c
rf0348c8 r33fc3ae 43 43 #include <typedefs.h> 44 44 #include <errno.h> 45 #include <console/prompt.h>46 45 47 46 /** Get name of a symbol that seems most likely to correspond to address. … … 210 209 * 211 210 */ 212 int symtab_compl(char *input, size_t size , indev_t * indev)211 int symtab_compl(char *input, size_t size) 213 212 { 214 213 #ifdef CONFIG_SYMTAB … … 227 226 const char *hint; 228 227 char output[MAX_SYMBOL_NAME]; 229 /* Maximum Match Length : Length of longest matching common substring in230 case more than one match is found */231 size_t max_match_len = size;232 size_t max_match_len_tmp = size;233 size_t input_len = str_length(input);234 char *sym_name;235 size_t hints_to_show = MAX_TAB_HINTS - 1;236 size_t total_hints_shown = 0;237 bool continue_showing_hints = true;238 228 239 229 output[0] = 0; 240 241 while ((hint = symtab_search_one(name, &pos))) {242 ++pos;243 }244 245 pos = 0;246 230 247 231 while ((hint = symtab_search_one(name, &pos))) { … … 251 235 pos++; 252 236 found++; 253 }254 255 /* If possible completions are more than MAX_TAB_HINTS, ask user whether to display them or not. */256 if (found > MAX_TAB_HINTS) {257 printf("\n");258 continue_showing_hints = console_prompt_display_all_hints(indev, found);259 237 } 260 238 … … 263 241 pos = 0; 264 242 while (symtab_search_one(name, &pos)) { 265 sym_name = symbol_table[pos].symbol_name;243 printf("%s\n", symbol_table[pos].symbol_name); 266 244 pos++; 267 268 if (continue_showing_hints) { /* We are still showing hints */269 printf("%s\n", sym_name);270 --hints_to_show;271 ++total_hints_shown;272 273 if (hints_to_show == 0 && total_hints_shown != found) { /* Time to ask user to continue */274 continue_showing_hints = console_prompt_more_hints(indev, &hints_to_show);275 }276 }277 278 for(max_match_len_tmp = 0; output[max_match_len_tmp] == sym_name[input_len + max_match_len_tmp]279 && max_match_len_tmp < max_match_len; ++max_match_len_tmp);280 max_match_len = max_match_len_tmp;281 245 } 282 /* keep only the characters common in all completions */283 output[max_match_len] = 0;284 246 } 285 247 -
uspace/app/bdsh/cmds/modules/cat/cat.c
rf0348c8 r33fc3ae 62 62 static sysarg_t console_rows = 0; 63 63 static bool should_quit = false; 64 static bool dash_represents_stdin = false;65 64 66 65 static console_ctrl_t *console = NULL; … … 74 73 { "more", no_argument, 0, 'm' }, 75 74 { "hex", no_argument, 0, 'x' }, 76 { "stdin", no_argument, 0, 's' },77 75 { 0, 0, 0, 0 } 78 76 }; … … 95 93 " -m, --more Pause after each screen full\n" 96 94 " -x, --hex Print bytes as hex values\n" 97 " -s --stdin Treat `-' in file list as standard input\n"98 95 "Currently, %s is under development, some options don't work.\n", 99 96 cmdname, cmdname); … … 175 172 off64_t file_size = 0, length = 0; 176 173 177 bool reading_stdin = dash_represents_stdin && (str_cmp(fname, "-") == 0); 178 179 if (reading_stdin) { 180 fd = fileno(stdin); 181 /* Allow storing the whole UTF-8 character. */ 182 blen = STR_BOUNDS(1); 183 } else { 184 fd = open(fname, O_RDONLY); 185 } 174 fd = open(fname, O_RDONLY); 186 175 if (fd < 0) { 187 176 printf("Unable to open %s\n", fname); … … 218 207 219 208 do { 220 size_t bytes_to_read; 221 if (reading_stdin) { 222 bytes_to_read = 1; 223 } else { 224 if ((length != CAT_FULL_FILE) 225 && (length - (off64_t)count <= (off64_t)(blen - copied_bytes))) { 226 bytes_to_read = (size_t) (length - count); 227 } else { 228 bytes_to_read = blen - copied_bytes; 229 } 230 } 231 bytes = read(fd, buff + copied_bytes, bytes_to_read); 209 bytes = read(fd, buff + copied_bytes, ( 210 (length != CAT_FULL_FILE && length - (off64_t)count <= (off64_t)(blen - copied_bytes)) ? 211 (size_t)(length - count) : 212 (blen - copied_bytes) ) ); 232 213 bytes += copied_bytes; 233 214 copied_bytes = 0; … … 261 242 reads++; 262 243 } 263 264 if (reading_stdin) {265 fflush(stdout);266 }267 244 } while (bytes > 0 && !should_quit && (count < length || length == CAT_FULL_FILE)); 268 245 … … 307 284 308 285 for (c = 0, optind = 0, opt_ind = 0; c != -1;) { 309 c = getopt_long(argc, argv, "xhvmH:t:b: s", long_options, &opt_ind);286 c = getopt_long(argc, argv, "xhvmH:t:b:", long_options, &opt_ind); 310 287 switch (c) { 311 288 case 'h': … … 341 318 hex = true; 342 319 break; 343 case 's':344 dash_represents_stdin = true;345 break;346 320 } 347 321 } -
uspace/srv/hid/console/console.c
rf0348c8 r33fc3ae 76 76 } console_state_t; 77 77 78 #define UTF8_CHAR_BUFFER_SIZE (STR_BOUNDS(1) + 1)79 80 78 typedef struct { 81 79 atomic_t refcnt; /**< Connection reference count */ 82 80 prodcons_t input_pc; /**< Incoming keyboard events */ 83 char char_remains[UTF8_CHAR_BUFFER_SIZE]; /**< Not yet sent bytes of last char event. */84 size_t char_remains_len; /**< Number of not yet sent bytes. */85 81 86 82 fibril_mutex_t mtx; /**< Lock protecting mutable fields */ … … 617 613 618 614 size_t pos = 0; 619 620 /*621 * Read input from keyboard and copy it to the buffer.622 * We need to handle situation when wchar is split by 2 following623 * reads.624 */625 615 while (pos < size) { 626 /* Copy to the buffer remaining characters. */ 627 while ((pos < size) && (cons->char_remains_len > 0)) { 628 buf[pos] = cons->char_remains[0]; 616 link_t *link = prodcons_consume(&cons->input_pc); 617 kbd_event_t *event = list_get_instance(link, kbd_event_t, link); 618 619 if (event->type == KEY_PRESS) { 620 buf[pos] = event->c; 629 621 pos++; 630 /* Unshift the array. */ 631 for (size_t i = 1; i < cons->char_remains_len; i++) { 632 cons->char_remains[i - 1] = cons->char_remains[i]; 633 } 634 cons->char_remains_len--; 635 } 636 /* Still not enough? Then get another key from the queue. */ 637 if (pos < size) { 638 link_t *link = prodcons_consume(&cons->input_pc); 639 kbd_event_t *event = list_get_instance(link, kbd_event_t, link); 640 641 /* Accept key presses of printable chars only. */ 642 if ((event->type == KEY_PRESS) && (event->c != 0)) { 643 wchar_t tmp[2] = { event->c, 0 }; 644 wstr_to_str(cons->char_remains, UTF8_CHAR_BUFFER_SIZE, tmp); 645 cons->char_remains_len = str_size(cons->char_remains); 646 } 647 648 free(event); 649 } 622 } 623 624 free(event); 650 625 } 651 626 … … 955 930 fibril_mutex_initialize(&consoles[i].mtx); 956 931 prodcons_initialize(&consoles[i].input_pc); 957 consoles[i].char_remains_len = 0;958 932 959 933 if (graphics_state == GRAPHICS_FULL) {
Note:
See TracChangeset
for help on using the changeset viewer.