-
-
-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]);
- }
- */
-
- i = 0;
-
- while (p_elm && i < keycount-1) {
-
- TRY(gras_dict_get_ext(p_elm, key[i], key_len[i], (void**)p_elm));
-
- /*
- if (p_elm) {
- CDEBUG3(dict_multi,"Found level %d for key %s in multitree %", i, key[i], p_head);
- } else {
- CDEBUG3(dict_multi,"NOT found level %d for key %s in multitree %p", i, key[i], p_head);
- }
- */
-
- i++;
- }
-
- if (p_elm) { // Found all dicts to the data
-
- // gras_dict_dump(dict,&gras_dict_prints);
- return gras_dict_get_ext(p_elm, key[i], key_len[i], data);
-
- } else {
-
- *data = NULL;
-
- return 1;
+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);