#include <stdlib.h>
#include <stdio.h>
#include <string.h>

unsigned char data[1024] = {0};
unsigned char * data_ptr = data;

char input[1024] = {0};
char * input_ptr = input;

char output[1024] = {0};
char * output_ptr = output;

size_t run(char * code, size_t code_len, size_t code_pos, int deep)
{
   size_t i, begin, end;
   for(i = code_pos; i < code_len; i++)
   {
      switch(code[i])
      {
         case '+': (*data_ptr)++; break;
         case '-': (*data_ptr)--; break;
         case '>': data_ptr++; break;
         case '<': data_ptr--; break;
         case ',': *data_ptr = *input_ptr; input_ptr++; break;
         case '.': *output_ptr = *data_ptr; output_ptr++; break;
         case ']': return i;
         case '[':
            begin = i;
            while(*data_ptr)
            {
               code_pos = begin + 1;
               end = run(code, code_len, code_pos, deep + 1);
            }
            i = end;
            break;
      }
      if(deep && i == code_len - 1)
         abort();
   }

   return 0;
}

char * brain_luck(char * code, char * _input)
{
   strcpy(input, _input);

   printf("Code: '%s'\n", code);
   printf("Input: '%s'\n", input);
   run(code, strlen(code), 0, 0);
   printf("\nOutput: '%s'\n", output);
   
   char * result = (char *)malloc(strlen(output));
   strcpy(result, output);
   return result;
}

int main()
{
   brain_luck(",[.[-],]", "test");
}
