Skip to content

Instantly share code, notes, and snippets.

@d5884
Created February 2, 2010 02:29
Show Gist options
  • Save d5884/292295 to your computer and use it in GitHub Desktop.
Save d5884/292295 to your computer and use it in GitHub Desktop.
adhock implementation of brainf*ck
#include <stdio.h>
#include <stdlib.h>
#define INPUT_BUFSIZE 4096
#define HEAP_SIZE 65535
#define SYM_INC_PTR '>'
#define SYM_DEC_PTR '<'
#define SYM_ADD_CUR '+'
#define SYM_SUB_CUR '-'
#define SYM_OUTPUT '.'
#define SYM_INPUT ','
#define SYM_JZE '['
#define SYM_JNZ ']'
char *search_close_bracket(char *cur);
char *search_open_bracket(char *cur);
int main(int argc, char *argv[])
{
char buf[INPUT_BUFSIZE];
char heap[HEAP_SIZE];
char *cur, *pointer;
fgets(buf, INPUT_BUFSIZE, stdin);
memset(heap, 0x00, HEAP_SIZE);
cur = &buf[0];
pointer = &heap[0];
while(*cur != '\0') {
switch(*cur) {
case SYM_INC_PTR:
pointer++; /* TODO: LIMIT CHECK */
break;
case SYM_DEC_PTR:
pointer--; /* TODO: LIMIT CHECK */
break;
case SYM_ADD_CUR:
*pointer += 1;
break;
case SYM_SUB_CUR:
*pointer -= 1;
break;
case SYM_OUTPUT:
fputc(*pointer, stdout);
break;
case SYM_INPUT:
*pointer = fgetc(stdin);
break;
case SYM_JZE:
if (*pointer == 0) {
cur = search_close_bracket(cur) - 1;
}
break;
case SYM_JNZ:
if (*pointer != 0) {
cur = search_open_bracket(cur);
}
break;
case '\n':
case '\r':
case ' ':
case '\t':
/* ignore blank characters */
break;
default:
fprintf(stderr, "unrecognized character - %c\n", *cur);
return;
break;
}
cur++;
}
}
/* TODO: LIMIT CHECK */
char *search_close_bracket(char *cur)
{
int level = 0;
cur++;
level++;
while (level > 0) {
if (*cur == '[')
level++;
else if (*cur == ']')
level--;
cur++;
}
return cur;
}
/* TODO: LIMIT CHECK */
char *search_open_bracket(char *cur)
{
int level = 0;
cur--;
level++;
while (level > 0) {
if (*cur == '[')
level--;
else if (*cur == ']')
level++;
cur--;
}
return cur;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment