Mercurial > sci
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 } |