From 3e1432e89f97c566b03fadefab8be97e04eed20f Mon Sep 17 00:00:00 2001 From: Jinwei Zhao Date: Mon, 23 Feb 2015 15:13:30 +0800 Subject: fix loop --- brainfuck.c | 53 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/brainfuck.c b/brainfuck.c index ceb52c4..5cd021e 100644 --- a/brainfuck.c +++ b/brainfuck.c @@ -8,6 +8,7 @@ typedef struct brainfuck{ char command[MAX_DATA]; char *ptr; int count; + int num; }bf; bf one; @@ -17,6 +18,7 @@ void init() char c; memset(&one, 0, sizeof(one)); one.count = 0; + one.num = 0; one.ptr = one.data; while ((c = getchar()) != EOF) @@ -25,7 +27,7 @@ void init() break; one.command[++one.count] = c; } - one.command[0] = one.count; + one.num = one.count; one.command[one.count] = '\0'; } @@ -33,6 +35,8 @@ void run() { char c; int i; + int left; + int right; one.count = 0; while (c = one.command[++one.count]) @@ -40,16 +44,22 @@ void run() switch (c) { case '+': - (*one.ptr)++; + if (*one.ptr == 255) + *one.ptr = 0; + else + ++*one.ptr; break; case '-': - (*one.ptr)--; + if (*one.ptr == 0) + *one.ptr = 255; + else + --*one.ptr; break; case '>': - one.ptr++; + ++one.ptr; break; case '<': - one.ptr--; + --one.ptr; break; case ',': *one.ptr = getchar(); @@ -58,31 +68,48 @@ void run() putchar(*one.ptr); break; case '[': + left = 0; if (*one.ptr != 0) break; else { - for (i = one.count + 1; i <= one.command[0]; i++) + for (i = one.count + 1; i <= one.num; i++) { - if (one.command[i] == ']') + if (one.command[i] == '[') + ++left; + else if (one.command[i] == ']') { - one.count = i; - break; + if (left == 0) + { + one.count = i; + break; + } + else + --left; } + } } break; case ']': + right = 0; if (*one.ptr == 0) break; else { for (i = one.count - 1; i >= 1; i--) { - if (one.command[i] == '[') + if (one.command[i] == ']') + ++right; + else if (one.command[i] == '[') { - one.count = i; - break; + if (right == 0) + { + one.count = i; + break; + } + else + --right; } } } @@ -97,4 +124,4 @@ int main(int argc, char **argv) init(); run(); return 0; -} \ No newline at end of file +} -- cgit v1.2.3