monitor: code move for parse_cmdline()
help_cmd() need this function later, so move it. get_str() is called by parse_cmdline() so it is moved also. Some code style error reported by check script, is also fixed. Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
This commit is contained in:
parent
7717239dc1
commit
f5438c0500
191
monitor.c
191
monitor.c
@ -753,6 +753,104 @@ static int compare_cmd(const char *name, const char *list)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_str(char *buf, int buf_size, const char **pp)
|
||||
{
|
||||
const char *p;
|
||||
char *q;
|
||||
int c;
|
||||
|
||||
q = buf;
|
||||
p = *pp;
|
||||
while (qemu_isspace(*p)) {
|
||||
p++;
|
||||
}
|
||||
if (*p == '\0') {
|
||||
fail:
|
||||
*q = '\0';
|
||||
*pp = p;
|
||||
return -1;
|
||||
}
|
||||
if (*p == '\"') {
|
||||
p++;
|
||||
while (*p != '\0' && *p != '\"') {
|
||||
if (*p == '\\') {
|
||||
p++;
|
||||
c = *p++;
|
||||
switch (c) {
|
||||
case 'n':
|
||||
c = '\n';
|
||||
break;
|
||||
case 'r':
|
||||
c = '\r';
|
||||
break;
|
||||
case '\\':
|
||||
case '\'':
|
||||
case '\"':
|
||||
break;
|
||||
default:
|
||||
qemu_printf("unsupported escape code: '\\%c'\n", c);
|
||||
goto fail;
|
||||
}
|
||||
if ((q - buf) < buf_size - 1) {
|
||||
*q++ = c;
|
||||
}
|
||||
} else {
|
||||
if ((q - buf) < buf_size - 1) {
|
||||
*q++ = *p;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
}
|
||||
if (*p != '\"') {
|
||||
qemu_printf("unterminated string\n");
|
||||
goto fail;
|
||||
}
|
||||
p++;
|
||||
} else {
|
||||
while (*p != '\0' && !qemu_isspace(*p)) {
|
||||
if ((q - buf) < buf_size - 1) {
|
||||
*q++ = *p;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
}
|
||||
*q = '\0';
|
||||
*pp = p;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define MAX_ARGS 16
|
||||
|
||||
/* NOTE: this parser is an approximate form of the real command parser */
|
||||
static void parse_cmdline(const char *cmdline,
|
||||
int *pnb_args, char **args)
|
||||
{
|
||||
const char *p;
|
||||
int nb_args, ret;
|
||||
char buf[1024];
|
||||
|
||||
p = cmdline;
|
||||
nb_args = 0;
|
||||
for (;;) {
|
||||
while (qemu_isspace(*p)) {
|
||||
p++;
|
||||
}
|
||||
if (*p == '\0') {
|
||||
break;
|
||||
}
|
||||
if (nb_args >= MAX_ARGS) {
|
||||
break;
|
||||
}
|
||||
ret = get_str(buf, sizeof(buf), &p);
|
||||
args[nb_args] = g_strdup(buf);
|
||||
nb_args++;
|
||||
if (ret < 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
*pnb_args = nb_args;
|
||||
}
|
||||
|
||||
static void help_cmd_dump(Monitor *mon, const mon_cmd_t *cmds,
|
||||
const char *prefix, const char *name)
|
||||
{
|
||||
@ -3434,71 +3532,6 @@ static int get_double(Monitor *mon, double *pval, const char **pp)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_str(char *buf, int buf_size, const char **pp)
|
||||
{
|
||||
const char *p;
|
||||
char *q;
|
||||
int c;
|
||||
|
||||
q = buf;
|
||||
p = *pp;
|
||||
while (qemu_isspace(*p))
|
||||
p++;
|
||||
if (*p == '\0') {
|
||||
fail:
|
||||
*q = '\0';
|
||||
*pp = p;
|
||||
return -1;
|
||||
}
|
||||
if (*p == '\"') {
|
||||
p++;
|
||||
while (*p != '\0' && *p != '\"') {
|
||||
if (*p == '\\') {
|
||||
p++;
|
||||
c = *p++;
|
||||
switch(c) {
|
||||
case 'n':
|
||||
c = '\n';
|
||||
break;
|
||||
case 'r':
|
||||
c = '\r';
|
||||
break;
|
||||
case '\\':
|
||||
case '\'':
|
||||
case '\"':
|
||||
break;
|
||||
default:
|
||||
qemu_printf("unsupported escape code: '\\%c'\n", c);
|
||||
goto fail;
|
||||
}
|
||||
if ((q - buf) < buf_size - 1) {
|
||||
*q++ = c;
|
||||
}
|
||||
} else {
|
||||
if ((q - buf) < buf_size - 1) {
|
||||
*q++ = *p;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
}
|
||||
if (*p != '\"') {
|
||||
qemu_printf("unterminated string\n");
|
||||
goto fail;
|
||||
}
|
||||
p++;
|
||||
} else {
|
||||
while (*p != '\0' && !qemu_isspace(*p)) {
|
||||
if ((q - buf) < buf_size - 1) {
|
||||
*q++ = *p;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
}
|
||||
*q = '\0';
|
||||
*pp = p;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Store the command-name in cmdname, and return a pointer to
|
||||
* the remaining of the command string.
|
||||
@ -3555,8 +3588,6 @@ static char *key_get_info(const char *type, char **key)
|
||||
static int default_fmt_format = 'x';
|
||||
static int default_fmt_size = 4;
|
||||
|
||||
#define MAX_ARGS 16
|
||||
|
||||
static int is_valid_option(const char *c, const char *typestr)
|
||||
{
|
||||
char option[3];
|
||||
@ -4122,32 +4153,6 @@ static void block_completion_it(void *opaque, BlockDriverState *bs)
|
||||
}
|
||||
}
|
||||
|
||||
/* NOTE: this parser is an approximate form of the real command parser */
|
||||
static void parse_cmdline(const char *cmdline,
|
||||
int *pnb_args, char **args)
|
||||
{
|
||||
const char *p;
|
||||
int nb_args, ret;
|
||||
char buf[1024];
|
||||
|
||||
p = cmdline;
|
||||
nb_args = 0;
|
||||
for(;;) {
|
||||
while (qemu_isspace(*p))
|
||||
p++;
|
||||
if (*p == '\0')
|
||||
break;
|
||||
if (nb_args >= MAX_ARGS)
|
||||
break;
|
||||
ret = get_str(buf, sizeof(buf), &p);
|
||||
args[nb_args] = g_strdup(buf);
|
||||
nb_args++;
|
||||
if (ret < 0)
|
||||
break;
|
||||
}
|
||||
*pnb_args = nb_args;
|
||||
}
|
||||
|
||||
static const char *next_arg_type(const char *typestr)
|
||||
{
|
||||
const char *p = strchr(typestr, ':');
|
||||
|
Loading…
Reference in New Issue
Block a user