return nwords;
}
-void command_print(command_context_t *context, char *format, ...)
+static void command_printv(command_context_t *context, char *format, va_list ap)
{
char *buffer = NULL;
int n, size = 0;
/* process format string */
for (;;)
{
- va_list ap;
- va_start(ap, format);
if (!buffer || (n = vsnprintf(buffer, size, format, ap)) >= size)
{
/* increase buffer until it fits the whole string */
/* gotta free up */
if (buffer)
free(buffer);
- va_end(ap);
return;
}
buffer = p;
- va_end(ap);
continue;
}
- va_end(ap);
break;
}
return;
}
- p = buffer;
+ context->output_handler(context, buffer);
- /* process lines in buffer */
- do {
- char *next = strchr(p, '\n');
-
- if (next)
- *next++ = 0;
+ if (buffer)
+ free(buffer);
+}
- if (context->output_handler)
- context->output_handler(context, p);
+void command_print_sameline(command_context_t *context, char *format, ...)
+{
+ va_list ap;
+ va_start(ap, format);
+ command_printv(context, format, ap);
+ va_end(ap);
+}
- p = next;
- } while (p);
+void command_print(command_context_t *context, char *format, ...)
+{
+ char *t=malloc(strlen(format)+2);
+ strcpy(t, format);
+ strcat(t, "\n");
+ va_list ap;
+ va_start(ap, format);
+ command_printv(context, t, ap);
+ va_end(ap);
+ free(t);
- if (buffer)
- free(buffer);
}
int find_and_run_command(command_context_t *context, command_t *commands, char *words[], int num_words, int start_word)
if (*line && (line[0] == '#'))
return ERROR_OK;
- if (context->echo)
- {
- command_print(context, "%s", line);
- }
+ DEBUG("%s", line);
nwords = parse_line(line, words, sizeof(words) / sizeof(words[0]));
void command_print_help_line(command_context_t* context, struct command_s *command, int indent)
{
command_t *c;
- char indents[32] = {0};
+ char indent_text[indent + 2];
char *help = "no help available";
char name_buf[64];
int i;
- for (i = 0; i < indent; i+=2)
+ if (indent)
{
- indents[i*2] = ' ';
- indents[i*2+1] = '-';
+ indent_text[0] = ' ';
+ memset(indent_text + 1, '-', indent);
+ indent_text[indent + 1] = 0;
}
- indents[i*2] = 0;
if (command->help)
help = command->help;
snprintf(name_buf, 64, command->name);
- strncat(name_buf, indents, 64);
- command_print(context, "%20s\t%s", name_buf, help);
+
+ if (indent)
+ strncat(name_buf, indent_text, 64);
+
+ command_print(context, "%20s\t%s", name_buf, help, indent);
if (command->children)
{
}
}
-int command_print_help(command_context_t* context, char* name, char** args, int argc)
+int command_print_help_match(command_context_t* context, command_t* c_first, char* name, char** args, int argc)
{
- command_t *c;
+ command_t * c;
+ int i;
- for (c = context->commands; c; c = c->next)
+ for (c = c_first; c; c = c->next)
{
- if (argc == 1)
+ if (argc > 0)
{
- if (strncasecmp(c->name, args[0], c->unique_len))
- continue;
+ if (strncasecmp(c->name, args[0], c->unique_len))
+ continue;
+
+ if (strncasecmp(c->name, args[0], strlen(args[0])))
+ continue;
- if (strncasecmp(c->name, args[0], strlen(args[0])))
- continue;
- }
+ if (argc > 1)
+ {
+ command_print_help_match(context, c->children, name, args + 1, argc - 1);
+ continue;
+ }
+ }
command_print_help_line(context, c, 0);
}
return ERROR_OK;
}
+int command_print_help(command_context_t* context, char* name, char** args, int argc)
+{
+ return command_print_help_match(context, context->commands, name, args, argc);
+}
+
+
void command_set_output_handler(command_context_t* context, int (*output_handler)(struct command_context_s *context, char* line), void *priv)
{
context->output_handler = output_handler;
context->mode = COMMAND_EXEC;
context->commands = NULL;
context->current_target = 0;
- context->echo = 0;
context->output_handler = NULL;
context->output_handler_priv = NULL;