Rev 2927 | Rev 4337 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2927 | Rev 3197 | ||
---|---|---|---|
Line 167... | Line 167... | ||
167 | str[i] = str[i - 1]; |
167 | str[i] = str[i - 1]; |
168 | str[pos] = ch; |
168 | str[pos] = ch; |
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 | size_t 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); |
Line 201... | Line 201... | ||
201 | * @param name - string to match, changed to hint on exit |
201 | * @param name - string to match, changed to hint on exit |
202 | * @return number of found matches |
202 | * @return number of found matches |
203 | */ |
203 | */ |
204 | static int cmdtab_compl(char *name) |
204 | static int cmdtab_compl(char *name) |
205 | { |
205 | { |
206 | static char output[MAX_SYMBOL_NAME+1]; |
206 | static char output[MAX_SYMBOL_NAME + 1]; |
207 | link_t *startpos = NULL; |
207 | link_t *startpos = NULL; |
208 | const char *foundtxt; |
208 | const char *foundtxt; |
209 | int found = 0; |
209 | int found = 0; |
210 | int i; |
210 | int i; |
211 | 211 | ||
212 | output[0] = '\0'; |
212 | output[0] = '\0'; |
213 | while ((foundtxt = cmdtab_search_one(name, &startpos))) { |
213 | while ((foundtxt = cmdtab_search_one(name, &startpos))) { |
214 | startpos = startpos->next; |
214 | startpos = startpos->next; |
215 | if (!found) |
215 | if (!found) |
216 | strncpy(output, foundtxt, strlen(foundtxt)+1); |
216 | strncpy(output, foundtxt, strlen(foundtxt) + 1); |
217 | else { |
217 | else { |
218 | for (i = 0; output[i] && foundtxt[i] && |
218 | for (i = 0; output[i] && foundtxt[i] && |
219 | output[i] == foundtxt[i]; i++) |
219 | output[i] == foundtxt[i]; i++) |
220 | ; |
220 | ; |
221 | output[i] = '\0'; |
221 | output[i] = '\0'; |
Line 238... | Line 238... | ||
238 | strncpy(name, output, MAX_SYMBOL_NAME); |
238 | strncpy(name, output, MAX_SYMBOL_NAME); |
239 | return found; |
239 | return found; |
240 | 240 | ||
241 | } |
241 | } |
242 | 242 | ||
243 | static char * clever_readline(const char *prompt, chardev_t *input) |
243 | static char *clever_readline(const char *prompt, chardev_t *input) |
244 | { |
244 | { |
245 | static int histposition = 0; |
245 | static int histposition = 0; |
246 | 246 | ||
247 | static char tmp[MAX_CMDLINE+1]; |
247 | static char tmp[MAX_CMDLINE + 1]; |
248 | int curlen = 0, position = 0; |
248 | int curlen = 0, position = 0; |
249 | char *current = history[histposition]; |
249 | char *current = history[histposition]; |
250 | int i; |
250 | int i; |
251 | char mod; /* Command Modifier */ |
251 | char mod; /* Command Modifier */ |
252 | char c; |
252 | char c; |
Line 255... | Line 255... | ||
255 | while (1) { |
255 | while (1) { |
256 | c = _getc(input); |
256 | c = _getc(input); |
257 | if (c == '\n') { |
257 | if (c == '\n') { |
258 | putchar(c); |
258 | putchar(c); |
259 | break; |
259 | break; |
- | 260 | } |
|
260 | } if (c == '\b') { /* Backspace */ |
261 | if (c == '\b') { /* Backspace */ |
261 | if (position == 0) |
262 | if (position == 0) |
262 | continue; |
263 | continue; |
263 | for (i = position; i < curlen; i++) |
264 | for (i = position; i < curlen; i++) |
264 | current[i - 1] = current[i]; |
265 | current[i - 1] = current[i]; |
265 | curlen--; |
266 | curlen--; |
Line 541... | Line 542... | ||
541 | switch (cmd->argv[i].type) { |
542 | switch (cmd->argv[i].type) { |
542 | case ARG_TYPE_STRING: |
543 | case ARG_TYPE_STRING: |
543 | buf = (char *) cmd->argv[i].buffer; |
544 | buf = (char *) cmd->argv[i].buffer; |
544 | strncpy(buf, (const char *) &cmdline[start], |
545 | strncpy(buf, (const char *) &cmdline[start], |
545 | min((end - start) + 2, cmd->argv[i].len)); |
546 | min((end - start) + 2, cmd->argv[i].len)); |
546 | buf[min((end - start) + 1, cmd->argv[i].len - 1)] = '\0'; |
547 | buf[min((end - start) + 1, cmd->argv[i].len - 1)] = |
- | 548 | '\0'; |
|
547 | break; |
549 | break; |
548 | case ARG_TYPE_INT: |
550 | case ARG_TYPE_INT: |
549 | if (parse_int_arg(cmdline + start, end - start + 1, |
551 | if (parse_int_arg(cmdline + start, end - start + 1, |
550 | &cmd->argv[i].intval)) |
552 | &cmd->argv[i].intval)) |
551 | error = 1; |
553 | error = 1; |
Line 558... | Line 560... | ||
558 | min((end-start), cmd->argv[i].len)); |
560 | min((end-start), cmd->argv[i].len)); |
559 | buf[min((end - start), cmd->argv[i].len - 1)] = |
561 | buf[min((end - start), cmd->argv[i].len - 1)] = |
560 | '\0'; |
562 | '\0'; |
561 | cmd->argv[i].intval = (unative_t) buf; |
563 | cmd->argv[i].intval = (unative_t) buf; |
562 | cmd->argv[i].vartype = ARG_TYPE_STRING; |
564 | cmd->argv[i].vartype = ARG_TYPE_STRING; |
563 | } else if (!parse_int_arg(cmdline + start, end - start + 1, |
565 | } else if (!parse_int_arg(cmdline + start, |
564 | &cmd->argv[i].intval)) { |
566 | end - start + 1, &cmd->argv[i].intval)) { |
565 | cmd->argv[i].vartype = ARG_TYPE_INT; |
567 | cmd->argv[i].vartype = ARG_TYPE_INT; |
566 | } else { |
568 | } else { |
567 | printf("Unrecognized variable argument.\n"); |
569 | printf("Unrecognized variable argument.\n"); |
568 | error = 1; |
570 | error = 1; |
569 | } |
571 | } |