-struct json_object *afb_config_json(struct afb_config *config)
-{
- struct json_object *r, *a;
- struct afb_config_list *l;
- struct enumdesc *e;
- char **v;
-
-#define XA(t,o) json_object_array_add(t,o);
-#define XO(t,x,o) json_object_object_add(t,x,o);
-#define YS(s) ((s)?json_object_new_string(s):NULL)
-
-#define AO(o) XA(a,o)
-#define AS(s) AO(YS(s))
-#define RO(x,o) XO(r,x,o)
-#define RS(x,s) RO(x,YS(s))
-#define RA(x) RO(x,(a=json_object_new_array()))
-#define RI(x,i) RO(x,json_object_new_int(i))
-#define RB(x,b) RO(x,json_object_new_boolean(b))
-
-#define S(x) RS(#x,config->x)
-#define V(x) RA(#x);for(v=config->x;v&&*v;v++)AS(*v);
-#define L(x) RA(#x);for(l=config->x;l;l=l->next)AS(l->value);
-#define D(x) RI(#x,config->x)
-#define B(x) RB(#x,config->x)
-#define E(x,d) for(e=d;e->name&&e->value!=config->x;e++);if(e->name){RS(#x,e->name);}else{D(x);}
-
- r = json_object_new_object();
- S(console)
- S(rootdir)
- S(roothttp)
- S(rootbase)
- S(rootapi)
- S(workdir)
- S(uploaddir)
- S(token)
- S(name)
-
- L(aliases)
-#if HAS_DBUS
- L(dbus_clients)
- L(dbus_servers)
-#endif
- L(ws_clients)
- L(ws_servers)
- L(so_bindings)
- L(ldpaths)
- L(weak_ldpaths)
- L(calls)
-
- V(exec)
-
- D(httpdPort)
- D(cacheTimeout)
- D(apiTimeout)
- D(cntxTimeout)
- D(nbSessionMax)
-
- E(mode,mode_desc)
- E(tracereq,tracereq_desc)
- E(traceditf,traceditf_desc)
- E(tracesvc,tracesvc_desc)
- E(traceevt,traceevt_desc)
- E(traceses,traceses_desc)
-
- B(no_ldpaths)
- B(noHttpd)
- B(background)
-#if HAS_MONITORING
- B(monitoring)
-#endif
- B(random_token)
-
-#undef E
-#undef B
-#undef D
-#undef L
-#undef V
-#undef S
-
-#undef RB
-#undef RI
-#undef RA
-#undef RS
-#undef RS
-#undef AS
-#undef AO
-
-#undef YS
-#undef XO
-#undef XA
-
- return r;