gbranden pushed a commit to branch master
in repository groff.

commit e981ab7ea5b2ac7474395f13c08faa8a8b612d7f
Author: G. Branden Robinson <[email protected]>
AuthorDate: Wed Apr 15 15:38:56 2026 -0500

    Drop local copy of "localcharset" gnulib module.
    
    Our build brings it in already via the dependencies of gnulib's "hypot"
    module.
    
    * src/include/localcharset.h:
    * src/libs/libgroff/localcharset.c: Delete.
    
    * src/libs/libgroff/libgroff.am (libgroff_a_SOURCES): Drop
      "src/libs/libgroff/localcharset.c" from macro definition.
    
      (EXTRA_DIST): Stop shipping "src/libs/libgroff/config.charset",
      "src/libs/libgroff/ref-add.sin", and
      "src/libs/libgroff/ref-del.sin" in our distribution archive.
    
      (CLEANFILES): Drop "config.charset", "ref-add.sin", and
      "ref-del.sin" from macro definition.
    
      (LIBGROFF_PACKAGE): Delete macro definition.
    
      (all, charset.alias, ref-add.sed, ref-del.sed)
      (install-data-local, install_charset_data)
      (uninstall-local, uninstall_charset_data): Delete targets.
    
    * m4/localcharset.m4: Delete.
    * acinclude.m4: Drop inclusion of "m4/localcharset.m4".
    
    Continues the long process of fixing Savannah #66518.
---
 ChangeLog                        |  26 ++
 acinclude.m4                     |   1 -
 m4/localcharset.m4               |  17 --
 src/include/localcharset.h       |  49 ----
 src/libs/libgroff/libgroff.am    |  66 +----
 src/libs/libgroff/localcharset.c | 589 ---------------------------------------
 6 files changed, 27 insertions(+), 721 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 853bb6622..b15869ef4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,29 @@
+2026-04-15  G. Branden Robinson <[email protected]>
+
+       Ditch our local (outdated) copy of gnulib's "localcharset"
+       module.  Our build brings it in already via the dependencies of
+       gnulib's "hypot" module.
+
+       * src/include/localcharset.h:
+       * src/libs/libgroff/localcharset.c: Delete.
+
+       * src/libs/libgroff/libgroff.am (libgroff_a_SOURCES): Drop
+       "src/libs/libgroff/localcharset.c" from macro definition.
+       (EXTRA_DIST): Stop shipping "src/libs/libgroff/config.charset",
+       "src/libs/libgroff/ref-add.sin", and
+       "src/libs/libgroff/ref-del.sin" in our distribution archive.
+       (CLEANFILES): Drop "config.charset", "ref-add.sin", and
+       "ref-del.sin" from macro definition.
+       (LIBGROFF_PACKAGE): Delete macro definition.
+       (all, charset.alias, ref-add.sed, ref-del.sed)
+       (install-data-local, install_charset_data)
+       (uninstall-local, uninstall_charset_data): Delete targets.
+
+       * m4/localcharset.m4: Delete.
+       * acinclude.m4: Drop inclusion of "m4/localcharset.m4".
+
+       Continues the long process of fixing Savannah #66518.
+
 2026-04-13  G. Branden Robinson <[email protected]>
 
        * src/roff/troff/env.cpp: Trivially refactor.
diff --git a/acinclude.m4 b/acinclude.m4
index e6eb680dd..aa834d9ce 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -22,4 +22,3 @@ m4_include([m4/iconv.m4])
 m4_include([m4/lib-ld.m4])
 m4_include([m4/lib-link.m4])
 m4_include([m4/lib-prefix.m4])
