shithub: svcfs

ref: a9ca97f3154d7cf8951a4e80940e623952722a1a
dir: /buffer.c/

View raw version
#include <u.h>
#include <libc.h>
#include <fcall.h>
#include <thread.h>
#include <9p.h>

#include "alt.h"

static void
bufferFree(Buffer *match)
{
	if(match->name)
		free(match->name);
	free(match);
}

char *
bufferDrop(Buffer *base, char *name)
{
	Buffer *mp, *bp;
	for(bp = base; bp->next; bp = bp->next){
		mp = bp->next;
		if(strcmp(bp->next->name, name) == 0){
			if(mp && mp->next)
				bp->next = mp->next;
			else
				bp->next = nil;
			if(mp)
				bufferFree(mp);
		}
	}
				
	return nil;
}

char *
bufferPush(Buffer *base, char *name)
{
	Buffer *b, *ep;

	for(ep = base; ep->next; ep = ep->next){
		if(ep && strcmp(ep->name, name) == 0)
			return "buffer exists";
		if(ep->next == nil)
			break;
	}
	
	b = emalloc(sizeof(*b));
	b->name = estrdup(name);
	b->notify = nil;
	b->input = base->input;
	ep->next = b;

	return nil;
}

Buffer *
bufferSearch(Buffer *base, char *name)
{
	Buffer *sp;

	for(sp = base; sp; sp = sp->next)
		if(strcmp(sp->name, name) == 0)
			return sp;
	return nil;
}

Buffer*
bufferCreate(void (*input)(char*), char *(*ctl)(char*, char*))
{
	Buffer *b;

	b = emalloc(sizeof(*b));
	b->name = "root";
	b->input = input;
	b->ctl = ctl;
	b->notify = nil;
	b->next = nil;

	return b;
}