~rabbits/orca-toy

a452245dc6efc20004f9b7bc8e2015db254069a8 — neauoire 2 years ago 91db83d
Implemented x
3 files changed, 57 insertions(+), 6 deletions(-)

M build.sh
M demo.orca
M toy.c
M build.sh => build.sh +4 -2
@@ 11,5 11,7 @@ cc -std=c89 -DDEBUG -Wall -Wpedantic -Wshadow -Wextra -Werror=implicit-int -Werr
# Plan9
# pcc toy.c -o toy

./toy abflm.orca > abflm-result.orca
diff abflm-result.orca abflm-expected.orca
# ./toy abflm.orca > abflm-result.orca
# diff abflm-result.orca abflm-expected.orca

./toy demo.orca

M demo.orca => demo.orca +5 -2
@@ 1,5 1,8 @@
.............
....2L3......
.........aL3.
.............
.............
...44TCAFE...
.............
.............
.............
.............

M toy.c => toy.c +48 -2
@@ 1,7 1,7 @@
#include <stdio.h>

typedef struct Grid {
	int w, h, l;
	int w, h, l, f;
	int lock[256 * 256];
	char data[256 * 256];
} Grid;


@@ 59,7 59,7 @@ lock(Grid *g, int x, int y)
/* Library */

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



@@ 86,11 86,21 @@ _b(Grid *g, int x, int y)
void
_c(Grid *g, int x, int y)
{
	char rate = get(g, x - 1, y);
	char mod = get(g, x + 1, y);
	set(g, x, y + 1, cchr(g->f / rate % mod, ciuc(mod)));
	lock(g, x, y + 1);
	lock(g, x, y + 1);
}

void
_d(Grid *g, int x, int y)
{
	char rate = get(g, x - 1, y);
	char mod = get(g, x + 1, y);
	set(g, x, y + 1, g->f % (rate * mod) == 0 ? '*' : '.');
	lock(g, x, y + 1);
	lock(g, x, y + 1);
}

void


@@ 127,11 137,18 @@ _h(Grid *g, int x, int y)
void
_i(Grid *g, int x, int y)
{
	char step = get(g, x - 1, y);
	char mod = get(g, x + 1, y);
	char val = get(g, x, y + 1);
	set(g, x, y + 1, cchr((cint(val) + cint(step)) % cint(mod), ciuc(mod)));
	lock(g, x, y + 1);
}

void
_j(Grid *g, int x, int y)
{
	set(g, x, y + 1, get(g, x, y - 1));
	lock(g, x, y + 1);
}

void


@@ 206,11 223,24 @@ _s(Grid *g, int x, int y)
void
_t(Grid *g, int x, int y)
{
	int key = cint(get(g, x - 2, y));
	int len = cint(get(g, x - 1, y));
	int i;
	for(i = 0; i < len; ++i)
		lock(g, x + 1 + i, y);
	set(g, x, y + 1, get(g, x + 1 + (key % len), y));
	lock(g, x, y + 1);
}

void
_u(Grid *g, int x, int y)
{
	int max = cint(get(g, x - 1, y));
	int step = cint(get(g, x + 1, y));
	int bucket = (step * (g->f + max - 1)) % max + step;
	set(g, x, y + 1, bucket >= max ? '*' : '.');
	lock(g, x + 1, y);
	lock(g, x, y + 1);
}

void


@@ 233,16 263,31 @@ _w(Grid *g, int x, int y)
void
_x(Grid *g, int x, int y)
{
	int tx = cint(get(g, x - 2, y));
	int ty = cint(get(g, x - 1, y));
	set(g, x + tx, y + ty + 1, get(g, x + 1, y));
	lock(g, x + 1, y);
	lock(g, x + tx, y + ty + 1);
}

void
_y(Grid *g, int x, int y)
{
	set(g, x + 1, y, get(g, x - 1, y));
	lock(g, x + 1, y);
}

void
_z(Grid *g, int x, int y)
{
	int rate = cint(get(g, x - 1, y));
	char target = get(g, x + 1, y);
	char val = cint(get(g, x, y + 1));
	int t = cint(target);
	int mod = val < t ? rate : val > t ? -rate : 0;
	set(g, x, y + 1, cchr(val + mod, ciuc(target)));
	lock(g, x + 1, y);
	lock(g, x, y + 1);
}

/* clang-format off */


@@ 304,6 349,7 @@ main(int argc, char *argv[])
{
	FILE *f;
	Grid g;
	g.f = 0;
	if(argc < 2)
		return error("No input.");
	f = fopen(argv[1], "r");