]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.0.0/liblfds600/src/lfds600_slist/lfds600_slist_new.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.0.0 / liblfds600 / src / lfds600_slist / lfds600_slist_new.c
1 #include "lfds600_slist_internal.h"
2
3
4
5
6
7 /****************************************************************************/
8 int lfds600_slist_new( struct lfds600_slist_state **ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state )
9 {
10   int
11     rv = 0;
12
13   assert( ss != NULL );
14   // TRD : user_data_delete_function can be NULL
15   // TRD : user_state can be NULL
16
17   *ss = (struct lfds600_slist_state *) lfds600_abstraction_aligned_malloc( sizeof(struct lfds600_slist_state), LFDS600_ALIGN_SINGLE_POINTER );
18
19   if( *ss != NULL )
20   {
21     lfds600_slist_internal_init_slist( *ss, user_data_delete_function, user_state );
22     rv = 1;
23   }
24
25   return( rv );
26 }
27
28
29
30
31
32 /****************************************************************************/
33 void lfds600_slist_internal_init_slist( struct lfds600_slist_state *ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state )
34 {
35   assert( ss != NULL );
36   // TRD : user_data_delete_function can be NULL
37   // TRD : user_state can be NULL
38
39   ss->head = NULL;
40   ss->user_data_delete_function = user_data_delete_function;
41   ss->user_state = user_state;
42
43   return;
44 }
45
46
47
48
49
50 /****************************************************************************/
51 struct lfds600_slist_element *lfds600_slist_new_head( struct lfds600_slist_state *ss, void *user_data )
52 {
53   LFDS600_ALIGN(LFDS600_ALIGN_SINGLE_POINTER) struct lfds600_slist_element
54     *volatile se;
55
56   assert( ss != NULL );
57   // TRD : user_data can be NULL
58
59   se = (struct lfds600_slist_element *) lfds600_abstraction_aligned_malloc( sizeof(struct lfds600_slist_element), LFDS600_ALIGN_DOUBLE_POINTER );
60
61   if( se != NULL )
62   {
63     se->user_data_and_flags[LFDS600_SLIST_USER_DATA] = user_data;
64     se->user_data_and_flags[LFDS600_SLIST_FLAGS] = LFDS600_SLIST_NO_FLAGS;
65
66     lfds600_slist_internal_link_element_to_head( ss, se );
67   }
68
69   return( (struct lfds600_slist_element *) se );
70 }
71
72
73
74
75
76 /****************************************************************************/
77 struct lfds600_slist_element *lfds600_slist_new_next( struct lfds600_slist_element *se, void *user_data )
78 {
79   LFDS600_ALIGN(LFDS600_ALIGN_SINGLE_POINTER) struct lfds600_slist_element
80     *volatile se_next;
81
82   assert( se != NULL );
83   // TRD : user_data can be NULL
84
85   se_next = (struct lfds600_slist_element *) lfds600_abstraction_aligned_malloc( sizeof(struct lfds600_slist_element), LFDS600_ALIGN_DOUBLE_POINTER );
86
87   if( se_next != NULL )
88   {
89     se_next->user_data_and_flags[LFDS600_SLIST_USER_DATA] = user_data;
90     se_next->user_data_and_flags[LFDS600_SLIST_FLAGS] = LFDS600_SLIST_NO_FLAGS;
91
92     lfds600_slist_internal_link_element_after_element( se, se_next );
93   }
94
95   return( (struct lfds600_slist_element *) se_next );
96 }
97