Exemplo n.º 1
0
static int json_write_pretty_get_value_size(const struct json_value_s* value,
  size_t depth, size_t indent_size, size_t newline_size, size_t* size) {
  switch (value->type) {
  default:
    // unknown value type found!
    return 1;
  case json_type_number:
    return json_write_pretty_get_number_size((struct json_number_s*)value->payload, size);
  case json_type_string:
    return json_write_pretty_get_string_size((struct json_string_s*)value->payload, size);
  case json_type_array:
    return json_write_pretty_get_array_size((struct json_array_s*)value->payload, depth, indent_size, newline_size, size);
  case json_type_object:
    return json_write_pretty_get_object_size((struct json_object_s*)value->payload, depth, indent_size, newline_size, size);
  case json_type_true:
    *size += 4; // the string "true"
    return 0;
  case json_type_false:
    *size += 5; // the string "false"
    return 0;
  case json_type_null:
    *size += 4; // the string "null"
    return 0;
  }
}
Exemplo n.º 2
0
static int json_write_pretty_get_object_size(const struct json_object_s* object,
  size_t depth, size_t indent_size, size_t newline_size, size_t* size) {
  struct json_object_element_s* element;

  *size += 1; // '{'
  *size += newline_size; // need a newline next

  if (1 < object->length) {
    *size += object->length - 1; // ','s seperate each element
  }

  for (element = object->start; 0 != element; element = element->next) {
    // each element gets an indent and newline
    *size += (depth + 1) * indent_size;
    *size += newline_size;

    if (json_write_pretty_get_string_size(element->name, size)) {
      // string was malformed!
      return 1;
    }

    *size += 3; // seperate each name/value pair with " : "

    if (json_write_pretty_get_value_size(element->value, depth + 1, indent_size, newline_size, size)) {
      // value was malformed!
      return 1;
    }
  }

  *size += depth * indent_size;
  *size += 1; // '}'
  *size += newline_size; // need a newline next

  return 0;
}