[Bf-blender-cvs] [5c8c900] temp-pyapi-units: Deduplicate some code for struct-seq initialization

Campbell Barton noreply at git.blender.org
Tue Jun 17 11:55:33 CEST 2014


Commit: 5c8c900ad64fbfa531957184d2a53a70ccb4c11e
Author: Campbell Barton
Date:   Tue Jun 17 19:53:06 2014 +1000
https://developer.blender.org/rB5c8c900ad64fbfa531957184d2a53a70ccb4c11e

Deduplicate some code for struct-seq initialization

===================================================================

M	source/blender/python/intern/bpy_utils_units.c

===================================================================

diff --git a/source/blender/python/intern/bpy_utils_units.c b/source/blender/python/intern/bpy_utils_units.c
index 283ba79..68d6b0f 100644
--- a/source/blender/python/intern/bpy_utils_units.c
+++ b/source/blender/python/intern/bpy_utils_units.c
@@ -52,18 +52,18 @@
 
 /***** C-defined systems and types *****/
 
-static PyTypeObject BlenderUtilsUnitsSystemsType;
-static PyTypeObject BlenderUtilsUnitsCategoriesType;
+static PyTypeObject BPyUnitsSystemsType;
+static PyTypeObject BPyUnitsCategoriesType;
 
 /* XXX Maybe better as externs of BKE_unit.h ? */
