interpol/c/internal_deque.c

71 lines
989 B
C
Raw Normal View History

2019-07-24 17:19:41 +00:00
#include "internal_deque.h"
#include <stdlib.h>
i_deque_t *
i_deque_t_new
( PyObject * content
, i_deque_t * next)
{
i_deque_t * deque = malloc(sizeof(i_deque_t));
if(!deque)
{
return NULL;
}
deque->content = content;
deque->next = next;
if(next)
{
deque->following = next->following + 1;
}
else
{
deque->following = 0;
}
return deque;
}
void
i_deque_t_del
(i_deque_t * deque)
{
if(deque)
{
free(deque);
}
}
PyObject *
i_deque_t_to_List
(i_deque_t * deque)
{
if(!deque)
{
return PyList_New(0);
}
PyObject * list = PyList_New(deque->following + 1);
if(!list)
{
return NULL;
}
i_deque_t * this_node;
PyObject * this_content;
size_t i;
size_t content_length = deque->following + 1;
for(i = 0; i < content_length; i++)
{
this_node = deque;
deque = deque->next;
this_content = this_node->content;
i_deque_t_del(this_node);
Py_INCREF(this_content);
PyList_SetItem(list, content_length - 1 - i, this_content);
}
return list;
}