11#include <Python.h>
22#include <sleef.h>
33#include <sleefquad.h>
4+ #include <ctype.h>
45
56#define PY_ARRAY_UNIQUE_SYMBOL QuadPrecType_ARRAY_API
67#define PY_UFUNC_UNIQUE_SYMBOL QuadPrecType_UFUNC_API
@@ -319,6 +320,80 @@ quadprec_fill(void *buffer, npy_intp length, void *arr_)
319320 return 0 ;
320321}
321322
323+ static int
324+ quadprec_scanfunc (FILE * fp , void * dptr , char * ignore , PyArray_Descr * descr_generic )
325+ {
326+ QuadPrecDTypeObject * descr = (QuadPrecDTypeObject * )descr_generic ;
327+ char buffer [512 ];
328+ int ch ;
329+ size_t i = 0 ;
330+
331+ /* Skip whitespace */
332+ while ((ch = fgetc (fp )) != EOF && isspace (ch )) {
333+ /* continue */
334+ }
335+
336+ if (ch == EOF ) {
337+ return EOF ; /* Return EOF when end of file is reached */
338+ }
339+
340+ /* Read characters until we hit whitespace or EOF */
341+ buffer [i ++ ] = (char )ch ;
342+ while (i < sizeof (buffer ) - 1 ) {
343+ ch = fgetc (fp );
344+ if (ch == EOF || isspace (ch )) {
345+ if (ch != EOF ) {
346+ ungetc (ch , fp ); /* Put back the whitespace for separator handling */
347+ }
348+ break ;
349+ }
350+ buffer [i ++ ] = (char )ch ;
351+ }
352+ buffer [i ] = '\0' ;
353+
354+ /* Convert string to quad precision */
355+ char * endptr ;
356+ if (descr -> backend == BACKEND_SLEEF ) {
357+ Sleef_quad val = Sleef_strtoq (buffer , & endptr );
358+ if (endptr == buffer ) {
359+ return 0 ; /* Return 0 on parse error (no items read) */
360+ }
361+ * (Sleef_quad * )dptr = val ;
362+ }
363+ else {
364+ long double val = strtold (buffer , & endptr );
365+ if (endptr == buffer ) {
366+ return 0 ; /* Return 0 on parse error (no items read) */
367+ }
368+ * (long double * )dptr = val ;
369+ }
370+
371+ return 1 ; /* Return 1 on success (1 item read) */
372+ }
373+
374+ static int
375+ quadprec_fromstr (char * s , void * dptr , char * * endptr , PyArray_Descr * descr_generic )
376+ {
377+ QuadPrecDTypeObject * descr = (QuadPrecDTypeObject * )descr_generic ;
378+
379+ if (descr -> backend == BACKEND_SLEEF ) {
380+ Sleef_quad val = Sleef_strtoq (s , endptr );
381+ if (* endptr == s ) {
382+ return -1 ;
383+ }
384+ * (Sleef_quad * )dptr = val ;
385+ }
386+ else {
387+ long double val = strtold (s , endptr );
388+ if (* endptr == s ) {
389+ return -1 ;
390+ }
391+ * (long double * )dptr = val ;
392+ }
393+
394+ return 0 ;
395+ }
396+
322397static PyType_Slot QuadPrecDType_Slots [] = {
323398 {NPY_DT_ensure_canonical , & ensure_canonical },
324399 {NPY_DT_common_instance , & common_instance },
@@ -329,6 +404,8 @@ static PyType_Slot QuadPrecDType_Slots[] = {
329404 {NPY_DT_default_descr , & quadprec_default_descr },
330405 {NPY_DT_get_constant , & quadprec_get_constant },
331406 {NPY_DT_PyArray_ArrFuncs_fill , & quadprec_fill },
407+ {NPY_DT_PyArray_ArrFuncs_scanfunc , & quadprec_scanfunc },
408+ {NPY_DT_PyArray_ArrFuncs_fromstr , & quadprec_fromstr },
332409 {0 , NULL }};
333410
334411static PyObject *
0 commit comments