UnicodeSet * RuleBasedCollator::getTailoredSet(UErrorCode &status) const { if(U_FAILURE(status)) { return NULL; } return (UnicodeSet *)ucol_getTailoredSet(this->ucollator, &status); }
// Collator.contractions {{{ static PyObject * icu_Collator_contractions(icu_Collator *self, PyObject *args, PyObject *kwargs) { UErrorCode status = U_ZERO_ERROR; UChar *str = NULL; UChar32 start=0, end=0; int32_t count = 0, len = 0, i; PyObject *ans = Py_None, *pbuf; if (self->contractions == NULL) { self->contractions = uset_open(1, 0); if (self->contractions == NULL) return PyErr_NoMemory(); self->contractions = ucol_getTailoredSet(self->collator, &status); } status = U_ZERO_ERROR; count = uset_getItemCount(self->contractions); str = (UChar*)calloc(100, sizeof(UChar)); if (str == NULL) { PyErr_NoMemory(); goto end; } ans = PyTuple_New(count); if (ans == NULL) { goto end; } for (i = 0; i < count; i++) { len = uset_getItem(self->contractions, i, &start, &end, str, 1000, &status); if (len >= 2) { // We have a string status = U_ZERO_ERROR; pbuf = icu_to_python(str, len); if (pbuf == NULL) { Py_DECREF(ans); ans = NULL; goto end; } PyTuple_SetItem(ans, i, pbuf); } else { // Ranges dont make sense for contractions, ignore them PyTuple_SetItem(ans, i, Py_None); Py_INCREF(Py_None); } } end: if (str != NULL) free(str); return ans; } // }}}
// Collator.contractions {{{ static PyObject * icu_Collator_contractions(icu_Collator *self, PyObject *args, PyObject *kwargs) { UErrorCode status = U_ZERO_ERROR; UChar *str; UChar32 start=0, end=0; int32_t count = 0, len = 0, dlen = 0, i; PyObject *ans = Py_None, *pbuf; wchar_t *buf; if (self->contractions == NULL) { self->contractions = uset_open(1, 0); if (self->contractions == NULL) return PyErr_NoMemory(); self->contractions = ucol_getTailoredSet(self->collator, &status); } status = U_ZERO_ERROR; str = (UChar*)calloc(100, sizeof(UChar)); buf = (wchar_t*)calloc(4*100+2, sizeof(wchar_t)); if (str == NULL || buf == NULL) return PyErr_NoMemory(); count = uset_getItemCount(self->contractions); ans = PyTuple_New(count); if (ans != NULL) { for (i = 0; i < count; i++) { len = uset_getItem(self->contractions, i, &start, &end, str, 1000, &status); if (len >= 2) { // We have a string status = U_ZERO_ERROR; u_strToWCS(buf, 4*100 + 1, &dlen, str, len, &status); pbuf = PyUnicode_FromWideChar(buf, dlen); if (pbuf == NULL) return PyErr_NoMemory(); PyTuple_SetItem(ans, i, pbuf); } else { // Ranges dont make sense for contractions, ignore them PyTuple_SetItem(ans, i, Py_None); } } } free(str); free(buf); return Py_BuildValue("O", ans); } // }}}