blob: 641344745457b4660950911a28d5d19d32765381 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
#include <ansi_files.h>
#include <errno.h>
inline fpos_t _ftell(FILE* file) {
int charsInUndoBuffer = 0;
fpos_t position;
unsigned char tmp_kind = file->mode.file_kind;
if (!(tmp_kind == __disk_file || tmp_kind == __console_file) || file->state.error) {
errno = EFPOS;
return (-1L);
}
if (file->state.io_state == __neutral)
return (file->position);
position = file->buffer_pos + (file->buffer_ptr - file->buffer);
if (file->state.io_state >= __rereading) {
charsInUndoBuffer = file->state.io_state - __rereading + 1;
position -= charsInUndoBuffer;
}
return (position);
}
long ftell(FILE* file) {
long retval;
retval = (long)_ftell(file);
return retval;
}
int _fseek(FILE* file, fpos_t offset, int mode) {
fpos_t position;
__pos_proc pos_proc;
unsigned char tmp_kind = file->mode.file_kind;
if (!(tmp_kind == __disk_file) || file->state.error) {
errno = EFPOS;
return (-1);
}
if (file->state.io_state == __writing) {
if (__flush_buffer(file, NULL) != __no_io_error) {
set_error(file);
errno = EFPOS;
return (-1);
}
}
if (mode == SEEK_CUR) {
mode = SEEK_SET;
if ((position = _ftell(file)) < 0)
position = 0;
offset += position;
}
if ((mode != SEEK_END) && (file->mode.io_mode != __read_write) &&
((file->state.io_state == __reading) || (file->state.io_state == __rereading))) {
if ((offset >= file->position) || offset < file->buffer_pos) {
file->state.io_state = __neutral;
} else {
file->buffer_ptr = file->buffer + (offset - file->buffer_pos);
file->buffer_len = file->position - offset;
file->state.io_state = __reading;
}
} else {
file->state.io_state = __neutral;
}
if (file->state.io_state == __neutral) {
if ((pos_proc = file->position_proc) != 0 &&
(*pos_proc)(file->handle, &offset, mode, file->idle_proc)) {
set_error(file);
errno = EFPOS;
return (-1);
}
file->state.eof = 0;
file->position = offset;
file->buffer_len = 0;
}
return 0;
}
int fseek(FILE * file, long offset, int mode)
{
fpos_t real_offset = (fpos_t)offset;
int retval;
retval = _fseek(file, real_offset, mode);
return(retval);
}
|