File: gdpy_intern.h

package info (click to toggle)
libgetdata 0.11.0-17
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 13,144 kB
  • sloc: ansic: 100,814; cpp: 4,843; fortran: 4,548; f90: 2,561; python: 2,406; perl: 2,274; makefile: 1,487; php: 1,465; sh: 86
file content (219 lines) | stat: -rw-r--r-- 6,890 bytes parent folder | download | duplicates (5)
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
/* Copyright (C) 2009-2015 D. V. Wiebe
 *
 ***************************************************************************
 *
 * This file is part of the GetData project.
 *
 * GetData is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the
 * Free Software Foundation; either version 2.1 of the License, or (at your
 * option) any later version.
 *
 * GetData is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
 * License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with GetData; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */
#include "../../src/internal.h"

/* Deal with pyconfig.h */
#undef _XOPEN_SOURCE
#undef _BSD_SOURCE
#undef _SVID_SOURCE
#undef _POSIX_C_SOURCE

#include <Python.h>

#ifdef GDPY_INCLUDE_NUMPY
# ifdef HAVE_NUMPY_ARRAYOBJECT_H
#  define PY_ARRAY_UNIQUE_SYMBOL gdpy_array_api
#  include <numpy/arrayobject.h>
# endif
#endif

#define GDPY_UNSIGNED        0x00
#define GDPY_SIGNED          0x01
#define GDPY_IEEE754         0x02
#define GDPY_COMPLEX         0x03

#define GDPY_INT             0x00
#define GDPY_LONG            0x10
#define GDPY_FLOAT           0x20
#define GDPY_PYCOMPLEX       0x40

#if HAVE_PYCAPSULE_NEW
#define PYGETDATA_MODULE
#include "pygetdata.h"
#define PYGETDATA_CAPI
#endif

#define GDPY_INT_AS_LONG        (GDPY_INT       | GDPY_SIGNED)
#define GDPY_LONG_AS_ULL        (GDPY_LONG      | GDPY_UNSIGNED)
#define GDPY_LONG_AS_SLL        (GDPY_LONG      | GDPY_SIGNED)
#define GDPY_LONG_AS_DOUBLE     (GDPY_LONG      | GDPY_IEEE754)
#define GDPY_FLOAT_AS_DOUBLE    (GDPY_FLOAT     | GDPY_IEEE754)
#define GDPY_COMPLEX_AS_COMPLEX (GDPY_PYCOMPLEX | GDPY_COMPLEX)

#ifndef HAVE_PYERR_NEWEXCEPTIONWITHDOC
#define PyErr_NewExceptionWithDoc(a,b,c,d) PyErr_NewException(a,c,d)
#endif

/* Python3 does away with Int objects */
#if PY_MAJOR_VERSION < 3
#define gdpyint_fromlong PyInt_FromLong
#define gdpyint_check(o) (PyInt_Check(o) || PyLong_Check(o))
#else
#define gdpyint_fromlong PyLong_FromLong
#define gdpyint_check PyLong_Check
#endif

#define GDPY_INVALID_OP(t) ( \
    t != GD_WINDOP_EQ && t != GD_WINDOP_NE && \
    t != GD_WINDOP_GE && t != GD_WINDOP_GT && \
    t != GD_WINDOP_LE && t != GD_WINDOP_LT && \
    t != GD_WINDOP_SET && t != GD_WINDOP_CLR )

#define GDPY_INVALID_TYPE(t) ( \
    t != GD_UINT8     && t != GD_INT8    && \
    t != GD_UINT16    && t != GD_INT16   && \
    t != GD_UINT32    && t != GD_INT32   && \
    t != GD_UINT64    && t != GD_INT64   && \
    t != GD_FLOAT32   && t != GD_FLOAT64 && \
    t != GD_COMPLEX64 && t != GD_COMPLEX128 )

#define GDPY_CHECK_ERROR(D,R,ce) GDPY_CHECK_ERROR2(D,R,,ce)

#define GDPY_CHECK_ERROR2(D,R,E,ce) \
  do { \
    if (gdpy_report_error(D,ce)) { \
      E; \
      dreturnvoid(); \
      return (R); \
    } \
  } while(0)

extern PyTypeObject gdpy_dirfile;
extern PyTypeObject gdpy_entry;
extern PyTypeObject gdpy_fragment;

extern const struct gdpy_constant_t {
  char *name;
  long value;
} gdpy_constant_list[];

struct gdpy_dirfile_t {
  PyObject_HEAD
  DIRFILE *D;
  int mplex_lookback;
  char *verbose_prefix;
  PyObject *callback_data;
  PyObject *callback;
  int callback_exception;
  char *char_enc;
};

