12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- #ifndef _MULTIDICT_ISTR_H
- #define _MULTIDICT_ISTR_H
- #ifdef __cplusplus
- extern "C" {
- #endif
- typedef struct {
- PyUnicodeObject str;
- PyObject * canonical;
- } istrobject;
- PyDoc_STRVAR(istr__doc__, "istr class implementation");
- static PyTypeObject istr_type;
- static inline void
- istr_dealloc(istrobject *self)
- {
- Py_XDECREF(self->canonical);
- PyUnicode_Type.tp_dealloc((PyObject*)self);
- }
- static inline PyObject *
- istr_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
- {
- PyObject *x = NULL;
- static char *kwlist[] = {"object", "encoding", "errors", 0};
- PyObject *encoding = NULL;
- PyObject *errors = NULL;
- PyObject *s = NULL;
- PyObject * ret = NULL;
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOO:str",
- kwlist, &x, &encoding, &errors)) {
- return NULL;
- }
- if (x != NULL && Py_TYPE(x) == &istr_type) {
- Py_INCREF(x);
- return x;
- }
- ret = PyUnicode_Type.tp_new(type, args, kwds);
- if (!ret) {
- goto fail;
- }
- s =_PyObject_CallMethodId(ret, &PyId_lower, NULL);
- if (!s) {
- goto fail;
- }
- ((istrobject*)ret)->canonical = s;
- s = NULL; /* the reference is stollen by .canonical */
- return ret;
- fail:
- Py_XDECREF(ret);
- return NULL;
- }
- static PyTypeObject istr_type = {
- PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0)
- "multidict._multidict.istr",
- sizeof(istrobject),
- .tp_dealloc = (destructor)istr_dealloc,
- .tp_flags = Py_TPFLAGS_DEFAULT
- | Py_TPFLAGS_BASETYPE
- | Py_TPFLAGS_UNICODE_SUBCLASS,
- .tp_doc = istr__doc__,
- .tp_base = DEFERRED_ADDRESS(&PyUnicode_Type),
- .tp_new = (newfunc)istr_new,
- };
- static inline int
- istr_init(void)
- {
- istr_type.tp_base = &PyUnicode_Type;
- if (PyType_Ready(&istr_type) < 0) {
- return -1;
- }
- return 0;
- }
- #ifdef __cplusplus
- }
- #endif
- #endif
|