%% options copyright owner = Dirk Krause copyright year = 2014 license = bsd %% header #ifdef __cplusplus extern "C" { #endif /** Compare key value pairs. @param l Left object. @param r Right object. @param cr Comparison criteria (0=object/object, 1=object/string). @return Comparison result */ int dk3kv_compare(void const *l, void const *r, int cr); /** Remove key value pair, release memory. @param p Key value pair to release. */ void dk3kv_delete(dk3_key_value_t *p); /** Create new key value pair. @param k Key. @param v Value, may be NULL. @param app Application structure for diagnostics, may be NULL. @return Pointer to new data on success, NULL on error. */ dk3_key_value_t * dk3kv_new_app(dkChar const *k, dkChar const *v, dk3_app_t *app); #ifdef __cplusplus } #endif %% module #include "dk3all.h" int dk3kv_compare(void const *l, void const *r, int cr) { int back = 0; dk3_key_value_t const *pl; dk3_key_value_t const *pr; if(l) { if(r) { pl = (dk3_key_value_t const *)l; switch(cr) { case 1: { back = dk3str_cmp(pl->key, (dkChar const *)r); } break; default: { pr = (dk3_key_value_t const *)r; back = dk3str_cmp(pl->key, pr->key); } break; } } else back = 1; } else { if(r) back = -1; } return back; } void dk3kv_delete(dk3_key_value_t *p) { if(p) { dk3_release(p->key); dk3_release(p->val); dk3_delete(p); } } dk3_key_value_t * dk3kv_new_app(dkChar const *k, dkChar const *v, dk3_app_t *app) { dk3_key_value_t *back = NULL; if(k) { back = dk3_new_app(dk3_key_value_t,1,app); if(back) { back->key = NULL; back->val = NULL; back->key = dk3str_dup_app(k, app); if(back->key) { if(v) { back->val = dk3str_dup_app(v, app); if(!(back->val)) { dk3kv_delete(back); back = NULL; } } } else { dk3kv_delete(back); back = NULL; } } } return back; }