Beispiel #1
0
void IDP_spit(IDProperty *prop)
{
    if (prop) {
        PyGILState_STATE gilstate;
        int use_gil = TRUE; /* !PyC_IsInterpreterActive(); */
        PyObject *ret_dict;
        PyObject *ret_str;

        if (use_gil) {
            gilstate = PyGILState_Ensure();
        }

        /* to_dict() */
        ret_dict = BPy_IDGroup_MapDataToPy(prop);
        ret_str = PyObject_Repr(ret_dict);
        Py_DECREF(ret_dict);

        printf("IDProperty(%p): %s\n", prop, _PyUnicode_AsString(ret_str));

        Py_DECREF(ret_str);

        if (use_gil) {
            PyGILState_Release(gilstate);
        }
    }
    else {
        printf("IDProperty: <NIL>\n");
    }
}
Beispiel #2
0
static PyObject *BPy_IDGroup_Pop(BPy_IDProperty *self, PyObject *value)
{
    IDProperty *idprop;
    PyObject *pyform;
    const char *name = _PyUnicode_AsString(value);

    if (!name) {
        PyErr_Format(PyExc_TypeError,
                     "pop expected at least a string argument, not %.200s",
                     Py_TYPE(value)->tp_name);
        return NULL;
    }

    idprop = IDP_GetPropertyFromGroup(self->prop, name);

    if (idprop) {
        pyform = BPy_IDGroup_MapDataToPy(idprop);

        if (!pyform) {
            /* ok something bad happened with the pyobject,
             * so don't remove the prop from the group.  if pyform is
             * NULL, then it already should have raised an exception.*/
            return NULL;
        }

        IDP_RemoveFromGroup(self->prop, idprop);
        return pyform;
    }

    PyErr_SetString(PyExc_KeyError, "item not in group");
    return NULL;
}
Beispiel #3
0
static PyObject *BPy_IDGroup_pop(BPy_IDProperty *self, PyObject *args)
{
	IDProperty *idprop;
	PyObject *pyform;

	char *key;
	PyObject *def = NULL;

	if (!PyArg_ParseTuple(args, "s|O:get", &key, &def)) {
		return NULL;
	}

	idprop = IDP_GetPropertyFromGroup(self->prop, key);
	if (idprop == NULL) {
		if (def == NULL) {
			PyErr_SetString(PyExc_KeyError, "item not in group");
			return NULL;
		}
		return Py_INCREF_RET(def);
	}

	pyform = BPy_IDGroup_MapDataToPy(idprop);
	if (pyform == NULL) {
		/* ok something bad happened with the pyobject,
		 * so don't remove the prop from the group.  if pyform is
		 * NULL, then it already should have raised an exception.*/
		return NULL;
	}

	IDP_RemoveFromGroup(self->prop, idprop);
	return pyform;
}
Beispiel #4
0
static PyObject *BPy_IDGroup_to_dict(BPy_IDProperty *self)
{
    return BPy_IDGroup_MapDataToPy(self->prop);
}
Beispiel #5
0
/* for simple, non nested types this is the same as BPy_IDGroup_WrapData */
static PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop)
{
    switch (prop->type) {
    case IDP_STRING:
        return idprop_py_from_idp_string(prop);
    case IDP_INT:
        return idprop_py_from_idp_int(prop);
    case IDP_FLOAT:
        return idprop_py_from_idp_float(prop);
    case IDP_DOUBLE:
        return idprop_py_from_idp_double(prop);
    case IDP_ARRAY:
    {
        PyObject *seq = PyList_New(prop->len);
        int i;

        if (!seq) {
            PyErr_Format(PyExc_RuntimeError,
                         "%s: IDP_ARRAY: PyList_New(%d) failed",
                         __func__, prop->len);
            return NULL;
        }

        switch (prop->subtype) {
        case IDP_FLOAT:
        {
            float *array = (float *)IDP_Array(prop);
            for (i = 0; i < prop->len; i++) {
                PyList_SET_ITEM(seq, i, PyFloat_FromDouble(array[i]));
            }
            break;
        }
        case IDP_DOUBLE:
        {
            double *array = (double *)IDP_Array(prop);
            for (i = 0; i < prop->len; i++) {
                PyList_SET_ITEM(seq, i, PyFloat_FromDouble(array[i]));
            }
            break;
        }
        case IDP_INT:
        {
            int *array = (int *)IDP_Array(prop);
            for (i = 0; i < prop->len; i++) {
                PyList_SET_ITEM(seq, i, PyLong_FromLong(array[i]));
            }
            break;
        }
        default:
            PyErr_Format(PyExc_RuntimeError,
                         "%s: invalid/corrupt array type '%d'!",
                         __func__, prop->subtype);
            Py_DECREF(seq);
            return NULL;
        }

        return seq;
    }
    case IDP_IDPARRAY:
    {
        PyObject *seq = PyList_New(prop->len), *wrap;
        IDProperty *array = IDP_IDPArray(prop);
        int i;

        if (!seq) {
            PyErr_Format(PyExc_RuntimeError,
                         "%s: IDP_IDPARRAY: PyList_New(%d) failed",
                         __func__, prop->len);
            return NULL;
        }

        for (i = 0; i < prop->len; i++) {
            wrap = BPy_IDGroup_MapDataToPy(array++);

            if (!wrap) /* BPy_IDGroup_MapDataToPy sets the error */
                return NULL;

            PyList_SET_ITEM(seq, i, wrap);
        }
        return seq;
    }
    case IDP_GROUP:
    {
        PyObject *dict = PyDict_New(), *wrap;
        IDProperty *loop;

        for (loop = prop->data.group.first; loop; loop = loop->next) {
            wrap = BPy_IDGroup_MapDataToPy(loop);

            if (!wrap) /* BPy_IDGroup_MapDataToPy sets the error */
                return NULL;

            PyDict_SetItemString(dict, loop->name, wrap);
            Py_DECREF(wrap);
        }
        return dict;
    }
    }

    PyErr_Format(PyExc_RuntimeError,
                 "%s ERROR: '%s' property exists with a bad type code '%d'!",
                 __func__, prop->name, prop->type);
    return NULL;
}
Beispiel #6
0
static PyObject *BPy_IDArray_to_list(BPy_IDArray *self)
{
    return BPy_IDGroup_MapDataToPy(self->prop);
}
Beispiel #7
0
static PyObject *BPy_IDArray_ConvertToPy(BPy_IDArray *self)
{
    return BPy_IDGroup_MapDataToPy(self->prop);
}
Beispiel #8
0
static PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop)
{
    switch (prop->type) {
    case IDP_STRING:
#ifdef USE_STRING_COERCE
        return PyC_UnicodeFromByte(prop->data.pointer);
#else
        return PyUnicode_FromString(prop->data.pointer);
#endif
        break;
    case IDP_FLOAT:
        return PyFloat_FromDouble(*((float*)&prop->data.val));
        break;
    case IDP_DOUBLE:
        return PyFloat_FromDouble(*((double*)&prop->data.val));
        break;
    case IDP_INT:
        return PyLong_FromSsize_t( prop->data.val );
        break;
    case IDP_ARRAY:
    {
        PyObject *seq = PyList_New(prop->len);
        int i;

        if (!seq) {
            PyErr_Format(PyExc_RuntimeError, "BPy_IDGroup_MapDataToPy, IDP_ARRAY: PyList_New(%d) failed", prop->len);
            return NULL;
        }

        for (i=0; i<prop->len; i++) {
            if (prop->subtype == IDP_FLOAT) {
                PyList_SET_ITEM(seq, i,
                                PyFloat_FromDouble(((float*)prop->data.pointer)[i]));
            } else if (prop->subtype == IDP_DOUBLE) {
                PyList_SET_ITEM(seq, i,
                                PyFloat_FromDouble(((double*)prop->data.pointer)[i]));
            } else 	{
                PyList_SET_ITEM(seq, i,
                                PyLong_FromLong(((int*)prop->data.pointer)[i]));
            }
        }
        return seq;
    }
    case IDP_IDPARRAY:
    {
        PyObject *seq = PyList_New(prop->len), *wrap;
        IDProperty *array= IDP_IDPArray(prop);
        int i;

        if (!seq) {
            PyErr_Format(PyExc_RuntimeError, "BPy_IDGroup_MapDataToPy, IDP_IDPARRAY: PyList_New(%d) failed", prop->len);
            return NULL;
        }

        for (i=0; i<prop->len; i++) {
            wrap= BPy_IDGroup_MapDataToPy(array++);

            if (!wrap) /* BPy_IDGroup_MapDataToPy sets the error */
                return NULL;

            PyList_SET_ITEM(seq, i, wrap);
        }
        return seq;
    }
    case IDP_GROUP:
    {
        PyObject *dict = PyDict_New(), *wrap;
        IDProperty *loop;

        for (loop=prop->data.group.first; loop; loop=loop->next) {
            wrap = BPy_IDGroup_MapDataToPy(loop);

            if (!wrap) /* BPy_IDGroup_MapDataToPy sets the error */
                return NULL;

            PyDict_SetItemString(dict, loop->name, wrap);
        }
        return dict;
    }
    }

    PyErr_Format(PyExc_RuntimeError, "eek!! '%s' property exists with a bad type code '%d' !!!", prop->name, prop->type);
    return NULL;
}