Line | Source | Count |
1 | | - |
2 | | - |
3 | | - |
4 | | - |
5 | | - |
6 | | - |
7 | | - |
8 | | - |
9 | | - |
10 | | - |
11 | | - |
12 | | - |
13 | | - |
14 | | - |
15 | | - |
16 | | - |
17 | #include <config.h> | - |
18 | | - |
19 | | - |
20 | #include "freadseek.h" | - |
21 | | - |
22 | #include <stdlib.h> | - |
23 | #include <unistd.h> | - |
24 | | - |
25 | #include "freadahead.h" | - |
26 | #include "freadptr.h" | - |
27 | | - |
28 | #include "stdio-impl.h" | - |
29 | | - |
30 | | - |
31 | | - |
32 | | - |
33 | static void | - |
34 | freadptrinc (FILE *fp, size_t increment) | - |
35 | { | - |
36 | | - |
37 | #if HAVE___FREADPTRINC /* musl libc */ | - |
38 | __freadptrinc (fp, increment); | - |
39 | #elif defined _IO_EOF_SEEN || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */ | - |
40 | fp->_IO_read_ptr += increment; | - |
41 | #elif defined __sferror || defined __DragonFly__ || defined __ANDROID__ | - |
42 | | - |
43 | fp_->_p += increment; | - |
44 | fp_->_r -= increment; | - |
45 | #elif defined __EMX__ /* emx+gcc */ | - |
46 | fp->_ptr += increment; | - |
47 | fp->_rcount -= increment; | - |
48 | #elif defined __minix /* Minix */ | - |
49 | fp_->_ptr += increment; | - |
50 | fp_->_count -= increment; | - |
51 | #elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel, OpenVMS */ | - |
52 | fp_->_ptr += increment; | - |
53 | fp_->_cnt -= increment; | - |
54 | #elif defined __UCLIBC__ /* uClibc */ | - |
55 | # ifdef __STDIO_BUFFERS | - |
56 | fp->__bufpos += increment; | - |
57 | # else | - |
58 | abort (); | - |
59 | # endif | - |
60 | #elif defined __QNX__ /* QNX */ | - |
61 | fp->_Next += increment; | - |
62 | #elif defined __MINT__ /* Atari FreeMiNT */ | - |
63 | fp->__bufp += increment; | - |
64 | #elif defined EPLAN9 /* Plan9 */ | - |
65 | fp->rp += increment; | - |
66 | #elif defined SLOW_BUT_NO_HACKS /* users can define this */ | - |
67 | #else | - |
68 | #error "Please port gnulib freadseek.c to your platform! Look at the definition of getc, getc_unlocked on your system, then report this to bug-gnulib." | - |
69 | #endif | - |
70 | }executed 110 times by 1 test: end of block | 110 |
71 | | - |
72 | int | - |
73 | freadseek (FILE *fp, size_t offset) | - |
74 | { | - |
75 | size_t total_buffered; | - |
76 | int fd; | - |
77 | | - |
78 | if (offset == 0)TRUE | never evaluated | FALSE | evaluated 110 times by 1 test |
| 0-110 |
79 | return 0; never executed: return 0; | 0 |
80 | | - |
81 | | - |
82 | | - |
83 | total_buffered = freadahead (fp); | - |
84 | | - |
85 | | - |
86 | while (total_buffered > 0)TRUE | evaluated 110 times by 1 test | FALSE | never evaluated |
| 0-110 |
87 | { | - |
88 | size_t buffered; | - |
89 | | - |
90 | if (freadptr (fp, &buffered) != NULL && buffered > 0)TRUE | evaluated 110 times by 1 test | FALSE | never evaluated |
TRUE | evaluated 110 times by 1 test | FALSE | never evaluated |
| 0-110 |
91 | { | - |
92 | size_t increment = (buffered < offset ? buffered : offset);TRUE | never evaluated | FALSE | evaluated 110 times by 1 test |
| 0-110 |
93 | | - |
94 | freadptrinc (fp, increment); | - |
95 | offset -= increment; | - |
96 | if (offset == 0)TRUE | evaluated 110 times by 1 test | FALSE | never evaluated |
| 0-110 |
97 | return 0;executed 110 times by 1 test: return 0; | 110 |
98 | total_buffered -= increment; | - |
99 | if (total_buffered == 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
100 | break; never executed: break; | 0 |
101 | } never executed: end of block | 0 |
102 | | - |
103 | | - |
104 | if (fgetc (fp) == EOF)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
105 | goto eof; never executed: goto eof; | 0 |
106 | offset--; | - |
107 | if (offset == 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
108 | return 0; never executed: return 0; | 0 |
109 | total_buffered--; | - |
110 | } never executed: end of block | 0 |
111 | | - |
112 | | - |
113 | fd = fileno (fp); | - |
114 | if (fd >= 0 && lseek (fd, 0, SEEK_CUR) >= 0)TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
115 | { | - |
116 | | - |
117 | return fseeko (fp, offset, SEEK_CUR); never executed: return rpl_fseeko (fp, offset, 1 ); | 0 |
118 | } | - |
119 | else | - |
120 | { | - |
121 | | - |
122 | | - |
123 | char buf[4096]; | - |
124 | | - |
125 | do | - |
126 | { | - |
127 | size_t count = (sizeof (buf) < offset ? sizeof (buf) : offset);TRUE | never evaluated | FALSE | never evaluated |
| 0 |
128 | if (fread (buf, 1, count, fp) < count)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
129 | goto eof; never executed: goto eof; | 0 |
130 | offset -= count; | - |
131 | } never executed: end of block | 0 |
132 | while (offset > 0);TRUE | never evaluated | FALSE | never evaluated |
| 0 |
133 | | - |
134 | return 0; never executed: return 0; | 0 |
135 | } | - |
136 | | - |
137 | eof: | - |
138 | | - |
139 | if (ferror (fp))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
140 | return EOF; never executed: return (-1) ; | 0 |
141 | else | - |
142 | | - |
143 | return 0; never executed: return 0; | 0 |
144 | } | - |
| | |