mischiefit works4f814ed11 years agoHistory
96 lines · 1.2 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <bio.h>#include <luft.h> Biobuf bin;LuftVM *L; intdel(void*, char *msg){	if(strcmp(msg, "interrupt") == 0)		return 1;	return 0;} char prog[65535]; voidmain(int argc, char *argv[]){	int iflag, n, len, rv;	char *line, *new, *old; 	iflag = 0; 	ARGBEGIN{	case 'i':		iflag = 1;		break;	}ARGEND 	atnotify(del, 1);  	L = luftvm(); 	if(!iflag){		len = 0;		for(;;){			if(len >= sizeof(prog)-1)				break;			n = read(0, prog+len, sizeof(prog)-1-len);			if(n < 0)				sysfatal("read: %r");			if(n == 0)				break;			len += n;		} 		prog[len] = '\0'; 		if(luftdo(L, prog, len) < 0)			sysfatal("luftdo: %s", lufterrstr(L)); 		exits(nil);	} 	Binit(&bin, 0, OREAD);	for(;;){		print("> ");		line = Brdstr(&bin, '\n', 1);		if(line == nil)			break; 		if(strlen(line) == 0)			continue; 		for(;;){			rv = luftdo(L, line, strlen(line));			if(rv == 0)				break;			else if(rv == -1){				if(iflag)					print(">> "); 				old = line;				new = Brdstr(&bin, '\n', 1);				if(new == nil)					break; 				line = smprint("%s\n%s", old, new);				free(old);				free(new);			} else if(rv == -2){				fprint(2, "luftdo: %s\n", lufterrstr(L));				break;			}		} 		free(line);	} 	exits(nil);}