void idn_resconf_setmapper(idn_resconf_t ctx, idn_mapper_t mapper) { assert(ctx != NULL); TRACE(("idn_resconf_setmapper()\n")); if (ctx->mapper != NULL) idn_mapper_destroy(ctx->mapper); ctx->mapper = mapper; if (mapper != NULL) idn_mapper_incrref(ctx->mapper); }
static idn_result_t label_map(idn_resconf_t ctx, labellist_t label) { const unsigned long *from; unsigned long *to = NULL; size_t to_length; idn_mapper_t mapper; idn_result_t r; from = labellist_getname(label); TRACE(("res map(label=\"%s\")\n", idn__debug_ucs4xstring(from, 50))); mapper = idn_resconf_getmapper(ctx); if (mapper == NULL) { r = idn_success; goto ret; } 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_mapper_map(mapper, from, 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 map(): success (label=\"%s\")\n", idn__debug_ucs4xstring(labellist_getname(label), 50))); } else { TRACE(("res map(): %s\n", idn_result_tostring(r))); } if (mapper != NULL) idn_mapper_destroy(mapper); free(to); return (r); }
idn_result_t idn_resconf_setnameprepversion(idn_resconf_t ctx, const char *version) { char prohibit_scheme_name[MAX_CONF_LINE_LENGTH + 1]; char unassigned_scheme_name[MAX_CONF_LINE_LENGTH + 1]; char bidi_scheme_name[MAX_CONF_LINE_LENGTH + 1]; idn_mapper_t mapper = NULL; idn_normalizer_t normalizer = NULL; idn_checker_t prohibit_checker = NULL; idn_checker_t unassigned_checker = NULL; idn_checker_t bidi_checker = NULL; idn_result_t r; assert(ctx != NULL && version != NULL); TRACE(("idn_resconf_setnameprepversion()\n")); /* * Set canonical scheme names. */ if (strlen(version) + strlen(IDN_CHECKER_PROHIBIT_PREFIX) > MAX_CONF_LINE_LENGTH) { r = idn_invalid_name; goto failure; } sprintf(prohibit_scheme_name, "%s%s", IDN_CHECKER_PROHIBIT_PREFIX, version); if (strlen(version) + strlen(IDN_CHECKER_UNASSIGNED_PREFIX) > MAX_CONF_LINE_LENGTH) { r = idn_invalid_name; goto failure; } sprintf(unassigned_scheme_name, "%s%s", IDN_CHECKER_UNASSIGNED_PREFIX, version); if (strlen(version) + strlen(IDN_CHECKER_BIDI_PREFIX) > MAX_CONF_LINE_LENGTH) { r = idn_invalid_name; goto failure; } sprintf(bidi_scheme_name, "%s%s", IDN_CHECKER_BIDI_PREFIX, version); /* * Create objects. */ r = idn_mapper_create(&mapper); if (r != idn_success) goto failure; r = idn_normalizer_create(&normalizer); if (r != idn_success) goto failure; r = idn_checker_create(&prohibit_checker); if (r != idn_success) goto failure; r = idn_checker_create(&unassigned_checker); if (r != idn_success) goto failure; r = idn_checker_create(&bidi_checker); if (r != idn_success) goto failure; r = idn_mapper_add(mapper, version); if (r != idn_success) goto failure; r = idn_normalizer_add(normalizer, version); if (r != idn_success) goto failure; r = idn_checker_add(prohibit_checker, prohibit_scheme_name); if (r != idn_success) goto failure; r = idn_checker_add(unassigned_checker, unassigned_scheme_name); if (r != idn_success) goto failure; r = idn_checker_add(bidi_checker, bidi_scheme_name); if (r != idn_success) goto failure; /* * Set the objects. */ idn_resconf_setmapper(ctx, mapper); idn_resconf_setnormalizer(ctx, normalizer); idn_resconf_setprohibitchecker(ctx, prohibit_checker); idn_resconf_setunassignedchecker(ctx, unassigned_checker); idn_resconf_setbidichecker(ctx, bidi_checker); /* * Destroy the objects. */ idn_mapper_destroy(mapper); idn_normalizer_destroy(normalizer); idn_checker_destroy(prohibit_checker); idn_checker_destroy(unassigned_checker); idn_checker_destroy(bidi_checker); return (idn_success); failure: if (mapper != NULL) idn_mapper_destroy(mapper); if (normalizer != NULL) idn_normalizer_destroy(normalizer); if (prohibit_checker != NULL) idn_checker_destroy(prohibit_checker); if (unassigned_checker != NULL) idn_checker_destroy(unassigned_checker); if (bidi_checker != NULL) idn_checker_destroy(bidi_checker); return (r); }