示例#1
0
/*
 * 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;
    }
}
示例#2
0
/*
 * 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;
}
示例#3
0
文件: mapping.c 项目: ViKingIX/NtOS
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"));
}
示例#4
0
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);
}
示例#5
0
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);
}