Mercurial > repo
diff share/delvs-master/delvs.h @ 3840:38a5b4d8a98e
<oerjan> rm -R share/delvs-master; mv delvs-master share
author | HackBot |
---|---|
date | Wed, 25 Sep 2013 13:47:14 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/delvs-master/delvs.h Wed Sep 25 13:47:14 2013 +0000 @@ -0,0 +1,111 @@ +#include <stdio.h> +#include <unistd.h> +#define c g->code +#define p g->pointer +#define f g->file +#define b g->bit + +struct Data { + const char *code; + char vars[30000]; + char *pointer; + char bit; + FILE *file; +}; + +void lexer(struct Data *g) { + const char *cc = c; + while(*c) + switch (*c++) { + case '>': + ++p; + break; + + case '<': + --p; + break; + + case '+': + ++*p; + break; + + case '-': + --*p; + break; + + case '.': + putchar(*p); + break; + + case ',': + *p = getchar(); + break; + + case '[': + cc = c; + if(!*p) while(*c++ != ']'); + while(*p) { + c = cc; // restore char position to start of loop + lexer(g); + } + break; + + case ']': + return; + + case ':': + printf("%hhd", *p); + break; + + case ';': + scanf("%hhd", p); + break; + + case '#': + // open in read mode unless the cell is 1 + if(f) fclose(f); + f = fopen(p + 1, *p == 1 ? "w" : "r"); + break; + + case '`': + *p = fgetc(f); + break; + + case '!': + fputc(*p, f); + break; + + case '\'': + *p ^= (1 << b); + b <= 0 ? b = 7 : b--; + break; + + case '"': + b <= 0 ? b = 7 : b--; + break; + + case '\\': + while(*c++ != '\n'); + break; + + case '@': + printf("%hhd : %hhd : %hhd : %hhd : %hhd", *(p - 2), *(p - 1), *p, *(p + 1), *(p + 2)); + break; + + case '$': + sleep(*p); + break; + + default: + // everything else is comments + break; + } +} +/* + * Usage: + * struct Data g; + * g.code = "code here"; + * g.bit = 7; + * g.pointer = &g.data[15000]; + * lexer(&g); + */