[core] builtin named list operations added;
This commit is contained in:
parent
2114a4944a
commit
868b7f41f6
@ -311,6 +311,12 @@ struct _stream_entry_node {
|
||||
list_node_t node;
|
||||
};
|
||||
|
||||
struct _stream_named_order_node {
|
||||
int order;
|
||||
char *name;
|
||||
list_node_t node;
|
||||
};
|
||||
|
||||
struct _stream_list_node {
|
||||
list_head_t *list;
|
||||
list_node_t node;
|
||||
@ -423,10 +429,19 @@ int sxmp_rpclist_filter(usrtc_t *source, usrtc_t **dest, int flag, int *filter);
|
||||
void sxstream_generic_slist_free(list_head_t *list);
|
||||
int sxstream_generic_slist_additem(list_head_t *list, const char *value);
|
||||
|
||||
void sxstream_generic_named_free(list_head_t *list);
|
||||
int sxstream_generic_nmlist_additem(list_head_t *list, const char *name,
|
||||
int order);
|
||||
const char *sxstream_generic_named_lookupname(list_head_t *list, int order);
|
||||
int sxstream_generic_named_lookuporder(list_head_t *list, const char *name);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#define sxstream_generic_named_alloc() \
|
||||
sxstream_generic_slist_alloc()
|
||||
|
||||
#define blub(txt) fprintf(stderr, "%s:%d in %s > %s\n", __FILE__, __LINE__, __FUNCTION__, txt)
|
||||
|
||||
#define dumphead(head) fprintf(stderr, "id: %d, opcode: %d, attr: %d, len = %d, reserve: %d\n", (head)->msgid, (head)->opcode, (head)->attr, (head)->payload_length, (head)->reserve)
|
||||
|
@ -87,3 +87,78 @@ int sxstream_generic_slist_additem(list_head_t *list, const char *value)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sxstream_generic_nmlist_additem(list_head_t *list, const char *name, int order)
|
||||
{
|
||||
struct _stream_named_order_node *entry = malloc(sizeof(struct _stream_named_order_node));
|
||||
size_t name_len = 0;
|
||||
|
||||
if(!entry || !list) return -1;
|
||||
if(!name) {
|
||||
__enomem:
|
||||
free(entry);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* check up */
|
||||
if(strchr(name, '"')) goto __enomem;
|
||||
else name_len = strlen(name) + 2*sizeof(char);
|
||||
|
||||
if(!(entry->name = malloc(name_len))) goto __enomem;
|
||||
else snprintf(entry->name, name_len, ":%s", name);
|
||||
entry->order = order;
|
||||
|
||||
/* add to list */
|
||||
list_init_node(&entry->node);
|
||||
list_add2tail(list, &entry->node);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void sxstream_generic_named_free(list_head_t *list)
|
||||
{
|
||||
struct _stream_named_order_node *entry;
|
||||
list_node_t *iter, *siter;
|
||||
|
||||
if(!list) return;
|
||||
|
||||
list_for_each_safe(list, iter, siter) {
|
||||
entry = list_entry(iter, struct _stream_named_order_node, node);
|
||||
list_del(iter);
|
||||
free(entry->name);
|
||||
free(entry);
|
||||
}
|
||||
|
||||
free(list);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const char *sxstream_generic_named_lookupname(list_head_t *list, int order)
|
||||
{
|
||||
struct _stream_named_order_node *entry;
|
||||
list_node_t *iter, *siter;
|
||||
|
||||
if(!list) return NULL;
|
||||
|
||||
list_for_each_safe(list, iter, siter) {
|
||||
entry = list_entry(iter, struct _stream_named_order_node, node);
|
||||
if(entry->order == order) return entry->name + sizeof(char);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int sxstream_generic_named_lookuporder(list_head_t *list, const char *name)
|
||||
{
|
||||
struct _stream_named_order_node *entry;
|
||||
list_node_t *iter, *siter;
|
||||
|
||||
if(!list || !name) return -1;
|
||||
|
||||
list_for_each_safe(list, iter, siter) {
|
||||
entry = list_entry(iter, struct _stream_named_order_node, node);
|
||||
if(!strcmp(entry->name + sizeof(char), name)) return entry->order;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user