Пример #1
0
void *json_write_pretty(const struct json_value_s *value, const char *indent,
                        const char *newline, size_t *out_size) {
  size_t size = 0;
  size_t indent_size = 0;
  size_t newline_size = 0;
  char *data = 0;
  char *data_end = 0;

  if (0 == value) {
    return 0;
  }

  if (0 == indent) {
    indent = "  "; // default to two spaces
  }

  if (0 == newline) {
    newline = "\n"; // default to linux newlines
  }

  while ('\0' != indent[indent_size]) {
    ++indent_size; // skip non-null terminating characters
  }

  while ('\0' != newline[newline_size]) {
    ++newline_size; // skip non-null terminating characters
  }

  if (json_write_pretty_get_value_size(value, 0, indent_size, newline_size,
                                       &size)) {
    // value was malformed!
    return 0;
  }

  size += 1; // for the '\0' null terminating character

  data = malloc(size);

  if (0 == data) {
    // malloc failed!
    return 0;
  }

  data_end = json_write_pretty_value(value, 0, indent, newline, data);

  if (0 == data_end) {
    // bad chi occurred!
    free(data);
    return 0;
  }

  // null terminated the string
  *data_end = '\0';

  if (0 != out_size) {
    *out_size = size;
  }

  return data;
}
Пример #2
0
static char* json_write_pretty_object(const struct json_object_s* object,
  size_t depth, const char* indent, const char* newline, char* data) {
  size_t k, m;
  struct json_object_element_s* element;

  *data++ = '{'; // open the object

  for (k = 0; '\0' != newline[k]; k++) {
    *data++ = newline[k];
  }

  for (element = object->start; 0 != element; element = element->next) {
    if (element != object->start) {
      *data++ = ','; // ','s seperate each element

      for (k = 0; '\0' != newline[k]; k++) {
        *data++ = newline[k];
      }
    }

    for (k = 0; k < depth + 1; k++) {
      for (m = 0; '\0' != indent[m]; m++) {
        *data++ = indent[m];
      }
    }

    data = json_write_pretty_string(element->name, data);

    if (0 == data) {
      // string was malformed!
      return 0;
    }

    // " : "s seperate each name/value pair
    *data++ = ' ';
    *data++ = ':';
    *data++ = ' ';

    data = json_write_pretty_value(element->value, depth + 1, indent, newline, data);

    if (0 == data) {
      // value was malformed!
      return 0;
    }
  }

  for (k = 0; '\0' != newline[k]; k++) {
    *data++ = newline[k];
  }

  for (k = 0; k < depth; k++) {
    for (m = 0; '\0' != indent[m]; m++) {
      *data++ = indent[m];
    }
  }

  *data++ = '}'; // close the object

  return data;
}
Пример #3
0
static char *json_write_pretty_array(const struct json_array_s *array,
                                     size_t depth, const char *indent,
                                     const char *newline, char *data) {
  size_t k, m;
  struct json_array_element_s *element;

  *data++ = '['; // open the array

  if (0 < array->length) {
    for (k = 0; '\0' != newline[k]; k++) {
      *data++ = newline[k];
    }

    for (element = array->start; 0 != element; element = element->next) {
      if (element != array->start) {
        *data++ = ','; // ','s seperate each element

        for (k = 0; '\0' != newline[k]; k++) {
          *data++ = newline[k];
        }
      }

      for (k = 0; k < depth + 1; k++) {
        for (m = 0; '\0' != indent[m]; m++) {
          *data++ = indent[m];
        }
      }

      data = json_write_pretty_value(element->value, depth + 1, indent, newline,
                                     data);

      if (0 == data) {
        // value was malformed!
        return 0;
      }
    }

    for (k = 0; '\0' != newline[k]; k++) {
      *data++ = newline[k];
    }

    for (k = 0; k < depth; k++) {
      for (m = 0; '\0' != indent[m]; m++) {
        *data++ = indent[m];
      }
    }
  }

  *data++ = ']'; // close the array

  return data;
}