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; }