Revision 449041d4

b/hw/qdev-properties.c
67 67
static int parse_uint8(DeviceState *dev, Property *prop, const char *str)
68 68
{
69 69
    uint8_t *ptr = qdev_get_prop_ptr(dev, prop);
70
    const char *fmt;
70
    char *end;
71 71

  
72 72
    /* accept both hex and decimal */
73
    fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx8 : "%" PRIu8;
74
    if (sscanf(str, fmt, ptr) != 1)
73
    *ptr = strtoul(str, &end, 0);
74
    if ((*end != '\0') || (end == str)) {
75 75
        return -EINVAL;
76
    }
77

  
76 78
    return 0;
77 79
}
78 80

  
......
95 97
static int parse_uint16(DeviceState *dev, Property *prop, const char *str)
96 98
{
97 99
    uint16_t *ptr = qdev_get_prop_ptr(dev, prop);
98
    const char *fmt;
100
    char *end;
99 101

  
100 102
    /* accept both hex and decimal */
101
    fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx16 : "%" PRIu16;
102
    if (sscanf(str, fmt, ptr) != 1)
103
    *ptr = strtoul(str, &end, 0);
104
    if ((*end != '\0') || (end == str)) {
103 105
        return -EINVAL;
106
    }
107

  
104 108
    return 0;
105 109
}
106 110

  
......
123 127
static int parse_uint32(DeviceState *dev, Property *prop, const char *str)
124 128
{
125 129
    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
126
    const char *fmt;
130
    char *end;
127 131

  
128 132
    /* accept both hex and decimal */
129
    fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx32 : "%" PRIu32;
130
    if (sscanf(str, fmt, ptr) != 1)
133
    *ptr = strtoul(str, &end, 0);
134
    if ((*end != '\0') || (end == str)) {
131 135
        return -EINVAL;
136
    }
137

  
132 138
    return 0;
133 139
}
134 140

  
......
149 155
static int parse_int32(DeviceState *dev, Property *prop, const char *str)
150 156
{
151 157
    int32_t *ptr = qdev_get_prop_ptr(dev, prop);
158
    char *end;
152 159

  
153
    if (sscanf(str, "%" PRId32, ptr) != 1)
160
    *ptr = strtol(str, &end, 10);
161
    if ((*end != '\0') || (end == str)) {
154 162
        return -EINVAL;
163
    }
164

  
155 165
    return 0;
156 166
}
157 167

  
......
174 184
static int parse_hex32(DeviceState *dev, Property *prop, const char *str)
175 185
{
176 186
    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
187
    char *end;
177 188

  
178
    if (sscanf(str, "%" PRIx32, ptr) != 1)
189
    *ptr = strtoul(str, &end, 16);
190
    if ((*end != '\0') || (end == str)) {
179 191
        return -EINVAL;
192
    }
193

  
180 194
    return 0;
181 195
}
182 196

  
......
199 213
static int parse_uint64(DeviceState *dev, Property *prop, const char *str)
200 214
{
201 215
    uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
202
    const char *fmt;
216
    char *end;
203 217

  
204 218
    /* accept both hex and decimal */
205
    fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx64 : "%" PRIu64;
206
    if (sscanf(str, fmt, ptr) != 1)
219
    *ptr = strtoull(str, &end, 0);
220
    if ((*end != '\0') || (end == str)) {
207 221
        return -EINVAL;
222
    }
223

  
208 224
    return 0;
209 225
}
210 226

  
......
227 243
static int parse_hex64(DeviceState *dev, Property *prop, const char *str)
228 244
{
229 245
    uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
246
    char *end;
230 247

  
231
    if (sscanf(str, "%" PRIx64, ptr) != 1)
248
    *ptr = strtoull(str, &end, 16);
249
    if ((*end != '\0') || (end == str)) {
232 250
        return -EINVAL;
251
    }
252

  
233 253
    return 0;
234 254
}
235 255

  

Also available in: Unified diff