1
- #include "io.h"
1
+ /*
2
+ Copyright (c) 2016, PyData Development Team
3
+ All rights reserved.
4
+
5
+ Distributed under the terms of the BSD Simplified License.
6
+
7
+ The full license is in the LICENSE file, distributed with this software.
8
+ */
2
9
3
- /*
4
- On-disk FILE, uncompressed
5
- */
10
+ #include "io.h"
6
11
12
+ /*
13
+ On-disk FILE, uncompressed
14
+ */
7
15
8
16
void * new_file_source (char * fname , size_t buffer_size ) {
9
- file_source * fs = (file_source * ) malloc (sizeof (file_source ));
17
+ file_source * fs = (file_source * )malloc (sizeof (file_source ));
10
18
fs -> fp = fopen (fname , "rb" );
11
19
12
20
if (fs -> fp == NULL ) {
@@ -18,7 +26,7 @@ void *new_file_source(char *fname, size_t buffer_size) {
18
26
fs -> initial_file_pos = ftell (fs -> fp );
19
27
20
28
// Only allocate this heap memory if we are not memory-mapping the file
21
- fs -> buffer = (char * ) malloc ((buffer_size + 1 ) * sizeof (char ));
29
+ fs -> buffer = (char * ) malloc ((buffer_size + 1 ) * sizeof (char ));
22
30
23
31
if (fs -> buffer == NULL ) {
24
32
return NULL ;
@@ -27,33 +35,19 @@ void *new_file_source(char *fname, size_t buffer_size) {
27
35
memset (fs -> buffer , 0 , buffer_size + 1 );
28
36
fs -> buffer [buffer_size ] = '\0' ;
29
37
30
- return (void * ) fs ;
38
+ return (void * )fs ;
31
39
}
32
40
33
-
34
- // XXX handle on systems without the capability
35
-
36
-
37
- /*
38
- * void *new_file_buffer(FILE *f, int buffer_size)
39
- *
40
- * Allocate a new file_buffer.
41
- * Returns NULL if the memory allocation fails or if the call to mmap fails.
42
- *
43
- * buffer_size is ignored.
44
- */
45
-
46
-
47
- void * new_rd_source (PyObject * obj ) {
48
- rd_source * rds = (rd_source * ) malloc (sizeof (rd_source ));
41
+ void * new_rd_source (PyObject * obj ) {
42
+ rd_source * rds = (rd_source * )malloc (sizeof (rd_source ));
49
43
50
44
/* hold on to this object */
51
45
Py_INCREF (obj );
52
46
rds -> obj = obj ;
53
47
rds -> buffer = NULL ;
54
48
rds -> position = 0 ;
55
49
56
- return (void * ) rds ;
50
+ return (void * ) rds ;
57
51
}
58
52
59
53
/*
@@ -63,9 +57,7 @@ void* new_rd_source(PyObject *obj) {
63
57
*/
64
58
65
59
int del_file_source (void * fs ) {
66
- // fseek(FS(fs)->fp, FS(fs)->initial_file_pos, SEEK_SET);
67
- if (fs == NULL )
68
- return 0 ;
60
+ if (fs == NULL ) return 0 ;
69
61
70
62
/* allocated on the heap */
71
63
free (FS (fs )-> buffer );
@@ -89,27 +81,23 @@ int del_rd_source(void *rds) {
89
81
90
82
*/
91
83
92
-
93
- void * buffer_file_bytes (void * source , size_t nbytes ,
94
- size_t * bytes_read , int * status ) {
84
+ void * buffer_file_bytes (void * source , size_t nbytes , size_t * bytes_read ,
85
+ int * status ) {
95
86
file_source * src = FS (source );
96
87
97
- * bytes_read = fread ((void * ) src -> buffer , sizeof (char ), nbytes ,
98
- src -> fp );
88
+ * bytes_read = fread ((void * )src -> buffer , sizeof (char ), nbytes , src -> fp );
99
89
100
90
if (* bytes_read == 0 ) {
101
91
* status = REACHED_EOF ;
102
92
} else {
103
93
* status = 0 ;
104
94
}
105
95
106
- return (void * ) src -> buffer ;
107
-
96
+ return (void * )src -> buffer ;
108
97
}
109
98
110
-
111
- void * buffer_rd_bytes (void * source , size_t nbytes ,
112
- size_t * bytes_read , int * status ) {
99
+ void * buffer_rd_bytes (void * source , size_t nbytes , size_t * bytes_read ,
100
+ int * status ) {
113
101
PyGILState_STATE state ;
114
102
PyObject * result , * func , * args , * tmp ;
115
103
@@ -125,21 +113,18 @@ void* buffer_rd_bytes(void *source, size_t nbytes,
125
113
args = Py_BuildValue ("(i)" , nbytes );
126
114
127
115
func = PyObject_GetAttrString (src -> obj , "read" );
128
- /* printf("%s\n", PyBytes_AsString(PyObject_Repr(func))); */
129
116
130
117
/* TODO: does this release the GIL? */
131
118
result = PyObject_CallObject (func , args );
132
119
Py_XDECREF (args );
133
120
Py_XDECREF (func );
134
121
135
- /* PyObject_Print(PyObject_Type(result), stdout, 0); */
136
122
if (result == NULL ) {
137
123
PyGILState_Release (state );
138
124
* bytes_read = 0 ;
139
125
* status = CALLING_READ_FAILED ;
140
126
return NULL ;
141
- }
142
- else if (!PyBytes_Check (result )) {
127
+ } else if (!PyBytes_Check (result )) {
143
128
tmp = PyUnicode_AsUTF8String (result );
144
129
Py_XDECREF (result );
145
130
result = tmp ;
@@ -154,8 +139,7 @@ void* buffer_rd_bytes(void *source, size_t nbytes,
154
139
155
140
/* hang on to the Python object */
156
141
src -> buffer = result ;
157
- retval = (void * ) PyBytes_AsString (result );
158
-
142
+ retval = (void * )PyBytes_AsString (result );
159
143
160
144
PyGILState_Release (state );
161
145
@@ -165,42 +149,38 @@ void* buffer_rd_bytes(void *source, size_t nbytes,
165
149
return retval ;
166
150
}
167
151
168
-
169
152
#ifdef HAVE_MMAP
170
153
171
- #include <sys/stat.h>
172
154
#include <sys/mman.h>
155
+ #include <sys/stat.h>
173
156
174
- void * new_mmap (char * fname )
175
- {
157
+ void * new_mmap (char * fname ) {
176
158
struct stat buf ;
177
159
int fd ;
178
160
memory_map * mm ;
179
- /* off_t position; */
180
161
off_t filesize ;
181
162
182
- mm = (memory_map * ) malloc (sizeof (memory_map ));
163
+ mm = (memory_map * )malloc (sizeof (memory_map ));
183
164
mm -> fp = fopen (fname , "rb" );
184
165
185
166
fd = fileno (mm -> fp );
186
167
if (fstat (fd , & buf ) == -1 ) {
187
168
fprintf (stderr , "new_file_buffer: fstat() failed. errno =%d\n" , errno );
188
169
return NULL ;
189
170
}
190
- filesize = buf .st_size ; /* XXX This might be 32 bits. */
191
-
171
+ filesize = buf .st_size ; /* XXX This might be 32 bits. */
192
172
193
173
if (mm == NULL ) {
194
174
/* XXX Eventually remove this print statement. */
195
175
fprintf (stderr , "new_file_buffer: malloc() failed.\n" );
196
176
return NULL ;
197
177
}
198
- mm -> size = (off_t ) filesize ;
178
+ mm -> size = (off_t )filesize ;
199
179
mm -> line_number = 0 ;
200
180
201
181
mm -> fileno = fd ;
202
182
mm -> position = ftell (mm -> fp );
203
- mm -> last_pos = (off_t ) filesize ;
183
+ mm -> last_pos = (off_t )filesize ;
204
184
205
185
mm -> memmap = mmap (NULL , filesize , PROT_READ , MAP_SHARED , fd , 0 );
206
186
if (mm -> memmap == NULL ) {
@@ -210,30 +190,20 @@ void *new_mmap(char *fname)
210
190
mm = NULL ;
211
191
}
212
192
213
- return (void * ) mm ;
193
+ return (void * ) mm ;
214
194
}
215
195
216
-
217
- int del_mmap (void * src )
218
- {
196
+ int del_mmap (void * src ) {
219
197
munmap (MM (src )-> memmap , MM (src )-> size );
220
198
221
199
fclose (MM (src )-> fp );
222
-
223
- /*
224
- * With a memory mapped file, there is no need to do
225
- * anything if restore == RESTORE_INITIAL.
226
- */
227
- /* if (restore == RESTORE_FINAL) { */
228
- /* fseek(FB(fb)->file, FB(fb)->current_pos, SEEK_SET); */
229
- /* } */
230
200
free (src );
231
201
232
202
return 0 ;
233
203
}
234
204
235
- void * buffer_mmap_bytes (void * source , size_t nbytes ,
236
- size_t * bytes_read , int * status ) {
205
+ void * buffer_mmap_bytes (void * source , size_t nbytes , size_t * bytes_read ,
206
+ int * status ) {
237
207
void * retval ;
238
208
memory_map * src = MM (source );
239
209
@@ -264,19 +234,15 @@ void* buffer_mmap_bytes(void *source, size_t nbytes,
264
234
265
235
/* kludgy */
266
236
267
- void * new_mmap (char * fname ) {
268
- return NULL ;
269
- }
237
+ void * new_mmap (char * fname ) { return NULL ; }
270
238
271
- int del_mmap (void * src ) {
272
- return 0 ;
273
- }
239
+ int del_mmap (void * src ) { return 0 ; }
274
240
275
241
/* don't use this! */
276
242
277
- void * buffer_mmap_bytes (void * source , size_t nbytes ,
278
- size_t * bytes_read , int * status ) {
279
- return NULL ;
243
+ void * buffer_mmap_bytes (void * source , size_t nbytes , size_t * bytes_read ,
244
+ int * status ) {
245
+ return NULL ;
280
246
}
281
247
282
248
#endif
0 commit comments