~ubuntu-branches/ubuntu/trusty/python3.4/trusty-proposed

« back to all changes in this revision

Viewing changes to Doc/includes/noddy2.c

  • Committer: Package Import Robot
  • Author(s): Matthias Klose
  • Date: 2013-11-25 09:44:27 UTC
  • Revision ID: package-import@ubuntu.com-20131125094427-lzxj8ap5w01lmo7f
Tags: upstream-3.4~b1
ImportĀ upstreamĀ versionĀ 3.4~b1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <Python.h>
 
2
#include "structmember.h"
 
3
 
 
4
typedef struct {
 
5
    PyObject_HEAD
 
6
    PyObject *first; /* first name */
 
7
    PyObject *last;  /* last name */
 
8
    int number;
 
9
} Noddy;
 
10
 
 
11
static void
 
12
Noddy_dealloc(Noddy* self)
 
13
{
 
14
    Py_XDECREF(self->first);
 
15
    Py_XDECREF(self->last);
 
16
    Py_TYPE(self)->tp_free((PyObject*)self);
 
17
}
 
18
 
 
19
static PyObject *
 
20
Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 
21
{
 
22
    Noddy *self;
 
23
 
 
24
    self = (Noddy *)type->tp_alloc(type, 0);
 
25
    if (self != NULL) {
 
26
        self->first = PyUnicode_FromString("");
 
27
        if (self->first == NULL) {
 
28
            Py_DECREF(self);
 
29
            return NULL;
 
30
        }
 
31
 
 
32
        self->last = PyUnicode_FromString("");
 
33
        if (self->last == NULL) {
 
34
            Py_DECREF(self);
 
35
            return NULL;
 
36
        }
 
37
 
 
38
        self->number = 0;
 
39
    }
 
40
 
 
41
    return (PyObject *)self;
 
42
}
 
43
 
 
44
static int
 
45
Noddy_init(Noddy *self, PyObject *args, PyObject *kwds)
 
46
{
 
47
    PyObject *first=NULL, *last=NULL, *tmp;
 
48
 
 
49
    static char *kwlist[] = {"first", "last", "number", NULL};
 
50
 
 
51
    if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist,
 
52
                                      &first, &last,
 
53
                                      &self->number))
 
54
        return -1;
 
55
 
 
56
    if (first) {
 
57
        tmp = self->first;
 
58
        Py_INCREF(first);
 
59
        self->first = first;
 
60
        Py_XDECREF(tmp);
 
61
    }
 
62
 
 
63
    if (last) {
 
64
        tmp = self->last;
 
65
        Py_INCREF(last);
 
66
        self->last = last;
 
67
        Py_XDECREF(tmp);
 
68
    }
 
69
 
 
70
    return 0;
 
71
}
 
72
 
 
73
 
 
74
static PyMemberDef Noddy_members[] = {
 
75
    {"first", T_OBJECT_EX, offsetof(Noddy, first), 0,
 
76
     "first name"},
 
77
    {"last", T_OBJECT_EX, offsetof(Noddy, last), 0,
 
78
     "last name"},
 
79
    {"number", T_INT, offsetof(Noddy, number), 0,
 
80
     "noddy number"},
 
81
    {NULL}  /* Sentinel */
 
82
};
 
83
 
 
84
static PyObject *
 
85
Noddy_name(Noddy* self)
 
86
{
 
87
    if (self->first == NULL) {
 
88
        PyErr_SetString(PyExc_AttributeError, "first");
 
89
        return NULL;
 
90
    }
 
91
 
 
92
    if (self->last == NULL) {
 
93
        PyErr_SetString(PyExc_AttributeError, "last");
 
94
        return NULL;
 
95
    }
 
96
 
 
97
    return PyUnicode_FromFormat("%S %S", self->first, self->last);
 
98
}
 
99
 
 
100
static PyMethodDef Noddy_methods[] = {
 
101
    {"name", (PyCFunction)Noddy_name, METH_NOARGS,
 
102
     "Return the name, combining the first and last name"
 
103
    },
 
104
    {NULL}  /* Sentinel */
 
105
};
 
106
 
 
107
static PyTypeObject NoddyType = {
 
108
    PyVarObject_HEAD_INIT(NULL, 0)
 
109
    "noddy.Noddy",             /* tp_name */
 
110
    sizeof(Noddy),             /* tp_basicsize */
 
111
    0,                         /* tp_itemsize */
 
112
    (destructor)Noddy_dealloc, /* tp_dealloc */
 
113
    0,                         /* tp_print */
 
114
    0,                         /* tp_getattr */
 
115
    0,                         /* tp_setattr */
 
116
    0,                         /* tp_reserved */
 
117
    0,                         /* tp_repr */
 
118
    0,                         /* tp_as_number */
 
119
    0,                         /* tp_as_sequence */
 
120
    0,                         /* tp_as_mapping */
 
121
    0,                         /* tp_hash  */
 
122
    0,                         /* tp_call */
 
123
    0,                         /* tp_str */
 
124
    0,                         /* tp_getattro */
 
125
    0,                         /* tp_setattro */
 
126
    0,                         /* tp_as_buffer */
 
127
    Py_TPFLAGS_DEFAULT |
 
128
        Py_TPFLAGS_BASETYPE,   /* tp_flags */
 
129
    "Noddy objects",           /* tp_doc */
 
130
    0,                         /* tp_traverse */
 
131
    0,                         /* tp_clear */
 
132
    0,                         /* tp_richcompare */
 
133
    0,                         /* tp_weaklistoffset */
 
134
    0,                         /* tp_iter */
 
135
    0,                         /* tp_iternext */
 
136
    Noddy_methods,             /* tp_methods */
 
137
    Noddy_members,             /* tp_members */
 
138
    0,                         /* tp_getset */
 
139
    0,                         /* tp_base */
 
140
    0,                         /* tp_dict */
 
141
    0,                         /* tp_descr_get */
 
142
    0,                         /* tp_descr_set */
 
143
    0,                         /* tp_dictoffset */
 
144
    (initproc)Noddy_init,      /* tp_init */
 
145
    0,                         /* tp_alloc */
 
146
    Noddy_new,                 /* tp_new */
 
147
};
 
148
 
 
149
static PyModuleDef noddy2module = {
 
150
    PyModuleDef_HEAD_INIT,
 
151
    "noddy2",
 
152
    "Example module that creates an extension type.",
 
153
    -1,
 
154
    NULL, NULL, NULL, NULL, NULL
 
155
};
 
156
 
 
157
PyMODINIT_FUNC
 
158
PyInit_noddy2(void)
 
159
{
 
160
    PyObject* m;
 
161
 
 
162
    if (PyType_Ready(&NoddyType) < 0)
 
163
        return NULL;
 
164
 
 
165
    m = PyModule_Create(&noddy2module);
 
166
    if (m == NULL)
 
167
        return NULL;
 
168
 
 
169
    Py_INCREF(&NoddyType);
 
170
    PyModule_AddObject(m, "Noddy", (PyObject *)&NoddyType);
 
171
    return m;
 
172
}