forsyth20121205-174063a80cc13 years agoHistory
55 lines · 1.1 KB · Brainfuck
RawDownload
implement Wait; ## Copyright © 2003 Vita Nuova Holdings Limited.  All rights reserved.# include "sys.m";	sys: Sys; include "wait.m"; init(){	sys = load Sys Sys->PATH;} read(fd: ref Sys->FD): (int, string, string){	buf := array[2*Sys->WAITLEN] of byte;	n := sys->read(fd, buf, len buf);	if(n <= 0)		return (n, nil, sys->sprint("%r"));	return parse(string buf[0:n]);} monitor(fd: ref Sys->FD): (int, chan of (int, string, string)){	pid := chan of int;	out := chan of (int, string, string);	spawn waitreader(fd, pid, out);	return (<-pid, out);} waitreader(fd: ref Sys->FD, pid: chan of int, out: chan of (int, string, string)){	pid <-= sys->pctl(0, nil);	for(;;){		(child, modname, status) := read(fd);		out <-= (child, modname, status);		if(child <= 0)			break;	# exit on error	}} parse(status: string): (int, string, string){	for (i := 0; i < len status; i++)		if (status[i] == ' ')			break;	j := i+2;	# skip space and "	for (i = j; i < len status; i++)		if (status[i] == '"')			break;	return (int status, status[j:i], status[i+2:]);}