From c5a45174d224bf1fe6510316aef835563b9db94f Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Thu, 18 Jan 2024 22:58:48 -0500 Subject: [PATCH] cdecl99: Avoid gnulib setlocale_null bits. As this is a single-threaded application which does nothing exciting regarding locales, we shouldn't need the setlocale_null replacement. This performs a pile of configure tests related to the thread safety of setlocale(x, NULL), which includes possibly pulling in threading libraries and a bunch of other nonsense. To do this, we replace hard-locale (the only module using this) with an inline function using setlocale directly (inline is much better, because there is only one call site). --- lib/local/lib/hard-locale.h | 41 +++++++++++++++++++++++++++++++++++ lib/local/modules/hard-locale | 22 +++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 lib/local/lib/hard-locale.h create mode 100644 lib/local/modules/hard-locale diff --git a/lib/local/lib/hard-locale.h b/lib/local/lib/hard-locale.h new file mode 100644 index 0000000..b5d95e3 --- /dev/null +++ b/lib/local/lib/hard-locale.h @@ -0,0 +1,41 @@ +/* Determine whether a locale is hard. + * + * Copyright (C) 1997-1999, 2002-2004, 2006-2007, 2009-2022 Free Software + * Foundation, Inc. + * + * Imported from Gnulib hard-locale.[ch] with modifications by Nick Bowler: + * + * - Remove all setlocale workarounds, as our use case does not do anything + * fancy with locales and does not require thread safety (2024-01). + * + * 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. + * + * 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +#ifndef HARD_LOCALE_H_ +#define HARD_LOCALE_H_ + +#include +#include + +static inline int hard_locale(int locale) +{ + char *name; + + if (!(name = setlocale(locale, NULL))) + return 0; + + return strcmp(name, "C") && strcmp(name, "POSIX"); +} + +#endif diff --git a/lib/local/modules/hard-locale b/lib/local/modules/hard-locale new file mode 100644 index 0000000..eb0ec8f --- /dev/null +++ b/lib/local/modules/hard-locale @@ -0,0 +1,22 @@ +Description: +Determine whether the current locale is different from the "C" locale +(simplified version with all multithreading bits removed). + +Files: +lib/hard-locale.h + +Depends-on: +gnulib-local + +configure.ac: +m4_set_add_all([DX_GNULIB_LOCAL_DIST], [modules/hard-locale], + [lib/hard-locale.h])dnl +AC_REQUIRE([AC_C_INLINE])dnl + +Makefile.am: + +License: +LGPLv2+ + +Maintainer: +Nick Bowler -- 2.43.2