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

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

char input[1024] = {0};

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

// input_ptr теперь параметр
size_t run(char * code, size_t code_len, size_t code_pos, char * input_ptr, 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;
                                           // Измненеие input_ptr
         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;
                                   // Рекурсивный вызов run()
               end = run(code, code_len, code_pos, input_ptr, deep + 1);
            }
            i = end;
            break;
      }
      if(deep && i == code_len - 1)
         abort();
   }

   return 0;
}

char * brain_luck(char * code, char * _input)
{
   strcpy(input, _input);
   
   // Новое объявление input_ptr
   char * input_ptr = input;

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

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