summaryrefslogtreecommitdiff
path: root/repl.c
blob: 294eebb10b48f24d6f4850046bc5ebd4832b36eb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <u.h>
#include <libc.h>
#include <bio.h>

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

Rune parsefindmore(int);

void
repl(Term *database)
{
	int fd = 0; /* Standard input */
	while(1){
		print("?- ");
		Term *query = parse(fd, nil, 1);
		Binding *bindings = nil;
		Choicepoint *choicestack = nil;
		int success;
FindMore:
		success = evalquery(database, query, &bindings, &choicestack);
		if(success == 0)
			print("false.\n");
		else{
			if(bindings == nil)
				print("true.\n");
			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(" ");
				if(parsefindmore(fd) == L';'){
					print(";\n");
					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;
}