-m4_include([m4/localcharset.m4])
diff --git a/m4/localcharset.m4 b/m4/localcharset.m4
deleted file mode 100644
index 677aea543..000000000
--- a/m4/localcharset.m4
+++ /dev/null
@@ -1,17 +0,0 @@
-# localcharset.m4 serial 7
-dnl Copyright (C) 2002-2020 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_LOCALCHARSET],
-[
-  dnl Prerequisites of lib/localcharset.c.
-  AC_REQUIRE([AM_LANGINFO_CODESET])
-  AC_REQUIRE([gl_FCNTL_O_FLAGS])
-  AC_CHECK_DECLS_ONCE([getc_unlocked])
-
-  dnl Prerequisites of the lib/Makefile.am snippet.
-  AC_REQUIRE([AC_CANONICAL_HOST])
-  AC_REQUIRE([gl_GLIBC21])
-])
diff --git a/src/include/localcharset.h b/src/include/localcharset.h
deleted file mode 100644
index dc2af1ccc..000000000
--- a/src/include/localcharset.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Determine a canonical name for the current locale's character
-   encoding.
-
-   Copyright (C) 2000-2020 Free Software Foundation, Inc.
-   This file is part of the GNU CHARSET Library.
-
-   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 2, 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 _LOCALCHARSET_H
-#define _LOCALCHARSET_H
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/* Determine the current locale's character encoding, and canonicalize
-   it into one of the canonical names listed in config.charset.  The
-   result must not be freed; it is statically allocated.  If the
-   canonical name cannot be determined, the result is a non-canonical
-   name.  */
-extern const char * locale_charset (void);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* _LOCALCHARSET_H */
-
-// Local Variables:
-// fill-column: 72
-// mode: C++
-// End:
-// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:
diff --git a/src/libs/libgroff/libgroff.am b/src/libs/libgroff/libgroff.am
index b49958096..ebeb41caf 100644
--- a/src/libs/libgroff/libgroff.am
+++ b/src/libs/libgroff/libgroff.am
@@ -45,7 +45,6 @@ libgroff_a_SOURCES = \
   src/libs/libgroff/json_encode.cpp \
   src/libs/libgroff/lf.cpp \
   src/libs/libgroff/lineno.cpp \
-  src/libs/libgroff/localcharset.c \
   src/libs/libgroff/macropath.cpp \
   src/libs/libgroff/maxfilename.cpp \
   src/libs/libgroff/maxpathname.cpp \
@@ -79,16 +78,10 @@ EXTRA_DIST += \
   src/libs/libgroff/mkstemp.cpp \
   src/libs/libgroff/getcwd.c \
   src/libs/libgroff/strtol.c \
-  src/libs/libgroff/config.charset \
-  src/libs/libgroff/ref-add.sin \
-  src/libs/libgroff/ref-del.sin \
   src/libs/libgroff/make-uniuni
 
 CLEANFILES += \
-  src/libs/libgroff/version.cpp \
-  charset.alias \
-  ref-add.sed \
-  ref-del.sed
+  src/libs/libgroff/version.cpp
 
 # .o files have a 'libgroff_a-' prefix because we set
 # libgroff_a_CPPFLAGS.
@@ -107,63 +100,6 @@ src/libs/libgroff/version.cpp: .version
          $(VERSION) >> [email protected]
        $(AM_V_GEN)mv [email protected] $@
 
