Created
February 2, 2010 02:29
-
-
Save d5884/292295 to your computer and use it in GitHub Desktop.
adhock implementation of brainf*ck
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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