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

size_t run(char * code,
           size_t code_len,
           size_t code_pos,
           unsigned char ** data_ptr,
           char ** input_ptr,
           char ** output_ptr,
           int depth)
{
   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, data_ptr, input_ptr, output_ptr, depth + 1);
            }
            i = end;
            break;
      }
   }

   return 0;
}

char * brain_luck(char * code, char * input)
{
   unsigned char * data = (unsigned char *)malloc(1024);
   memset(data, '\0', 1024);
   
   char * output = (char *)malloc(1024);
   memset(output, '\0', 1024);
	
   unsigned char * data_ptr = data;
   char * input_ptr = input;
   char * output_ptr = output;
	
   printf("Code: '%s'\n", code);
   printf("Input: '%s'\n", input);
   run(code, strlen(code), 0, &data_ptr, &input_ptr, &output_ptr, 0);
   printf("Output: '%s'\n", output);
   
   free(data);
   
   return output;
}

int main()
{
   char *r1 =brain_luck(",[.[-],]", "test");
   printf("Result1: '%s'\n\n", r1);
   free(r1);
   
   char *r2 =brain_luck("++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.", "not used");
   printf("Result2: '%s'\n\n", r2);
   free(r2);
   
   char *r3 =brain_luck(",[.[-],]", "test");
   printf("Result3:' %s'\n\n", r3);
   free(r3);
   
   char *r4 =brain_luck(",+[-.,+]", "huita");
   printf("Result4: '%s'\n\n", r1);
   free(r4);
}
