aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/03-bf.c
blob: 5b8ff8a2e234529dd14c12ab8e9736130cfb4872 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/* EXPECT:
Hello World!
*/
unsigned char M[1<<15];

void bf(const char *p)
{
   extern int putchar(int);
   extern int getchar(void);
   unsigned char *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]);
}