Просмотр исходного кода

properly implemented inputs

A programs inputs can now be entered from the edit screen. The interpreter will read the next char from the input buffer each time a "read char" symbol is encountered. if it reaches the end of a terminator it will loop.
J 3 лет назад
Родитель
Сommit
bc79a5bf5f
4 измененных файлов с 30 добавлено и 30 удалено
  1. 4 6
      scenes/brainfuck_scene_set_input.c
  2. 2 2
      views/bf_dev_env.c
  3. 21 21
      worker.c
  4. 3 1
      worker.h

+ 4 - 6
scenes/brainfuck_scene_set_input.c

@@ -5,7 +5,6 @@ void set_input_text_input_callback(void* context) {
     view_dispatcher_send_custom_event(app->view_dispatcher, brainfuckCustomEventTextInputDone);
 }
 
-char tmpBuffer[64] = {};
 void brainfuck_scene_set_input_on_enter(void* context) {
     BFApp* app = context;
     TextInput* text_input = app->text_input;
@@ -15,7 +14,7 @@ void brainfuck_scene_set_input_on_enter(void* context) {
         text_input,
         set_input_text_input_callback,
         app,
-        tmpBuffer,
+        app->inputBuffer,
         64,
         true);
 
@@ -24,18 +23,17 @@ void brainfuck_scene_set_input_on_enter(void* context) {
 
 bool brainfuck_scene_set_input_on_event(void* context, SceneManagerEvent event) {
     BFApp* app = context;
-    UNUSED(app);
     
     bool consumed = false;
     if(event.type == SceneManagerEventTypeCustom) {
         if(event.event == brainfuckCustomEventTextInputDone) {
-            memcpy(app->inputBuffer, tmpBuffer, 64);
-            scene_manager_next_scene(app->scene_manager, brainfuckSceneDevEnv);
+            scene_manager_search_and_switch_to_previous_scene(app->scene_manager, brainfuckSceneDevEnv);
         }
     }
     return consumed;
 }
 
 void brainfuck_scene_set_input_on_exit(void* context) {
-    UNUSED(context);
+    BFApp* app = context;
+    scene_manager_search_and_switch_to_previous_scene(app->scene_manager, brainfuckSceneDevEnv);
 }

+ 2 - 2
views/bf_dev_env.c

@@ -84,7 +84,7 @@ static void bf_dev_draw_callback(Canvas* canvas, void* _model) {
         execCountdown--;
         canvas_draw_str_aligned(canvas, 64, 32, AlignCenter, AlignCenter, "RUNNING...");
         if(execCountdown == 0){
-            initWorker(appDev->dataBuffer, appDev->dataSize);
+            initWorker(appDev);
             beginWorker();
             text_box_set_text(appDev->text_box, workerGetOutput());
             scene_manager_next_scene(appDev->scene_manager, brainfuckSceneExecEnv);
@@ -287,7 +287,7 @@ static bool bf_dev_process_ok(BFDevEnv* devEnv, InputEvent* event) {
         case 9:
         {
             //todo: input
-            //scene_manager_next_scene(appDev->scene_manager, brainfuckSceneSetInput);
+            scene_manager_next_scene(appDev->scene_manager, brainfuckSceneSetInput);
             break;
         }
 

+ 21 - 21
worker.c

@@ -1,4 +1,4 @@
-#include "brainfuck_i.h"
+#include "worker.h"
 
 int status = 0; //0: idle, 1: running, 2: failure
 
@@ -10,10 +10,10 @@ int runOpCount = 0;
 char* wOutput = 0;
 int wOutputPtr = 0;
 
-char wInput = 0x00;
-bool wInputFlag = false;
+char* wInput = 0;
+int wInputPtr = 0;
 
-char* bfStack = 0;
+uint8_t* bfStack = 0;
 int stackPtr = 0;
 int stackSize = BF_STACK_INITIAL_SIZE;
 int stackSizeReal = 0;
@@ -48,12 +48,7 @@ int getStatus(){
     return status;
 }
 
-void workerSetInput(char c){
-    wInput = c;
-    wInputFlag = true;
-}
-
-void initWorker(char* instructions, int instructionsCount){
+void initWorker(BFApp* app){
     //rebuild output
     if(wOutput){ free(wOutput); }
     wOutput = (char*)malloc(BF_OUTPUT_SIZE);
@@ -61,22 +56,22 @@ void initWorker(char* instructions, int instructionsCount){
 
     //rebuild stack
     if(bfStack){ free(bfStack); }
-    bfStack = (char*)malloc(BF_STACK_INITIAL_SIZE);
+    bfStack = (uint8_t*)malloc(BF_STACK_INITIAL_SIZE);
     memset(bfStack, 0x00, BF_STACK_INITIAL_SIZE);
     stackSize = BF_STACK_INITIAL_SIZE;
     stackSizeReal = 0;
     stackPtr = 0;
 
-    //reset input
-    wInput = 0x00;
-    wInputFlag = false;
-
     //set instructions
-    inst = instructions;
-    instCount = instructionsCount;
+    inst = app->dataBuffer;
+    instCount = app->dataSize;
     instPtr = 0;
     runOpCount = 0;
 
+    //set input
+    wInput = app->inputBuffer;
+    wInputPtr = 0;
+
     //set status
     status = 0;
 }
@@ -96,7 +91,7 @@ void rShift(){
         }
 
         memset((tmp + stackSize) - BF_STACK_STEP_SIZE, 0x00, BF_STACK_STEP_SIZE);
-        bfStack = tmp;
+        bfStack = (uint8_t*)tmp;
     };
     if(stackPtr > stackSizeReal){ 
         stackSizeReal = stackPtr; 
@@ -130,9 +125,14 @@ void print(){
 
 void input(){
     runOpCount++;
-    //todo
-    wInput = 0x00;
-    wInputFlag = true;
+    
+    bfStack[stackPtr] = (uint8_t)wInput[wInputPtr];
+    if(wInput[wInputPtr] == 0x00 || wInputPtr >= 64){
+        wInputPtr = 0;
+    }
+    else{
+        wInputPtr++;
+    }
 }
 
 void loop() {

+ 3 - 1
worker.h

@@ -1,4 +1,6 @@
-void initWorker(char* instructions, int instructionsCount);
+#include "brainfuck_i.h"
+
+void initWorker(BFApp* application);
 char* workerGetOutput();
 int getStackSize();
 int getOpCount();