static PyObject* Row_repr(PyObject* o) { Row* self = (Row*)o; if (self->cValues == 0) return PyString_FromString("()"); Object pieces(PyTuple_New(self->cValues)); if (!pieces) return 0; Py_ssize_t length = 2 + (2 * (self->cValues-1)); // parens + ', ' separators for (Py_ssize_t i = 0; i < self->cValues; i++) { PyObject* piece = PyObject_Repr(self->apValues[i]); if (!piece) return 0; length += Text_Size(piece); PyTuple_SET_ITEM(pieces.Get(), i, piece); } if (self->cValues == 1) { // Need a trailing comma: (value,) length += 2; } PyObject* result = Text_New(length); if (!result) return 0; TEXT_T* buffer = Text_Buffer(result); Py_ssize_t offset = 0; buffer[offset++] = '('; for (Py_ssize_t i = 0; i < self->cValues; i++) { PyObject* item = PyTuple_GET_ITEM(pieces.Get(), i); memcpy(&buffer[offset], Text_Buffer(item), Text_Size(item) * sizeof(TEXT_T)); offset += Text_Size(item); if (i != self->cValues-1 || self->cValues == 1) { buffer[offset++] = ','; buffer[offset++] = ' '; } } buffer[offset++] = ')'; I(offset == length); return result; }
static ExpatStatus builder_Characters(void *userState, PyObject *data) { ParserState *state = (ParserState *)userState; NodeObject *node; #ifdef DEBUG_PARSER fprintf(stderr, "--- builder_Characters(data="); PyObject_Print(data, stderr, 0); fprintf(stderr, ")\n"); #endif if (state->text_factory) { node = (NodeObject *)PyObject_CallFunctionObjArgs(state->text_factory, data, NULL); if (node == NULL) return EXPAT_STATUS_ERROR; if (!Text_Check(node)) { PyErr_Format(PyExc_TypeError, "xml_text_factory should return text, not %s", node->ob_type->tp_name); Py_DECREF(node); return EXPAT_STATUS_ERROR; } } else { node = (NodeObject *)Text_New(data); if (node == NULL) return EXPAT_STATUS_ERROR; } /* ParserState_AddNode steals the reference to the new node */ if (ParserState_AddNode(state, node) < 0) { Py_DECREF(node); return EXPAT_STATUS_ERROR; } return EXPAT_STATUS_OK; }