-# Data for localcharset.c.  Taken from libiconv/libcharset.
-
-LIBGROFF_PACKAGE = groff
-
-all: charset.alias ref-add.sed ref-del.sed
-
-charset.alias: $(libgroff_srcdir)/config.charset
-       $(AM_V_GEN)$(SHELL) $(libgroff_srcdir)/config.charset \
-           '$(HOST)' > t-$@ \
-         && mv t-$@ $@
-
-ref-add.sed: $(libgroff_srcdir)/ref-add.sin
-       $(AM_V_GEN)sed -e '/^#/d' \
-           -e 's/@''PACKAGE''@/$(LIBGROFF_PACKAGE)/g' \
-           $(libgroff_srcdir)/ref-add.sin > t-$@ \
-         && mv t-$@ $@
-
-ref-del.sed: $(libgroff_srcdir)/ref-del.sin
-       $(AM_V_GEN)sed -e '/^#/d' \
-           -e 's/@''PACKAGE''@/$(LIBGROFF_PACKAGE)/g' \
-           $(libgroff_srcdir)/ref-del.sin > t-$@ \
-         && mv t-$@ $@
-
-install-data-local: install_charset_data
-install_charset_data:
-       -test $(GLIBC21) != no || $(mkinstalldirs) $(DESTDIR)$(libdir)
-       if test -f $(DESTDIR)$(libdir)/charset.alias; then \
-         sed -f ref-add.sed $(DESTDIR)$(libdir)/charset.alias \
-           > $(DESTDIR)$(libdir)/t-charset.alias; \
-         $(INSTALL_DATA) $(DESTDIR)$(libdir)/t-charset.alias \
-           $(DESTDIR)$(libdir)/charset.alias; \
-         $(RM) $(DESTDIR)$(libdir)/t-charset.alias; \
-       else \
-         if test $(GLIBC21) = no && grep -q '^[^#]' charset.alias; then \
-           sed -f ref-add.sed charset.alias \
-             > $(DESTDIR)$(libdir)/t-charset.alias; \
-           $(INSTALL_DATA) $(DESTDIR)$(libdir)/t-charset.alias \
-             $(DESTDIR)$(libdir)/charset.alias; \
-           $(RM) $(DESTDIR)$(libdir)/t-charset.alias; \
-         fi; \
-       fi
-
-uninstall-local: uninstall_charset_data
-uninstall_charset_data:
-       -if test -f $(DESTDIR)$(libdir)/charset.alias; then \
-         sed -f ref-del.sed $(DESTDIR)$(libdir)/charset.alias \
-           > $(DESTDIR)$(libdir)/t-charset.alias; \
-         if grep '^# Packages using this file: $$' \
-                 $(DESTDIR)$(libdir)/t-charset.alias > /dev/null; then \
-           $(RM) $(DESTDIR)$(libdir)/charset.alias; \
-         else \
-           $(INSTALL_DATA) $(DESTDIR)$(libdir)/t-charset.alias \
-             $(DESTDIR)$(libdir)/charset.alias; \
-         fi; \
-         $(RM) $(DESTDIR)$(libdir)/t-charset.alias; \
-       fi
-
 # Local Variables:
 # mode: makefile-automake
 # fill-column: 72
