Changes in kernel/generic/src/console/kconsole.c [e98f1c3e:feeac0d] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/console/kconsole.c
re98f1c3e rfeeac0d 58 58 #include <errno.h> 59 59 #include <putchar.h> 60 #include < mm/slab.h>60 #include <str.h> 61 61 62 62 /** Simple kernel console. … … 164 164 165 165 /** Try to find a command beginning with prefix */ 166 const char *cmdtab_enum(const char *name, const char **h, void **ctx) 167 { 168 link_t **startpos = (link_t**) ctx; 166 NO_TRACE static const char *cmdtab_search_one(const char *name, 167 link_t **startpos) 168 { 169 169 size_t namelen = str_length(name); 170 170 … … 182 182 183 183 if (str_lcmp(curname, name, namelen) == 0) { 184 *startpos = (*startpos)->next;185 if (h)186 *h = hlp->description;187 188 184 spinlock_unlock(&cmd_lock); 189 185 return (curname + str_lsize(curname, namelen)); … … 203 199 * 204 200 */ 205 NO_TRACE static int cmdtab_compl(char *input, size_t size, indev_t *indev, 206 hints_enum_func_t hints_enum) 201 NO_TRACE static int cmdtab_compl(char *input, size_t size, indev_t *indev) 207 202 { 208 203 const char *name = input; … … 216 211 size_t max_match_len = size; 217 212 size_t max_match_len_tmp = size; 218 void *pos = NULL; 213 size_t input_len = str_length(input); 214 link_t *pos = NULL; 219 215 const char *hint; 220 const char *help;221 216 char *output = malloc(MAX_CMDLINE, 0); 222 217 size_t hints_to_show = MAX_TAB_HINTS - 1; … … 226 221 output[0] = 0; 227 222 228 while ((hint = hints_enum(name, NULL, &pos))) {229 if ((found == 0) || (str_length( hint) > str_length(output)))223 while ((hint = cmdtab_search_one(name, &pos))) { 224 if ((found == 0) || (str_length(output) > str_length(hint))) 230 225 str_cpy(output, MAX_CMDLINE, hint); 231 226 227 pos = pos->next; 232 228 found++; 233 229 } … … 246 242 printf("\n"); 247 243 pos = NULL; 248 while ((hint = hints_enum(name, &help, &pos))) { 244 while (cmdtab_search_one(name, &pos)) { 245 cmd_info_t *hlp = list_get_instance(pos, cmd_info_t, link); 249 246 250 247 if (continue_showing_hints) { 251 if (help) 252 printf("%s%s (%s)\n", name, hint, help); 253 else 254 printf("%s%s\n", name, hint); 255 248 printf("%s (%s)\n", hlp->name, hlp->description); 256 249 --hints_to_show; 257 250 ++total_hints_shown; … … 264 257 } 265 258 259 pos = pos->next; 260 266 261 for (max_match_len_tmp = 0; 267 262 (output[max_match_len_tmp] == 268 h int[max_match_len_tmp]) &&263 hlp->name[input_len + max_match_len_tmp]) && 269 264 (max_match_len_tmp < max_match_len); ++max_match_len_tmp); 270 265 … … 281 276 free(output); 282 277 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;322 278 } 323 279 … … 362 318 putchar(current[position]); 363 319 320 if (position == 0) 321 continue; 364 322 365 323 /* … … 368 326 */ 369 327 size_t beg; 370 unsigned narg = 0; 371 if (position == 0) { 372 tmp[0] = '\0'; 373 beg = 0; 328 for (beg = position - 1; (beg > 0) && (!isspace(current[beg])); 329 beg--); 330 331 if (isspace(current[beg])) 332 beg++; 333 334 wstr_to_str(tmp, position - beg + 1, current + beg); 335 336 int found; 337 if (beg == 0) { 338 /* Command completion */ 339 found = cmdtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE), indev); 374 340 } 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--; 399 400 int found; 401 if (narg == 0) { 402 /* Command completion */ 403 found = cmdtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE), indev, 404 cmdtab_enum); 405 } else { 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); 341 /* Symbol completion */ 342 found = symtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE), indev); 412 343 } 413 344
Note:
See TracChangeset
for help on using the changeset viewer.