This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: Configuring gdb_wchar.h
> Date: Wed, 15 Apr 2009 23:17:42 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> Cc: gdb-patches@sources.redhat.com
>
> > Cc: gdb-patches@sources.redhat.com
> > From: Tom Tromey <tromey@redhat.com>
> > Date: Wed, 15 Apr 2009 13:52:50 -0600
> >
> > >>>>> "Eli" == Eli Zaretskii <eliz@gnu.org> 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 <eliz@gnu.org>
* 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 <debug/redir.h>
#endif
+#include <langinfo.h>
+
#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 <http://www.gnu.org/licenses/>. */
+
+#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 <http://www.gnu.org/licenses/>. */
+
+#ifndef _LANGINFO_H
+#define _LANGINFO_H
+
+#include <nl_types.h>
+
+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