bf3af5c896b20d00ebcadf4ecab8186b96776fa8
[oweals/cde.git] / cde / lib / csa / free.c
1 /* $XConsortium: free.c /main/1 1996/04/21 19:23:16 drk $ */
2 /*
3  *  (c) Copyright 1993, 1994 Hewlett-Packard Company
4  *  (c) Copyright 1993, 1994 International Business Machines Corp.
5  *  (c) Copyright 1993, 1994 Novell, Inc.
6  *  (c) Copyright 1993, 1994 Sun Microsystems, Inc.
7  */
8
9 #include <EUSCompat.h>
10 #include <stdlib.h>
11 #include "csa.h"
12 #include "free.h"
13
14 #define _DtCM_OUR_MEMORY        0x55555555
15
16 typedef void (*_DtCmFreeProc)(uint num_elem, void *ptr);
17
18 typedef struct {
19         int             mark;
20         uint            num_elem;
21         _DtCmFreeProc   fproc;
22 } _DtCmMemHeader;
23
24 /******************************************************************************
25  * forward declaration of static functions used within the file
26  ******************************************************************************/
27 static void _DtCm_free_calendar_users(uint num_elem, void *vptr);
28
29 /*****************************************************************************
30  * extern functions used in the library
31  *****************************************************************************/
32
33 extern CSA_calendar_user *
34 _DtCm_alloc_calendar_users(uint num_elem)
35 {
36         char *ptr;
37         _DtCmMemHeader  *hptr;
38
39         if ((ptr = calloc(1, sizeof(_DtCmMemHeader) +
40             sizeof(CSA_calendar_user) * num_elem)) == NULL)
41                 return (NULL);
42         else {
43                 hptr = (_DtCmMemHeader *)ptr;
44                 hptr->mark = _DtCM_OUR_MEMORY;
45                 hptr->num_elem = num_elem;
46                 hptr->fproc = _DtCm_free_calendar_users;
47                 return ((CSA_calendar_user *)(ptr + sizeof(_DtCmMemHeader)));
48         }
49 }
50
51 extern char **
52 _DtCm_alloc_character_pointers(uint num_elem)
53 {
54         char *ptr;
55         _DtCmMemHeader  *hptr;
56
57         if ((ptr = calloc(1, sizeof(_DtCmMemHeader) +
58             sizeof(char *) * num_elem)) == NULL)
59                 return (NULL);
60         else {
61                 hptr = (_DtCmMemHeader *)ptr;
62                 hptr->mark = _DtCM_OUR_MEMORY;
63                 hptr->num_elem = num_elem;
64                 hptr->fproc = _DtCm_free_character_pointers;
65                 return ((char **)(ptr + sizeof(_DtCmMemHeader)));
66         }
67 }
68
69 extern CSA_attribute *
70 _DtCm_alloc_attributes(uint num_elem)
71 {
72         char *ptr;
73         _DtCmMemHeader  *hptr;
74         extern void _DtCm_free_attributes(uint size, void *attrs);
75
76         if ((ptr = calloc(1, sizeof(_DtCmMemHeader) +
77             sizeof(CSA_attribute) * num_elem)) == NULL)
78                 return (NULL);
79         else {
80                 hptr = (_DtCmMemHeader *)ptr;
81                 hptr->mark = _DtCM_OUR_MEMORY;
82                 hptr->num_elem = num_elem;
83                 hptr->fproc = _DtCm_free_attributes;
84                 return ((CSA_attribute *)(ptr + sizeof(_DtCmMemHeader)));
85         }
86 }
87
88 extern CSA_entry_handle *
89 _DtCm_alloc_entry_handles(uint num_elem)
90 {
91         char *ptr;
92         _DtCmMemHeader  *hptr;
93         extern void _DtCm_free_entry_handles(uint num_entries, void *entries);
94
95         if ((ptr = calloc(1, sizeof(_DtCmMemHeader) +
96             sizeof(CSA_entry_handle) * num_elem)) == NULL)
97                 return (NULL);
98         else {
99                 hptr = (_DtCmMemHeader *)ptr;
100                 hptr->mark = _DtCM_OUR_MEMORY;
101                 hptr->num_elem = num_elem;
102                 hptr->fproc = _DtCm_free_entry_handles;
103                 return ((CSA_entry_handle *)(ptr + sizeof(_DtCmMemHeader)));
104         }
105 }
106
107 extern void *
108 _DtCm_alloc_entry(uint size)
109 {
110         char *ptr;
111         _DtCmMemHeader  *hptr;
112         extern void _DtCm_free_entry_content(uint dummy, void *entry);
113
114         if ((ptr = calloc(1, sizeof(_DtCmMemHeader) + size)) == NULL)
115                 return (NULL);
116         else {
117                 hptr = (_DtCmMemHeader *)ptr;
118                 hptr->mark = _DtCM_OUR_MEMORY;
119                 hptr->num_elem = 1;
120                 hptr->fproc = _DtCm_free_entry_content;
121                 return ((void *)(ptr + sizeof(_DtCmMemHeader)));
122         }
123 }
124
125 extern CSA_reminder_reference *
126 _DtCm_alloc_reminder_references(uint num_elem)
127 {
128         char *ptr;
129         _DtCmMemHeader  *hptr;
130         extern void _DtCm_free_reminder_references(uint num_rems, void *rems);
131
132         if ((ptr = calloc(1, sizeof(_DtCmMemHeader) +
133             sizeof(CSA_reminder_reference) * num_elem)) == NULL)
134                 return (NULL);
135         else {
136                 hptr = (_DtCmMemHeader *)ptr;
137                 hptr->mark = _DtCM_OUR_MEMORY;
138                 hptr->num_elem = num_elem;
139                 hptr->fproc = _DtCm_free_reminder_references;
140                 return ((CSA_reminder_reference *)(ptr +
141                         sizeof(_DtCmMemHeader)));
142         }
143 }
144
145 extern CSA_return_code
146 _DtCm_free(void *ptr)
147 {
148         _DtCmMemHeader *hptr;
149
150         if (ptr == NULL)
151                 return (CSA_E_INVALID_MEMORY);
152
153         hptr = (_DtCmMemHeader *)(((char *)ptr) - sizeof(_DtCmMemHeader));
154
155         if (hptr->mark != _DtCM_OUR_MEMORY)
156                 return (CSA_E_INVALID_MEMORY);
157         else {
158                 hptr->mark = 0;
159                 hptr->fproc(hptr->num_elem, ptr);
160                 free(hptr);
161                 return (CSA_SUCCESS);
162         }
163 }
164
165 extern void
166 _DtCm_free_character_pointers(uint num_elem, void *vptr)
167 {
168         char **ptr = (char **)vptr;
169         int     i;
170
171         for (i = 0; i < num_elem; i++) {
172                 if (ptr[i])
173                         free(ptr[i]);
174                 else
175                         break;
176         }
177 }
178
179 /******************************************************************************
180  * static functions used within in the file
181  ******************************************************************************/
182
183 static void
184 _DtCm_free_calendar_users(uint num_elem, void *vptr)
185 {
186         CSA_calendar_user *ptr = (CSA_calendar_user *)vptr;
187         int     i;
188
189         for (i = 0; i < num_elem; i++) {
190                 if (ptr[i].user_name)
191                         free(ptr[i].user_name);
192
193                 if (ptr[i].calendar_address)
194                         free(ptr[i].calendar_address);
195         }
196 }
197