dict* dict_copy(dict *d) { dict *out; if (!d) return 0; out = dict_new(d->n); #if defined (HASHMAP) hash_map_entry *e; hash_map_iterator *i = hash_map_front(d->dict); while (!hash_map_iterator_at_end(i)) { e = hash_map_iterator_get(i); dict_entry_copy(e->k, e->v, out); hash_map_iterator_next(i); } hash_map_iterator_free(i); return out; #elif defined(TSTC) tstc_call(d->dict, 0, dict_entry_copy, out); return out; #else return 0; #endif }
static void parse_group(PrintDest *pd, ppd_group_t *group) { int i, j; /* Looping vars */ ppd_option_t *option; /* Current option */ ppd_choice_t *choice; /* Current choice */ ppd_group_t *subgroup; /* Current subgroup */ PrintOptGroup *og; PrintOption *po; pd->ogroups = xrealloc(pd->ogroups, (pd->nogroups + 1)*sizeof(PrintOptGroup)); if (!pd->ogroups) { return; } og = &pd->ogroups[pd->nogroups]; pd->nogroups++; og->name = copy_string(NULL, group->name); og->text = copy_string(NULL, group->text); og->opts = xcalloc(group->num_options, sizeof(PrintOption)); if (!og->opts) { return; } og->nopts = 0; for (i = 0, option = group->options, po = og->opts; i < group->num_options; i++, option++) { po->name = copy_string(NULL, option->keyword); po->text = copy_string(NULL, option->text); po->choices = dict_new(); po->selected = -1; dict_resize(po->choices, option->num_choices); for (j = 0, choice = option->choices; j < option->num_choices; j++, choice++) { DictEntry de; de.key = j; de.name = choice->choice; de.descr = choice->text; dict_entry_copy(&po->choices->entries[j], &de); if (choice->marked) { po->selected = de.key; dict_entry_copy(&po->choices->defaults, &de); } } if (po->selected != -1) { og->nopts++; po++; pd->nopts++; } else { xfree(po->name); xfree(po->text); dict_free(po->choices); } } for (i = 0, subgroup = group->subgroups; i < group->num_subgroups; i++, subgroup++) { parse_group(pd, subgroup); } }