mirror of https://gitee.com/openkylin/qemu.git
qemu-io: Make cvtnum() a wrapper around strtosz_suffix()
No reason to implement the same thing multiple times. A nice side effect is that fractional numbers like 0.5M can be used in qemu-io now. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
5e00984aef
commit
b6e356aa25
37
cmd.c
37
cmd.c
|
@ -344,43 +344,6 @@ doneline(
|
||||||
#define MEGABYTES(x) ((long long)(x) << 20)
|
#define MEGABYTES(x) ((long long)(x) << 20)
|
||||||
#define KILOBYTES(x) ((long long)(x) << 10)
|
#define KILOBYTES(x) ((long long)(x) << 10)
|
||||||
|
|
||||||
long long
|
|
||||||
cvtnum(
|
|
||||||
char *s)
|
|
||||||
{
|
|
||||||
long long i;
|
|
||||||
char *sp;
|
|
||||||
int c;
|
|
||||||
|
|
||||||
i = strtoll(s, &sp, 0);
|
|
||||||
if (i == 0 && sp == s)
|
|
||||||
return -1LL;
|
|
||||||
if (*sp == '\0')
|
|
||||||
return i;
|
|
||||||
|
|
||||||
if (sp[1] != '\0')
|
|
||||||
return -1LL;
|
|
||||||
|
|
||||||
c = qemu_tolower(*sp);
|
|
||||||
switch (c) {
|
|
||||||
default:
|
|
||||||
return i;
|
|
||||||
case 'k':
|
|
||||||
return KILOBYTES(i);
|
|
||||||
case 'm':
|
|
||||||
return MEGABYTES(i);
|
|
||||||
case 'g':
|
|
||||||
return GIGABYTES(i);
|
|
||||||
case 't':
|
|
||||||
return TERABYTES(i);
|
|
||||||
case 'p':
|
|
||||||
return PETABYTES(i);
|
|
||||||
case 'e':
|
|
||||||
return EXABYTES(i);
|
|
||||||
}
|
|
||||||
return -1LL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define TO_EXABYTES(x) ((x) / EXABYTES(1))
|
#define TO_EXABYTES(x) ((x) / EXABYTES(1))
|
||||||
#define TO_PETABYTES(x) ((x) / PETABYTES(1))
|
#define TO_PETABYTES(x) ((x) / PETABYTES(1))
|
||||||
#define TO_TERABYTES(x) ((x) / TERABYTES(1))
|
#define TO_TERABYTES(x) ((x) / TERABYTES(1))
|
||||||
|
|
1
cmd.h
1
cmd.h
|
@ -58,7 +58,6 @@ char **breakline(char *input, int *count);
|
||||||
void doneline(char *input, char **vec);
|
void doneline(char *input, char **vec);
|
||||||
char *fetchline(void);
|
char *fetchline(void);
|
||||||
|
|
||||||
long long cvtnum(char *s);
|
|
||||||
void cvtstr(double value, char *str, size_t sz);
|
void cvtstr(double value, char *str, size_t sz);
|
||||||
|
|
||||||
struct timeval tsub(struct timeval t1, struct timeval t2);
|
struct timeval tsub(struct timeval t1, struct timeval t2);
|
||||||
|
|
|
@ -29,6 +29,12 @@ static BlockDriverState *bs;
|
||||||
|
|
||||||
static int misalign;
|
static int misalign;
|
||||||
|
|
||||||
|
static int64_t cvtnum(const char *s)
|
||||||
|
{
|
||||||
|
char *end;
|
||||||
|
return strtosz_suffix(s, &end, STRTOSZ_DEFSUFFIX_B);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Parse the pattern argument to various sub-commands.
|
* Parse the pattern argument to various sub-commands.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue