-
-
-gras_error_t
-gras_multidict_get_ext(gras_dictelm_t *p_head,
- int keycount,
- const char **key,
- int *key_len,
- /* OUT */void **data) {
- gras_error_t errcode = no_error;
- gras_dictelm_t *p_elm = p_head;
- int i = 0;
-
- CDEBUG2(dict_multi, "fast_multidict_get(%p, %d). Keys:", p_head, keycount);
-
- /*
- for (i = 0; i < keycount; i++) {
- CDEBUG1(dict_multi, "\"%s\"", key[i]);
+void *
+xbt_multidict_get_ext(xbt_dict_t mdict,
+ xbt_dynar_t keys, xbt_dynar_t lens) {
+ xbt_dict_t thislevel,nextlevel;
+ int i;
+
+ unsigned long int thislen;
+ char *thiskey;
+ int keys_len=xbt_dynar_length(keys);
+
+ xbt_assert(xbt_dynar_length(keys) == xbt_dynar_length(lens));
+ xbt_assert0(xbt_dynar_length(keys) >= 1, "Can't get a zero-long key set in a multidict");
+
+ DEBUG2("xbt_multidict_get(%p, %ld)", mdict, xbt_dynar_length(keys));
+
+ for (i=0 , thislevel=mdict ;
+ i<keys_len-1 ;
+ i++ , thislevel = nextlevel) {
+
+ xbt_dynar_get_cpy(keys, i, &thiskey);
+ xbt_dynar_get_cpy(lens, i, &thislen);
+
+ DEBUG6("multi_get: at level %d (%p), len=%ld, key=%p |%*s|",
+ i, thislevel, thislen, thiskey, (int)thislen,thiskey);
+
+ /* search the dict of next level: let mismatch raise if not found */
+ nextlevel = xbt_dict_get_ext(thislevel, thiskey, thislen);