1# ftello.m4 serial 11
2dnl Copyright (C) 2007-2015 Free Software Foundation, Inc.
3dnl This file is free software; the Free Software Foundation
4dnl gives unlimited permission to copy and/or distribute it,
5dnl with or without modifications, as long as this notice is preserved.
6
7AC_DEFUN([gl_FUNC_FTELLO],
8[
9  AC_REQUIRE([gl_STDIO_H_DEFAULTS])
10  AC_REQUIRE([AC_PROG_CC])
11  AC_REQUIRE([gl_STDIN_LARGE_OFFSET])
12  AC_REQUIRE([gl_SYS_TYPES_H])
13
14  dnl Persuade glibc <stdio.h> to declare ftello().
15  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
16
17  AC_CHECK_DECLS_ONCE([ftello])
18  if test $ac_cv_have_decl_ftello = no; then
19    HAVE_DECL_FTELLO=0
20  fi
21
22  AC_CACHE_CHECK([for ftello], [gl_cv_func_ftello],
23    [
24      AC_LINK_IFELSE(
25        [AC_LANG_PROGRAM(
26           [[#include <stdio.h>]],
27           [[ftello (stdin);]])],
28        [gl_cv_func_ftello=yes],
29        [gl_cv_func_ftello=no])
30    ])
31  if test $gl_cv_func_ftello = no; then
32    HAVE_FTELLO=0
33  else
34    if test $WINDOWS_64_BIT_OFF_T = 1; then
35      REPLACE_FTELLO=1
36    fi
37    if test $gl_cv_var_stdin_large_offset = no; then
38      REPLACE_FTELLO=1
39    fi
40    if test $REPLACE_FTELLO = 0; then
41      dnl Detect bug on Solaris.
42      dnl ftell and ftello produce incorrect results after putc that followed a
43      dnl getc call that reached EOF on Solaris. This is because the _IOREAD
44      dnl flag does not get cleared in this case, even though _IOWRT gets set,
45      dnl and ftell and ftello look whether the _IOREAD flag is set.
46      AC_REQUIRE([AC_CANONICAL_HOST])
47      AC_CACHE_CHECK([whether ftello works],
48        [gl_cv_func_ftello_works],
49        [
50          dnl Initial guess, used when cross-compiling or when /dev/tty cannot
51          dnl be opened.
52changequote(,)dnl
53          case "$host_os" in
54                      # Guess no on Solaris.
55            solaris*) gl_cv_func_ftello_works="guessing no" ;;
56                      # Guess yes otherwise.
57            *)        gl_cv_func_ftello_works="guessing yes" ;;
58          esac
59changequote([,])dnl
60          AC_RUN_IFELSE(
61            [AC_LANG_SOURCE([[
62#include <stdio.h>
63#include <stdlib.h>
64#include <string.h>
65#define TESTFILE "conftest.tmp"
66int
67main (void)
68{
69  FILE *fp;
70
71  /* Create a file with some contents.  */
72  fp = fopen (TESTFILE, "w");
73  if (fp == NULL)
74    return 70;
75  if (fwrite ("foogarsh", 1, 8, fp) < 8)
76    return 71;
77  if (fclose (fp))
78    return 72;
79
80  /* The file's contents is now "foogarsh".  */
81
82  /* Try writing after reading to EOF.  */
83  fp = fopen (TESTFILE, "r+");
84  if (fp == NULL)
85    return 73;
86  if (fseek (fp, -1, SEEK_END))
87    return 74;
88  if (!(getc (fp) == 'h'))
89    return 1;
90  if (!(getc (fp) == EOF))
91    return 2;
92  if (!(ftell (fp) == 8))
93    return 3;
94  if (!(ftell (fp) == 8))
95    return 4;
96  if (!(putc ('!', fp) == '!'))
97    return 5;
98  if (!(ftell (fp) == 9))
99    return 6;
100  if (!(fclose (fp) == 0))
101    return 7;
102  fp = fopen (TESTFILE, "r");
103  if (fp == NULL)
104    return 75;
105  {
106    char buf[10];
107    if (!(fread (buf, 1, 10, fp) == 9))
108      return 10;
109    if (!(memcmp (buf, "foogarsh!", 9) == 0))
110      return 11;
111  }
112  if (!(fclose (fp) == 0))
113    return 12;
114
115  /* The file's contents is now "foogarsh!".  */
116
117  return 0;
118}]])],
119            [gl_cv_func_ftello_works=yes],
120            [gl_cv_func_ftello_works=no], [:])
121        ])
122      case "$gl_cv_func_ftello_works" in
123        *yes) ;;
124        *)
125          REPLACE_FTELLO=1
126          AC_DEFINE([FTELLO_BROKEN_AFTER_SWITCHING_FROM_READ_TO_WRITE], [1],
127            [Define to 1 if the system's ftello function has the Solaris bug.])
128          ;;
129      esac
130    fi
131  fi
132])
133
134# Prerequisites of lib/ftello.c.
135AC_DEFUN([gl_PREREQ_FTELLO],
136[
137  dnl Native Windows has the function _ftelli64. mingw hides it, but mingw64
138  dnl makes it usable again.
139  AC_CHECK_FUNCS([_ftelli64])
140])
141