From f8507034753eca08c6f5dcab3e515a72d48e6aa0 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Fri, 20 May 2011 09:46:20 -0600 Subject: Improve dmnsn_py_Vector_args() API. --- libdimension-python/Matrix.c | 87 ++++++++++---------------------------------- libdimension-python/Vector.c | 18 ++++++++- 2 files changed, 35 insertions(+), 70 deletions(-) diff --git a/libdimension-python/Matrix.c b/libdimension-python/Matrix.c index a414622..0de8acc 100644 --- a/libdimension-python/Matrix.c +++ b/libdimension-python/Matrix.c @@ -45,92 +45,43 @@ PyObject * dmnsn_py_Matrix_scale(PyObject *self, PyObject *args, PyObject *kwds) { dmnsn_vector scale; - if (dmnsn_py_Vector_args(&scale, args, kwds)) { - dmnsn_py_Matrix *ret = PyObject_New(dmnsn_py_Matrix, &dmnsn_py_MatrixType); - if (ret) { - ret->m = dmnsn_scale_matrix(scale); - } - return (PyObject *)ret; - } else { - PyErr_Clear(); - if (kwds) { - PyErr_SetString(PyExc_TypeError, - "Keywords only make sense for component syntax"); - return NULL; - } - - dmnsn_py_Vector *scale; - if (!PyArg_ParseTuple(args, "O!", &dmnsn_py_VectorType, &scale)) - return NULL; + if (!dmnsn_py_Vector_args(&scale, args, kwds)) + return NULL; - dmnsn_py_Matrix *ret = PyObject_New(dmnsn_py_Matrix, &dmnsn_py_MatrixType); - if (ret) { - ret->m = dmnsn_scale_matrix(scale->v); - } - return (PyObject *)ret; + dmnsn_py_Matrix *ret = PyObject_New(dmnsn_py_Matrix, &dmnsn_py_MatrixType); + if (ret) { + ret->m = dmnsn_scale_matrix(scale); } + return (PyObject *)ret; } PyObject * dmnsn_py_Matrix_translate(PyObject *self, PyObject *args, PyObject *kwds) { dmnsn_vector translate; - if (dmnsn_py_Vector_args(&translate, args, kwds)) { - dmnsn_py_Matrix *ret = PyObject_New(dmnsn_py_Matrix, &dmnsn_py_MatrixType); - if (ret) { - ret->m = dmnsn_translation_matrix(translate); - } - return (PyObject *)ret; - } else { - PyErr_Clear(); - if (kwds) { - PyErr_SetString(PyExc_TypeError, - "Keywords only make sense for component syntax"); - return NULL; - } - - dmnsn_py_Vector *translate; - if (!PyArg_ParseTuple(args, "O!", &dmnsn_py_VectorType, &translate)) - return NULL; + if (!dmnsn_py_Vector_args(&translate, args, kwds)) + return NULL; - dmnsn_py_Matrix *ret = PyObject_New(dmnsn_py_Matrix, &dmnsn_py_MatrixType); - if (ret) { - ret->m = dmnsn_translation_matrix(translate->v); - } - return (PyObject *)ret; + dmnsn_py_Matrix *ret = PyObject_New(dmnsn_py_Matrix, &dmnsn_py_MatrixType); + if (ret) { + ret->m = dmnsn_translation_matrix(translate); } + return (PyObject *)ret; } PyObject * dmnsn_py_Matrix_rotate(PyObject *self, PyObject *args, PyObject *kwds) { dmnsn_vector rotate; - if (dmnsn_py_Vector_args(&rotate, args, kwds)) { - dmnsn_py_Matrix *ret = PyObject_New(dmnsn_py_Matrix, &dmnsn_py_MatrixType); - if (ret) { - ret->m = dmnsn_rotation_matrix(dmnsn_vector_mul(dmnsn_radians(1.0), - rotate)); - } - return (PyObject *)ret; - } else { - PyErr_Clear(); - if (kwds) { - PyErr_SetString(PyExc_TypeError, - "Keywords only make sense for component syntax"); - return NULL; - } - - dmnsn_py_Vector *rotate; - if (!PyArg_ParseTuple(args, "O!", &dmnsn_py_VectorType, &rotate)) - return NULL; + if (!dmnsn_py_Vector_args(&rotate, args, kwds)) + return NULL; - dmnsn_py_Matrix *ret = PyObject_New(dmnsn_py_Matrix, &dmnsn_py_MatrixType); - if (ret) { - ret->m = dmnsn_rotation_matrix(dmnsn_vector_mul(dmnsn_radians(1.0), - rotate->v)); - } - return (PyObject *)ret; + dmnsn_py_Matrix *ret = PyObject_New(dmnsn_py_Matrix, &dmnsn_py_MatrixType); + if (ret) { + ret->m = dmnsn_rotation_matrix(dmnsn_vector_mul(dmnsn_radians(1.0), + rotate)); } + return (PyObject *)ret; } static PyObject * diff --git a/libdimension-python/Vector.c b/libdimension-python/Vector.c index 8cd7f05..3fdc90c 100644 --- a/libdimension-python/Vector.c +++ b/libdimension-python/Vector.c @@ -24,8 +24,22 @@ bool dmnsn_py_Vector_args(dmnsn_vector *v, PyObject *args, PyObject *kwds) { static char *kwlist[] = { "x", "y", "z", NULL }; - return PyArg_ParseTupleAndKeywords(args, kwds, "ddd", kwlist, - &v->x, &v->y, &v->z); + if (PyArg_ParseTupleAndKeywords(args, kwds, "ddd", kwlist, + &v->x, &v->y, &v->z)) { + return true; + } else { + if (kwds) + return false; + + PyErr_Clear(); + + dmnsn_py_Vector *vec; + if (!PyArg_ParseTuple(args, "O!", &dmnsn_py_VectorType, &vec)) + return false; + + *v = vec->v; + return true; + } } static int -- cgit v1.2.3