Skip to content

Commit ae4cd37

Browse files
committed
implemented scanfunc and fromstr arrayfunc
1 parent 7cff6f3 commit ae4cd37

File tree

1 file changed

+77
-0
lines changed
  • quaddtype/numpy_quaddtype/src

1 file changed

+77
-0
lines changed

quaddtype/numpy_quaddtype/src/dtype.c

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
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+
322397
static 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

334411
static PyObject *

0 commit comments

Comments
 (0)