Rev 2108 | Rev 2462 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2108 | Rev 2113 | ||
|---|---|---|---|
| Line 169... | Line 169... | ||
| 169 | } |
169 | } |
| 170 | 170 | ||
| 171 | /** Try to find a command beginning with prefix */ |
171 | /** Try to find a command beginning with prefix */ |
| 172 | static const char * cmdtab_search_one(const char *name,link_t **startpos) |
172 | static const char * cmdtab_search_one(const char *name,link_t **startpos) |
| 173 | { |
173 | { |
| 174 | int namelen = strlen(name); |
174 | size_t namelen = strlen(name); |
| 175 | const char *curname; |
175 | const char *curname; |
| 176 | 176 | ||
| 177 | spinlock_lock(&cmd_lock); |
177 | spinlock_lock(&cmd_lock); |
| 178 | 178 | ||
| 179 | if (!*startpos) |
179 | if (!*startpos) |
| Line 414... | Line 414... | ||
| 414 | printf("%s: no stdin\n", __FUNCTION__); |
414 | printf("%s: no stdin\n", __FUNCTION__); |
| 415 | return; |
415 | return; |
| 416 | } |
416 | } |
| 417 | 417 | ||
| 418 | while (true) { |
418 | while (true) { |
| 419 | cmdline = clever_readline(prompt, stdin); |
419 | cmdline = clever_readline((char *) prompt, stdin); |
| 420 | len = strlen(cmdline); |
420 | len = strlen(cmdline); |
| 421 | if (!len) |
421 | if (!len) |
| 422 | continue; |
422 | continue; |
| 423 | cmd_info = parse_cmdline(cmdline, len); |
423 | cmd_info = parse_cmdline(cmdline, len); |
| 424 | if (!cmd_info) |
424 | if (!cmd_info) |
| Line 484... | Line 484... | ||
| 484 | cmd_info_t *parse_cmdline(char *cmdline, size_t len) |
484 | cmd_info_t *parse_cmdline(char *cmdline, size_t len) |
| 485 | { |
485 | { |
| 486 | index_t start = 0, end = 0; |
486 | index_t start = 0, end = 0; |
| 487 | cmd_info_t *cmd = NULL; |
487 | cmd_info_t *cmd = NULL; |
| 488 | link_t *cur; |
488 | link_t *cur; |
| 489 | int i; |
489 | count_t i; |
| 490 | int error = 0; |
490 | int error = 0; |
| 491 | 491 | ||
| 492 | if (!parse_argument(cmdline, len, &start, &end)) { |
492 | if (!parse_argument(cmdline, len, &start, &end)) { |
| 493 | /* Command line did not contain alphanumeric word. */ |
493 | /* Command line did not contain alphanumeric word. */ |
| 494 | return NULL; |
494 | return NULL; |
| Line 538... | Line 538... | ||
| 538 | } |
538 | } |
| 539 | 539 | ||
| 540 | error = 0; |
540 | error = 0; |
| 541 | switch (cmd->argv[i].type) { |
541 | switch (cmd->argv[i].type) { |
| 542 | case ARG_TYPE_STRING: |
542 | case ARG_TYPE_STRING: |
| 543 | buf = cmd->argv[i].buffer; |
543 | buf = (char *) cmd->argv[i].buffer; |
| 544 | strncpy(buf, (const char *) &cmdline[start], |
544 | strncpy(buf, (const char *) &cmdline[start], |
| 545 | min((end - start) + 2, cmd->argv[i].len)); |
545 | min((end - start) + 2, cmd->argv[i].len)); |
| 546 | buf[min((end - start) + 1, cmd->argv[i].len - 1)] = '\0'; |
546 | buf[min((end - start) + 1, cmd->argv[i].len - 1)] = '\0'; |
| 547 | break; |
547 | break; |
| 548 | case ARG_TYPE_INT: |
548 | case ARG_TYPE_INT: |
| 549 | if (parse_int_arg(cmdline + start, end - start + 1, |
549 | if (parse_int_arg(cmdline + start, end - start + 1, |
| Line 551... | Line 551... | ||
| 551 | error = 1; |
551 | error = 1; |
| 552 | break; |
552 | break; |
| 553 | case ARG_TYPE_VAR: |
553 | case ARG_TYPE_VAR: |
| 554 | if (start != end && cmdline[start] == '"' && |
554 | if (start != end && cmdline[start] == '"' && |
| 555 | cmdline[end] == '"') { |
555 | cmdline[end] == '"') { |
| 556 | buf = cmd->argv[i].buffer; |
556 | buf = (char *) cmd->argv[i].buffer; |
| 557 | strncpy(buf, (const char *) &cmdline[start + 1], |
557 | strncpy(buf, (const char *) &cmdline[start + 1], |
| 558 | min((end-start), cmd->argv[i].len)); |
558 | min((end-start), cmd->argv[i].len)); |
| 559 | buf[min((end - start), cmd->argv[i].len - 1)] = |
559 | buf[min((end - start), cmd->argv[i].len - 1)] = |
| 560 | '\0'; |
560 | '\0'; |
| 561 | cmd->argv[i].intval = (unative_t) buf; |
561 | cmd->argv[i].intval = (unative_t) buf; |
| Line 606... | Line 606... | ||
| 606 | * |
606 | * |
| 607 | * @return false on failure, true on success. |
607 | * @return false on failure, true on success. |
| 608 | */ |
608 | */ |
| 609 | bool parse_argument(char *cmdline, size_t len, index_t *start, index_t *end) |
609 | bool parse_argument(char *cmdline, size_t len, index_t *start, index_t *end) |
| 610 | { |
610 | { |
| 611 | int i; |
611 | index_t i; |
| 612 | bool found_start = false; |
612 | bool found_start = false; |
| 613 | 613 | ||
| 614 | ASSERT(start != NULL); |
614 | ASSERT(start != NULL); |
| 615 | ASSERT(end != NULL); |
615 | ASSERT(end != NULL); |
| 616 | 616 | ||