mirror of https://github.com/sipwise/kamailio.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
2.2 KiB
143 lines
2.2 KiB
#ifndef _LIST_H
|
|
#define _LIST_H
|
|
|
|
#include <string.h>
|
|
#include "../../dprint.h"
|
|
#include "../../mem/mem.h"
|
|
|
|
typedef struct list_entry
|
|
{
|
|
str *strng;
|
|
struct list_entry *next;
|
|
} list_entry_t;
|
|
|
|
static inline list_entry_t *list_insert(str *strng, list_entry_t *list, int *duplicate)
|
|
{
|
|
int cmp;
|
|
list_entry_t *p, *q;
|
|
|
|
if (duplicate != NULL)
|
|
*duplicate = 0;
|
|
|
|
if (strng == NULL || strng->s == NULL || strng->len == 0)
|
|
{
|
|
LM_ERR("bad string\n");
|
|
return list;
|
|
}
|
|
|
|
if ((p = (list_entry_t *) pkg_malloc(sizeof(list_entry_t))) == NULL)
|
|
{
|
|
LM_ERR("out of memory\n");
|
|
return list;
|
|
}
|
|
p->strng = strng;
|
|
p->next = NULL;
|
|
|
|
if (list == NULL)
|
|
return p;
|
|
|
|
cmp = strncmp(list->strng->s, strng->s, strng->len);
|
|
|
|
if (cmp == 0)
|
|
{
|
|
if (duplicate != NULL)
|
|
*duplicate = 1;
|
|
return list;
|
|
}
|
|
if (cmp > 0)
|
|
{
|
|
p->next = list;
|
|
return p;
|
|
}
|
|
else
|
|
{
|
|
q = list;
|
|
while (q->next != NULL && (cmp = strncmp(q->next->strng->s, strng->s, strng->len)) < 0)
|
|
q = q->next;
|
|
|
|
if (cmp == 0)
|
|
{
|
|
if (duplicate != NULL)
|
|
*duplicate = 1;
|
|
return list;
|
|
}
|
|
|
|
p->next = q->next;
|
|
q->next = p;
|
|
return list;
|
|
}
|
|
}
|
|
|
|
static inline list_entry_t *list_remove(str strng, list_entry_t *list)
|
|
{
|
|
int cmp = 0;
|
|
list_entry_t *p = list;
|
|
|
|
if (list != NULL)
|
|
{
|
|
if (strncmp(p->strng->s, strng.s, strng.len) == 0)
|
|
{
|
|
pkg_free(p->strng->s);
|
|
pkg_free(p->strng);
|
|
pkg_free(p);
|
|
return list->next;
|
|
}
|
|
else
|
|
{
|
|
list_entry_t *p = list, *q;
|
|
|
|
while (p->next != NULL && (cmp = strncmp(p->next->strng->s, strng.s, strng.len)) < 0)
|
|
p = p->next;
|
|
|
|
if (cmp == 0)
|
|
{
|
|
q = p->next;
|
|
p->next = q->next;
|
|
pkg_free(q->strng->s);
|
|
pkg_free(q->strng);
|
|
pkg_free(q);
|
|
}
|
|
}
|
|
}
|
|
return list;
|
|
}
|
|
|
|
static inline str *list_pop(list_entry_t **list)
|
|
{
|
|
str *ret = NULL;
|
|
list_entry_t *tmp;
|
|
|
|
if (*list != NULL)
|
|
{
|
|
ret = (*list)->strng;
|
|
|
|
if ((*list)->next == NULL)
|
|
{
|
|
pkg_free(*list);
|
|
*list = NULL;
|
|
}
|
|
else
|
|
{
|
|
tmp = *list;
|
|
*list = (*list)->next;
|
|
pkg_free(tmp);
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static inline void list_free(list_entry_t **list)
|
|
{
|
|
str *strng;
|
|
|
|
while ((strng = list_pop(list)) != NULL)
|
|
{
|
|
pkg_free(strng->s);
|
|
pkg_free(strng);
|
|
}
|
|
*list = NULL;
|
|
}
|
|
|
|
#endif /* _LIST_H */
|