static JsonElement *ExportAttributeValueAsJson(Rval rval) { JsonElement *json_attribute = JsonObjectCreate(10); switch (rval.rtype) { case CF_SCALAR: { char buffer[CF_BUFSIZE]; EscapeQuotes((const char *) rval.item, buffer, sizeof(buffer)); JsonObjectAppendString(json_attribute, "type", "string"); JsonObjectAppendString(json_attribute, "value", buffer); } return json_attribute; case CF_LIST: { Rlist *rp = NULL; JsonElement *list = JsonArrayCreate(10); JsonObjectAppendString(json_attribute, "type", "list"); for (rp = (Rlist *) rval.item; rp != NULL; rp = rp->next) { JsonArrayAppendObject(list, ExportAttributeValueAsJson((Rval) {rp->item, rp->type})); } JsonObjectAppendArray(json_attribute, "value", list); return json_attribute; } case CF_FNCALL: { Rlist *argp = NULL; FnCall *call = (FnCall *) rval.item; JsonObjectAppendString(json_attribute, "type", "function-call"); JsonObjectAppendString(json_attribute, "name", call->name); { JsonElement *arguments = JsonArrayCreate(10); for (argp = call->args; argp != NULL; argp = argp->next) { JsonArrayAppendObject(arguments, ExportAttributeValueAsJson((Rval) {argp->item, argp->type})); } JsonObjectAppendArray(json_attribute, "arguments", arguments); } return json_attribute; } default: FatalError("Attempted to export attribute of type: %c", rval.rtype); return NULL; } }
/*! * @param[in] arg The string that needs to be quoted. * @param[in] whitespace The set of characters that are considered whitespace. */ QUOTE_ARGUMENT_MS_BASE(const STRING &arg, const T *whitespace) { // Quoting is only necessary if the argument contains whitespace or a quote ("). // _quoted = arg; if (_quoted.find_first_of(whitespace) != STRING::npos || _quoted.find_first_of('"') != STRING::npos) { EscapeBackSlashes(); EscapeQuotes(); AddQuotes(whitespace); } }