forsyth20121205-174063a80cc13 years agoHistory
91 lines · 1.6 KB · C
RawDownload
#include "logfsos.h"#include "logfs.h"#include "local.h" struct GroupSet {	int maxentries;	int nentries;	Group **entry;}; char *logfsgroupsetnew(GroupSet **gsp){	GroupSet *gs = logfsrealloc(nil, sizeof(*gs));	if(gs == nil)		return Enomem;	gs->entry = logfsrealloc(nil, sizeof(Group *));	if(gs->entry == nil) {		logfsfreemem(gs);		return Enomem;	}	gs->maxentries = 1;		/* most groups have one member */	gs->nentries = 0;	*gsp = gs;	return nil;} voidlogfsgroupsetfree(GroupSet **gsp){	GroupSet *gs = *gsp;	if(gs) {		logfsfreemem(gs->entry);		logfsfreemem(gs);		*gsp = nil;	}} intlogfsgroupsetadd(GroupSet *gs, Group *g){	int x;	for(x = 0; x < gs->nentries; x++)		if(gs->entry[x] == g)			return 1;	if(gs->nentries >= gs->maxentries) {		Group **ne = logfsrealloc(gs->entry, sizeof(Group*)*(gs->maxentries * 2));		if(ne == nil)			return 0;		gs->entry = ne;		gs->maxentries *= 2;	}	gs->entry[gs->nentries++] = g;	return 1;} intlogfsgroupsetremove(GroupSet *gs, Group *g){	int x;	for(x = 0; x < gs->nentries; x++)		if(gs->entry[x] == g)			break;	if(x == gs->nentries)		return 0;	gs->nentries--;	memmove(&gs->entry[x], &gs->entry[x + 1], sizeof(Group *) * (gs->nentries - x));	return 1;} intlogfsgroupsetwalk(GroupSet *gs, LOGFSGROUPSETWALKFN *func, void *magic){	int x;	for(x = 0; x < gs->nentries; x++) {		int rv = (*func)(magic, gs->entry[x]);		if(rv <= 0)			return rv;	}	return 1;} intlogfsgroupsetismember(GroupSet *gs, Group *g){	int x;	for(x = 0; x < gs->nentries; x++)		if(gs->entry[x] == g)			return 1;	return 0;}