static idn_result_t label_localmap(idn_resconf_t ctx, labellist_t label) { const unsigned long *from; const unsigned long *tld; unsigned long *to = NULL; size_t to_length; idn_mapselector_t local_mapper; idn_result_t r; from = labellist_getname(label); tld = labellist_gettldname(label); TRACE(("res localmap(label=\"%s\", tld=\"%s\")\n", idn__debug_ucs4xstring(from, 50), idn__debug_ucs4xstring(tld, 50))); local_mapper = idn_resconf_getlocalmapselector(ctx); if (local_mapper == NULL) { r = idn_success; goto ret; } if (tld == from) tld = idn_mapselector_getdefaulttld(); to_length = idn_ucs4_strlen(from) + 1 + 15; /* 15 for margin */ for (;;) { unsigned long *new_buffer; new_buffer = (unsigned long *) realloc(to, sizeof(long) * to_length); if (new_buffer == NULL) { r = idn_nomemory; goto ret; } to = new_buffer; r = idn_mapselector_map2(local_mapper, from, tld, to, to_length); if (r == idn_success) break; else if (r != idn_buffer_overflow) goto ret; to_length *= 2; } r = labellist_setname(label, to); ret: if (r == idn_success) { TRACE(("res localmap(): success (label=\"%s\")\n", idn__debug_ucs4xstring(labellist_getname(label), 50))); } else { TRACE(("res localmap(): %s\n", idn_result_tostring(r))); } if (local_mapper != NULL) idn_mapselector_destroy(local_mapper); free(to); return (r); }
void idn_resconf_setlocalmapselector(idn_resconf_t ctx, idn_mapselector_t local_mapper) { assert(ctx != NULL); TRACE(("idn_resconf_setlocalmapselector()\n")); if (ctx->local_mapper != NULL) idn_mapselector_destroy(ctx->local_mapper); ctx->local_mapper = local_mapper; if (local_mapper != NULL) idn_mapselector_incrref(ctx->local_mapper); }