diff --git a/configure b/configure index 5d21730e9d0cad0a3a342df6e6d9b2d6cfc861a4..17f84ea7cfebd5fbc0634ed678837cd8e629c76e 100755 --- a/configure +++ b/configure @@ -1055,6 +1055,10 @@ PBX_LIBXML2 LIBXML2_DIR LIBXML2_INCLUDE LIBXML2_LIB +PBX_LIBEDIT_IS_UNICODE +LIBEDIT_IS_UNICODE_DIR +LIBEDIT_IS_UNICODE_INCLUDE +LIBEDIT_IS_UNICODE_LIB PBX_LIBEDIT LIBEDIT_DIR LIBEDIT_INCLUDE @@ -10733,6 +10737,18 @@ fi +LIBEDIT_IS_UNICODE_DESCRIP="Libedit compiled for unicode" +LIBEDIT_IS_UNICODE_OPTION=libedit +LIBEDIT_IS_UNICODE_DIR=${LIBEDIT_DIR} + +PBX_LIBEDIT_IS_UNICODE=0 + + + + + + + LIBXML2_DESCRIP="LibXML2" LIBXML2_OPTION="libxml2" PBX_LIBXML2=0 @@ -21129,11 +21145,58 @@ fi fi if test "$PBX_LIBEDIT" = "1"; then - LIBEDIT_INTERNAL="no" + LIBEDIT_INTERNAL="no" fi fi if test "${LIBEDIT_INTERNAL}" = "yes"; then PBX_LIBEDIT=1 + LIBEDIT_IS_UNICODE=no + else + + if test "x${PBX_LIBEDIT_IS_UNICODE}" != "x1" -a "${USE_LIBEDIT_IS_UNICODE}" != "no"; then + if test "xTesting for libedit unicode support" != "x"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Testing for libedit unicode support" >&5 +$as_echo_n "checking for Testing for libedit unicode support... " >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if \"el_rfunc_t *callback;\" compiles using histedit.h" >&5 +$as_echo_n "checking if \"el_rfunc_t *callback;\" compiles using histedit.h... " >&6; } + fi + saved_cppflags="${CPPFLAGS}" + if test "x${LIBEDIT_IS_UNICODE_DIR}" != "x"; then + LIBEDIT_IS_UNICODE_INCLUDE="-I${LIBEDIT_IS_UNICODE_DIR}/include" + fi + CPPFLAGS="${CPPFLAGS} ${LIBEDIT_IS_UNICODE_INCLUDE}" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include <histedit.h> +int +main () +{ + el_rfunc_t *callback;; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + PBX_LIBEDIT_IS_UNICODE=1 + +$as_echo "#define HAVE_LIBEDIT_IS_UNICODE 1" >>confdefs.h + + + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CPPFLAGS="${saved_cppflags}" + fi + fi fi diff --git a/configure.ac b/configure.ac index ea55df41634da292d2df349174b550bc883e0e98..7261e535c466a404ebd5d330e93879bb81eb05ac 100644 --- a/configure.ac +++ b/configure.ac @@ -479,6 +479,7 @@ AST_EXT_LIB_SETUP([KQUEUE], [kqueue support], [kqueue]) AST_EXT_LIB_SETUP([LDAP], [OpenLDAP], [ldap]) AST_LIBCURL_CHECK_CONFIG([], [7.10.1]) AST_EXT_LIB_SETUP([LIBEDIT], [NetBSD Editline library], [libedit], [, use 'internal' Editline otherwise]) +AST_EXT_LIB_SETUP_OPTIONAL([LIBEDIT_IS_UNICODE], [Libedit compiled for unicode], [LIBEDIT], [libedit]) AST_EXT_LIB_SETUP([LIBXML2], [LibXML2], [libxml2]) AST_EXT_LIB_SETUP([LIBXSLT], [LibXSLT], [libxslt]) AST_EXT_LIB_SETUP_OPTIONAL([LIBXSLT_CLEANUP], [LibXSLT Library Cleanup Function], [LIBXSLT], [libxslt]) @@ -1530,11 +1531,14 @@ if test "${USE_LIBEDIT}" != "no"; then if test "${LIBEDIT_SYSTEM}" = "yes"; then AST_PKG_CONFIG_CHECK(LIBEDIT, libedit) if test "$PBX_LIBEDIT" = "1"; then - LIBEDIT_INTERNAL="no" + LIBEDIT_INTERNAL="no" fi fi if test "${LIBEDIT_INTERNAL}" = "yes"; then PBX_LIBEDIT=1 + LIBEDIT_IS_UNICODE=no + else + AST_C_COMPILE_CHECK([LIBEDIT_IS_UNICODE], [el_rfunc_t *callback;], [histedit.h], [], [Testing for libedit unicode support]) fi fi diff --git a/include/asterisk/autoconfig.h.in b/include/asterisk/autoconfig.h.in index 706798ced35788ded365dadeb5f09c69fadcfb64..3673c8bc20c586b015c989927bc6adbeab952035 100644 --- a/include/asterisk/autoconfig.h.in +++ b/include/asterisk/autoconfig.h.in @@ -402,6 +402,9 @@ /* Define if your system has the LIBEDIT libraries. */ #undef HAVE_LIBEDIT +/* Define if your system has the LIBEDIT_IS_UNICODE headers. */ +#undef HAVE_LIBEDIT_IS_UNICODE + /* Define to 1 if you have the <libintl.h> header file. */ #undef HAVE_LIBINTL_H diff --git a/main/asterisk.c b/main/asterisk.c index be6c7cc3242c72b8ba767b46daeef2c9efd25d10..4a6567f73eba58bb82ff88beb18d7a079e14916b 100644 --- a/main/asterisk.c +++ b/main/asterisk.c @@ -2691,7 +2691,11 @@ static void send_rasterisk_connect_commands(void) } } +#ifdef HAVE_LIBEDIT_IS_UNICODE +static int ast_el_read_char(EditLine *editline, wchar_t *cp) +#else static int ast_el_read_char(EditLine *editline, char *cp) +#endif { int num_read = 0; int lastpos = 0; @@ -2721,10 +2725,16 @@ static int ast_el_read_char(EditLine *editline, char *cp) } if (!ast_opt_exec && fds[1].revents) { - num_read = read(STDIN_FILENO, cp, 1); + char c = '\0'; + num_read = read(STDIN_FILENO, &c, 1); if (num_read < 1) { break; } else { +#ifdef HAVE_LIBEDIT_IS_UNICODE + *cp = btowc(c); +#else + *cp = c; +#endif return (num_read); } } @@ -2768,7 +2778,11 @@ static int ast_el_read_char(EditLine *editline, char *cp) console_print(buf); if ((res < EL_BUF_SIZE - 1) && ((buf[res-1] == '\n') || (res >= 2 && buf[res-2] == '\n'))) { +#ifdef HAVE_LIBEDIT_IS_UNICODE + *cp = btowc(CC_REFRESH); +#else *cp = CC_REFRESH; +#endif return(1); } else { lastpos = 1; @@ -2776,7 +2790,12 @@ static int ast_el_read_char(EditLine *editline, char *cp) } } +#ifdef HAVE_LIBEDIT_IS_UNICODE + *cp = btowc('\0'); +#else *cp = '\0'; +#endif + return (0); }