X-Git-Url: https://code.citadel.org/?p=citadel.git;a=blobdiff_plain;f=libcitadel%2Flib%2Fjson.c;h=b16674589fd68ec0925c642cf9fa91cd47b5f2d2;hp=63fcbdcb9adf701b96f86161727cc448bf2c5634;hb=61ee61844618c781da76b236c6a119528c23e867;hpb=b0bd2aaebca90b2941d2d0831427c2217c68d8da diff --git a/libcitadel/lib/json.c b/libcitadel/lib/json.c index 63fcbdcb9..b16674589 100644 --- a/libcitadel/lib/json.c +++ b/libcitadel/lib/json.c @@ -1,8 +1,7 @@ -/** - * \defgroup Subst Variable substitution type stuff - * \ingroup CitadelConfig +/* + * JSON data type and serializer for Citadel * - * Copyright (c) 1987-2011 by the citadel.org team + * Copyright (c) 1987-2018 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 @@ -19,8 +18,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/*@{*/ - #include "sysdep.h" #include #include @@ -30,10 +27,8 @@ #include #include #include - #include "libcitadel.h" - #define JSON_STRING 0 #define JSON_NUM 1 #define JSON_NULL 2 @@ -41,7 +36,8 @@ #define JSON_ARRAY 4 #define JSON_OBJECT 7 -struct JsonValue { +struct JsonValue +{ int Type; StrBuf *Name; StrBuf *Value; @@ -58,6 +54,7 @@ void DeleteJSONValue(void *vJsonValue) free(Val); } + JsonValue *NewJsonObject(const char *Key, long keylen) { JsonValue *Ret; @@ -66,11 +63,14 @@ JsonValue *NewJsonObject(const char *Key, long keylen) memset(Ret, 0, sizeof(JsonValue)); Ret->Type = JSON_OBJECT; if (Key != NULL) + { Ret->Name = NewStrBufPlain(Key, keylen); + } Ret->SubValues = NewHash(1, NULL); return Ret; } + JsonValue *NewJsonArray(const char *Key, long keylen) { JsonValue *Ret; @@ -79,7 +79,9 @@ JsonValue *NewJsonArray(const char *Key, long keylen) memset(Ret, 0, sizeof(JsonValue)); Ret->Type = JSON_ARRAY; if (Key != NULL) + { Ret->Name = NewStrBufPlain(Key, keylen); + } Ret->SubValues = NewHash(1, lFlathash); return Ret; } @@ -93,14 +95,15 @@ JsonValue *NewJsonNumber(const char *Key, long keylen, long Number) memset(Ret, 0, sizeof(JsonValue)); Ret->Type = JSON_NUM; 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 *Ret; @@ -109,12 +112,15 @@ JsonValue *NewJsonBigNumber(const char *Key, long keylen, double Number) memset(Ret, 0, sizeof(JsonValue)); Ret->Type = JSON_NUM; 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 *Ret; @@ -123,11 +129,14 @@ JsonValue *NewJsonString(const char *Key, long keylen, StrBuf *CopyMe) memset(Ret, 0, sizeof(JsonValue)); Ret->Type = JSON_STRING; if (Key != NULL) + { Ret->Name = NewStrBufPlain(Key, keylen); + } Ret->Value = NewStrBufDup(CopyMe); return Ret; } + JsonValue *NewJsonPlainString(const char *Key, long keylen, const char *CopyMe, long len) { JsonValue *Ret; @@ -136,11 +145,14 @@ JsonValue *NewJsonPlainString(const char *Key, long keylen, const char *CopyMe, memset(Ret, 0, sizeof(JsonValue)); Ret->Type = JSON_STRING; if (Key != NULL) + { Ret->Name = NewStrBufPlain(Key, keylen); + } Ret->Value = NewStrBufPlain(CopyMe, len); return Ret; } + JsonValue *NewJsonNull(const char *Key, long keylen) { JsonValue *Ret; @@ -149,11 +161,14 @@ JsonValue *NewJsonNull(const char *Key, long keylen) memset(Ret, 0, sizeof(JsonValue)); Ret->Type = JSON_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 *Ret; @@ -162,36 +177,43 @@ JsonValue *NewJsonBool(const char *Key, long keylen, int value) memset(Ret, 0, sizeof(JsonValue)); Ret->Type = JSON_BOOL; if (Key != NULL) + { Ret->Name = NewStrBufPlain(Key, keylen); - if (value) + } + if (value) { Ret->Value = NewStrBufPlain(HKEY("true")); + } else + { Ret->Value = NewStrBufPlain(HKEY("false")); + } return Ret; } + void JsonArrayAppend(JsonValue *Array, JsonValue *Val) { long n; if (Array->Type != JSON_ARRAY) - return; /* todo assert! */ + { + 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! */ - + { + return; + } Put(Array->SubValues, SKEY(Val->Name), Val, DeleteJSONValue); } - - - void SerializeJson(StrBuf *Target, JsonValue *Val, int FreeVal) { void *vValue, *vPrevious; @@ -201,7 +223,8 @@ void SerializeJson(StrBuf *Target, JsonValue *Val, int FreeVal) long keylen; - switch (Val->Type) { + switch (Val->Type) + { case JSON_STRING: StrBufAppendBufPlain(Target, HKEY("\""), 0); StrECMAEscAppend(Target, Val->Value, NULL); @@ -220,13 +243,12 @@ void SerializeJson(StrBuf *Target, JsonValue *Val, int FreeVal) 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)) + { if (vPrevious != NULL) + { StrBufAppendBufPlain(Target, HKEY(","), 0); - + } SubVal = (JsonValue*) vValue; SerializeJson(Target, SubVal, 0); vPrevious = vValue; @@ -238,13 +260,12 @@ void SerializeJson(StrBuf *Target, JsonValue *Val, int FreeVal) 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) { + if (vPrevious != NULL) + { StrBufAppendBufPlain(Target, HKEY(","), 0); } StrBufAppendBufPlain(Target, HKEY("\""), 0); @@ -258,9 +279,8 @@ void SerializeJson(StrBuf *Target, JsonValue *Val, int FreeVal) DeleteHashPos(&It); break; } - if(FreeVal) { + if (FreeVal) + { DeleteJSONValue(Val); } } - -