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