Feature #5346
openlocale independant strto* missing (as well as their wchar variants)
0%
Description
The following seem to be "missing" :
strtod_l strtol_l strtoul_l wcstod_l wcstol_l wcstoul_l
Apparently they are gNUlib functions as opposed to POSIX.
NetBSD defines these (plus some additions) as
#if (_POSIX_C_SOURCE - 0) >= 200809L || defined(_NETBSD_SOURCE) # ifndef __LOCALE_T_DECLARED typedef struct _locale *locale_t; # define __LOCALE_T_DECLARED # endif double strtod_l(const char * __restrict, char ** __restrict, locale_t); float strtof_l(const char * __restrict, char ** __restrict, locale_t); long double strtold_l(const char * __restrict, char ** __restrict, locale_t); long strtol_l(const char * __restrict, char ** __restrict, int, locale_t); unsigned long strtoul_l(const char * __restrict, char ** __restrict, int, locale_t); /* LONGLONG */ long long int strtoll_l(const char * __restrict, char ** __restrict, int, locale_t); /* LONGLONG */ unsigned long long int strtoull_l(const char * __restrict, char ** __restrict, int, locale_t); ...
and
#if (_POSIX_C_SOURCE - 0) >= 200809L || defined(_NETBSD_SOURCE) # ifndef __LOCALE_T_DECLARED typedef struct _locale *locale_t; # define __LOCALE_T_DECLARED # endif __BEGIN_DECLS size_t mbsnrtowcs(wchar_t * __restrict, const char ** __restrict, size_t, size_t, mbstate_t * __restrict); size_t wcsnrtombs(char * __restrict, const wchar_t ** __restrict, size_t, size_t, mbstate_t * __restrict); int wcscoll_l(const wchar_t *, const wchar_t *, locale_t); size_t wcsxfrm_l(wchar_t *, const wchar_t *, size_t, locale_t); int wcsncasecmp_l(const wchar_t *, const wchar_t *, size_t, locale_t); int wcscasecmp_l(const wchar_t *, const wchar_t *, locale_t); size_t wcsftime_l(wchar_t * __restrict, size_t, const wchar_t * __restrict, const struct tm * __restrict, locale_t); float wcstof_l(const wchar_t * __restrict, wchar_t ** __restrict, locale_t); double wcstod_l(const wchar_t * __restrict, wchar_t ** __restrict, locale_t); long double wcstold_l(const wchar_t * __restrict, wchar_t ** __restrict, locale_t); long int wcstol_l(const wchar_t * __restrict, wchar_t ** __restrict, int, locale_t); unsigned long int wcstoul_l(const wchar_t * __restrict, wchar_t ** __restrict, int, locale_t); /* LONGLONG */ long long int wcstoll_l(const wchar_t * __restrict, wchar_t ** __restrict, int, locale_t); /* LONGLONG */ unsigned long long int wcstoull_l(const wchar_t * __restrict, wchar_t ** __restrict, int, locale_t); int wcwidth_l(wchar_t, locale_t); int wcswidth_l(const wchar_t *, size_t, locale_t); __END_DECLS #endif /* _POSIX_C_SOURCE || _NETBSD_SOURCE */
Updated by Garrett D'Amore about 9 years ago
These functions are not part of the POSIX specification, but are BSD additions (really inherited from Darwin I believe).
On the one hand, it seems like they would be convenient. But on the other hand, I'm moderately opposed to polluting the namespace with symbols that aren't part of standards yet -- it causes grief later if POSIX adopts a different definition.
Are there applications that actually need these symbols? Would their presence help application portability?
Updated by Richard PALO about 9 years ago
As these were gnulib and not POSIX, I tabled working further on the packages when I posted the issue (a placeholder for discussion).
If I come across them or any other cases again, I'll drop mention here. thx
Updated by Igor Kozhukhov over 7 years ago
try to build guile-2.0 , debian package guile-2.0-2.0.11+1 and build failed with:
gcc -DHAVE_CONFIG_H -DBUILDING_LIBGUILE=1 -I.. -I.. -I../lib -I../lib -I/myshare/builds7/dilos/dg-git/components/guile-2.0/d/guile-2.0-2.0.11+1.orig -D__USE_LEGACY_PROTOTYPES__ -D_REENTRANT -pthreads -Wall -Wmissing-prototypes -Wdeclaration-after-statement -Wpointer-arith -Wswitch-enum -fno-strict-aliasing -fwrapv -fvisibility=hidden -g -O2 -DPACKAGE_PACKAGER='"Debian"' -DPACKAGE_PACKAGER_VERSION='"2.0.11-deb+1-10"' -DPACKAGE_PACKAGER_BUG_REPORTS='"http://www.debian.org/Bugs/Reporting"' -m64 -c -o guile-guile.o `test -f 'guile.c' || echo './'`guile.c /bin/sh ../libtool --tag=CC --mode=link gcc -D_REENTRANT -pthreads -Wall -Wmissing-prototypes -Wdeclaration-after-statement -Wpointer-arith -Wswitch-enum -fno-strict-aliasing -fwrapv -fvisibility=hidden -g -O2 -DPACKAGE_PACKAGER='"Debian"' -DPACKAGE_PACKAGER_VERSION='"2.0.11-deb+1-10"' -DPACKAGE_PACKAGER_BUG_REPORTS='"http://www.debian.org/Bugs/Reporting"' -m64 -D_REENTRANT -pthreads -o guile guile-guile.o libguile-2.0.la -lsocket -lnsl -lm libtool: link: gcc -D_REENTRANT -pthreads -Wall -Wmissing-prototypes -Wdeclaration-after-statement -Wpointer-arith -Wswitch-enum -fno-strict-aliasing -fwrapv -fvisibility=hidden -g -O2 "-DPACKAGE_PACKAGER=\"Debian\"" "-DPACKAGE_PACKAGER_VERSION=\"2.0.11-deb+1-10\"" "-DPACKAGE_PACKAGER_BUG_REPORTS=\"http://www.debian.org/Bugs/Reporting\"" -m64 -D_REENTRANT -pthreads -o .libs/guile guile-guile.o ./.libs/libguile-2.0.so -L/usr/lib/amd64 -lgc -lffi -lunistring -liconv -lgmp -lltdl -lsocket -lnsl -lm -pthreads -R/usr/lib/amd64 Undefined first referenced symbol in file strtod_l ./.libs/libguile-2.0.so strtol_l ./.libs/libguile-2.0.so ld: fatal: symbol referencing errors. No output written to .libs/guile collect2: error: ld returned 1 exit status
what will be workaround for it?
will be better to see it implemented in illumos because Linux and BSD not failed with these function, but illumos does.
Updated by Richard PALO over 7 years ago
You may wish to try 2.0.12 (which is the version building fine in pkgsrc).
The changelog indicates patches to check for these (including one from Andy).
But since a test case came by again, I'm all for the implementation of these functions!