about summary refs log tree commit diff
diff options
authorRich Felker <dalias@aerifal.cx>2021-12-09 15:35:13 -0500
committerRich Felker <dalias@aerifal.cx>2021-12-09 15:35:13 -0500
commit8d404733e1314ef633aa09a90865e94fe711b4ca (patch)
parent98e688a9da5e7b2925dda17a2d6820dddf1fb287 (diff)
fix mismatched signatures for strtod_l family
strtod_l, strtof_l, and strtold_l originally existed only as
glibc-ABI-compat symbols. as noted in the commit which added them,
17a60f9d327c6f8b5707a06f9497d846e75c01f2, making them aliases for the
non-_l functions was a hack and not appropriate if they ever became
public API.

unfortunately, commit 35eb1a1a9b97577e113240cd65bf9fc44b8df030 did
make them public without undoing the hack. fix that now by moving the
the _l functions to their own file as wrappers that just throw away
the locale_t argument.
2 files changed, 22 insertions, 7 deletions
diff --git a/src/locale/strtod_l.c b/src/locale/strtod_l.c
new file mode 100644
index 00000000..574ba148
--- /dev/null
+++ b/src/locale/strtod_l.c
@@ -0,0 +1,22 @@
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <locale.h>
+float strtof_l(const char *restrict s, char **restrict p, locale_t l)
+	return strtof(s, p);
+double strtod_l(const char *restrict s, char **restrict p, locale_t l)
+	return strtod(s, p);
+long double strtold_l(const char *restrict s, char **restrict p, locale_t l)
+	return strtold(s, p);
+weak_alias(strtof_l, __strtof_l);
+weak_alias(strtod_l, __strtod_l);
+weak_alias(strtold_l, __strtold_l);
diff --git a/src/stdlib/strtod.c b/src/stdlib/strtod.c
index a5d0118a..39b9daad 100644
--- a/src/stdlib/strtod.c
+++ b/src/stdlib/strtod.c
@@ -28,10 +28,3 @@ long double strtold(const char *restrict s, char **restrict p)
 	return strtox(s, p, 2);
-weak_alias(strtof, strtof_l);
-weak_alias(strtod, strtod_l);
-weak_alias(strtold, strtold_l);
-weak_alias(strtof, __strtof_l);
-weak_alias(strtod, __strtod_l);
-weak_alias(strtold, __strtold_l);