/* * Slice of an array. * It now frees the passed array */ array_t *slice_array P3(array_t *, p, int, from, int, to) { int cnt; svalue_t *sv1, *sv2; if (from < 0) from = 0; if (to >= p->size) to = p->size - 1; if (from > to) { free_array(p); return null_array(); } if (!(--p->ref)){ #ifdef PACKAGE_MUDLIB_STATS add_array_size(&p->stats, -((int)p->size)); #endif total_array_size += (to - from + 1 - p->size) * sizeof(svalue_t); if (from) { sv1 = p->item + from; cnt = from; while (cnt--) free_svalue(--sv1, "slice_array:2"); cnt = to - from + 1; sv1 = p->item; sv2 = p->item + from; while (cnt--) *sv1++ = *sv2++; } else { sv2 = p->item + to + 1; } cnt = (p->size - 1) - to; while (cnt--) free_svalue(sv2++, "slice_array:3"); p = RESIZE_ARRAY(p, to-from+1); #ifdef PACKAGE_MUDLIB_STATS if (current_object) { assign_stats(&p->stats, current_object); add_array_size(&p->stats, to - from + 1); } else null_stats(&p->stats); #endif p->size = to-from+1; p->ref = 1; return p; } else { array_t *d; d = allocate_empty_array(to - from + 1); sv1 = d->item - from; sv2 = p->item; for (cnt = from; cnt <= to; cnt++) assign_svalue_no_free(sv1 + cnt, sv2 + cnt); return d; } }
/* * Allocate an array of size 'n'. */ array_t *allocate_array P1(int, n) { array_t *p; if (n < 0 || n > max_array_size) error("Illegal array size.\n"); if (n == 0) { return null_array(); } num_arrays++; total_array_size += sizeof(array_t) + sizeof(svalue_t) * (n - 1); p = ALLOC_ARRAY(n); p->ref = 1; p->size = n; #ifdef PACKAGE_MUDLIB_STATS if (current_object) { assign_stats(&p->stats, current_object); add_array_size(&p->stats, n); } else { null_stats(&p->stats); } #endif while (n--) p->item[n] = const0; return p; }
INLINE void dealloc_mapping (mapping_t * m) { debug(mapping,("mapping.c: actual free of %p\n", m)); num_mappings--; { int j = m->table_size, c = MAP_COUNT(m); mapping_node_t *elt, *nelt, **a = m->table; total_mapping_size -= (sizeof(mapping_t) + sizeof(mapping_node_t *) * (j+1) + sizeof(mapping_node_t) * c); total_mapping_nodes -= c; #ifdef PACKAGE_MUDLIB_STATS add_array_size (&m->stats, - (c << 1)); #endif do { for (elt = a[j]; elt; elt = nelt) { nelt = elt->next; free_svalue(elt->values, "free_mapping"); free_node(m, elt); } } while (j--); debug(mapping, ("in free_mapping: before table\n")); FREE((char *)a); } debug(mapping, ("in free_mapping: after table\n")); FREE((char *) m); debug(mapping, ("in free_mapping: after m\n")); debug(mapping,("mapping.c: free_mapping end\n")); }
void free_empty_array P1(array_t *, p) { if ((--(p->ref) > 0) || (p == &the_null_array)) { return; } #ifdef PACKAGE_MUDLIB_STATS add_array_size(&p->stats, -((int)p->size)); #endif num_arrays--; total_array_size -= sizeof(array_t) + sizeof(svalue_t) * (p->size - 1); FREE((char *) p); }
void dealloc_array P1(array_t *, p) { int i; if (p == &the_null_array) return; for (i = p->size; i--;) free_svalue(&p->item[i], "free_array"); #ifdef PACKAGE_MUDLIB_STATS add_array_size(&p->stats, -((int)p->size)); #endif num_arrays--; total_array_size -= sizeof(array_t) + sizeof(svalue_t) * (p->size - 1); FREE((char *) p); }