layer1/PConv.cpp (1,131 lines of code) (raw):
/*
A* -------------------------------------------------------------------
B* This file contains source code for the PyMOL computer program
C* copyright 1998-2000 by Warren Lyford Delano of DeLano Scientific.
D* -------------------------------------------------------------------
E* It is unlawful to modify or remove this copyright notice.
F* -------------------------------------------------------------------
G* Please see the accompanying LICENSE file for further information.
H* -------------------------------------------------------------------
I* Additional authors of this source file include:
-*
-*
-*
Z* -------------------------------------------------------------------
*/
#include"os_python.h"
#include"os_predef.h"
#include"os_python.h"
#include"os_std.h"
#include"Err.h"
#include"MemoryDebug.h"
#include"Base.h"
#include"PConv.h"
#include"P.h"
#include"Util.h"
#include <vector>
#if PY_MAJOR_VERSION >= 3
#define pickle_mod_name "pickle"
#else
#define pickle_mod_name "cPickle"
// support loading Python 3 pickles with Python 2
#define PyString_Check(o) (PyBytes_CheckExact(o) || PyUnicode_Check(o))
#endif
/* Return value: New reference.
* Load a pickle from the given string
*/
PyObject *PConvPickleLoads(PyObject * str)
{
PyObject *picklemod = NULL, *obj = NULL;
ok_assert(1, picklemod = PyImport_ImportModule(pickle_mod_name));
obj = PYOBJECT_CALLMETHOD(picklemod, "loads", "O", str);
ok_except1:
Py_XDECREF(picklemod);
return obj;
}
/* Return value: New reference.
* Return a string containing an object in pickle format.
*/
PyObject *PConvPickleDumps(PyObject * obj)
{
PyObject *picklemod = NULL, *str = NULL;
ok_assert(1, picklemod = PyImport_ImportModule(pickle_mod_name));
str = PYOBJECT_CALLMETHOD(picklemod, "dumps", "Oi", obj, 1);
ok_except1:
Py_XDECREF(picklemod);
return str;
}
PyObject *PConvAutoNone(PyObject * result)
{ /* automatically own Py_None */
if(result == Py_None)
Py_INCREF(result);
else if(result == NULL) {
result = Py_None;
Py_INCREF(result);
}
return (result);
}
/* Error-checked utility routines */
int PConvPyListToBitmask(PyObject * obj, int *bitmask, ov_size ll)
{
std::vector<signed char> visRepArr(ll, 0);
if (ll > 0)
ok_assert(1, PConvPyListToSCharArrayInPlaceAutoZero(obj, &visRepArr[0], ll));
*bitmask = 0;
for(int i = 0; i < ll; i++)
if(visRepArr[i])
SET_BIT(*bitmask, i);
return true;
ok_except1:
return false;
}
int PConvPyListToExtent(PyObject * obj, float *mn, float *mx)
{ /* [[min_x,min_y,min_z],
[max_x,max_y,max_z]] */
int ok = false;
PyObject *t1, *t2;
if(!obj) {
ok = false;
} else if(PyList_Check(obj))
if(PyList_Size(obj) == 2) {
t1 = PyList_GetItem(obj, 0);
t2 = PyList_GetItem(obj, 1);
if(PConvPyListToFloatArrayInPlace(t1, mn, 3) &&
PConvPyListToFloatArrayInPlace(t2, mx, 3))
ok = true;
}
return (ok);
}
int PConvPyListToStrVLAList(PyObject * obj, char **vla, int *n_str)
{
int ok = false;
PyObject *t;
int n_st = 0, n_ch = 0, nn_ch, l, i;
if(!*vla)
*vla = VLAlloc(char, 10);
if((!obj) || (!*vla)) {
ok = false;
} else if(PyList_Check(obj)) {
n_st = PyList_Size(obj);
ok = true;
for(i = 0; i < n_st; i++) {
t = PyList_GetItem(obj, i);
if(PyString_Check(t)) {
l = PyString_Size(t);
nn_ch = n_ch + l + 1;
VLACheck(*vla, char, nn_ch);
auto strval = PyString_AsSomeString(t);
UtilNCopy((*vla) + n_ch, strval.c_str(), l + 1);
n_ch = nn_ch;
} else {
VLACheck(*vla, char, n_ch + 1);
(*vla)[n_ch] = 0;
n_ch++;
}
}
}
*n_str = n_st;
return (ok);
}
int PConvAttrToIntArrayInPlace(PyObject * obj, const char *attr, int *f, ov_size ll)
{
int ok = true;
PyObject *tmp;
if(!obj) {
ok = false;
} else if(PyObject_HasAttrString(obj, attr)) {
tmp = PyObject_GetAttrString(obj, attr);
ok = PConvPyListToIntArrayInPlace(tmp, f, ll);
Py_DECREF(tmp);
} else {
ok = false;
}
return (ok);
}
int PConvAttrToFloatArrayInPlace(PyObject * obj, const char *attr, float *f, ov_size ll)
{
int ok = true;
PyObject *tmp;
if(!obj) {
ok = false;
} else if(PyObject_HasAttrString(obj, attr)) {
tmp = PyObject_GetAttrString(obj, attr);
ok = PConvPyListToFloatArrayInPlace(tmp, f, ll);
Py_DECREF(tmp);
} else {
ok = false;
}
return (ok);
}
int PConvAttrToStrMaxLen(PyObject * obj, const char *attr, char *str, ov_size ll)
{
int ok = true;
PyObject *tmp;
if(!obj) {
ok = false;
} else if(PyObject_HasAttrString(obj, attr)) {
tmp = PyObject_GetAttrString(obj, attr);
ok = PConvPyObjectToStrMaxLen(tmp, str, ll);
Py_DECREF(tmp);
} else {
ok = false;
}
return (ok);
}
int PConvAttrToPtr(PyObject * obj, const char *attr, void **cobj)
{
PyObject *tmp;
int ok = true;
if(!obj) {
ok = false;
} else if(PyObject_HasAttrString(obj, attr)) {
tmp = PyObject_GetAttrString(obj, attr);
ok = PConvCObjectToPtr(tmp, cobj);
Py_DECREF(tmp);
} else {
ok = false;
}
return (ok);
}
int PConvCObjectToPtr(PyObject * obj, void **ptr)
{
int ok = true;
if(!obj) {
ok = false;
} else if(!PyCObject_Check(obj))
ok = false;
else
(*ptr) = PyCObject_AsVoidPtr(obj);
return (ok);
}
int PConvPyStrToLexRef(PyObject * obj, OVLexicon * lex, int *lex_ref)
{
int ok = true;
if(!obj) {
ok = false;
} else if(!PyString_Check(obj)) {
ok = false;
} else {
auto strval = PyString_AsSomeString(obj);
if(!strval.c_str()) {
ok = false;
} else {
OVreturn_word result = OVLexicon_GetFromCString(lex, strval.c_str());
if(OVreturn_IS_OK(result)) {
*lex_ref = result.word;
} else {
ok = false;
}
}
}
return ok;
}
#ifndef _PYMOL_NOPY
int PConvPyStrToStrPtr(PyObject * obj, const char **ptr)
{
int ok = true;
if(!obj) {
ok = false;
} else if(!PyString_Check(obj)) {
ok = false;
}
if(ok)
*ptr = PyString_AsString(obj);
return (ok);
}
#endif
int PConvPyStrToStr(PyObject * obj, char *ptr, int size)
{
int ok = true;
if(!obj) {
ok = false;
} else if(!PyString_Check(obj)) {
ok = false;
if(size)
*ptr = 0;
} else {
auto strval = PyString_AsSomeString(obj);
UtilNCopy(ptr, strval.c_str(), size);
}
return (ok);
}
int PConvPyIntToInt(PyObject * obj, int *ptr)
{
int ok = true;
if(!obj) {
ok = false;
} else if(!PyInt_Check(obj)) {
if(!PyLong_Check(obj)) {
ok = false;
} else {
*ptr = (int) PyLong_AsLongLong(obj);
}
} else {
*ptr = PyInt_AsLong(obj);
}
return (ok);
}
int PConvPyFloatToFloat(PyObject * obj, float *ptr)
{
int ok = true;
if(!obj) {
ok = false;
} else if(!PyFloat_Check(obj)) {
ok = false;
} else {
*ptr = (float) PyFloat_AsDouble(obj);
}
return (ok);
}
int PConvPyIntToChar(PyObject * obj, char *ptr)
{
int ok = true;
if(!obj) {
ok = false;
} else if(!PyInt_Check(obj)) {
if(!PyLong_Check(obj)) {
ok = false;
} else {
*ptr = (char) PyLong_AsLongLong(obj);
}
} else {
*ptr = (char) PyInt_AsLong(obj);
}
return (ok);
}
/* == end == */
int PConvPyObjectToFloat(PyObject * object, float *value)
{
int result = true;
PyObject *tmp;
if(!object)
result = false;
else if(PyFloat_Check(object)) {
(*value) = (float) PyFloat_AsDouble(object);
} else if(PyInt_Check(object)) {
(*value) = (float) PyInt_AsLong(object);
} else if(PyLong_Check(object)) {
(*value) = (float) PyLong_AsLongLong(object);
} else {
tmp = PyNumber_Float(object);
if(tmp) {
(*value) = (float) PyFloat_AsDouble(tmp);
Py_DECREF(tmp);
} else
result = false;
}
return (result);
}
int PConvPyObjectToInt(PyObject * object, int *value)
{
int result = true;
PyObject *tmp;
if(!object)
result = false;
else if(PyInt_Check(object)) {
(*value) = (int) PyInt_AsLong(object);
} else if(PyLong_Check(object)) {
(*value) = (int) PyLong_AsLongLong(object);
} else {
tmp = PyNumber_Int(object);
if(tmp) {
(*value) = (int) PyInt_AsLong(tmp);
Py_DECREF(tmp);
} else
result = false;
}
return (result);
}
int PConvPyObjectToChar(PyObject * object, char *value)
{
int result = true;
PyObject *tmp;
if(!object)
result = false;
else if(PyInt_Check(object)) {
(*value) = (char) PyInt_AsLong(object);
} else if(PyLong_Check(object)) {
(*value) = (char) PyLong_AsLongLong(object);
} else {
tmp = PyNumber_Int(object);
if(tmp) {
(*value) = (char) PyInt_AsLong(tmp);
Py_DECREF(tmp);
} else
result = false;
}
return (result);
}
int PConvPyObjectToStrMaxLen(PyObject * object, char *value, int ln)
{
PyObject *tmp;
int result = true;
if(!object) {
result = false;
#if PY_MAJOR_VERSION >= 3
} else if(PyBytes_Check(object)) {
auto strval = PyBytes_AsSomeString(object);
strncpy(value, strval.c_str(), ln);
#endif
} else if(PyString_Check(object)) {
auto strval = PyString_AsSomeString(object);
strncpy(value, strval.c_str(), ln);
} else {
tmp = PyObject_Str(object);
if(tmp) {
auto strval = PyString_AsSomeString(tmp);
strncpy(value, strval.c_str(), ln);
Py_DECREF(tmp);
} else
result = 0;
}
if(ln > 0)
value[ln] = 0;
else
value[0] = 0;
return (result);
}
int PConvPyObjectToStrMaxClean(PyObject * object, char *value, int ln)
{
PyObject *tmp;
int result = true;
if(!object)
result = false;
else if(PyString_Check(object)) {
auto strval = PyString_AsSomeString(object);
strncpy(value, strval.c_str(), ln);
} else {
tmp = PyObject_Str(object);
if(tmp) {
auto strval = PyString_AsSomeString(tmp);
strncpy(value, strval.c_str(), ln);
Py_DECREF(tmp);
} else
result = 0;
}
if(ln > 0)
value[ln] = 0;
else
value[0] = 0;
UtilCleanStr(value);
return (result);
}
PyObject *PConvFloatToPyDictItem(PyObject * dict, const char *key, float f)
{
PyObject *tmp;
tmp = PyFloat_FromDouble((double) f);
PyDict_SetItemString(dict, key, tmp);
Py_XDECREF(tmp);
return (tmp);
}
PyObject *PConvIntToPyDictItem(PyObject * dict, const char *key, int i)
{
PyObject *tmp;
tmp = PyInt_FromLong(i);
PyDict_SetItemString(dict, key, tmp);
Py_XDECREF(tmp);
return (tmp);
}
void PConvFloat3ToPyObjAttr(PyObject * obj, const char *attr, const float *v)
{
PyObject *t1, *t2, *t3, *tmp;
t1 = PyFloat_FromDouble((double) v[0]);
t2 = PyFloat_FromDouble((double) v[1]);
t3 = PyFloat_FromDouble((double) v[2]);
tmp = PyList_New(3);
if(t1 && t2 && t3 && tmp) {
PyList_SetItem(tmp, 0, t1); /* steals reference */
PyList_SetItem(tmp, 1, t2); /* steals reference */
PyList_SetItem(tmp, 2, t3); /* steals reference */
PyObject_SetAttrString(obj, attr, tmp);
}
Py_XDECREF(tmp);
}
void PConvInt2ToPyObjAttr(PyObject * obj, const char *attr, const int *v)
{
PyObject *t1, *t2, *tmp;
t1 = PyInt_FromLong((long) v[0]);
t2 = PyInt_FromLong((long) v[1]);
tmp = PyList_New(2);
if(t1 && t2 && tmp) {
PyList_SetItem(tmp, 0, t1); /* steals reference */
PyList_SetItem(tmp, 1, t2); /* steals reference */
PyObject_SetAttrString(obj, attr, tmp);
}
Py_XDECREF(tmp);
}
void PConvFloatToPyObjAttr(PyObject * obj, const char *attr, float f)
{
PyObject *tmp;
tmp = PyFloat_FromDouble((double) f);
PyObject_SetAttrString(obj, attr, tmp);
Py_DECREF(tmp);
}
void PConvIntToPyObjAttr(PyObject * obj, const char *attr, int i)
{
PyObject *tmp;
tmp = PyInt_FromLong(i);
PyObject_SetAttrString(obj, attr, tmp);
Py_DECREF(tmp);
}
void PConvStringToPyObjAttr(PyObject * obj, const char *attr, const char *f)
{
PyObject *tmp;
tmp = PyString_FromString(f);
PyObject_SetAttrString(obj, attr, tmp);
Py_DECREF(tmp);
}
int PConvPyListToFloatArrayImpl(PyObject * obj, float **f, bool as_vla)
{
int a, l;
int ok = true;
float *ff;
if(!obj) {
*f = NULL;
ok = false;
} else if (PyBytes_Check(obj)){
// binary_dump
int slen = PyBytes_Size(obj);
l = slen / sizeof(float);
if (as_vla) {
(*f) = VLAlloc(float, l);
} else {
(*f) = Alloc(float, l);
}
auto strval = PyBytes_AsSomeString(obj);
memcpy(*f, strval.data(), slen);
} else if(!PyList_Check(obj)) {
*f = NULL;
ok = false;
} else {
l = (int) PyList_Size(obj);
if(!l)
ok = -1;
else
ok = l;
if (as_vla) {
(*f) = VLAlloc(float, l);
} else {
(*f) = Alloc(float, l);
}
ff = (*f);
for(a = 0; a < l; a++)
*(ff++) = (float) PyFloat_AsDouble(PyList_GetItem(obj, a));
}
return (ok);
}
int PConvPyListToFloatVLANoneOkay(PyObject * obj, float **f)
{
int a, l;
float *ff;
int ok = true;
if(!obj) {
*f = NULL;
ok = false;
} else if(obj == Py_None) {
*f = NULL;
ok = true;
} else if(!PyList_Check(obj)) {
*f = NULL;
ok = false;
} else {
l = PyList_Size(obj);
if(!l)
ok = -1;
else
ok = l;
(*f) = VLAlloc(float, l);
ff = (*f);
for(a = 0; a < l; a++)
*(ff++) = (float) PyFloat_AsDouble(PyList_GetItem(obj, a));
VLASize((*f), float, l);
}
return (ok);
}
int PConvPyList3ToFloatVLA(PyObject * obj, float **f)
{
int a, b, l;
float *ff;
PyObject *triple;
int ok = true;
if(!obj) {
*f = NULL;
ok = false;
} else if(!PyList_Check(obj)) {
*f = NULL;
ok = false;
} else {
l = PyList_Size(obj);
if(!l)
ok = -1;
else
ok = l;
(*f) = VLAlloc(float, l * 3);
ff = (*f);
for(a = 0; a < l; a++) {
triple = PyList_GetItem(obj, a);
ok = PyList_Check(triple);
if(ok)
ok = (PyList_Size(triple) == 3);
if(ok) {
for(b = 0; b < 3; b++)
*(ff++) = (float) PyFloat_AsDouble(PyList_GetItem(triple, b));
} else {
ok = false;
break;
}
}
VLASize((*f), float, l * 3);
}
return (ok);
}
int PConvPyListToDoubleArray(PyObject * obj, double **f)
{
int a, l;
double *ff;
int ok = true;
if(!obj) {
*f = NULL;
l = 0;
} else if(!PyList_Check(obj)) {
*f = NULL;
ok = false;
} else {
l = PyList_Size(obj);
if(!l)
ok = -1;
else
ok = l;
(*f) = Alloc(double, l);
ff = (*f);
for(a = 0; a < l; a++)
*(ff++) = PyFloat_AsDouble(PyList_GetItem(obj, a));
}
return (ok);
}
int PConvPyListToIntArrayImpl(PyObject * obj, int **f, bool as_vla)
{
int a, l;
int *ff;
int ok = true;
if(!obj) {
*f = NULL;
ok = false;
} else if (PyBytes_Check(obj)){
// binary_dump
int slen = PyBytes_Size(obj);
l = slen / sizeof(int);
if (as_vla) {
(*f) = VLAlloc(int, l);
} else {
(*f) = Alloc(int, l);
}
auto strval = PyBytes_AsSomeString(obj);
memcpy(*f, strval.data(), slen);
} else if(!PyList_Check(obj)) {
*f = NULL;
ok = false;
} else {
l = PyList_Size(obj);
if(!l)
ok = -1;
else
ok = l;
if (as_vla) {
(*f) = VLAlloc(int, l);
} else {
(*f) = Alloc(int, l);
}
ff = (*f);
for(a = 0; a < l; a++)
*(ff++) = PyInt_AsLong(PyList_GetItem(obj, a));
}
return (ok);
}
ov_status PConvPyTupleToIntVLA(int **result, PyObject * tuple)
{
ov_status status = OV_STATUS_FAILURE;
if(!(tuple && PyTuple_Check(tuple))) {
*result = NULL;
} else {
int *vla = NULL;
ov_size size = PyTuple_Size(tuple);
vla = VLAlloc(int, size);
if(vla) {
ov_size i;
int *ptr = vla;
status = OV_STATUS_SUCCESS;
for(i = 0; i < size; i++)
*(ptr++) = PyInt_AsLong(PyTuple_GetItem(tuple, i));
}
*result = vla;
}
return status;
}
ov_status PConvPyTupleToFloatVLA(float **result, PyObject * tuple)
{
ov_status status = OV_STATUS_FAILURE;
if(!(tuple && PyTuple_Check(tuple))) {
*result = NULL;
} else {
float *vla = NULL;
ov_size size = PyTuple_Size(tuple);
vla = VLAlloc(float, size);
if(vla) {
ov_size i;
float *ptr = vla;
status = OV_STATUS_SUCCESS;
for(i = 0; i < size; i++)
*(ptr++) = (float) PyFloat_AsDouble(PyTuple_GetItem(tuple, i));
}
*result = vla;
}
return status;
}
int PConvPyListToDoubleArrayInPlace(PyObject * obj, double *ff, ov_size ll)
{
int ok = true;
ov_size a, l;
if(!obj) {
ok = false;
} else if(!PyList_Check(obj)) {
ok = false;
} else {
l = PyList_Size(obj);
if(l != ll)
ok = false;
else {
if(!l)
ok = -1;
else
ok = l;
for(a = 0; a < l; a++)
*(ff++) = PyFloat_AsDouble(PyList_GetItem(obj, a));
}
/* NOTE ASSUMPTION! */
}
return (ok);
}
int PConvPyListToFloatArrayInPlace(PyObject * obj, float *ff, ov_size ll)
{
int ok = true;
ov_size a, l;
if(!obj) {
ok = false;
} else if(!PyList_Check(obj)) {
ok = false;
} else {
l = PyList_Size(obj);
if(ll > 0 && l != ll)
ok = false;
else {
if(!l)
ok = -1;
else
ok = l;
for(a = 0; a < l; a++)
*(ff++) = (float) PyFloat_AsDouble(PyList_GetItem(obj, a));
}
/* NOTE ASSUMPTION! */
}
return (ok);
}
int PConvPyListOrTupleToFloatArrayInPlace(PyObject * obj, float *ff, ov_size ll)
{
int ok = true, isTuple = false;
ov_size a, l;
if(!obj) {
ok = false;
} else if(!PyList_Check(obj) && !(isTuple=PyTuple_Check(obj))) {
ok = false;
} else {
if (isTuple)
l = PyTuple_Size(obj);
else
l = PyList_Size(obj);
if(l != ll)
ok = false;
else {
if(!l)
ok = -1;
else
ok = l;
if (isTuple)
for(a = 0; a < l; a++){
*(ff++) = (float) PyFloat_AsDouble(PyTuple_GetItem(obj, a));
}
else
for(a = 0; a < l; a++){
*(ff++) = (float) PyFloat_AsDouble(PyList_GetItem(obj, a));
}
}
/* NOTE ASSUMPTION! */
}
return (ok);
}
int PConvPyListToIntArrayInPlace(PyObject * obj, int *ii, ov_size ll)
{
int ok = true;
ov_size a, l;
if(!obj)
ok = false;
else if(!PyList_Check(obj))
ok = false;
else {
l = PyList_Size(obj);
if(!l)
ok = -1;
else
ok = l;
if(l != ll)
ok = false;
else
for(a = 0; a < l; a++)
*(ii++) = PyInt_AsLong(PyList_GetItem(obj, a));
/* NOTE ASSUMPTION! */
}
return (ok);
}
int PConvPyListToIntArrayInPlaceAutoZero(PyObject * obj, int *ii, ov_size ll)
{
int ok = true;
ov_size a, l;
if(!obj)
ok = false;
else if(!PyList_Check(obj))
ok = false;
else {
l = PyList_Size(obj);
if(!l)
ok = -1;
else
ok = l;
for(a = 0; (a < l) && (a < ll); a++)
*(ii++) = PyInt_AsLong(PyList_GetItem(obj, a));
while(l < ll) {
*(ii++) = 0;
l++;
}
}
return (ok);
}
int PConvPyListToSIntArrayInPlaceAutoZero(PyObject * obj, short int *ii, ov_size ll)
{
int ok = true;
ov_size a, l;
if(!obj)
ok = false;
else if(!PyList_Check(obj))
ok = false;
else {
l = PyList_Size(obj);
if(!l)
ok = -1;
else
ok = l;
for(a = 0; (a < l) && (a < ll); a++)
*(ii++) = (short int) PyInt_AsLong(PyList_GetItem(obj, a));
while(l < ll) {
*(ii++) = 0;
l++;
}
}
return (ok);
}
int PConvPyListToSCharArrayInPlaceAutoZero(PyObject * obj, signed char *ii, ov_size ll)
{
int ok = true;
ov_size a, l;
if(!obj)
ok = false;
else if(!PyList_Check(obj))
ok = false;
else {
l = PyList_Size(obj);
if(!l)
ok = -1;
else
ok = l;
for(a = 0; (a < l) && (a < ll); a++)
*(ii++) = (signed char) PyInt_AsLong(PyList_GetItem(obj, a));
while(l < ll) {
*(ii++) = 0;
l++;
}
}
return (ok);
}
int PConvPyListToFloatArrayInPlaceAutoZero(PyObject * obj, float *ii, ov_size ll)
{
int ok = true;
ov_size a, l;
if(!obj)
ok = false;
else if(!PyList_Check(obj))
ok = false;
else {
l = PyList_Size(obj);
if(!l)
ok = -1;
else
ok = l;
for(a = 0; (a < l) && (a < ll); a++)
*(ii++) = (float) PyFloat_AsDouble(PyList_GetItem(obj, a));
while(l < ll) {
*(ii++) = 0.0f;
l++;
}
}
return (ok);
}
PyObject *PConvFloatArrayToPyList(const float *f, int l, bool dump_binary)
{
#ifndef PICKLETOOLS
if (dump_binary){
return PyBytes_FromStringAndSize(reinterpret_cast<const char*>(f), l * sizeof(float));
}
#endif
int a;
PyObject *result = PyList_New(l);
for(a = 0; a < l; a++)
PyList_SetItem(result, a, PyFloat_FromDouble((double) *(f++)));
return (PConvAutoNone(result));
}
PyObject *PConvFloatArrayToPyListNullOkay(const float *f, int l)
{
int a;
PyObject *result = NULL;
if(f) {
result = PyList_New(l);
for(a = 0; a < l; a++)
PyList_SetItem(result, a, PyFloat_FromDouble((double) *(f++)));
}
return (PConvAutoNone(result));
}
PyObject *PConvDoubleArrayToPyList(const double *f, int l)
{
int a;
PyObject *result = PyList_New(l);
for(a = 0; a < l; a++)
PyList_SetItem(result, a, PyFloat_FromDouble(*(f++)));
return (PConvAutoNone(result));
}
PyObject *PConvFloatVLAToPyList(const float *f)
{
int a, l;
PyObject *result = NULL;
l = VLAGetSize(f);
result = PyList_New(l);
for(a = 0; a < l; a++) {
PyList_SetItem(result, a, PyFloat_FromDouble((double) *(f++))); /* set item steals ref */
}
return (PConvAutoNone(result));
}
PyObject *PConvFloatVLAToPyTuple(float *vla)
{
PyObject *result = NULL;
if(vla) {
ov_size size = VLAGetSize(vla);
result = PyTuple_New(size);
if(result) {
ov_size i;
for(i = 0; i < size; i++) {
PyTuple_SetItem(result, i, PyFloat_FromDouble((double) *(vla++))); /* set item steals ref */
}
}
}
return (PConvAutoNone(result));
}
PyObject *PConvIntVLAToPyList(const int *f)
{
int a, l;
PyObject *result = NULL;
l = VLAGetSize(f);
result = PyList_New(l);
for(a = 0; a < l; a++)
PyList_SetItem(result, a, PyInt_FromLong(*(f++)));
return (PConvAutoNone(result));
}
PyObject *PConvIntVLAToPyTuple(int *vla)
{
PyObject *result = NULL;
if(vla) {
ov_size size = VLAGetSize(vla);
result = PyTuple_New(size);
if(result) {
ov_size i;
for(i = 0; i < size; i++) {
PyTuple_SetItem(result, i, PyInt_FromLong(*(vla++))); /* set item steals ref */
}
}
}
return (PConvAutoNone(result));
}
PyObject *PConvIntArrayToPyList(const int *f, int l, bool dump_binary)
{
#ifndef PICKLETOOLS
if (dump_binary){
return PyBytes_FromStringAndSize(reinterpret_cast<const char*>(f), l * sizeof(int));
}
#endif
int a;
PyObject *result = PyList_New(l);
for(a = 0; a < l; a++)
PyList_SetItem(result, a, PyInt_FromLong(*(f++)));
return (PConvAutoNone(result));
}
PyObject *PConvSIntArrayToPyList(const short int *f, int l)
{
int a;
PyObject *result = PyList_New(l);
for(a = 0; a < l; a++)
PyList_SetItem(result, a, PyInt_FromLong(*(f++)));
return (PConvAutoNone(result));
}
PyObject *PConvSCharArrayToPyList(const signed char *f, int l)
{
int a;
PyObject *result = PyList_New(l);
for(a = 0; a < l; a++)
PyList_SetItem(result, a, PyInt_FromLong(*(f++)));
return (PConvAutoNone(result));
}
PyObject *PConv3DIntArrayTo3DPyList(int ***array, int *dim)
{
int a, b, c;
PyObject *result, *pyB, *pyC;
result = PyList_New(dim[0]);
for(a = 0; a < dim[0]; a++) {
pyB = PyList_New(dim[1]);
PyList_SetItem(result, a, pyB);
for(b = 0; b < dim[1]; b++) {
pyC = PyList_New(dim[2]);
PyList_SetItem(pyB, b, pyC);
for(c = 0; c < dim[2]; c++) {
PyList_SetItem(pyC, c, PyInt_FromLong(array[a][b][c]));
}
}
}
return (PConvAutoNone(result));
}
PyObject *PConvStringListToPyList(int l, const char * const *str)
{
int a;
PyObject *result = PyList_New(l);
for(a = 0; a < l; a++) {
PyList_SetItem(result, a, PyString_FromString(str[a]));
}
return (PConvAutoNone(result));
}
PyObject *PConvStringVLAToPyList(const char *vla)
{
int a, c, n = 0;
const char *p;
PyObject *result = NULL;
p = vla;
c = VLAGetSize(vla);
while(c--) { /* count strings */
if(!*(p++))
n++;
}
result = PyList_New(n);
p = vla;
for(a = 0; a < n; a++) {
PyList_SetItem(result, a, PyString_FromString(p));
while(*(p++));
}
return (PConvAutoNone(result));
}
int PConvPyListToStringVLA(PyObject * obj, char **vla_ptr)
{
int a, l, ll;
char *vla = NULL, *q;
PyObject *i;
if(obj)
if(PyList_Check(obj)) {
l = PyList_Size(obj);
ll = 0;
for(a = 0; a < l; a++) {
i = PyList_GetItem(obj, a);
if(PyString_Check(i)) {
ll += PyString_Size(i) + 1;
}
}
vla = VLAlloc(char, ll);
VLASize(vla, char, ll);
q = vla;
for(a = 0; a < l; a++) {
i = PyList_GetItem(obj, a);
if(PyString_Check(i)) {
auto strval = PyString_AsSomeString(i);
auto p = strval.c_str();
while(*p)
*(q++) = *(p++);
*(q++) = 0;
}
}
}
(*vla_ptr) = vla;
return (vla && 1);
}
int PConvPyListToLabPosVLA(PyObject * obj, LabPosType ** vla_ptr)
{
int a, l;
int ok = true;
LabPosType *vla = NULL, *q;
PyObject *i;
if(obj)
if(PyList_Check(obj)) {
l = PyList_Size(obj);
vla = VLACalloc(LabPosType, l);
q = vla;
for(a = 0; a < l; a++) {
i = PyList_GetItem(obj, a);
if(PyList_Check(i) && (PyList_Size(i) == 7)) {
ok = ok && PConvPyIntToInt(PyList_GetItem(i, 0), &q->mode) &&
PConvPyFloatToFloat(PyList_GetItem(i, 1), q->pos) &&
PConvPyFloatToFloat(PyList_GetItem(i, 2), q->pos + 1) &&
PConvPyFloatToFloat(PyList_GetItem(i, 3), q->pos + 2) &&
PConvPyFloatToFloat(PyList_GetItem(i, 4), q->offset) &&
PConvPyFloatToFloat(PyList_GetItem(i, 5), q->offset + 1) &&
PConvPyFloatToFloat(PyList_GetItem(i, 6), q->offset + 2);
} else {
VLAFreeP(vla); /* just in case... */
vla = NULL;
break;
}
q++;
}
}
if(!ok && (!vla)) {
VLAFreeP(vla);
}
(*vla_ptr) = vla;
return (ok);
}
PyObject *PConvLabPosVLAToPyList(const LabPosType * vla, int l)
{ /* TO DO error handling */
int a;
const LabPosType *p = vla;
PyObject *result = NULL;
if(p) {
PyObject *item;
result = PyList_New(l);
for(a = 0; a < l; a++) {
item = PyList_New(7);
PyList_SetItem(item, 0, PyInt_FromLong(p->mode));
PyList_SetItem(item, 1, PyFloat_FromDouble((double) p->pos[0]));
PyList_SetItem(item, 2, PyFloat_FromDouble((double) p->pos[1]));
PyList_SetItem(item, 3, PyFloat_FromDouble((double) p->pos[2]));
PyList_SetItem(item, 4, PyFloat_FromDouble((double) p->offset[0]));
PyList_SetItem(item, 5, PyFloat_FromDouble((double) p->offset[1]));
PyList_SetItem(item, 6, PyFloat_FromDouble((double) p->offset[2]));
PyList_SetItem(result, a, item);
p++;
}
}
return (PConvAutoNone(result));
}
void PConv44PyListTo44f(PyObject * src, float *dest)
{ /* note lost of precision */
PyObject *row;
if(src && dest && PyList_Check(src)) {
row = PyList_GetItem(src, 0);
if(row && PyList_Check(row)) {
dest[0] = (float) PyFloat_AsDouble(PyList_GetItem(row, 0));
dest[1] = (float) PyFloat_AsDouble(PyList_GetItem(row, 1));
dest[2] = (float) PyFloat_AsDouble(PyList_GetItem(row, 2));
dest[3] = (float) PyFloat_AsDouble(PyList_GetItem(row, 3));
}
row = PyList_GetItem(src, 1);
if(row && PyList_Check(row)) {
dest[4] = (float) PyFloat_AsDouble(PyList_GetItem(row, 0));
dest[5] = (float) PyFloat_AsDouble(PyList_GetItem(row, 1));
dest[6] = (float) PyFloat_AsDouble(PyList_GetItem(row, 2));
dest[7] = (float) PyFloat_AsDouble(PyList_GetItem(row, 3));
}
row = PyList_GetItem(src, 2);
if(row && PyList_Check(row)) {
dest[8] = (float) PyFloat_AsDouble(PyList_GetItem(row, 0));
dest[9] = (float) PyFloat_AsDouble(PyList_GetItem(row, 1));
dest[10] = (float) PyFloat_AsDouble(PyList_GetItem(row, 2));
dest[11] = (float) PyFloat_AsDouble(PyList_GetItem(row, 3));
}
row = PyList_GetItem(src, 3);
if(row && PyList_Check(row)) {
dest[12] = (float) PyFloat_AsDouble(PyList_GetItem(row, 0));
dest[13] = (float) PyFloat_AsDouble(PyList_GetItem(row, 1));
dest[14] = (float) PyFloat_AsDouble(PyList_GetItem(row, 2));
dest[15] = (float) PyFloat_AsDouble(PyList_GetItem(row, 3));
}
}
}