diff options
| author | 2025-09-16 17:24:52 +0200 | |
|---|---|---|
| committer | 2025-09-16 17:24:52 +0200 | |
| commit | 75db572e8a7a144b3d6fdc2b148ac3921f77f2b2 (patch) | |
| tree | 092f3417cbdad29397d5eeeef3e0645febddb096 /test | |
| parent | 0368070045f0ebcdcb12d49da9edc4d10ca30c60 (diff) | |
implement switch statement
Diffstat (limited to 'test')
| -rw-r--r-- | test/bf.c | 45 |
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]); +} |