#include #include #include "mem.h" #include "stack.h" #include "bfi.h" #ifdef DEBUG #define PRINT_PARAMS "'%c' (kood = %d)\n", c, c #else #define PRINT_PARAMS "%c", c #endif void intepret(char *program){ struct stack_st stack= { .len = 0, .size = 0, .arr = NULL}; int i = 0; int length = 0; while (program[i++] != '\0') length++; i = 0; while (i < length){ switch(program[i]) { case BF_READ: { /* Loeme märgi standardsisendist (kasutaja sisestab konsooli). */ int c = getc(stdin); if (EOF == c) { /* Sisendi lõpu korral lõpetame interpretaatori töö. */ printf("Sisendi lõpp!\n"); return; } /* Lisame mällu loetud väärtuse. */ mem_set((char) c); break; } case BF_RIGHT: { mem_right(); break; } case BF_LEFT: { mem_left(); break; } case BF_INCREASE: { mem_inc(); break; } case BF_DECREASE: { mem_dec(); break; } case BF_PRINT: { char c = mem_get(); printf(PRINT_PARAMS); break; } case BF_START_LOOP: { stackPush(&stack, i); int memVal = mem_get(); //printf("StartLoop! i = %d\n",i); //printf("memVal: %d\n", mem_get()); //printf("stackVal: %d\n", stackPeek(&stack)); //printf("%c\n\n", program[i]); //Skiping loop if (memVal == 0){ int helpCounter = 1; while (helpCounter != 0){ i++; if (program[i] == '[') helpCounter++; if (program[i] == ']') helpCounter--; } stackPop(&stack); } break; } case BF_END_LOOP: { //printf("Endloop! i = %d\n",i); //printf("memVal: %d\n", mem_get()); //printf("stackVal: %d\n", stackPeek(&stack)); //printf("%c\n\n", program[i]); if (mem_get() != 0){ i = stackPop(&stack); stackPush(&stack, i); } else stackPop(&stack); break; } } // Switch end i++; } // While loop end }