fixed libicu implementation, use pkg-config for libicu detection
This commit is contained in:
parent
58daea97ce
commit
79cd551b17
14
configure.ac
14
configure.ac
|
@ -74,19 +74,13 @@ AC_ARG_ENABLE(builtin,
|
||||||
], [
|
], [
|
||||||
enable_builtin=yes
|
enable_builtin=yes
|
||||||
AC_DEFINE([WITH_BUILTIN], [1], [compile PSL data into library])
|
AC_DEFINE([WITH_BUILTIN], [1], [compile PSL data into library])
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES(LIBICU, [icu-uc],
|
||||||
|
[AC_DEFINE([WITH_LIBICU], [1], [generate PSL data with IDNA2008 UTS#46 punycode])],
|
||||||
|
[AC_CHECK_PROG(HAVE_IDN2, idn2, yes, AC_MSG_ERROR(Cannot find required tool 'idn2'.))])
|
||||||
])
|
])
|
||||||
AM_CONDITIONAL([WITH_BUILTIN], [test $enable_builtin = yes])
|
AM_CONDITIONAL([WITH_BUILTIN], [test $enable_builtin = yes])
|
||||||
|
|
||||||
AC_ARG_WITH(icu, AS_HELP_STRING([--without-icu], [disable ICU punycode conversion]), with_icu=$withval, with_icu=yes)
|
|
||||||
if test $with_icu != "no"
|
|
||||||
then
|
|
||||||
AC_CHECK_LIB(icuuc, uidna_openUTS46, [with_icu=yes; AC_SUBST(ICU_LIBS, "-licu") AC_DEFINE([WITH_LIBICU], [1], [Use libicu])], [with_icu=no; AC_MSG_WARN(*** LIBICU was not found. Falling back to idn2.)])
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL([WITH_LIBICU], [test $with_icu = "yes"])
|
|
||||||
|
|
||||||
# Check for idn2
|
|
||||||
AC_CHECK_PROG(HAVE_IDN2, idn2, yes, AC_MSG_ERROR(Cannot find required tool 'idn2'.))
|
|
||||||
|
|
||||||
# Check for valgrind
|
# Check for valgrind
|
||||||
ac_enable_valgrind=no
|
ac_enable_valgrind=no
|
||||||
AC_ARG_ENABLE(valgrind-tests,
|
AC_ARG_ENABLE(valgrind-tests,
|
||||||
|
|
|
@ -13,8 +13,8 @@ libpsl_la_LDFLAGS = -version-info $(LIBPSL_SO_VERSION)
|
||||||
|
|
||||||
noinst_PROGRAMS = psl2c
|
noinst_PROGRAMS = psl2c
|
||||||
psl2c_SOURCES = psl2c.c
|
psl2c_SOURCES = psl2c.c
|
||||||
psl2c_CPPFLAGS = -I$(top_srcdir)/include -D _GNU_SOURCE
|
psl2c_CPPFLAGS = -I$(top_srcdir)/include -D _GNU_SOURCE $(LIBICU_CFLAGS)
|
||||||
#psl2c_LDADD = -lidn2
|
psl2c_LDADD = $(LIBICU_LIBS)
|
||||||
|
|
||||||
# Build rule for suffix.c
|
# Build rule for suffix.c
|
||||||
# PSL_FILE can be set by ./configure --with-psl-file=[PATH]
|
# PSL_FILE can be set by ./configure --with-psl-file=[PATH]
|
||||||
|
|
44
src/psl2c.c
44
src/psl2c.c
|
@ -47,6 +47,7 @@
|
||||||
|
|
||||||
#ifdef WITH_LIBICU
|
#ifdef WITH_LIBICU
|
||||||
# include <unicode/uversion.h>
|
# include <unicode/uversion.h>
|
||||||
|
# include <unicode/ustring.h>
|
||||||
# include <unicode/uidna.h>
|
# include <unicode/uidna.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -349,21 +350,36 @@ static void _add_punycode_if_needed(_psl_vector_t *v)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* IDNA2008 UTS#46 punycode conversion */
|
/* IDNA2008 UTS#46 punycode conversion */
|
||||||
if ((idna = uidna_openUTS46(UIDNA_USE_STD3_RULES, &status))) {
|
// if ((idna = uidna_openUTS46(UIDNA_USE_STD3_RULES, &status))) {
|
||||||
uidna_nameToASCII(idna, (UChar *) e->label_buf, (int32_t) strlen(e->label_buf),
|
if ((idna = uidna_openUTS46(UIDNA_DEFAULT, &status))) {
|
||||||
(UChar *) lookupname, (int32_t) sizeof(lookupname), NULL, &status);
|
UChar utf16_dst[64], utf16_src[64];
|
||||||
uidna_close(idna);
|
int32_t utf16_src_length;
|
||||||
}
|
UIDNAInfo info = UIDNA_INFO_INITIALIZER;
|
||||||
|
|
||||||
|
u_strFromUTF8(utf16_src, sizeof(utf16_src)/sizeof(utf16_src[0]), &utf16_src_length, e->label_buf, (int32_t) strlen(e->label_buf), &status);
|
||||||
|
if (U_SUCCESS(status)) {
|
||||||
|
int32_t dst_length = uidna_nameToASCII(idna, utf16_src, utf16_src_length, utf16_dst, sizeof(utf16_dst)/sizeof(utf16_dst[0]), &info, &status);
|
||||||
|
if (U_SUCCESS(status)) {
|
||||||
|
u_strToUTF8(lookupname, (int32_t) sizeof(lookupname), NULL, utf16_dst, dst_length, &status);
|
||||||
|
if (U_SUCCESS(status)) {
|
||||||
|
if (strcmp(e->label_buf, lookupname)) {
|
||||||
|
/* fprintf(stderr, "libicu '%s' -> '%s'\n", e->label_buf, lookupname); */
|
||||||
|
_suffix_init(&suffix, lookupname, strlen(lookupname));
|
||||||
|
suffix.wildcard = e->wildcard;
|
||||||
|
suffixp = _vector_get(v, _vector_add(v, &suffix));
|
||||||
|
suffixp->label = suffixp->label_buf; /* set label to changed address */
|
||||||
|
} // else ignore
|
||||||
|
} else
|
||||||
|
fprintf(stderr, "Failed to convert UTF-16 to UTF-8 (status %d)\n", status);
|
||||||
|
} else
|
||||||
|
fprintf(stderr, "Failed to convert to ASCII (status %d)\n", status);
|
||||||
|
} else
|
||||||
|
fprintf(stderr, "Failed to convert UTF-8 to UTF-16 (status %d)\n", status);
|
||||||
|
|
||||||
|
uidna_close(idna);
|
||||||
|
} else
|
||||||
|
fprintf(stderr, "Failed to get UTS46 IDNA handle\n");
|
||||||
|
|
||||||
if (U_FAILURE(status)) {
|
|
||||||
fprintf(stderr, "Failed to convert '%s' to ASCII\n", e->label_buf);
|
|
||||||
} else if (strcmp(e->label_buf, lookupname)) {
|
|
||||||
/* fprintf(stderr, "libicu '%s' -> '%s'\n", e->label_buf, lookupname); */
|
|
||||||
_suffix_init(&suffix, lookupname, strlen(lookupname));
|
|
||||||
suffix.wildcard = e->wildcard;
|
|
||||||
suffixp = _vector_get(v, _vector_add(v, &suffix));
|
|
||||||
suffixp->label = suffixp->label_buf; /* set label to changed address */
|
|
||||||
} /* else ignore */
|
|
||||||
#else
|
#else
|
||||||
/* this is much slower than the libidn2 API but should have no license issues */
|
/* this is much slower than the libidn2 API but should have no license issues */
|
||||||
FILE *pp;
|
FILE *pp;
|
||||||
|
|
Loading…
Reference in New Issue