Rev 4180 | Rev 4217 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4180 | Rev 4207 | ||
---|---|---|---|
Line 135... | Line 135... | ||
135 | spinlock_lock(&cmd->lock); |
135 | spinlock_lock(&cmd->lock); |
136 | } else { |
136 | } else { |
137 | spinlock_lock(&cmd->lock); |
137 | spinlock_lock(&cmd->lock); |
138 | spinlock_lock(&hlp->lock); |
138 | spinlock_lock(&hlp->lock); |
139 | } |
139 | } |
140 | if ((strncmp(hlp->name, cmd->name, max(strlen(cmd->name), |
140 | if ((strncmp(hlp->name, cmd->name, max(str_size(cmd->name), |
141 | strlen(hlp->name))) == 0)) { |
141 | str_size(hlp->name))) == 0)) { |
142 | /* The command is already there. */ |
142 | /* The command is already there. */ |
143 | spinlock_unlock(&hlp->lock); |
143 | spinlock_unlock(&hlp->lock); |
144 | spinlock_unlock(&cmd->lock); |
144 | spinlock_unlock(&cmd->lock); |
145 | spinlock_unlock(&cmd_lock); |
145 | spinlock_unlock(&cmd_lock); |
146 | return 0; |
146 | return 0; |
Line 170... | Line 170... | ||
170 | /** Insert character to string */ |
170 | /** Insert character to string */ |
171 | static void insert_char(char *str, char ch, int pos) |
171 | static void insert_char(char *str, char ch, int pos) |
172 | { |
172 | { |
173 | int i; |
173 | int i; |
174 | 174 | ||
175 | for (i = strlen(str); i > pos; i--) |
175 | for (i = str_size(str); i > pos; i--) |
176 | str[i] = str[i - 1]; |
176 | str[i] = str[i - 1]; |
177 | str[pos] = ch; |
177 | str[pos] = ch; |
178 | } |
178 | } |
179 | 179 | ||
180 | /** Try to find a command beginning with prefix */ |
180 | /** Try to find a command beginning with prefix */ |
181 | static const char *cmdtab_search_one(const char *name,link_t **startpos) |
181 | static const char *cmdtab_search_one(const char *name,link_t **startpos) |
182 | { |
182 | { |
183 | size_t namelen = strlen(name); |
183 | size_t namelen = str_size(name); |
184 | const char *curname; |
184 | const char *curname; |
185 | 185 | ||
186 | spinlock_lock(&cmd_lock); |
186 | spinlock_lock(&cmd_lock); |
187 | 187 | ||
188 | if (!*startpos) |
188 | if (!*startpos) |
Line 191... | Line 191... | ||
191 | for (; *startpos != &cmd_head; *startpos = (*startpos)->next) { |
191 | for (; *startpos != &cmd_head; *startpos = (*startpos)->next) { |
192 | cmd_info_t *hlp; |
192 | cmd_info_t *hlp; |
193 | hlp = list_get_instance(*startpos, cmd_info_t, link); |
193 | hlp = list_get_instance(*startpos, cmd_info_t, link); |
194 | 194 | ||
195 | curname = hlp->name; |
195 | curname = hlp->name; |
196 | if (strlen(curname) < namelen) |
196 | if (str_size(curname) < namelen) |
197 | continue; |
197 | continue; |
198 | if (strncmp(curname, name, namelen) == 0) { |
198 | if (strncmp(curname, name, namelen) == 0) { |
199 | spinlock_unlock(&cmd_lock); |
199 | spinlock_unlock(&cmd_lock); |
200 | return curname+namelen; |
200 | return curname+namelen; |
201 | } |
201 | } |
Line 220... | Line 220... | ||
220 | 220 | ||
221 | output[0] = '\0'; |
221 | output[0] = '\0'; |
222 | while ((foundtxt = cmdtab_search_one(name, &startpos))) { |
222 | while ((foundtxt = cmdtab_search_one(name, &startpos))) { |
223 | startpos = startpos->next; |
223 | startpos = startpos->next; |
224 | if (!found) |
224 | if (!found) |
225 | strncpy(output, foundtxt, strlen(foundtxt) + 1); |
225 | strncpy(output, foundtxt, str_size(foundtxt) + 1); |
226 | else { |
226 | else { |
227 | for (i = 0; output[i] && foundtxt[i] && |
227 | for (i = 0; output[i] && foundtxt[i] && |
228 | output[i] == foundtxt[i]; i++) |
228 | output[i] == foundtxt[i]; i++) |
229 | ; |
229 | ; |
230 | output[i] = '\0'; |
230 | output[i] = '\0'; |
Line 232... | Line 232... | ||
232 | found++; |
232 | found++; |
233 | } |
233 | } |
234 | if (!found) |
234 | if (!found) |
235 | return 0; |
235 | return 0; |
236 | 236 | ||
237 | if (found > 1 && !strlen(output)) { |
237 | if (found > 1 && !str_size(output)) { |
238 | printf("\n"); |
238 | printf("\n"); |
239 | startpos = NULL; |
239 | startpos = NULL; |
240 | while ((foundtxt = cmdtab_search_one(name, &startpos))) { |
240 | while ((foundtxt = cmdtab_search_one(name, &startpos))) { |
241 | cmd_info_t *hlp; |
241 | cmd_info_t *hlp; |
242 | hlp = list_get_instance(startpos, cmd_info_t, link); |
242 | hlp = list_get_instance(startpos, cmd_info_t, link); |
Line 307... | Line 307... | ||
307 | continue; |
307 | continue; |
308 | for (i = 0; tmp[i] && curlen < MAX_CMDLINE; |
308 | for (i = 0; tmp[i] && curlen < MAX_CMDLINE; |
309 | i++, curlen++) |
309 | i++, curlen++) |
310 | insert_char(current, tmp[i], i + position); |
310 | insert_char(current, tmp[i], i + position); |
311 | 311 | ||
312 | if (strlen(tmp) || found == 1) { /* If we have a hint */ |
312 | if (str_size(tmp) || found == 1) { /* If we have a hint */ |
313 | for (i = position; i < curlen; i++) |
313 | for (i = position; i < curlen; i++) |
314 | putchar(current[i]); |
314 | putchar(current[i]); |
315 | position += strlen(tmp); |
315 | position += str_size(tmp); |
316 | /* Add space to end */ |
316 | /* Add space to end */ |
317 | if (found == 1 && position == curlen && |
317 | if (found == 1 && position == curlen && |
318 | curlen < MAX_CMDLINE) { |
318 | curlen < MAX_CMDLINE) { |
319 | current[position] = ' '; |
319 | current[position] = ' '; |
320 | curlen++; |
320 | curlen++; |
Line 323... | Line 323... | ||
323 | } |
323 | } |
324 | } else { /* No hint, table was printed */ |
324 | } else { /* No hint, table was printed */ |
325 | printf("%s> ", prompt); |
325 | printf("%s> ", prompt); |
326 | for (i = 0; i < curlen; i++) |
326 | for (i = 0; i < curlen; i++) |
327 | putchar(current[i]); |
327 | putchar(current[i]); |
328 | position += strlen(tmp); |
328 | position += str_size(tmp); |
329 | } |
329 | } |
330 | rdln_print_c('\b', curlen - position); |
330 | rdln_print_c('\b', curlen - position); |
331 | continue; |
331 | continue; |
332 | } |
332 | } |
333 | if (c == 0x1b) { /* Special command */ |
333 | if (c == 0x1b) { /* Special command */ |
Line 382... | Line 382... | ||
382 | histposition = |
382 | histposition = |
383 | histposition % KCONSOLE_HISTORY; |
383 | histposition % KCONSOLE_HISTORY; |
384 | } |
384 | } |
385 | current = history[histposition]; |
385 | current = history[histposition]; |
386 | printf("%s", current); |
386 | printf("%s", current); |
387 | curlen = strlen(current); |
387 | curlen = str_size(current); |
388 | position = curlen; |
388 | position = curlen; |
389 | continue; |
389 | continue; |
390 | } |
390 | } |
391 | continue; |
391 | continue; |
392 | } |
392 | } |
Line 441... | Line 441... | ||
441 | else |
441 | else |
442 | printf("Type \"exit\" to leave the console.\n"); |
442 | printf("Type \"exit\" to leave the console.\n"); |
443 | 443 | ||
444 | while (true) { |
444 | while (true) { |
445 | cmdline = clever_readline((char *) prompt, stdin); |
445 | cmdline = clever_readline((char *) prompt, stdin); |
446 | len = strlen(cmdline); |
446 | len = str_size(cmdline); |
447 | if (!len) |
447 | if (!len) |
448 | continue; |
448 | continue; |
449 | 449 | ||
450 | if ((!kcon) && (len == 4) && (strncmp(cmdline, "exit", 4) == 0)) |
450 | if ((!kcon) && (len == 4) && (strncmp(cmdline, "exit", 4) == 0)) |
451 | break; |
451 | break; |
Line 542... | Line 542... | ||
542 | cmd_info_t *hlp; |
542 | cmd_info_t *hlp; |
543 | 543 | ||
544 | hlp = list_get_instance(cur, cmd_info_t, link); |
544 | hlp = list_get_instance(cur, cmd_info_t, link); |
545 | spinlock_lock(&hlp->lock); |
545 | spinlock_lock(&hlp->lock); |
546 | 546 | ||
547 | if (strncmp(hlp->name, &cmdline[start], max(strlen(hlp->name), |
547 | if (strncmp(hlp->name, &cmdline[start], max(str_size(hlp->name), |
548 | end - start + 1)) == 0) { |
548 | end - start + 1)) == 0) { |
549 | cmd = hlp; |
549 | cmd = hlp; |
550 | break; |
550 | break; |
551 | } |
551 | } |
552 | 552 |