nvpair_json.c revision 37c79205ad46187f54b2edbf6a468160935f14d9
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
*/
/*
* Copyright (c) 2014, Joyent, Inc.
*/
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <wchar.h>
#include "libnvpair.h"
do { \
return (-1); \
} while (0)
/*
* When formatting a string for JSON output we must escape certain characters,
* as described in RFC4627. This applies to both member names and
* DATA_TYPE_STRING values.
*
* This function will only operate correctly if the following conditions are
* met:
*
* 1. The input String is encoded in the current locale.
*
* 2. The current locale includes the Basic Multilingual Plane (plane 0)
* as defined in the Unicode standard.
*
* The output will be entirely 7-bit ASCII (as a subset of UTF-8) with all
* representable Unicode characters included in their escaped numeric form.
*/
static int
{
wchar_t c;
switch (c) {
case '"':
break;
case '\n':
break;
case '\r':
break;
case '\\':
break;
case '\f':
break;
case '\t':
break;
case '\b':
break;
default:
if ((c >= 0x00 && c <= 0x1f) ||
(c > 0x7f && c <= 0xffff)) {
/*
* Render both Control Characters and Unicode
* characters in the Basic Multilingual Plane
* as JSON-escaped multibyte characters.
*/
} else if (c >= 0x20 && c <= 0x7f) {
/*
* Render other 7-bit ASCII characters directly
* and drop other, unrepresentable characters.
*/
}
break;
}
}
/*
* We last read an invalid multibyte character sequence,
* so return an error.
*/
return (-1);
}
return (0);
}
/*
* Dump a JSON-formatted representation of an nvlist to the provided FILE *.
* This routine does not output any new-lines or additional whitespace other
* than that contained in strings, nor does it call fflush(3C).
*/
int
{
if (!first)
else
return (-1);
switch (type) {
case DATA_TYPE_STRING: {
return (-1);
break;
}
case DATA_TYPE_BOOLEAN: {
break;
}
case DATA_TYPE_BOOLEAN_VALUE: {
break;
}
case DATA_TYPE_BYTE: {
break;
}
case DATA_TYPE_INT8: {
break;
}
case DATA_TYPE_UINT8: {
break;
}
case DATA_TYPE_INT16: {
break;
}
case DATA_TYPE_UINT16: {
break;
}
case DATA_TYPE_INT32: {
break;
}
case DATA_TYPE_UINT32: {
break;
}
case DATA_TYPE_INT64: {
(long long)fnvpair_value_int64(curr));
break;
}
case DATA_TYPE_UINT64: {
(unsigned long long)fnvpair_value_uint64(curr));
break;
}
case DATA_TYPE_HRTIME: {
break;
}
case DATA_TYPE_DOUBLE: {
double val;
break;
}
case DATA_TYPE_NVLIST: {
if (nvlist_print_json(fp,
return (-1);
break;
}
case DATA_TYPE_STRING_ARRAY: {
char **val;
for (i = 0; i < valsz; i++) {
if (i > 0)
return (-1);
}
break;
}
case DATA_TYPE_NVLIST_ARRAY: {
for (i = 0; i < valsz; i++) {
if (i > 0)
return (-1);
}
break;
}
case DATA_TYPE_BOOLEAN_ARRAY: {
for (i = 0; i < valsz; i++) {
if (i > 0)
"true" : "false");
}
break;
}
case DATA_TYPE_BYTE_ARRAY: {
for (i = 0; i < valsz; i++) {
if (i > 0)
}
break;
}
case DATA_TYPE_UINT8_ARRAY: {
for (i = 0; i < valsz; i++) {
if (i > 0)
}
break;
}
case DATA_TYPE_INT8_ARRAY: {
for (i = 0; i < valsz; i++) {
if (i > 0)
}
break;
}
case DATA_TYPE_UINT16_ARRAY: {
for (i = 0; i < valsz; i++) {
if (i > 0)
}
break;
}
case DATA_TYPE_INT16_ARRAY: {
for (i = 0; i < valsz; i++) {
if (i > 0)
}
break;
}
case DATA_TYPE_UINT32_ARRAY: {
for (i = 0; i < valsz; i++) {
if (i > 0)
}
break;
}
case DATA_TYPE_INT32_ARRAY: {
for (i = 0; i < valsz; i++) {
if (i > 0)
}
break;
}
case DATA_TYPE_UINT64_ARRAY: {
for (i = 0; i < valsz; i++) {
if (i > 0)
(unsigned long long)val[i]);
}
break;
}
case DATA_TYPE_INT64_ARRAY: {
for (i = 0; i < valsz; i++) {
if (i > 0)
}
break;
}
case DATA_TYPE_UNKNOWN:
return (-1);
}
}
return (0);
}