17db96d56Sopenharmony_ci#define PY_SSIZE_T_CLEAN 27db96d56Sopenharmony_ci#include <Python.h> 37db96d56Sopenharmony_ci#include "structmember.h" 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_citypedef struct { 67db96d56Sopenharmony_ci PyObject_HEAD 77db96d56Sopenharmony_ci PyObject *first; /* first name */ 87db96d56Sopenharmony_ci PyObject *last; /* last name */ 97db96d56Sopenharmony_ci int number; 107db96d56Sopenharmony_ci} CustomObject; 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_cistatic void 137db96d56Sopenharmony_ciCustom_dealloc(CustomObject *self) 147db96d56Sopenharmony_ci{ 157db96d56Sopenharmony_ci Py_XDECREF(self->first); 167db96d56Sopenharmony_ci Py_XDECREF(self->last); 177db96d56Sopenharmony_ci Py_TYPE(self)->tp_free((PyObject *) self); 187db96d56Sopenharmony_ci} 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_cistatic PyObject * 217db96d56Sopenharmony_ciCustom_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 227db96d56Sopenharmony_ci{ 237db96d56Sopenharmony_ci CustomObject *self; 247db96d56Sopenharmony_ci self = (CustomObject *) type->tp_alloc(type, 0); 257db96d56Sopenharmony_ci if (self != NULL) { 267db96d56Sopenharmony_ci self->first = PyUnicode_FromString(""); 277db96d56Sopenharmony_ci if (self->first == NULL) { 287db96d56Sopenharmony_ci Py_DECREF(self); 297db96d56Sopenharmony_ci return NULL; 307db96d56Sopenharmony_ci } 317db96d56Sopenharmony_ci self->last = PyUnicode_FromString(""); 327db96d56Sopenharmony_ci if (self->last == NULL) { 337db96d56Sopenharmony_ci Py_DECREF(self); 347db96d56Sopenharmony_ci return NULL; 357db96d56Sopenharmony_ci } 367db96d56Sopenharmony_ci self->number = 0; 377db96d56Sopenharmony_ci } 387db96d56Sopenharmony_ci return (PyObject *) self; 397db96d56Sopenharmony_ci} 407db96d56Sopenharmony_ci 417db96d56Sopenharmony_cistatic int 427db96d56Sopenharmony_ciCustom_init(CustomObject *self, PyObject *args, PyObject *kwds) 437db96d56Sopenharmony_ci{ 447db96d56Sopenharmony_ci static char *kwlist[] = {"first", "last", "number", NULL}; 457db96d56Sopenharmony_ci PyObject *first = NULL, *last = NULL, *tmp; 467db96d56Sopenharmony_ci 477db96d56Sopenharmony_ci if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist, 487db96d56Sopenharmony_ci &first, &last, 497db96d56Sopenharmony_ci &self->number)) 507db96d56Sopenharmony_ci return -1; 517db96d56Sopenharmony_ci 527db96d56Sopenharmony_ci if (first) { 537db96d56Sopenharmony_ci tmp = self->first; 547db96d56Sopenharmony_ci Py_INCREF(first); 557db96d56Sopenharmony_ci self->first = first; 567db96d56Sopenharmony_ci Py_XDECREF(tmp); 577db96d56Sopenharmony_ci } 587db96d56Sopenharmony_ci if (last) { 597db96d56Sopenharmony_ci tmp = self->last; 607db96d56Sopenharmony_ci Py_INCREF(last); 617db96d56Sopenharmony_ci self->last = last; 627db96d56Sopenharmony_ci Py_XDECREF(tmp); 637db96d56Sopenharmony_ci } 647db96d56Sopenharmony_ci return 0; 657db96d56Sopenharmony_ci} 667db96d56Sopenharmony_ci 677db96d56Sopenharmony_cistatic PyMemberDef Custom_members[] = { 687db96d56Sopenharmony_ci {"first", T_OBJECT_EX, offsetof(CustomObject, first), 0, 697db96d56Sopenharmony_ci "first name"}, 707db96d56Sopenharmony_ci {"last", T_OBJECT_EX, offsetof(CustomObject, last), 0, 717db96d56Sopenharmony_ci "last name"}, 727db96d56Sopenharmony_ci {"number", T_INT, offsetof(CustomObject, number), 0, 737db96d56Sopenharmony_ci "custom number"}, 747db96d56Sopenharmony_ci {NULL} /* Sentinel */ 757db96d56Sopenharmony_ci}; 767db96d56Sopenharmony_ci 777db96d56Sopenharmony_cistatic PyObject * 787db96d56Sopenharmony_ciCustom_name(CustomObject *self, PyObject *Py_UNUSED(ignored)) 797db96d56Sopenharmony_ci{ 807db96d56Sopenharmony_ci if (self->first == NULL) { 817db96d56Sopenharmony_ci PyErr_SetString(PyExc_AttributeError, "first"); 827db96d56Sopenharmony_ci return NULL; 837db96d56Sopenharmony_ci } 847db96d56Sopenharmony_ci if (self->last == NULL) { 857db96d56Sopenharmony_ci PyErr_SetString(PyExc_AttributeError, "last"); 867db96d56Sopenharmony_ci return NULL; 877db96d56Sopenharmony_ci } 887db96d56Sopenharmony_ci return PyUnicode_FromFormat("%S %S", self->first, self->last); 897db96d56Sopenharmony_ci} 907db96d56Sopenharmony_ci 917db96d56Sopenharmony_cistatic PyMethodDef Custom_methods[] = { 927db96d56Sopenharmony_ci {"name", (PyCFunction) Custom_name, METH_NOARGS, 937db96d56Sopenharmony_ci "Return the name, combining the first and last name" 947db96d56Sopenharmony_ci }, 957db96d56Sopenharmony_ci {NULL} /* Sentinel */ 967db96d56Sopenharmony_ci}; 977db96d56Sopenharmony_ci 987db96d56Sopenharmony_cistatic PyTypeObject CustomType = { 997db96d56Sopenharmony_ci PyVarObject_HEAD_INIT(NULL, 0) 1007db96d56Sopenharmony_ci .tp_name = "custom2.Custom", 1017db96d56Sopenharmony_ci .tp_doc = PyDoc_STR("Custom objects"), 1027db96d56Sopenharmony_ci .tp_basicsize = sizeof(CustomObject), 1037db96d56Sopenharmony_ci .tp_itemsize = 0, 1047db96d56Sopenharmony_ci .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, 1057db96d56Sopenharmony_ci .tp_new = Custom_new, 1067db96d56Sopenharmony_ci .tp_init = (initproc) Custom_init, 1077db96d56Sopenharmony_ci .tp_dealloc = (destructor) Custom_dealloc, 1087db96d56Sopenharmony_ci .tp_members = Custom_members, 1097db96d56Sopenharmony_ci .tp_methods = Custom_methods, 1107db96d56Sopenharmony_ci}; 1117db96d56Sopenharmony_ci 1127db96d56Sopenharmony_cistatic PyModuleDef custommodule = { 1137db96d56Sopenharmony_ci PyModuleDef_HEAD_INIT, 1147db96d56Sopenharmony_ci .m_name = "custom2", 1157db96d56Sopenharmony_ci .m_doc = "Example module that creates an extension type.", 1167db96d56Sopenharmony_ci .m_size = -1, 1177db96d56Sopenharmony_ci}; 1187db96d56Sopenharmony_ci 1197db96d56Sopenharmony_ciPyMODINIT_FUNC 1207db96d56Sopenharmony_ciPyInit_custom2(void) 1217db96d56Sopenharmony_ci{ 1227db96d56Sopenharmony_ci PyObject *m; 1237db96d56Sopenharmony_ci if (PyType_Ready(&CustomType) < 0) 1247db96d56Sopenharmony_ci return NULL; 1257db96d56Sopenharmony_ci 1267db96d56Sopenharmony_ci m = PyModule_Create(&custommodule); 1277db96d56Sopenharmony_ci if (m == NULL) 1287db96d56Sopenharmony_ci return NULL; 1297db96d56Sopenharmony_ci 1307db96d56Sopenharmony_ci Py_INCREF(&CustomType); 1317db96d56Sopenharmony_ci if (PyModule_AddObject(m, "Custom", (PyObject *) &CustomType) < 0) { 1327db96d56Sopenharmony_ci Py_DECREF(&CustomType); 1337db96d56Sopenharmony_ci Py_DECREF(m); 1347db96d56Sopenharmony_ci return NULL; 1357db96d56Sopenharmony_ci } 1367db96d56Sopenharmony_ci 1377db96d56Sopenharmony_ci return m; 1387db96d56Sopenharmony_ci} 139