shithub: libgraphics

ref: 0f3b1baebbaa1dbcfed0ba25850f70dd6ce30e4e
dir: /itemarray.c/

View raw version
#include <u.h>
#include <libc.h>
#include <bio.h>
#include <thread.h>
#include <draw.h>
#include <memdraw.h>
#include <geometry.h>
#include "graphics.h"
#include "internal.h"

ItemArray *
mkitemarray(usize is)
{
	ItemArray *a;

	a = _emalloc(sizeof *a);
	memset(a, 0, sizeof *a);
	a->itemsize = is;
	return a;
}

usize
itemarrayadd(ItemArray *a, void *i)
{
	char *p;
	usize idx;

	idx = a->nitems;
	a->items = _erealloc(a->items, ++a->nitems * a->itemsize);
	p = a->items;
	p += idx*a->itemsize;
	memmove(p, i, a->itemsize);
	return idx;
}

void *
itemarrayget(ItemArray *a, usize idx)
{
	char *p;

	if(idx >= a->nitems)
		return nil;

	p = a->items;
	p += idx*a->itemsize;
	return p;
}

usize
copyitemarray(ItemArray *d, ItemArray *s)
{
	usize len;

	assert(d->itemsize == s->itemsize);
	len = s->nitems * s->itemsize;

	free(d->items);
	d->items = _emalloc(len);
	d->nitems = s->nitems;
	memmove(d->items, s->items, len);
	return d->nitems;
}

ItemArray *
dupitemarray(ItemArray *a)
{
	ItemArray *na;

	na = mkitemarray(a->itemsize);
	copyitemarray(na, a);
	return na;
}

void
rmitemarray(ItemArray *a)
{
	free(a->items);
	free(a);
}