⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 res.c

📁 bind-3.2.
💻 C
📖 第 1 页 / 共 3 页
字号:
	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 + -