-/**
- * \defgroup Subst Variable substitution type stuff
- * \ingroup CitadelConfig
- *
- * Copyright (c) 1987-2011 by the citadel.org team
- *
- * This program is open source software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-/*@{*/
+//
+// JSON data type and serializer for Citadel
+//
+// Copyright (c) 1987-2018 by the citadel.org team
+//
+// This program is open source software. Use, duplication, or disclosure
+// is subject to the terms of the GNU General Public License, version 3.
#include "sysdep.h"
#include <sys/types.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
-
#include "libcitadel.h"
-
#define JSON_STRING 0
#define JSON_NUM 1
#define JSON_NULL 2
};
-void DeleteJSONValue(void *vJsonValue)
-{
+void DeleteJSONValue(void *vJsonValue) {
JsonValue *Val = (JsonValue*) vJsonValue;
FreeStrBuf(&Val->Name);
FreeStrBuf(&Val->Value);
free(Val);
}
-JsonValue *NewJsonObject(const char *Key, long keylen)
-{
+
+JsonValue *NewJsonObject(const char *Key, long keylen) {
JsonValue *Ret;
Ret = (JsonValue*) malloc(sizeof(JsonValue));
memset(Ret, 0, sizeof(JsonValue));
Ret->Type = JSON_OBJECT;
- if (Key != NULL)
+ if (Key != NULL) {
Ret->Name = NewStrBufPlain(Key, keylen);
+ }
Ret->SubValues = NewHash(1, NULL);
return Ret;
}
-JsonValue *NewJsonArray(const char *Key, long keylen)
-{
+
+JsonValue *NewJsonArray(const char *Key, long keylen) {
JsonValue *Ret;
Ret = (JsonValue*) malloc(sizeof(JsonValue));
memset(Ret, 0, sizeof(JsonValue));
Ret->Type = JSON_ARRAY;
- if (Key != NULL)
+ if (Key != NULL) {
Ret->Name = NewStrBufPlain(Key, keylen);
+ }
Ret->SubValues = NewHash(1, lFlathash);
return Ret;
}
-JsonValue *NewJsonNumber(const char *Key, long keylen, long Number)
-{
+JsonValue *NewJsonNumber(const char *Key, long keylen, long Number) {
JsonValue *Ret;
Ret = (JsonValue*) malloc(sizeof(JsonValue));
memset(Ret, 0, sizeof(JsonValue));
Ret->Type = JSON_NUM;
- if (Key != NULL)
+ if (Key != NULL) {
Ret->Name = NewStrBufPlain(Key, keylen);
+ }
Ret->Value = NewStrBufPlain(NULL, 64);
StrBufPrintf(Ret->Value, "%ld", Number);
return Ret;
}
-
-JsonValue *NewJsonBigNumber(const char *Key, long keylen, double Number)
-{
+JsonValue *NewJsonBigNumber(const char *Key, long keylen, double Number) {
JsonValue *Ret;
Ret = (JsonValue*) malloc(sizeof(JsonValue));
memset(Ret, 0, sizeof(JsonValue));
Ret->Type = JSON_NUM;
- if (Key != NULL)
+ if (Key != NULL) {
Ret->Name = NewStrBufPlain(Key, keylen);
+ }
Ret->Value = NewStrBufPlain(NULL, 128);
StrBufPrintf(Ret->Value, "%f", Number);
return Ret;
}
-JsonValue *NewJsonString(const char *Key, long keylen, StrBuf *CopyMe)
-{
+
+JsonValue *NewJsonString(const char *Key, long keylen, StrBuf *CopyMe, int copy_or_smash) {
JsonValue *Ret;
Ret = (JsonValue*) malloc(sizeof(JsonValue));
memset(Ret, 0, sizeof(JsonValue));
Ret->Type = JSON_STRING;
- if (Key != NULL)
+ if (Key != NULL) {
Ret->Name = NewStrBufPlain(Key, keylen);
- Ret->Value = NewStrBufDup(CopyMe);
+ }
+ if (copy_or_smash == NEWJSONSTRING_COPYBUF) {
+ Ret->Value = NewStrBufDup(CopyMe);
+ }
+ else if (copy_or_smash == NEWJSONSTRING_SMASHBUF) {
+ Ret->Value = CopyMe;
+ }
+ else {
+ Ret->Value = NULL; // error condition
+ }
return Ret;
}
-JsonValue *NewJsonPlainString(const char *Key, long keylen, const char *CopyMe, long len)
-{
+
+JsonValue *NewJsonPlainString(const char *Key, long keylen, const char *CopyMe, long len) {
JsonValue *Ret;
Ret = (JsonValue*) malloc(sizeof(JsonValue));
memset(Ret, 0, sizeof(JsonValue));
Ret->Type = JSON_STRING;
- if (Key != NULL)
+ if (Key != NULL) {
Ret->Name = NewStrBufPlain(Key, keylen);
+ }
Ret->Value = NewStrBufPlain(CopyMe, len);
return Ret;
}
-JsonValue *NewJsonNull(const char *Key, long keylen)
-{
+
+JsonValue *NewJsonNull(const char *Key, long keylen) {
JsonValue *Ret;
Ret = (JsonValue*) malloc(sizeof(JsonValue));
memset(Ret, 0, sizeof(JsonValue));
Ret->Type = JSON_NULL;
- if (Key != NULL)
+ if (Key != NULL) {
Ret->Name = NewStrBufPlain(Key, keylen);
+ }
Ret->Value = NewStrBufPlain(HKEY("nulll"));
return Ret;
}
-JsonValue *NewJsonBool(const char *Key, long keylen, int value)
-{
+
+JsonValue *NewJsonBool(const char *Key, long keylen, int value) {
JsonValue *Ret;
Ret = (JsonValue*) malloc(sizeof(JsonValue));
memset(Ret, 0, sizeof(JsonValue));
Ret->Type = JSON_BOOL;
- if (Key != NULL)
+ if (Key != NULL) {
Ret->Name = NewStrBufPlain(Key, keylen);
- if (value)
+ }
+ if (value) {
Ret->Value = NewStrBufPlain(HKEY("true"));
- else
+ }
+ else {
Ret->Value = NewStrBufPlain(HKEY("false"));
+ }
return Ret;
}
-void JsonArrayAppend(JsonValue *Array, JsonValue *Val)
-{
+
+void JsonArrayAppend(JsonValue *Array, JsonValue *Val) {
long n;
- if (Array->Type != JSON_ARRAY)
- return; /* todo assert! */
+ if (Array->Type != JSON_ARRAY) {
+ return;
+ }
n = GetCount(Array->SubValues);
Put(Array->SubValues, LKEY(n), Val, DeleteJSONValue);
}
-void JsonObjectAppend(JsonValue *Array, JsonValue *Val)
-{
- if ((Array->Type != JSON_OBJECT) || (Val->Name == NULL))
- return; /* todo assert! */
+void JsonObjectAppend(JsonValue *Array, JsonValue *Val) {
+ if ((Array->Type != JSON_OBJECT) || (Val->Name == NULL)) {
+ return;
+ }
Put(Array->SubValues, SKEY(Val->Name), Val, DeleteJSONValue);
}
-
-
-
-void SerializeJson(StrBuf *Target, JsonValue *Val, int FreeVal)
-{
+void SerializeJson(StrBuf *Target, JsonValue *Val, int FreeVal) {
void *vValue, *vPrevious;
JsonValue *SubVal;
HashPos *It;
const char *Key;
long keylen;
-
switch (Val->Type) {
case JSON_STRING:
StrBufAppendBufPlain(Target, HKEY("\""), 0);
vPrevious = NULL;
StrBufAppendBufPlain(Target, HKEY("["), 0);
It = GetNewHashPos(Val->SubValues, 0);
- while (GetNextHashPos(Val->SubValues,
- It,
- &keylen, &Key,
- &vValue)){
- if (vPrevious != NULL)
+ while (GetNextHashPos(Val->SubValues, It, &keylen, &Key, &vValue)) {
+ if (vPrevious != NULL) {
StrBufAppendBufPlain(Target, HKEY(","), 0);
-
+ }
SubVal = (JsonValue*) vValue;
SerializeJson(Target, SubVal, 0);
vPrevious = vValue;
vPrevious = NULL;
StrBufAppendBufPlain(Target, HKEY("{"), 0);
It = GetNewHashPos(Val->SubValues, 0);
- while (GetNextHashPos(Val->SubValues,
- It,
- &keylen, &Key,
- &vValue)){
+ while (GetNextHashPos(Val->SubValues, It, &keylen, &Key, &vValue)) {
SubVal = (JsonValue*) vValue;
if (vPrevious != NULL) {
DeleteHashPos(&It);
break;
}
- if(FreeVal) {
+ if (FreeVal) {
DeleteJSONValue(Val);
}
}
-
-