From f2367c6c195552b4cc0786e68668b8ece6b048da Mon Sep 17 00:00:00 2001 From: Sebastian Hoogen Date: Fri, 3 Oct 2014 11:51:03 +0200 Subject: [PATCH] bugfix in unit parser partly revert to 810fadab233afe9afbf3ee31ff352755ed7084eb and change python string handling to "et" method --- src/Base/QuantityPyImp.cpp | 71 +++++++++++++------------------------- src/Base/UnitPyImp.cpp | 29 +++++----------- src/Base/UnitsApiPy.cpp | 50 +++++++++++---------------- 3 files changed, 53 insertions(+), 97 deletions(-) diff --git a/src/Base/QuantityPyImp.cpp b/src/Base/QuantityPyImp.cpp index 783801e58..93c5c50d1 100644 --- a/src/Base/QuantityPyImp.cpp +++ b/src/Base/QuantityPyImp.cpp @@ -83,29 +83,22 @@ int QuantityPy::PyInit(PyObject* args, PyObject* kwd) return 0; } PyErr_Clear(); // set by PyArg_ParseTuple() - if (PyArg_ParseTuple(args,"O", &object)) { - if (PyString_Check(object) || PyUnicode_Check(object)) { - QString qstr; - if (PyUnicode_Check(object)) { - PyObject * utf8str = PyUnicode_AsUTF8String(object); - qstr = QString::fromUtf8(PyString_AsString(utf8str)); - Py_DECREF(utf8str); - } - else { - qstr = QString::fromUtf8(PyString_AsString(object)); - } - try { - *self = Quantity::parse(qstr); - } - catch(const Base::Exception& e) { - PyErr_SetString(PyExc_ValueError, e.what()); - return -1; - } - return 0; - } // Not string or unicode - } // zero or more than one object - PyErr_SetString(PyExc_TypeError, "Either quantity, float and Base unit, float and 8 integers or unicode or utf-8 string expected"); - return -1; + char* string; + if (PyArg_ParseTuple(args,"et", "utf-8", &string)) { + QString qstr = QString::fromUtf8(string); + PyMem_Free(string); + try { + *self = Quantity::parse(qstr); + }catch(const Base::Exception& e) { + PyErr_SetString(PyExc_ValueError, e.what()); + return-1; + } + + return 0; + } + + PyErr_SetString(PyExc_TypeError, "Either three floats, tuple or Vector expected"); + return -1; } PyObject* QuantityPy::getUserPreferred(PyObject *args) @@ -178,32 +171,16 @@ PyObject* QuantityPy::getValueAs(PyObject *args) if (!quant.isValid()) { PyErr_Clear(); - PyObject *object; - if (PyArg_ParseTuple(args,"O", &object)) { - if (PyString_Check(object) || PyUnicode_Check(object)) { - QString qstr; - if (PyUnicode_Check(object)) { - PyObject * utf8str = PyUnicode_AsUTF8String(object); - qstr = QString::fromUtf8(PyString_AsString(utf8str)); - Py_DECREF(utf8str); - } - else { - qstr = QString::fromUtf8(PyString_AsString(object)); - } - try { - quant = Quantity::parse(qstr); - } - catch(const Base::Exception& e) { - PyErr_SetString(PyExc_ValueError, e.what()); - return 0; - } - return 0; - } // Not string or unicode - } // zero or more than one object - } // !isValid + char* string; + if (PyArg_ParseTuple(args,"et", "utf-8", &string)) { + QString qstr = QString::fromUtf8(string); + PyMem_Free(string); + quant = Quantity::parse(qstr); + } + } if (!quant.isValid()) { - PyErr_SetString(PyExc_TypeError, "Either quantity, float and Base unit, float and 8 integers or unicode or utf-8 string expected"); + PyErr_SetString(PyExc_TypeError, "Either quantity, string, float or unit expected"); return 0; } diff --git a/src/Base/UnitPyImp.cpp b/src/Base/UnitPyImp.cpp index 51ceed60b..077b6b8d5 100644 --- a/src/Base/UnitPyImp.cpp +++ b/src/Base/UnitPyImp.cpp @@ -72,27 +72,14 @@ int UnitPy::PyInit(PyObject* args, PyObject* kwd) return 0; } PyErr_Clear(); // set by PyArg_ParseTuple() - if (PyArg_ParseTuple(args,"O", &object)) { - if (PyString_Check(object) || PyUnicode_Check(object)) { - QString qstr; - if (PyUnicode_Check(object)) { - PyObject * utf8str = PyUnicode_AsUTF8String(object); - qstr = QString::fromUtf8(PyString_AsString(utf8str)); - Py_DECREF(utf8str); - } - else { - qstr = QString::fromUtf8(PyString_AsString(object)); - } - try { - *self = Quantity::parse(qstr).getUnit(); - } - catch(const Base::Exception& e) { - PyErr_SetString(PyExc_ValueError, e.what()); - return -1; - } - return 0; - } // Not string or unicode - } // zero or more than one object + char* string; + if (PyArg_ParseTuple(args,"et", "utf-8", &string)) { + QString qstr = QString::fromUtf8(string); + PyMem_Free(string); + *self = Quantity::parse(qstr).getUnit(); + return 0; + } + PyErr_SetString(PyExc_TypeError, "Either string, (float,8 ints), Unit() or Quantity()"); return -1; } diff --git a/src/Base/UnitsApiPy.cpp b/src/Base/UnitsApiPy.cpp index 273b0add5..7d41fe266 100644 --- a/src/Base/UnitsApiPy.cpp +++ b/src/Base/UnitsApiPy.cpp @@ -128,33 +128,25 @@ PyMethodDef UnitsApi::Methods[] = { PyObject* UnitsApi::sParseQuantity(PyObject * /*self*/, PyObject *args,PyObject * /*kwd*/) { - PyObject * object; - if (PyArg_ParseTuple(args,"O", &object)) { - if (PyString_Check(object) || PyUnicode_Check(object)) { - QString qstr; - if (PyUnicode_Check(object)) { - PyObject * utf8str = PyUnicode_AsUTF8String(object); - qstr = QString::fromUtf8(PyString_AsString(utf8str)); - Py_DECREF(utf8str); - } - else { - qstr = QString::fromUtf8(PyString_AsString(object)); - } - Quantity rtn; - try { - rtn = Quantity::parse(qstr); - } - catch (const Base::Exception&) { - PyErr_Format(PyExc_IOError, "invalid unit expression \n"); - return 0L; - } - catch (const std::exception&) { - PyErr_Format(PyExc_IOError, "invalid unit expression \n"); - return 0L; - } - return new QuantityPy(new Quantity(rtn)); - } //string or unicode - } //if one object - PyErr_Format(PyExc_IOError, "invalid unit expression \n"); - return 0L; + char *pstr; + if (!PyArg_ParseTuple(args, "et", "utf-8", &pstr)) // convert args: Python->C + return NULL; // NULL triggers exception + + Quantity rtn; + QString qstr = QString::fromUtf8(pstr); + PyMem_Free(pstr); + try { + rtn = Quantity::parse(QString::fromLatin1(pstr)); + } + catch (const Base::Exception&) { + PyErr_Format(PyExc_IOError, "invalid unit expression \n"); + return 0L; + } + catch (const std::exception&) { + PyErr_Format(PyExc_IOError, "invalid unit expression \n"); + return 0L; + } + + return new QuantityPy(new Quantity(rtn)); + }