Plan 9 from Bell Labs’s /usr/web/sources/extra/art/storage.c

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


/*
 * code to allocate and free items and itemlists
 */
#include "art.h"

Item *freelist;
/*
 * common code to delete items, called from item-specific code
 */
delete(Item *p){
	(*p->fn->delete)(p);
	if(p->p){
		free(p->p);
		p->p=0;
	}
	p->next->prev=p->prev;
	p->prev->next=p->next;
	p->next=freelist;
	freelist=p;
}
Item *additem(Item *head, int type, Flt r, Typeface *face, char *text, int group, Itemfns *fn, int np, ...){
	va_list l;
	Item *ip;
	int i;
	if(freelist){
		ip=freelist;
		freelist=freelist->next;
	}
	else{
		ip=(Item *)malloc(sizeof(Item));
		if(ip==0) fatal("out of space");
	}
	if(head==selection) drawsel();
	if(head==0)
		ip->next=ip->prev=ip;
	else{
		ip->next=head;
		ip->prev=head->prev;
		ip->next->prev=ip;
		ip->prev->next=ip;
	}
	ip->np=np;
	if(np){
		ip->p=(Dpoint *)malloc(np*sizeof(Dpoint));
		if(ip->p==0) fatal("Out of space");
		va_start(l, np);
		for(i=0;i!=np;i++) ip->p[i]=va_arg(l, Dpoint);
		va_end(l);
	}
	else ip->p=0;
	ip->r=r;
	ip->face=face;
	ip->text=text?strdup(text):0;
	ip->group=group;
	ip->type=type;
	ip->flags=0;
	ip->style=0;		/* should be a parameter */
	ip->fn=fn;
	if(head==selection) drawsel();
	return ip;
}
Item *additemv(Item *head, int type, Flt r, Typeface *face, char *text, int group, Itemfns *fn, int np, Dpoint *p, Dpoint offs){
	Item *ip=additem(head, type, r, face, text, group, fn, 0);
	int i;
	if(np){
		ip->np=np;
		ip->p=(Dpoint *)malloc(np*sizeof(Dpoint));
		if(ip->p==0) fatal("Out of space");
		for(i=0;i!=np;i++) ip->p[i]=dadd(p[i], offs);
	}
	return ip;
}

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to [email protected].