NETSNMP_STATIC_INLINE int netsnmp_binary_array_insert(netsnmp_container *c, const void *entry) { binary_array_table *t = (binary_array_table*)c->container_data; int new_max, was_dirty = 0; void *new_data; /* Used for * a) extending the data table * * b) the next entry to use */ /* * check for duplicates */ if (! (c->flags & CONTAINER_KEY_ALLOW_DUPLICATES)) { was_dirty = t->dirty; new_data = netsnmp_binary_array_get(c, entry, 1); if (NULL != new_data) { DEBUGMSGTL(("container","not inserting duplicate key\n")); return -1; } } /* * check if we need to resize the array */ if (t->max_size <= t->count) { /* * Table is full, so extend it to double the size */ new_max = 2 * t->max_size; if (new_max == 0) new_max = 10; /* Start with 10 entries */ new_data = (void *) calloc(new_max, t->data_size); if (new_data == NULL) return -1; if (t->data) { memcpy(new_data, t->data, t->max_size * t->data_size); SNMP_FREE(t->data); } t->data = (void**)new_data; t->max_size = new_max; } /* * Insert the new entry into the data array */ t->data[t->count++] = NETSNMP_REMOVE_CONST(void *, entry); t->dirty = 1; /* * if array was dirty before we called get, sync was incremented when * get called SortArray. If we didn't call get or the array wasn't dirty, * bump sync now. */ if (!was_dirty) ++c->sync; return 0; }
NETSNMP_STATIC_INLINE int netsnmp_binary_array_insert(netsnmp_container *c, const void *entry) { binary_array_table *t = (binary_array_table*)c->container_data; int was_dirty = 0; /* * check for duplicates */ if (! (c->flags & CONTAINER_KEY_ALLOW_DUPLICATES)) { was_dirty = t->dirty; if (NULL != netsnmp_binary_array_get(c, entry, 1)) { DEBUGMSGTL(("container","not inserting duplicate key\n")); return -1; } } /* * check if we need to resize the array */ if (t->max_size <= t->count) { /* * Table is full, so extend it to double the size, or use 10 elements * if it is empty. */ size_t const new_max = t->max_size > 0 ? 2 * t->max_size : 10; void ** const new_data = (void**) realloc(t->data, new_max * sizeof(void*)); if (new_data == NULL) return -1; memset(new_data + t->max_size, 0x0, (new_max - t->max_size) * sizeof(void*)); t->data = new_data; t->max_size = new_max; } /* * Insert the new entry into the data array */ t->data[t->count++] = NETSNMP_REMOVE_CONST(void *, entry); t->dirty = 1; /* * if array was dirty before we called get, sync was incremented when * get called SortArray. If we didn't call get or the array wasn't dirty, * bump sync now. */ if (!was_dirty) ++c->sync; return 0; }
static void * _ba_find_next(netsnmp_container *container, const void *data) { return netsnmp_binary_array_get(container, data, 0); }