X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=libcitadel%2Flib%2Fjson.c;h=b16674589fd68ec0925c642cf9fa91cd47b5f2d2;hb=61ee61844618c781da76b236c6a119528c23e867;hp=9c941bc626436755706e0fce9749d76b3152f8e2;hpb=53b91277b9078e683246e4ecb762176faf44646d;p=citadel.git diff --git a/libcitadel/lib/json.c b/libcitadel/lib/json.c index 9c941bc62..b16674589 100644 --- a/libcitadel/lib/json.c +++ b/libcitadel/lib/json.c @@ -1,12 +1,22 @@ /* - * $Id: wildfire.c 6962 2009-01-18 19:33:45Z dothebart $ + * JSON data type and serializer for Citadel + * + * 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 + * 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 */ -/** - * \defgroup Subst Variable substitution type stuff - * \ingroup CitadelConfig - */ - -/*@{*/ #include "sysdep.h" #include @@ -17,10 +27,8 @@ #include #include #include - #include "libcitadel.h" - #define JSON_STRING 0 #define JSON_NUM 1 #define JSON_NULL 2 @@ -28,7 +36,8 @@ #define JSON_ARRAY 4 #define JSON_OBJECT 7 -struct JsonValue { +struct JsonValue +{ int Type; StrBuf *Name; StrBuf *Value; @@ -45,6 +54,7 @@ void DeleteJSONValue(void *vJsonValue) free(Val); } + JsonValue *NewJsonObject(const char *Key, long keylen) { JsonValue *Ret; @@ -53,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; @@ -66,8 +79,10 @@ 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, Flathash); + } + Ret->SubValues = NewHash(1, lFlathash); return Ret; } @@ -80,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; @@ -96,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; @@ -110,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; @@ -123,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; @@ -136,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; @@ -149,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, (const char*) &n, sizeof(n), Val, DeleteJSONValue); + 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; @@ -188,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); @@ -207,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; @@ -225,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); @@ -245,9 +279,8 @@ void SerializeJson(StrBuf *Target, JsonValue *Val, int FreeVal) DeleteHashPos(&It); break; } - if(FreeVal) { + if (FreeVal) + { DeleteJSONValue(Val); } } - -