shithub: pprolog

ref: 3e1e9621d1f19b221d59191ed55e78b171a5fe93
dir: /repl.c/

View raw version
#include <u.h>
#include <libc.h>
#include <bio.h>

#include "dat.h"
#include "fns.h"

Rune parsefindmore(int);

void
repl(void)
{
	int fd = 0; /* Standard input */
	while(1){
		print("?- ");
		Term *query = parse(fd, nil, 1);
		Binding *bindings = nil;
		choicestack = nil;
		goalstack = nil; /* should free old choicestack and goalstack */
		int success;
		int firsttime = 1;
FindMore:
		success = evalquery(query, &bindings);
		if(firsttime){
			print(" ");
			firsttime = 0;
		}
		if(success == 0)
			print("  false.\n");
		else{
			if(bindings == nil)
				print("  true");
			else{
				while(bindings){
					print("  %S = %S%s", 
						bindings->name, 
						prettyprint(bindings->value, 0, 0, 0), 
						bindings->next ? ",\n " : "");
					bindings = bindings->next;
				}
			}
			if(choicestack != nil){
				print("\n");
				if(parsefindmore(fd) == L';'){
					print(";");
					goto FindMore;
				}else
					print(".\n");
			}else{
				print(".\n");
			}
		}
	}
}

Rune
parsefindmore(int fd)
{
	int consctl = open("/dev/consctl", OWRITE);
	if(consctl > 0)
		write(consctl, "rawon", 5);
	else{
		print("Could not open /dev/consctl\n");
		exits("open");
	}

	fd = dup(fd, -1);
	Biobuf *input = Bfdopen(fd, OREAD);
	Rune peek = Bgetrune(input);
	Bterm(input);

	if(consctl > 0){
		write(consctl, "rawoff", 6);
		close(consctl);
	}
	return peek;
}