changeset 16916:3d02d25fa13d

stdioext: Add support for musl libc. * m4/fbufmode.m4 (gl_FUNC_FBUFMODE): Test whether __fbufsize exists. * lib/fbufmode.c (fbufmode): Add conditional code for musl. * m4/fseterr.m4: New file. * lib/fseterr.h (fseterr): Define as an alias of __fseterr if that function exists. * modules/fseterr (Files): Add m4/fseterr.m4. (configure.ac): Invoke gl_FUNC_FSETERR. Compile fseterr.c if __fseterr does not exist. (Makefile.am): Remove fseterr.c from lib_SOURCES. * lib/freadable.h: Update comment. * lib/fwritable.h: Update comment. * lib/freading.h: Update comment. * lib/fwriting.h: Update comment. * m4/freadahead.m4: New file. * lib/freadahead.h (freadahead): Define as an alias of __freadahead if that function exists. * modules/freadahead (Files): Add m4/freadahead.m4. (configure.ac): Invoke gl_FUNC_FREADAHEAD. Compile freadahead.c if __freadahead does not exist. (Makefile.am): Remove freadahead.c from lib_SOURCES. * m4/freadptr.m4: New file. * lib/freadptr.h (freadptr): Define as an alias of __freadptr if that function exists. * modules/freadptr (Files): Add m4/freadptr.m4. (configure.ac): Invoke gl_FUNC_FREADPTR. Compile freadptr.c if __freadptr does not exist. (Makefile.am): Remove freadptr.c from lib_SOURCES. * m4/freadseek.m4: New file. * lib/freadseek.c (freadptrinc): Use __freadptrinc if that function exists. * modules/freadseek (Files): Add m4/freadseek.m4. (configure.ac): Invoke gl_FUNC_FREADSEEK. * lib/fpurge.c (fpurge): Update comment. Reported by and with help from Rich Felker <dalias@aerifal.cx>.
author Bruno Haible <bruno@clisp.org>
date Tue, 19 Jun 2012 23:35:08 +0200
parents 3aded6c8d483
children d7028e1986c1
files ChangeLog lib/fbufmode.c lib/fpurge.c lib/freadable.h lib/freadahead.h lib/freading.h lib/freadptr.h lib/freadseek.c lib/fseterr.h lib/fwritable.h lib/fwriting.h m4/fbufmode.m4 m4/freadahead.m4 m4/freadptr.m4 m4/freadseek.m4 m4/fseterr.m4 modules/freadahead modules/freadptr modules/freadseek modules/fseterr
diffstat 20 files changed, 164 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,52 @@
+2012-06-19  Bruno Haible  <bruno@clisp.org>
+
+	stdioext: Add support for musl libc.
+
+	* m4/fbufmode.m4 (gl_FUNC_FBUFMODE): Test whether __fbufsize exists.
+	* lib/fbufmode.c (fbufmode): Add conditional code for musl.
+
+	* m4/fseterr.m4: New file.
+	* lib/fseterr.h (fseterr): Define as an alias of __fseterr if that
+	function exists.
+	* modules/fseterr (Files): Add m4/fseterr.m4.
+	(configure.ac): Invoke gl_FUNC_FSETERR. Compile fseterr.c if
+	__fseterr does not exist.
+	(Makefile.am): Remove fseterr.c from lib_SOURCES.
+
+	* lib/freadable.h: Update comment.
+
+	* lib/fwritable.h: Update comment.
+
+	* lib/freading.h: Update comment.
+
+	* lib/fwriting.h: Update comment.
+
+	* m4/freadahead.m4: New file.
+	* lib/freadahead.h (freadahead): Define as an alias of __freadahead if
+	that function exists.
+	* modules/freadahead (Files): Add m4/freadahead.m4.
+	(configure.ac): Invoke gl_FUNC_FREADAHEAD. Compile freadahead.c if
+	__freadahead does not exist.
+	(Makefile.am): Remove freadahead.c from lib_SOURCES.
+
+	* m4/freadptr.m4: New file.
+	* lib/freadptr.h (freadptr): Define as an alias of __freadptr if that
+	function exists.
+	* modules/freadptr (Files): Add m4/freadptr.m4.
+	(configure.ac): Invoke gl_FUNC_FREADPTR. Compile freadptr.c if
+	__freadptr does not exist.
+	(Makefile.am): Remove freadptr.c from lib_SOURCES.
+
+	* m4/freadseek.m4: New file.
+	* lib/freadseek.c (freadptrinc): Use __freadptrinc if that function
+	exists.
+	* modules/freadseek (Files): Add m4/freadseek.m4.
+	(configure.ac): Invoke gl_FUNC_FREADSEEK.
+
+	* lib/fpurge.c (fpurge): Update comment.
+
+	Reported by and with help from Rich Felker <dalias@aerifal.cx>.
+
 2012-06-19  Bruno Haible  <bruno@clisp.org>
 
 	*printf-posix: Put more info into config.log.
