144
146
return strcmp(remain_a, remain_b);
147
static void free_tree_items(struct tree_item *items, int num) {
149
for (i = 0; i < num; i++) {
150
Py_DECREF(items[i].tuple);
155
149
static PyObject *py_sorted_tree_items(PyObject *self, PyObject *entries)
157
struct tree_item *qsort_entries;
151
struct tree_item *qsort_entries = NULL;
152
int num_entries, n = 0, i;
153
PyObject *ret, *key, *value, *py_mode, *py_sha;
160
154
Py_ssize_t pos = 0;
161
PyObject *key, *value;
163
156
if (!PyDict_Check(entries)) {
164
157
PyErr_SetString(PyExc_TypeError, "Argument not a dictionary");
168
num = PyDict_Size(entries);
169
qsort_entries = malloc(num * sizeof(struct tree_item));
170
if (qsort_entries == NULL) {
161
num_entries = PyDict_Size(entries);
162
if (PyErr_Occurred())
164
qsort_entries = PyMem_New(struct tree_item, num_entries);
165
if (!qsort_entries) {
171
166
PyErr_NoMemory();
176
170
while (PyDict_Next(entries, &pos, &key, &value)) {
177
PyObject *py_mode, *py_int_mode, *py_sha;
179
171
if (!PyString_Check(key)) {
180
172
PyErr_SetString(PyExc_TypeError, "Name is not a string");
181
free_tree_items(qsort_entries, i);
185
176
if (PyTuple_Size(value) != 2) {
186
177
PyErr_SetString(PyExc_ValueError, "Tuple has invalid size");
187
free_tree_items(qsort_entries, i);
191
181
py_mode = PyTuple_GET_ITEM(value, 0);
192
py_int_mode = PyNumber_Int(py_mode);
182
if (!PyInt_Check(py_mode)) {
194
183
PyErr_SetString(PyExc_TypeError, "Mode is not an integral type");
195
free_tree_items(qsort_entries, i);
199
187
py_sha = PyTuple_GET_ITEM(value, 1);
200
188
if (!PyString_Check(py_sha)) {
201
189
PyErr_SetString(PyExc_TypeError, "SHA is not a string");
202
Py_DECREF(py_int_mode);
203
free_tree_items(qsort_entries, i);
206
qsort_entries[i].name = PyString_AS_STRING(key);
207
qsort_entries[i].mode = PyInt_AS_LONG(py_mode);
208
qsort_entries[i].tuple = PyTuple_Pack(3, key, py_int_mode, py_sha);
209
Py_DECREF(py_int_mode);
192
qsort_entries[n].name = PyString_AS_STRING(key);
193
qsort_entries[n].mode = PyInt_AS_LONG(py_mode);
195
qsort_entries[n].tuple = PyObject_CallFunctionObjArgs(
196
tree_entry_cls, key, py_mode, py_sha, NULL);
197
if (qsort_entries[n].tuple == NULL)
213
qsort(qsort_entries, num, sizeof(struct tree_item), cmp_tree_item);
202
qsort(qsort_entries, num_entries, sizeof(struct tree_item), cmp_tree_item);
215
ret = PyList_New(num);
204
ret = PyList_New(num_entries);
216
205
if (ret == NULL) {
217
free_tree_items(qsort_entries, i);
218
206
PyErr_NoMemory();
222
for (i = 0; i < num; i++) {
210
for (i = 0; i < num_entries; i++) {
223
211
PyList_SET_ITEM(ret, i, qsort_entries[i].tuple);
213
PyMem_Free(qsort_entries);
217
for (i = 0; i < n; i++) {
218
Py_XDECREF(qsort_entries[i].tuple);
220
PyMem_Free(qsort_entries);
231
224
static PyMethodDef py_objects_methods[] = {