-static const char *bpyunits_usystems[] = {
+static const char *bpyunits_usystem_items[] = {
 	"NONE",
 	"METRIC",
 	"IMPERIAL",
 	NULL,
 };
 
-static const char *bpyunits_ucategories[] = {
+static const char *bpyunits_ucategorie_items[] = {
 	"NONE",
 	"LENGTH",
 	"AREA",
@@ -77,12 +77,13 @@ static const char *bpyunits_ucategories[] = {
 	NULL,
 };
 
-/* These fields are just empty placeholders, actual values get set in app_translations_struct().
+/**
+ * These fields are just empty placeholders, actual values get set in initializations functions.
  * This allows us to avoid many handwriting, and above all, to keep all systems/categories definition stuff in
- * BKE_unit.h!
+ * ``BKE_unit.h``.
  */
-static PyStructSequence_Field bpyunits_systems_fields[ARRAY_SIZE(bpyunits_usystems)] = {{NULL}};
-static PyStructSequence_Field bpyunits_categories_fields[ARRAY_SIZE(bpyunits_ucategories)] = {{NULL}};
+static PyStructSequence_Field bpyunits_systems_fields[ARRAY_SIZE(bpyunits_usystem_items)];
+static PyStructSequence_Field bpyunits_categories_fields[ARRAY_SIZE(bpyunits_ucategorie_items)];
 
 static PyStructSequence_Desc bpyunits_systems_desc = {
 	(char *)"bpy.utils.units.systems",     /* name */
@@ -97,47 +98,47 @@ static PyStructSequence_Desc bpyunits_categories_desc = {
 	ARRAY_SIZE(bpyunits_categories_fields) - 1
 };
 
-static PyObject *bpyunits_systems_make(void)
+/**
+ * Simple utility function to initialize #PyStructSequence_Desc
+ */
+static PyObject *py_structseq_from_strings(
+        PyTypeObject *py_type,
+        PyStructSequence_Desc *py_sseq_desc,
+        const char **str_items)
 {
-	PyObject *units_systems;
-	const char **sys;
+	PyObject *py_struct_seq;
 	int pos = 0;
 
-	units_systems = PyStructSequence_New(&BlenderUtilsUnitsSystemsType);
-	if (units_systems == NULL) {
-		return NULL;
-	}
+	const char **str_iter;
+	PyStructSequence_Field *desc;
 
-	for (sys = bpyunits_usystems; *sys; sys++) {
-		PyStructSequence_SET_ITEM(units_systems, pos++, PyUnicode_FromString((*sys)));
+	/* initialize array */
+	/* We really populate the contexts' fields here! */
+	for (str_iter = str_items, desc = py_sseq_desc->fields; *str_iter; str_iter++, desc++) {
+		desc->name = (char *)*str_iter;
+		desc->doc = NULL;
 	}
+	/* end sentinel */
+	desc->name = desc->doc = NULL;
 
-	return units_systems;
-}
 
-static PyObject *bpyunits_categories_make(void)
-{
-	PyObject *units_categories;
-	const char **categories;
-	int pos = 0;
+	PyStructSequence_InitType(py_type, py_sseq_desc);
 
-	units_categories = PyStructSequence_New(&BlenderUtilsUnitsCategoriesType);
-	if (units_categories == NULL) {
-		return NULL;
-	}
+	/* initialize pytype */
+	py_struct_seq = PyStructSequence_New(py_type);
+	BLI_assert(py_struct_seq != NULL);
 
-	for (categories = bpyunits_ucategories; *categories; categories++) {
-		PyStructSequence_SET_ITEM(units_categories, pos++, PyUnicode_FromString((*categories)));
+	for (str_iter = str_items; *str_iter; str_iter++) {
+		PyStructSequence_SET_ITEM(py_struct_seq, pos++, PyUnicode_FromString((*str_iter)));
 	}
 
-	return units_categories;
-}
+	return py_struct_seq;
 
-/***** Main BlenderAppTranslations Py object definition *****/
+}
 
 static bool bpyunits_validate(const char *usys_str, const char *ucat_str, int *r_usys, int *r_ucat)
 {
-	*r_usys = BLI_str_index_in_array(usys_str, bpyunits_usystems);
+	*r_usys = BLI_str_index_in_array(usys_str, bpyunits_usystem_items);
 	if (*r_usys < 0) {
 		PyErr_Format(PyExc_ValueError,
 		             "Unknown unit system specified: %.200s.",
@@ -145,7 +146,7 @@ static bool bpyunits_validate(const char *usys_str, const char *ucat_str, int *r
 		return false;
 	}
 
-	*r_ucat = BLI_str_index_in_array(ucat_str, bpyunits_ucategories);
+	*r_ucat = BLI_str_index_in_array(ucat_str, bpyunits_ucategorie_items);
 	if (*r_ucat < 0) {
 		PyErr_Format(PyExc_ValueError,
 		             "Unknown unit category specified: %.200s.",
@@ -168,18 +169,17 @@ PyDoc_STRVAR(bpyunits_to_value_doc,
 "\n"
 "   Convert a given input string into a float value.\n"
 "\n"
-"   :arg str unit_system: The unit system, from :attribute:`bpy.utils.units.systems`.\n"
+"   :arg str unit_system: The unit system, from :attr:`bpy.utils.units.systems`.\n"
 "   :arg str unit_category: The category of data we are converting (length, area, rotation, etc.), "
-"      from :attribute:`bpy.utils.units.categories`.\n"
+"      from :attr:`bpy.utils.units.categories`.\n"
 "   :arg str str_input: The string to convert to a float value.\n"
 "   :arg str_ref_unit: A reference string from which to extract a default unit, if none is found in :arg:`str_input`.\n"
 "   :type: string or None\n"
 "   :return: The converted/interpreted value.\n"
 "   :rtype: float\n"
 "   :raises ValueError: if conversion fails to generate a valid python float value.\n"
-"\n"
 );
-static PyObject *bpyunits_to_value(PyObject *self, PyObject *args, PyObject *kw)
+static PyObject *bpyunits_to_value(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
 {
 	static const char *kwlist[] = {"unit_system", "unit_category", "str_input", "str_ref_unit", NULL};
 
@@ -230,9 +230,9 @@ PyDoc_STRVAR(bpyunits_to_string_doc,
 "\n"
 "   Convert a given input float value into a string with units.\n"
 "\n"
-"   :arg str unit_system: The unit system, from :attribute:`bpy.utils.units.systems`.\n"
+"   :arg str unit_system: The unit system, from :attr:`bpy.utils.units.systems`.\n"
 "   :arg str unit_category: The category of data we are converting (length, area, rotation, etc.), "
-"      from :attribute:`bpy.utils.units.categories`.\n"
+"      from :attr:`bpy.utils.units.categories`.\n"
 "   :arg float value: The value to convert to a string.\n"
 "   :arg int precision: Number of digits after the comma.\n"
 "   :arg bool split_unit: Whether to use several units if needed (1m1cm), or always only one (1.01m).\n"
@@ -240,9 +240,8 @@ PyDoc_STRVAR(bpyunits_to_string_doc,
 "   :return: The converted string.\n"
 "   :rtype: str\n"
 "   :raises ValueError: if conversion fails to generate a valid python string.\n"
-"\n"
 );
-static PyObject *bpyunits_to_string(PyObject *self, PyObject *args, PyObject *kw)
+static PyObject *bpyunits_to_string(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
 {
 	static const char *kwlist[] = {"unit_system", "unit_category", "value",
 	                               "precision", "split_unit", "compatible_unit", NULL};
@@ -303,11 +302,10 @@ static PyMethodDef bpyunits_methods[] = {
 };
 
 PyDoc_STRVAR(bpyunits_doc,
-"This module contains some data/methods regarding units handling in Blender.\n"
-"\n"
+"This module contains some data/methods regarding units handling."
 );
 
-static struct PyModuleDef props_module = {
+static struct PyModuleDef bpyunits_module = {
 	PyModuleDef_HEAD_INIT,
 	"bpy.utils.units",
 	bpyunits_doc,
@@ -318,50 +316,21 @@ static struct PyModuleDef props_module = {
 
 PyObject *BPY_utils_units(void)
 {
-	PyObject *submodule;
-
-	submodule = PyModule_Create(&props_module);
-	PyDict_SetItemString(PyImport_GetModuleDict(), props_module.m_name, submodule);
+	PyObject *submodule, *item;
 
-	/* INCREF since it's assumed that all these functions return the module with a new ref like PyDict_New,
-	 * since they are passed to PyModule_AddObject which steals a ref. */
+	submodule = PyModule_Create(&bpyunits_module);
+	PyDict_SetItemString(PyImport_GetModuleDict(), bpyunits_module.m_name, submodule);
 	Py_INCREF(submodule);
 
-	/* Let's finalize our unit systems and types structseq definitions! */
-	{
-		const char **sys;
-		PyStructSequence_Field *desc;
-		PyObject *systems;
-
-		/* We really populate the contexts' fields here! */
-		for (sys = bpyunits_usystems, desc = bpyunits_systems_desc.fields; *sys; sys++, desc++) {
-			desc->name = (char *)*sys;
-			desc->doc = NULL;
-		}
-		desc->name = desc->doc = NULL;  /* End sentinel! */
+	/* Finalize our unit systems and types structseq definitions! */
 
-		PyStructSequence_InitType(&BlenderUtilsUnitsSystemsType, &bpyunits_systems_desc);
+	/* bpy.utils.units.system */
+	item = py_structseq_from_strings(&BPyUnitsSystemsType, &bpyunits_systems_desc, bpyunits_usystem_items);
+	PyModule_AddObject(submodule, "systems", item);  /* steals ref */
 
-		systems = bpyunits_systems_make();
-		PyModule_AddObject(submodule, "systems", systems);  /* Steals ref. */
-	}
-	{
-		const char **cat;
-		PyStructSequence_Field *desc;
-		PyObject *categories;
-
-		/* We really populate the contexts' fields here! */
-		for (cat = bpyunits_ucategories, desc = bpyunits_categories_desc.fields; *cat; cat++, desc++) {
-			desc->name = (char *)*cat;
-			desc->doc = NULL;
-		}
-		desc->name = desc->doc = NULL;  /* End sentinel! */
-
-		PyStructSequence_InitType(&BlenderUtilsUnitsCategoriesType, &bpyunits_categories_desc);
-
-		categories = bpyunits_categories_make();
-		PyModule_AddObject(submodule, "categories", categories);  /* Steals ref. */
-	}
+	/* bpy.utils.units.categories */
+	item = py_structseq_from_strings(&BPyUnitsCategoriesType, &bpyunits_categories_desc, bpyunits_ucategorie_items);
+	PyModule_AddObject(submodule, "categories", item);  /* steals ref */
 
 	return submodule;
 }




More information about the Bf-blender-cvs mailing list