From b427defc39e22451bc099ce880e089a243ee98d9 Mon Sep 17 00:00:00 2001 From: Sebastien Marie Date: Wed, 23 Jul 2025 08:50:50 +0000 Subject: [PATCH] openbsd: implement FILE_CNT() on opaque FILE On OpenBSD, FILE is opaque (starting from upcoming OpenBSD 7.8). FILE_CNT() macro is implementable using `size_t __freadahead(FILE *stream)` function (provided for gnulib compat). --- src/aclocal.m4 | 21 ++++++++++----- src/configure | 37 +++++++++++++++++++++----- src/h/config-internal.h.in | 8 ++++-- src/util/x86-linux-gnu.cross_config | 2 +- src/util/x86_64-linux-gnu.cross_config | 2 +- 5 files changed, 53 insertions(+), 17 deletions(-) diff --git a/src/aclocal.m4 b/src/aclocal.m4 index 30299c816..28c7ffd7c 100644 --- a/src/aclocal.m4 +++ b/src/aclocal.m4 @@ -153,9 +153,10 @@ ECL_NEWLINE=LF ### 1.5) Can we guess how many characters are available for reading from ### the FILE structure? ### 0 = no -### 1 = (f)->_IO_read_end - (f)->_IO_read_ptr -### 2 = (f)->_r -### 3 = (f)->_cnt +### 1 = __freadahead((f)) +### 2 = (f)->_IO_read_end - (f)->_IO_read_ptr +### 3 = (f)->_r +### 4 = (f)->_cnt ECL_FILE_CNT=0 ### @@ -626,21 +627,29 @@ AC_DEFUN(ECL_FILE_STRUCTURE,[ AC_SUBST(ECL_FILE_CNT) if test -z "${ECL_FILE_CNT}"; then ECL_FILE_CNT=0 +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #include +]], [[ + FILE *f = fopen("conftestval","w"); + if (__freadahead((f))) + return 1; +]])],[ECL_FILE_CNT=1],[]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ FILE *f = fopen("conftestval","w"); if ((f)->_IO_read_end - (f)->_IO_read_ptr) return 1; -]])],[ECL_FILE_CNT=1],[]) +]])],[ECL_FILE_CNT=2],[]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ FILE *f = fopen("conftestval","w"); if ((f)->_r) return 1; -]])],[ECL_FILE_CNT=2],[]) +]])],[ECL_FILE_CNT=3],[]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ FILE *f = fopen("conftestval","w"); if ((f)->_cnt) return 1; -]])],[ECL_FILE_CNT=3],[]) +]])],[ECL_FILE_CNT=4],[]) fi ]) diff --git a/src/configure b/src/configure index 6f82dbf9c..57834b92b 100755 --- a/src/configure +++ b/src/configure @@ -5886,9 +5886,10 @@ ECL_NEWLINE=LF ### 1.5) Can we guess how many characters are available for reading from ### the FILE structure? ### 0 = no -### 1 = (f)->_IO_read_end - (f)->_IO_read_ptr -### 2 = (f)->_r -### 3 = (f)->_cnt +### 1 = __freadahead((f)) +### 2 = (f)->_IO_read_end - (f)->_IO_read_ptr +### 3 = (f)->_r +### 4 = (f)->_cnt ECL_FILE_CNT=0 ### @@ -9250,6 +9251,29 @@ fi if test -z "${ECL_FILE_CNT}"; then ECL_FILE_CNT=0 cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #include + +int +main (void) +{ + + FILE *f = fopen("conftestval","w"); + if (__freadahead((f))) + return 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ECL_FILE_CNT=1 +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -9266,7 +9290,7 @@ main (void) _ACEOF if ac_fn_c_try_compile "$LINENO" then : - ECL_FILE_CNT=1 + ECL_FILE_CNT=2 fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -9286,7 +9310,7 @@ main (void) _ACEOF if ac_fn_c_try_compile "$LINENO" then : - ECL_FILE_CNT=2 + ECL_FILE_CNT=3 fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -9306,7 +9330,7 @@ main (void) _ACEOF if ac_fn_c_try_compile "$LINENO" then : - ECL_FILE_CNT=3 + ECL_FILE_CNT=4 fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi @@ -12810,4 +12834,3 @@ fi for i in $srcdir/c/*/; do mkdir -p c/`basename $i`; done - diff --git a/src/h/config-internal.h.in b/src/h/config-internal.h.in index ebb2792fd..952b41ee1 100644 --- a/src/h/config-internal.h.in +++ b/src/h/config-internal.h.in @@ -176,12 +176,16 @@ #undef FILE_CNT #if @ECL_FILE_CNT@ == 1 -# define FILE_CNT(fp) ((fp)->_IO_read_end - (fp)->_IO_read_ptr) +# include +# define FILE_CNT(fp) (__freadahead((fp))) #endif #if @ECL_FILE_CNT@ == 2 -# define FILE_CNT(fp) ((fp)->_r) +# define FILE_CNT(fp) ((fp)->_IO_read_end - (fp)->_IO_read_ptr) #endif #if @ECL_FILE_CNT@ == 3 +# define FILE_CNT(fp) ((fp)->_r) +#endif +#if @ECL_FILE_CNT@ == 4 # define FILE_CNT(fp) ((fp)->_cnt) #endif diff --git a/src/util/x86-linux-gnu.cross_config b/src/util/x86-linux-gnu.cross_config index 03be03df5..d309b5c60 100644 --- a/src/util/x86-linux-gnu.cross_config +++ b/src/util/x86-linux-gnu.cross_config @@ -8,7 +8,7 @@ CL_LONG_BITS=32 ECL_STACK_DIR=down ECL_BIGENDIAN=no ECL_NEWLINE=LF -ECL_FILE_CNT=1 +ECL_FILE_CNT=2 ECL_STDINT_HEADER="#include " ECL_UINT8_T=uint8_t ECL_UINT16_T=uint16_t diff --git a/src/util/x86_64-linux-gnu.cross_config b/src/util/x86_64-linux-gnu.cross_config index e6d83dd73..0fbf2a9d8 100644 --- a/src/util/x86_64-linux-gnu.cross_config +++ b/src/util/x86_64-linux-gnu.cross_config @@ -8,7 +8,7 @@ CL_LONG_BITS=64 ECL_STACK_DIR=down ECL_BIGENDIAN=no ECL_NEWLINE=LF -ECL_FILE_CNT=1 +ECL_FILE_CNT=2 ECL_STDINT_HEADER="#include " ECL_UINT8_T=uint8_t ECL_UINT16_T=uint16_t -- GitLab