Changes in kernel/generic/src/console/kconsole.c [9b11a971:e98f1c3e] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/console/kconsole.c
r9b11a971 re98f1c3e 53 53 #include <func.h> 54 54 #include <str.h> 55 #include <macros.h>56 55 #include <sysinfo/sysinfo.h> 57 56 #include <ddi/device.h> … … 59 58 #include <errno.h> 60 59 #include <putchar.h> 61 #include < str.h>60 #include <mm/slab.h> 62 61 63 62 /** Simple kernel console. … … 119 118 * Make sure the command is not already listed. 120 119 */ 121 list_foreach(cmd_list, cur) { 122 cmd_info_t *hlp = list_get_instance(cur, cmd_info_t, link); 123 120 list_foreach(cmd_list, link, cmd_info_t, hlp) { 124 121 if (hlp == cmd) { 125 122 /* The command is already there. */ … … 167 164 168 165 /** Try to find a command beginning with prefix */ 169 NO_TRACE static const char *cmdtab_search_one(const char *name, 170 link_t **startpos) 171 { 166 const char *cmdtab_enum(const char *name, const char **h, void **ctx) 167 { 168 link_t **startpos = (link_t**) ctx; 172 169 size_t namelen = str_length(name); 173 170 … … 185 182 186 183 if (str_lcmp(curname, name, namelen) == 0) { 184 *startpos = (*startpos)->next; 185 if (h) 186 *h = hlp->description; 187 187 188 spinlock_unlock(&cmd_lock); 188 189 return (curname + str_lsize(curname, namelen)); … … 202 203 * 203 204 */ 204 NO_TRACE static int cmdtab_compl(char *input, size_t size, indev_t *indev) 205 NO_TRACE static int cmdtab_compl(char *input, size_t size, indev_t *indev, 206 hints_enum_func_t hints_enum) 205 207 { 206 208 const char *name = input; … … 214 216 size_t max_match_len = size; 215 217 size_t max_match_len_tmp = size; 216 size_t input_len = str_length(input); 217 link_t *pos = NULL; 218 void *pos = NULL; 218 219 const char *hint; 220 const char *help; 219 221 char *output = malloc(MAX_CMDLINE, 0); 220 222 size_t hints_to_show = MAX_TAB_HINTS - 1; … … 224 226 output[0] = 0; 225 227 226 while ((hint = cmdtab_search_one(name, &pos))) {227 if ((found == 0) || (str_length( output) > str_length(hint)))228 while ((hint = hints_enum(name, NULL, &pos))) { 229 if ((found == 0) || (str_length(hint) > str_length(output))) 228 230 str_cpy(output, MAX_CMDLINE, hint); 229 231 230 pos = pos->next;231 232 found++; 232 233 } … … 245 246 printf("\n"); 246 247 pos = NULL; 247 while (cmdtab_search_one(name, &pos)) { 248 cmd_info_t *hlp = list_get_instance(pos, cmd_info_t, link); 248 while ((hint = hints_enum(name, &help, &pos))) { 249 249 250 250 if (continue_showing_hints) { 251 printf("%s (%s)\n", hlp->name, hlp->description); 251 if (help) 252 printf("%s%s (%s)\n", name, hint, help); 253 else 254 printf("%s%s\n", name, hint); 255 252 256 --hints_to_show; 253 257 ++total_hints_shown; … … 260 264 } 261 265 262 pos = pos->next;263 264 266 for (max_match_len_tmp = 0; 265 267 (output[max_match_len_tmp] == 266 h lp->name[input_len +max_match_len_tmp]) &&268 hint[max_match_len_tmp]) && 267 269 (max_match_len_tmp < max_match_len); ++max_match_len_tmp); 268 270 … … 279 281 free(output); 280 282 return found; 283 } 284 285 NO_TRACE static cmd_info_t *parse_cmd(const wchar_t *cmdline) 286 { 287 size_t start = 0; 288 size_t end; 289 char *tmp; 290 291 while (isspace(cmdline[start])) 292 start++; 293 294 end = start + 1; 295 296 while (!isspace(cmdline[end])) 297 end++; 298 299 tmp = malloc(STR_BOUNDS(end - start + 1), 0); 300 301 wstr_to_str(tmp, end - start + 1, &cmdline[start]); 302 303 spinlock_lock(&cmd_lock); 304 305 list_foreach(cmd_list, link, cmd_info_t, hlp) { 306 spinlock_lock(&hlp->lock); 307 308 if (str_cmp(hlp->name, tmp) == 0) { 309 spinlock_unlock(&hlp->lock); 310 spinlock_unlock(&cmd_lock); 311 free(tmp); 312 return hlp; 313 } 314 315 spinlock_unlock(&hlp->lock); 316 } 317 318 free(tmp); 319 spinlock_unlock(&cmd_lock); 320 321 return NULL; 281 322 } 282 323 … … 321 362 putchar(current[position]); 322 363 323 if (position == 0)324 continue;325 364 326 365 /* … … 329 368 */ 330 369 size_t beg; 331 for (beg = position - 1; (beg > 0) && (!isspace(current[beg])); 332 beg--); 333 334 if (isspace(current[beg])) 335 beg++; 336 337 wstr_to_str(tmp, position - beg + 1, current + beg); 370 unsigned narg = 0; 371 if (position == 0) { 372 tmp[0] = '\0'; 373 beg = 0; 374 } else { 375 for (beg = position - 1; 376 (beg > 0) && (!isspace(current[beg])); 377 beg--); 378 379 if (isspace(current[beg])) 380 beg++; 381 382 wstr_to_str(tmp, position - beg + 1, current + beg); 383 } 384 385 /* Count which argument number are we tabbing (narg=0 is cmd) */ 386 bool sp = false; 387 for (; beg > 0; beg--) { 388 if (isspace(current[beg])) { 389 if (!sp) { 390 narg++; 391 sp = true; 392 } 393 } else 394 sp = false; 395 } 396 397 if (narg && isspace(current[0])) 398 narg--; 338 399 339 400 int found; 340 if ( beg == 0) {401 if (narg == 0) { 341 402 /* Command completion */ 342 found = cmdtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE), indev); 403 found = cmdtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE), indev, 404 cmdtab_enum); 343 405 } else { 344 /* Symbol completion */ 345 found = symtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE), indev); 406 /* Arguments completion */ 407 cmd_info_t *cmd = parse_cmd(current); 408 if (!cmd || !cmd->hints_enum || cmd->argc < narg) 409 continue; 410 found = cmdtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE), indev, 411 cmd->hints_enum); 346 412 } 347 413 … … 613 679 cmd_info_t *cmd = NULL; 614 680 615 list_foreach(cmd_list, cur) { 616 cmd_info_t *hlp = list_get_instance(cur, cmd_info_t, link); 681 list_foreach(cmd_list, link, cmd_info_t, hlp) { 617 682 spinlock_lock(&hlp->lock); 618 683
Note:
See TracChangeset
for help on using the changeset viewer.