2 * \defgroup Subst Variable substitution type stuff
3 * \ingroup CitadelConfig
18 #include "libcitadel.h"
36 void DeleteJSONValue(void *vJsonValue)
38 JsonValue *Val = (JsonValue*) vJsonValue;
39 FreeStrBuf(&Val->Name);
40 FreeStrBuf(&Val->Value);
41 DeleteHash(&Val->SubValues);
45 JsonValue *NewJsonObject(const char *Key, long keylen)
49 Ret = (JsonValue*) malloc(sizeof(JsonValue));
50 memset(Ret, 0, sizeof(JsonValue));
51 Ret->Type = JSON_OBJECT;
53 Ret->Name = NewStrBufPlain(Key, keylen);
54 Ret->SubValues = NewHash(1, NULL);
58 JsonValue *NewJsonArray(const char *Key, long keylen)
62 Ret = (JsonValue*) malloc(sizeof(JsonValue));
63 memset(Ret, 0, sizeof(JsonValue));
64 Ret->Type = JSON_ARRAY;
66 Ret->Name = NewStrBufPlain(Key, keylen);
67 Ret->SubValues = NewHash(1, Flathash);
72 JsonValue *NewJsonNumber(const char *Key, long keylen, long Number)
76 Ret = (JsonValue*) malloc(sizeof(JsonValue));
77 memset(Ret, 0, sizeof(JsonValue));
80 Ret->Name = NewStrBufPlain(Key, keylen);
81 Ret->Value = NewStrBufPlain(NULL, 64);
82 StrBufPrintf(Ret->Value, "%ld", Number);
88 JsonValue *NewJsonBigNumber(const char *Key, long keylen, double Number)
92 Ret = (JsonValue*) malloc(sizeof(JsonValue));
93 memset(Ret, 0, sizeof(JsonValue));
96 Ret->Name = NewStrBufPlain(Key, keylen);
97 Ret->Value = NewStrBufPlain(NULL, 128);
98 StrBufPrintf(Ret->Value, "%f", Number);
102 JsonValue *NewJsonString(const char *Key, long keylen, StrBuf *CopyMe)
106 Ret = (JsonValue*) malloc(sizeof(JsonValue));
107 memset(Ret, 0, sizeof(JsonValue));
108 Ret->Type = JSON_STRING;
110 Ret->Name = NewStrBufPlain(Key, keylen);
111 Ret->Value = NewStrBufDup(CopyMe);
115 JsonValue *NewJsonPlainString(const char *Key, long keylen, const char *CopyMe, long len)
119 Ret = (JsonValue*) malloc(sizeof(JsonValue));
120 memset(Ret, 0, sizeof(JsonValue));
121 Ret->Type = JSON_STRING;
123 Ret->Name = NewStrBufPlain(Key, keylen);
124 Ret->Value = NewStrBufPlain(CopyMe, len);
128 JsonValue *NewJsonNull(const char *Key, long keylen)
132 Ret = (JsonValue*) malloc(sizeof(JsonValue));
133 memset(Ret, 0, sizeof(JsonValue));
134 Ret->Type = JSON_NULL;
136 Ret->Name = NewStrBufPlain(Key, keylen);
137 Ret->Value = NewStrBufPlain(HKEY("nulll"));
141 JsonValue *NewJsonBool(const char *Key, long keylen, int value)
145 Ret = (JsonValue*) malloc(sizeof(JsonValue));
146 memset(Ret, 0, sizeof(JsonValue));
147 Ret->Type = JSON_BOOL;
149 Ret->Name = NewStrBufPlain(Key, keylen);
151 Ret->Value = NewStrBufPlain(HKEY("true"));
153 Ret->Value = NewStrBufPlain(HKEY("false"));
157 void JsonArrayAppend(JsonValue *Array, JsonValue *Val)
160 if (Array->Type != JSON_ARRAY)
161 return; /* todo assert! */
163 n = GetCount(Array->SubValues);
164 Put(Array->SubValues, (const char*) &n, sizeof(n), Val, DeleteJSONValue);
167 void JsonObjectAppend(JsonValue *Array, JsonValue *Val)
169 if ((Array->Type != JSON_OBJECT) || (Val->Name == NULL))
170 return; /* todo assert! */
172 Put(Array->SubValues, SKEY(Val->Name), Val, DeleteJSONValue);
179 void SerializeJson(StrBuf *Target, JsonValue *Val, int FreeVal)
181 void *vValue, *vPrevious;
190 StrBufAppendBufPlain(Target, HKEY("\""), 0);
191 StrECMAEscAppend(Target, Val->Value, NULL);
192 StrBufAppendBufPlain(Target, HKEY("\""), 0);
195 StrBufAppendBuf(Target, Val->Value, 0);
198 StrBufAppendBuf(Target, Val->Value, 0);
201 StrBufAppendBuf(Target, Val->Value, 0);
205 StrBufAppendBufPlain(Target, HKEY("["), 0);
206 It = GetNewHashPos(Val->SubValues, 0);
207 while (GetNextHashPos(Val->SubValues,
211 if (vPrevious != NULL)
212 StrBufAppendBufPlain(Target, HKEY(","), 0);
214 SubVal = (JsonValue*) vValue;
215 SerializeJson(Target, SubVal, 0);
218 StrBufAppendBufPlain(Target, HKEY("]"), 0);
223 StrBufAppendBufPlain(Target, HKEY("{"), 0);
224 It = GetNewHashPos(Val->SubValues, 0);
225 while (GetNextHashPos(Val->SubValues,
229 SubVal = (JsonValue*) vValue;
231 if (vPrevious != NULL) {
232 StrBufAppendBufPlain(Target, HKEY(","), 0);
234 StrBufAppendBufPlain(Target, HKEY("\""), 0);
235 StrBufAppendBuf(Target, SubVal->Name, 0);
236 StrBufAppendBufPlain(Target, HKEY("\":"), 0);
238 SerializeJson(Target, SubVal, 0);
241 StrBufAppendBufPlain(Target, HKEY("}"), 0);
246 DeleteJSONValue(Val);