PyObject* JPyString::fromString(const char* str) { #if PY_MAJOR_VERSION < 3 PY_CHECK( PyObject* obj = PyString_FromString(str) ); return obj; #else PY_CHECK( PyObject* bytes = PyBytes_FromString(str) ); PY_CHECK( PyObject* unicode = PyUnicode_FromEncodedObject(bytes, "UTF-8", "strict") ); Py_DECREF(bytes); return unicode; #endif }
JCharString JPyString::asJCharString(PyObject* obj) { PyObject* torelease = NULL; TRACE_IN("JPyString::asJCharString"); if (PyBytes_Check(obj)) { PY_CHECK( obj = PyUnicode_FromObject(obj) ); torelease = obj; } Py_UNICODE* val = PyUnicode_AS_UNICODE(obj); Py_ssize_t length = JPyObject::length(obj); JCharString res(length); for (int i = 0; val[i] != 0; i++) { res[i] = (jchar)val[i]; } if (torelease != NULL) { Py_DECREF(torelease); } return res; TRACE_OUT; }
string JPyString::asString(PyObject* obj) { TRACE_IN("JPyString::asString"); PY_CHECK( string res = string(PyString_AsString(obj)) ); return res; TRACE_OUT; }
PyObject* JPyString::fromUnicode(const jchar* str, int len) { Py_UNICODE* value = new Py_UNICODE[len+1]; value[len] = 0; for (int i = 0; i < len; i++) { value[i] = (Py_UNICODE)str[i]; } PY_CHECK( PyObject* obj = PyUnicode_FromUnicode(value, len) ); delete[] value; return obj; }
string JPyString::asString(PyObject* obj) { TRACE_IN("JPyString::asString"); #if PY_MAJOR_VERSION < 3 PY_CHECK( string res = string(PyBytes_AsString(obj)) ); #else PyObject* val; bool needs_decref = false; if(PyUnicode_Check(obj)) { val = PyUnicode_AsEncodedString(obj, "UTF-8", "strict"); needs_decref = true; } else { val = obj; } PY_CHECK( string res = string(PyBytes_AsString(val)) ); if(needs_decref) { Py_DECREF(val); } #endif return res; TRACE_OUT; }
Py_ssize_t JPyString::AsStringAndSize(PyObject *obj, char **buffer, Py_ssize_t *length) { PY_CHECK( Py_ssize_t res = PyBytes_AsStringAndSize(obj, buffer, length) ); return res; }
PyObject* JPyString::fromString(const char* str) { PY_CHECK( PyObject* obj = PyString_FromString(str) ); return obj; }