Changes in kernel/generic/src/console/kconsole.c [563d6077:a7199c2] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/console/kconsole.c
r563d6077 ra7199c2 45 45 #include <print.h> 46 46 #include <panic.h> 47 #include < arch/types.h>47 #include <typedefs.h> 48 48 #include <adt/list.h> 49 49 #include <arch.h> … … 51 51 #include <debug.h> 52 52 #include <func.h> 53 #include <str ing.h>53 #include <str.h> 54 54 #include <macros.h> 55 55 #include <sysinfo/sysinfo.h> … … 58 58 #include <errno.h> 59 59 #include <putchar.h> 60 #include <str ing.h>60 #include <str.h> 61 61 62 62 /** Simple kernel console. … … 160 160 161 161 /** Print count times a character */ 162 static void print_cc(wchar_t ch, size_t count)162 NO_TRACE static void print_cc(wchar_t ch, size_t count) 163 163 { 164 164 size_t i; … … 168 168 169 169 /** Try to find a command beginning with prefix */ 170 static const char *cmdtab_search_one(const char *name, link_t **startpos) 170 NO_TRACE static const char *cmdtab_search_one(const char *name, 171 link_t **startpos) 171 172 { 172 173 size_t namelen = str_length(name); … … 202 203 * 203 204 */ 204 static int cmdtab_compl(char *input, size_t size)205 NO_TRACE static int cmdtab_compl(char *input, size_t size) 205 206 { 206 207 const char *name = input; … … 209 210 link_t *pos = NULL; 210 211 const char *hint; 211 char output[MAX_CMDLINE];212 char *output = malloc(MAX_CMDLINE, 0); 212 213 213 214 output[0] = 0; … … 224 225 printf("\n"); 225 226 pos = NULL; 226 while ( (hint = cmdtab_search_one(name, &pos))) {227 while (cmdtab_search_one(name, &pos)) { 227 228 cmd_info_t *hlp = list_get_instance(pos, cmd_info_t, link); 228 229 printf("%s (%s)\n", hlp->name, hlp->description); … … 234 235 str_cpy(input, size, output); 235 236 237 free(output); 236 238 return found; 237 239 } 238 240 239 static wchar_t *clever_readline(const char *prompt, indev_t *indev)241 NO_TRACE static wchar_t *clever_readline(const char *prompt, indev_t *indev) 240 242 { 241 243 printf("%s> ", prompt); … … 244 246 wchar_t *current = history[history_pos]; 245 247 current[0] = 0; 248 char *tmp = malloc(STR_BOUNDS(MAX_CMDLINE), 0); 246 249 247 250 while (true) { … … 288 291 beg++; 289 292 290 char tmp[STR_BOUNDS(MAX_CMDLINE)];291 293 wstr_to_str(tmp, position - beg + 1, current + beg); 292 294 … … 414 416 } 415 417 418 free(tmp); 416 419 return current; 417 420 } … … 422 425 } 423 426 424 static bool parse_int_arg(const char *text, size_t len, unative_t *result) 427 NO_TRACE static bool parse_int_arg(const char *text, size_t len, 428 unative_t *result) 425 429 { 426 430 bool isaddr = false; … … 455 459 printf("No symbol information available.\n"); 456 460 return false; 457 } 458 459 if (isaddr) 460 *result = (unative_t) symaddr; 461 else if (isptr) 462 *result = **((unative_t **) symaddr); 463 else 464 *result = *((unative_t *) symaddr); 461 case EOK: 462 if (isaddr) 463 *result = (unative_t) symaddr; 464 else if (isptr) 465 *result = **((unative_t **) symaddr); 466 else 467 *result = *((unative_t *) symaddr); 468 break; 469 default: 470 printf("Unknown error.\n"); 471 return false; 472 } 465 473 } else { 466 474 /* It's a number - convert it */ 467 *result = atoi(text); 468 if (isptr) 469 *result = *((unative_t *) *result); 475 uint64_t value; 476 int rc = str_uint64(text, NULL, 0, true, &value); 477 switch (rc) { 478 case EINVAL: 479 printf("Invalid number.\n"); 480 return false; 481 case EOVERFLOW: 482 printf("Integer overflow.\n"); 483 return false; 484 case EOK: 485 *result = (unative_t) value; 486 if (isptr) 487 *result = *((unative_t *) *result); 488 break; 489 default: 490 printf("Unknown error.\n"); 491 return false; 492 } 470 493 } 471 494 … … 488 511 * 489 512 */ 490 static bool parse_argument(const char *cmdline, size_t size, size_t *start, size_t *end) 513 NO_TRACE static bool parse_argument(const char *cmdline, size_t size, 514 size_t *start, size_t *end) 491 515 { 492 516 ASSERT(start != NULL); … … 524 548 * 525 549 */ 526 static cmd_info_t *parse_cmdline(const char *cmdline, size_t size)550 NO_TRACE static cmd_info_t *parse_cmdline(const char *cmdline, size_t size) 527 551 { 528 552 size_t start = 0; … … 571 595 size_t i; 572 596 for (i = 0; i < cmd->argc; i++) { 597 char *buf; 598 573 599 start = end; 574 600 if (!parse_argument(cmdline, size, &start, &end)) { 601 if (cmd->argv[i].type == ARG_TYPE_STRING_OPTIONAL) { 602 buf = (char *) cmd->argv[i].buffer; 603 str_cpy(buf, cmd->argv[i].len, ""); 604 continue; 605 } 606 575 607 printf("Too few arguments.\n"); 576 608 spinlock_unlock(&cmd->lock); … … 578 610 } 579 611 580 char *buf;581 612 switch (cmd->argv[i].type) { 582 613 case ARG_TYPE_STRING: 614 case ARG_TYPE_STRING_OPTIONAL: 583 615 buf = (char *) cmd->argv[i].buffer; 584 616 str_ncpy(buf, cmd->argv[i].len, cmdline + start, … … 600 632 cmd->argv[i].vartype = ARG_TYPE_STRING; 601 633 } else { 602 printf("Wrong syn xtax.\n");634 printf("Wrong syntax.\n"); 603 635 error = true; 604 636 } … … 643 675 * 644 676 */ 645 void kconsole(c har *prompt,char *msg, bool kcon)677 void kconsole(const char *prompt, const char *msg, bool kcon) 646 678 { 647 679 if (!stdin) { … … 658 690 printf("Type \"exit\" to leave the console.\n"); 659 691 692 char *cmdline = malloc(STR_BOUNDS(MAX_CMDLINE), 0); 660 693 while (true) { 661 694 wchar_t *tmp = clever_readline((char *) prompt, stdin); … … 664 697 continue; 665 698 666 char cmdline[STR_BOUNDS(MAX_CMDLINE)];667 699 wstr_to_str(cmdline, STR_BOUNDS(MAX_CMDLINE), tmp); 668 700 … … 676 708 (void) cmd_info->func(cmd_info->argv); 677 709 } 710 free(cmdline); 678 711 } 679 712
Note:
See TracChangeset
for help on using the changeset viewer.