From 75db572e8a7a144b3d6fdc2b148ac3921f77f2b2 Mon Sep 17 00:00:00 2001 From: lemon Date: Tue, 16 Sep 2025 17:24:52 +0200 Subject: implement switch statement --- test/bf.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 test/bf.c (limited to 'test/bf.c') diff --git a/test/bf.c b/test/bf.c new file mode 100644 index 0000000..2ebdbb8 --- /dev/null +++ b/test/bf.c @@ -0,0 +1,45 @@ +unsigned char M[1<<15]; + +void bf(const char *p) +{ + extern int putchar(int); + extern int getchar(void); + static unsigned char *const Mend = M + sizeof M; + int b; + unsigned char *m = M; + + while (*p) { + switch (*p) { + case '+': ++*m; break; + case '-': --*m; break; + case '<': if (m == M) m = Mend; else --m; break; + case '>': if (m == Mend) m = M; else ++m; break; + case '.': putchar(*m); break; + case ',': *m = getchar(); break; + case '[': + if (*m) break; + b = 0; + do switch (*p++) { + case '[': ++b; break; + case ']': --b; break; + case 0: return; + } while (b != 0); + continue; + case ']': + if (!*m) break; + b = 0; + do switch (*p--) { + case '[': ++b; break; + case ']': --b; break; + case 0: return; + } while (b != 0); + break; + } + ++p; + } +} + +int main(int argc, char **argv) { + const char *p = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++."; + bf(argc < 2 ? p : argv[1]); +} -- cgit v1.2.3