From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30012 invoked by alias); 18 Apr 2009 09:47:32 -0000 Received: (qmail 29980 invoked by uid 22791); 18 Apr 2009 09:47:31 -0000 X-SWARE-Spam-Status: No, hits=1.7 required=5.0 tests=AWL,BAYES_00,HK_OBFDOM,J_CHICKENPOX_66,RCVD_IN_JMF_BL,SARE_TOWRITE,SPF_SOFTFAIL X-Spam-Check-By: sourceware.org Received: from mtaout2.012.net.il (HELO mtaout2.012.net.il) (84.95.2.4) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 18 Apr 2009 09:47:25 +0000 Received: from conversion-daemon.i_mtaout2.012.net.il by i_mtaout2.012.net.il (HyperSendmail v2004.12) id <0KIA00100J6QTE00@i_mtaout2.012.net.il> for gdb-patches@sources.redhat.com; Sat, 18 Apr 2009 12:47:21 +0300 (IDT) Received: from HOME-C4E4A596F7 ([77.124.144.191]) by i_mtaout2.012.net.il (HyperSendmail v2004.12) with ESMTPA id <0KIA00659J6WYEC0@i_mtaout2.012.net.il>; Sat, 18 Apr 2009 12:47:21 +0300 (IDT) Date: Sat, 18 Apr 2009 09:47:00 -0000 From: Eli Zaretskii Subject: Re: Configuring gdb_wchar.h In-reply-to: <83hc0plli1.fsf@gnu.org> To: tromey@redhat.com, gdb-patches@sources.redhat.com Reply-to: Eli Zaretskii Message-id: <83prfai991.fsf@gnu.org> References: <8363hboz5x.fsf@gnu.org> <833acbo32k.fsf@gnu.org> <83myajma7a.fsf@gnu.org> <83iql7m7r1.fsf@gnu.org> <83hc0rm1mh.fsf@gnu.org> <8363h6mdue.fsf@gnu.org> <833acam2wl.fsf@gnu.org> <83zleikk46.fsf@gnu.org> <83myahlo4t.fsf@gnu.org> <83hc0plli1.fsf@gnu.org> X-IsSubscribed: yes 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/msg00482.txt.bz2 > Date: Wed, 15 Apr 2009 23:17:42 +0300 > From: Eli Zaretskii > Cc: gdb-patches@sources.redhat.com > > > Cc: gdb-patches@sources.redhat.com > > From: Tom Tromey > > Date: Wed, 15 Apr 2009 13:52:50 -0600 > > > > >>>>> "Eli" == Eli Zaretskii writes: > > > > Tom> If there is a way to detect the current DOS codepage, and if that is > > Tom> equivalent to the notion of the host charset (I don't know), then we > > Tom> could put the needed code into _initialize_charset. > > > > Eli> There's a system call to do that, yes. Perhaps I should just write a > > Eli> limited emulation of nl_langinfo which will do the job. That would > > Eli> avoid ugly system-dependent code in charset.c. WDYT? > > > > Either way is fine by me. > > > > libiconv also includes "libcharset", which includes a locale_charset > > function to do this. So, we could use that if it is available. I > > couldn't immediately tell when that was added to the libiconv package. > > OK, I will look into both possibilities and see what I come up with. Here's what I finally ended up with. I decided to write an emulation of nl_langinfo, instead of using locale_charset, because of these reasons: . The DJGPP port of locale_charset returns an empty string or "ASCII" (depending on the version), if none of the environment variables LC_ALL, LC_TYPE, or LANG is defined. It ought to fall back on the DOS codepage, but it doesn't. . Using locale_charset needs a change in the configury (to link against libcharset), which I wanted to avoid. If GDB ends up using locale_charset, and thus the necessary configury stuff will be added anyway, I might reconsider (e.g., I could include a call to locale_charset inside the emulated nl_langinfo). . If the appropriate LC_* variables are set in the environment, then using locale_charset is better than just having an nl_langinfo that always returns the system codepage, but for GDB, this is only marginally better, and can easily be fixed by a simple command or a line in gdb.ini. If there are no objections, I will commit the patch below. Thanks. 2009-04-17 Eli Zaretskii * config/djgpp/config.sed (am_cv_langinfo_codeset) (bash_cv_langinfo_codeset, ac_cv_header_nl_types_h): Set to "yes" in all configure scripts that define ac_cv_env_CPP_value. * go32-nat.c (dos_codepage, nl_langinfo): New functions. Include langinfo.h. * config/djgpp/nl_types.h: New file. * config/djgpp/langinfo.h: New file. * config/i386/go32.mh (MH_CFLAGS): Add $(srcdir)/config/djgpp. --- go32-nat.c~1 2009-04-11 19:55:40.984375000 +0300 +++ go32-nat.c 2009-04-18 12:09:08.503000000 +0300 @@ -53,6 +53,8 @@ #include #endif +#include + #if __DJGPP_MINOR__ < 3 /* This code will be provided from DJGPP 2.03 on. Until then I code it here */ @@ -938,6 +940,47 @@ strcpy (gdbinit, "gdb.ini"); } +/* Return the current DOS codepage number. */ +static int +dos_codepage (void) +{ + __dpmi_regs regs; + + regs.x.ax = 0x6601; + __dpmi_int (0x21, ®s); + if (!(regs.x.flags & 1)) + return regs.x.bx & 0xffff; + else + return 437; /* default */ +} + +/* Limited emulation of `nl_langinfo', for charset.c. */ +char * +nl_langinfo (nl_item item) +{ + char *retval; + + switch (item) + { + case CODESET: + { + /* 8 is enough for SHORT_MAX + "CP" + null. */ + char buf[8]; + int blen = sizeof (buf); + int needed = snprintf (buf, blen, "CP%d", dos_codepage ()); + + if (needed > blen) /* should never happen */ + buf[0] = 0; + retval = xstrdup (buf); + } + break; + default: + retval = xstrdup (""); + break; + } + return retval; +} + unsigned short windows_major, windows_minor; /* Compute the version Windows reports via Int 2Fh/AX=1600h. */ --- config/djgpp/config.s~1 2009-04-10 17:01:57.221500000 +0300 +++ config/djgpp/config.sed 2009-04-18 10:45:48.393625000 +0300 @@ -25,6 +25,12 @@ s,config\\.h\\.in,config.h-in,g;t t\ s,po2tbl\\.sed\\.in,po2tblsed.in,g;t t +# We have an emulation of nl_langinfo in go32-nat.c that supports CODESET. +/^ac_cv_env_CPP_value=/a\ +am_cv_langinfo_codeset=yes\ +bash_cv_langinfo_codeset=yes\ +ac_cv_header_nl_types_h=yes + # Prevent splitting of config.status substitutions, because that # might break multi-line sed commands. /ac_max_sed_lines=[0-9]/s,=.*$,=`sed -n "$=" $tmp/subs.sed`, --- /dev/null 1970-01-01 02:00:00.000000000 +0200 +++ config/djgpp/nl_types.h 2009-04-17 15:54:34.440500000 +0300 @@ -0,0 +1,25 @@ +/* nl_types.h for DJGPP. + Copyright (C) 2009 Free Software Foundation, Inc. + Written by Eli Zaretskii. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _NL_TYPES_H +#define _NL_TYPES_H + +typedef int nl_item; + +#endif /* _NL_TYPES_H */ --- /dev/null 1970-01-01 02:00:00.000000000 +0200 +++ config/djgpp/langinfo.h 2009-04-17 15:54:43.081125000 +0300 @@ -0,0 +1,35 @@ +/* langinfo.h file for DJGPP. + Copyright (C) 2009 Free Software Foundation, Inc. + Written by Eli Zaretskii. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _LANGINFO_H +#define _LANGINFO_H + +#include + +enum { + CODESET, + /* Number of enumerated values. */ + _NL_NUM +}; + +#define CODESET CODESET + +extern char *nl_langinfo (nl_item); + +#endif /* _LANGINFO_H */ --- config/i386/go32.m~0 2005-05-14 16:13:23.000000000 +0300 +++ config/i386/go32.mh 2009-04-17 14:47:12.393625000 +0300 @@ -1,5 +1,7 @@ # Host: Intel x86 running DJGPP -MH_CFLAGS= + +# We include several header files from config/djgpp +MH_CFLAGS= -I$(srcdir)/config/djgpp NAT_FILE= nm-go32.h NATDEPFILES= go32-nat.o i386-nat.o