mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 05:35:25 +00:00
util: json: remove yajl implementation
Since the previous commit removed YAJL detection completely, WITH_YAJL cannot possibly be set. Drop the code. Signed-off-by: Ján Tomko <jtomko@redhat.com> Reviewed-by: Peter Krempa <pkrempa@redhat.com>
This commit is contained in:
parent
d96e753d84
commit
81e532c701
@ -34,10 +34,6 @@
|
||||
|
||||
#if WITH_JSON_C
|
||||
# include <json.h>
|
||||
#elif WITH_YAJL
|
||||
# include <yajl/yajl_gen.h>
|
||||
# include <yajl/yajl_parse.h>
|
||||
|
||||
#endif
|
||||
|
||||
/* XXX fixme */
|
||||
@ -1560,418 +1556,6 @@ virJSONValueToBuffer(virJSONValue *object,
|
||||
}
|
||||
|
||||
|
||||
#elif WITH_YAJL
|
||||
static int
|
||||
virJSONParserInsertValue(virJSONParser *parser,
|
||||
virJSONValue **value)
|
||||
{
|
||||
if (!parser->head) {
|
||||
parser->head = g_steal_pointer(value);
|
||||
} else {
|
||||
virJSONParserState *state;
|
||||
if (!parser->nstate) {
|
||||
VIR_DEBUG("got a value to insert without a container");
|
||||
return -1;
|
||||
}
|
||||
|
||||
state = &parser->state[parser->nstate-1];
|
||||
|
||||
switch (state->value->type) {
|
||||
case VIR_JSON_TYPE_OBJECT: {
|
||||
if (!state->key) {
|
||||
VIR_DEBUG("missing key when inserting object value");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (virJSONValueObjectAppend(state->value,
|
||||
state->key,
|
||||
value) < 0)
|
||||
return -1;
|
||||
|
||||
VIR_FREE(state->key);
|
||||
} break;
|
||||
|
||||
case VIR_JSON_TYPE_ARRAY: {
|
||||
if (state->key) {
|
||||
VIR_DEBUG("unexpected key when inserting array value");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (virJSONValueArrayAppend(state->value,
|
||||
value) < 0)
|
||||
return -1;
|
||||
} break;
|
||||
|
||||
default:
|
||||
VIR_DEBUG("unexpected value type, not a container");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virJSONParserHandleNull(void *ctx)
|
||||
{
|
||||
virJSONParser *parser = ctx;
|
||||
g_autoptr(virJSONValue) value = virJSONValueNewNull();
|
||||
|
||||
VIR_DEBUG("parser=%p", parser);
|
||||
|
||||
if (virJSONParserInsertValue(parser, &value) < 0)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virJSONParserHandleBoolean(void *ctx,
|
||||
int boolean_)
|
||||
{
|
||||
virJSONParser *parser = ctx;
|
||||
g_autoptr(virJSONValue) value = virJSONValueNewBoolean(boolean_);
|
||||
|
||||
VIR_DEBUG("parser=%p boolean=%d", parser, boolean_);
|
||||
|
||||
if (virJSONParserInsertValue(parser, &value) < 0)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virJSONParserHandleNumber(void *ctx,
|
||||
const char *s,
|
||||
size_t l)
|
||||
{
|
||||
virJSONParser *parser = ctx;
|
||||
g_autoptr(virJSONValue) value = virJSONValueNewNumber(g_strndup(s, l));
|
||||
|
||||
VIR_DEBUG("parser=%p str=%s", parser, value->data.number);
|
||||
|
||||
if (virJSONParserInsertValue(parser, &value) < 0)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virJSONParserHandleString(void *ctx,
|
||||
const unsigned char *stringVal,
|
||||
size_t stringLen)
|
||||
{
|
||||
virJSONParser *parser = ctx;
|
||||
g_autoptr(virJSONValue) value = virJSONValueNewString(g_strndup((const char *)stringVal, stringLen));
|
||||
|
||||
VIR_DEBUG("parser=%p str=%p", parser, (const char *)stringVal);
|
||||
|
||||
if (virJSONParserInsertValue(parser, &value) < 0)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virJSONParserHandleMapKey(void *ctx,
|
||||
const unsigned char *stringVal,
|
||||
size_t stringLen)
|
||||
{
|
||||
virJSONParser *parser = ctx;
|
||||
virJSONParserState *state;
|
||||
|
||||
VIR_DEBUG("parser=%p key=%p", parser, (const char *)stringVal);
|
||||
|
||||
if (!parser->nstate)
|
||||
return 0;
|
||||
|
||||
state = &parser->state[parser->nstate-1];
|
||||
if (state->key)
|
||||
return 0;
|
||||
state->key = g_strndup((const char *)stringVal, stringLen);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virJSONParserHandleStartMap(void *ctx)
|
||||
{
|
||||
virJSONParser *parser = ctx;
|
||||
g_autoptr(virJSONValue) value = virJSONValueNewObject();
|
||||
virJSONValue *tmp = value;
|
||||
|
||||
VIR_DEBUG("parser=%p", parser);
|
||||
|
||||
if (virJSONParserInsertValue(parser, &value) < 0)
|
||||
return 0;
|
||||
|
||||
VIR_REALLOC_N(parser->state, parser->nstate + 1);
|
||||
|
||||
parser->state[parser->nstate].value = tmp;
|
||||
parser->state[parser->nstate].key = NULL;
|
||||
parser->nstate++;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virJSONParserHandleEndMap(void *ctx)
|
||||
{
|
||||
virJSONParser *parser = ctx;
|
||||
virJSONParserState *state;
|
||||
|
||||
VIR_DEBUG("parser=%p", parser);
|
||||
|
||||
if (!parser->nstate)
|
||||
return 0;
|
||||
|
||||
state = &(parser->state[parser->nstate-1]);
|
||||
if (state->key) {
|
||||
VIR_FREE(state->key);
|
||||
return 0;
|
||||
}
|
||||
|
||||
VIR_DELETE_ELEMENT(parser->state, parser->nstate - 1, parser->nstate);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virJSONParserHandleStartArray(void *ctx)
|
||||
{
|
||||
virJSONParser *parser = ctx;
|
||||
g_autoptr(virJSONValue) value = virJSONValueNewArray();
|
||||
virJSONValue *tmp = value;
|
||||
|
||||
VIR_DEBUG("parser=%p", parser);
|
||||
|
||||
if (virJSONParserInsertValue(parser, &value) < 0)
|
||||
return 0;
|
||||
|
||||
VIR_REALLOC_N(parser->state, parser->nstate + 1);
|
||||
|
||||
parser->state[parser->nstate].value = tmp;
|
||||
parser->state[parser->nstate].key = NULL;
|
||||
parser->nstate++;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virJSONParserHandleEndArray(void *ctx)
|
||||
{
|
||||
virJSONParser *parser = ctx;
|
||||
virJSONParserState *state;
|
||||
|
||||
VIR_DEBUG("parser=%p", parser);
|
||||
|
||||
if (!(parser->nstate - parser->wrap))
|
||||
return 0;
|
||||
|
||||
state = &(parser->state[parser->nstate-1]);
|
||||
if (state->key) {
|
||||
VIR_FREE(state->key);
|
||||
return 0;
|
||||
}
|
||||
|
||||
VIR_DELETE_ELEMENT(parser->state, parser->nstate - 1, parser->nstate);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static const yajl_callbacks parserCallbacks = {
|
||||
virJSONParserHandleNull,
|
||||
virJSONParserHandleBoolean,
|
||||
NULL,
|
||||
NULL,
|
||||
virJSONParserHandleNumber,
|
||||
virJSONParserHandleString,
|
||||
virJSONParserHandleStartMap,
|
||||
virJSONParserHandleMapKey,
|
||||
virJSONParserHandleEndMap,
|
||||
virJSONParserHandleStartArray,
|
||||
virJSONParserHandleEndArray
|
||||
};
|
||||
|
||||
|
||||
/* XXX add an incremental streaming parser - yajl trivially supports it */
|
||||
virJSONValue *
|
||||
virJSONValueFromString(const char *jsonstring)
|
||||
{
|
||||
yajl_handle hand;
|
||||
virJSONParser parser = { NULL, NULL, 0, 0 };
|
||||
virJSONValue *ret = NULL;
|
||||
int rc;
|
||||
size_t len = strlen(jsonstring);
|
||||
|
||||
VIR_DEBUG("string=%s", jsonstring);
|
||||
|
||||
hand = yajl_alloc(&parserCallbacks, NULL, &parser);
|
||||
if (!hand) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("Unable to create JSON parser"));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Yajl 2 is nice enough to default to rejecting trailing garbage. */
|
||||
rc = yajl_parse(hand, (const unsigned char *)jsonstring, len);
|
||||
if (rc != yajl_status_ok ||
|
||||
yajl_complete_parse(hand) != yajl_status_ok) {
|
||||
unsigned char *errstr = yajl_get_error(hand, 1,
|
||||
(const unsigned char*)jsonstring,
|
||||
strlen(jsonstring));
|
||||
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("cannot parse json %1$s: %2$s"),
|
||||
jsonstring, (const char*) errstr);
|
||||
yajl_free_error(hand, errstr);
|
||||
virJSONValueFree(parser.head);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (parser.nstate != 0) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("cannot parse json %1$s: unterminated string/map/array"),
|
||||
jsonstring);
|
||||
virJSONValueFree(parser.head);
|
||||
} else {
|
||||
ret = parser.head;
|
||||
}
|
||||
|
||||
cleanup:
|
||||
yajl_free(hand);
|
||||
|
||||
if (parser.nstate) {
|
||||
size_t i;
|
||||
for (i = 0; i < parser.nstate; i++)
|
||||
VIR_FREE(parser.state[i].key);
|
||||
VIR_FREE(parser.state);
|
||||
}
|
||||
|
||||
VIR_DEBUG("result=%p", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virJSONValueToStringOne(virJSONValue *object,
|
||||
yajl_gen g)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
VIR_DEBUG("object=%p type=%d gen=%p", object, object->type, g);
|
||||
|
||||
switch (object->type) {
|
||||
case VIR_JSON_TYPE_OBJECT:
|
||||
if (yajl_gen_map_open(g) != yajl_gen_status_ok)
|
||||
return -1;
|
||||
for (i = 0; i < object->data.object.npairs; i++) {
|
||||
if (yajl_gen_string(g,
|
||||
(unsigned char *)object->data.object.pairs[i].key,
|
||||
strlen(object->data.object.pairs[i].key))
|
||||
!= yajl_gen_status_ok)
|
||||
return -1;
|
||||
if (virJSONValueToStringOne(object->data.object.pairs[i].value, g) < 0)
|
||||
return -1;
|
||||
}
|
||||
if (yajl_gen_map_close(g) != yajl_gen_status_ok)
|
||||
return -1;
|
||||
break;
|
||||
case VIR_JSON_TYPE_ARRAY:
|
||||
if (yajl_gen_array_open(g) != yajl_gen_status_ok)
|
||||
return -1;
|
||||
for (i = 0; i < object->data.array.nvalues; i++) {
|
||||
if (virJSONValueToStringOne(object->data.array.values[i], g) < 0)
|
||||
return -1;
|
||||
}
|
||||
if (yajl_gen_array_close(g) != yajl_gen_status_ok)
|
||||
return -1;
|
||||
break;
|
||||
|
||||
case VIR_JSON_TYPE_STRING:
|
||||
if (yajl_gen_string(g, (unsigned char *)object->data.string,
|
||||
strlen(object->data.string)) != yajl_gen_status_ok)
|
||||
return -1;
|
||||
break;
|
||||
|
||||
case VIR_JSON_TYPE_NUMBER:
|
||||
if (yajl_gen_number(g, object->data.number,
|
||||
strlen(object->data.number)) != yajl_gen_status_ok)
|
||||
return -1;
|
||||
break;
|
||||
|
||||
case VIR_JSON_TYPE_BOOLEAN:
|
||||
if (yajl_gen_bool(g, object->data.boolean) != yajl_gen_status_ok)
|
||||
return -1;
|
||||
break;
|
||||
|
||||
case VIR_JSON_TYPE_NULL:
|
||||
if (yajl_gen_null(g) != yajl_gen_status_ok)
|
||||
return -1;
|
||||
break;
|
||||
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
virJSONValueToBuffer(virJSONValue *object,
|
||||
virBuffer *buf,
|
||||
bool pretty)
|
||||
{
|
||||
yajl_gen g;
|
||||
const unsigned char *str;
|
||||
size_t len;
|
||||
int ret = -1;
|
||||
|
||||
VIR_DEBUG("object=%p", object);
|
||||
|
||||
g = yajl_gen_alloc(NULL);
|
||||
if (!g) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("Unable to create JSON formatter"));
|
||||
goto cleanup;
|
||||
}
|
||||
yajl_gen_config(g, yajl_gen_beautify, pretty ? 1 : 0);
|
||||
yajl_gen_config(g, yajl_gen_indent_string, pretty ? " " : " ");
|
||||
yajl_gen_config(g, yajl_gen_validate_utf8, 1);
|
||||
|
||||
if (virJSONValueToStringOne(object, g) < 0) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("failed to convert virJSONValue to yajl data"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (yajl_gen_get_buf(g, &str, &len) != yajl_gen_status_ok) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("failed to format JSON"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
virBufferAdd(buf, (const char *) str, len);
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
yajl_gen_free(g);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
#else
|
||||
virJSONValue *
|
||||
virJSONValueFromString(const char *jsonstring G_GNUC_UNUSED)
|
||||
|
Loading…
Reference in New Issue
Block a user