~rabbits/orca-toy

0fba8628ff9e234d854298274fba4bc08ad3a829 — neauoire 2 years ago a162f07
Implemented more operators
4 files changed, 209 insertions(+), 91 deletions(-)

M abflm-result.orca
M build.sh
M demo.orca
M toy.c
M abflm-result.orca => abflm-result.orca +3 -3
@@ 3,8 3,8 @@
.B.aB..BaaBa1BA2BZ
.0..a..a..0..9..X.
.F.aF..FaaFa1FAzFZ
..................
.*........*.......
.L.aL..LaaLa1LAzLZ
..................
..........a..1..Z.
.M.aM..MaaMa1MAzMZ
..................
.0..0..0..s..A..1.

M build.sh => build.sh +2 -1
@@ 1,6 1,7 @@
#!/bin/bash

clang-format -i toy.c
clang-format -i library.h

rm -f ./toy



@@ 11,4 12,4 @@ cc -std=c89 -DDEBUG -Wall -Wpedantic -Wshadow -Wextra -Werror=implicit-int -Werr
# pcc toy.c -o toy

./toy abflm.orca > abflm-result.orca
diff abflm-result.orca abflm-expected.orca
\ No newline at end of file
diff abflm-result.orca abflm-expected.orca

M demo.orca => demo.orca +5 -9
@@ 1,9 1,5 @@
.........................................
.S.W...S.................................
......E0W................................
.E.N...N.................................
.........................................
..A.1A.A2.1A2.aA1.1AB.zA2................
.........................................
..B.1B.B2.1B2.aB1.1BB.zB2................
.........................................
.............
....2L3......
.........aL3.
.............
.............

M toy.c => toy.c +199 -78
@@ 7,6 7,12 @@ typedef struct Grid {
} Grid;

int
ciuc(char c)
{
	return c >= 'A' && c <= 'Z';
}

int
cint(char c)
{
	if(c == '.')


@@ 15,7 21,7 @@ cint(char c)
		return c - '0';
	if(c >= 'a' && c <= 'z')
		return c - 'a' + 10;
	if(c >= 'A' && c <= 'Z')
	if(ciuc(c))
		return c - 'A' + 10;
	return 0;
}


@@ 32,13 38,6 @@ cchr(int v, int cap)
	return 'a' + (v - 10);
}

int
error(char *name)
{
	printf("Error: %s\n", name);
	return 0;
}

char
get(Grid *g, int x, int y)
{


@@ 51,38 50,204 @@ set(Grid *g, int x, int y, char c)
	g->data[x + (y * g->w)] = c;
}

int
getint(Grid *g, int x, int y)
void
lock(Grid *g, int x, int y)
{
	return cint(get(g, x, y));
	g->lock[x + (y * g->w)] = 1;
}

/* Library */

void
setint(Grid *g, int x, int y, int v)
_0(Grid *g, int x, int y)
{
	g->data[x + (y * g->w)] = cchr(v, 0);
}

void
lock(Grid *g, int x, int y)
_a(Grid *g, int x, int y)
{
	g->lock[x + (y * g->w)] = 1;
	char a = get(g, x - 1, y);
	char b = get(g, x + 1, y);
	set(g, x, y + 1, cchr(cint(a) + cint(b), ciuc(b)));
	lock(g, x + 1, y);
	lock(g, x, y + 1);
}

int
busy(Grid *g, int x, int y)
void
_b(Grid *g, int x, int y)
{
	return g->lock[x + (y * g->w)];
	char a = get(g, x - 1, y);
	char b = get(g, x + 1, y);
	set(g, x, y + 1, cchr(cint(a) - cint(b), ciuc(b)));
	lock(g, x + 1, y);
	lock(g, x, y + 1);
}

int
caps(Grid *g, int x, int y)
void
_c(Grid *g, int x, int y)
{
}

void
_d(Grid *g, int x, int y)
{
}

void
_e(Grid *g, int x, int y)
{
	if(x == g->w || get(g, x + 1, y) != '.')
		set(g, x, y, '*');
	else {
		set(g, x, y, '.');
		set(g, x + 1, y, 'E');
		lock(g, x + 1, y);
	}
}

void
_f(Grid *g, int x, int y)
{
	set(g, x, y + 1, get(g, x - 1, y) == get(g, x + 1, y) ? '*' : '.');
	lock(g, x + 1, y);
	lock(g, x, y + 1);
}

void
_g(Grid *g, int x, int y)
{
}

void
_h(Grid *g, int x, int y)
{
	lock(g, x, y + 1);
}

void
_i(Grid *g, int x, int y)
{
}

void
_j(Grid *g, int x, int y)
{
}

void
_k(Grid *g, int x, int y)
{
}

