~ubuntu-branches/ubuntu/precise/gzip/precise

« back to all changes in this revision

Viewing changes to lib/fseeko.c

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt
  • Date: 2011-10-19 11:42:42 UTC
  • mfrom: (4.1.3 sid)
  • Revision ID: james.westby@ubuntu.com-20111019114242-d8wiiu8kbvdtgmgj
Tags: 1.4-1ubuntu1
* Merge with Debian testing.  Remaining Ubuntu changes:
  - debian/{control,rules}: Remove the Win32 build and mingw64
    build-dependency, since mingw is in universe, and will remain so for
    the forseeable future.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* -*- buffer-read-only: t -*- vi: set ro: */
 
2
/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 
3
/* An fseeko() function that, together with fflush(), is POSIX compliant.
 
4
   Copyright (C) 2007-2010 Free Software Foundation, Inc.
 
5
 
 
6
   This program is free software; you can redistribute it and/or modify
 
7
   it under the terms of the GNU General Public License as published by
 
8
   the Free Software Foundation; either version 3, or (at your option)
 
9
   any later version.
 
10
 
 
11
   This program is distributed in the hope that it will be useful,
 
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
14
   GNU General Public License for more details.
 
15
 
 
16
   You should have received a copy of the GNU General Public License along
 
17
   with this program; if not, write to the Free Software Foundation,
 
18
   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
 
19
 
 
20
#include <config.h>
 
21
 
 
22
/* Specification.  */
 
23
#include <stdio.h>
 
24
 
 
25
/* Get off_t and lseek.  */
 
26
#include <unistd.h>
 
27
 
 
28
#include "stdio-impl.h"
 
29
 
 
30
#undef fseeko
 
31
#if !HAVE_FSEEKO
 
32
# undef fseek
 
33
# define fseeko fseek
 
34
#endif
 
35
 
 
36
int
 
37
rpl_fseeko (FILE *fp, off_t offset, int whence)
 
38
{
 
39
#if LSEEK_PIPE_BROKEN
 
40
  /* mingw gives bogus answers rather than failure on non-seekable files.  */
 
41
  if (lseek (fileno (fp), 0, SEEK_CUR) == -1)
 
42
    return EOF;
 
43
#endif
 
44
 
 
45
  /* These tests are based on fpurge.c.  */
 
46
#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
 
47
  if (fp->_IO_read_end == fp->_IO_read_ptr
 
48
      && fp->_IO_write_ptr == fp->_IO_write_base
 
49
      && fp->_IO_save_base == NULL)
 
50
#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
 
51
# if defined __SL64 && defined __SCLE /* Cygwin */
 
52
  if ((fp->_flags & __SL64) == 0)
 
53
    {
 
54
      /* Cygwin 1.5.0 through 1.5.24 failed to open stdin in 64-bit
 
55
         mode; but has an fseeko that requires 64-bit mode.  */
 
56
      FILE *tmp = fopen ("/dev/null", "r");
 
57
      if (!tmp)
 
58
        return -1;
 
59
      fp->_flags |= __SL64;
 
60
      fp->_seek64 = tmp->_seek64;
 
61
      fclose (tmp);
 
62
    }
 
63
# endif
 
64
  if (fp_->_p == fp_->_bf._base
 
65
      && fp_->_r == 0
 
66
      && fp_->_w == ((fp_->_flags & (__SLBF | __SNBF | __SRD)) == 0 /* fully buffered and not currently reading? */
 
67
                     ? fp_->_bf._size
 
68
                     : 0)
 
69
      && fp_ub._base == NULL)
 
70
#elif defined __EMX__               /* emx+gcc */
 
71
  if (fp->_ptr == fp->_buffer
 
72
      && fp->_rcount == 0
 
73
      && fp->_wcount == 0
 
74
      && fp->_ungetc_count == 0)
 
75
#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
 
76
  if (fp_->_ptr == fp_->_base
 
77
      && (fp_->_ptr == NULL || fp_->_cnt == 0))
 
78
#elif defined __UCLIBC__            /* uClibc */
 
79
  if (((fp->__modeflags & __FLAG_WRITING) == 0
 
80
       || fp->__bufpos == fp->__bufstart)
 
81
      && ((fp->__modeflags & (__FLAG_READONLY | __FLAG_READING)) == 0
 
82
          || fp->__bufpos == fp->__bufread))
 
83
#elif defined __QNX__               /* QNX */
 
84
  if ((fp->_Mode & 0x2000 /* _MWRITE */ ? fp->_Next == fp->_Buf : fp->_Next == fp->_Rend)
 
85
      && fp->_Rback == fp->_Back + sizeof (fp->_Back)
 
86
      && fp->_Rsave == NULL)
 
87
#elif defined __MINT__              /* Atari FreeMiNT */
 
88
  if (fp->__bufp == fp->__buffer
 
89
      && fp->__get_limit == fp->__bufp
 
90
      && fp->__put_limit == fp->__bufp
 
91
      && !fp->__pushed_back)
 
92
#else
 
93
  #error "Please port gnulib fseeko.c to your platform! Look at the code in fpurge.c, then report this to bug-gnulib."
 
94
#endif
 
95
    {
 
96
      /* We get here when an fflush() call immediately preceded this one.  We
 
97
         know there are no buffers.
 
98
         POSIX requires us to modify the file descriptor's position.
 
99
         But we cannot position beyond end of file here.  */
 
100
      off_t pos =
 
101
        lseek (fileno (fp),
 
102
               whence == SEEK_END && offset > 0 ? 0 : offset,
 
103
               whence);
 
104
      if (pos == -1)
 
105
        {
 
106
#if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
 
107
          fp_->_flags &= ~__SOFF;
 
108
#endif
 
109
          return -1;
 
110
        }
 
111
 
 
112
#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
 
113
      fp->_flags &= ~_IO_EOF_SEEN;
 
114
#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
 
115
# if defined __CYGWIN__
 
116
      /* fp_->_offset is typed as an integer.  */
 
117
      fp_->_offset = pos;
 
118
# else
 
119
      /* fp_->_offset is an fpos_t.  */
 
120
      {
 
121
        /* Use a union, since on NetBSD, the compilation flags
 
122
           determine whether fpos_t is typedef'd to off_t or a struct
 
123
           containing a single off_t member.  */
 
124
        union
 
125
          {
 
126
            fpos_t f;
 
127
            off_t o;
 
128
          } u;
 
129
        u.o = pos;
 
130
        fp_->_offset = u.f;
 
131
      }
 
132
# endif
 
133
      fp_->_flags |= __SOFF;
 
134
      fp_->_flags &= ~__SEOF;
 
135
#elif defined __EMX__               /* emx+gcc */
 
136
      fp->_flags &= ~_IOEOF;
 
137
#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */
 
138
      fp->_flag &= ~_IOEOF;
 
139
#elif defined __MINT__              /* Atari FreeMiNT */
 
140
      fp->__offset = pos;
 
141
      fp->__eof = 0;
 
142
#endif
 
143
      /* If we were not requested to position beyond end of file, we're
 
144
         done.  */
 
145
      if (!(whence == SEEK_END && offset > 0))
 
146
        return 0;
 
147
    }
 
148
  return fseeko (fp, offset, whence);
 
149
}