Blame m4/ftello.m4

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
])