Merge commit '12319ff4e84ca616a671216d991dd6eaf1c39c47' into stable
[gnulib.git] / tests / test-ftell.c
1 /* Test of ftell() function.
2    Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
16
17 /* Written by Bruno Haible <bruno@clisp.org>, 2007.  */
18
19 #include <config.h>
20
21 #include <stdio.h>
22
23 #include "signature.h"
24 SIGNATURE_CHECK (ftell, long, (FILE *));
25
26 #include "binary-io.h"
27 #include "macros.h"
28
29 /* None of the files accessed by this test are large, so disable the
30    fseek link warning if we are not using the gnulib fseek module.  */
31 #if !GNULIB_FSEEK
32 # undef fseek
33 #endif
34
35 #ifndef FUNC_UNGETC_BROKEN
36 # define FUNC_UNGETC_BROKEN 0
37 #endif
38
39 int
40 main (int argc, char **argv)
41 {
42   int ch;
43   /* Assume stdin is seekable iff argc > 1.  */
44   if (argc == 1)
45     {
46       ASSERT (ftell (stdin) == -1);
47       return 0;
48     }
49
50   /* mingw ftell is unreliable on text mode input.  */
51   SET_BINARY (0);
52
53   /* Simple tests.  */
54   ASSERT (ftell (stdin) == 0);
55
56   ch = fgetc (stdin);
57   ASSERT (ch == '#');
58   ASSERT (ftell (stdin) == 1);
59
60   /* Test ftell after ungetc of read input.  */
61   ch = ungetc ('#', stdin);
62   ASSERT (ch == '#');
63   ASSERT (ftell (stdin) == 0);
64
65   ch = fgetc (stdin);
66   ASSERT (ch == '#');
67   ASSERT (ftell (stdin) == 1);
68
69   /* Test ftell after fseek.  */
70   ASSERT (fseek (stdin, 2, SEEK_SET) == 0);
71   ASSERT (ftell (stdin) == 2);
72
73   /* Test ftell after random ungetc.  */
74   ch = fgetc (stdin);
75   ASSERT (ch == '/');
76   ch = ungetc ('@', stdin);
77   ASSERT (ch == '@');
78   ASSERT (ftell (stdin) == 2);
79
80   ch = fgetc (stdin);
81   ASSERT (ch == '@');
82   ASSERT (ftell (stdin) == 3);
83
84   if (2 < argc)
85     {
86       if (FUNC_UNGETC_BROKEN)
87         {
88           fputs ("Skipping test: ungetc cannot handle arbitrary bytes\n",
89                  stderr);
90           return 77;
91         }
92       /* Test ftell after ungetc without read.  */
93       ASSERT (fseek (stdin, 0, SEEK_CUR) == 0);
94       ASSERT (ftell (stdin) == 3);
95
96       ch = ungetc ('~', stdin);
97       ASSERT (ch == '~');
98       ASSERT (ftell (stdin) == 2);
99     }
100
101 #if !defined __MINT__ /* FreeMiNT has problems seeking past end of file */
102   /* Test ftell beyond end of file.  */
103   ASSERT (fseek (stdin, 0, SEEK_END) == 0);
104   ch = ftell (stdin);
105   ASSERT (fseek (stdin, 10, SEEK_END) == 0);
106   ASSERT (ftell (stdin) == ch + 10);
107 #endif
108
109   return 0;
110 }