diff options
Diffstat (limited to 'lib/hard-locale.c')
| -rw-r--r-- | lib/hard-locale.c | 70 | 
1 files changed, 12 insertions, 58 deletions
diff --git a/lib/hard-locale.c b/lib/hard-locale.c index 89027f75..f7fbc470 100644 --- a/lib/hard-locale.c +++ b/lib/hard-locale.c @@ -1,28 +1,19 @@  /* hard-locale.c -- Determine whether a locale is hard. -   Copyright (C) 1997-1999, 2002-2004, 2006-2007, 2009-2018 Free Software +   Copyright (C) 1997-1999, 2002-2004, 2006-2007, 2009-2022 Free Software     Foundation, Inc. -   This program is free software: you can redistribute it and/or -   modify it under the terms of either: +   This file is free software: you can redistribute it and/or modify +   it under the terms of the GNU Lesser General Public License as +   published by the Free Software Foundation; either version 2.1 of the +   License, or (at your option) any later version. -     * the GNU Lesser General Public License as published by the Free -       Software Foundation; either version 3 of the License, or (at your -       option) any later version. - -   or - -     * the GNU General Public License as published by the Free -       Software Foundation; either version 2 of the License, or (at your -       option) any later version. - -   or both in parallel, as here. -   This program is distributed in the hope that it will be useful, +   This file 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. +   GNU Lesser General Public License for more details. -   You should have received a copy of the GNU General Public License +   You should have received a copy of the GNU Lesser General Public License     along with this program.  If not, see <https://www.gnu.org/licenses/>.  */  #include <config.h> @@ -30,52 +21,15 @@  #include "hard-locale.h"  #include <locale.h> -#include <stdlib.h>  #include <string.h> -#ifdef __GLIBC__ -# define GLIBC_VERSION __GLIBC__ -#elif defined __UCLIBC__ -# define GLIBC_VERSION 2 -#else -# define GLIBC_VERSION 0 -#endif - -/* Return true if the current CATEGORY locale is hard, i.e. if you -   can't get away with assuming traditional C or POSIX behavior.  */  bool  hard_locale (int category)  { -  bool hard = true; -  char const *p = setlocale (category, NULL); - -  if (p) -    { -      if (2 <= GLIBC_VERSION) -        { -          if (strcmp (p, "C") == 0 || strcmp (p, "POSIX") == 0) -            hard = false; -        } -      else -        { -          char *locale = strdup (p); -          if (locale) -            { -              /* Temporarily set the locale to the "C" and "POSIX" locales -                 to find their names, so that we can determine whether one -                 or the other is the caller's locale.  */ -              if (((p = setlocale (category, "C")) -                   && strcmp (p, locale) == 0) -                  || ((p = setlocale (category, "POSIX")) -                      && strcmp (p, locale) == 0)) -                hard = false; +  char locale[SETLOCALE_NULL_MAX]; -              /* Restore the caller's locale.  */ -              setlocale (category, locale); -              free (locale); -            } -        } -    } +  if (setlocale_null_r (category, locale, sizeof (locale))) +    return false; -  return hard; +  return !(strcmp (locale, "C") == 0 || strcmp (locale, "POSIX") == 0);  }  | 
