From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24500 invoked by alias); 13 Apr 2009 17:54:28 -0000 Received: (qmail 24491 invoked by uid 22791); 13 Apr 2009 17:54:27 -0000 X-SWARE-Spam-Status: No, hits=-2.3 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 13 Apr 2009 17:54:20 +0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id n3DHsHc6015712 for ; Mon, 13 Apr 2009 13:54:17 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx1.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n3DHsM4Q032383 for ; Mon, 13 Apr 2009 13:54:22 -0400 Received: from opsy.redhat.com (vpn-13-138.rdu.redhat.com [10.11.13.138]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n3DHsF5o017977; Mon, 13 Apr 2009 13:54:16 -0400 Received: by opsy.redhat.com (Postfix, from userid 500) id 08C7D378181; Mon, 13 Apr 2009 11:54:13 -0600 (MDT) To: Eli Zaretskii Cc: gdb-patches@sources.redhat.com Subject: Re: Configuring gdb_wchar.h References: <8363hboz5x.fsf@gnu.org> From: Tom Tromey Reply-To: Tom Tromey Date: Mon, 13 Apr 2009 17:54:00 -0000 In-Reply-To: <8363hboz5x.fsf@gnu.org> (Eli Zaretskii's message of "Sat\, 11 Apr 2009 20\:52\:58 +0300") Message-ID: User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-04/txt/msg00236.txt.bz2 >>>>> "Eli" == Eli Zaretskii writes: Eli> The actual case in point is the DJGPP build. The DJGPP library has Eli> wchar.h and there's a port of libiconv, but the functions gdb_wchar.h Eli> expects for wide character support are not there. Thanks for the report. Please try the appended patch. I've included the auto* output in this patch in case you don't have the right versions on your DJGPP machine. I chose btowc as a sentinel function. And, I separated out the "phony iconv" and "wchar_t support" cases, so that systems that have the former but not the latter will gracefully choose slightly degraded functionality. Tom diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b6f86a7..f2b19c3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2009-04-13 Tom Tromey + + * c-lang.c (c_emit_char): Use INTERMEDIATE_ENCODING. + (c_printstr): Likewise. + * charset.c (make_wchar_iterator): Use INTERMEDIATE_ENCODING. + * gdb_wchar.h: Check HAVE_BTOWC. Split PHONY_ICONV and wchar + cases. + (INTERMEDIATE_ENCODING): New define. + * configure, config.in: Rebuild. + * configure.ac: Check for btowc. + 2009-04-10 Jan Kratochvil * gdbtypes.c: Remove excessive parentheses at the return keywords. diff --git a/gdb/c-lang.c b/gdb/c-lang.c index 0c9e4f8..139d219 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c @@ -296,7 +296,7 @@ c_emit_char (int c, struct type *type, struct ui_file *stream, int quoter) obstack_init (&output); make_cleanup_obstack_free (&output); - convert_between_encodings ("wchar_t", host_charset (), + convert_between_encodings (INTERMEDIATE_ENCODING, host_charset (), obstack_base (&wchar_buf), obstack_object_size (&wchar_buf), 1, &output, translit_char); @@ -562,7 +562,7 @@ c_printstr (struct ui_file *stream, struct type *type, const gdb_byte *string, obstack_init (&output); make_cleanup_obstack_free (&output); - convert_between_encodings ("wchar_t", host_charset (), + convert_between_encodings (INTERMEDIATE_ENCODING, host_charset (), obstack_base (&wchar_buf), obstack_object_size (&wchar_buf), 1, &output, translit_char); diff --git a/gdb/charset.c b/gdb/charset.c index 14862e7..c358940 100644 --- a/gdb/charset.c +++ b/gdb/charset.c @@ -527,7 +527,7 @@ make_wchar_iterator (const gdb_byte *input, size_t bytes, const char *charset, struct wchar_iterator *result; iconv_t desc; - desc = iconv_open ("wchar_t", charset); + desc = iconv_open (INTERMEDIATE_ENCODING, charset); if (desc == (iconv_t) -1) perror_with_name ("Converting character sets"); diff --git a/gdb/config.in b/gdb/config.in index 0d5effa..ab0c840 100644 --- a/gdb/config.in +++ b/gdb/config.in @@ -70,6 +70,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_BP_SYM_H +/* Define to 1 if you have the `btowc' function. */ +#undef HAVE_BTOWC + /* Define to 1 if you have the `canonicalize_file_name' function. */ #undef HAVE_CANONICALIZE_FILE_NAME diff --git a/gdb/configure b/gdb/configure index 51f35f5..e06a451 100755 --- a/gdb/configure +++ b/gdb/configure @@ -15776,10 +15776,11 @@ fi + for ac_func in canonicalize_file_name realpath getrusage getuid \ getgid poll pread64 sbrk setpgid setpgrp setsid \ sigaction sigprocmask sigsetmask socketpair syscall \ - ttrace wborder setlocale iconvlist libiconvlist + ttrace wborder setlocale iconvlist libiconvlist btowc do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 diff --git a/gdb/configure.ac b/gdb/configure.ac index 821dffe..88bd8a6 100644 --- a/gdb/configure.ac +++ b/gdb/configure.ac @@ -796,7 +796,7 @@ AC_FUNC_VFORK AC_CHECK_FUNCS([canonicalize_file_name realpath getrusage getuid \ getgid poll pread64 sbrk setpgid setpgrp setsid \ sigaction sigprocmask sigsetmask socketpair syscall \ - ttrace wborder setlocale iconvlist libiconvlist]) + ttrace wborder setlocale iconvlist libiconvlist btowc]) AM_LANGINFO_CODESET # Check the return and argument types of ptrace. No canned test for diff --git a/gdb/gdb_wchar.h b/gdb/gdb_wchar.h index 583140e..07a6c87 100644 --- a/gdb/gdb_wchar.h +++ b/gdb/gdb_wchar.h @@ -19,13 +19,36 @@ #ifndef GDB_WCHAR_H #define GDB_WCHAR_H -/* If this host has wchar_t and if iconv is available (perhaps via GNU - libiconv), then we arrange to use those. Otherwise, we provide a - phony iconv which only handles a single character set, and we - provide wrappers for the wchar_t functionality we use. */ -#if defined(HAVE_ICONV) && defined(HAVE_WCHAR_H) - +/* We handle three different modes here. + + Capable systems have the full suite: wchar_t support and iconv + (perhaps via GNU libiconv). On these machines, full functionality + is available. + + DJGPP is known to have libiconv but not wchar_t support. On + systems like this, we use the narrow character functions. The full + functionality is available to the user, but many characters (those + outside the narrow range) will be displayed as escapes. + + Finally, some systems do not have iconv. Here we provide a phony + iconv which only handles a single character set, and we provide + wrappers for the wchar_t functionality we use. */ + + +#define INTERMEDIATE_ENCODING "wchar_t" + +#if defined (HAVE_ICONV) #include +#else +/* This define is used elsewhere so we don't need to duplicate the + same checking logic in multiple places. */ +#define PHONY_ICONV +#endif + +/* We use "btowc" as a sentinel to detect functioning wchar_t + support. */ +#if defined (HAVE_ICONV) && defined (HAVE_WCHAR_H) && defined (HAVE_BTOWC) + #include #include @@ -53,10 +76,15 @@ typedef int gdb_wint_t; #define LCST(X) X -/* This define is used elsewhere so we don't need to duplicate the - same checking logic in multiple places. */ -#define PHONY_ICONV +/* If we are using the narrow character set, we want to use the host + narrow encoding as our intermediate encoding. However, if we are + also providing a phony iconv, we might as well just stick with + "wchar_t". */ +#ifndef PHONY_ICONV +#undef INTERMEDIATE_ENCODING +#define INTERMEDIATE_ENCODING host_charset () +#endif -#endif /* defined(HAVE_ICONV) && defined(HAVE_WCHAR_H) */ +#endif #endif /* GDB_WCHAR_H */