summaryrefslogtreecommitdiff
path: root/lib/hard-locale.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/hard-locale.c')
-rw-r--r--lib/hard-locale.c47
1 files changed, 5 insertions, 42 deletions
diff --git a/lib/hard-locale.c b/lib/hard-locale.c
index dcfcad6..730e9be 100644
--- a/lib/hard-locale.c
+++ b/lib/hard-locale.c
@@ -1,6 +1,6 @@
/* hard-locale.c -- Determine whether a locale is hard.
- Copyright (C) 1997-1999, 2002-2004, 2006-2007, 2009-2019 Free Software
+ Copyright (C) 1997-1999, 2002-2004, 2006-2007, 2009-2020 Free Software
Foundation, Inc.
This program is free software: you can redistribute it and/or modify
@@ -21,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);
}