bool TRI_PrintJson (int fd, TRI_json_t const* object) { TRI_string_buffer_t buffer; char const* p; size_t n; TRI_InitStringBuffer(&buffer, TRI_UNKNOWN_MEM_ZONE); StringifyJson(buffer._memoryZone, &buffer, object, true); p = TRI_BeginStringBuffer(&buffer); n = TRI_LengthStringBuffer(&buffer); while (0 < n) { ssize_t m = TRI_WRITE(fd, p, n); if (m <= 0) { TRI_AnnihilateStringBuffer(&buffer); return false; } n -= m; p += m; } TRI_AnnihilateStringBuffer(&buffer); return true; }
bool TRI_PrintJson (int fd, TRI_json_t const* object, bool appendNewline) { TRI_string_buffer_t buffer; char const* p; size_t n; if (object == NULL) { // sanity check return false; } TRI_InitStringBuffer(&buffer, TRI_UNKNOWN_MEM_ZONE); if (StringifyJson(buffer._memoryZone, &buffer, object, true) != TRI_ERROR_NO_ERROR) { TRI_AnnihilateStringBuffer(&buffer); return false; } if (TRI_LengthStringBuffer(&buffer) == 0) { // should not happen return false; } if (appendNewline) { // add the newline here so we only need one write operation in the ideal case TRI_AppendCharStringBuffer(&buffer, '\n'); } p = TRI_BeginStringBuffer(&buffer); n = TRI_LengthStringBuffer(&buffer); while (0 < n) { ssize_t m = TRI_WRITE(fd, p, (TRI_write_t) n); if (m <= 0) { TRI_AnnihilateStringBuffer(&buffer); return false; } n -= m; p += m; } TRI_AnnihilateStringBuffer(&buffer); return true; }
int TRI_Stringify2Json (TRI_string_buffer_t* buffer, TRI_json_t const* object) { return StringifyJson(buffer->_memoryZone, buffer, object, false); }
static int StringifyJson (TRI_memory_zone_t* zone, TRI_string_buffer_t* buffer, TRI_json_t const* object, bool braces) { size_t n; size_t i; size_t outLength; char* ptr; int res; switch (object->_type) { case TRI_JSON_UNUSED: break; case TRI_JSON_NULL: res = TRI_AppendStringStringBuffer(buffer, "null"); if (res != TRI_ERROR_NO_ERROR) { return res; } break; case TRI_JSON_BOOLEAN: if (object->_value._boolean) { res = TRI_AppendStringStringBuffer(buffer, "true"); } else { res = TRI_AppendStringStringBuffer(buffer, "false"); } if (res != TRI_ERROR_NO_ERROR) { return res; } break; case TRI_JSON_NUMBER: res = TRI_AppendDoubleStringBuffer(buffer, object->_value._number); if (res != TRI_ERROR_NO_ERROR) { return res; } break; case TRI_JSON_STRING: res = TRI_AppendStringStringBuffer(buffer, "\""); if (res != TRI_ERROR_NO_ERROR) { return res; } ptr = TRI_EscapeUtf8StringZ(zone, object->_value._string.data, object->_value._string.length - 1, false, &outLength); if (ptr == NULL) { return TRI_ERROR_OUT_OF_MEMORY; } res = TRI_AppendString2StringBuffer(buffer, ptr, outLength); if (res != TRI_ERROR_NO_ERROR) { return res; } TRI_Free(zone, ptr); res = TRI_AppendStringStringBuffer(buffer, "\""); if (res != TRI_ERROR_NO_ERROR) { return res; } break; case TRI_JSON_ARRAY: if (braces) { res = TRI_AppendStringStringBuffer(buffer, "{"); if (res != TRI_ERROR_NO_ERROR) { return res; } } n = object->_value._objects._length; for (i = 0; i < n; i += 2) { if (0 < i) { res = TRI_AppendStringStringBuffer(buffer, ","); if (res != TRI_ERROR_NO_ERROR) { return res; } } res = StringifyJson(zone, buffer, TRI_AtVector(&object->_value._objects, i), true); if (res != TRI_ERROR_NO_ERROR) { return res; } res = TRI_AppendCharStringBuffer(buffer, ':'); if (res != TRI_ERROR_NO_ERROR) { return res; } res = StringifyJson(zone, buffer, TRI_AtVector(&object->_value._objects, i + 1), true); if (res != TRI_ERROR_NO_ERROR) { return res; } } if (braces) { res = TRI_AppendStringStringBuffer(buffer, "}"); if (res != TRI_ERROR_NO_ERROR) { return res; } } break; case TRI_JSON_LIST: if (braces) { res = TRI_AppendStringStringBuffer(buffer, "["); if (res != TRI_ERROR_NO_ERROR) { return res; } } n = object->_value._objects._length; for (i = 0; i < n; ++i) { if (0 < i) { res = TRI_AppendStringStringBuffer(buffer, ","); if (res != TRI_ERROR_NO_ERROR) { return res; } } res = StringifyJson(zone, buffer, TRI_AtVector(&object->_value._objects, i), true); if (res != TRI_ERROR_NO_ERROR) { return res; } } if (braces) { res = TRI_AppendStringStringBuffer(buffer, "]"); if (res != TRI_ERROR_NO_ERROR) { return res; } } break; } return TRI_ERROR_NO_ERROR; }
static int StringifyJson (TRI_memory_zone_t* zone, TRI_string_buffer_t* buffer, TRI_json_t const* object, bool braces) { int res; switch (object->_type) { case TRI_JSON_UNUSED: { break; } case TRI_JSON_NULL: { res = TRI_AppendString2StringBuffer(buffer, "null", 4); // strlen("null") if (res != TRI_ERROR_NO_ERROR) { return res; } break; } case TRI_JSON_BOOLEAN: { if (object->_value._boolean) { res = TRI_AppendString2StringBuffer(buffer, "true", 4); // strlen("true") } else { res = TRI_AppendString2StringBuffer(buffer, "false", 5); // strlen("false") } if (res != TRI_ERROR_NO_ERROR) { return res; } break; } case TRI_JSON_NUMBER: { res = TRI_AppendDoubleStringBuffer(buffer, object->_value._number); if (res != TRI_ERROR_NO_ERROR) { return res; } break; } case TRI_JSON_STRING: case TRI_JSON_STRING_REFERENCE: { res = TRI_AppendCharStringBuffer(buffer, '\"'); if (res != TRI_ERROR_NO_ERROR) { return res; } if (object->_value._string.length > 0) { // optimisation for the empty string res = TRI_AppendJsonEncodedStringStringBuffer(buffer, object->_value._string.data, false); if (res != TRI_ERROR_NO_ERROR) { return TRI_ERROR_OUT_OF_MEMORY; } } res = TRI_AppendCharStringBuffer(buffer, '\"'); if (res != TRI_ERROR_NO_ERROR) { return res; } break; } case TRI_JSON_ARRAY: { size_t i, n; if (braces) { res = TRI_AppendCharStringBuffer(buffer, '{'); if (res != TRI_ERROR_NO_ERROR) { return res; } } n = object->_value._objects._length; for (i = 0; i < n; i += 2) { if (0 < i) { res = TRI_AppendCharStringBuffer(buffer, ','); if (res != TRI_ERROR_NO_ERROR) { return res; } } res = StringifyJson(zone, buffer, (const TRI_json_t*) TRI_AtVector(&object->_value._objects, i), true); if (res != TRI_ERROR_NO_ERROR) { return res; } res = TRI_AppendCharStringBuffer(buffer, ':'); if (res != TRI_ERROR_NO_ERROR) { return res; } res = StringifyJson(zone, buffer, (const TRI_json_t*) TRI_AtVector(&object->_value._objects, i + 1), true); if (res != TRI_ERROR_NO_ERROR) { return res; } } if (braces) { res = TRI_AppendCharStringBuffer(buffer, '}'); if (res != TRI_ERROR_NO_ERROR) { return res; } } break; } case TRI_JSON_LIST: { size_t i, n; if (braces) { res = TRI_AppendCharStringBuffer(buffer, '['); if (res != TRI_ERROR_NO_ERROR) { return res; } } n = object->_value._objects._length; for (i = 0; i < n; ++i) { if (0 < i) { res = TRI_AppendCharStringBuffer(buffer, ','); if (res != TRI_ERROR_NO_ERROR) { return res; } } res = StringifyJson(zone, buffer, (const TRI_json_t*) TRI_AtVector(&object->_value._objects, i), true); if (res != TRI_ERROR_NO_ERROR) { return res; } } if (braces) { res = TRI_AppendCharStringBuffer(buffer, ']'); if (res != TRI_ERROR_NO_ERROR) { return res; } } break; } } return TRI_ERROR_NO_ERROR; }