aboutsummaryrefslogtreecommitdiff
path: root/docs/buzzard/first.c
blob: 9820b1bc1d7362bf826515e729b0efb1cde388f1 (plain)
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char s[5000];
int m[20000] = {32};
int length = 1;
int pc;
int dstack[500];
int *dsp = dstack;
int top = 64;
int w;
int st0;

void
at(int x)
{
	m[m[0]++] = length;
	length = *m - 1;
	m[m[0]++] = top;
	m[m[0]++] = x;
	scanf("%s", s + top);
	top += strlen(s + top) + 1;
}

void
run(int x)
{
	switch (m[x++]) {
	case 0: // pushint
		*++dsp = st0;
		st0 = m[pc++];
		break;
	case 1: // compile me
		m[m[0]++] = x;
		break;
	case 2: // run me
		m[++m[1]] = pc;
		pc = x;
		break;
	case 3: // :
		at(1);
		m[m[0]++] = 2;
		break;
	case 4: // immediate
		*m -= 2;
		m[m[0]++] = 2;
		break;
	case 5: // _read
		for (w = scanf("%s", s) < 1 ? exit(0), 0 : length; strcmp(s, &s[m[w + 1]]); w = m[w]);
		if (w - 1) {
			run(w + 2);
		} else {
			m[m[0]++] = 2;
			m[m[0]++] = atoi(s);
		}
		break;
	case 6: // @
		st0 = m[st0];
		break;
	case 7: // !
		m[st0] = *dsp--;
		st0 = *dsp--;
		break;
	case 8: // -
		st0 = *dsp-- - st0;
		break;
	case 9: // *
		st0 *= *dsp--;
		break;
	case 10: // /
		st0 = *dsp-- / st0;
		break;
	case 11: // <0
		st0 = 0 > st0;
		break;
	case 12: // exit
		pc = m[m[1]--];
		break;
	case 13: // echo
		putchar(st0);
		st0 = *dsp--;
		break;
	case 14: // key
		*++dsp = st0;
		st0 = getchar();
	case 15: // _pick
		st0 = dsp[-st0];
		break;
	}
}

int
main()
{
	at(3);
	at(4);
	at(1);
	w = *m;
	m[m[0]++] = 5;
	m[m[0]++] = 2;
	pc = *m;
	m[m[0]++] = w;
	m[m[0]++] = pc - 1;
	for (w = 6; w < 16;) {
		at(1);
		m[m[0]++] = w++;
	}
	m[1] = *m;
	for (*m += 512;; run(m[pc++]));

	return 0;
}