struct gdpy_entry_t {
  PyObject_HEAD
  gd_entry_t *E;
  char *char_enc;
};

struct gdpy_fragment_t {
  PyObject_HEAD
  int n;
  struct gdpy_dirfile_t *dirfile;
};

union gdpy_quadruple_value {
  uint64_t u;
  int64_t s;
  double f;
  GD_DCOMPLEXA(c);
};

#define gdpy_as_complex(v,o) do { \
  Py_complex c = PyComplex_AsCComplex(o); \
  gd_li2cp_((v), c.real, c.imag); \
} while(0)

#define gdpy_from_complexp(c) PyComplex_FromDoubles((c)[0], (c)[1])
#define gdpy_from_complex(c) PyComplex_FromDoubles(creal(c), cimag(c))

/* Deal with PyString, PyBytes, PyUnicode changes between Python2 and 3 */
#if PY_MAJOR_VERSION < 3

/* Check for an encoded string pyobj */
#  define gdpy_encobj_check PyString_Check

/* Convert to a "native" Python string object
 * (ie. PyString in Python2 and PyUnicode in Python3) */
#  define gdpystrobj_from_string PyString_FromString

/* For already-encoded python input strings */
#  define gdpy_string_from_encobj PyString_AsString

/* For non-decoded returned strings */
#  define gdpy_encobj_from_string PyString_FromString
#else
#  define gdpy_encobj_check PyBytes_Check
#  define gdpystrobj_from_string PyUnicode_FromString
#  define gdpy_string_from_encobj PyBytes_AsString
#  define gdpy_encobj_from_string PyBytes_FromString
#endif

/* Python3 changes to the modinit */
#if PY_MAJOR_VERSION < 3
#define GDPY_MODINITFUNC PyMODINIT_FUNC initpygetdata(void)
#define GDPY_MODINITSUCCESS return
#define GDPY_MODINITFAILURE return
#else
#define GDPY_MODINITFUNC PyMODINIT_FUNC PyInit_pygetdata(void)
#define GDPY_MODINITSUCCESS return gdpy_mod
#define GDPY_MODINITFAILURE return NULL
#endif

/* Python3 compatibility */
#ifndef PyVarObject_HEAD_INIT
#define PyVarObject_HEAD_INIT(type, size) PyObject_HEAD_INIT(type) size,
#endif

/* Handle filesystem encoding */
#if PY_MAJOR_VERSION < 3
#define gdpy_path_from_pyobj(o,c) gdpy_string_from_pyobj(o,c,NULL)
#define gdpyobj_from_path PyString_FromString
#else
extern char *gdpy_path_from_pyobj_(PyObject*, int);
#define gdpy_path_from_pyobj(o,c) gdpy_path_from_pyobj_(o,1)
#define gdpyobj_from_path PyUnicode_DecodeFSDefault
#endif

/* Declarations for the CAPI */
#ifdef PYGETDATA_CAPI
extern DIRFILE *gdpy_dirfile_dirfile(struct gdpy_dirfile_t *);
extern int gdpy_dirfile_raise(struct gdpy_dirfile_t *);
#endif

extern char *gdpy_strdup(const char*);
extern int gdpy_report_error(DIRFILE*, char*);
extern char *gdpy_copy_global_charenc(void);
extern PyObject *gdpyobj_from_string(const char*, const char*);
extern PyObject *gdpyobj_from_estring(const char*, const char*);
extern PyObject *gdpy_charenc_obj(const char*);
extern int gdpy_parse_charenc(char**, PyObject*);
extern long gdpy_long_from_pyobj(PyObject*);
extern unsigned long gdpy_ulong_from_pyobj(PyObject*);
extern char *gdpy_string_from_pyobj(PyObject*, const char*, const char*);
extern int gdpylist_append(PyObject*, PyObject*);
extern int gdpy_convert_from_pyobj(PyObject*, union gdpy_quadruple_value*,
    gd_type_t);
extern int gdpy_coerce_from_pyobj(PyObject*, gd_type_t, void*);
extern gd_type_t gdpy_convert_from_pylist(PyObject*, void*, gd_type_t, size_t);
extern PyObject *gdpy_convert_to_pyobj(const void*, gd_type_t, int);
extern PyObject *gdpy_convert_to_pylist(const void*, gd_type_t, size_t);
extern int gdpy_npytype_from_type(gd_type_t type);
extern gd_type_t gdpy_type_from_npytype(int npytype);
PyMODINIT_FUNC initpygetdata(void);