]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.0.1/liblfds601/src/lfds601_slist/lfds601_slist_new.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.0.1 / liblfds601 / src / lfds601_slist / lfds601_slist_new.c
1 #include "lfds601_slist_internal.h"\r
2 \r
3 \r
4 \r
5 \r
6 \r
7 /****************************************************************************/\r
8 int lfds601_slist_new( struct lfds601_slist_state **ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state )\r
9 {\r
10   int\r
11     rv = 0;\r
12 \r
13   assert( ss != NULL );\r
14   // TRD : user_data_delete_function can be NULL\r
15   // TRD : user_state can be NULL\r
16 \r
17   *ss = (struct lfds601_slist_state *) lfds601_abstraction_aligned_malloc( sizeof(struct lfds601_slist_state), LFDS601_ALIGN_SINGLE_POINTER );\r
18 \r
19   if( *ss != NULL )\r
20   {\r
21     lfds601_slist_internal_init_slist( *ss, user_data_delete_function, user_state );\r
22     rv = 1;\r
23   }\r
24 \r
25   return( rv );\r
26 }\r
27 \r
28 \r
29 \r
30 \r
31 \r
32 /****************************************************************************/\r
33 void lfds601_slist_internal_init_slist( struct lfds601_slist_state *ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state )\r
34 {\r
35   assert( ss != NULL );\r
36   // TRD : user_data_delete_function can be NULL\r
37   // TRD : user_state can be NULL\r
38 \r
39   ss->head = NULL;\r
40   ss->user_data_delete_function = user_data_delete_function;\r
41   ss->user_state = user_state;\r
42 \r
43   return;\r
44 }\r
45 \r
46 \r
47 \r
48 \r
49 \r
50 /****************************************************************************/\r
51 struct lfds601_slist_element *lfds601_slist_new_head( struct lfds601_slist_state *ss, void *user_data )\r
52 {\r
53   LFDS601_ALIGN(LFDS601_ALIGN_SINGLE_POINTER) struct lfds601_slist_element\r
54     *volatile se;\r
55 \r
56   assert( ss != NULL );\r
57   // TRD : user_data can be NULL\r
58 \r
59   se = (struct lfds601_slist_element *) lfds601_abstraction_aligned_malloc( sizeof(struct lfds601_slist_element), LFDS601_ALIGN_DOUBLE_POINTER );\r
60 \r
61   if( se != NULL )\r
62   {\r
63     se->user_data_and_flags[LFDS601_SLIST_USER_DATA] = user_data;\r
64     se->user_data_and_flags[LFDS601_SLIST_FLAGS] = LFDS601_SLIST_NO_FLAGS;\r
65 \r
66     lfds601_slist_internal_link_element_to_head( ss, se );\r
67   }\r
68 \r
69   return( (struct lfds601_slist_element *) se );\r
70 }\r
71 \r
72 \r
73 \r
74 \r
75 \r
76 /****************************************************************************/\r
77 struct lfds601_slist_element *lfds601_slist_new_next( struct lfds601_slist_element *se, void *user_data )\r
78 {\r
79   LFDS601_ALIGN(LFDS601_ALIGN_SINGLE_POINTER) struct lfds601_slist_element\r
80     *volatile se_next;\r
81 \r
82   assert( se != NULL );\r
83   // TRD : user_data can be NULL\r
84 \r
85   se_next = (struct lfds601_slist_element *) lfds601_abstraction_aligned_malloc( sizeof(struct lfds601_slist_element), LFDS601_ALIGN_DOUBLE_POINTER );\r
86 \r
87   if( se_next != NULL )\r
88   {\r
89     se_next->user_data_and_flags[LFDS601_SLIST_USER_DATA] = user_data;\r
90     se_next->user_data_and_flags[LFDS601_SLIST_FLAGS] = LFDS601_SLIST_NO_FLAGS;\r
91 \r
92     lfds601_slist_internal_link_element_after_element( se, se_next );\r
93   }\r
94 \r
95   return( (struct lfds601_slist_element *) se_next );\r
96 }\r
97 \r