-gras_error_t
-gras_multidict_remove_ext(gras_dictelm_t *p_head,
- int keycount,
- const char **key,
- int *key_len) {
- gras_dictelm_t *p_elm = p_head;
- int i = 0;
-
- while (p_elm && i < keycount-1) {
- if (!gras_dict_get_ext(p_elm, key[i], key_len[i], (void**)&p_elm)) {
- return 0;
+void
+xbt_multidict_remove_ext(xbt_dict_t mdict, xbt_dynar_t keys,
+ xbt_dynar_t lens)
+{
+ xbt_dict_t thislevel, nextlevel = NULL;
+ int i;
+ xbt_ex_t e;
+
+ 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),
+ "Can't remove a zero-long key set in a multidict");
+
+ 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);
+
+ /* search the dict of next level */
+ TRY {
+ nextlevel = xbt_dict_get_ext(thislevel, thiskey, thislen);
+ }
+ CATCH(e) {
+ /* If non-existant entry, nothing to do */
+ if (e.category == arg_error)
+ xbt_ex_free(e);
+ else
+ RETHROW;