xref: /third_party/python/Doc/includes/custom2.c (revision 7db96d56)
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