bool array_insert_n(array_t a, unsigned int index, void *ptr, unsigned long n) { unsigned char *p; unsigned int move_size; if (index > a->nelts) { return false; } else if (a->nalloc + n > a->nelts) { if (!array_push_n(a, n)) { return false; } } else { a->nelts += n; } p = (unsigned char *)a->elts; move_size = a->size * (a->nelts - (index + n)); if (move_size) { memmove(p + a->size * (index + n), p + a->size * index, move_size); } memcpy(p + a->size * index, ptr, a->size * n); return true; }
array_t array_dup(array_t a) { array_t dst = array_newlen(a->size, a->nelts); if (!dst) { return NULL; } memcpy(array_push_n(dst, a->nelts), a->elts, a->nelts * a->size); return dst; }
bool array_resize(array_t a, unsigned long n) { void *elt; unsigned long nalloc; if (a->nelts >= n) { a->nelts = n; return true; } nalloc = n - a->nelts; elt = array_push_n(a, nalloc); if (!elt) { return false; } memset(elt, 0, nalloc * a->size); return true; }
static int32_t rtmp_core_merge_listennings(rtmp_cycle_t *cycle) { rtmp_addr_port_t *ports; rtmp_addr_inet_t *addr; int32_t i,j,h; rtmp_host_t **host; void **n; ports = cycle->ports.elts; for (i = 0 ; i < (int32_t)cycle->ports.nelts; i++) { if (ports[i].family != AF_INET) { continue; } addr = ports[i].addr_in.elts; if (addr[0].addr.sin_addr.s_addr == INADDR_ANY) { rtmp_core_add_listening(cycle,addr); for (j = 1; j < (int32_t)ports[i].addr_in.nelts; j++) { n = array_push_n(&addr[j].hosts,addr[0].hosts.nelts); host = addr[0].hosts.elts; for (h = 0; h < (int32_t)addr[0].hosts.nelts; h++) { *n++ = host[h]; } } continue; } for (j = 0; j < (int32_t)ports[i].addr_in.nelts; j++) { rtmp_core_add_listening(cycle,& addr[j]); } } return RTMP_OK; }