Skip to content

Instantly share code, notes, and snippets.

@deciode

deciode/Acs.c Secret

Created August 28, 2013 20:35
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save deciode/5e90aede68a3c73a618d to your computer and use it in GitHub Desktop.
Save deciode/5e90aede68a3c73a618d to your computer and use it in GitHub Desktop.
This is an interpreter for OriginalOldMan's esolang, A:;.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OP(op, code) case op: { code; } break
#define ERROR(fmt, v) return fprintf(stderr, fmt, v)
#define V(v) vars[strchr(vs, v) - vs]
#define F(v) strtod(V(v), NULL)
static int ic;
static char **insns, *vars[12];
static const char *vs = "jlbocqrtuvwx";
void print(char *s)
{
char c;
while ((c = *s++))
s += putchar(c == '\\' ? '\n' : c) - c == '\\';
}
void run()
{
size_t t, len;
int d, ip = -1;
char *p, *insn;
while (++ip < ic) {
insn = insns[ip];
if ((p = strchr(vs, *insn)))
vars[p - vs] = strdup(insn + 2);
switch (*insn) {
OP('p', print(V(insn[2])));
OP('a', sprintf(V(insn[2]), "%.1f", F(insn[2]) + F(insn[4])));
OP('s', sprintf(V(insn[2]), "%.1f", F(insn[2]) - F(insn[4])));
OP('m', sprintf(V(insn[2]), "%.1f", F(insn[2]) * F(insn[4])));
OP('d', sprintf(V(insn[2]), "%.1f", F(insn[2]) / F(insn[4])));
OP('g', ip = atoi(insn + 2) - 1);
OP('k', return);
case 'i': case 'n':
len = getline(&V(insn[2]), &t, stdin);
V(insn[2])[--len] = '\0'; break;
case '?':
d = strcmp(V(insn[2]), V(insn[6]));
if ((insn[4] == '=' && d) ||
(insn[4] == '<' && d >= 0) ||
(insn[4] == '>' && d <= 0))
ip += insn[8] - '0';
}
}
}
int main(int argc, char **argv)
{
int c, i;
FILE *src;
if (argc != 2)
ERROR("Usage: %s FILE\n", *argv);
if (!(src = fopen(argv[1], "r")))
ERROR("No such file: %s\n", argv[1]);
for (i = 0; (c = fgetc(src)) != EOF; ++i) {
if (strchr(";\n", c)) {
fseek(src, -++i, SEEK_CUR);
insns = realloc(insns, ++ic * sizeof insns);
fread(insns[--ic] = malloc(i), i, 1, src);
i = (insns[ic++][i - 1] = '\0') - 1;
}
}
run();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment