1 /* $XConsortium: free.c /main/1 1996/04/21 19:23:16 drk $ */
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.
14 #define _DtCM_OUR_MEMORY 0x55555555
16 typedef void (*_DtCmFreeProc)(uint num_elem, void *ptr);
24 /******************************************************************************
25 * forward declaration of static functions used within the file
26 ******************************************************************************/
27 static void _DtCm_free_calendar_users(uint num_elem, void *vptr);
29 /*****************************************************************************
30 * extern functions used in the library
31 *****************************************************************************/
33 extern CSA_calendar_user *
34 _DtCm_alloc_calendar_users(uint num_elem)
39 if ((ptr = calloc(1, sizeof(_DtCmMemHeader) +
40 sizeof(CSA_calendar_user) * num_elem)) == NULL)
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)));
52 _DtCm_alloc_character_pointers(uint num_elem)
57 if ((ptr = calloc(1, sizeof(_DtCmMemHeader) +
58 sizeof(char *) * num_elem)) == NULL)
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)));
69 extern CSA_attribute *
70 _DtCm_alloc_attributes(uint num_elem)
74 extern void _DtCm_free_attributes(uint size, void *attrs);
76 if ((ptr = calloc(1, sizeof(_DtCmMemHeader) +
77 sizeof(CSA_attribute) * num_elem)) == NULL)
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)));
88 extern CSA_entry_handle *
89 _DtCm_alloc_entry_handles(uint num_elem)
93 extern void _DtCm_free_entry_handles(uint num_entries, void *entries);
95 if ((ptr = calloc(1, sizeof(_DtCmMemHeader) +
96 sizeof(CSA_entry_handle) * num_elem)) == NULL)
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)));
108 _DtCm_alloc_entry(uint size)
111 _DtCmMemHeader *hptr;
112 extern void _DtCm_free_entry_content(uint dummy, void *entry);
114 if ((ptr = calloc(1, sizeof(_DtCmMemHeader) + size)) == NULL)
117 hptr = (_DtCmMemHeader *)ptr;
118 hptr->mark = _DtCM_OUR_MEMORY;
120 hptr->fproc = _DtCm_free_entry_content;
121 return ((void *)(ptr + sizeof(_DtCmMemHeader)));
125 extern CSA_reminder_reference *
126 _DtCm_alloc_reminder_references(uint num_elem)
129 _DtCmMemHeader *hptr;
130 extern void _DtCm_free_reminder_references(uint num_rems, void *rems);
132 if ((ptr = calloc(1, sizeof(_DtCmMemHeader) +
133 sizeof(CSA_reminder_reference) * num_elem)) == NULL)
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)));
145 extern CSA_return_code
146 _DtCm_free(void *ptr)
148 _DtCmMemHeader *hptr;
151 return (CSA_E_INVALID_MEMORY);
153 hptr = (_DtCmMemHeader *)(((char *)ptr) - sizeof(_DtCmMemHeader));
155 if (hptr->mark != _DtCM_OUR_MEMORY)
156 return (CSA_E_INVALID_MEMORY);
159 hptr->fproc(hptr->num_elem, ptr);
161 return (CSA_SUCCESS);
166 _DtCm_free_character_pointers(uint num_elem, void *vptr)
168 char **ptr = (char **)vptr;
171 for (i = 0; i < num_elem; i++) {
179 /******************************************************************************
180 * static functions used within in the file
181 ******************************************************************************/
184 _DtCm_free_calendar_users(uint num_elem, void *vptr)
186 CSA_calendar_user *ptr = (CSA_calendar_user *)vptr;
189 for (i = 0; i < num_elem; i++) {
190 if (ptr[i].user_name)
191 free(ptr[i].user_name);
193 if (ptr[i].calendar_address)
194 free(ptr[i].calendar_address);