--- a/lib/fbufmode.c
+++ b/lib/fbufmode.c
@@ -79,6 +79,10 @@
   if (fp->__linebuf)
     return _IOLBF;
   return (fp->__bufsize > 0 ? _IOFBF : _IONBF);
+#elif HAVE___FLBF && HAVE___FBUFSIZE /* musl libc */
+  if (__flbf (fp))
+    return _IOLBF;
+  return (__fbufsize (fp) > 0 ? _IOFBF : _IONBF);
 #elif defined EPLAN9                /* Plan9 */
   if (fp->flags & 2 /* LINEBUF */)
     return _IOLBF;
--- a/lib/fpurge.c
+++ b/lib/fpurge.c
@@ -29,7 +29,7 @@
 int
 fpurge (FILE *fp)
 {
-#if HAVE___FPURGE                   /* glibc >= 2.2, Haiku, Solaris >= 7 */
+#if HAVE___FPURGE                   /* glibc >= 2.2, Haiku, Solaris >= 7, musl libc */
 
   __fpurge (fp);
   /* The __fpurge function does not have a return value.  */
--- a/lib/freadable.h
+++ b/lib/freadable.h
@@ -22,7 +22,7 @@
    STREAM must not be wide-character oriented.
    The result doesn't change until the stream is closed or re-opened.  */
 
-#if HAVE___FREADABLE /* glibc >= 2.2, Solaris >= 7 */
+#if HAVE___FREADABLE /* glibc >= 2.2, Solaris >= 7, musl libc */
 
 # include <stdio_ext.h>
 # define freadable(stream) (__freadable (stream) != 0)
--- a/lib/freadahead.h
+++ b/lib/freadahead.h
@@ -17,10 +17,6 @@
 #include <stddef.h>
 #include <stdio.h>
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* Assuming the stream STREAM is open for reading:
    Return the number of bytes waiting in the input buffer of STREAM.
    This includes both the bytes that have been read from the underlying input
@@ -31,8 +27,21 @@
 
    STREAM must not be wide-character oriented.  */
 
+#if HAVE___FREADAHEAD /* musl libc */
+
+# include <stdio_ext.h>
+# define freadahead(stream) __freadahead (stream)
+
+#else
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
 extern size_t freadahead (FILE *stream) _GL_ATTRIBUTE_PURE;
 
-#ifdef __cplusplus
+# ifdef __cplusplus
 }
+# endif
+
 #endif
--- a/lib/freading.h
+++ b/lib/freading.h
@@ -33,7 +33,7 @@
    STREAM must not be wide-character oriented.  */
 
 #if HAVE___FREADING && (!defined __GLIBC__ || defined __UCLIBC__ || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7))
-/* Solaris >= 7, not glibc >= 2.2, but glibc >= 2.7  */
+/* Solaris >= 7, not glibc >= 2.2, but glibc >= 2.7, or musl libc  */
 
 # include <stdio_ext.h>
 # define freading(stream) (__freading (stream) != 0)
--- a/lib/freadptr.h
+++ b/lib/freadptr.h
@@ -17,10 +17,6 @@
 #include <stddef.h>
 #include <stdio.h>
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* Assuming the stream STREAM is open for reading:
    Return a pointer to the input buffer of STREAM, or NULL.
    If the returned pointer is non-NULL, *SIZEP is set to the (positive) size
@@ -32,8 +28,21 @@
 
    STREAM must not be wide-character oriented.  */
 
+#if HAVE___FREADPTR /* musl libc */
+
+# include <stdio_ext.h>
+# define freadptr(stream,sizep) __freadptr (stream, sizep)
+
+#else
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
 extern const char * freadptr (FILE *stream, size_t *sizep);
 
-#ifdef __cplusplus
+# ifdef __cplusplus
 }
+# endif
+
 #endif
--- a/lib/freadseek.c
+++ b/lib/freadseek.c
@@ -34,7 +34,9 @@
 freadptrinc (FILE *fp, size_t increment)
 {
   /* Keep this code in sync with freadptr!  */
-#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+#if HAVE___FREADPTRINC              /* musl libc */
+  __freadptrinc (fp, increment);
+#elif defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
   fp->_IO_read_ptr += increment;
 #elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
   fp_->_p += increment;
--- a/lib/fseterr.h
+++ b/lib/fseterr.h
@@ -19,19 +19,27 @@
 
 #include <stdio.h>
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
 /* Set the error indicator of the stream FP.
    The "error indicator" is set when an I/O operation on the stream fails, and
    is cleared (together with the "end-of-file" indicator) by clearerr (FP).  */
+
+#if HAVE___FSETERR /* musl libc */
+
+# include <stdio_ext.h>
+# define fseterr(fp) __fseterr (fp)
+
+#else
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
 extern void fseterr (FILE *fp);
 
+# ifdef __cplusplus
+}
+# endif
 
-#ifdef __cplusplus
-}
 #endif
 
 #endif /* _FSETERR_H */
