int column;
} scanner_t;
+static const char *type_names[] = {
+ "object",
+ "array",
+ "string",
+ "integer",
+ "real",
+ "true",
+ "false",
+ "null"
+};
+
+#define type_name(x) type_names[json_typeof(x)]
+
static void next_token(scanner_t *s)
{
const char *t = s->fmt;
case 's': /* string */
{
const char *str = va_arg(*ap, const char *);
- if(!str)
- {
+ if(!str) {
set_error(s, "NULL string");
return NULL;
}
case 'i': /* integer */
return json_integer(va_arg(*ap, int));
- case 'f': /* double-precision float */
+ case 'f': /* real */
return json_real(va_arg(*ap, double));
case 'O': /* a json_t object; increments refcount */
case 'o': /* a json_t object; doesn't increment refcount */
return va_arg(*ap, json_t *);
- default: /* Whoops! */
+ default:
set_error(s, "Unrecognized format character '%c'", s->token);
return NULL;
}
}
if(!json_is_object(root)) {
- set_error(s, "Expected object, got %i", json_typeof(root));
+ set_error(s, "Expected object, got %s", type_name(root));
goto error;
}
next_token(s);
int wildcard = 0;
if(!json_is_array(root)) {
- set_error(s, "Expected array, got %d", json_typeof(root));
+ set_error(s, "Expected array, got %s", type_name(root));
return -1;
}
next_token(s);
return unpack_array(s, root, ap);
case 's':
- if(!json_is_string(root))
- {
- set_error(s, "Type mismatch! Object (%i) wasn't a string.",
- json_typeof(root));
+ if(!json_is_string(root)) {
+ set_error(s, "Expected string, got %s", type_name(root));
return -1;
}
str = va_arg(*ap, const char **);
if(!str) {
- set_error(s, "Passed a NULL string pointer!");
+ set_error(s, "NULL string");
return -1;
}
return 0;
case 'i':
- if(!json_is_integer(root))
- {
- set_error(s, "Type mismatch! Object (%i) wasn't an integer.",
- json_typeof(root));
+ if(!json_is_integer(root)) {
+ set_error(s, "Expected integer, got %s", type_name(root));
return -1;
}
return 0;
case 'b':
- if(!json_is_boolean(root))
- {
- set_error(s, "Type mismatch! Object (%i) wasn't a boolean.",
- json_typeof(root));
+ if(!json_is_boolean(root)) {
+ set_error(s, "Expected true or false, got %s", type_name(root));
return -1;
}
return 0;
case 'f':
- if(!json_is_number(root))
- {
- set_error(s, "Type mismatch! Object (%i) wasn't a real.",
- json_typeof(root));
+ if(!json_is_real(root)) {
+ set_error(s, "Expected real, got %s", type_name(root));
+ return -1;
+ }
+
+ if(!(s->flags & JSON_VALIDATE_ONLY))
+ *va_arg(*ap, double*) = json_real_value(root);
+
+ return 0;
+
+ case 'F':
+ if(!json_is_number(root)) {
+ set_error(s, "Expected real or integer, got %s",
+ type_name(root));
return -1;
}
case 'n':
/* Never assign, just validate */
- if(!json_is_null(root))
- {
- set_error(s, "Type mismatch! Object (%i) wasn't null.",
- json_typeof(root));
+ if(!json_is_null(root)) {
+ set_error(s, "Expected null, got %s", type_name(root));
return -1;
}
return 0;
jsonp_error_init(error, "");
if(!fmt || !*fmt) {
- jsonp_error_set(error, 1, 1, "Null or empty format string!");
+ jsonp_error_set(error, 1, 1, "Null or empty format string");
return NULL;
}
jsonp_error_init(error, "");
if(!fmt || !*fmt) {
- jsonp_error_set(error, 1, 1, "Null or empty format string!");
+ jsonp_error_set(error, 1, 1, "Null or empty format string");
return -1;
}