@@ -229,9 +229,9 @@ cdef extern from "parser/tokenizer.h":
229229 int64_t skip_first_N_rows
230230 int64_t skipfooter
231231 # pick one, depending on whether the converter requires GIL
232- float64_t (* double_converter)(const char * , char ** ,
233- char , char , char ,
234- int , int * , int * ) nogil
232+ double (* double_converter)(const char * , char ** ,
233+ char , char , char ,
234+ int , int * , int * ) nogil
235235
236236 # error handling
237237 char * warn_msg
@@ -249,6 +249,16 @@ cdef extern from "parser/tokenizer.h":
249249 int seen_uint
250250 int seen_null
251251
252+ void COLITER_NEXT(coliter_t, const char * ) nogil
253+
254+ cdef extern from " pd_parser.h" :
255+ void * new_rd_source(object obj) except NULL
256+
257+ int del_rd_source(void * src)
258+
259+ void * buffer_rd_bytes(void * source, size_t nbytes,
260+ size_t * bytes_read, int * status, const char * encoding_errors)
261+
252262 void uint_state_init(uint_state * self )
253263 int uint64_conflict(uint_state * self )
254264
@@ -279,26 +289,49 @@ cdef extern from "parser/tokenizer.h":
279289 uint64_t str_to_uint64(uint_state * state, char * p_item, int64_t int_max,
280290 uint64_t uint_max, int * error, char tsep) nogil
281291
282- float64_t xstrtod(const char * p, char ** q, char decimal,
292+ double xstrtod(const char * p, char ** q, char decimal,
293+ char sci, char tsep, int skip_trailing,
294+ int * error, int * maybe_int) nogil
295+ double precise_xstrtod(const char * p, char ** q, char decimal,
296+ char sci, char tsep, int skip_trailing,
297+ int * error, int * maybe_int) nogil
298+ double round_trip(const char * p, char ** q, char decimal,
283299 char sci, char tsep, int skip_trailing,
284300 int * error, int * maybe_int) nogil
285- float64_t precise_xstrtod(const char * p, char ** q, char decimal,
286- char sci, char tsep, int skip_trailing,
287- int * error, int * maybe_int) nogil
288- float64_t round_trip(const char * p, char ** q, char decimal,
289- char sci, char tsep, int skip_trailing,
290- int * error, int * maybe_int) nogil
291301
292302 int to_boolean(const char * item, uint8_t * val) nogil
293303
304+ void PandasParser_IMPORT()
294305
295- cdef extern from " parser/io.h" :
296- void * new_rd_source(object obj) except NULL
306+ PandasParser_IMPORT
297307
298- int del_rd_source(void * src)
308+ # When not invoked directly but rather assigned as a function,
309+ # cdef extern'ed declarations seem to leave behind an undefined symbol
310+ cdef double xstrtod_wrapper(const char * p, char ** q, char decimal,
311+ char sci, char tsep, int skip_trailing,
312+ int * error, int * maybe_int) nogil:
313+ return xstrtod(p, q, decimal, sci, tsep, skip_trailing, error, maybe_int)
299314
300- void * buffer_rd_bytes(void * source, size_t nbytes,
301- size_t * bytes_read, int * status, const char * encoding_errors)
315+
316+ cdef double precise_xstrtod_wrapper(const char * p, char ** q, char decimal,
317+ char sci, char tsep, int skip_trailing,
318+ int * error, int * maybe_int) nogil:
319+ return precise_xstrtod(p, q, decimal, sci, tsep, skip_trailing, error, maybe_int)
320+
321+
322+ cdef double round_trip_wrapper(const char * p, char ** q, char decimal,
323+ char sci, char tsep, int skip_trailing,
324+ int * error, int * maybe_int) nogil:
325+ return round_trip(p, q, decimal, sci, tsep, skip_trailing, error, maybe_int)
326+
327+
328+ cdef void * buffer_rd_bytes_wrapper(void * source, size_t nbytes,
329+ size_t * bytes_read, int * status,
330+ const char * encoding_errors) noexcept:
331+ return buffer_rd_bytes(source, nbytes, bytes_read, status, encoding_errors)
332+
333+ cdef int del_rd_source_wrapper(void * src) noexcept:
334+ return del_rd_source(src)
302335
303336
304337cdef class TextReader:
@@ -487,11 +520,11 @@ cdef class TextReader:
487520
488521 if float_precision == " round_trip" :
489522 # see gh-15140
490- self .parser.double_converter = round_trip
523+ self .parser.double_converter = round_trip_wrapper
491524 elif float_precision == " legacy" :
492- self .parser.double_converter = xstrtod
525+ self .parser.double_converter = xstrtod_wrapper
493526 elif float_precision == " high" or float_precision is None :
494- self .parser.double_converter = precise_xstrtod
527+ self .parser.double_converter = precise_xstrtod_wrapper
495528 else :
496529 raise ValueError (f" Unrecognized float_precision option: "
497530 f" {float_precision}" )
@@ -610,8 +643,8 @@ cdef class TextReader:
610643
611644 ptr = new_rd_source(source)
612645 self .parser.source = ptr
613- self .parser.cb_io = & buffer_rd_bytes
614- self .parser.cb_cleanup = & del_rd_source
646+ self .parser.cb_io = buffer_rd_bytes_wrapper
647+ self .parser.cb_cleanup = del_rd_source_wrapper
615648
616649 cdef _get_header(self , list prelim_header):
617650 # header is now a list of lists, so field_count should use header[0]
0 commit comments