#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define TOKENS "><+-.,[]"
#define CODE_SEGMENT_SIZE 30000
#define STACK_SEGMENT_SIZE 1000
#define DATA_SEGMENT_SIZE 30000
typedef void (*Callback)(void);
struct {
char cs[CODE_SEGMENT_SIZE]; /* Code Segment */
long ip; /* Instruction Pointer */
char ss[STACK_SEGMENT_SIZE]; /* Stack Segment */
long sp; /* Stack Pointer */
char ds[DATA_SEGMENT_SIZE]; /* Data Segment */
long bp; /* Base Pointer */
Callback fn[128];
} vm;
void vm_forward() {
vm.bp = (vm.bp + 1) % DATA_SEGMENT_SIZE;
}
void vm_backward() {
vm.bp = (vm.bp + DATA_SEGMENT_SIZE - 1) % DATA_SEGMENT_SIZE;
}
void vm_increment() {
vm.ds[vm.bp]++;
}
void vm_decrement() {
vm.ds[vm.bp]--;
}
void vm_input() {
}
void vm_output() {
}
void vm_while_entry() {
if (vm.ds[vm.bp]) {
vm.ss[vm.sp] = vm.ip - 1;
vm.sp++;
} else {
int c = 1;
for (vm.ip++; vm.cs[vm.ip] && c; vm.ip++) {
if (vm.cs[vm.ip] == '[') {
c++;
} else if (vm.cs[vm.ip] == ']') {
c--;
}
}
}
}
void vm_while_exit() {
if (vm.ds[vm.bp]) {
vm.sp--;
vm.ip = vm.ss[vm.sp];
}
}
void setup() {
int c;
int i;
vm.fn['>'] = vm_forward;
vm.fn['<'] = vm_backward;
vm.fn['+'] = vm_increment;
vm.fn['-'] = vm_decrement;
vm.fn['.'] = vm_output;
vm.fn[','] = vm_input;
vm.fn['['] = vm_while_entry;
vm.fn[']'] = vm_while_exit;
for (i
= 0; (c
= getchar()) != EOF
;) { vm.cs[i] = c;
i++;
}
}
}
void run() {
while (vm.cs[vm.ip]) {
vm.fn[vm.cs[vm.ip]]();
vm.ip++;
}
}
int main(int argc, char* argv[]) {
if (argc > 1) {
}
setup();
run();
return 0;
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRpby5oPgogCiNkZWZpbmUgVE9LRU5TICI+PCstLixbXSIKIAojZGVmaW5lIENPREVfU0VHTUVOVF9TSVpFIDMwMDAwCiNkZWZpbmUgU1RBQ0tfU0VHTUVOVF9TSVpFIDEwMDAKI2RlZmluZSBEQVRBX1NFR01FTlRfU0laRSAzMDAwMAogCnR5cGVkZWYgdm9pZCAoKkNhbGxiYWNrKSh2b2lkKTsKIApzdHJ1Y3QgewogIGNoYXIgY3NbQ09ERV9TRUdNRU5UX1NJWkVdOyAgIC8qIENvZGUgU2VnbWVudCAqLwogIGxvbmcgaXA7ICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RydWN0aW9uIFBvaW50ZXIgKi8KIAogIGNoYXIgc3NbU1RBQ0tfU0VHTUVOVF9TSVpFXTsgIC8qIFN0YWNrIFNlZ21lbnQgKi8KICBsb25nIHNwOyAgICAgICAgICAgICAgICAgICAgICAvKiBTdGFjayBQb2ludGVyICovCiAKICBjaGFyIGRzW0RBVEFfU0VHTUVOVF9TSVpFXTsgICAvKiBEYXRhIFNlZ21lbnQgKi8KICBsb25nIGJwOyAgICAgICAgICAgICAgICAgICAgICAvKiBCYXNlIFBvaW50ZXIgKi8KIAogIENhbGxiYWNrIGZuWzEyOF07Cn0gdm07CiAKdm9pZCB2bV9mb3J3YXJkKCkgewogIHZtLmJwID0gKHZtLmJwICsgMSkgJSBEQVRBX1NFR01FTlRfU0laRTsKfQogCnZvaWQgdm1fYmFja3dhcmQoKSB7CiAgdm0uYnAgPSAodm0uYnAgKyBEQVRBX1NFR01FTlRfU0laRSAtIDEpICUgREFUQV9TRUdNRU5UX1NJWkU7Cn0KIAp2b2lkIHZtX2luY3JlbWVudCgpIHsKICB2bS5kc1t2bS5icF0rKzsKfQogCnZvaWQgdm1fZGVjcmVtZW50KCkgewogIHZtLmRzW3ZtLmJwXS0tOwp9CiAKdm9pZCB2bV9pbnB1dCgpIHsKICB2bS5kc1t2bS5icF0gPSBnZXRjaGFyKCk7Cn0KIAp2b2lkIHZtX291dHB1dCgpIHsKICBwdXRjaGFyKHZtLmRzW3ZtLmJwXSk7Cn0KIAp2b2lkIHZtX3doaWxlX2VudHJ5KCkgewogIGlmICh2bS5kc1t2bS5icF0pIHsKICAgIHZtLnNzW3ZtLnNwXSA9IHZtLmlwIC0gMTsKICAgIHZtLnNwKys7CiAgfSBlbHNlIHsKICAgIGludCBjID0gMTsKICAgIGZvciAodm0uaXArKzsgdm0uY3Nbdm0uaXBdICYmIGM7IHZtLmlwKyspIHsKICAgICAgaWYgKHZtLmNzW3ZtLmlwXSA9PSAnWycpIHsKICAgICAgICBjKys7CiAgICAgIH0gZWxzZSBpZiAodm0uY3Nbdm0uaXBdID09ICddJykgewogICAgICAgIGMtLTsKICAgICAgfQogICAgfQogIH0KfQogCnZvaWQgdm1fd2hpbGVfZXhpdCgpIHsKICBpZiAodm0uZHNbdm0uYnBdKSB7CiAgICB2bS5zcC0tOwogICAgdm0uaXAgPSB2bS5zc1t2bS5zcF07CiAgfQp9CiAKdm9pZCBzZXR1cCgpIHsKICBpbnQgYzsKICBpbnQgaTsKIAogIG1lbXNldCgmdm0sIDAsIHNpemVvZih2bSkpOwogIHZtLmZuWyc+J10gPSB2bV9mb3J3YXJkOwogIHZtLmZuWyc8J10gPSB2bV9iYWNrd2FyZDsKICB2bS5mblsnKyddID0gdm1faW5jcmVtZW50OwogIHZtLmZuWyctJ10gPSB2bV9kZWNyZW1lbnQ7CiAgdm0uZm5bJy4nXSA9IHZtX291dHB1dDsKICB2bS5mblsnLCddID0gdm1faW5wdXQ7CiAgdm0uZm5bJ1snXSA9IHZtX3doaWxlX2VudHJ5OwogIHZtLmZuWyddJ10gPSB2bV93aGlsZV9leGl0OwogCiAgZm9yIChpID0gMDsgKGMgPSBnZXRjaGFyKCkpICE9IEVPRjspIHsKICAgIGlmIChzdHJjaHIoVE9LRU5TLCBjKSkgewogICAgICB2bS5jc1tpXSA9IGM7CiAgICAgIGkrKzsKICAgIH0KICB9Cn0KIAp2b2lkIHJ1bigpIHsKICB3aGlsZSAodm0uY3Nbdm0uaXBdKSB7CiAgICB2bS5mblt2bS5jc1t2bS5pcF1dKCk7CiAgICB2bS5pcCsrOwogIH0KfQogCmludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKICBpZiAoYXJnYyA+IDEpIHsKICAgIGZyZW9wZW4oYXJndlsxXSwgInIiLCBzdGRpbik7CiAgfQogCiAgc2V0dXAoKTsKICBydW4oKTsKIAogIHJldHVybiAwOwp9