static int Matcher_init(Matcher *self, PyObject *args, PyObject *kwds) { PyObject *items = NULL, *p = NULL, *py_items = NULL, *level1 = NULL, *level2 = NULL, *level3 = NULL; int32_t i = 0; if (!PyArg_ParseTuple(args, "OOOO", &items, &level1, &level2, &level3)) return -1; py_items = PySequence_Fast(items, "Must pass in two sequence objects"); if (py_items == NULL) goto end; self->item_count = (uint32_t)PySequence_Size(items); self->items = (UChar**)calloc(self->item_count, sizeof(UChar*)); self->item_lengths = (int32_t*)calloc(self->item_count, sizeof(uint32_t)); self->level1 = python_to_icu(level1, NULL, 1); self->level2 = python_to_icu(level2, NULL, 1); self->level3 = python_to_icu(level3, NULL, 1); if (self->items == NULL || self->item_lengths == NULL ) { PyErr_NoMemory(); goto end; } if (self->level1 == NULL || self->level2 == NULL || self->level3 == NULL) goto end; for (i = 0; i < (int32_t)self->item_count; i++) { p = PySequence_Fast_GET_ITEM(py_items, i); self->items[i] = python_to_icu(p, self->item_lengths + i, 1); if (self->items[i] == NULL) { PyErr_NoMemory(); goto end; } } end: Py_XDECREF(py_items); if (PyErr_Occurred()) { free_matcher(self); } return (PyErr_Occurred()) ? -1 : 0; }
static int Matcher_init(Matcher *self, PyObject *args, PyObject *kwds) { PyObject *items = NULL, *p = NULL, *py_items = NULL, *level1 = NULL, *level2 = NULL, *level3 = NULL, *collator = NULL; int32_t i = 0; UErrorCode status = U_ZERO_ERROR; UCollator *col = NULL; if (!PyArg_ParseTuple(args, "OOOOO", &items, &collator, &level1, &level2, &level3)) return -1; // Clone the passed in collator (cloning is needed as collators are not thread safe) if (!PyCapsule_CheckExact(collator)) { PyErr_SetString(PyExc_TypeError, "Collator must be a capsule"); return -1; } col = (UCollator*)PyCapsule_GetPointer(collator, NULL); if (col == NULL) return -1; self->collator = ucol_safeClone(col, NULL, NULL, &status); col = NULL; if (U_FAILURE(status)) { self->collator = NULL; PyErr_SetString(PyExc_ValueError, u_errorName(status)); return -1; } py_items = PySequence_Fast(items, "Must pass in two sequence objects"); if (py_items == NULL) goto end; self->item_count = (uint32_t)PySequence_Size(items); self->items = (UChar**)calloc(self->item_count, sizeof(UChar*)); self->item_lengths = (int32_t*)calloc(self->item_count, sizeof(uint32_t)); self->level1 = python_to_icu(level1, NULL); self->level2 = python_to_icu(level2, NULL); self->level3 = python_to_icu(level3, NULL); if (self->items == NULL || self->item_lengths == NULL ) { PyErr_NoMemory(); goto end; } if (self->level1 == NULL || self->level2 == NULL || self->level3 == NULL) goto end; for (i = 0; i < (int32_t)self->item_count; i++) { p = PySequence_Fast_GET_ITEM(py_items, i); self->items[i] = python_to_icu(p, self->item_lengths + i); if (self->items[i] == NULL) { PyErr_NoMemory(); goto end; } } end: Py_XDECREF(py_items); if (PyErr_Occurred()) { free_matcher(self); } return (PyErr_Occurred()) ? -1 : 0; }
static void Matcher_dealloc(Matcher* self) { free_matcher(self); Py_TYPE(self)->tp_free((PyObject*)self); }
static void Matcher_dealloc(Matcher* self) { free_matcher(self); self->ob_type->tp_free((PyObject*)self); }