diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-04-17 07:17:24 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-04-17 07:21:24 +0300 |
commit | e12c08e8d170b7ca40f204a5b0423c23a9fbc2c1 (patch) | |
tree | 8cf3453d12edb177a218ef8009357518ec6cab6a /source/blender/python/generic/idprop_py_api.c | |
parent | b3dabc200a4b0399ec6b81f2ff2730d07b44fcaa (diff) |
ClangFormat: apply to source, most of intern
Apply clang format as proposed in T53211.
For details on usage and instructions for migrating branches
without conflicts, see:
https://wiki.blender.org/wiki/Tools/ClangFormat
Diffstat (limited to 'source/blender/python/generic/idprop_py_api.c')
-rw-r--r-- | source/blender/python/generic/idprop_py_api.c | 2671 |
1 files changed, 1330 insertions, 1341 deletions
diff --git a/source/blender/python/generic/idprop_py_api.c b/source/blender/python/generic/idprop_py_api.c index f18d02a4405..d96bef797cb 100644 --- a/source/blender/python/generic/idprop_py_api.c +++ b/source/blender/python/generic/idprop_py_api.c @@ -31,7 +31,7 @@ #define USE_STRING_COERCE #ifdef USE_STRING_COERCE -#include "py_capi_utils.h" +# include "py_capi_utils.h" #endif #include "python_utildefines.h" @@ -48,81 +48,80 @@ extern bool pyrna_id_CheckPyObject(PyObject *obj); static PyObject *idprop_py_from_idp_string(const IDProperty *prop) { - if (prop->subtype == IDP_STRING_SUB_BYTE) { - return PyBytes_FromStringAndSize(IDP_String(prop), prop->len); - } - else { + if (prop->subtype == IDP_STRING_SUB_BYTE) { + return PyBytes_FromStringAndSize(IDP_String(prop), prop->len); + } + else { #ifdef USE_STRING_COERCE - return PyC_UnicodeFromByteAndSize(IDP_Array(prop), prop->len - 1); + return PyC_UnicodeFromByteAndSize(IDP_Array(prop), prop->len - 1); #else - return PyUnicode_FromStringAndSize(IDP_String(prop), prop->len - 1); + return PyUnicode_FromStringAndSize(IDP_String(prop), prop->len - 1); #endif - } + } } static PyObject *idprop_py_from_idp_int(const IDProperty *prop) { - return PyLong_FromLong((long)IDP_Int(prop)); + return PyLong_FromLong((long)IDP_Int(prop)); } static PyObject *idprop_py_from_idp_float(const IDProperty *prop) { - return PyFloat_FromDouble((double)IDP_Float(prop)); + return PyFloat_FromDouble((double)IDP_Float(prop)); } static PyObject *idprop_py_from_idp_double(const IDProperty *prop) { - return PyFloat_FromDouble(IDP_Double(prop)); + return PyFloat_FromDouble(IDP_Double(prop)); } static PyObject *idprop_py_from_idp_group(ID *id, IDProperty *prop, IDProperty *parent) { - BPy_IDProperty *group = PyObject_New(BPy_IDProperty, &BPy_IDGroup_Type); - group->id = id; - group->prop = prop; - group->parent = parent; /* can be NULL */ - return (PyObject *)group; + BPy_IDProperty *group = PyObject_New(BPy_IDProperty, &BPy_IDGroup_Type); + group->id = id; + group->prop = prop; + group->parent = parent; /* can be NULL */ + return (PyObject *)group; } static PyObject *idprop_py_from_idp_id(IDProperty *prop) { - return pyrna_id_CreatePyObject(prop->data.pointer); + return pyrna_id_CreatePyObject(prop->data.pointer); } static PyObject *idprop_py_from_idp_array(ID *id, IDProperty *prop) { - BPy_IDProperty *array = PyObject_New(BPy_IDProperty, &BPy_IDArray_Type); - array->id = id; - array->prop = prop; - return (PyObject *)array; + BPy_IDProperty *array = PyObject_New(BPy_IDProperty, &BPy_IDArray_Type); + array->id = id; + array->prop = prop; + return (PyObject *)array; } static PyObject *idprop_py_from_idp_idparray(ID *id, IDProperty *prop) { - PyObject *seq = PyList_New(prop->len); - IDProperty *array = IDP_IDPArray(prop); - int i; + PyObject *seq = PyList_New(prop->len); + 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; - } + 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++) { - PyObject *wrap = BPy_IDGroup_WrapData(id, array++, prop); + for (i = 0; i < prop->len; i++) { + PyObject *wrap = BPy_IDGroup_WrapData(id, array++, prop); - /* BPy_IDGroup_MapDataToPy sets the error */ - if (UNLIKELY(wrap == NULL)) { - Py_DECREF(seq); - return NULL; - } + /* BPy_IDGroup_MapDataToPy sets the error */ + if (UNLIKELY(wrap == NULL)) { + Py_DECREF(seq); + return NULL; + } - PyList_SET_ITEM(seq, i, wrap); - } + PyList_SET_ITEM(seq, i, wrap); + } - return seq; + return seq; } /* -------------------------------------------------------------------------- */ @@ -130,236 +129,252 @@ static PyObject *idprop_py_from_idp_idparray(ID *id, IDProperty *prop) /* use for both array and group */ static Py_hash_t BPy_IDGroup_hash(BPy_IDProperty *self) { - return _Py_HashPointer(self->prop); + return _Py_HashPointer(self->prop); } static PyObject *BPy_IDGroup_repr(BPy_IDProperty *self) { - return PyUnicode_FromFormat("<bpy id prop: owner=\"%s\", name=\"%s\", address=%p>", - self->id ? self->id->name : "<NONE>", self->prop->name, self->prop); + return PyUnicode_FromFormat("<bpy id prop: owner=\"%s\", name=\"%s\", address=%p>", + self->id ? self->id->name : "<NONE>", + self->prop->name, + self->prop); } PyObject *BPy_IDGroup_WrapData(ID *id, IDProperty *prop, IDProperty *parent) { - 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_GROUP: return idprop_py_from_idp_group(id, prop, parent); - case IDP_ARRAY: return idprop_py_from_idp_array(id, prop); - case IDP_IDPARRAY: return idprop_py_from_idp_idparray(id, prop); /* this could be better a internal type */ - case IDP_ID: return idprop_py_from_idp_id(prop); - default: Py_RETURN_NONE; - } + 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_GROUP: + return idprop_py_from_idp_group(id, prop, parent); + case IDP_ARRAY: + return idprop_py_from_idp_array(id, prop); + case IDP_IDPARRAY: + return idprop_py_from_idp_idparray(id, prop); /* this could be better a internal type */ + case IDP_ID: + return idprop_py_from_idp_id(prop); + default: + Py_RETURN_NONE; + } } #if 0 /* UNUSED, currently assignment overwrites into new properties, rather than setting in-place */ static int BPy_IDGroup_SetData(BPy_IDProperty *self, IDProperty *prop, PyObject *value) { - switch (prop->type) { - case IDP_STRING: - { - char *st; - if (!PyUnicode_Check(value)) { - PyErr_SetString(PyExc_TypeError, "expected a string!"); - return -1; - } - /* NOTE: if this code is enabled, bytes support needs to be added */ -#ifdef USE_STRING_COERCE - { - int alloc_len; - PyObject *value_coerce = NULL; - - st = (char *)PyC_UnicodeAsByte(value, &value_coerce); - alloc_len = strlen(st) + 1; - - st = _PyUnicode_AsString(value); - IDP_ResizeArray(prop, alloc_len); - memcpy(IDP_Array(prop), st, alloc_len); - Py_XDECREF(value_coerce); - } -#else - st = _PyUnicode_AsString(value); - IDP_ResizeArray(prop, strlen(st) + 1); - strcpy(IDP_Array(prop), st); -#endif - - return 0; - } - - case IDP_INT: - { - int ivalue = PyLong_AsSsize_t(value); - if (ivalue == -1 && PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, "expected an int type"); - return -1; - } - IDP_Int(prop) = ivalue; - break; - } - case IDP_FLOAT: - { - float fvalue = (float)PyFloat_AsDouble(value); - if (fvalue == -1 && PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, "expected a float"); - return -1; - } - IDP_Float(self->prop) = fvalue; - break; - } - case IDP_DOUBLE: - { - double dvalue = PyFloat_AsDouble(value); - if (dvalue == -1 && PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, "expected a float"); - return -1; - } - IDP_Double(self->prop) = dvalue; - break; - } - default: - PyErr_SetString(PyExc_AttributeError, "attempt to set read-only attribute!"); - return -1; - } - return 0; + switch (prop->type) { + case IDP_STRING: + { + char *st; + if (!PyUnicode_Check(value)) { + PyErr_SetString(PyExc_TypeError, "expected a string!"); + return -1; + } + /* NOTE: if this code is enabled, bytes support needs to be added */ +# ifdef USE_STRING_COERCE + { + int alloc_len; + PyObject *value_coerce = NULL; + + st = (char *)PyC_UnicodeAsByte(value, &value_coerce); + alloc_len = strlen(st) + 1; + + st = _PyUnicode_AsString(value); + IDP_ResizeArray(prop, alloc_len); + memcpy(IDP_Array(prop), st, alloc_len); + Py_XDECREF(value_coerce); + } +# else + st = _PyUnicode_AsString(value); + IDP_ResizeArray(prop, strlen(st) + 1); + strcpy(IDP_Array(prop), st); +# endif + + return 0; + } + + case IDP_INT: + { + int ivalue = PyLong_AsSsize_t(value); + if (ivalue == -1 && PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, "expected an int type"); + return -1; + } + IDP_Int(prop) = ivalue; + break; + } + case IDP_FLOAT: + { + float fvalue = (float)PyFloat_AsDouble(value); + if (fvalue == -1 && PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, "expected a float"); + return -1; + } + IDP_Float(self->prop) = fvalue; + break; + } + case IDP_DOUBLE: + { + double dvalue = PyFloat_AsDouble(value); + if (dvalue == -1 && PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, "expected a float"); + return -1; + } + IDP_Double(self->prop) = dvalue; + break; + } + default: + PyErr_SetString(PyExc_AttributeError, "attempt to set read-only attribute!"); + return -1; + } + return 0; } #endif static PyObject *BPy_IDGroup_GetName(BPy_IDProperty *self, void *UNUSED(closure)) { - return PyUnicode_FromString(self->prop->name); + return PyUnicode_FromString(self->prop->name); } static int BPy_IDGroup_SetName(BPy_IDProperty *self, PyObject *value, void *UNUSED(closure)) { - const char *name; - Py_ssize_t name_size; + const char *name; + Py_ssize_t name_size; - if (!PyUnicode_Check(value)) { - PyErr_SetString(PyExc_TypeError, "expected a string!"); - return -1; - } + if (!PyUnicode_Check(value)) { + PyErr_SetString(PyExc_TypeError, "expected a string!"); + return -1; + } - name = _PyUnicode_AsStringAndSize(value, &name_size); + name = _PyUnicode_AsStringAndSize(value, &name_size); - if (name_size > MAX_IDPROP_NAME) { - PyErr_SetString(PyExc_TypeError, "string length cannot exceed 63 characters!"); - return -1; - } + if (name_size > MAX_IDPROP_NAME) { + PyErr_SetString(PyExc_TypeError, "string length cannot exceed 63 characters!"); + return -1; + } - memcpy(self->prop->name, name, name_size); - return 0; + memcpy(self->prop->name, name, name_size); + return 0; } #if 0 static PyObject *BPy_IDGroup_GetType(BPy_IDProperty *self) { - return PyLong_FromLong(self->prop->type); + return PyLong_FromLong(self->prop->type); } #endif static PyGetSetDef BPy_IDGroup_getseters[] = { - {(char *)"name", (getter)BPy_IDGroup_GetName, (setter)BPy_IDGroup_SetName, (char *)"The name of this Group.", NULL}, - {NULL, NULL, NULL, NULL, NULL}, + {(char *)"name", + (getter)BPy_IDGroup_GetName, + (setter)BPy_IDGroup_SetName, + (char *)"The name of this Group.", + NULL}, + {NULL, NULL, NULL, NULL, NULL}, }; static Py_ssize_t BPy_IDGroup_Map_Len(BPy_IDProperty *self) { - if (self->prop->type != IDP_GROUP) { - PyErr_SetString(PyExc_TypeError, "len() of unsized object"); - return -1; - } + if (self->prop->type != IDP_GROUP) { + PyErr_SetString(PyExc_TypeError, "len() of unsized object"); + return -1; + } - return self->prop->len; + return self->prop->len; } static PyObject *BPy_IDGroup_Map_GetItem(BPy_IDProperty *self, PyObject *item) { - IDProperty *idprop; - const char *name; + IDProperty *idprop; + const char *name; - if (self->prop->type != IDP_GROUP) { - PyErr_SetString(PyExc_TypeError, "unsubscriptable object"); - return NULL; - } + if (self->prop->type != IDP_GROUP) { + PyErr_SetString(PyExc_TypeError, "unsubscriptable object"); + return NULL; + } - name = _PyUnicode_AsString(item); + name = _PyUnicode_AsString(item); - if (name == NULL) { - PyErr_SetString(PyExc_TypeError, "only strings are allowed as keys of ID properties"); - return NULL; - } + if (name == NULL) { + PyErr_SetString(PyExc_TypeError, "only strings are allowed as keys of ID properties"); + return NULL; + } - idprop = IDP_GetPropertyFromGroup(self->prop, name); + idprop = IDP_GetPropertyFromGroup(self->prop, name); - if (idprop == NULL) { - PyErr_SetString(PyExc_KeyError, "key not in subgroup dict"); - return NULL; - } + if (idprop == NULL) { + PyErr_SetString(PyExc_KeyError, "key not in subgroup dict"); + return NULL; + } - return BPy_IDGroup_WrapData(self->id, idprop, self->prop); + return BPy_IDGroup_WrapData(self->id, idprop, self->prop); } /* returns NULL on success, error string on failure */ static char idp_sequence_type(PyObject *seq_fast) { - PyObject **seq_fast_items = PySequence_Fast_ITEMS(seq_fast); - PyObject *item; - char type = IDP_INT; - - Py_ssize_t i, len = PySequence_Fast_GET_SIZE(seq_fast); - - for (i = 0; i < len; i++) { - item = seq_fast_items[i]; - if (PyFloat_Check(item)) { - if (type == IDP_IDPARRAY) { /* mixed dict/int */ - return -1; - } - type = IDP_DOUBLE; - } - else if (PyLong_Check(item)) { - if (type == IDP_IDPARRAY) { /* mixed dict/int */ - return -1; - } - } - else if (PyMapping_Check(item)) { - if (i != 0 && (type != IDP_IDPARRAY)) { /* mixed dict/int */ - return -1; - } - type = IDP_IDPARRAY; - } - else { - return -1; - } - } - - return type; + PyObject **seq_fast_items = PySequence_Fast_ITEMS(seq_fast); + PyObject *item; + char type = IDP_INT; + + Py_ssize_t i, len = PySequence_Fast_GET_SIZE(seq_fast); + + for (i = 0; i < len; i++) { + item = seq_fast_items[i]; + if (PyFloat_Check(item)) { + if (type == IDP_IDPARRAY) { /* mixed dict/int */ + return -1; + } + type = IDP_DOUBLE; + } + else if (PyLong_Check(item)) { + if (type == IDP_IDPARRAY) { /* mixed dict/int */ + return -1; + } + } + else if (PyMapping_Check(item)) { + if (i != 0 && (type != IDP_IDPARRAY)) { /* mixed dict/int */ + return -1; + } + type = IDP_IDPARRAY; + } + else { + return -1; + } + } + + return type; } static const char *idp_try_read_name(PyObject *name_obj) { - const char *name = NULL; - if (name_obj) { - Py_ssize_t name_size; - name = _PyUnicode_AsStringAndSize(name_obj, &name_size); - - if (name == NULL) { - PyErr_Format(PyExc_KeyError, - "invalid id-property key, expected a string, not a %.200s", - Py_TYPE(name_obj)->tp_name); - return NULL; - } - - if (name_size > MAX_IDPROP_NAME) { - PyErr_SetString(PyExc_KeyError, "the length of IDProperty names is limited to 63 characters"); - return NULL; - } - } - else { - name = ""; - } - return name; + const char *name = NULL; + if (name_obj) { + Py_ssize_t name_size; + name = _PyUnicode_AsStringAndSize(name_obj, &name_size); + + if (name == NULL) { + PyErr_Format(PyExc_KeyError, + "invalid id-property key, expected a string, not a %.200s", + Py_TYPE(name_obj)->tp_name); + return NULL; + } + + if (name_size > MAX_IDPROP_NAME) { + PyErr_SetString(PyExc_KeyError, + "the length of IDProperty names is limited to 63 characters"); + return NULL; + } + } + else { + name = ""; + } + return name; } /* -------------------------------------------------------------------------- */ @@ -371,285 +386,280 @@ static const char *idp_try_read_name(PyObject *name_obj) static IDProperty *idp_from_PyFloat(const char *name, PyObject *ob) { - IDPropertyTemplate val = {0}; - val.d = PyFloat_AsDouble(ob); - return IDP_New(IDP_DOUBLE, &val, name); + IDPropertyTemplate val = {0}; + val.d = PyFloat_AsDouble(ob); + return IDP_New(IDP_DOUBLE, &val, name); } static IDProperty *idp_from_PyLong(const char *name, PyObject *ob) { - IDPropertyTemplate val = {0}; - val.i = PyC_Long_AsI32(ob); - if (val.i == -1 && PyErr_Occurred()) { - return NULL; - } - return IDP_New(IDP_INT, &val, name); + IDPropertyTemplate val = {0}; + val.i = PyC_Long_AsI32(ob); + if (val.i == -1 && PyErr_Occurred()) { + return NULL; + } + return IDP_New(IDP_INT, &val, name); } static IDProperty *idp_from_PyUnicode(const char *name, PyObject *ob) { - IDProperty *prop; - IDPropertyTemplate val = {0}; + IDProperty *prop; + IDPropertyTemplate val = {0}; #ifdef USE_STRING_COERCE - Py_ssize_t value_size; - PyObject *value_coerce = NULL; - val.string.str = PyC_UnicodeAsByteAndSize(ob, &value_size, &value_coerce); - val.string.len = (int)value_size + 1; - val.string.subtype = IDP_STRING_SUB_UTF8; - prop = IDP_New(IDP_STRING, &val, name); - Py_XDECREF(value_coerce); + Py_ssize_t value_size; + PyObject *value_coerce = NULL; + val.string.str = PyC_UnicodeAsByteAndSize(ob, &value_size, &value_coerce); + val.string.len = (int)value_size + 1; + val.string.subtype = IDP_STRING_SUB_UTF8; + prop = IDP_New(IDP_STRING, &val, name); + Py_XDECREF(value_coerce); #else - val.str = _PyUnicode_AsString(ob); - prop = IDP_New(IDP_STRING, val, name); + val.str = _PyUnicode_AsString(ob); + prop = IDP_New(IDP_STRING, val, name); #endif - return prop; + return prop; } static IDProperty *idp_from_PyBytes(const char *name, PyObject *ob) { - IDPropertyTemplate val = {0}; - val.string.str = PyBytes_AS_STRING(ob); - val.string.len = PyBytes_GET_SIZE(ob); - val.string.subtype = IDP_STRING_SUB_BYTE; - return IDP_New(IDP_STRING, &val, name); + IDPropertyTemplate val = {0}; + val.string.str = PyBytes_AS_STRING(ob); + val.string.len = PyBytes_GET_SIZE(ob); + val.string.subtype = IDP_STRING_SUB_BYTE; + return IDP_New(IDP_STRING, &val, name); } static int idp_array_type_from_formatstr_and_size(const char *typestr, Py_ssize_t itemsize) { - char format = PyC_StructFmt_type_from_str(typestr); + char format = PyC_StructFmt_type_from_str(typestr); - if (PyC_StructFmt_type_is_float_any(format)) { - if (itemsize == 4) { - return IDP_FLOAT; - } - if (itemsize == 8) { - return IDP_DOUBLE; - } - } - if (PyC_StructFmt_type_is_int_any(format)) { - if (itemsize == 4) { - return IDP_INT; - } - } + if (PyC_StructFmt_type_is_float_any(format)) { + if (itemsize == 4) { + return IDP_FLOAT; + } + if (itemsize == 8) { + return IDP_DOUBLE; + } + } + if (PyC_StructFmt_type_is_int_any(format)) { + if (itemsize == 4) { + return IDP_INT; + } + } - return -1; + return -1; } static const char *idp_format_from_array_type(int type) { - if (type == IDP_INT) { - return "i"; - } - if (type == IDP_FLOAT) { - return "f"; - } - if (type == IDP_DOUBLE) { - return "d"; - } - return NULL; + if (type == IDP_INT) { + return "i"; + } + if (type == IDP_FLOAT) { + return "f"; + } + if (type == IDP_DOUBLE) { + return "d"; + } + return NULL; } static IDProperty *idp_from_PySequence_Buffer(const char *name, Py_buffer *buffer) { - IDProperty *prop; - IDPropertyTemplate val = {0}; + IDProperty *prop; + IDPropertyTemplate val = {0}; - int id_type = idp_array_type_from_formatstr_and_size(buffer->format, buffer->itemsize); - if (id_type == -1) { - /* should never happen as the type has been checked before */ - return NULL; - } - else { - val.array.type = id_type; - val.array.len = buffer->len / buffer->itemsize; - } - prop = IDP_New(IDP_ARRAY, &val, name); - memcpy(IDP_Array(prop), buffer->buf, buffer->len); - return prop; + int id_type = idp_array_type_from_formatstr_and_size(buffer->format, buffer->itemsize); + if (id_type == -1) { + /* should never happen as the type has been checked before */ + return NULL; + } + else { + val.array.type = id_type; + val.array.len = buffer->len / buffer->itemsize; + } + prop = IDP_New(IDP_ARRAY, &val, name); + memcpy(IDP_Array(prop), buffer->buf, buffer->len); + return prop; } static IDProperty *idp_from_PySequence_Fast(const char *name, PyObject *ob) { - IDProperty *prop; - IDPropertyTemplate val = {0}; - - PyObject **ob_seq_fast_items; - PyObject *item; - int i; - - ob_seq_fast_items = PySequence_Fast_ITEMS(ob); - - if ((val.array.type = idp_sequence_type(ob)) == (char)-1) { - PyErr_SetString(PyExc_TypeError, "only floats, ints and dicts are allowed in ID property arrays"); - return NULL; - } - - /* validate sequence and derive type. - * we assume IDP_INT unless we hit a float - * number; then we assume it's */ - - val.array.len = PySequence_Fast_GET_SIZE(ob); - - switch (val.array.type) { - case IDP_DOUBLE: - { - double *prop_data; - prop = IDP_New(IDP_ARRAY, &val, name); - prop_data = IDP_Array(prop); - for (i = 0; i < val.array.len; i++) { - item = ob_seq_fast_items[i]; - if (((prop_data[i] = PyFloat_AsDouble(item)) == -1.0) && PyErr_Occurred()) { - return NULL; - } - } - break; - } - case IDP_INT: - { - int *prop_data; - prop = IDP_New(IDP_ARRAY, &val, name); - prop_data = IDP_Array(prop); - for (i = 0; i < val.array.len; i++) { - item = ob_seq_fast_items[i]; - if (((prop_data[i] = PyC_Long_AsI32(item)) == -1) && PyErr_Occurred()) { - return NULL; - } - } - break; - } - case IDP_IDPARRAY: - { - prop = IDP_NewIDPArray(name); - for (i = 0; i < val.array.len; i++) { - item = ob_seq_fast_items[i]; - if (BPy_IDProperty_Map_ValidateAndCreate(NULL, prop, item) == false) { - return NULL; - } - } - break; - } - default: - /* should never happen */ - PyErr_SetString(PyExc_RuntimeError, "internal error with idp array.type"); - return NULL; - } - return prop; + IDProperty *prop; + IDPropertyTemplate val = {0}; + + PyObject **ob_seq_fast_items; + PyObject *item; + int i; + + ob_seq_fast_items = PySequence_Fast_ITEMS(ob); + + if ((val.array.type = idp_sequence_type(ob)) == (char)-1) { + PyErr_SetString(PyExc_TypeError, + "only floats, ints and dicts are allowed in ID property arrays"); + return NULL; + } + + /* validate sequence and derive type. + * we assume IDP_INT unless we hit a float + * number; then we assume it's */ + + val.array.len = PySequence_Fast_GET_SIZE(ob); + + switch (val.array.type) { + case IDP_DOUBLE: { + double *prop_data; + prop = IDP_New(IDP_ARRAY, &val, name); + prop_data = IDP_Array(prop); + for (i = 0; i < val.array.len; i++) { + item = ob_seq_fast_items[i]; + if (((prop_data[i] = PyFloat_AsDouble(item)) == -1.0) && PyErr_Occurred()) { + return NULL; + } + } + break; + } + case IDP_INT: { + int *prop_data; + prop = IDP_New(IDP_ARRAY, &val, name); + prop_data = IDP_Array(prop); + for (i = 0; i < val.array.len; i++) { + item = ob_seq_fast_items[i]; + if (((prop_data[i] = PyC_Long_AsI32(item)) == -1) && PyErr_Occurred()) { + return NULL; + } + } + break; + } + case IDP_IDPARRAY: { + prop = IDP_NewIDPArray(name); + for (i = 0; i < val.array.len; i++) { + item = ob_seq_fast_items[i]; + if (BPy_IDProperty_Map_ValidateAndCreate(NULL, prop, item) == false) { + return NULL; + } + } + break; + } + default: + /* should never happen */ + PyErr_SetString(PyExc_RuntimeError, "internal error with idp array.type"); + return NULL; + } + return prop; } - static IDProperty *idp_from_PySequence(const char *name, PyObject *ob) { - Py_buffer buffer; - bool use_buffer = false; - - if (PyObject_CheckBuffer(ob)) { - PyObject_GetBuffer(ob, &buffer, PyBUF_SIMPLE | PyBUF_FORMAT); - char format = PyC_StructFmt_type_from_str(buffer.format); - if (PyC_StructFmt_type_is_float_any(format) || - (PyC_StructFmt_type_is_int_any(format) && buffer.itemsize == 4)) - { - use_buffer = true; - } - else { - PyBuffer_Release(&buffer); - } - } - - if (use_buffer) { - IDProperty *prop = idp_from_PySequence_Buffer(name, &buffer); - PyBuffer_Release(&buffer); - return prop; - } - else { - PyObject *ob_seq_fast = PySequence_Fast(ob, "py -> idprop"); - if (ob_seq_fast != NULL) { - IDProperty *prop = idp_from_PySequence_Fast(name, ob_seq_fast); - Py_DECREF(ob_seq_fast); - return prop; - } - else { - return NULL; - } - } + Py_buffer buffer; + bool use_buffer = false; + + if (PyObject_CheckBuffer(ob)) { + PyObject_GetBuffer(ob, &buffer, PyBUF_SIMPLE | PyBUF_FORMAT); + char format = PyC_StructFmt_type_from_str(buffer.format); + if (PyC_StructFmt_type_is_float_any(format) || + (PyC_StructFmt_type_is_int_any(format) && buffer.itemsize == 4)) { + use_buffer = true; + } + else { + PyBuffer_Release(&buffer); + } + } + + if (use_buffer) { + IDProperty *prop = idp_from_PySequence_Buffer(name, &buffer); + PyBuffer_Release(&buffer); + return prop; + } + else { + PyObject *ob_seq_fast = PySequence_Fast(ob, "py -> idprop"); + if (ob_seq_fast != NULL) { + IDProperty *prop = idp_from_PySequence_Fast(name, ob_seq_fast); + Py_DECREF(ob_seq_fast); + return prop; + } + else { + return NULL; + } + } } static IDProperty *idp_from_PyMapping(const char *name, PyObject *ob) { - IDProperty *prop; - IDPropertyTemplate val = {0}; - - PyObject *keys, *vals, *key, *pval; - int i, len; - /* yay! we get into recursive stuff now! */ - keys = PyMapping_Keys(ob); - vals = PyMapping_Values(ob); - - /* we allocate the group first; if we hit any invalid data, - * we can delete it easily enough.*/ - prop = IDP_New(IDP_GROUP, &val, name); - len = PyMapping_Length(ob); - for (i = 0; i < len; i++) { - key = PySequence_GetItem(keys, i); - pval = PySequence_GetItem(vals, i); - if (BPy_IDProperty_Map_ValidateAndCreate(key, prop, pval) == false) { - IDP_FreeProperty(prop); - MEM_freeN(prop); - Py_XDECREF(keys); - Py_XDECREF(vals); - Py_XDECREF(key); - Py_XDECREF(pval); - /* error is already set */ - return NULL; - } - Py_XDECREF(key); - Py_XDECREF(pval); - } - Py_XDECREF(keys); - Py_XDECREF(vals); - return prop; + IDProperty *prop; + IDPropertyTemplate val = {0}; + + PyObject *keys, *vals, *key, *pval; + int i, len; + /* yay! we get into recursive stuff now! */ + keys = PyMapping_Keys(ob); + vals = PyMapping_Values(ob); + + /* we allocate the group first; if we hit any invalid data, + * we can delete it easily enough.*/ + prop = IDP_New(IDP_GROUP, &val, name); + len = PyMapping_Length(ob); + for (i = 0; i < len; i++) { + key = PySequence_GetItem(keys, i); + pval = PySequence_GetItem(vals, i); + if (BPy_IDProperty_Map_ValidateAndCreate(key, prop, pval) == false) { + IDP_FreeProperty(prop); + MEM_freeN(prop); + Py_XDECREF(keys); + Py_XDECREF(vals); + Py_XDECREF(key); + Py_XDECREF(pval); + /* error is already set */ + return NULL; + } + Py_XDECREF(key); + Py_XDECREF(pval); + } + Py_XDECREF(keys); + Py_XDECREF(vals); + return prop; } static IDProperty *idp_from_DatablockPointer(const char *name, PyObject *ob) { - IDPropertyTemplate val = {0}; - pyrna_id_FromPyObject(ob, &val.id); - return IDP_New(IDP_ID, &val, name); + IDPropertyTemplate val = {0}; + pyrna_id_FromPyObject(ob, &val.id); + return IDP_New(IDP_ID, &val, name); } static IDProperty *idp_from_PyObject(PyObject *name_obj, PyObject *ob) { - const char *name = idp_try_read_name(name_obj); - if (name == NULL) { - return NULL; - } - - if (PyFloat_Check(ob)) { - return idp_from_PyFloat(name, ob); - } - else if (PyLong_Check(ob)) { - return idp_from_PyLong(name, ob); - } - else if (PyUnicode_Check(ob)) { - return idp_from_PyUnicode(name, ob); - } - else if (PyBytes_Check(ob)) { - return idp_from_PyBytes(name, ob); - } - else if (PySequence_Check(ob)) { - return idp_from_PySequence(name, ob); - } - else if (ob == Py_None || pyrna_id_CheckPyObject(ob)) { - return idp_from_DatablockPointer(name, ob); - } - else if (PyMapping_Check(ob)) { - return idp_from_PyMapping(name, ob); - } - else { - PyErr_Format(PyExc_TypeError, - "invalid id-property type %.200s not supported", - Py_TYPE(ob)->tp_name); - return NULL; - } + const char *name = idp_try_read_name(name_obj); + if (name == NULL) { + return NULL; + } + + if (PyFloat_Check(ob)) { + return idp_from_PyFloat(name, ob); + } + else if (PyLong_Check(ob)) { + return idp_from_PyLong(name, ob); + } + else if (PyUnicode_Check(ob)) { + return idp_from_PyUnicode(name, ob); + } + else if (PyBytes_Check(ob)) { + return idp_from_PyBytes(name, ob); + } + else if (PySequence_Check(ob)) { + return idp_from_PySequence(name, ob); + } + else if (ob == Py_None || pyrna_id_CheckPyObject(ob)) { + return idp_from_DatablockPointer(name, ob); + } + else if (PyMapping_Check(ob)) { + return idp_from_PyMapping(name, ob); + } + else { + PyErr_Format( + PyExc_TypeError, "invalid id-property type %.200s not supported", Py_TYPE(ob)->tp_name); + return NULL; + } } /* -------------------------------------------------------------------------- */ @@ -661,1101 +671,1081 @@ static IDProperty *idp_from_PyObject(PyObject *name_obj, PyObject *ob) */ bool BPy_IDProperty_Map_ValidateAndCreate(PyObject *name_obj, IDProperty *group, PyObject *ob) { - IDProperty *prop = idp_from_PyObject(name_obj, ob); - if (prop == NULL) { - return false; - } - - if (group->type == IDP_IDPARRAY) { - IDP_AppendArray(group, prop); - /* IDP_AppendArray does a shallow copy (memcpy), only free memory */ - MEM_freeN(prop); - } - else { - IDProperty *prop_exist; - - /* avoid freeing when types match in case they are referenced by the UI, see: T37073 - * obviously this isn't a complete solution, but helps for common cases. */ - prop_exist = IDP_GetPropertyFromGroup(group, prop->name); - if ((prop_exist != NULL) && - (prop_exist->type == prop->type) && - (prop_exist->subtype == prop->subtype)) - { - /* Preserve prev/next links!!! See T42593. */ - prop->prev = prop_exist->prev; - prop->next = prop_exist->next; - - IDP_FreeProperty(prop_exist); - *prop_exist = *prop; - MEM_freeN(prop); - } - else { - IDP_ReplaceInGroup_ex(group, prop, prop_exist); - } - } - - return true; + IDProperty *prop = idp_from_PyObject(name_obj, ob); + if (prop == NULL) { + return false; + } + + if (group->type == IDP_IDPARRAY) { + IDP_AppendArray(group, prop); + /* IDP_AppendArray does a shallow copy (memcpy), only free memory */ + MEM_freeN(prop); + } + else { + IDProperty *prop_exist; + + /* avoid freeing when types match in case they are referenced by the UI, see: T37073 + * obviously this isn't a complete solution, but helps for common cases. */ + prop_exist = IDP_GetPropertyFromGroup(group, prop->name); + if ((prop_exist != NULL) && (prop_exist->type == prop->type) && + (prop_exist->subtype == prop->subtype)) { + /* Preserve prev/next links!!! See T42593. */ + prop->prev = prop_exist->prev; + prop->next = prop_exist->next; + + IDP_FreeProperty(prop_exist); + *prop_exist = *prop; + MEM_freeN(prop); + } + else { + IDP_ReplaceInGroup_ex(group, prop, prop_exist); + } + } + + return true; } int BPy_Wrap_SetMapItem(IDProperty *prop, PyObject *key, PyObject *val) { - if (prop->type != IDP_GROUP) { - PyErr_SetString(PyExc_TypeError, "unsubscriptable object"); - return -1; - } - - if (val == NULL) { /* del idprop[key] */ - IDProperty *pkey; - const char *name = _PyUnicode_AsString(key); - - if (name == NULL) { - PyErr_Format(PyExc_KeyError, - "expected a string, not %.200s", - Py_TYPE(key)->tp_name); - return -1; - } - - pkey = IDP_GetPropertyFromGroup(prop, name); - if (pkey) { - IDP_FreeFromGroup(prop, pkey); - return 0; - } - else { - PyErr_SetString(PyExc_KeyError, "property not found in group"); - return -1; - } - } - else { - bool ok; - - ok = BPy_IDProperty_Map_ValidateAndCreate(key, prop, val); - if (ok == false) { - return -1; - } - - return 0; - } + if (prop->type != IDP_GROUP) { + PyErr_SetString(PyExc_TypeError, "unsubscriptable object"); + return -1; + } + + if (val == NULL) { /* del idprop[key] */ + IDProperty *pkey; + const char *name = _PyUnicode_AsString(key); + + if (name == NULL) { + PyErr_Format(PyExc_KeyError, "expected a string, not %.200s", Py_TYPE(key)->tp_name); + return -1; + } + + pkey = IDP_GetPropertyFromGroup(prop, name); + if (pkey) { + IDP_FreeFromGroup(prop, pkey); + return 0; + } + else { + PyErr_SetString(PyExc_KeyError, "property not found in group"); + return -1; + } + } + else { + bool ok; + + ok = BPy_IDProperty_Map_ValidateAndCreate(key, prop, val); + if (ok == false) { + return -1; + } + + return 0; + } } static int BPy_IDGroup_Map_SetItem(BPy_IDProperty *self, PyObject *key, PyObject *val) { - return BPy_Wrap_SetMapItem(self->prop, key, val); + return BPy_Wrap_SetMapItem(self->prop, key, val); } static PyObject *BPy_IDGroup_iter(BPy_IDProperty *self) { - BPy_IDGroup_Iter *iter = PyObject_New(BPy_IDGroup_Iter, &BPy_IDGroup_Iter_Type); - iter->group = self; - iter->mode = IDPROP_ITER_KEYS; - iter->cur = self->prop->data.group.first; - Py_XINCREF(iter); - return (PyObject *)iter; + BPy_IDGroup_Iter *iter = PyObject_New(BPy_IDGroup_Iter, &BPy_IDGroup_Iter_Type); + iter->group = self; + iter->mode = IDPROP_ITER_KEYS; + iter->cur = self->prop->data.group.first; + Py_XINCREF(iter); + return (PyObject *)iter; } /* 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_ID: - return idprop_py_from_idp_id(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: - { - const 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: - { - const 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: - { - const 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); - 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++) { - PyObject *wrap = BPy_IDGroup_MapDataToPy(array++); - - /* BPy_IDGroup_MapDataToPy sets the error */ - if (UNLIKELY(wrap == NULL)) { - Py_DECREF(seq); - return NULL; - } - - PyList_SET_ITEM(seq, i, wrap); - } - return seq; - } - case IDP_GROUP: - { - PyObject *dict = _PyDict_NewPresized(prop->len); - IDProperty *loop; - - for (loop = prop->data.group.first; loop; loop = loop->next) { - PyObject *wrap = BPy_IDGroup_MapDataToPy(loop); - - /* BPy_IDGroup_MapDataToPy sets the error */ - if (UNLIKELY(wrap == NULL)) { - Py_DECREF(dict); - 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; -} - -PyDoc_STRVAR(BPy_IDGroup_pop_doc, -".. method:: pop(key, default)\n" -"\n" -" Remove an item from the group, returning a Python representation.\n" -"\n" -" :raises KeyError: When the item doesn't exist.\n" -"\n" -" :arg key: Name of item to remove.\n" -" :type key: string\n" -" :arg default: Value to return when key isn't found, otherwise raise an exception.\n" -" :type default: Undefined\n" -); + 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_ID: + return idprop_py_from_idp_id(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: { + const 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: { + const 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: { + const 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); + 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++) { + PyObject *wrap = BPy_IDGroup_MapDataToPy(array++); + + /* BPy_IDGroup_MapDataToPy sets the error */ + if (UNLIKELY(wrap == NULL)) { + Py_DECREF(seq); + return NULL; + } + + PyList_SET_ITEM(seq, i, wrap); + } + return seq; + } + case IDP_GROUP: { + PyObject *dict = _PyDict_NewPresized(prop->len); + IDProperty *loop; + + for (loop = prop->data.group.first; loop; loop = loop->next) { + PyObject *wrap = BPy_IDGroup_MapDataToPy(loop); + + /* BPy_IDGroup_MapDataToPy sets the error */ + if (UNLIKELY(wrap == NULL)) { + Py_DECREF(dict); + 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; +} + +PyDoc_STRVAR( + BPy_IDGroup_pop_doc, + ".. method:: pop(key, default)\n" + "\n" + " Remove an item from the group, returning a Python representation.\n" + "\n" + " :raises KeyError: When the item doesn't exist.\n" + "\n" + " :arg key: Name of item to remove.\n" + " :type key: string\n" + " :arg default: Value to return when key isn't found, otherwise raise an exception.\n" + " :type default: Undefined\n"); 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; -} - -PyDoc_STRVAR(BPy_IDGroup_iter_items_doc, -".. method:: iteritems()\n" -"\n" -" Iterate through the items in the dict; behaves like dictionary method iteritems.\n" -); + 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; +} + +PyDoc_STRVAR( + BPy_IDGroup_iter_items_doc, + ".. method:: iteritems()\n" + "\n" + " Iterate through the items in the dict; behaves like dictionary method iteritems.\n"); static PyObject *BPy_IDGroup_iter_items(BPy_IDProperty *self) { - BPy_IDGroup_Iter *iter = PyObject_New(BPy_IDGroup_Iter, &BPy_IDGroup_Iter_Type); - iter->group = self; - iter->mode = IDPROP_ITER_ITEMS; - iter->cur = self->prop->data.group.first; - Py_XINCREF(iter); - return (PyObject *)iter; + BPy_IDGroup_Iter *iter = PyObject_New(BPy_IDGroup_Iter, &BPy_IDGroup_Iter_Type); + iter->group = self; + iter->mode = IDPROP_ITER_ITEMS; + iter->cur = self->prop->data.group.first; + Py_XINCREF(iter); + return (PyObject *)iter; } /* utility function */ static void BPy_IDGroup_CorrectListLen(IDProperty *prop, PyObject *seq, int len, const char *func) { - int j; + int j; - printf("%s: ID Property Error found and corrected!\n", func); + printf("%s: ID Property Error found and corrected!\n", func); - /* fill rest of list with valid references to None */ - for (j = len; j < prop->len; j++) { - PyList_SET_ITEM(seq, j, Py_INCREF_RET(Py_None)); - } + /* fill rest of list with valid references to None */ + for (j = len; j < prop->len; j++) { + PyList_SET_ITEM(seq, j, Py_INCREF_RET(Py_None)); + } - /*set correct group length*/ - prop->len = len; + /*set correct group length*/ + prop->len = len; } PyObject *BPy_Wrap_GetKeys(IDProperty *prop) { - PyObject *list = PyList_New(prop->len); - IDProperty *loop; - int i; + PyObject *list = PyList_New(prop->len); + IDProperty *loop; + int i; - for (i = 0, loop = prop->data.group.first; loop && (i < prop->len); loop = loop->next, i++) { - PyList_SET_ITEM(list, i, PyUnicode_FromString(loop->name)); - } + for (i = 0, loop = prop->data.group.first; loop && (i < prop->len); loop = loop->next, i++) { + PyList_SET_ITEM(list, i, PyUnicode_FromString(loop->name)); + } - /* if the id prop is corrupt, count the remaining */ - for ( ; loop; loop = loop->next, i++) { - /* pass */ - } + /* if the id prop is corrupt, count the remaining */ + for (; loop; loop = loop->next, i++) { + /* pass */ + } - if (i != prop->len) { /* if the loop didn't finish, we know the length is wrong */ - BPy_IDGroup_CorrectListLen(prop, list, i, __func__); - Py_DECREF(list); /*free the list*/ - /*call self again*/ - return BPy_Wrap_GetKeys(prop); - } + if (i != prop->len) { /* if the loop didn't finish, we know the length is wrong */ + BPy_IDGroup_CorrectListLen(prop, list, i, __func__); + Py_DECREF(list); /*free the list*/ + /*call self again*/ + return BPy_Wrap_GetKeys(prop); + } - return list; + return list; } PyObject *BPy_Wrap_GetValues(ID *id, IDProperty *prop) { - PyObject *list = PyList_New(prop->len); - IDProperty *loop; - int i; + PyObject *list = PyList_New(prop->len); + IDProperty *loop; + int i; - for (i = 0, loop = prop->data.group.first; loop; loop = loop->next, i++) { - PyList_SET_ITEM(list, i, BPy_IDGroup_WrapData(id, loop, prop)); - } + for (i = 0, loop = prop->data.group.first; loop; loop = loop->next, i++) { + PyList_SET_ITEM(list, i, BPy_IDGroup_WrapData(id, loop, prop)); + } - if (i != prop->len) { - BPy_IDGroup_CorrectListLen(prop, list, i, __func__); - Py_DECREF(list); /*free the list*/ - /*call self again*/ - return BPy_Wrap_GetValues(id, prop); - } + if (i != prop->len) { + BPy_IDGroup_CorrectListLen(prop, list, i, __func__); + Py_DECREF(list); /*free the list*/ + /*call self again*/ + return BPy_Wrap_GetValues(id, prop); + } - return list; + return list; } PyObject *BPy_Wrap_GetItems(ID *id, IDProperty *prop) { - PyObject *seq = PyList_New(prop->len); - IDProperty *loop; - int i; + PyObject *seq = PyList_New(prop->len); + IDProperty *loop; + int i; - for (i = 0, loop = prop->data.group.first; loop; loop = loop->next, i++) { - PyObject *item = PyTuple_New(2); - PyTuple_SET_ITEMS(item, - PyUnicode_FromString(loop->name), - BPy_IDGroup_WrapData(id, loop, prop)); - PyList_SET_ITEM(seq, i, item); - } + for (i = 0, loop = prop->data.group.first; loop; loop = loop->next, i++) { + PyObject *item = PyTuple_New(2); + PyTuple_SET_ITEMS( + item, PyUnicode_FromString(loop->name), BPy_IDGroup_WrapData(id, loop, prop)); + PyList_SET_ITEM(seq, i, item); + } - if (i != prop->len) { - BPy_IDGroup_CorrectListLen(prop, seq, i, __func__); - Py_DECREF(seq); /*free the list*/ - /*call self again*/ - return BPy_Wrap_GetItems(id, prop); - } + if (i != prop->len) { + BPy_IDGroup_CorrectListLen(prop, seq, i, __func__); + Py_DECREF(seq); /*free the list*/ + /*call self again*/ + return BPy_Wrap_GetItems(id, prop); + } - return seq; + return seq; } PyDoc_STRVAR(BPy_IDGroup_keys_doc, -".. method:: keys()\n" -"\n" -" Return the keys associated with this group as a list of strings.\n" -); + ".. method:: keys()\n" + "\n" + " Return the keys associated with this group as a list of strings.\n"); static PyObject *BPy_IDGroup_keys(BPy_IDProperty *self) { - return BPy_Wrap_GetKeys(self->prop); + return BPy_Wrap_GetKeys(self->prop); } PyDoc_STRVAR(BPy_IDGroup_values_doc, -".. method:: values()\n" -"\n" -" Return the values associated with this group.\n" -); + ".. method:: values()\n" + "\n" + " Return the values associated with this group.\n"); static PyObject *BPy_IDGroup_values(BPy_IDProperty *self) { - return BPy_Wrap_GetValues(self->id, self->prop); + return BPy_Wrap_GetValues(self->id, self->prop); } PyDoc_STRVAR(BPy_IDGroup_items_doc, -".. method:: items()\n" -"\n" -" Return the items associated with this group.\n" -); + ".. method:: items()\n" + "\n" + " Return the items associated with this group.\n"); static PyObject *BPy_IDGroup_items(BPy_IDProperty *self) { - return BPy_Wrap_GetItems(self->id, self->prop); + return BPy_Wrap_GetItems(self->id, self->prop); } static int BPy_IDGroup_Contains(BPy_IDProperty *self, PyObject *value) { - const char *name = _PyUnicode_AsString(value); + const char *name = _PyUnicode_AsString(value); - if (!name) { - PyErr_Format(PyExc_TypeError, - "expected a string, not a %.200s", - Py_TYPE(value)->tp_name); - return -1; - } + if (!name) { + PyErr_Format(PyExc_TypeError, "expected a string, not a %.200s", Py_TYPE(value)->tp_name); + return -1; + } - return IDP_GetPropertyFromGroup(self->prop, name) ? 1 : 0; + return IDP_GetPropertyFromGroup(self->prop, name) ? 1 : 0; } PyDoc_STRVAR(BPy_IDGroup_update_doc, -".. method:: update(other)\n" -"\n" -" Update key, values.\n" -"\n" -" :arg other: Updates the values in the group with this.\n" -" :type other: :class:`IDPropertyGroup` or dict\n" -); + ".. method:: update(other)\n" + "\n" + " Update key, values.\n" + "\n" + " :arg other: Updates the values in the group with this.\n" + " :type other: :class:`IDPropertyGroup` or dict\n"); static PyObject *BPy_IDGroup_update(BPy_IDProperty *self, PyObject *value) { - PyObject *pkey, *pval; - Py_ssize_t i = 0; - - if (BPy_IDGroup_Check(value)) { - BPy_IDProperty *other = (BPy_IDProperty *)value; - if (UNLIKELY(self->prop == other->prop)) { - Py_RETURN_NONE; - } - - /* XXX, possible one is inside the other */ - IDP_MergeGroup(self->prop, other->prop, true); - } - else if (PyDict_Check(value)) { - while (PyDict_Next(value, &i, &pkey, &pval)) { - BPy_IDGroup_Map_SetItem(self, pkey, pval); - if (PyErr_Occurred()) { - return NULL; - } - } - } - else { - PyErr_Format(PyExc_TypeError, - "expected a dict or an IDPropertyGroup type, not a %.200s", - Py_TYPE(value)->tp_name); - return NULL; - } - - - Py_RETURN_NONE; + PyObject *pkey, *pval; + Py_ssize_t i = 0; + + if (BPy_IDGroup_Check(value)) { + BPy_IDProperty *other = (BPy_IDProperty *)value; + if (UNLIKELY(self->prop == other->prop)) { + Py_RETURN_NONE; + } + + /* XXX, possible one is inside the other */ + IDP_MergeGroup(self->prop, other->prop, true); + } + else if (PyDict_Check(value)) { + while (PyDict_Next(value, &i, &pkey, &pval)) { + BPy_IDGroup_Map_SetItem(self, pkey, pval); + if (PyErr_Occurred()) { + return NULL; + } + } + } + else { + PyErr_Format(PyExc_TypeError, + "expected a dict or an IDPropertyGroup type, not a %.200s", + Py_TYPE(value)->tp_name); + return NULL; + } + + Py_RETURN_NONE; } PyDoc_STRVAR(BPy_IDGroup_to_dict_doc, -".. method:: to_dict()\n" -"\n" -" Return a purely python version of the group.\n" -); + ".. method:: to_dict()\n" + "\n" + " Return a purely python version of the group.\n"); static PyObject *BPy_IDGroup_to_dict(BPy_IDProperty *self) { - return BPy_IDGroup_MapDataToPy(self->prop); + return BPy_IDGroup_MapDataToPy(self->prop); } PyDoc_STRVAR(BPy_IDGroup_clear_doc, -".. method:: clear()\n" -"\n" -" Clear all members from this group.\n" -); + ".. method:: clear()\n" + "\n" + " Clear all members from this group.\n"); static PyObject *BPy_IDGroup_clear(BPy_IDProperty *self) { - IDP_ClearProperty(self->prop); - Py_RETURN_NONE; + IDP_ClearProperty(self->prop); + Py_RETURN_NONE; } PyDoc_STRVAR(BPy_IDGroup_get_doc, -".. method:: get(key, default=None)\n" -"\n" -" Return the value for key, if it exists, else default.\n" -); + ".. method:: get(key, default=None)\n" + "\n" + " Return the value for key, if it exists, else default.\n"); static PyObject *BPy_IDGroup_get(BPy_IDProperty *self, PyObject *args) { - IDProperty *idprop; - const char *key; - PyObject *def = Py_None; + IDProperty *idprop; + const char *key; + PyObject *def = Py_None; - if (!PyArg_ParseTuple(args, "s|O:get", &key, &def)) { - return NULL; - } + if (!PyArg_ParseTuple(args, "s|O:get", &key, &def)) { + return NULL; + } - idprop = IDP_GetPropertyFromGroup(self->prop, key); - if (idprop) { - PyObject *pyobj = BPy_IDGroup_WrapData(self->id, idprop, self->prop); - if (pyobj) { - return pyobj; - } - } + idprop = IDP_GetPropertyFromGroup(self->prop, key); + if (idprop) { + PyObject *pyobj = BPy_IDGroup_WrapData(self->id, idprop, self->prop); + if (pyobj) { + return pyobj; + } + } - Py_INCREF(def); - return def; + Py_INCREF(def); + return def; } static struct PyMethodDef BPy_IDGroup_methods[] = { - {"pop", (PyCFunction)BPy_IDGroup_pop, METH_VARARGS, BPy_IDGroup_pop_doc}, - {"iteritems", (PyCFunction)BPy_IDGroup_iter_items, METH_NOARGS, BPy_IDGroup_iter_items_doc}, - {"keys", (PyCFunction)BPy_IDGroup_keys, METH_NOARGS, BPy_IDGroup_keys_doc}, - {"values", (PyCFunction)BPy_IDGroup_values, METH_NOARGS, BPy_IDGroup_values_doc}, - {"items", (PyCFunction)BPy_IDGroup_items, METH_NOARGS, BPy_IDGroup_items_doc}, - {"update", (PyCFunction)BPy_IDGroup_update, METH_O, BPy_IDGroup_update_doc}, - {"get", (PyCFunction)BPy_IDGroup_get, METH_VARARGS, BPy_IDGroup_get_doc}, - {"to_dict", (PyCFunction)BPy_IDGroup_to_dict, METH_NOARGS, BPy_IDGroup_to_dict_doc}, - {"clear", (PyCFunction)BPy_IDGroup_clear, METH_NOARGS, BPy_IDGroup_clear_doc}, - {NULL, NULL, 0, NULL}, + {"pop", (PyCFunction)BPy_IDGroup_pop, METH_VARARGS, BPy_IDGroup_pop_doc}, + {"iteritems", (PyCFunction)BPy_IDGroup_iter_items, METH_NOARGS, BPy_IDGroup_iter_items_doc}, + {"keys", (PyCFunction)BPy_IDGroup_keys, METH_NOARGS, BPy_IDGroup_keys_doc}, + {"values", (PyCFunction)BPy_IDGroup_values, METH_NOARGS, BPy_IDGroup_values_doc}, + {"items", (PyCFunction)BPy_IDGroup_items, METH_NOARGS, BPy_IDGroup_items_doc}, + {"update", (PyCFunction)BPy_IDGroup_update, METH_O, BPy_IDGroup_update_doc}, + {"get", (PyCFunction)BPy_IDGroup_get, METH_VARARGS, BPy_IDGroup_get_doc}, + {"to_dict", (PyCFunction)BPy_IDGroup_to_dict, METH_NOARGS, BPy_IDGroup_to_dict_doc}, + {"clear", (PyCFunction)BPy_IDGroup_clear, METH_NOARGS, BPy_IDGroup_clear_doc}, + {NULL, NULL, 0, NULL}, }; static PySequenceMethods BPy_IDGroup_Seq = { - (lenfunc) BPy_IDGroup_Map_Len, /* lenfunc sq_length */ - NULL, /* binaryfunc sq_concat */ - NULL, /* ssizeargfunc sq_repeat */ - NULL, /* ssizeargfunc sq_item */ /* TODO - setting this will allow PySequence_Check to return True */ - NULL, /* intintargfunc ***was_sq_slice*** */ - NULL, /* intobjargproc sq_ass_item */ - NULL, /* ssizeobjargproc ***was_sq_ass_slice*** */ - (objobjproc) BPy_IDGroup_Contains, /* objobjproc sq_contains */ - NULL, /* binaryfunc sq_inplace_concat */ - NULL, /* ssizeargfunc sq_inplace_repeat */ + (lenfunc)BPy_IDGroup_Map_Len, /* lenfunc sq_length */ + NULL, /* binaryfunc sq_concat */ + NULL, /* ssizeargfunc sq_repeat */ + NULL, + /* ssizeargfunc sq_item */ /* TODO - setting this will allow PySequence_Check to return True */ + NULL, /* intintargfunc ***was_sq_slice*** */ + NULL, /* intobjargproc sq_ass_item */ + NULL, /* ssizeobjargproc ***was_sq_ass_slice*** */ + (objobjproc)BPy_IDGroup_Contains, /* objobjproc sq_contains */ + NULL, /* binaryfunc sq_inplace_concat */ + NULL, /* ssizeargfunc sq_inplace_repeat */ }; static PyMappingMethods BPy_IDGroup_Mapping = { - (lenfunc)BPy_IDGroup_Map_Len, /*inquiry mp_length */ - (binaryfunc)BPy_IDGroup_Map_GetItem, /*binaryfunc mp_subscript */ - (objobjargproc)BPy_IDGroup_Map_SetItem, /*objobjargproc mp_ass_subscript */ + (lenfunc)BPy_IDGroup_Map_Len, /*inquiry mp_length */ + (binaryfunc)BPy_IDGroup_Map_GetItem, /*binaryfunc mp_subscript */ + (objobjargproc)BPy_IDGroup_Map_SetItem, /*objobjargproc mp_ass_subscript */ }; PyTypeObject BPy_IDGroup_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - /* For printing, in format "<module>.<name>" */ - "IDPropertyGroup", /* char *tp_name; */ - sizeof(BPy_IDProperty), /* int tp_basicsize; */ - 0, /* tp_itemsize; For allocation */ - - /* Methods to implement standard operations */ - - NULL, /* destructor tp_dealloc; */ - NULL, /* printfunc tp_print; */ - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ - NULL, /* cmpfunc tp_compare; */ - (reprfunc)BPy_IDGroup_repr, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - &BPy_IDGroup_Seq, /* PySequenceMethods *tp_as_sequence; */ - &BPy_IDGroup_Mapping, /* PyMappingMethods *tp_as_mapping; */ - - /* More standard operations (here for binary compatibility) */ - - (hashfunc)BPy_IDGroup_hash, /* hashfunc tp_hash; */ - NULL, /* ternaryfunc tp_call; */ - NULL, /* reprfunc tp_str; */ - NULL, /* getattrofunc tp_getattro; */ - NULL, /* setattrofunc tp_setattro; */ - - /* Functions to access object as input/output buffer */ - NULL, /* PyBufferProcs *tp_as_buffer; */ - - /*** Flags to define presence of optional/expanded features ***/ - Py_TPFLAGS_DEFAULT, /* long tp_flags; */ - - NULL, /* char *tp_doc; Documentation string */ - /*** Assigned meaning in release 2.0 ***/ - /* call function for all accessible objects */ - NULL, /* traverseproc tp_traverse; */ - - /* delete references to contained objects */ - NULL, /* inquiry tp_clear; */ - - /*** Assigned meaning in release 2.1 ***/ - /*** rich comparisons ***/ - NULL, /* richcmpfunc tp_richcompare; */ - - /*** weak reference enabler ***/ - 0, /* long tp_weaklistoffset; */ - - /*** Added in release 2.2 ***/ - /* Iterators */ - (getiterfunc)BPy_IDGroup_iter, /* getiterfunc tp_iter; */ - NULL, /* iternextfunc tp_iternext; */ - /*** Attribute descriptor and subclassing stuff ***/ - BPy_IDGroup_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_IDGroup_getseters, /* struct PyGetSetDef *tp_getset; */ + PyVarObject_HEAD_INIT(NULL, 0) + /* For printing, in format "<module>.<name>" */ + "IDPropertyGroup", /* char *tp_name; */ + sizeof(BPy_IDProperty), /* int tp_basicsize; */ + 0, /* tp_itemsize; For allocation */ + + /* Methods to implement standard operations */ + + NULL, /* destructor tp_dealloc; */ + NULL, /* printfunc tp_print; */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ + NULL, /* cmpfunc tp_compare; */ + (reprfunc)BPy_IDGroup_repr, /* reprfunc tp_repr; */ + + /* Method suites for standard classes */ + + NULL, /* PyNumberMethods *tp_as_number; */ + &BPy_IDGroup_Seq, /* PySequenceMethods *tp_as_sequence; */ + &BPy_IDGroup_Mapping, /* PyMappingMethods *tp_as_mapping; */ + + /* More standard operations (here for binary compatibility) */ + + (hashfunc)BPy_IDGroup_hash, /* hashfunc tp_hash; */ + NULL, /* ternaryfunc tp_call; */ + NULL, /* reprfunc tp_str; */ + NULL, /* getattrofunc tp_getattro; */ + NULL, /* setattrofunc tp_setattro; */ + + /* Functions to access object as input/output buffer */ + NULL, /* PyBufferProcs *tp_as_buffer; */ + + /*** Flags to define presence of optional/expanded features ***/ + Py_TPFLAGS_DEFAULT, /* long tp_flags; */ + + NULL, /* char *tp_doc; Documentation string */ + /*** Assigned meaning in release 2.0 ***/ + /* call function for all accessible objects */ + NULL, /* traverseproc tp_traverse; */ + + /* delete references to contained objects */ + NULL, /* inquiry tp_clear; */ + + /*** Assigned meaning in release 2.1 ***/ + /*** rich comparisons ***/ + NULL, /* richcmpfunc tp_richcompare; */ + + /*** weak reference enabler ***/ + 0, /* long tp_weaklistoffset; */ + + /*** Added in release 2.2 ***/ + /* Iterators */ + (getiterfunc)BPy_IDGroup_iter, /* getiterfunc tp_iter; */ + NULL, /* iternextfunc tp_iternext; */ + /*** Attribute descriptor and subclassing stuff ***/ + BPy_IDGroup_methods, /* struct PyMethodDef *tp_methods; */ + NULL, /* struct PyMemberDef *tp_members; */ + BPy_IDGroup_getseters, /* struct PyGetSetDef *tp_getset; */ }; /********Array Wrapper********/ static PyTypeObject *idp_array_py_type(BPy_IDArray *self, bool *r_is_double) { - switch (self->prop->subtype) { - case IDP_FLOAT: - *r_is_double = false; - return &PyFloat_Type; - case IDP_DOUBLE: - *r_is_double = true; - return &PyFloat_Type; - case IDP_INT: - *r_is_double = false; - return &PyLong_Type; - default: - *r_is_double = false; - return NULL; - } + switch (self->prop->subtype) { + case IDP_FLOAT: + *r_is_double = false; + return &PyFloat_Type; + case IDP_DOUBLE: + *r_is_double = true; + return &PyFloat_Type; + case IDP_INT: + *r_is_double = false; + return &PyLong_Type; + default: + *r_is_double = false; + return NULL; + } } static PyObject *BPy_IDArray_repr(BPy_IDArray *self) { - return PyUnicode_FromFormat("<bpy id property array [%d]>", self->prop->len); + return PyUnicode_FromFormat("<bpy id property array [%d]>", self->prop->len); } PyDoc_STRVAR(BPy_IDArray_get_typecode_doc, -"The type of the data in the array {'f': float, 'd': double, 'i': int}." -); + "The type of the data in the array {'f': float, 'd': double, 'i': int}."); static PyObject *BPy_IDArray_get_typecode(BPy_IDArray *self) { - switch (self->prop->subtype) { - case IDP_FLOAT: return PyUnicode_FromString("f"); - case IDP_DOUBLE: return PyUnicode_FromString("d"); - case IDP_INT: return PyUnicode_FromString("i"); - } + switch (self->prop->subtype) { + case IDP_FLOAT: + return PyUnicode_FromString("f"); + case IDP_DOUBLE: + return PyUnicode_FromString("d"); + case IDP_INT: + return PyUnicode_FromString("i"); + } - PyErr_Format(PyExc_RuntimeError, - "%s: invalid/corrupt array type '%d'!", - __func__, self->prop->subtype); + PyErr_Format( + PyExc_RuntimeError, "%s: invalid/corrupt array type '%d'!", __func__, self->prop->subtype); - return NULL; + return NULL; } static PyGetSetDef BPy_IDArray_getseters[] = { - /* matches pythons array.typecode */ - {(char *)"typecode", (getter)BPy_IDArray_get_typecode, (setter)NULL, BPy_IDArray_get_typecode_doc, NULL}, - {NULL, NULL, NULL, NULL, NULL}, + /* matches pythons array.typecode */ + {(char *)"typecode", + (getter)BPy_IDArray_get_typecode, + (setter)NULL, + BPy_IDArray_get_typecode_doc, + NULL}, + {NULL, NULL, NULL, NULL, NULL}, }; PyDoc_STRVAR(BPy_IDArray_to_list_doc, -".. method:: to_list()\n" -"\n" -" Return the array as a list.\n" -); + ".. method:: to_list()\n" + "\n" + " Return the array as a list.\n"); static PyObject *BPy_IDArray_to_list(BPy_IDArray *self) { - return BPy_IDGroup_MapDataToPy(self->prop); + return BPy_IDGroup_MapDataToPy(self->prop); } static PyMethodDef BPy_IDArray_methods[] = { - {"to_list", (PyCFunction)BPy_IDArray_to_list, METH_NOARGS, BPy_IDArray_to_list_doc}, - {NULL, NULL, 0, NULL}, + {"to_list", (PyCFunction)BPy_IDArray_to_list, METH_NOARGS, BPy_IDArray_to_list_doc}, + {NULL, NULL, 0, NULL}, }; static int BPy_IDArray_Len(BPy_IDArray *self) { - return self->prop->len; + return self->prop->len; } static PyObject *BPy_IDArray_GetItem(BPy_IDArray *self, int index) { - if (index < 0 || index >= self->prop->len) { - PyErr_SetString(PyExc_IndexError, "index out of range!"); - return NULL; - } + if (index < 0 || index >= self->prop->len) { + PyErr_SetString(PyExc_IndexError, "index out of range!"); + return NULL; + } - switch (self->prop->subtype) { - case IDP_FLOAT: - return PyFloat_FromDouble(((float *)IDP_Array(self->prop))[index]); - case IDP_DOUBLE: - return PyFloat_FromDouble(((double *)IDP_Array(self->prop))[index]); - case IDP_INT: - return PyLong_FromLong((long)((int *)IDP_Array(self->prop))[index]); - } + switch (self->prop->subtype) { + case IDP_FLOAT: + return PyFloat_FromDouble(((float *)IDP_Array(self->prop))[index]); + case IDP_DOUBLE: + return PyFloat_FromDouble(((double *)IDP_Array(self->prop))[index]); + case IDP_INT: + return PyLong_FromLong((long)((int *)IDP_Array(self->prop))[index]); + } - PyErr_Format(PyExc_RuntimeError, - "%s: invalid/corrupt array type '%d'!", - __func__, self->prop->subtype); + PyErr_Format( + PyExc_RuntimeError, "%s: invalid/corrupt array type '%d'!", __func__, self->prop->subtype); - return NULL; + return NULL; } static int BPy_IDArray_SetItem(BPy_IDArray *self, int index, PyObject *value) { - if (index < 0 || index >= self->prop->len) { - PyErr_SetString(PyExc_RuntimeError, "index out of range!"); - return -1; - } - - switch (self->prop->subtype) { - case IDP_FLOAT: - { - const float f = (float)PyFloat_AsDouble(value); - if (f == -1 && PyErr_Occurred()) { - return -1; - } - ((float *)IDP_Array(self->prop))[index] = f; - break; - } - case IDP_DOUBLE: - { - const double d = PyFloat_AsDouble(value); - if (d == -1 && PyErr_Occurred()) { - return -1; - } - ((double *)IDP_Array(self->prop))[index] = d; - break; - } - case IDP_INT: - { - const int i = PyC_Long_AsI32(value); - if (i == -1 && PyErr_Occurred()) { - return -1; - } - - ((int *)IDP_Array(self->prop))[index] = i; - break; - } - } - return 0; + if (index < 0 || index >= self->prop->len) { + PyErr_SetString(PyExc_RuntimeError, "index out of range!"); + return -1; + } + + switch (self->prop->subtype) { + case IDP_FLOAT: { + const float f = (float)PyFloat_AsDouble(value); + if (f == -1 && PyErr_Occurred()) { + return -1; + } + ((float *)IDP_Array(self->prop))[index] = f; + break; + } + case IDP_DOUBLE: { + const double d = PyFloat_AsDouble(value); + if (d == -1 && PyErr_Occurred()) { + return -1; + } + ((double *)IDP_Array(self->prop))[index] = d; + break; + } + case IDP_INT: { + const int i = PyC_Long_AsI32(value); + if (i == -1 && PyErr_Occurred()) { + return -1; + } + + ((int *)IDP_Array(self->prop))[index] = i; + break; + } + } + return 0; } static PySequenceMethods BPy_IDArray_Seq = { - (lenfunc) BPy_IDArray_Len, /* inquiry sq_length */ - NULL, /* binaryfunc sq_concat */ - NULL, /* intargfunc sq_repeat */ - (ssizeargfunc)BPy_IDArray_GetItem, /* intargfunc sq_item */ - NULL, /* intintargfunc sq_slice */ - (ssizeobjargproc)BPy_IDArray_SetItem, /* intobjargproc sq_ass_item */ - NULL, /* intintobjargproc sq_ass_slice */ - NULL, /* objobjproc sq_contains */ - /* Added in release 2.0 */ - NULL, /* binaryfunc sq_inplace_concat */ - NULL, /* intargfunc sq_inplace_repeat */ + (lenfunc)BPy_IDArray_Len, /* inquiry sq_length */ + NULL, /* binaryfunc sq_concat */ + NULL, /* intargfunc sq_repeat */ + (ssizeargfunc)BPy_IDArray_GetItem, /* intargfunc sq_item */ + NULL, /* intintargfunc sq_slice */ + (ssizeobjargproc)BPy_IDArray_SetItem, /* intobjargproc sq_ass_item */ + NULL, /* intintobjargproc sq_ass_slice */ + NULL, /* objobjproc sq_contains */ + /* Added in release 2.0 */ + NULL, /* binaryfunc sq_inplace_concat */ + NULL, /* intargfunc sq_inplace_repeat */ }; - - /* sequence slice (get): idparr[a:b] */ static PyObject *BPy_IDArray_slice(BPy_IDArray *self, int begin, int end) { - IDProperty *prop = self->prop; - PyObject *tuple; - int count; - - CLAMP(begin, 0, prop->len); - if (end < 0) { - end = prop->len + end + 1; - } - CLAMP(end, 0, prop->len); - begin = MIN2(begin, end); - - tuple = PyTuple_New(end - begin); - - switch (prop->subtype) { - case IDP_FLOAT: - { - const float *array = (float *)IDP_Array(prop); - for (count = begin; count < end; count++) { - PyTuple_SET_ITEM(tuple, count - begin, PyFloat_FromDouble(array[count])); - } - break; - } - case IDP_DOUBLE: - { - const double *array = (double *)IDP_Array(prop); - for (count = begin; count < end; count++) { - PyTuple_SET_ITEM(tuple, count - begin, PyFloat_FromDouble(array[count])); - } - break; - } - case IDP_INT: - { - const int *array = (int *)IDP_Array(prop); - for (count = begin; count < end; count++) { - PyTuple_SET_ITEM(tuple, count - begin, PyLong_FromLong(array[count])); - } - break; - } - } - - return tuple; + IDProperty *prop = self->prop; + PyObject *tuple; + int count; + + CLAMP(begin, 0, prop->len); + if (end < 0) { + end = prop->len + end + 1; + } + CLAMP(end, 0, prop->len); + begin = MIN2(begin, end); + + tuple = PyTuple_New(end - begin); + + switch (prop->subtype) { + case IDP_FLOAT: { + const float *array = (float *)IDP_Array(prop); + for (count = begin; count < end; count++) { + PyTuple_SET_ITEM(tuple, count - begin, PyFloat_FromDouble(array[count])); + } + break; + } + case IDP_DOUBLE: { + const double *array = (double *)IDP_Array(prop); + for (count = begin; count < end; count++) { + PyTuple_SET_ITEM(tuple, count - begin, PyFloat_FromDouble(array[count])); + } + break; + } + case IDP_INT: { + const int *array = (int *)IDP_Array(prop); + for (count = begin; count < end; count++) { + PyTuple_SET_ITEM(tuple, count - begin, PyLong_FromLong(array[count])); + } + break; + } + } + + return tuple; } /* sequence slice (set): idparr[a:b] = value */ static int BPy_IDArray_ass_slice(BPy_IDArray *self, int begin, int end, PyObject *seq) { - IDProperty *prop = self->prop; - bool is_double; - const PyTypeObject *py_type = idp_array_py_type(self, &is_double); - const size_t elem_size = is_double ? sizeof(double) : sizeof(float); - size_t alloc_len; - size_t size; - void *vec; + IDProperty *prop = self->prop; + bool is_double; + const PyTypeObject *py_type = idp_array_py_type(self, &is_double); + const size_t elem_size = is_double ? sizeof(double) : sizeof(float); + size_t alloc_len; + size_t size; + void *vec; - CLAMP(begin, 0, prop->len); - CLAMP(end, 0, prop->len); - begin = MIN2(begin, end); + CLAMP(begin, 0, prop->len); + CLAMP(end, 0, prop->len); + begin = MIN2(begin, end); - size = (end - begin); - alloc_len = size * elem_size; + size = (end - begin); + alloc_len = size * elem_size; - vec = MEM_mallocN(alloc_len, "array assignment"); /* NOTE: we count on int/float being the same size here */ - if (PyC_AsArray(vec, seq, size, py_type, is_double, "slice assignment: ") == -1) { - MEM_freeN(vec); - return -1; - } + vec = MEM_mallocN(alloc_len, + "array assignment"); /* NOTE: we count on int/float being the same size here */ + if (PyC_AsArray(vec, seq, size, py_type, is_double, "slice assignment: ") == -1) { + MEM_freeN(vec); + return -1; + } - memcpy((void *)(((char *)IDP_Array(prop)) + (begin * elem_size)), vec, alloc_len); + memcpy((void *)(((char *)IDP_Array(prop)) + (begin * elem_size)), vec, alloc_len); - MEM_freeN(vec); - return 0; + MEM_freeN(vec); + return 0; } static PyObject *BPy_IDArray_subscript(BPy_IDArray *self, PyObject *item) { - if (PyIndex_Check(item)) { - Py_ssize_t i; - i = PyNumber_AsSsize_t(item, PyExc_IndexError); - if (i == -1 && PyErr_Occurred()) { - return NULL; - } - if (i < 0) { - i += self->prop->len; - } - return BPy_IDArray_GetItem(self, i); - } - else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelength; - - if (PySlice_GetIndicesEx(item, self->prop->len, &start, &stop, &step, &slicelength) < 0) { - return NULL; - } - - if (slicelength <= 0) { - return PyTuple_New(0); - } - else if (step == 1) { - return BPy_IDArray_slice(self, start, stop); - } - else { - PyErr_SetString(PyExc_TypeError, "slice steps not supported with vectors"); - return NULL; - } - } - else { - PyErr_Format(PyExc_TypeError, - "vector indices must be integers, not %.200s", - __func__, Py_TYPE(item)->tp_name); - return NULL; - } + if (PyIndex_Check(item)) { + Py_ssize_t i; + i = PyNumber_AsSsize_t(item, PyExc_IndexError); + if (i == -1 && PyErr_Occurred()) { + return NULL; + } + if (i < 0) { + i += self->prop->len; + } + return BPy_IDArray_GetItem(self, i); + } + else if (PySlice_Check(item)) { + Py_ssize_t start, stop, step, slicelength; + + if (PySlice_GetIndicesEx(item, self->prop->len, &start, &stop, &step, &slicelength) < 0) { + return NULL; + } + + if (slicelength <= 0) { + return PyTuple_New(0); + } + else if (step == 1) { + return BPy_IDArray_slice(self, start, stop); + } + else { + PyErr_SetString(PyExc_TypeError, "slice steps not supported with vectors"); + return NULL; + } + } + else { + PyErr_Format(PyExc_TypeError, + "vector indices must be integers, not %.200s", + __func__, + Py_TYPE(item)->tp_name); + return NULL; + } } static int BPy_IDArray_ass_subscript(BPy_IDArray *self, PyObject *item, PyObject *value) { - if (PyIndex_Check(item)) { - Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); - if (i == -1 && PyErr_Occurred()) { - return -1; - } - if (i < 0) { - i += self->prop->len; - } - return BPy_IDArray_SetItem(self, i, value); - } - else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelength; - - if (PySlice_GetIndicesEx(item, self->prop->len, &start, &stop, &step, &slicelength) < 0) { - return -1; - } - - if (step == 1) { - return BPy_IDArray_ass_slice(self, start, stop, value); - } - else { - PyErr_SetString(PyExc_TypeError, "slice steps not supported with vectors"); - return -1; - } - } - else { - PyErr_Format(PyExc_TypeError, - "vector indices must be integers, not %.200s", - Py_TYPE(item)->tp_name); - return -1; - } + if (PyIndex_Check(item)) { + Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); + if (i == -1 && PyErr_Occurred()) { + return -1; + } + if (i < 0) { + i += self->prop->len; + } + return BPy_IDArray_SetItem(self, i, value); + } + else if (PySlice_Check(item)) { + Py_ssize_t start, stop, step, slicelength; + + if (PySlice_GetIndicesEx(item, self->prop->len, &start, &stop, &step, &slicelength) < 0) { + return -1; + } + + if (step == 1) { + return BPy_IDArray_ass_slice(self, start, stop, value); + } + else { + PyErr_SetString(PyExc_TypeError, "slice steps not supported with vectors"); + return -1; + } + } + else { + PyErr_Format( + PyExc_TypeError, "vector indices must be integers, not %.200s", Py_TYPE(item)->tp_name); + return -1; + } } static PyMappingMethods BPy_IDArray_AsMapping = { - (lenfunc)BPy_IDArray_Len, - (binaryfunc)BPy_IDArray_subscript, - (objobjargproc)BPy_IDArray_ass_subscript, + (lenfunc)BPy_IDArray_Len, + (binaryfunc)BPy_IDArray_subscript, + (objobjargproc)BPy_IDArray_ass_subscript, }; static int itemsize_by_idarray_type(int array_type) { - if (array_type == IDP_INT) { return sizeof(int); } - if (array_type == IDP_FLOAT) { return sizeof(float); } - if (array_type == IDP_DOUBLE) { return sizeof(double); } - return -1; /* should never happen */ + if (array_type == IDP_INT) { + return sizeof(int); + } + if (array_type == IDP_FLOAT) { + return sizeof(float); + } + if (array_type == IDP_DOUBLE) { + return sizeof(double); + } + return -1; /* should never happen */ } static int BPy_IDArray_getbuffer(BPy_IDArray *self, Py_buffer *view, int flags) { - IDProperty *prop = self->prop; - int itemsize = itemsize_by_idarray_type(prop->subtype); - int length = itemsize * prop->len; + IDProperty *prop = self->prop; + int itemsize = itemsize_by_idarray_type(prop->subtype); + int length = itemsize * prop->len; - if (PyBuffer_FillInfo(view, (PyObject *)self, IDP_Array(prop), length, false, flags) == -1) { - return -1; - } + if (PyBuffer_FillInfo(view, (PyObject *)self, IDP_Array(prop), length, false, flags) == -1) { + return -1; + } - view->itemsize = itemsize; - view->format = (char *)idp_format_from_array_type(prop->subtype); + view->itemsize = itemsize; + view->format = (char *)idp_format_from_array_type(prop->subtype); - Py_ssize_t *shape = MEM_mallocN(sizeof(Py_ssize_t), __func__); - shape[0] = prop->len; - view->shape = shape; + Py_ssize_t *shape = MEM_mallocN(sizeof(Py_ssize_t), __func__); + shape[0] = prop->len; + view->shape = shape; - return 0; + return 0; } static void BPy_IDArray_releasebuffer(BPy_IDArray *UNUSED(self), Py_buffer *view) { - MEM_freeN(view->shape); + MEM_freeN(view->shape); } static PyBufferProcs BPy_IDArray_Buffer = { - (getbufferproc)BPy_IDArray_getbuffer, - (releasebufferproc)BPy_IDArray_releasebuffer, + (getbufferproc)BPy_IDArray_getbuffer, + (releasebufferproc)BPy_IDArray_releasebuffer, }; - PyTypeObject BPy_IDArray_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - /* For printing, in format "<module>.<name>" */ - "IDPropertyArray", /* char *tp_name; */ - sizeof(BPy_IDArray), /* int tp_basicsize; */ - 0, /* tp_itemsize; For allocation */ - - /* Methods to implement standard operations */ - - NULL, /* destructor tp_dealloc; */ - NULL, /* printfunc tp_print; */ - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ - NULL, /* cmpfunc tp_compare; */ - (reprfunc)BPy_IDArray_repr, /* reprfunc tp_repr; */ - - /* Method suites for standard classes */ - - NULL, /* PyNumberMethods *tp_as_number; */ - &BPy_IDArray_Seq, /* PySequenceMethods *tp_as_sequence; */ - &BPy_IDArray_AsMapping, /* PyMappingMethods *tp_as_mapping; */ - - /* More standard operations (here for binary compatibility) */ - - NULL, /* hashfunc tp_hash; */ - NULL, /* ternaryfunc tp_call; */ - NULL, /* reprfunc tp_str; */ - NULL, /* getattrofunc tp_getattro; */ - NULL, /* setattrofunc tp_setattro; */ - - /* Functions to access object as input/output buffer */ - &BPy_IDArray_Buffer, /* PyBufferProcs *tp_as_buffer; */ - - /*** Flags to define presence of optional/expanded features ***/ - Py_TPFLAGS_DEFAULT, /* long tp_flags; */ - - NULL, /* char *tp_doc; Documentation string */ - /*** Assigned meaning in release 2.0 ***/ - /* call function for all accessible objects */ - NULL, /* traverseproc tp_traverse; */ - - /* delete references to contained objects */ - NULL, /* inquiry tp_clear; */ - - /*** Assigned meaning in release 2.1 ***/ - /*** rich comparisons ***/ - NULL, /* richcmpfunc tp_richcompare; */ - - /*** weak reference enabler ***/ - 0, /* long tp_weaklistoffset; */ - - /*** Added in release 2.2 ***/ - /* Iterators */ - NULL, /* getiterfunc tp_iter; */ - NULL, /* iternextfunc tp_iternext; */ - - /*** Attribute descriptor and subclassing stuff ***/ - BPy_IDArray_methods, /* struct PyMethodDef *tp_methods; */ - NULL, /* struct PyMemberDef *tp_members; */ - BPy_IDArray_getseters, /* struct PyGetSetDef *tp_getset; */ - NULL, /* struct _typeobject *tp_base; */ - NULL, /* PyObject *tp_dict; */ - NULL, /* descrgetfunc tp_descr_get; */ - NULL, /* descrsetfunc tp_descr_set; */ - 0, /* long tp_dictoffset; */ - NULL, /* initproc tp_init; */ - NULL, /* allocfunc tp_alloc; */ - NULL, /* newfunc tp_new; */ - /* Low-level free-memory routine */ - NULL, /* freefunc tp_free; */ - /* For PyObject_IS_GC */ - NULL, /* inquiry tp_is_gc; */ - NULL, /* PyObject *tp_bases; */ - /* method resolution order */ - NULL, /* PyObject *tp_mro; */ - NULL, /* PyObject *tp_cache; */ - NULL, /* PyObject *tp_subclasses; */ - NULL, /* PyObject *tp_weaklist; */ - NULL, + PyVarObject_HEAD_INIT(NULL, 0) + /* For printing, in format "<module>.<name>" */ + "IDPropertyArray", /* char *tp_name; */ + sizeof(BPy_IDArray), /* int tp_basicsize; */ + 0, /* tp_itemsize; For allocation */ + + /* Methods to implement standard operations */ + + NULL, /* destructor tp_dealloc; */ + NULL, /* printfunc tp_print; */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ + NULL, /* cmpfunc tp_compare; */ + (reprfunc)BPy_IDArray_repr, /* reprfunc tp_repr; */ + + /* Method suites for standard classes */ + + NULL, /* PyNumberMethods *tp_as_number; */ + &BPy_IDArray_Seq, /* PySequenceMethods *tp_as_sequence; */ + &BPy_IDArray_AsMapping, /* PyMappingMethods *tp_as_mapping; */ + + /* More standard operations (here for binary compatibility) */ + + NULL, /* hashfunc tp_hash; */ + NULL, /* ternaryfunc tp_call; */ + NULL, /* reprfunc tp_str; */ + NULL, /* getattrofunc tp_getattro; */ + NULL, /* setattrofunc tp_setattro; */ + + /* Functions to access object as input/output buffer */ + &BPy_IDArray_Buffer, /* PyBufferProcs *tp_as_buffer; */ + + /*** Flags to define presence of optional/expanded features ***/ + Py_TPFLAGS_DEFAULT, /* long tp_flags; */ + + NULL, /* char *tp_doc; Documentation string */ + /*** Assigned meaning in release 2.0 ***/ + /* call function for all accessible objects */ + NULL, /* traverseproc tp_traverse; */ + + /* delete references to contained objects */ + NULL, /* inquiry tp_clear; */ + + /*** Assigned meaning in release 2.1 ***/ + /*** rich comparisons ***/ + NULL, /* richcmpfunc tp_richcompare; */ + + /*** weak reference enabler ***/ + 0, /* long tp_weaklistoffset; */ + + /*** Added in release 2.2 ***/ + /* Iterators */ + NULL, /* getiterfunc tp_iter; */ + NULL, /* iternextfunc tp_iternext; */ + + /*** Attribute descriptor and subclassing stuff ***/ + BPy_IDArray_methods, /* struct PyMethodDef *tp_methods; */ + NULL, /* struct PyMemberDef *tp_members; */ + BPy_IDArray_getseters, /* struct PyGetSetDef *tp_getset; */ + NULL, /* struct _typeobject *tp_base; */ + NULL, /* PyObject *tp_dict; */ + NULL, /* descrgetfunc tp_descr_get; */ + NULL, /* descrsetfunc tp_descr_set; */ + 0, /* long tp_dictoffset; */ + NULL, /* initproc tp_init; */ + NULL, /* allocfunc tp_alloc; */ + NULL, /* newfunc tp_new; */ + /* Low-level free-memory routine */ + NULL, /* freefunc tp_free; */ + /* For PyObject_IS_GC */ + NULL, /* inquiry tp_is_gc; */ + NULL, /* PyObject *tp_bases; */ + /* method resolution order */ + NULL, /* PyObject *tp_mro; */ + NULL, /* PyObject *tp_cache; */ + NULL, /* PyObject *tp_subclasses; */ + NULL, /* PyObject *tp_weaklist; */ + NULL, }; /*********** ID Property Group iterator ********/ static PyObject *IDGroup_Iter_repr(BPy_IDGroup_Iter *self) { - return PyUnicode_FromFormat("(ID Property Group Iter \"%s\")", self->group->prop->name); + return PyUnicode_FromFormat("(ID Property Group Iter \"%s\")", self->group->prop->name); } static PyObject *BPy_Group_Iter_Next(BPy_IDGroup_Iter *self) { - if (self->cur) { - PyObject *ret; - IDProperty *cur; + if (self->cur) { + PyObject *ret; + IDProperty *cur; - cur = self->cur; - self->cur = self->cur->next; + cur = self->cur; + self->cur = self->cur->next; - if (self->mode == IDPROP_ITER_ITEMS) { - ret = PyTuple_New(2); - PyTuple_SET_ITEMS(ret, - PyUnicode_FromString(cur->name), - BPy_IDGroup_WrapData(self->group->id, cur, self->group->prop)); - return ret; - } - else { - return PyUnicode_FromString(cur->name); - } - } - else { - PyErr_SetNone(PyExc_StopIteration); - return NULL; - } + if (self->mode == IDPROP_ITER_ITEMS) { + ret = PyTuple_New(2); + PyTuple_SET_ITEMS(ret, + PyUnicode_FromString(cur->name), + BPy_IDGroup_WrapData(self->group->id, cur, self->group->prop)); + return ret; + } + else { + return PyUnicode_FromString(cur->name); + } + } + else { + PyErr_SetNone(PyExc_StopIteration); + return NULL; + } } PyTypeObject BPy_IDGroup_Iter_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - /* For printing, in format "<module>.<name>" */ - "IDPropertyGroupIter", /* char *tp_name; */ - sizeof(BPy_IDGroup_Iter), /* int tp_basicsize; */ - 0, /* tp_itemsize; For allocation */ + PyVarObject_HEAD_INIT(NULL, 0) + /* For printing, in format "<module>.<name>" */ + "IDPropertyGroupIter", /* char *tp_name; */ + sizeof(BPy_IDGroup_Iter), /* int tp_basicsize; */ + 0, /* tp_itemsize; For allocation */ - /* Methods to implement standard operations */ + /* Methods to implement standard operations */ - NULL, /* destructor tp_dealloc; */ - NULL, /* printfunc tp_print; */ - NULL, /* getattrfunc tp_getattr; */ - NULL, /* setattrfunc tp_setattr; */ - NULL, /* cmpfunc tp_compare; */ - (reprfunc) IDGroup_Iter_repr, /* reprfunc tp_repr; */ + NULL, /* destructor tp_dealloc; */ + NULL, /* printfunc tp_print; */ + NULL, /* getattrfunc tp_getattr; */ + NULL, /* setattrfunc tp_setattr; */ + NULL, /* cmpfunc tp_compare; */ + (reprfunc)IDGroup_Iter_repr, /* reprfunc tp_repr; */ - /* Method suites for standard classes */ + /* Method suites for standard classes */ - NULL, /* PyNumberMethods *tp_as_number; */ - NULL, /* PySequenceMethods *tp_as_sequence; */ - NULL, /* PyMappingMethods *tp_as_mapping; */ + NULL, /* PyNumberMethods *tp_as_number; */ + NULL, /* PySequenceMethods *tp_as_sequence; */ + NULL, /* PyMappingMethods *tp_as_mapping; */ - /* More standard operations (here for binary compatibility) */ + /* More standard operations (here for binary compatibility) */ - NULL, /* hashfunc tp_hash; */ - NULL, /* ternaryfunc tp_call; */ - NULL, /* reprfunc tp_str; */ - NULL, /* getattrofunc tp_getattro; */ - NULL, /* setattrofunc tp_setattro; */ + NULL, /* hashfunc tp_hash; */ + NULL, /* ternaryfunc tp_call; */ + NULL, /* reprfunc tp_str; */ + NULL, /* getattrofunc tp_getattro; */ + NULL, /* setattrofunc tp_setattro; */ - /* Functions to access object as input/output buffer */ - NULL, /* PyBufferProcs *tp_as_buffer; */ + /* Functions to access object as input/output buffer */ + NULL, /* PyBufferProcs *tp_as_buffer; */ - /*** Flags to define presence of optional/expanded features ***/ - Py_TPFLAGS_DEFAULT, /* long tp_flags; */ + /*** Flags to define presence of optional/expanded features ***/ + Py_TPFLAGS_DEFAULT, /* long tp_flags; */ - NULL, /* char *tp_doc; Documentation string */ - /*** Assigned meaning in release 2.0 ***/ - /* call function for all accessible objects */ - NULL, /* traverseproc tp_traverse; */ + NULL, /* char *tp_doc; Documentation string */ + /*** Assigned meaning in release 2.0 ***/ + /* call function for all accessible objects */ + NULL, /* traverseproc tp_traverse; */ - /* delete references to contained objects */ - NULL, /* inquiry tp_clear; */ + /* delete references to contained objects */ + NULL, /* inquiry tp_clear; */ - /*** Assigned meaning in release 2.1 ***/ - /*** rich comparisons ***/ - NULL, /* richcmpfunc tp_richcompare; */ + /*** Assigned meaning in release 2.1 ***/ + /*** rich comparisons ***/ + NULL, /* richcmpfunc tp_richcompare; */ - /*** weak reference enabler ***/ - 0, /* long tp_weaklistoffset; */ + /*** weak reference enabler ***/ + 0, /* long tp_weaklistoffset; */ - /*** Added in release 2.2 ***/ - /* Iterators */ - PyObject_SelfIter, /* getiterfunc tp_iter; */ - (iternextfunc) BPy_Group_Iter_Next, /* iternextfunc tp_iternext; */ + /*** Added in release 2.2 ***/ + /* Iterators */ + PyObject_SelfIter, /* getiterfunc tp_iter; */ + (iternextfunc)BPy_Group_Iter_Next, /* iternextfunc tp_iternext; */ }; void IDProp_Init_Types(void) { - PyType_Ready(&BPy_IDGroup_Type); - PyType_Ready(&BPy_IDGroup_Iter_Type); - PyType_Ready(&BPy_IDArray_Type); + PyType_Ready(&BPy_IDGroup_Type); + PyType_Ready(&BPy_IDGroup_Iter_Type); + PyType_Ready(&BPy_IDArray_Type); } /*----------------------------MODULE INIT-------------------------*/ @@ -1763,71 +1753,70 @@ void IDProp_Init_Types(void) /* --- */ static struct PyModuleDef IDProp_types_module_def = { - PyModuleDef_HEAD_INIT, - "idprop.types", /* m_name */ - NULL, /* m_doc */ - 0, /* m_size */ - NULL, /* m_methods */ - NULL, /* m_reload */ - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL, /* m_free */ + PyModuleDef_HEAD_INIT, + "idprop.types", /* m_name */ + NULL, /* m_doc */ + 0, /* m_size */ + NULL, /* m_methods */ + NULL, /* m_reload */ + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL, /* m_free */ }; static PyObject *BPyInit_idprop_types(void) { - PyObject *submodule; + PyObject *submodule; - submodule = PyModule_Create(&IDProp_types_module_def); + submodule = PyModule_Create(&IDProp_types_module_def); - IDProp_Init_Types(); + IDProp_Init_Types(); #define MODULE_TYPE_ADD(s, t) \ - PyModule_AddObject(s, t.tp_name, (PyObject *)&t); Py_INCREF((PyObject *)&t) + PyModule_AddObject(s, t.tp_name, (PyObject *)&t); \ + Py_INCREF((PyObject *)&t) - /* bmesh_py_types.c */ - MODULE_TYPE_ADD(submodule, BPy_IDGroup_Type); - MODULE_TYPE_ADD(submodule, BPy_IDGroup_Iter_Type); - MODULE_TYPE_ADD(submodule, BPy_IDArray_Type); + /* bmesh_py_types.c */ + MODULE_TYPE_ADD(submodule, BPy_IDGroup_Type); + MODULE_TYPE_ADD(submodule, BPy_IDGroup_Iter_Type); + MODULE_TYPE_ADD(submodule, BPy_IDArray_Type); #undef MODULE_TYPE_ADD - return submodule; + return submodule; } /* --- */ static PyMethodDef IDProp_methods[] = { - {NULL, NULL, 0, NULL}, + {NULL, NULL, 0, NULL}, }; - PyDoc_STRVAR(IDProp_module_doc, -"This module provides access id property types (currently mainly for docs)." -); + "This module provides access id property types (currently mainly for docs)."); static struct PyModuleDef IDProp_module_def = { - PyModuleDef_HEAD_INIT, - "idprop", /* m_name */ - IDProp_module_doc, /* m_doc */ - 0, /* m_size */ - IDProp_methods, /* m_methods */ - NULL, /* m_reload */ - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL, /* m_free */ + PyModuleDef_HEAD_INIT, + "idprop", /* m_name */ + IDProp_module_doc, /* m_doc */ + 0, /* m_size */ + IDProp_methods, /* m_methods */ + NULL, /* m_reload */ + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL, /* m_free */ }; PyObject *BPyInit_idprop(void) { - PyObject *mod; - PyObject *submodule; - PyObject *sys_modules = PyImport_GetModuleDict(); + PyObject *mod; + PyObject *submodule; + PyObject *sys_modules = PyImport_GetModuleDict(); - mod = PyModule_Create(&IDProp_module_def); + mod = PyModule_Create(&IDProp_module_def); - /* idprop.types */ - PyModule_AddObject(mod, "types", (submodule = BPyInit_idprop_types())); - PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); + /* idprop.types */ + PyModule_AddObject(mod, "types", (submodule = BPyInit_idprop_types())); + PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule); - return mod; + return mod; } |