--- a/lib/fwritable.h
+++ b/lib/fwritable.h
@@ -22,7 +22,7 @@
    STREAM must not be wide-character oriented.
    The result doesn't change until the stream is closed or re-opened.  */
 
-#if HAVE___FWRITABLE /* glibc >= 2.2, Solaris >= 7 */
+#if HAVE___FWRITABLE /* glibc >= 2.2, Solaris >= 7, musl libc */
 
 # include <stdio_ext.h>
 # define fwritable(stream) (__fwritable (stream) != 0)
--- a/lib/fwriting.h
+++ b/lib/fwriting.h
@@ -33,7 +33,7 @@
 
    STREAM must not be wide-character oriented.  */
 
-#if HAVE___FWRITING /* glibc >= 2.2, Solaris >= 7 */
+#if HAVE___FWRITING /* glibc >= 2.2, Solaris >= 7, musl libc */
 
 # include <stdio_ext.h>
 # define fwriting(stream) (__fwriting (stream) != 0)
--- a/m4/fbufmode.m4
+++ b/m4/fbufmode.m4
@@ -1,4 +1,4 @@
-# fbufmode.m4 serial 1
+# fbufmode.m4 serial 2
 dnl Copyright (C) 2007, 2009-2012 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -7,5 +7,5 @@
 AC_DEFUN([gl_FUNC_FBUFMODE],
 [
   dnl Prerequisites of lib/fbufmode.c.
-  AC_CHECK_FUNCS_ONCE([__flbf])
+  AC_CHECK_FUNCS_ONCE([__flbf __fbufsize])
 ])
new file mode 100644
--- /dev/null
+++ b/m4/freadahead.m4
@@ -0,0 +1,10 @@
+# freadahead.m4 serial 1
+dnl Copyright (C) 2012 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FREADAHEAD],
+[
+  AC_CHECK_FUNCS_ONCE([__freadahead])
+])
new file mode 100644
--- /dev/null
+++ b/m4/freadptr.m4
@@ -0,0 +1,10 @@
+# freadptr.m4 serial 1
+dnl Copyright (C) 2012 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FREADPTR],
+[
+  AC_CHECK_FUNCS_ONCE([__freadptr])
+])
new file mode 100644
--- /dev/null
+++ b/m4/freadseek.m4
@@ -0,0 +1,11 @@
+# freadseek.m4 serial 1
+dnl Copyright (C) 2012 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FREADSEEK],
+[
+  AC_REQUIRE([AC_C_INLINE])
+  AC_CHECK_FUNCS_ONCE([__freadptrinc])
+])
new file mode 100644
--- /dev/null
+++ b/m4/fseterr.m4
@@ -0,0 +1,10 @@
+# fseterr.m4 serial 1
+dnl Copyright (C) 2012 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_FSETERR],
+[
+  AC_CHECK_FUNCS_ONCE([__fseterr])
+])
--- a/modules/freadahead
+++ b/modules/freadahead
@@ -6,13 +6,17 @@
 lib/freadahead.h
 lib/freadahead.c
 lib/stdio-impl.h
+m4/freadahead.m4
 
 Depends-on:
 
 configure.ac:
+gl_FUNC_FREADAHEAD
+if test $ac_cv_func___freadahead = no; then
+  AC_LIBOBJ([freadahead])
+fi
 
 Makefile.am:
-lib_SOURCES += freadahead.c
 
 Include:
 "freadahead.h"
--- a/modules/freadptr
+++ b/modules/freadptr
@@ -5,13 +5,17 @@
 lib/freadptr.h
 lib/freadptr.c
 lib/stdio-impl.h
+m4/freadptr.m4
 
 Depends-on:
 
 configure.ac:
+gl_FUNC_FREADPTR
+if test $ac_cv_func___freadptr = no; then
+  AC_LIBOBJ([freadptr])
+fi
 
 Makefile.am:
-lib_SOURCES += freadptr.c
 
 Include:
 "freadptr.h"
--- a/modules/freadseek
+++ b/modules/freadseek
@@ -5,6 +5,7 @@
 lib/freadseek.h
 lib/freadseek.c
 lib/stdio-impl.h
+m4/freadseek.m4
 
 Depends-on:
 freadahead
@@ -13,7 +14,7 @@
 lseek
 
 configure.ac:
-AC_REQUIRE([AC_C_INLINE])
+gl_FUNC_FREADSEEK
 
 Makefile.am:
 lib_SOURCES += freadseek.c
--- a/modules/fseterr
+++ b/modules/fseterr
@@ -5,13 +5,17 @@
 lib/fseterr.h
 lib/fseterr.c
 lib/stdio-impl.h
+m4/fseterr.m4
 
 Depends-on:
 
 configure.ac:
+gl_FUNC_FSETERR
+if test $ac_cv_func___fseterr = no; then
+  AC_LIBOBJ([fseterr])
+fi
 
 Makefile.am:
-lib_SOURCES += fseterr.c
 
 Include:
 "fseterr.h"