Initial merge-commit of the OIC code. Should successfully do discovery for single...
[platform/upstream/iotivity.git] / csdk / libcoap-4.1.1 / coap_list.c
1 /* coap_list.c -- CoAP list structures
2  *
3  * Copyright (C) 2010,2011 Olaf Bergmann <bergmann@tzi.org>
4  *
5  * This file is part of the CoAP library libcoap. Please see
6  * README for terms of use.
7  */
8
9 #include "config.h"
10
11 #include <stdio.h>
12 #include <string.h>
13
14 #include "debug.h"
15 #include "mem.h"
16 #include "coap_list.h"
17
18 int
19 coap_insert(coap_list_t **queue, coap_list_t *node,
20             int (*order)(void *, void *node) ) {
21   coap_list_t *p, *q;
22   if ( !queue || !node )
23     return 0;
24
25   /* set queue head if empty */
26   if ( !*queue ) {
27     *queue = node;
28     return 1;
29   }
30
31   /* replace queue head if new node has to be added before the existing queue head */
32   q = *queue;
33   if ( order( node->data, q->data ) < 0) {
34     node->next = q;
35     *queue = node;
36     return 1;
37   }
38
39   /* search for right place to insert */
40   do {
41     p = q;
42     q = q->next;
43   } while ( q && order( node->data, q->data ) >= 0);
44
45   /* insert new item */
46   node->next = q;
47   p->next = node;
48   return 1;
49 }
50
51 int
52 coap_delete(coap_list_t *node) {
53   if ( !node )
54     return 0;
55
56   if ( node->delete_func )
57     node->delete_func( node->data );
58   coap_free( node->data );
59   coap_free( node );
60
61   return 1;
62 }
63
64 void
65 coap_delete_list(coap_list_t *queue) {
66   if ( !queue )
67     return;
68
69   coap_delete_list( queue->next );
70   coap_delete( queue );
71 }
72
73 coap_list_t *
74 coap_new_listnode(void *data, void (*delete_func)(void *) ) {
75   coap_list_t *node = (coap_list_t*)coap_malloc( sizeof(coap_list_t) );
76   if ( ! node ) {
77 #ifndef NDEBUG
78     coap_log(LOG_CRIT, "coap_new_listnode: malloc\n");
79 #endif
80     return NULL;
81   }
82
83   memset(node, 0, sizeof(coap_list_t));
84   node->data = data;
85   node->delete_func = delete_func;
86   return node;
87 }
88