7
7
static const uint32_t TAPE_SIZE = 0x7530 ;
8
8
9
9
static cfbf_token cfbf_tokenize (char input );
10
- static void cfbf_generate_jumps (cfbf_state * state );
10
+ static int cfbf_generate_jumps (cfbf_state * state );
11
11
12
12
extern cfbf_state * cfbf_initialize_state (FILE * file , int32_t size )
13
13
{
@@ -67,7 +67,7 @@ extern cfbf_state *cfbf_initialize_state(FILE *file, int32_t size)
67
67
return state ;
68
68
}
69
69
70
- static void cfbf_generate_jumps (cfbf_state * state )
70
+ static int cfbf_generate_jumps (cfbf_state * state )
71
71
{
72
72
cfbf_stack * stack = cfbf_create_stack ();
73
73
@@ -76,20 +76,34 @@ static void cfbf_generate_jumps(cfbf_state *state)
76
76
cfbf_stack_push (stack , (uint32_t )i );
77
77
} else if (state -> commands [i ].token == JMP_BACK ) {
78
78
uint32_t jmp_fwrd ;
79
- cfbf_stack_pop (stack , & jmp_fwrd );
80
-
81
- state -> commands [jmp_fwrd ].jmp_ptr = (int32_t )i ;
82
- state -> commands [i ].jmp_ptr = (int32_t )jmp_fwrd ;
79
+ if (cfbf_stack_pop (stack , & jmp_fwrd )) {
80
+ state -> commands [jmp_fwrd ].jmp_ptr = (int32_t )i ;
81
+ state -> commands [i ].jmp_ptr = (int32_t )jmp_fwrd ;
82
+ } else {
83
+ fprintf (stderr , "Unopened close bracket found!\n" );
84
+ return 1 ;
85
+ }
83
86
}
84
87
}
85
88
89
+ if (!cfbf_stack_is_empty (stack )) {
90
+ fprintf (stderr , "Unclosed open bracket found!\n" );
91
+ return 1 ;
92
+ }
93
+
86
94
cfbf_destroy_stack (stack );
95
+
96
+ return 0 ;
87
97
}
88
98
89
99
extern int cfbf_run_commands (cfbf_state * state )
90
100
{
91
101
uint32_t code_ptr = 0 ;
92
- cfbf_generate_jumps (state );
102
+
103
+ if (cfbf_generate_jumps (state ) == 1 ) {
104
+ // Unbalanced brackets. Return error
105
+ return 1 ;
106
+ }
93
107
94
108
while (code_ptr < state -> commands_length ) {
95
109
switch (state -> commands [code_ptr ].token ) {
0 commit comments