void
_l(Grid *g, int x, int y)
{
	char a = get(g, x - 1, y);
	char b = get(g, x + 1, y);
	set(g, x, y + 1, cint(a) < cint(b) ? a : b);
	lock(g, x + 1, y);
	lock(g, x, y + 1);
}

void
_m(Grid *g, int x, int y)
{
	char a = get(g, x - 1, y);
	char b = get(g, x + 1, y);
	set(g, x, y + 1, cchr(cint(a) * cint(b), ciuc(b)));
	lock(g, x + 1, y);
	lock(g, x, y + 1);
}

void
_n(Grid *g, int x, int y)
{
	if(y == 0 || get(g, x, y - 1) != '.')
		set(g, x, y, '*');
	else {
		set(g, x, y, '.');
		set(g, x, y - 1, 'N');
		lock(g, x, y - 1);
	}
}

void
_o(Grid *g, int x, int y)
{
}

void
_p(Grid *g, int x, int y)
{
}

void
_q(Grid *g, int x, int y)
{
}

void
_r(Grid *g, int x, int y)
{
}

void
_s(Grid *g, int x, int y)
{
	if(y == g->h || get(g, x, y + 1) != '.')
		set(g, x, y, '*');
	else {
		set(g, x, y, '.');
		set(g, x, y + 1, 'S');
		lock(g, x, y + 1);
	}
}

void
_t(Grid *g, int x, int y)
{
}

void
_u(Grid *g, int x, int y)
{
	char c = get(g, x, y);
	return c >= 'A' && c <= 'Z';
}

void
_v(Grid *g, int x, int y)
{
}

void
_w(Grid *g, int x, int y)
{
	if(x == 0 || get(g, x - 1, y) != '.')
		set(g, x, y, '*');
	else {
		set(g, x, y, '.');
		set(g, x - 1, y, 'W');
		lock(g, x - 1, y);
	}
}

void
_x(Grid *g, int x, int y)
{
}

void
_y(Grid *g, int x, int y)
{
}

void
_z(Grid *g, int x, int y)
{
}

void (*library[36])() = {_0, _0, _0, _0, _0, _0, _0, _0, _0, _0, _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z};

void
parse(Grid *g)
{
	int i, x, y;


@@ 90,65 255,14 @@ parse(Grid *g)
		char c = g->data[i];
		x = i % g->w;
		y = i / g->w;
		if(busy(g, x, y))
		if(g->lock[i])
			continue;
		if(c == 'A') {
			set(g, x, y + 1, cchr(getint(g, x - 1, y) + getint(g, x + 1, y), caps(g, x + 1, y)));
			lock(g, x + 1, y);
			lock(g, x, y + 1);
		} else if(c == 'B') {
			set(g, x, y + 1, cchr(getint(g, x - 1, y) - getint(g, x + 1, y), caps(g, x + 1, y)));
			lock(g, x + 1, y);
			lock(g, x, y + 1);
		} else if(c == 'E') {
			if(x == g->w || get(g, x + 1, y) != '.')
				set(g, x, y, '*');
			else {
				set(g, x, y, '.');
				set(g, x + 1, y, 'E');
				lock(g, x + 1, y);
			}
		} else if(c == 'F') {
			/* TODO */
			lock(g, x + 1, y);
			lock(g, x, y + 1);
		} else if(c == 'L') {
			/* TODO */
			lock(g, x + 1, y);
			lock(g, x, y + 1);
		} else if(c == 'M') {
			/* TODO */
			lock(g, x + 1, y);
			lock(g, x, y + 1);
		} else if(c == 'N') {
			if(y == 0 || get(g, x, y - 1) != '.')
				set(g, x, y, '*');
			else {
				set(g, x, y, '.');
				set(g, x, y - 1, 'N');
				lock(g, x, y - 1);
			}
		} else if(c == 'S') {
			if(y == g->h || get(g, x, y + 1) != '.')
				set(g, x, y, '*');
			else {
				set(g, x, y, '.');
				set(g, x, y + 1, 'S');
				lock(g, x, y + 1);
			}
		} else if(c == 'W') {
			if(x == 0 || get(g, x - 1, y) != '.')
				set(g, x, y, '*');
			else {
				set(g, x, y, '.');
				set(g, x - 1, y, 'W');
				lock(g, x - 1, y);
			}
		}
		if(!ciuc(c))
			continue;
		library[cint(c)](g, x, y);
	}
	for(i = 0; i < g->l; ++i) {
	for(i = 0; i < g->l; ++i)
		printf("%c", g->data[i]);
	}
}

void


@@ 168,6 282,13 @@ load(FILE *f, Grid *g)
}

int
error(char *name)
{
	printf("Error: %s\n", name);
	return 0;
}

int
main(int argc, char *argv[])
{
	FILE *f;