diff options
Diffstat (limited to 'src/lib/libcrypto/objects/o_names.c')
| -rw-r--r-- | src/lib/libcrypto/objects/o_names.c | 421 |
1 files changed, 210 insertions, 211 deletions
diff --git a/src/lib/libcrypto/objects/o_names.c b/src/lib/libcrypto/objects/o_names.c index c238a8b266..9ed1de92c9 100644 --- a/src/lib/libcrypto/objects/o_names.c +++ b/src/lib/libcrypto/objects/o_names.c | |||
| @@ -12,15 +12,14 @@ | |||
| 12 | * that applications may define. I only really use the free function field. | 12 | * that applications may define. I only really use the free function field. |
| 13 | */ | 13 | */ |
| 14 | DECLARE_LHASH_OF(OBJ_NAME); | 14 | DECLARE_LHASH_OF(OBJ_NAME); |
| 15 | static LHASH_OF(OBJ_NAME) *names_lh=NULL; | 15 | static LHASH_OF(OBJ_NAME) *names_lh = NULL; |
| 16 | static int names_type_num=OBJ_NAME_TYPE_NUM; | 16 | static int names_type_num = OBJ_NAME_TYPE_NUM; |
| 17 | 17 | ||
| 18 | typedef struct name_funcs_st | 18 | typedef struct name_funcs_st { |
| 19 | { | ||
| 20 | unsigned long (*hash_func)(const char *name); | 19 | unsigned long (*hash_func)(const char *name); |
| 21 | int (*cmp_func)(const char *a,const char *b); | 20 | int (*cmp_func)(const char *a, const char *b); |
| 22 | void (*free_func)(const char *, int, const char *); | 21 | void (*free_func)(const char *, int, const char *); |
| 23 | } NAME_FUNCS; | 22 | } NAME_FUNCS; |
| 24 | 23 | ||
| 25 | DECLARE_STACK_OF(NAME_FUNCS) | 24 | DECLARE_STACK_OF(NAME_FUNCS) |
| 26 | IMPLEMENT_STACK_OF(NAME_FUNCS) | 25 | IMPLEMENT_STACK_OF(NAME_FUNCS) |
| @@ -34,58 +33,57 @@ static STACK_OF(NAME_FUNCS) *name_funcs_stack; | |||
| 34 | /* static unsigned long obj_name_hash(OBJ_NAME *a); */ | 33 | /* static unsigned long obj_name_hash(OBJ_NAME *a); */ |
| 35 | static unsigned long obj_name_hash(const void *a_void); | 34 | static unsigned long obj_name_hash(const void *a_void); |
| 36 | /* static int obj_name_cmp(OBJ_NAME *a,OBJ_NAME *b); */ | 35 | /* static int obj_name_cmp(OBJ_NAME *a,OBJ_NAME *b); */ |
| 37 | static int obj_name_cmp(const void *a_void,const void *b_void); | 36 | static int obj_name_cmp(const void *a_void, const void *b_void); |
| 38 | 37 | ||
| 39 | static IMPLEMENT_LHASH_HASH_FN(obj_name, OBJ_NAME) | 38 | static IMPLEMENT_LHASH_HASH_FN(obj_name, OBJ_NAME) |
| 40 | static IMPLEMENT_LHASH_COMP_FN(obj_name, OBJ_NAME) | 39 | static IMPLEMENT_LHASH_COMP_FN(obj_name, OBJ_NAME) |
| 41 | 40 | ||
| 42 | int OBJ_NAME_init(void) | 41 | int |
| 43 | { | 42 | OBJ_NAME_init(void) |
| 44 | if (names_lh != NULL) return(1); | 43 | { |
| 44 | if (names_lh != NULL) | ||
| 45 | return (1); | ||
| 45 | MemCheck_off(); | 46 | MemCheck_off(); |
| 46 | names_lh=lh_OBJ_NAME_new(); | 47 | names_lh = lh_OBJ_NAME_new(); |
| 47 | MemCheck_on(); | 48 | MemCheck_on(); |
| 48 | return(names_lh != NULL); | 49 | return (names_lh != NULL); |
| 49 | } | 50 | } |
| 50 | 51 | ||
| 51 | int OBJ_NAME_new_index(unsigned long (*hash_func)(const char *), | 52 | int |
| 52 | int (*cmp_func)(const char *, const char *), | 53 | OBJ_NAME_new_index(unsigned long (*hash_func)(const char *), |
| 53 | void (*free_func)(const char *, int, const char *)) | 54 | int (*cmp_func)(const char *, const char *), |
| 54 | { | 55 | void (*free_func)(const char *, int, const char *)) |
| 56 | { | ||
| 55 | int ret; | 57 | int ret; |
| 56 | int i; | 58 | int i; |
| 57 | NAME_FUNCS *name_funcs; | 59 | NAME_FUNCS *name_funcs; |
| 58 | 60 | ||
| 59 | if (name_funcs_stack == NULL) | 61 | if (name_funcs_stack == NULL) { |
| 60 | { | ||
| 61 | MemCheck_off(); | 62 | MemCheck_off(); |
| 62 | name_funcs_stack=sk_NAME_FUNCS_new_null(); | 63 | name_funcs_stack = sk_NAME_FUNCS_new_null(); |
| 63 | MemCheck_on(); | 64 | MemCheck_on(); |
| 64 | } | 65 | } |
| 65 | if (name_funcs_stack == NULL) | 66 | if (name_funcs_stack == NULL) { |
| 66 | { | ||
| 67 | /* ERROR */ | 67 | /* ERROR */ |
| 68 | return(0); | 68 | return (0); |
| 69 | } | 69 | } |
| 70 | ret=names_type_num; | 70 | ret = names_type_num; |
| 71 | names_type_num++; | 71 | names_type_num++; |
| 72 | for (i=sk_NAME_FUNCS_num(name_funcs_stack); i<names_type_num; i++) | 72 | for (i = sk_NAME_FUNCS_num(name_funcs_stack); i < names_type_num; i++) { |
| 73 | { | ||
| 74 | MemCheck_off(); | 73 | MemCheck_off(); |
| 75 | name_funcs = malloc(sizeof(NAME_FUNCS)); | 74 | name_funcs = malloc(sizeof(NAME_FUNCS)); |
| 76 | MemCheck_on(); | 75 | MemCheck_on(); |
| 77 | if (!name_funcs) | 76 | if (!name_funcs) { |
| 78 | { | 77 | OBJerr(OBJ_F_OBJ_NAME_NEW_INDEX, ERR_R_MALLOC_FAILURE); |
| 79 | OBJerr(OBJ_F_OBJ_NAME_NEW_INDEX,ERR_R_MALLOC_FAILURE); | 78 | return (0); |
| 80 | return(0); | 79 | } |
| 81 | } | ||
| 82 | name_funcs->hash_func = lh_strhash; | 80 | name_funcs->hash_func = lh_strhash; |
| 83 | name_funcs->cmp_func = strcmp; | 81 | name_funcs->cmp_func = strcmp; |
| 84 | name_funcs->free_func = NULL; | 82 | name_funcs->free_func = NULL; |
| 85 | MemCheck_off(); | 83 | MemCheck_off(); |
| 86 | sk_NAME_FUNCS_push(name_funcs_stack,name_funcs); | 84 | sk_NAME_FUNCS_push(name_funcs_stack, name_funcs); |
| 87 | MemCheck_on(); | 85 | MemCheck_on(); |
| 88 | } | 86 | } |
| 89 | name_funcs = sk_NAME_FUNCS_value(name_funcs_stack, ret); | 87 | name_funcs = sk_NAME_FUNCS_value(name_funcs_stack, ret); |
| 90 | if (hash_func != NULL) | 88 | if (hash_func != NULL) |
| 91 | name_funcs->hash_func = hash_func; | 89 | name_funcs->hash_func = hash_func; |
| @@ -93,265 +91,266 @@ int OBJ_NAME_new_index(unsigned long (*hash_func)(const char *), | |||
| 93 | name_funcs->cmp_func = cmp_func; | 91 | name_funcs->cmp_func = cmp_func; |
| 94 | if (free_func != NULL) | 92 | if (free_func != NULL) |
| 95 | name_funcs->free_func = free_func; | 93 | name_funcs->free_func = free_func; |
| 96 | return(ret); | 94 | return (ret); |
| 97 | } | 95 | } |
| 98 | 96 | ||
| 99 | /* static int obj_name_cmp(OBJ_NAME *a, OBJ_NAME *b) */ | 97 | /* static int obj_name_cmp(OBJ_NAME *a, OBJ_NAME *b) */ |
| 100 | static int obj_name_cmp(const void *a_void, const void *b_void) | 98 | static int |
| 101 | { | 99 | obj_name_cmp(const void *a_void, const void *b_void) |
| 100 | { | ||
| 102 | int ret; | 101 | int ret; |
| 103 | const OBJ_NAME *a = (const OBJ_NAME *)a_void; | 102 | const OBJ_NAME *a = (const OBJ_NAME *)a_void; |
| 104 | const OBJ_NAME *b = (const OBJ_NAME *)b_void; | 103 | const OBJ_NAME *b = (const OBJ_NAME *)b_void; |
| 105 | 104 | ||
| 106 | ret=a->type-b->type; | 105 | ret = a->type - b->type; |
| 107 | if (ret == 0) | 106 | if (ret == 0) { |
| 108 | { | 107 | if ((name_funcs_stack != NULL) && |
| 109 | if ((name_funcs_stack != NULL) | 108 | (sk_NAME_FUNCS_num(name_funcs_stack) > a->type)) { |
| 110 | && (sk_NAME_FUNCS_num(name_funcs_stack) > a->type)) | 109 | ret = sk_NAME_FUNCS_value(name_funcs_stack, |
| 111 | { | 110 | a->type)->cmp_func(a->name, b->name); |
| 112 | ret=sk_NAME_FUNCS_value(name_funcs_stack, | 111 | } else |
| 113 | a->type)->cmp_func(a->name,b->name); | 112 | ret = strcmp(a->name, b->name); |
| 114 | } | ||
| 115 | else | ||
| 116 | ret=strcmp(a->name,b->name); | ||
| 117 | } | ||
| 118 | return(ret); | ||
| 119 | } | 113 | } |
| 114 | return (ret); | ||
| 115 | } | ||
| 120 | 116 | ||
| 121 | /* static unsigned long obj_name_hash(OBJ_NAME *a) */ | 117 | /* static unsigned long obj_name_hash(OBJ_NAME *a) */ |
| 122 | static unsigned long obj_name_hash(const void *a_void) | 118 | static unsigned long |
| 123 | { | 119 | obj_name_hash(const void *a_void) |
| 120 | { | ||
| 124 | unsigned long ret; | 121 | unsigned long ret; |
| 125 | const OBJ_NAME *a = (const OBJ_NAME *)a_void; | 122 | const OBJ_NAME *a = (const OBJ_NAME *)a_void; |
| 126 | 123 | ||
| 127 | if ((name_funcs_stack != NULL) && (sk_NAME_FUNCS_num(name_funcs_stack) > a->type)) | 124 | if ((name_funcs_stack != NULL) && |
| 128 | { | 125 | (sk_NAME_FUNCS_num(name_funcs_stack) > a->type)) { |
| 129 | ret=sk_NAME_FUNCS_value(name_funcs_stack, | 126 | ret = sk_NAME_FUNCS_value(name_funcs_stack, |
| 130 | a->type)->hash_func(a->name); | 127 | a->type)->hash_func(a->name); |
| 131 | } | 128 | } else { |
| 132 | else | 129 | ret = lh_strhash(a->name); |
| 133 | { | ||
| 134 | ret=lh_strhash(a->name); | ||
| 135 | } | ||
| 136 | ret^=a->type; | ||
| 137 | return(ret); | ||
| 138 | } | 130 | } |
| 139 | 131 | ret ^= a->type; | |
| 140 | const char *OBJ_NAME_get(const char *name, int type) | 132 | return (ret); |
| 141 | { | 133 | } |
| 142 | OBJ_NAME on,*ret; | 134 | |
| 143 | int num=0,alias; | 135 | const char * |
| 144 | 136 | OBJ_NAME_get(const char *name, int type) | |
| 145 | if (name == NULL) return(NULL); | 137 | { |
| 146 | if ((names_lh == NULL) && !OBJ_NAME_init()) return(NULL); | 138 | OBJ_NAME on, *ret; |
| 147 | 139 | int num = 0, alias; | |
| 148 | alias=type&OBJ_NAME_ALIAS; | 140 | |
| 141 | if (name == NULL) | ||
| 142 | return (NULL); | ||
| 143 | if ((names_lh == NULL) && !OBJ_NAME_init()) | ||
| 144 | return (NULL); | ||
| 145 | |||
| 146 | alias = type&OBJ_NAME_ALIAS; | ||
| 149 | type&= ~OBJ_NAME_ALIAS; | 147 | type&= ~OBJ_NAME_ALIAS; |
| 150 | 148 | ||
| 151 | on.name=name; | 149 | on.name = name; |
| 152 | on.type=type; | 150 | on.type = type; |
| 153 | 151 | ||
| 154 | for (;;) | 152 | for (;;) { |
| 155 | { | 153 | ret = lh_OBJ_NAME_retrieve(names_lh, &on); |
| 156 | ret=lh_OBJ_NAME_retrieve(names_lh,&on); | 154 | if (ret == NULL) |
| 157 | if (ret == NULL) return(NULL); | 155 | return (NULL); |
| 158 | if ((ret->alias) && !alias) | 156 | if ((ret->alias) && !alias) { |
| 159 | { | 157 | if (++num > 10) |
| 160 | if (++num > 10) return(NULL); | 158 | return (NULL); |
| 161 | on.name=ret->data; | 159 | on.name = ret->data; |
| 162 | } | 160 | } else { |
| 163 | else | 161 | return (ret->data); |
| 164 | { | ||
| 165 | return(ret->data); | ||
| 166 | } | ||
| 167 | } | 162 | } |
| 168 | } | 163 | } |
| 164 | } | ||
| 169 | 165 | ||
| 170 | int OBJ_NAME_add(const char *name, int type, const char *data) | 166 | int |
| 171 | { | 167 | OBJ_NAME_add(const char *name, int type, const char *data) |
| 172 | OBJ_NAME *onp,*ret; | 168 | { |
| 169 | OBJ_NAME *onp, *ret; | ||
| 173 | int alias; | 170 | int alias; |
| 174 | 171 | ||
| 175 | if ((names_lh == NULL) && !OBJ_NAME_init()) return(0); | 172 | if ((names_lh == NULL) && !OBJ_NAME_init()) |
| 173 | return (0); | ||
| 176 | 174 | ||
| 177 | alias=type&OBJ_NAME_ALIAS; | 175 | alias = type & OBJ_NAME_ALIAS; |
| 178 | type&= ~OBJ_NAME_ALIAS; | 176 | type &= ~OBJ_NAME_ALIAS; |
| 179 | 177 | ||
| 180 | onp=(OBJ_NAME *)malloc(sizeof(OBJ_NAME)); | 178 | onp = (OBJ_NAME *)malloc(sizeof(OBJ_NAME)); |
| 181 | if (onp == NULL) | 179 | if (onp == NULL) { |
| 182 | { | ||
| 183 | /* ERROR */ | 180 | /* ERROR */ |
| 184 | return(0); | 181 | return (0); |
| 185 | } | 182 | } |
| 186 | 183 | ||
| 187 | onp->name=name; | 184 | onp->name = name; |
| 188 | onp->alias=alias; | 185 | onp->alias = alias; |
| 189 | onp->type=type; | 186 | onp->type = type; |
| 190 | onp->data=data; | 187 | onp->data = data; |
| 191 | 188 | ||
| 192 | ret=lh_OBJ_NAME_insert(names_lh,onp); | 189 | ret = lh_OBJ_NAME_insert(names_lh, onp); |
| 193 | if (ret != NULL) | 190 | if (ret != NULL) { |
| 194 | { | ||
| 195 | /* free things */ | 191 | /* free things */ |
| 196 | if ((name_funcs_stack != NULL) && (sk_NAME_FUNCS_num(name_funcs_stack) > ret->type)) | 192 | if ((name_funcs_stack != NULL) && |
| 197 | { | 193 | (sk_NAME_FUNCS_num(name_funcs_stack) > ret->type)) { |
| 198 | /* XXX: I'm not sure I understand why the free | 194 | /* XXX: I'm not sure I understand why the free |
| 199 | * function should get three arguments... | 195 | * function should get three arguments... |
| 200 | * -- Richard Levitte | 196 | * -- Richard Levitte |
| 201 | */ | 197 | */ |
| 202 | sk_NAME_FUNCS_value(name_funcs_stack, | 198 | sk_NAME_FUNCS_value( |
| 203 | ret->type)->free_func(ret->name,ret->type,ret->data); | 199 | name_funcs_stack, ret->type)->free_func( |
| 204 | } | 200 | ret->name, ret->type, ret->data); |
| 205 | free(ret); | ||
| 206 | } | 201 | } |
| 207 | else | 202 | free(ret); |
| 208 | { | 203 | } else { |
| 209 | if (lh_OBJ_NAME_error(names_lh)) | 204 | if (lh_OBJ_NAME_error(names_lh)) { |
| 210 | { | ||
| 211 | /* ERROR */ | 205 | /* ERROR */ |
| 212 | return(0); | 206 | return (0); |
| 213 | } | ||
| 214 | } | 207 | } |
| 215 | return(1); | ||
| 216 | } | 208 | } |
| 217 | 209 | return (1); | |
| 218 | int OBJ_NAME_remove(const char *name, int type) | 210 | } |
| 219 | { | 211 | |
| 220 | OBJ_NAME on,*ret; | 212 | int |
| 221 | 213 | OBJ_NAME_remove(const char *name, int type) | |
| 222 | if (names_lh == NULL) return(0); | 214 | { |
| 223 | 215 | OBJ_NAME on, *ret; | |
| 224 | type&= ~OBJ_NAME_ALIAS; | 216 | |
| 225 | on.name=name; | 217 | if (names_lh == NULL) |
| 226 | on.type=type; | 218 | return (0); |
| 227 | ret=lh_OBJ_NAME_delete(names_lh,&on); | 219 | |
| 228 | if (ret != NULL) | 220 | type &= ~OBJ_NAME_ALIAS; |
| 229 | { | 221 | on.name = name; |
| 222 | on.type = type; | ||
| 223 | ret = lh_OBJ_NAME_delete(names_lh, &on); | ||
| 224 | if (ret != NULL) { | ||
| 230 | /* free things */ | 225 | /* free things */ |
| 231 | if ((name_funcs_stack != NULL) && (sk_NAME_FUNCS_num(name_funcs_stack) > ret->type)) | 226 | if ((name_funcs_stack != NULL) && |
| 232 | { | 227 | (sk_NAME_FUNCS_num(name_funcs_stack) > ret->type)) { |
| 233 | /* XXX: I'm not sure I understand why the free | 228 | /* XXX: I'm not sure I understand why the free |
| 234 | * function should get three arguments... | 229 | * function should get three arguments... |
| 235 | * -- Richard Levitte | 230 | * -- Richard Levitte |
| 236 | */ | 231 | */ |
| 237 | sk_NAME_FUNCS_value(name_funcs_stack, | 232 | sk_NAME_FUNCS_value( |
| 238 | ret->type)->free_func(ret->name,ret->type,ret->data); | 233 | name_funcs_stack, ret->type)->free_func( |
| 239 | } | 234 | ret->name, ret->type, ret->data); |
| 240 | free(ret); | ||
| 241 | return(1); | ||
| 242 | } | 235 | } |
| 243 | else | 236 | free(ret); |
| 244 | return(0); | 237 | return (1); |
| 245 | } | 238 | } else |
| 239 | return (0); | ||
| 240 | } | ||
| 246 | 241 | ||
| 247 | struct doall | 242 | struct doall { |
| 248 | { | ||
| 249 | int type; | 243 | int type; |
| 250 | void (*fn)(const OBJ_NAME *,void *arg); | 244 | void (*fn)(const OBJ_NAME *, void *arg); |
| 251 | void *arg; | 245 | void *arg; |
| 252 | }; | 246 | }; |
| 253 | 247 | ||
| 254 | static void do_all_fn_doall_arg(const OBJ_NAME *name,struct doall *d) | 248 | static void |
| 255 | { | 249 | do_all_fn_doall_arg(const OBJ_NAME *name, struct doall *d) |
| 256 | if(name->type == d->type) | 250 | { |
| 257 | d->fn(name,d->arg); | 251 | if (name->type == d->type) |
| 258 | } | 252 | d->fn(name, d->arg); |
| 253 | } | ||
| 259 | 254 | ||
| 260 | static IMPLEMENT_LHASH_DOALL_ARG_FN(do_all_fn, const OBJ_NAME, struct doall) | 255 | static IMPLEMENT_LHASH_DOALL_ARG_FN(do_all_fn, const OBJ_NAME, struct doall) |
| 261 | 256 | ||
| 262 | void OBJ_NAME_do_all(int type,void (*fn)(const OBJ_NAME *,void *arg),void *arg) | 257 | void |
| 263 | { | 258 | OBJ_NAME_do_all(int type, void (*fn)(const OBJ_NAME *, void *arg), void *arg) |
| 259 | { | ||
| 264 | struct doall d; | 260 | struct doall d; |
| 265 | 261 | ||
| 266 | d.type=type; | 262 | d.type = type; |
| 267 | d.fn=fn; | 263 | d.fn = fn; |
| 268 | d.arg=arg; | 264 | d.arg = arg; |
| 269 | 265 | ||
| 270 | lh_OBJ_NAME_doall_arg(names_lh, LHASH_DOALL_ARG_FN(do_all_fn), | 266 | lh_OBJ_NAME_doall_arg(names_lh, LHASH_DOALL_ARG_FN(do_all_fn), |
| 271 | struct doall, &d); | 267 | struct doall, &d); |
| 272 | } | 268 | } |
| 273 | 269 | ||
| 274 | struct doall_sorted | 270 | struct doall_sorted { |
| 275 | { | ||
| 276 | int type; | 271 | int type; |
| 277 | int n; | 272 | int n; |
| 278 | const OBJ_NAME **names; | 273 | const OBJ_NAME **names; |
| 279 | }; | 274 | }; |
| 280 | 275 | ||
| 281 | static void do_all_sorted_fn(const OBJ_NAME *name,void *d_) | 276 | static void |
| 282 | { | 277 | do_all_sorted_fn(const OBJ_NAME *name, void *d_) |
| 283 | struct doall_sorted *d=d_; | 278 | { |
| 279 | struct doall_sorted *d = d_; | ||
| 284 | 280 | ||
| 285 | if(name->type != d->type) | 281 | if (name->type != d->type) |
| 286 | return; | 282 | return; |
| 287 | 283 | ||
| 288 | d->names[d->n++]=name; | 284 | d->names[d->n++] = name; |
| 289 | } | 285 | } |
| 290 | 286 | ||
| 291 | static int do_all_sorted_cmp(const void *n1_,const void *n2_) | 287 | static int |
| 292 | { | 288 | do_all_sorted_cmp(const void *n1_, const void *n2_) |
| 293 | const OBJ_NAME * const *n1=n1_; | 289 | { |
| 294 | const OBJ_NAME * const *n2=n2_; | 290 | const OBJ_NAME * const *n1 = n1_; |
| 291 | const OBJ_NAME * const *n2 = n2_; | ||
| 295 | 292 | ||
| 296 | return strcmp((*n1)->name,(*n2)->name); | 293 | return strcmp((*n1)->name, (*n2)->name); |
| 297 | } | 294 | } |
| 298 | 295 | ||
| 299 | void OBJ_NAME_do_all_sorted(int type,void (*fn)(const OBJ_NAME *,void *arg), | 296 | void |
| 300 | void *arg) | 297 | OBJ_NAME_do_all_sorted(int type, void (*fn)(const OBJ_NAME *, void *arg), |
| 301 | { | 298 | void *arg) |
| 299 | { | ||
| 302 | struct doall_sorted d; | 300 | struct doall_sorted d; |
| 303 | int n; | 301 | int n; |
| 304 | 302 | ||
| 305 | d.type=type; | 303 | d.type = type; |
| 306 | d.names=malloc(lh_OBJ_NAME_num_items(names_lh)*sizeof *d.names); | 304 | d.names = malloc(lh_OBJ_NAME_num_items(names_lh)*sizeof *d.names); |
| 307 | d.n=0; | 305 | d.n = 0; |
| 308 | OBJ_NAME_do_all(type,do_all_sorted_fn,&d); | 306 | OBJ_NAME_do_all(type, do_all_sorted_fn, &d); |
| 309 | 307 | ||
| 310 | qsort((void *)d.names,d.n,sizeof *d.names,do_all_sorted_cmp); | 308 | qsort((void *)d.names, d.n, sizeof *d.names, do_all_sorted_cmp); |
| 311 | 309 | ||
| 312 | for(n=0 ; n < d.n ; ++n) | 310 | for (n = 0; n < d.n; ++n) |
| 313 | fn(d.names[n],arg); | 311 | fn(d.names[n], arg); |
| 314 | 312 | ||
| 315 | free((void *)d.names); | 313 | free((void *)d.names); |
| 316 | } | 314 | } |
| 317 | 315 | ||
| 318 | static int free_type; | 316 | static int free_type; |
| 319 | 317 | ||
| 320 | static void names_lh_free_doall(OBJ_NAME *onp) | 318 | static void |
| 321 | { | 319 | names_lh_free_doall(OBJ_NAME *onp) |
| 320 | { | ||
| 322 | if (onp == NULL) | 321 | if (onp == NULL) |
| 323 | return; | 322 | return; |
| 324 | 323 | ||
| 325 | if (free_type < 0 || free_type == onp->type) | 324 | if (free_type < 0 || free_type == onp->type) |
| 326 | OBJ_NAME_remove(onp->name,onp->type); | 325 | OBJ_NAME_remove(onp->name, onp->type); |
| 327 | } | 326 | } |
| 328 | 327 | ||
| 329 | static IMPLEMENT_LHASH_DOALL_FN(names_lh_free, OBJ_NAME) | 328 | static IMPLEMENT_LHASH_DOALL_FN(names_lh_free, OBJ_NAME) |
| 330 | 329 | ||
| 331 | static void name_funcs_free(NAME_FUNCS *ptr) | 330 | static void |
| 332 | { | 331 | name_funcs_free(NAME_FUNCS *ptr) |
| 332 | { | ||
| 333 | free(ptr); | 333 | free(ptr); |
| 334 | } | 334 | } |
| 335 | 335 | ||
| 336 | void OBJ_NAME_cleanup(int type) | 336 | void |
| 337 | { | 337 | OBJ_NAME_cleanup(int type) |
| 338 | { | ||
| 338 | unsigned long down_load; | 339 | unsigned long down_load; |
| 339 | 340 | ||
| 340 | if (names_lh == NULL) return; | 341 | if (names_lh == NULL) |
| 342 | return; | ||
| 341 | 343 | ||
| 342 | free_type=type; | 344 | free_type = type; |
| 343 | down_load=lh_OBJ_NAME_down_load(names_lh); | 345 | down_load = lh_OBJ_NAME_down_load(names_lh); |
| 344 | lh_OBJ_NAME_down_load(names_lh)=0; | 346 | lh_OBJ_NAME_down_load(names_lh) = 0; |
| 345 | 347 | ||
| 346 | lh_OBJ_NAME_doall(names_lh,LHASH_DOALL_FN(names_lh_free)); | 348 | lh_OBJ_NAME_doall(names_lh, LHASH_DOALL_FN(names_lh_free)); |
| 347 | if (type < 0) | 349 | if (type < 0) { |
| 348 | { | ||
| 349 | lh_OBJ_NAME_free(names_lh); | 350 | lh_OBJ_NAME_free(names_lh); |
| 350 | sk_NAME_FUNCS_pop_free(name_funcs_stack,name_funcs_free); | 351 | sk_NAME_FUNCS_pop_free(name_funcs_stack, name_funcs_free); |
| 351 | names_lh=NULL; | 352 | names_lh = NULL; |
| 352 | name_funcs_stack = NULL; | 353 | name_funcs_stack = NULL; |
| 353 | } | 354 | } else |
| 354 | else | 355 | lh_OBJ_NAME_down_load(names_lh) = down_load; |
| 355 | lh_OBJ_NAME_down_load(names_lh)=down_load; | 356 | } |
| 356 | } | ||
| 357 | |||
