monitor: New argument type 'b'
This is a double value with optional suffixes G, g, M, m, K, k. We'll need this to get migrate_set_speed() QMP-ready. Signed-off-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
		
							parent
							
								
									acc3b0336c
								
							
						
					
					
						commit
						3350a4dd07
					
				
							
								
								
									
										64
									
								
								monitor.c
								
								
								
								
							
							
						
						
									
										64
									
								
								monitor.c
								
								
								
								
							| 
						 | 
				
			
			@ -47,6 +47,7 @@
 | 
			
		|||
#include "kvm.h"
 | 
			
		||||
#include "acl.h"
 | 
			
		||||
#include "qint.h"
 | 
			
		||||
#include "qfloat.h"
 | 
			
		||||
#include "qlist.h"
 | 
			
		||||
#include "qdict.h"
 | 
			
		||||
#include "qbool.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -70,6 +71,10 @@
 | 
			
		|||
 * 'l'          target long (32 or 64 bit)
 | 
			
		||||
 * 'M'          just like 'l', except in user mode the value is
 | 
			
		||||
 *              multiplied by 2^20 (think Mebibyte)
 | 
			
		||||
 * 'b'          double
 | 
			
		||||
 *              user mode accepts an optional G, g, M, m, K, k suffix,
 | 
			
		||||
 *              which multiplies the value by 2^30 for suffixes G and
 | 
			
		||||
 *              g, 2^20 for M and m, 2^10 for K and k
 | 
			
		||||
 * '/'          optional gdb-like print format (like "/10x")
 | 
			
		||||
 *
 | 
			
		||||
 * '?'          optional type (for all types, except '/')
 | 
			
		||||
| 
						 | 
				
			
			@ -3299,6 +3304,27 @@ static int get_expr(Monitor *mon, int64_t *pval, const char **pp)
 | 
			
		|||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int get_double(Monitor *mon, double *pval, const char **pp)
 | 
			
		||||
{
 | 
			
		||||
    const char *p = *pp;
 | 
			
		||||
    char *tailp;
 | 
			
		||||
    double d;
 | 
			
		||||
 | 
			
		||||
    d = strtod(p, &tailp);
 | 
			
		||||
    if (tailp == p) {
 | 
			
		||||
        monitor_printf(mon, "Number expected\n");
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
    if (d != d || d - d != 0) {
 | 
			
		||||
        /* NaN or infinity */
 | 
			
		||||
        monitor_printf(mon, "Bad number\n");
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
    *pval = d;
 | 
			
		||||
    *pp = tailp;
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int get_str(char *buf, int buf_size, const char **pp)
 | 
			
		||||
{
 | 
			
		||||
    const char *p;
 | 
			
		||||
| 
						 | 
				
			
			@ -3635,6 +3661,38 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon,
 | 
			
		|||
                qdict_put(qdict, key, qint_from_int(val));
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        case 'b':
 | 
			
		||||
            {
 | 
			
		||||
                double val;
 | 
			
		||||
 | 
			
		||||
                while (qemu_isspace(*p))
 | 
			
		||||
                    p++;
 | 
			
		||||
                if (*typestr == '?') {
 | 
			
		||||
                    typestr++;
 | 
			
		||||
                    if (*p == '\0') {
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if (get_double(mon, &val, &p) < 0) {
 | 
			
		||||
                    goto fail;
 | 
			
		||||
                }
 | 
			
		||||
                if (*p) {
 | 
			
		||||
                    switch (*p) {
 | 
			
		||||
                    case 'K': case 'k':
 | 
			
		||||
                        val *= 1 << 10; p++; break;
 | 
			
		||||
                    case 'M': case 'm':
 | 
			
		||||
                        val *= 1 << 20; p++; break;
 | 
			
		||||
                    case 'G': case 'g':
 | 
			
		||||
                        val *= 1 << 30; p++; break;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if (*p && !qemu_isspace(*p)) {
 | 
			
		||||
                    monitor_printf(mon, "Unknown unit suffix\n");
 | 
			
		||||
                    goto fail;
 | 
			
		||||
                }
 | 
			
		||||
                qdict_put(qdict, key, qfloat_from_double(val));
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        case '-':
 | 
			
		||||
            {
 | 
			
		||||
                const char *tmp = p;
 | 
			
		||||
| 
						 | 
				
			
			@ -4060,6 +4118,12 @@ static int check_arg(const CmdArgs *cmd_args, QDict *args)
 | 
			
		|||
                return -1;
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        case 'b':
 | 
			
		||||
            if (qobject_type(value) != QTYPE_QINT && qobject_type(value) != QTYPE_QFLOAT) {
 | 
			
		||||
                qemu_error_new(QERR_INVALID_PARAMETER_TYPE, name, "number");
 | 
			
		||||
                return -1;
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        case '-':
 | 
			
		||||
            if (qobject_type(value) != QTYPE_QINT &&
 | 
			
		||||
                qobject_type(value) != QTYPE_QBOOL) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue