aboutsummaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2025-09-16 17:24:52 +0200
committerlemon <lsof@mailbox.org>2025-09-16 17:24:52 +0200
commit75db572e8a7a144b3d6fdc2b148ac3921f77f2b2 (patch)
tree092f3417cbdad29397d5eeeef3e0645febddb096 /test
parent0368070045f0ebcdcb12d49da9edc4d10ca30c60 (diff)
implement switch statement
Diffstat (limited to 'test')
-rw-r--r--test/bf.c45
1 files changed, 45 insertions, 0 deletions
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]);
+}