📄 res.c
字号:
if (r == idn_success) { TRACE(("res idntoucs4(): success (label=\"%s\")\n", idn__debug_ucs4xstring(labellist_getname(label), 50))); } else { TRACE(("res idntoucs4(): %s\n", idn_result_tostring(r))); } if (idn_converter != NULL) idn_converter_destroy(idn_converter); free(to); free(ascii_from); return (r);}static idn_result_tlabel_idnencode_ace(idn_resconf_t ctx, labellist_t label) { idn_converter_t idn_converter = NULL; const unsigned long *from; char *ascii_to = NULL; unsigned long *to = NULL; size_t to_length; idn_result_t r; from = labellist_getname(label); TRACE(("res ucs4toidn(label=\"%s\")\n", idn__debug_ucs4xstring(from, 50))); idn_converter = idn_resconf_getidnconverter(ctx); if (idn_converter == NULL) { r = idn_success; goto ret; } ascii_to = NULL; to_length = idn_ucs4_strlen(from) * 4 + 16; /* add mergin */ for (;;) { char *new_buffer; new_buffer = (char *) realloc(ascii_to, to_length); if (new_buffer == NULL) { r = idn_nomemory; goto ret; } ascii_to = new_buffer; r = idn_converter_convfromucs4(idn_converter, from, ascii_to, to_length); if (r == idn_success) break; else if (r != idn_buffer_overflow) goto ret; to_length *= 2; } 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_ucs4_utf8toucs4(ascii_to, to, to_length); if (r == idn_success) break; else if (r != idn_buffer_overflow) goto ret; to_length *= 2; } if (r != idn_success) goto ret; r = labellist_setname(label, to);ret: if (r == idn_success) { TRACE(("res ucs4toidn(): success (label=\"%s\")\n", idn__debug_ucs4xstring(labellist_getname(label), 50))); } else { TRACE(("res ucs4toidn(): %s\n", idn_result_tostring(r))); } if (idn_converter != NULL) idn_converter_destroy(idn_converter); free(to); free(ascii_to); return (r);}static idn_result_tlabel_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);}static idn_result_tlabel_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);}static idn_result_tlabel_normalize(idn_resconf_t ctx, labellist_t label) { const unsigned long *from; unsigned long *to = NULL; size_t to_length; idn_normalizer_t normalizer; idn_result_t r; from = labellist_getname(label); TRACE(("res normalzie(label=\"%s\")\n", idn__debug_ucs4xstring(from, 50))); normalizer = idn_resconf_getnormalizer(ctx); if (normalizer == 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_normalizer_normalize(normalizer, 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 normalize(): success (label=\"%s\")\n", idn__debug_ucs4xstring(labellist_getname(label), 50))); } else { TRACE(("res normalize(): %s\n", idn_result_tostring(r))); } if (normalizer != NULL) idn_normalizer_destroy(normalizer); free(to); return (r);}static idn_result_tlabel_prohcheck(idn_resconf_t ctx, labellist_t label) { const unsigned long *name, *found; idn_checker_t prohibit_checker; idn_result_t r; name = labellist_getname(label); TRACE(("res prohcheck(label=\"%s\")\n", idn__debug_ucs4xstring(name, 50))); prohibit_checker = idn_resconf_getprohibitchecker(ctx); if (prohibit_checker == NULL) { r = idn_success; goto ret; } r = idn_checker_lookup(prohibit_checker, name, &found); idn_checker_destroy(prohibit_checker); if (r == idn_success && found != NULL) r = idn_prohibited;ret: TRACE(("res prohcheck(): %s\n", idn_result_tostring(r))); return (r);}static idn_result_tlabel_unascheck(idn_resconf_t ctx, labellist_t label) { const unsigned long *name, *found; idn_checker_t unassigned_checker; idn_result_t r; name = labellist_getname(label); TRACE(("res unascheck(label=\"%s\")\n", idn__debug_ucs4xstring(name, 50))); unassigned_checker = idn_resconf_getunassignedchecker(ctx); if (unassigned_checker == NULL) { r = idn_success; goto ret; } r = idn_checker_lookup(unassigned_checker, name, &found); idn_checker_destroy(unassigned_checker); if (r == idn_success && found != NULL) r = idn_prohibited;ret: TRACE(("res unascheck(): %s\n", idn_result_tostring(r))); return (r);}static idn_result_tlabel_bidicheck(idn_resconf_t ctx, labellist_t label) { const unsigned long *name, *found; idn_checker_t bidi_checker; idn_result_t r; name = labellist_getname(label); TRACE(("res bidicheck(label=\"%s\")\n", idn__debug_ucs4xstring(name, 50))); bidi_checker = idn_resconf_getbidichecker(ctx); if (bidi_checker == NULL) { r = idn_success; goto ret; } r = idn_checker_lookup(bidi_checker, name, &found); idn_checker_destroy(bidi_checker); if (r == idn_success && found != NULL) r = idn_prohibited;ret: TRACE(("res bidicheck(): %s\n", idn_result_tostring(r))); return (r);}static idn_result_tlabel_asccheck(idn_resconf_t ctx, labellist_t label) { const unsigned long *name, *n; idn_result_t r; name = labellist_getname(label); TRACE(("res asccheck(label=\"%s\")\n", idn__debug_ucs4xstring(name, 50))); if (*name == '-') { r = idn_prohibited; goto ret; } for (n = name; *n != '\0'; n++) { if (*n <= '\177') { if ((*n < '0' || *n > '9') && (*n < 'A' || *n > 'Z') && (*n < 'a' || *n > 'z') && *n != '-') { r = idn_prohibited; goto ret; } } } if (n > name && *(n - 1) == '-') { r = idn_prohibited; goto ret; } r = idn_success;ret: TRACE(("res asccheck(): %s\n", idn_result_tostring(r))); return (r);}static idn_result_tlabel_lencheck_ace(idn_resconf_t ctx, labellist_t label) { const unsigned long *name; size_t name_length; idn_result_t r; name = labellist_getname(label); name_length = idn_ucs4_strlen(name); TRACE(("res lencheck(label=\"%s\")\n", idn__debug_ucs4xstring(name, 50))); if (name_length == 0 || name_length > MAX_LABEL_LENGTH) { r = idn_invalid_length; goto ret; } r = idn_success;ret: TRACE(("res lencheck(): %s\n", idn_result_tostring(r))); return (r);}static idn_result_tlabel_lencheck_nonace(idn_resconf_t ctx, labellist_t label) { idn_converter_t idn_converter; const unsigned long *from; size_t to_length; idn_result_t r; char *buffer = NULL; size_t buffer_length; from = labellist_getname(label); TRACE(("res lencheck(label=\"%s\")\n", idn__debug_ucs4xstring(from, 50))); buffer_length = idn_ucs4_strlen(from) * 4 + 16; /* 16 for margin */ idn_converter = idn_resconf_getidnconverter(ctx); for (;;) { void *new_buffer; new_buffer = realloc(buffer, sizeof(*buffer) * buffer_length); if (new_buffer == NULL) { r = idn_nomemory; goto ret; } buffer = (char *)new_buffer; if (idn_converter != NULL) { r = idn_converter_convfromucs4(idn_converter, from, buffer, buffer_length); } else { r = idn_ucs4_ucs4toutf8(from, buffer, buffer_length); } if (r == idn_success) break; else if (r != idn_buffer_overflow) goto ret; buffer_length *= 2; } to_length = strlen(buffer); if (to_length == 0 || to_length > MAX_LABEL_LENGTH) { r = idn_invalid_length; goto ret; } r = idn_success;ret: TRACE(("res lencheck(): %s\n", idn_result_tostring(r))); if (idn_converter != NULL) idn_converter_destroy(idn_converter); free(buffer); return (r);}static idn_result_tlabel_rtcheck(idn_resconf_t ctx, idn_action_t actions, labellist_t label, const unsigned long *original_name) { labellist_t rt_label = NULL; const unsigned long *rt_name; const unsigned long *cur_name; idn_result_t r; cur_name = labellist_getname(label); TRACE(("res rtcheck(label=\"%s\", org_label=\"%s\")\n", idn__debug_ucs4xstring(cur_name, 50), idn__debug_ucs4xstring(original_name, 50))); r = labellist_create(cur_name, &rt_label); if (r != idn_success) goto ret; if (rt_label == NULL) { if (*original_name == '\0') r = idn_success; else r = idn_invalid_encoding; goto ret; } if (!idn__util_ucs4isasciirange(labellist_getname(rt_label))) { r = label_map(ctx, rt_label); if (r != idn_success) goto ret; r = label_normalize(ctx, rt_label); if (r != idn_success) goto ret; r = label_prohcheck(ctx, rt_label); if (r != idn_success) goto ret; if (actions & IDN_UNASCHECK) { r = label_unascheck(ctx, rt_label); if (r != idn_success) goto ret; } r = label_bidicheck(ctx, rt_label); if (r != idn_success) goto ret; } if (actions & IDN_ASCCHECK) { r = label_asccheck(ctx, rt_label); if (r != idn_success) goto ret; } if (!idn__util_ucs4isasciirange(labellist_getname(rt_label))) { r = label_idnencode_ace(ctx, rt_label); if (r != idn_success) goto ret; } r = label_lencheck_ace(ctx, rt_label); if (r != idn_success) goto ret; rt_name = labellist_getname(rt_label); if (idn_ucs4_strcasecmp(rt_name, original_name) != 0) { TRACE(("res rtcheck(): round trip failed, org =\"%s\", rt=\"%s\"\n", idn__debug_ucs4xstring(original_name, 50), idn__debug_ucs4xstring(rt_name, 50))); r = idn_invalid_encoding; goto ret; } r = idn_success;ret: if (r != idn_nomemory && r != idn_success) r = idn_invalid_encoding; TRACE(("res rtcheck(): %s\n", idn_result_tostring(r))); if (rt_label != NULL) labellist_destroy(rt_label); return (r);}const char *idn__res_actionstostring(idn_action_t actions) { static char buf[100]; buf[0] = '\0'; if (actions == IDN_ENCODE_QUERY) strcpy(buf, "encode-query"); else if (actions == IDN_DECODE_QUERY) strcpy(buf, "decode-query"); else if (actions == IDN_ENCODE_APP) strcpy(buf, "encode-app"); else if (actions == IDN_DECODE_APP) strcpy(buf, "decode-app"); else if (actions == IDN_ENCODE_STORED) strcpy(buf, "encode-stored"); else if (actions == IDN_DECODE_STORED) strcpy(buf, "decode-stored"); else { if (actions & IDN_LOCALCONV) strcat(buf, "|localconv"); if (actions & IDN_DELIMMAP) strcat(buf, "|delimmap"); if (actions & IDN_LOCALMAP) strcat(buf, "|localmap"); if (actions & IDN_MAP) strcat(buf, "|map"); if (actions & IDN_NORMALIZE) strcat(buf, "|normalize"); if (actions & IDN_PROHCHECK) strcat(buf, "|prohcheck"); if (actions & IDN_UNASCHECK) strcat(buf, "|unascheck"); if (actions & IDN_BIDICHECK) strcat(buf, "|bidicheck"); if (actions & IDN_IDNCONV) strcat(buf, "|idnconv"); if (actions & IDN_ASCCHECK) strcat(buf, "|asccheck"); if (actions & IDN_LENCHECK) strcat(buf, "|lencheck"); if (actions & IDN_RTCHECK) strcat(buf, "|rtcheck"); } if (buf[0] == '|') return (buf + 1); else return (buf);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -