Looks good. --Justin
On Mar 27, 2013, at 2:44 PM, Ben Pfaff <b...@nicira.com> wrote: > These will be used for the first time in an upcoming commit. > > Signed-off-by: Ben Pfaff <b...@nicira.com> > --- > lib/ovsdb-data.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++- > lib/ovsdb-data.h | 6 +++- > tests/test-ovsdb.c | 14 ++++++-- > 3 files changed, 108 insertions(+), 5 deletions(-) > > diff --git a/lib/ovsdb-data.c b/lib/ovsdb-data.c > index 0afd03a..7ec7694 100644 > --- a/lib/ovsdb-data.c > +++ b/lib/ovsdb-data.c > @@ -1,4 +1,4 @@ > -/* Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc. > +/* Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc. > * > * Licensed under the Apache License, Version 2.0 (the "License"); > * you may not use this file except in compliance with the License. > @@ -466,6 +466,47 @@ ovsdb_atom_to_json(const union ovsdb_atom *atom, enum > ovsdb_atomic_type type) > } > } > > +/* Returns strlen(json_to_string(ovsdb_atom_to_json(atom, type), 0)). */ > +size_t > +ovsdb_atom_json_length(const union ovsdb_atom *atom, > + enum ovsdb_atomic_type type) > +{ > + struct json json; > + > + switch (type) { > + case OVSDB_TYPE_VOID: > + NOT_REACHED(); > + > + case OVSDB_TYPE_INTEGER: > + json.type = JSON_INTEGER; > + json.u.integer = atom->integer; > + break; > + > + case OVSDB_TYPE_REAL: > + json.type = JSON_REAL; > + json.u.real = atom->real; > + break; > + > + case OVSDB_TYPE_BOOLEAN: > + json.type = atom->boolean ? JSON_TRUE : JSON_FALSE; > + break; > + > + case OVSDB_TYPE_STRING: > + json.type = JSON_STRING; > + json.u.string = atom->string; > + break; > + > + case OVSDB_TYPE_UUID: > + return strlen("[\"uuid\",\"00000000-0000-0000-0000-000000000000\"]"); > + > + case OVSDB_N_TYPES: > + default: > + NOT_REACHED(); > + } > + > + return json_serialized_length(&json); > +} > + > static char * > ovsdb_atom_from_string__(union ovsdb_atom *atom, > const struct ovsdb_base_type *base, const char *s, > @@ -1307,6 +1348,56 @@ ovsdb_datum_to_json(const struct ovsdb_datum *datum, > } > } > > +/* Returns strlen(json_to_string(ovsdb_datum_to_json(datum, type), 0)). */ > +size_t > +ovsdb_datum_json_length(const struct ovsdb_datum *datum, > + const struct ovsdb_type *type) > +{ > + if (ovsdb_type_is_map(type)) { > + size_t length; > + > + /* ["map",[...]]. */ > + length = 10; > + if (datum->n > 0) { > + size_t i; > + > + /* Commas between pairs in the inner [...] */ > + length += datum->n - 1; > + > + /* [,] in each pair. */ > + length += datum->n * 3; > + > + /* Data. */ > + for (i = 0; i < datum->n; i++) { > + length += ovsdb_atom_json_length(&datum->keys[i], > + type->key.type); > + length += ovsdb_atom_json_length(&datum->values[i], > + type->value.type); > + } > + } > + return length; > + } else if (datum->n == 1) { > + return ovsdb_atom_json_length(&datum->keys[0], type->key.type); > + } else { > + size_t length; > + size_t i; > + > + /* ["set",[...]]. */ > + length = 10; > + if (datum->n > 0) { > + /* Commas between elements in the inner [...]. */ > + length += datum->n - 1; > + > + /* Data. */ > + for (i = 0; i < datum->n; i++) { > + length += ovsdb_atom_json_length(&datum->keys[i], > + type->key.type); > + } > + } > + return length; > + } > +} > + > static const char * > skip_spaces(const char *p) > { > diff --git a/lib/ovsdb-data.h b/lib/ovsdb-data.h > index 2e31cc5..ece1672 100644 > --- a/lib/ovsdb-data.h > +++ b/lib/ovsdb-data.h > @@ -1,4 +1,4 @@ > -/* Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc. > +/* Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc. > * > * Licensed under the Apache License, Version 2.0 (the "License"); > * you may not use this file except in compliance with the License. > @@ -88,6 +88,8 @@ struct ovsdb_error *ovsdb_atom_from_json(union ovsdb_atom *, > WARN_UNUSED_RESULT; > struct json *ovsdb_atom_to_json(const union ovsdb_atom *, > enum ovsdb_atomic_type); > +size_t ovsdb_atom_json_length(const union ovsdb_atom *, > + enum ovsdb_atomic_type); > > char *ovsdb_atom_from_string(union ovsdb_atom *, > const struct ovsdb_base_type *, const char *, > @@ -163,6 +165,8 @@ struct ovsdb_error *ovsdb_datum_from_json(struct > ovsdb_datum *, > WARN_UNUSED_RESULT; > struct json *ovsdb_datum_to_json(const struct ovsdb_datum *, > const struct ovsdb_type *); > +size_t ovsdb_datum_json_length(const struct ovsdb_datum *, > + const struct ovsdb_type *); > > char *ovsdb_datum_from_string(struct ovsdb_datum *, > const struct ovsdb_type *, const char *, > diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c > index 81b5f9f..658259e 100644 > --- a/tests/test-ovsdb.c > +++ b/tests/test-ovsdb.c > @@ -218,13 +218,16 @@ unbox_json(struct json *json) > } > } > > -static void > +static size_t > print_and_free_json(struct json *json) > { > char *string = json_to_string(json, JSSF_SORT); > + size_t length = strlen(string); > json_destroy(json); > puts(string); > free(string); > + > + return length; > } > > static void > @@ -442,7 +445,10 @@ do_parse_atoms(int argc, char *argv[]) > if (error) { > print_and_free_ovsdb_error(error); > } else { > - print_and_free_json(ovsdb_atom_to_json(&atom, base.type)); > + size_t length; > + > + length = print_and_free_json(ovsdb_atom_to_json(&atom, > base.type)); > + ovs_assert(length == ovsdb_atom_json_length(&atom, base.type)); > ovsdb_atom_destroy(&atom, base.type); > } > } > @@ -494,12 +500,14 @@ do_parse_data__(int argc, char *argv[], > > for (i = 2; i < argc; i++) { > struct ovsdb_datum datum; > + size_t length; > > json = unbox_json(parse_json(argv[i])); > check_ovsdb_error(parse(&datum, &type, json, NULL)); > json_destroy(json); > > - print_and_free_json(ovsdb_datum_to_json(&datum, &type)); > + length = print_and_free_json(ovsdb_datum_to_json(&datum, &type)); > + ovs_assert(length == ovsdb_datum_json_length(&datum, &type)); > > ovsdb_datum_destroy(&datum, &type); > } > -- > 1.7.2.5 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev