Brainfu_k in C

リハビリの続き。

#include <stdio.h>

typedef unsigned char byte_t;

int bf_exec(const char* code, int len, size_t mem_size) {
    byte_t* memory = calloc(mem_size, sizeof(byte_t));
    byte_t* pointer = memory;
    const char* ip = code;

    while ((ip - code) < len) {
        switch (*ip) {
            case '>':
                ++pointer;
                break;
            case '<':
                --pointer;
                break;
            case '+':
                ++(*pointer);
                break;
            case '-':
                --(*pointer);
                break;
            case '.':
                fputc(*pointer, stdout); 
                break;
            case ',':
                *pointer = fgetc(stdin);
                break;
            case '[':
                if (*pointer == 0) {
                    int level = 1;
                    while (level) {
                        ++ip;
                        if (*ip == '[') {
                            ++level;
                        } else if (*ip == ']') {
                            --level;
                        }
                    }
                }
                break;
            case ']':
                if (*pointer != 0) {
                    int level = 1;
                    while (level) {
                        --ip;
                        if (*ip == '[') {
                            --level;
                        } else if (*ip == ']') {
                            ++level;
                        }
                    }
                    --ip;
                }
                break;
            defalt:
                break;
        }
        ++ip;
    }

    free(memory);

    return 0;
}

int main(int argc, char** argv) {
    const char* helloworld = "+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.------------.<++++++++.--------.+++.------.--------.>+.";

    const char* metacircular = ">>>+[[-]>>[-]++>+>+++++++[<++++>>++<-]++>>+>+>+++++[>++>++++++<<-]+>>>,<++[[>[->>]<[>>]<<-]<[<]<+>>[>]>[<+>-[[<+>-]>]<[[[-]<]++<-[<+++++++++>[<->-]>>]>>]]<<]<]<[[<]>[[>]>>[>>]+[<<]<[<]<+>>-]>[>]+[->>]<<<<[[<<]<[<]+<<[+>+<<-[>-->+<<-[>+<[>>+<<-]]]>[<+>-]<]++>>-->[>]>>[>>]]<<[>>+<[[<]<]>[[<<]<[<]+[-<+>>-[<<+>++>-[<->[<<+>>-]]]<[>+<-]>]>[>]>]>[>>]>>]<<[>>+>>+>>]<<[->>>>>>>>]<<[>.>>>>>>>]<<[>->>>>>]<<[>,>>>]<<[>+>]<<[+<<]<]";

    bf_exec(helloworld, strlen(helloworld), 1024);
    bf_exec(metacircular, strlen(metacircular), 1024);
    return 0;
}