Example #1
0
File: yajl.c Project: cigor/py-yajl
static PyObject *_internal_stream_load(PyObject *args, unsigned int blocking)
{
    PyObject *decoder = NULL;
    PyObject *stream = NULL;
    PyObject *buffer = NULL;
    PyObject *result = NULL;
#ifdef IS_PYTHON3
    PyObject *bufferstring = NULL;
#endif

    if (!PyArg_ParseTuple(args, "O", &stream)) {
        goto bad_type;
    }

    if (__read == NULL) {
        __read = PyUnicode_FromString("read");
    }

    if (!PyObject_HasAttr(stream, __read)) {
        goto bad_type;
    }

    buffer = PyObject_CallMethodObjArgs(stream, __read, NULL);

    if (!buffer)
        return NULL;

#ifdef IS_PYTHON3
    bufferstring = PyUnicode_AsUTF8String(buffer);
    if (!bufferstring)
        return NULL;
#endif

    decoder = PyObject_Call((PyObject *)(&YajlDecoderType), NULL, NULL);
    if (decoder == NULL) {
        return NULL;
    }

#ifdef IS_PYTHON3
    result = _internal_decode((_YajlDecoder *)decoder, PyBytes_AsString(bufferstring),
                PyBytes_Size(bufferstring));
    Py_XDECREF(bufferstring);
#else
    result = _internal_decode((_YajlDecoder *)decoder, PyString_AsString(buffer),
                  PyString_Size(buffer));
#endif
    Py_XDECREF(decoder);
    Py_XDECREF(buffer);
    return result;

bad_type:
    PyErr_SetObject(PyExc_TypeError, PyUnicode_FromString("Must pass a single stream object"));
    return NULL;
}
Example #2
0
PyObject *py_yajldecoder_decode(PYARGS)
{
    _YajlDecoder *decoder = (_YajlDecoder *)(self);
    char *buffer = NULL;
    unsigned int buflen = 0;

    if (!PyArg_ParseTuple(args, "z#", &buffer, &buflen))
        return NULL;

    if (!buflen) {
        PyErr_SetObject(PyExc_ValueError,
                PyUnicode_FromString("Cannot parse an empty buffer"));
        return NULL;
    }
    return _internal_decode(decoder, buffer, buflen);
}
Example #3
0
PyObject *py_yajldecoder_decode(PYARGS)
{
    _YajlDecoder *decoder = (_YajlDecoder *)(self);
    char *buffer = NULL;
    PyObject *pybuffer = NULL;
    PyObject *result = NULL;
    Py_ssize_t buflen = 0;

    if (!PyArg_ParseTuple(args, "O", &pybuffer))
        return NULL;

    Py_INCREF(pybuffer);

    if (PyUnicode_Check(pybuffer)) {
        if (!(result = PyUnicode_AsUTF8String(pybuffer))) {
            Py_DECREF(pybuffer);
            return NULL;
        }
        Py_DECREF(pybuffer);
        pybuffer = result;
        result = NULL;
    }

    if (PyString_Check(pybuffer)) {
        if (PyString_AsStringAndSize(pybuffer, &buffer, &buflen)) {
            Py_DECREF(pybuffer);
            return NULL;
        }
    } else {
        /* really seems like this should be a TypeError, but
           tests/unit.py:ErrorCasesTests.test_None disagrees */
        Py_DECREF(pybuffer);
        PyErr_SetString(PyExc_ValueError, "string or unicode expected");
        return NULL;
    }

    if (!buflen) {
        PyErr_SetObject(PyExc_ValueError,
                PyUnicode_FromString("Cannot parse an empty buffer"));
        return NULL;
    }

    result = _internal_decode(decoder, buffer, (unsigned int)buflen);
    Py_DECREF(pybuffer);
    return result;
}
Example #4
0
static PyObject *py_loads(PYARGS)
{
    PyObject *decoder = NULL;
    PyObject *result = NULL;
    char *buffer = NULL;
    unsigned int buflen = 0;

    if (!PyArg_ParseTuple(args, "z#", &buffer, &buflen)) {
        return NULL;
    }
    
    decoder = PyObject_Call((PyObject *)(&YajlDecoderType), NULL, NULL);
    if (decoder == NULL) {
        return NULL;
    }

    result = _internal_decode((_YajlDecoder *)decoder, buffer, buflen);
    Py_XDECREF(decoder);
    return result;
}