This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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, &regs);
+  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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]