1
+ #define PY_SSIZE_T_CLEAN
2
+ #include <Python.h>
3
+ /*
4
+ struct OrderedSetItem {
5
+ int type;
6
+ void* value;
7
+ };
8
+
9
+ struct OrderedSet {
10
+ size_t offset;
11
+ size_t size;
12
+ struct OrderedSetItem* items;
13
+ };
14
+
15
+ static const size_t MIN_SET_SIZE = 128;
16
+
17
+ int orderedset_exists(
18
+ const struct OrderedSet* const ordered_set,
19
+ const int type,
20
+ const void* const value
21
+ ) {
22
+
23
+ size_t index = 0;
24
+ int exists = 0;
25
+
26
+ for (index = 0; index < ordered_set->offset; index++) {
27
+ const struct OrderedSetItem* const item = &ordered_set->items[index];
28
+ exists = strcmp(value, item->value) == 0;
29
+
30
+ if (exists) {
31
+ break;
32
+ }
33
+ }
34
+
35
+ return exists;
36
+
37
+ }
38
+
39
+ static PyObject* orderedset_init(PyObject* self, PyObject* args)
40
+ {
41
+ /*
42
+ const char *command;
43
+ int sts;
44
+
45
+ if (!PyArg_ParseTuple(args, "s", &command))
46
+ return NULL;
47
+ */
48
+
49
+ uintptr_t pointer = 0 ;
50
+
51
+ struct OrderedSet * ordered_set = malloc (sizeof (struct OrderedSet ));
52
+
53
+ if (ordered_set == NULL ) {
54
+ return PyErr_NoMemory ();
55
+ }
56
+
57
+ ordered_set -> offset = 0 ;
58
+ ordered_set -> size = sizeof (struct OrderedSetItem ) * MIN_SET_SIZE ;
59
+ ordered_set -> items = malloc (ordered_set -> size );
60
+
61
+ if (ordered_set -> items == NULL ) {
62
+ return PyErr_NoMemory ();
63
+ }
64
+
65
+ pointer = (uintptr_t ) ordered_set ;
66
+
67
+ return PyLong_FromLongLong (pointer );
68
+
69
+ }
70
+
71
+ static PyObject * orderedset_add (PyObject * self , PyObject * args )
72
+ {
73
+
74
+ unsigned long long pointer = 0 ;
75
+ const char * value = NULL ;
76
+
77
+ char * vitem = NULL ;
78
+
79
+ struct OrderedSet * ordered_set = NULL ;
80
+ struct OrderedSetItem item = {0 };
81
+
82
+ if (!PyArg_ParseTuple (args , "Ks" , & pointer , & value )) {
83
+ return NULL ;
84
+ }
85
+
86
+ ordered_set = (struct OrderedSet * ) pointer ;
87
+
88
+ if (orderedset_exists (ordered_set , 0 , value )) {
89
+ return PyBool_FromLong (0 );
90
+ }
91
+
92
+ vitem = malloc (strlen (value ) + 1 );
93
+
94
+ if (vitem == NULL ) {
95
+ return PyErr_NoMemory ();
96
+ }
97
+
98
+ strcpy (vitem , value );
99
+
100
+ item .value = vitem ;
101
+
102
+ ordered_set -> items [ordered_set -> offset ++ ] = item ;
103
+
104
+ if (ordered_set -> offset * sizeof (* ordered_set -> items ) == ordered_set -> size ) {
105
+ size_t size = ordered_set -> size * 2 ;
106
+ struct OrderedSetItem * items = realloc (ordered_set -> items , size );
107
+
108
+ if (items == NULL ) {
109
+ return PyErr_NoMemory ();
110
+ }
111
+
112
+ ordered_set -> size = size ;
113
+ ordered_set -> items = items ;
114
+ }
115
+
116
+ return PyBool_FromLong (1 );
117
+
118
+ }
119
+
120
+
121
+ static PyObject * orderedset_size (PyObject * self , PyObject * args )
122
+ {
123
+
124
+ unsigned long long pointer = 0 ;
125
+ struct OrderedSet * ordered_set = NULL ;
126
+
127
+ if (!PyArg_ParseTuple (args , "K" , & pointer )) {
128
+ return NULL ;
129
+ }
130
+
131
+ ordered_set = (struct OrderedSet * ) pointer ;
132
+
133
+ return PyLong_FromLongLong (ordered_set -> offset );
134
+
135
+ }
136
+
137
+ static PyObject * orderedset_getitem (PyObject * self , PyObject * args )
138
+ {
139
+
140
+ unsigned long long pointer = 0 ;
141
+ unsigned long long position = 0 ;
142
+
143
+ struct OrderedSet * ordered_set = NULL ;
144
+ struct OrderedSetItem * item = NULL ;
145
+
146
+ if (!PyArg_ParseTuple (args , "KK" , & pointer , & position )) {
147
+ return NULL ;
148
+ }
149
+
150
+ ordered_set = (struct OrderedSet * ) pointer ;
151
+
152
+ if (position > ordered_set -> offset ) {
153
+ return NULL ;
154
+ }
155
+
156
+ item = & ordered_set -> items [position ];
157
+
158
+ return PyUnicode_FromString (item -> value );
159
+
160
+ }
161
+ * /
162
+
163
+ static PyMethodDef methods [] = {
164
+ {
165
+ "orderedset_init" ,
166
+ orderedset_init ,
167
+ METH_VARARGS ,
168
+ "Execute a shell command."
169
+ }
170
+ /*
171
+ ,
172
+ {"orderedset_add", orderedset_add, METH_VARARGS,
173
+ "Execute a shell command."},
174
+ {"orderedset_size", orderedset_size, METH_VARARGS,
175
+ "Execute a shell command."},
176
+ {"orderedset_getitem", orderedset_getitem, METH_VARARGS,
177
+ "Execute a shell command."},
178
+ */
179
+ {NULL, NULL , 0 , NULL } /* Sentinel */
180
+ };
181
+
182
+ static struct PyModuleDef module = {
183
+ PyModuleDef_HEAD_INIT ,
184
+ "_kai" ,
185
+ NULL ,
186
+ -1 ,
187
+ methods
188
+ };
189
+
190
+ PyMODINIT_FUNC PyInit__kai (void ) {
191
+
192
+ return PyModule_Create (& module );
193
+
194
+ }
0 commit comments