Changes in kernel/generic/src/console/kconsole.c [aca4a04:1066041] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/console/kconsole.c
raca4a04 r1066041 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> … … 60 59 #include <putchar.h> 61 60 #include <str.h> 61 #include <mm/slab.h> 62 62 63 63 /** Simple kernel console. … … 202 202 * 203 203 */ 204 NO_TRACE static int cmdtab_compl(char *input, size_t size , indev_t * indev)204 NO_TRACE static int cmdtab_compl(char *input, size_t size) 205 205 { 206 206 const char *name = input; 207 207 208 208 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 209 link_t *pos = NULL; 215 210 const char *hint; 216 211 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 212 221 213 output[0] = 0; … … 227 219 pos = pos->next; 228 220 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 221 } 236 222 … … 240 226 while (cmdtab_search_one(name, &pos)) { 241 227 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 228 printf("%s (%s)\n", hlp->name, hlp->description); 253 229 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; 230 } 260 231 } 261 232 … … 324 295 if (beg == 0) { 325 296 /* Command completion */ 326 found = cmdtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE) , indev);297 found = cmdtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE)); 327 298 } else { 328 299 /* Symbol completion */ 329 found = symtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE) , indev);300 found = symtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE)); 330 301 } 331 302 332 303 if (found == 0) 333 304 continue; 334 335 /* We have hints, may be many. In case of more than one hint, 336 tmp will contain the common prefix. */ 305 306 if (found > 1) { 307 /* No unique hint, list was printed */ 308 printf("%s> ", prompt); 309 printf("%ls", current); 310 print_cc('\b', wstr_length(current) - position); 311 continue; 312 } 313 314 /* We have a hint */ 315 337 316 size_t off = 0; 338 317 size_t i = 0; … … 342 321 i++; 343 322 } 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 323 356 324 printf("%ls", current + position); … … 573 541 /** Parse command line. 574 542 * 575 * @param cmdline Command line as read from input device. 543 * @param cmdline Command line as read from input device. 576 544 * @param size Size (in bytes) of the string. 577 545 *
Note:
See TracChangeset
for help on using the changeset viewer.