~foura/libacme

78e5064ffdce3b4b2b5ea42ce0b45c75cbce6bf3 — james palmer 5 months ago 5216706
clean up. remove print fns, use fprint instead
3 files changed, 114 insertions(+), 208 deletions(-)

M acme.h
M event.c
M window.c
M acme.h => acme.h +11 -19
@@ 13,8 13,8 @@ struct AWin {
	int ctlfd;
	int addrfd;
	int datafd;
	
	Channel *eventc;
	int eventfd;
	int bodyfd;
	
	void *aux;
	


@@ 33,24 33,16 @@ struct AEvent {
	char text[AEventSz + 1];
};

int			awinfsopen(AWin *, char *, int);
Biobuf *	awinfsbopen(AWin *, char *, int);


int		awinfsopen(AWin *, char *, int);
AWin *	awincreate(void);
void	awinclose(AWin *);
void	awincloseall(void);

int		awinctl(AWin *, char *, ...);
void	awinclear(AWin *);
int		awincat(AWin *, int fd);
int		awinprint(AWin *, char *, ...);
int		awinerror(AWin *, char *, ...);
int		awinfatal(AWin *, char *, ...);
void	awinaddtag(AWin *, char *);
void	awinsettag(AWin *, char *);

Channel *	aeventlisten(AWin *);
void		aeventstop(AWin *);
int			aeventnext(Biobuf *bio, AEvent *);
void		aeventsend(AWin *, AEvent *);
int		awinload(AWin *, char *);
int		awinput(AWin *, char *);

int		awinaddtag(AWin *, char *);
int		awinsettag(AWin *, char *);

int		aeventnext(AWin *, AEvent *);
int		aeventsend(AWin *, AEvent *);

M event.c => event.c +52 -87
@@ 6,14 6,25 @@
#include "acme.h"

static int
aeventgetnum(Biobuf *bio)
getc(int fd)
{
	int c, n;
	char buf[1];
	
	if(read(fd, buf, sizeof(buf)) < 0)
		return buf[0];
	return -1;
}

static int
getnum(int fd)
{
	int c, n;

	n = 0;
	while('0' <= (c = Bgetc(bio)) && c <= '9')
	while('0' <= (c = getc(fd)) && c <= '9')
		n = n*10+(c-'0');
	if(c != ' ') {
	
	if(c != ' '){
		werrstr("event number syntax: %c", c);
		return -1;
	}


@@ 21,105 32,59 @@ aeventgetnum(Biobuf *bio)
	return n;
}

static long;
getrune(int fd)
{
	Rune rune;
	char buf[UTFmax];
	
	if(read(fd, buf, sizeof(buf)))
		return chartorune(&rune, buf);
		
	return -1;
}

static int
aeventgetdata(Biobuf *bio, AEvent *ev)
getdata(int fd, AEvent *e)
{
	int i, runes, len;
	Rune r;
	int i, n, o;
	long r;
	
	len = 0;
	runes = aeventgetnum(bio);
	for(i = 0; i < runes; i++) {
		if((r = Bgetrune(bio)) == -1)
	o = 0;
	n = getnum(fd);
	for(i = 0; i < n; i++) {
		if((r = getrune(fd)) < 0)
			break;
		len += runetochar(ev->text + len, &r);
		o += runetochar(e->text + o, (Rune*)&r);
	}
	
	ev->text[len] = '\0';
	return len;
	e->text[o] = 0;
	return o;
}

int
aeventnext(Biobuf *bio, AEvent *ev)
aeventnext(AWin *w, AEvent *e)
{
	int flags;
	
	flags = 0;
	
Again:
	ev->origin = Bgetc(bio);
	ev->type = Bgetc(bio);
	ev->q0 = aeventgetnum(bio);
	ev->q1 = aeventgetnum(bio);
	ev->flags = aeventgetnum(bio);
	ev->ntext = aeventgetdata(bio, ev);
	if(Bgetc(bio) != '\n') {
		werrstr("unterminated mesage");
loop:
	e->origin = getc(w->eventfd);
	e->type = getc(w->eventfd);
	e->q0 = getnum(w->eventfd);
	e->q1 = getnum(w->eventfd);
	e->ntext = getdata(w->eventfd, e);
	if(getc(w->eventfd) != '\n') {
		werrstr("unterminated message");
		return -1;
	}
	
	if(ev->flags & 0x2) {
		ev->p = ev->q0;
		flags = ev->flags;
		goto Again;
	if(e->flags & 0x2) {
		e->p = e->q0;
		flags = e->flags;
		goto loop;
	}
	
	ev->flags |= flags;
	return ev->origin;
}

static void
aeventproc(void *aux)
{
	AWin *w;
	Channel *c;
	Biobuf *bio;
	AEvent ev;
	
	w = aux;
	c = w->eventc;
	bio = awinfsbopen(w, "event", OREAD);
	
	while(aeventnext(bio, &ev)) {
		if(send(c, &ev) < 0) {
			Bterm(bio);
			exits(nil);
		}
	}
}

Channel *
aeventlisten(AWin *w)
{
	if(w->eventc)
		return w->eventc;
		
	w->eventc = chancreate(sizeof(AEvent), 0);
	proccreate(aeventproc, w, 4096);
	
	return w->eventc;
}

void
aeventstop(AWin *w)
{
	if(w->eventc) {
		chanclose(w->eventc);
		w->eventc = nil;
	}
}

void
aeventsend(AWin *w, AEvent *ev)
{
	int fd;
	
	fd = awinfsopen(w, "event", OWRITE);
	
	if(ev->flags & 0x2)
		fprint(fd, "%c%c%d %d\n", ev->origin, ev->type, ev->p, ev->p);
	else
		fprint(fd, "%c%c%d %d\n", ev->origin, ev->type, ev->q0, ev->q1);
		
	close(fd);
	e->flags |= flags;
	return e->origin;
}

M window.c => window.c +51 -102
@@ 1,7 1,6 @@
#include <u.h>
#include <libc.h>
#include <thread.h>
#include <bio.h>

#include "acme.h"



@@ 20,19 19,6 @@ awinfsopen(AWin *w, char *file, int mode)
	return fd;
}

Biobuf *
awinfsbopen(AWin *w, char *file, int mode)
{
	char buf[128];
	Biobuf *fd;
	
	snprint(buf, sizeof(buf), "/mnt/wsys/%d/%s", w->id, file);
	if((fd = Bopen(buf, mode)) == nil)
		sysfatal("bopen %s: %r", file);
		
	return fd;
}

AWin *
awincreate(void)
{


@@ 47,8 33,10 @@ awincreate(void)
		sysfatal("read ctl: %r");
	
	w->id = atoi(buf);
	w->addrfd = -1;
	w->datafd = -1;
	w->addrfd = awinfsopen(w, "addr", ORDWR);
	w->datafd = awinfsopen(w, "data", ORDWR);
	w->eventfd = awinfsopen(w, "events", ORDWR);
	w->bodyfd = awinfsopen(w, "body", OWRITE);

	w->next = awins;
	awins = w;


@@ 87,8 75,11 @@ awincloseall(void)
	while(temp) {
		fprint(temp->ctlfd, "delete");
		
		close(temp->ctlfd);
		close(temp->addrfd);
		close(temp->datafd);
		close(temp->eventfd);
		close(temp->bodyfd);
		
		awins = temp->next;
		free(temp);


@@ 98,120 89,78 @@ awincloseall(void)
}

int
awinctl(AWin *w, char *fmt, ...)
awinload(AWin *w, char *file)
{
	va_list args;
	int ret;
	
	va_start(args, fmt);
	ret = vfprint(w->ctlfd, fmt, args);
	va_end(args);
	
	return ret;
}

void
awinclear(AWin *w)
{
	w->addrfd = awinfsopen(w, "addr", OWRITE);
	w->datafd = awinfsopen(w, "data", OWRITE);
	int fd;
	char buf[8192];
	long n;
	
	fd = open(file, OREAD);
	if(fd < 0) {
		werrstr("awinload open failed: %r");
		return -1;
	}
		
	fprint(w->addrfd, ",");
	write(w->datafd, "", 0);
	while((n = read(w->datafd, buf, sizeof(buf))) > 0)
		write(fd, buf, n);
		
	if(n < 0) {
		werrstr("awinload read failed: %r");
		close(fd);
		return -1;
	}
	
	close(w->datafd);
	close(w->addrfd);
	return 0;
}

int
awincat(AWin *w, int fd)
awinsave(AWin *w, char *file)
{
	int body;
	char *buf;
	int fd;
	char buf[8192];
	long n;
	
	buf = malloc(8*1024);
	body = awinfsopen(w, "body", OWRITE);
	fd = open(file, OWRITE);
	if(fd < 0) {
		werrstr("awinload open failed: %r");
		return -1;
	}
		
	while((n=read(fd, buf, 8*1024)) > 0) {
		if(write(body, buf, n) != n) {
			awinerror(w, "awincat write: %r");
			return -1;
		}
	fprint(w->addrfd, ",");
	while((n = read(fd, buf, sizeof(buf))) > 0)
		write(w->datafd, buf, n);
		
	if(n < 0) {
		werrstr("awinload read failed: %r");
		close(fd);
		return -1;
	}
	
	return 0;
}

int
awinprint(AWin *w, char *fmt, ...)
awinaddtag(AWin *w, char *tag)
{
	int fd;
	int ret;
	va_list args;
	
	fd = awinfsopen(w, "body", OWRITE);
	
	va_start(args, fmt);
	ret = vfprint(fd, fmt, args);
	va_end(args);
	int fd, ret;
	
	fd = awinfsopen(w, "tag", OWRITE);
	ret = fprint(fd, " %s", tag);
	close(fd);
	return ret;
}

int
awinerror(AWin *w, char *fmt, ...)
{
	int fd;
	int ret;
	va_list args;
	
	fd = awinfsopen(w, "errors", OWRITE);
	
	va_start(args, fmt);
	ret = vfprint(fd, fmt, args);
	va_end(args);
	
	close(fd);
	return ret;
}

int
awinfatal(AWin *w, char *fmt, ...)
{
	int fd;
	int ret;
	va_list args;
	
	fd = awinfsopen(w, "body", OWRITE);
	
	va_start(args, fmt);
	ret = vfprint(fd, fmt, args);
	va_end(args);
	
	awinclose(w);
	close(fd);
	return ret;
}

void
awinaddtag(AWin *w, char *tag)
{
	int fd;
	
	fd = awinfsopen(w, "tag", OWRITE);
	fprint(fd, "%s ", tag);
	close(fd);
}

void
awinsettag(AWin *w, char *tag)
{
	int fd;
	int fd, ret;
	
	awinctl(w, "cleartag");
	fd = awinfsopen(w, "tag", OWRITE);
	fprint(fd, "%s", tag);
	fprint(w->ctlfd, "cleartag");
	ret = fprint(fd, "%s", tag);
	close(fd);
	
	return ret;
}