49650e2ce436c9d219c2dafc9f59638d864bb02c
[ric-app/kpimon.git] / asn1c_defs / all-defs / asn_SET_OF.c
1 /*-\r
2  * Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.\r
3  * Redistribution and modifications are permitted subject to BSD license.\r
4  */\r
5 #include <asn_internal.h>\r
6 #include <asn_SET_OF.h>\r
7 #include <errno.h>\r
8 \r
9 /*\r
10  * Add another element into the set.\r
11  */\r
12 int\r
13 asn_set_add(void *asn_set_of_x, void *ptr) {\r
14         asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x);\r
15 \r
16         if(as == 0 || ptr == 0) {\r
17                 errno = EINVAL;         /* Invalid arguments */\r
18                 return -1;\r
19         }\r
20 \r
21         /*\r
22          * Make sure there's enough space to insert an element.\r
23          */\r
24         if(as->count == as->size) {\r
25                 int _newsize = as->size ? (as->size << 1) : 4;\r
26                 void *_new_arr;\r
27                 _new_arr = REALLOC(as->array, _newsize * sizeof(as->array[0]));\r
28                 if(_new_arr) {\r
29                         as->array = (void **)_new_arr;\r
30                         as->size = _newsize;\r
31                 } else {\r
32                         /* ENOMEM */\r
33                         return -1;\r
34                 }\r
35         }\r
36 \r
37         as->array[as->count++] = ptr;\r
38 \r
39         return 0;\r
40 }\r
41 \r
42 void\r
43 asn_set_del(void *asn_set_of_x, int number, int _do_free) {\r
44         asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x);\r
45 \r
46         if(as) {\r
47                 void *ptr;\r
48                 if(number < 0 || number >= as->count)\r
49                         return;\r
50 \r
51                 if(_do_free && as->free) {\r
52                         ptr = as->array[number];\r
53                 } else {\r
54                         ptr = 0;\r
55                 }\r
56 \r
57                 as->array[number] = as->array[--as->count];\r
58 \r
59                 /*\r
60                  * Invoke the third-party function only when the state\r
61                  * of the parent structure is consistent.\r
62                  */\r
63                 if(ptr) as->free(ptr);\r
64         }\r
65 }\r
66 \r
67 /*\r
68  * Free the contents of the set, do not free the set itself.\r
69  */\r
70 void\r
71 asn_set_empty(void *asn_set_of_x) {\r
72         asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x);\r
73 \r
74         if(as) {\r
75                 if(as->array) {\r
76                         if(as->free) {\r
77                                 while(as->count--)\r
78                                         as->free(as->array[as->count]);\r
79                         }\r
80                         FREEMEM(as->array);\r
81                         as->array = 0;\r
82                 }\r
83                 as->count = 0;\r
84                 as->size = 0;\r
85         }\r
86 \r
87 }\r
88 \r