|
Packit |
8f70b4 |
# ftello.m4 serial 13
|
|
Packit |
8f70b4 |
dnl Copyright (C) 2007-2018 Free Software Foundation, Inc.
|
|
Packit |
8f70b4 |
dnl This file is free software; the Free Software Foundation
|
|
Packit |
8f70b4 |
dnl gives unlimited permission to copy and/or distribute it,
|
|
Packit |
8f70b4 |
dnl with or without modifications, as long as this notice is preserved.
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
AC_DEFUN([gl_FUNC_FTELLO],
|
|
Packit |
8f70b4 |
[
|
|
Packit |
8f70b4 |
AC_REQUIRE([gl_STDIO_H_DEFAULTS])
|
|
Packit |
8f70b4 |
AC_REQUIRE([AC_PROG_CC])
|
|
Packit |
8f70b4 |
AC_REQUIRE([gl_STDIN_LARGE_OFFSET])
|
|
Packit |
8f70b4 |
AC_REQUIRE([gl_SYS_TYPES_H])
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
dnl Persuade glibc <stdio.h> to declare ftello().
|
|
Packit |
8f70b4 |
AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
AC_CHECK_DECLS_ONCE([ftello])
|
|
Packit |
8f70b4 |
if test $ac_cv_have_decl_ftello = no; then
|
|
Packit |
8f70b4 |
HAVE_DECL_FTELLO=0
|
|
Packit |
8f70b4 |
fi
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
AC_CACHE_CHECK([for ftello], [gl_cv_func_ftello],
|
|
Packit |
8f70b4 |
[
|
|
Packit |
8f70b4 |
AC_LINK_IFELSE(
|
|
Packit |
8f70b4 |
[AC_LANG_PROGRAM(
|
|
Packit |
8f70b4 |
[[#include <stdio.h>]],
|
|
Packit |
8f70b4 |
[[ftello (stdin);]])],
|
|
Packit |
8f70b4 |
[gl_cv_func_ftello=yes],
|
|
Packit |
8f70b4 |
[gl_cv_func_ftello=no])
|
|
Packit |
8f70b4 |
])
|
|
Packit |
8f70b4 |
if test $gl_cv_func_ftello = no; then
|
|
Packit |
8f70b4 |
HAVE_FTELLO=0
|
|
Packit |
8f70b4 |
else
|
|
Packit |
8f70b4 |
if test $WINDOWS_64_BIT_OFF_T = 1; then
|
|
Packit |
8f70b4 |
REPLACE_FTELLO=1
|
|
Packit |
8f70b4 |
fi
|
|
Packit |
8f70b4 |
if test $gl_cv_var_stdin_large_offset = no; then
|
|
Packit |
8f70b4 |
REPLACE_FTELLO=1
|
|
Packit |
8f70b4 |
fi
|
|
Packit |
8f70b4 |
if test $REPLACE_FTELLO = 0; then
|
|
Packit |
8f70b4 |
dnl Detect bug on Solaris.
|
|
Packit |
8f70b4 |
dnl ftell and ftello produce incorrect results after putc that followed a
|
|
Packit |
8f70b4 |
dnl getc call that reached EOF on Solaris. This is because the _IOREAD
|
|
Packit |
8f70b4 |
dnl flag does not get cleared in this case, even though _IOWRT gets set,
|
|
Packit |
8f70b4 |
dnl and ftell and ftello look whether the _IOREAD flag is set.
|
|
Packit |
8f70b4 |
AC_REQUIRE([AC_CANONICAL_HOST])
|
|
Packit |
8f70b4 |
AC_CACHE_CHECK([whether ftello works],
|
|
Packit |
8f70b4 |
[gl_cv_func_ftello_works],
|
|
Packit |
8f70b4 |
[
|
|
Packit |
8f70b4 |
dnl Initial guess, used when cross-compiling or when /dev/tty cannot
|
|
Packit |
8f70b4 |
dnl be opened.
|
|
Packit |
8f70b4 |
changequote(,)dnl
|
|
Packit |
8f70b4 |
case "$host_os" in
|
|
Packit |
8f70b4 |
# Guess no on Solaris.
|
|
Packit |
8f70b4 |
solaris*) gl_cv_func_ftello_works="guessing no" ;;
|
|
Packit |
8f70b4 |
# Guess yes on native Windows.
|
|
Packit |
8f70b4 |
mingw*) gl_cv_func_ftello_works="guessing yes" ;;
|
|
Packit |
8f70b4 |
# Guess yes otherwise.
|
|
Packit |
8f70b4 |
*) gl_cv_func_ftello_works="guessing yes" ;;
|
|
Packit |
8f70b4 |
esac
|
|
Packit |
8f70b4 |
changequote([,])dnl
|
|
Packit |
8f70b4 |
AC_RUN_IFELSE(
|
|
Packit |
8f70b4 |
[AC_LANG_SOURCE([[
|
|
Packit |
8f70b4 |
#include <stdio.h>
|
|
Packit |
8f70b4 |
#include <stdlib.h>
|
|
Packit |
8f70b4 |
#include <string.h>
|
|
Packit |
8f70b4 |
#define TESTFILE "conftest.tmp"
|
|
Packit |
8f70b4 |
int
|
|
Packit |
8f70b4 |
main (void)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
FILE *fp;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
/* Create a file with some contents. */
|
|
Packit |
8f70b4 |
fp = fopen (TESTFILE, "w");
|
|
Packit |
8f70b4 |
if (fp == NULL)
|
|
Packit |
8f70b4 |
return 70;
|
|
Packit |
8f70b4 |
if (fwrite ("foogarsh", 1, 8, fp) < 8)
|
|
Packit |
8f70b4 |
{ fclose (fp); return 71; }
|
|
Packit |
8f70b4 |
if (fclose (fp))
|
|
Packit |
8f70b4 |
return 72;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
/* The file's contents is now "foogarsh". */
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
/* Try writing after reading to EOF. */
|
|
Packit |
8f70b4 |
fp = fopen (TESTFILE, "r+");
|
|
Packit |
8f70b4 |
if (fp == NULL)
|
|
Packit |
8f70b4 |
return 73;
|
|
Packit |
8f70b4 |
if (fseek (fp, -1, SEEK_END))
|
|
Packit |
8f70b4 |
{ fclose (fp); return 74; }
|
|
Packit |
8f70b4 |
if (!(getc (fp) == 'h'))
|
|
Packit |
8f70b4 |
{ fclose (fp); return 1; }
|
|
Packit |
8f70b4 |
if (!(getc (fp) == EOF))
|
|
Packit |
8f70b4 |
{ fclose (fp); return 2; }
|
|
Packit |
8f70b4 |
if (!(ftell (fp) == 8))
|
|
Packit |
8f70b4 |
{ fclose (fp); return 3; }
|
|
Packit |
8f70b4 |
if (!(ftell (fp) == 8))
|
|
Packit |
8f70b4 |
{ fclose (fp); return 4; }
|
|
Packit |
8f70b4 |
if (!(putc ('!', fp) == '!'))
|
|
Packit |
8f70b4 |
{ fclose (fp); return 5; }
|
|
Packit |
8f70b4 |
if (!(ftell (fp) == 9))
|
|
Packit |
8f70b4 |
{ fclose (fp); return 6; }
|
|
Packit |
8f70b4 |
if (!(fclose (fp) == 0))
|
|
Packit |
8f70b4 |
return 7;
|
|
Packit |
8f70b4 |
fp = fopen (TESTFILE, "r");
|
|
Packit |
8f70b4 |
if (fp == NULL)
|
|
Packit |
8f70b4 |
return 75;
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
char buf[10];
|
|
Packit |
8f70b4 |
if (!(fread (buf, 1, 10, fp) == 9))
|
|
Packit |
8f70b4 |
{ fclose (fp); return 10; }
|
|
Packit |
8f70b4 |
if (!(memcmp (buf, "foogarsh!", 9) == 0))
|
|
Packit |
8f70b4 |
{ fclose (fp); return 11; }
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
if (!(fclose (fp) == 0))
|
|
Packit |
8f70b4 |
return 12;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
/* The file's contents is now "foogarsh!". */
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
return 0;
|
|
Packit |
8f70b4 |
}]])],
|
|
Packit |
8f70b4 |
[gl_cv_func_ftello_works=yes],
|
|
Packit |
8f70b4 |
[gl_cv_func_ftello_works=no], [:])
|
|
Packit |
8f70b4 |
])
|
|
Packit |
8f70b4 |
case "$gl_cv_func_ftello_works" in
|
|
Packit |
8f70b4 |
*yes) ;;
|
|
Packit |
8f70b4 |
*)
|
|
Packit |
8f70b4 |
REPLACE_FTELLO=1
|
|
Packit |
8f70b4 |
AC_DEFINE([FTELLO_BROKEN_AFTER_SWITCHING_FROM_READ_TO_WRITE], [1],
|
|
Packit |
8f70b4 |
[Define to 1 if the system's ftello function has the Solaris bug.])
|
|
Packit |
8f70b4 |
;;
|
|
Packit |
8f70b4 |
esac
|
|
Packit |
8f70b4 |
fi
|
|
Packit |
8f70b4 |
fi
|
|
Packit |
8f70b4 |
])
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
# Prerequisites of lib/ftello.c.
|
|
Packit |
8f70b4 |
AC_DEFUN([gl_PREREQ_FTELLO],
|
|
Packit |
8f70b4 |
[
|
|
Packit |
8f70b4 |
dnl Native Windows has the function _ftelli64. mingw hides it, but mingw64
|
|
Packit |
8f70b4 |
dnl makes it usable again.
|
|
Packit |
8f70b4 |
AC_CHECK_FUNCS([_ftelli64])
|
|
Packit |
8f70b4 |
])
|