diff --git a/src/libs/libgroff/localcharset.c b/src/libs/libgroff/localcharset.c
deleted file mode 100644
index 344599f99..000000000
--- a/src/libs/libgroff/localcharset.c
+++ /dev/null
@@ -1,589 +0,0 @@
-/* Determine a canonical name for the current locale's character
-   encoding.
-
-   Copyright 2000-2020 Free Software Foundation, Inc.
-
-   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 2, 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/>.
-*/
-
-/* Written by Bruno Haible <[email protected]>.  */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-/* Specification.  */
-#include "localcharset.h"
-
-#include <fcntl.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#if defined __APPLE__ && defined __MACH__ && HAVE_LANGINFO_CODESET
-# define DARWIN7 /* Darwin 7 or newer, i.e. Mac OS X 10.3 or newer */
-#endif
-
-#if defined _WIN32 || defined __WIN32__
-# define WINDOWS_NATIVE
-# include <locale.h>
-#endif
-
-#if defined __EMX__
-/* Assume EMX program runs on OS/2, even if compiled under DOS.  */
-# ifndef OS2
-#  define OS2
-# endif
-#endif
-
-#if !defined WINDOWS_NATIVE
-# include <unistd.h>
-# if HAVE_LANGINFO_CODESET
-#  include <langinfo.h>
-# else
-#  if 0 /* see comment below */
-#   include <locale.h>
-#  endif
-# endif
-# ifdef __CYGWIN__
-#  define WIN32_LEAN_AND_MEAN
-#  include <windows.h>
-# endif
-#elif defined WINDOWS_NATIVE
-# define WIN32_LEAN_AND_MEAN
-# include <windows.h>
-#endif
-#if defined OS2
-# define INCL_DOS
-# include <os2.h>
-#endif
-
-/* For MB_CUR_MAX_L */
-#if defined DARWIN7
-# include <xlocale.h>
-#endif
-
-#if ENABLE_RELOCATABLE
-# include "relocatable.h"
-#else
-# define relocate(pathname) (pathname)
-#endif
-
-/* Get LIBDIR.  */
-#ifndef LIBDIR
-# include "configmake.h"
-#endif
-
-/* Define O_NOFOLLOW to 0 on platforms where it does not exist.  */
-#ifndef O_NOFOLLOW
-# define O_NOFOLLOW 0
-#endif
-
-#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined 
__EMX__ || defined __DJGPP__
-  /* Native Windows, Cygwin, OS/2, DOS */
-# define ISSLASH(C) ((C) == '/' || (C) == '\\')
-#endif
-
-#ifndef DIRECTORY_SEPARATOR
-# define DIRECTORY_SEPARATOR '/'
-#endif
-
-#ifndef ISSLASH
-# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
-#endif
-
-#if HAVE_DECL_GETC_UNLOCKED
-# undef getc
-# define getc getc_unlocked
-#endif
-
-/* The following static variable is declared 'volatile' to avoid a
-   possible multithread problem in the function get_charset_aliases. If we
-   are running in a threaded environment, and if two threads initialize
-   'charset_aliases' simultaneously, both will produce the same value,
-   and everything will be ok if the two assignments to 'charset_aliases'
-   are atomic. But I don't know what will happen if the two assignments mix.  
*/
-#if __STDC__ != 1
-# define volatile /* empty */
-#endif
-/* Pointer to the contents of the charset.alias file, if it has already been
-   read, else NULL.  Its format is:
-   ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0'  */
-static const char * volatile charset_aliases;
-
-/* Return a pointer to the contents of the charset.alias file.  */
-static const char *
-get_charset_aliases (void)
-{
-  const char *cp;
-
-  cp = charset_aliases;
-  if (cp == NULL)
-    {
-#if !(defined DARWIN7 || defined VMS || defined WINDOWS_NATIVE || defined 
__CYGWIN__)
-      const char *dir;
-      const char *base = "charset.alias";
-      char *file_name;
-
-      /* Make it possible to override the charset.alias location.  This is
-         necessary for running the testsuite before "make install".  */
-      dir = getenv ("CHARSETALIASDIR");
-      if (dir == NULL || dir[0] == '\0')
-        dir = relocate (LIBDIR);
-
-      /* Concatenate dir and base into freshly allocated file_name.  */
-      {
-        size_t dir_len = strlen (dir);
-        size_t base_len = strlen (base);
-        int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1]));
-        file_name = (char *) malloc (dir_len + add_slash + base_len + 1);
-        if (file_name != NULL)
-          {
-            memcpy (file_name, dir, dir_len);
-            if (add_slash)
-              file_name[dir_len] = DIRECTORY_SEPARATOR;
-            memcpy (file_name + dir_len + add_slash, base, base_len + 1);
-          }
-      }
-
-      if (file_name == NULL)
-        /* Out of memory.  Treat the file as empty.  */
-        cp = "";
-      else
-        {
-          int fd;
-
-          /* Open the file.  Reject symbolic links on platforms that support
-             O_NOFOLLOW.  This is a security feature.  Without it, an attacker
-             could retrieve parts of the contents (namely, the tail of the
-             first line that starts with "* ") of an arbitrary file by placing
-             a symbolic link to that file under the name "charset.alias" in
-             some writable directory and defining the environment variable
-             CHARSETALIASDIR to point to that directory.  */
-          fd = open (file_name,
-                     O_RDONLY | (HAVE_WORKING_O_NOFOLLOW ? O_NOFOLLOW : 0));
-          if (fd < 0)
-            /* File not found.  Treat it as empty.  */
-            cp = "";
-          else
-            {
-              FILE *fp;
-
-              fp = fdopen (fd, "r");
-              if (fp == NULL)
-                {
-                  /* Out of memory.  Treat the file as empty.  */
-                  close (fd);
-                  cp = "";
-                }
-              else
-                {
-                  /* Parse the file's contents.  */
-                  char *res_ptr = NULL;
-                  size_t res_size = 0;
-
-                  for (;;)
-                    {
-                      int c;
-                      char buf1[50+1];
-                      char buf2[50+1];
-                      size_t l1, l2;
-                      char *old_res_ptr;
-
-                      c = getc (fp);
-                      if (c == EOF)
-                        break;
-                      if (c == '\n' || c == ' ' || c == '\t')
-                        continue;
-                      if (c == '#')
-                        {
-                          /* Skip comment, to end of line.  */
-                          do
-                            c = getc (fp);
-                          while (!(c == EOF || c == '\n'));
-                          if (c == EOF)
-                            break;
-                          continue;
-                        }
-                      ungetc (c, fp);
-                      if (fscanf (fp, "%50s %50s", buf1, buf2) < 2)
-                        break;
-                      l1 = strlen (buf1);
-                      l2 = strlen (buf2);
-                      old_res_ptr = res_ptr;
-                      if (res_size == 0)
-                        {
-                          res_size = l1 + 1 + l2 + 1;
-                          res_ptr = (char *) malloc (res_size + 1);
-                        }
-                      else
-                        {
-                          res_size += l1 + 1 + l2 + 1;
-                          res_ptr = (char *) realloc (res_ptr, res_size + 1);
-                        }
-                      if (res_ptr == NULL)
-                        {
-                          /* Out of memory. */
-                          res_size = 0;
-                          free (old_res_ptr);
-                          break;
-                        }
-                      strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);
-                      strcpy (res_ptr + res_size - (l2 + 1), buf2);
-                    }
-                  fclose (fp);
-                  if (res_size == 0)
-                    cp = "";
-                  else
-                    {
-                      *(res_ptr + res_size) = '\0';
-                      cp = res_ptr;
-                    }
-                }
-            }
-
-          free (file_name);
-        }
-
-#else
-
-# if defined DARWIN7
-      /* To avoid the trouble of installing a file that is shared by many
-         GNU packages -- many packaging systems have problems with this --,
-         simply inline the aliases here.  */
-      cp = "ISO8859-1" "\0" "ISO-8859-1" "\0"
-           "ISO8859-2" "\0" "ISO-8859-2" "\0"
-           "ISO8859-4" "\0" "ISO-8859-4" "\0"
-           "ISO8859-5" "\0" "ISO-8859-5" "\0"
-           "ISO8859-7" "\0" "ISO-8859-7" "\0"
-           "ISO8859-9" "\0" "ISO-8859-9" "\0"
-           "ISO8859-13" "\0" "ISO-8859-13" "\0"
-           "ISO8859-15" "\0" "ISO-8859-15" "\0"
-           "KOI8-R" "\0" "KOI8-R" "\0"
-           "KOI8-U" "\0" "KOI8-U" "\0"
-           "CP866" "\0" "CP866" "\0"
-           "CP949" "\0" "CP949" "\0"
-           "CP1131" "\0" "CP1131" "\0"
-           "CP1251" "\0" "CP1251" "\0"
-           "eucCN" "\0" "GB2312" "\0"
-           "GB2312" "\0" "GB2312" "\0"
-           "eucJP" "\0" "EUC-JP" "\0"
-           "eucKR" "\0" "EUC-KR" "\0"
-           "Big5" "\0" "BIG5" "\0"
-           "Big5HKSCS" "\0" "BIG5-HKSCS" "\0"
-           "GBK" "\0" "GBK" "\0"
-           "GB18030" "\0" "GB18030" "\0"
-           "SJIS" "\0" "SHIFT_JIS" "\0"
-           "ARMSCII-8" "\0" "ARMSCII-8" "\0"
-           "PT154" "\0" "PT154" "\0"
-         /*"ISCII-DEV" "\0" "?" "\0"*/
-           "*" "\0" "UTF-8" "\0";
-# endif
-
-# if defined VMS
-      /* To avoid the troubles of an extra file charset.alias_vms in the
-         sources of many GNU packages, simply inline the aliases here.  */
-      /* The list of encodings is taken from the OpenVMS 7.3-1 documentation
-         "Compaq C Run-Time Library Reference Manual for OpenVMS systems"
-         section 10.7 "Handling Different Character Sets".  */
-      cp = "ISO8859-1" "\0" "ISO-8859-1" "\0"
-           "ISO8859-2" "\0" "ISO-8859-2" "\0"
-           "ISO8859-5" "\0" "ISO-8859-5" "\0"
-           "ISO8859-7" "\0" "ISO-8859-7" "\0"
-           "ISO8859-8" "\0" "ISO-8859-8" "\0"
-           "ISO8859-9" "\0" "ISO-8859-9" "\0"
-           /* Japanese */
-           "eucJP" "\0" "EUC-JP" "\0"
-           "SJIS" "\0" "SHIFT_JIS" "\0"
-           "DECKANJI" "\0" "DEC-KANJI" "\0"
-           "SDECKANJI" "\0" "EUC-JP" "\0"
-           /* Chinese */
-           "eucTW" "\0" "EUC-TW" "\0"
-           "DECHANYU" "\0" "DEC-HANYU" "\0"
-           "DECHANZI" "\0" "GB2312" "\0"
-           /* Korean */
-           "DECKOREAN" "\0" "EUC-KR" "\0";
-# endif
-
-# if defined WINDOWS_NATIVE || defined __CYGWIN__
-      /* To avoid the troubles of installing a separate file in the same
-         directory as the DLL and of retrieving the DLL's directory at
-         runtime, simply inline the aliases here.  */
-
-      cp = "CP936" "\0" "GBK" "\0"
-           "CP1361" "\0" "JOHAB" "\0"
-           "CP20127" "\0" "ASCII" "\0"
-           "CP20866" "\0" "KOI8-R" "\0"
-           "CP20936" "\0" "GB2312" "\0"
-           "CP21866" "\0" "KOI8-RU" "\0"
-           "CP28591" "\0" "ISO-8859-1" "\0"
-           "CP28592" "\0" "ISO-8859-2" "\0"
-           "CP28593" "\0" "ISO-8859-3" "\0"
-           "CP28594" "\0" "ISO-8859-4" "\0"
-           "CP28595" "\0" "ISO-8859-5" "\0"
-           "CP28596" "\0" "ISO-8859-6" "\0"
-           "CP28597" "\0" "ISO-8859-7" "\0"
-           "CP28598" "\0" "ISO-8859-8" "\0"
-           "CP28599" "\0" "ISO-8859-9" "\0"
-           "CP28605" "\0" "ISO-8859-15" "\0"
-           "CP38598" "\0" "ISO-8859-8" "\0"
-           "CP51932" "\0" "EUC-JP" "\0"
-           "CP51936" "\0" "GB2312" "\0"
-           "CP51949" "\0" "EUC-KR" "\0"
-           "CP51950" "\0" "EUC-TW" "\0"
-           "CP54936" "\0" "GB18030" "\0"
-           "CP65001" "\0" "UTF-8" "\0";
-# endif
-#endif
-
-      charset_aliases = cp;
-    }
-
-  return cp;
-}
-
-/* Determine the current locale's character encoding, and canonicalize it
-   into one of the canonical names listed in config.charset.
-   The result must not be freed; it is statically allocated.
-   If the canonical name cannot be determined, the result is a non-canonical
-   name.  */
-
-#ifdef STATIC
-STATIC
-#endif
-const char *
-locale_charset (void)
-{
-  const char *codeset;
-  const char *aliases;
-
-#if !(defined WINDOWS_NATIVE || defined OS2)
-
-# if HAVE_LANGINFO_CODESET
-
-  /* Most systems support nl_langinfo (CODESET) nowadays.  */
-  codeset = nl_langinfo (CODESET);
-
-#  ifdef __CYGWIN__
-  /* Cygwin < 1.7 does not have locales.  nl_langinfo (CODESET) always
-     returns "US-ASCII".  Return the suffix of the locale name from the
-     environment variables (if present) or the codepage as a number.  */
-  if (codeset != NULL && strcmp (codeset, "US-ASCII") == 0)
-    {
-      const char *locale;
-      static char buf[2 + 10 + 1];
-
-      locale = getenv ("LC_ALL");
-      if (locale == NULL || locale[0] == '\0')
-        {
-          locale = getenv ("LC_CTYPE");
-          if (locale == NULL || locale[0] == '\0')
-            locale = getenv ("LANG");
-        }
-      if (locale != NULL && locale[0] != '\0')
-        {
-          /* If the locale name contains an encoding after the dot, return
-             it.  */
-          const char *dot = strchr (locale, '.');
-
-          if (dot != NULL)
-            {
-              const char *modifier;
-
-              dot++;
-              /* Look for the possible @... trailer and remove it, if any.  */
-              modifier = strchr (dot, '@');
-              if (modifier == NULL)
-                return dot;
-              if (modifier - dot < sizeof (buf))
-                {
-                  memcpy (buf, dot, modifier - dot);
-                  buf [modifier - dot] = '\0';
-                  return buf;
-                }
-            }
-        }
-
-      /* The Windows API has a function returning the locale's codepage as a
-         number: GetACP().  This encoding is used by Cygwin, unless the user
-         has set the environment variable CYGWIN=codepage:oem (which very few
-         people do).
-         Output directed to console windows needs to be converted (to
-         GetOEMCP() if the console is using a raster font, or to
-         GetConsoleOutputCP() if it is using a TrueType font).  Cygwin does
-         this conversion transparently (see winsup/cygwin/fhandler_console.cc),
-         converting to GetConsoleOutputCP().  This leads to correct results,
-         except when SetConsoleOutputCP has been called and a raster font is
-         in use.  */
-      sprintf (buf, "CP%u", GetACP ());
-      codeset = buf;
-    }
-#  endif
-
-# else
-
-  /* On old systems which lack it, use setlocale or getenv.  */
-  const char *locale = NULL;
-
-  /* But most old systems don't have a complete set of locales.  Some
-     (like SunOS 4 or DJGPP) have only the C locale.  Therefore we don't
-     use setlocale here; it would return "C" when it doesn't support the
-     locale name the user has set.  */
-#  if 0
-  locale = setlocale (LC_CTYPE, NULL);
-#  endif
-  if (locale == NULL || locale[0] == '\0')
-    {
-      locale = getenv ("LC_ALL");
-      if (locale == NULL || locale[0] == '\0')
-        {
-          locale = getenv ("LC_CTYPE");
-          if (locale == NULL || locale[0] == '\0')
-            locale = getenv ("LANG");
-        }
-    }
-
-  /* On some old systems, one used to set locale = "iso8859_1". On others,
-     you set it to "language_COUNTRY.charset". In any case, we resolve it
-     through the charset.alias file.  */
-  codeset = locale;
-
-# endif
-
-#elif defined WINDOWS_NATIVE
-
-  static char buf[2 + 10 + 1];
-
-  /* The Windows API has a function returning the locale's codepage as
-     a number, but the value doesn't change according to what the
-     'setlocale' call specified.  So we use it as a last resort, in
-     case the string returned by 'setlocale' doesn't specify the
-     codepage.  */
-  char *current_locale = setlocale (LC_ALL, NULL);
-  char *pdot;
-
-  /* If they set different locales for different categories,
-     'setlocale' will return a semi-colon separated list of locale
-     values.  To make sure we use the correct one, we choose LC_CTYPE.  */
-  if (strchr (current_locale, ';'))
-    current_locale = setlocale (LC_CTYPE, NULL);
-
-  pdot = strrchr (current_locale, '.');
-  if (pdot)
-    sprintf (buf, "CP%s", pdot + 1);
-  else
-    {
-      /* The Windows API has a function returning the locale's codepage as a
-        number: GetACP().
-        When the output goes to a console window, it needs to be provided in
-        GetOEMCP() encoding if the console is using a raster font, or in
-        GetConsoleOutputCP() encoding if it is using a TrueType font.
-        But in GUI programs and for output sent to files and pipes, GetACP()
-        encoding is the best bet.  */
-      sprintf (buf, "CP%u", GetACP ());
-    }
-  codeset = buf;
-
-#elif defined OS2
-
-  const char *locale;
-  static char buf[2 + 10 + 1];
-  ULONG cp[3];
-  ULONG cplen;
-
-  /* Allow user to override the codeset, as set in the operating system,
-     with standard language environment variables.  */
-  locale = getenv ("LC_ALL");
-  if (locale == NULL || locale[0] == '\0')
-    {
-      locale = getenv ("LC_CTYPE");
-      if (locale == NULL || locale[0] == '\0')
-        locale = getenv ("LANG");
-    }
-  if (locale != NULL && locale[0] != '\0')
-    {
-      /* If the locale name contains an encoding after the dot, return it.  */
-      const char *dot = strchr (locale, '.');
-
-      if (dot != NULL)
-        {
-          const char *modifier;
-
-          dot++;
-          /* Look for the possible @... trailer and remove it, if any.  */
-          modifier = strchr (dot, '@');
-          if (modifier == NULL)
-            return dot;
-          if (modifier - dot < sizeof (buf))
-            {
-              memcpy (buf, dot, modifier - dot);
-              buf [modifier - dot] = '\0';
-              return buf;
-            }
-        }
-
-      /* Resolve through the charset.alias file.  */
-      codeset = locale;
-    }
-  else
-    {
-      /* OS/2 has a function returning the locale's codepage as a number.  */
-      if (DosQueryCp (sizeof (cp), cp, &cplen))
-        codeset = "";
-      else
-        {
-          sprintf (buf, "CP%u", cp[0]);
-          codeset = buf;
-        }
-    }
-
-#endif
-
-  if (codeset == NULL)
-    /* The canonical name cannot be determined.  */
-    codeset = "";
-
-  /* Resolve alias. */
-  for (aliases = get_charset_aliases ();
-       *aliases != '\0';
-       aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1)
-    if (strcmp (codeset, aliases) == 0
-        || (aliases[0] == '*' && aliases[1] == '\0'))
-      {
-        codeset = aliases + strlen (aliases) + 1;
-        break;
-      }
-
-  /* Don't return an empty string.  GNU libc and GNU libiconv interpret
-     the empty string as denoting "the locale's character encoding",
-     thus GNU libiconv would call this function a second time.  */
-  if (codeset[0] == '\0')
-    codeset = "ASCII";
-
-#ifdef DARWIN7
-  /* Mac OS X sets MB_CUR_MAX to 1 when LC_ALL=C, and "UTF-8"
-     (the default codeset) does not work when MB_CUR_MAX is 1.  */
-  if (strcmp (codeset, "UTF-8") == 0 && MB_CUR_MAX_L (uselocale (NULL)) <= 1)
-    codeset = "ASCII";
-#endif
-
-  return codeset;
-}
-
-// Local Variables:
-// fill-column: 72
-// mode: C++
-// End:
-// vim: set cindent noexpandtab shiftwidth=2 textwidth=72:

_______________________________________________
groff-commit mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/groff-commit

Reply via email to