comparison scid/theme.c @ 43:6854efe15210

scid: push json recursively
author David Demelier <markand@malikania.fr>
date Thu, 11 Aug 2022 11:34:32 +0200
parents 00b9af607524
children 576f4b1ec79f
comparison
equal deleted inserted replaced
42:4076b07c7a6f 43:6854efe15210
278 { NULL, NULL, 0 } 278 { NULL, NULL, 0 }
279 }; 279 };
280 280
281 /* }}} */ 281 /* }}} */
282 282
283 static inline void push_object(duk_context *, json_t *);
284 static inline void push_array(duk_context *, json_t *);
285
286 static inline void
287 push_value(duk_context *ctx, json_t *val)
288 {
289 switch (json_typeof(val)) {
290 case JSON_STRING:
291 duk_push_string(ctx, json_string_value(val));
292 break;
293 case JSON_INTEGER:
294 duk_push_number(ctx, json_integer_value(val));
295 break;
296 case JSON_REAL:
297 duk_push_number(ctx, json_real_value(val));
298 break;
299 case JSON_TRUE:
300 duk_push_true(ctx);
301 break;
302 case JSON_FALSE:
303 duk_push_false(ctx);
304 break;
305 case JSON_NULL:
306 duk_push_null(ctx);
307 break;
308 case JSON_OBJECT:
309 push_object(ctx, val);
310 break;
311 case JSON_ARRAY:
312 push_array(ctx, val);
313 break;
314 }
315 }
316
317 static inline void
318 push_object(duk_context *ctx, json_t *object)
319 {
320 assert(json_is_object(object));
321
322 json_t *val;
323 const char *key;
324
325 duk_push_object(ctx);
326
327 json_object_foreach(object, key, val) {
328 push_value(ctx, val);
329 duk_put_prop_string(ctx, -2, key);
330 }
331 }
332
333 static inline void
334 push_array(duk_context *ctx, json_t *array)
335 {
336 assert(json_is_array(array));
337
338 json_t *val;
339 size_t i;
340
341 duk_push_array(ctx);
342
343 json_array_foreach(array, i, val) {
344 push_value(ctx, val);
345 duk_put_prop_index(ctx, -2, i);
346 }
347 }
348
283 static char * 349 static char *
284 call(const json_t *json, const char *function) 350 call(json_t *json, const char *function)
285 { 351 {
286 char *out = NULL, *dump; 352 char *out = NULL;
287 size_t outsz = 0; 353 size_t outsz = 0;
288 FILE *fp; 354 FILE *fp;
289 355
290 duk_get_global_string(context, function); 356 duk_get_global_string(context, function);
291 357
292 if (duk_is_callable(context, -1)) { 358 if (duk_is_callable(context, -1)) {
293 fp = util_open_memstream(&out, &outsz); 359 fp = util_open_memstream(&out, &outsz);
294 dump = util_json_dump(json);
295
296 duk_push_pointer(context, fp); 360 duk_push_pointer(context, fp);
297 duk_push_string(context, dump); 361 push_value(context, json);
298 duk_json_decode(context, -1);
299 362
300 if (duk_pcall(context, 2) != 0) 363 if (duk_pcall(context, 2) != 0)
301 log_warn("theme: %s", duk_safe_to_string(context, -1)); 364 log_warn("theme: %s", duk_safe_to_string(context, -1));
302 365
303 duk_pop(context); 366 duk_pop(context);
304 fclose(fp); 367 fclose(fp);
305 free(dump);
306 } else 368 } else
307 duk_pop(context); 369 duk_pop(context);
308 370
309 if (!out) 371 if (!out)
310 out = util_strdup(""); 372 out = util_strdup("");
373 if (json)
374 json_decref(json);
311 375
312 return out; 376 return out;
313 } 377 }
314 378
315 void 379 void
350 414
351 return path; 415 return path;
352 } 416 }
353 417
354 char * 418 char *
355 theme_page_index(const json_t *json) 419 theme_page_index(json_t *json)
356 { 420 {
357 assert(json); 421 assert(json);
358 422
359 return call(json, "onPageIndex"); 423 return call(json, "onPageIndex");
360 } 424 }
361 425
362 char * 426 char *
363 theme_page_jobresults(const json_t *json) 427 theme_page_jobresults(json_t *json)
364 { 428 {
365 assert(json); 429 assert(json);
366 430
367 return call(json, "onPageJobresults"); 431 return call(json, "onPageJobresults");
368 } 432 }