diff --git a/app.c b/app.c index a8453ba..b3cd700 100644 --- a/app.c +++ b/app.c @@ -7,6 +7,25 @@ #define modify_var(state,num) state ## num +void +bit_flipper_output_fn_gen(state_t *from, state_t *to, + char *input_buffer, + unsigned int transition_key_size, + fsm_output_buff_t *fsm_output_buff){ + + char out; + out = (*input_buffer == '1') ? '0' : '1'; + + fsm_output_buff->curr_pos += snprintf( fsm_output_buff->output_buffer + + fsm_output_buff->curr_pos, + (MAX_FSM_OUTPUT_BUFFER - fsm_output_buff->curr_pos - 1), + "%s-->%c|%c-->%s\n", + from->state_name, *input_buffer, + out, to->state_name); + + +} + fsm_t * fsm_end_with_strict_pattern_01_or_10(){ @@ -31,11 +50,13 @@ fsm_end_with_strict_pattern_01_or_10(){ create_and_insert_new_tt_entry(trans_table, "0", 1, + bit_flipper_output_fn_gen, q2); create_and_insert_new_tt_entry(trans_table, "1", 1, + bit_flipper_output_fn_gen, q1); //State q1 @@ -43,11 +64,13 @@ fsm_end_with_strict_pattern_01_or_10(){ create_and_insert_new_tt_entry(trans_table, "0", 1, + bit_flipper_output_fn_gen, q2); create_and_insert_new_tt_entry(trans_table, "1", 1, + bit_flipper_output_fn_gen, q3); //State q2 @@ -55,11 +78,13 @@ fsm_end_with_strict_pattern_01_or_10(){ create_and_insert_new_tt_entry(trans_table, "0", 1, + bit_flipper_output_fn_gen, q3); create_and_insert_new_tt_entry(trans_table, "1", 1, + bit_flipper_output_fn_gen, q1); //State q3 @@ -67,11 +92,13 @@ fsm_end_with_strict_pattern_01_or_10(){ create_and_insert_new_tt_entry(trans_table, "0", 1, + bit_flipper_output_fn_gen, q3); create_and_insert_new_tt_entry(trans_table, "1", 1, + bit_flipper_output_fn_gen, q3); return fsm; @@ -99,28 +126,28 @@ fsm_end_with_00_or_11(){ tt_t *trans_table = NULL; //State q0 trans_table = &(q0->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "0", 1, q1); - create_and_insert_new_tt_entry(trans_table, "1", 1, q2); + create_and_insert_new_tt_entry(trans_table, "0", 1, NULL, q1); + create_and_insert_new_tt_entry(trans_table, "1", 1, NULL,q2); //State q1 trans_table = &(q1->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "0", 1, q3); - create_and_insert_new_tt_entry(trans_table, "1", 1, q2); + create_and_insert_new_tt_entry(trans_table, "0", 1, NULL, q3); + create_and_insert_new_tt_entry(trans_table, "1", 1, NULL, q2); //State q2 trans_table = &(q2->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "0", 1, q1); - create_and_insert_new_tt_entry(trans_table, "1", 1, q4); + create_and_insert_new_tt_entry(trans_table, "0", 1, NULL, q1); + create_and_insert_new_tt_entry(trans_table, "1", 1, NULL, q4); //State q3 trans_table = &(q3->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "0", 1, q3); - create_and_insert_new_tt_entry(trans_table, "1", 1, q2); + create_and_insert_new_tt_entry(trans_table, "0", 1, NULL, q3); + create_and_insert_new_tt_entry(trans_table, "1", 1, NULL, q2); //State q4 trans_table = &(q4->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "0", 1, q1); - create_and_insert_new_tt_entry(trans_table, "1", 1, q4); + create_and_insert_new_tt_entry(trans_table, "0", 1, NULL, q1); + create_and_insert_new_tt_entry(trans_table, "1", 1, NULL, q4); return fsm; } @@ -141,13 +168,13 @@ fsm_odd_1(){ tt_t *trans_table = NULL; //State q0 trans_table = &(q0->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "0", 1, q0); - create_and_insert_new_tt_entry(trans_table, "1", 1, q1); + create_and_insert_new_tt_entry(trans_table, "0", 1, NULL, q0); + create_and_insert_new_tt_entry(trans_table, "1", 1, NULL, q1); //State q1 trans_table = &(q1->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "0", 1, q1); - create_and_insert_new_tt_entry(trans_table, "1", 1, q0); + create_and_insert_new_tt_entry(trans_table, "0", 1, NULL, q1); + create_and_insert_new_tt_entry(trans_table, "1", 1, NULL, q0); return fsm; } @@ -201,93 +228,93 @@ fsm_balanced_paranthesis_3_levels(){ //State q0 (initial state) trans_table = &(q0->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "(", 1, q1); - create_and_insert_new_tt_entry(trans_table, ")", 1, q17); + create_and_insert_new_tt_entry(trans_table, "(", 1, NULL, q1); + create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q17); //State q1 trans_table = &(q1->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "(", 1, q2); - create_and_insert_new_tt_entry(trans_table, ")", 1, q11); + create_and_insert_new_tt_entry(trans_table, "(", 1, NULL, q2); + create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q11); //State q2 trans_table = &(q2->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "(", 1, q3); - create_and_insert_new_tt_entry(trans_table, ")", 1, q13); + create_and_insert_new_tt_entry(trans_table, "(", 1, NULL, q3); + create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q13); //State q3 trans_table = &(q3->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "(", 1, q17); - create_and_insert_new_tt_entry(trans_table, ")", 1, q4); + create_and_insert_new_tt_entry(trans_table, "(", 1, NULL, q17); + create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q4); //State q4 trans_table = &(q4->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "(", 1, q17); - create_and_insert_new_tt_entry(trans_table, ")", 1, q5); + create_and_insert_new_tt_entry(trans_table, "(", 1, NULL, q17); + create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q5); //State q5 trans_table = &(q5->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "(", 1, q17); - create_and_insert_new_tt_entry(trans_table, ")", 1, q6); + create_and_insert_new_tt_entry(trans_table, "(", 1, NULL, q17); + create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q6); //State q6 trans_table = &(q6->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "(", 1, q7); - create_and_insert_new_tt_entry(trans_table, ")", 1, q17); + create_and_insert_new_tt_entry(trans_table, "(", 1, NULL, q7); + create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q17); //State q7 trans_table = &(q7->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "(", 1, q8); - create_and_insert_new_tt_entry(trans_table, ")", 1, q17); + create_and_insert_new_tt_entry(trans_table, "(", 1, NULL, q8); + create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q17); //State q8 trans_table = &(q8->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "(", 1, q9); - create_and_insert_new_tt_entry(trans_table, ")", 1, q17); + create_and_insert_new_tt_entry(trans_table, "(", 1, NULL, q9); + create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q17); //State q9 trans_table = &(q9->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "(", 1, q17); - create_and_insert_new_tt_entry(trans_table, ")", 1, q10); + create_and_insert_new_tt_entry(trans_table, "(", 1, NULL, q17); + create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q10); //State q10 trans_table = &(q10->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "(", 1, q17); - create_and_insert_new_tt_entry(trans_table, ")", 1, q5); + create_and_insert_new_tt_entry(trans_table, "(", 1, NULL, q17); + create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q5); //State q11 trans_table = &(q11->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "(", 1, q12); - create_and_insert_new_tt_entry(trans_table, ")", 1, q17); + create_and_insert_new_tt_entry(trans_table, "(", 1, NULL, q12); + create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q17); //State q12 trans_table = &(q12->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "(", 1, q17); - create_and_insert_new_tt_entry(trans_table, ")", 1, q11); + create_and_insert_new_tt_entry(trans_table, "(", 1, NULL, q17); + create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q11); //State q13 trans_table = &(q13->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "(", 1, q17); - create_and_insert_new_tt_entry(trans_table, ")", 1, q14); + create_and_insert_new_tt_entry(trans_table, "(", 1, NULL, q17); + create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q14); //State q14 trans_table = &(q14->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "(", 1, q15); - create_and_insert_new_tt_entry(trans_table, ")", 1, q17); + create_and_insert_new_tt_entry(trans_table, "(", 1, NULL, q15); + create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q17); //State q15 trans_table = &(q15->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "(", 1, q16); - create_and_insert_new_tt_entry(trans_table, ")", 1, q17); + create_and_insert_new_tt_entry(trans_table, "(", 1, NULL, q16); + create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q17); //State q16 trans_table = &(q16->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "(", 1, q17); - create_and_insert_new_tt_entry(trans_table, ")", 1, q13); + create_and_insert_new_tt_entry(trans_table, "(", 1, NULL, q17); + create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q13); //State q17 trans_table = &(q17->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "(", 1, q17); - create_and_insert_new_tt_entry(trans_table, ")", 1, q17); + create_and_insert_new_tt_entry(trans_table, "(", 1, NULL, q17); + create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q17); return fsm; } @@ -321,84 +348,90 @@ fsm_phone_validation_6_digits(){ tt_t *trans_table = NULL; //State q0 trans_table = &(q0->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "0", 1, q7); - create_and_insert_new_tt_entry(trans_table, "1", 1, q1); - create_and_insert_new_tt_entry(trans_table, "2", 1, q1); - create_and_insert_new_tt_entry(trans_table, "3", 1, q1); - create_and_insert_new_tt_entry(trans_table, "4", 1, q1); - create_and_insert_new_tt_entry(trans_table, "5", 1, q1); - create_and_insert_new_tt_entry(trans_table, "6", 1, q1); - create_and_insert_new_tt_entry(trans_table, "7", 1, q1); - create_and_insert_new_tt_entry(trans_table, "8", 1, q1); - create_and_insert_new_tt_entry(trans_table, "9", 1, q1); + create_and_insert_new_tt_entry(trans_table, "0", 1, NULL, q7); + create_and_insert_new_tt_entry(trans_table, "1", 1, NULL, q1); + create_and_insert_new_tt_entry(trans_table, "2", 1, NULL, q1); + create_and_insert_new_tt_entry(trans_table, "3", 1, NULL, q1); + create_and_insert_new_tt_entry(trans_table, "4", 1, NULL, q1); + create_and_insert_new_tt_entry(trans_table, "5", 1, NULL, q1); + create_and_insert_new_tt_entry(trans_table, "6", 1, NULL, q1); + create_and_insert_new_tt_entry(trans_table, "7", 1, NULL, q1); + create_and_insert_new_tt_entry(trans_table, "8", 1, NULL, q1); + create_and_insert_new_tt_entry(trans_table, "9", 1, NULL, q1); for(int i = 1 ; i <= 6 ; i++){ trans_table = &(fsm->states[i]->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "0", 1, fsm->states[i+1]); - create_and_insert_new_tt_entry(trans_table, "1", 1, fsm->states[i+1]); - create_and_insert_new_tt_entry(trans_table, "2", 1, fsm->states[i+1]); - create_and_insert_new_tt_entry(trans_table, "3", 1, fsm->states[i+1]); - create_and_insert_new_tt_entry(trans_table, "4", 1, fsm->states[i+1]); - create_and_insert_new_tt_entry(trans_table, "5", 1, fsm->states[i+1]); - create_and_insert_new_tt_entry(trans_table, "6", 1, fsm->states[i+1]); - create_and_insert_new_tt_entry(trans_table, "7", 1, fsm->states[i+1]); - create_and_insert_new_tt_entry(trans_table, "8", 1, fsm->states[i+1]); - create_and_insert_new_tt_entry(trans_table, "9", 1, fsm->states[i+1]); + create_and_insert_new_tt_entry(trans_table, "0", 1, NULL, fsm->states[i+1]); + create_and_insert_new_tt_entry(trans_table, "1", 1, NULL, fsm->states[i+1]); + create_and_insert_new_tt_entry(trans_table, "2", 1, NULL, fsm->states[i+1]); + create_and_insert_new_tt_entry(trans_table, "3", 1, NULL, fsm->states[i+1]); + create_and_insert_new_tt_entry(trans_table, "4", 1, NULL, fsm->states[i+1]); + create_and_insert_new_tt_entry(trans_table, "5", 1, NULL, fsm->states[i+1]); + create_and_insert_new_tt_entry(trans_table, "6", 1, NULL, fsm->states[i+1]); + create_and_insert_new_tt_entry(trans_table, "7", 1, NULL, fsm->states[i+1]); + create_and_insert_new_tt_entry(trans_table, "8", 1, NULL, fsm->states[i+1]); + create_and_insert_new_tt_entry(trans_table, "9", 1, NULL, fsm->states[i+1]); } trans_table = &(fsm->states[7]->state_trans_table); - create_and_insert_new_tt_entry(trans_table, "0", 1, fsm->states[7]); - create_and_insert_new_tt_entry(trans_table, "1", 1, fsm->states[7]); - create_and_insert_new_tt_entry(trans_table, "2", 1, fsm->states[7]); - create_and_insert_new_tt_entry(trans_table, "3", 1, fsm->states[7]); - create_and_insert_new_tt_entry(trans_table, "4", 1, fsm->states[7]); - create_and_insert_new_tt_entry(trans_table, "5", 1, fsm->states[7]); - create_and_insert_new_tt_entry(trans_table, "6", 1, fsm->states[7]); - create_and_insert_new_tt_entry(trans_table, "7", 1, fsm->states[7]); - create_and_insert_new_tt_entry(trans_table, "8", 1, fsm->states[7]); - create_and_insert_new_tt_entry(trans_table, "9", 1, fsm->states[7]); + create_and_insert_new_tt_entry(trans_table, "0", 1, NULL, fsm->states[7]); + create_and_insert_new_tt_entry(trans_table, "1", 1, NULL, fsm->states[7]); + create_and_insert_new_tt_entry(trans_table, "2", 1, NULL, fsm->states[7]); + create_and_insert_new_tt_entry(trans_table, "3", 1, NULL, fsm->states[7]); + create_and_insert_new_tt_entry(trans_table, "4", 1, NULL, fsm->states[7]); + create_and_insert_new_tt_entry(trans_table, "5", 1, NULL, fsm->states[7]); + create_and_insert_new_tt_entry(trans_table, "6", 1, NULL, fsm->states[7]); + create_and_insert_new_tt_entry(trans_table, "7", 1, NULL, fsm->states[7]); + create_and_insert_new_tt_entry(trans_table, "8", 1, NULL, fsm->states[7]); + create_and_insert_new_tt_entry(trans_table, "9", 1, NULL, fsm->states[7]); return fsm; } + int main(){ fsm_t *fsm1 = fsm_end_with_strict_pattern_01_or_10(); - print_fsm(fsm1); + // print_fsm(fsm1); - fsm_t *fsm2 = fsm_end_with_00_or_11(); - print_fsm(fsm2); + // fsm_t *fsm2 = fsm_end_with_00_or_11(); + // print_fsm(fsm2); - fsm_t *fsm3 = fsm_odd_1(); - print_fsm(fsm3); + // fsm_t *fsm3 = fsm_odd_1(); + // print_fsm(fsm3); - fsm_t *fsm4 = fsm_balanced_paranthesis_3_levels(); - print_fsm(fsm4); + // fsm_t *fsm4 = fsm_balanced_paranthesis_3_levels(); + // print_fsm(fsm4); - fsm_t *fsm5 = fsm_phone_validation_6_digits(); - print_fsm(fsm5); + // fsm_t *fsm5 = fsm_phone_validation_6_digits(); + // print_fsm(fsm5); /*FSM Algorithm execution*/ - // fsm_bool_t fsm_result; - // fsm_error_t fsm_error; + fsm_bool_t fsm_result; + fsm_error_t fsm_error; - // fsm_error = execute_fsm(fsm1, - // "00", - // strlen("00"), - // &fsm_result); + fsm_output_buff_t fsm_output_buff; + init_fsm_output_buffer(&fsm_output_buff); + + fsm_error = execute_fsm(fsm1, + "0101010101", + strlen("0101010101"), + &fsm_output_buff, + &fsm_result); - // if(fsm_error == FSM_NO_ERROR ){ - // if( fsm_result == FSM_TRUE ){ - // printf("Input String is Validated\n"); - // } - // else{ - // printf("Input String is not Valid\n"); - // } - // } + if(fsm_error == FSM_NO_ERROR ){ + if( fsm_result == FSM_TRUE ){ + printf("Input String is Validated\n"); + printf("FSM Output string: \n%s\n", fsm_output_buff.output_buffer); + } + else{ + printf("Input String is not Valid\n"); + } + } return 0; } \ No newline at end of file diff --git a/include/fsm.h b/include/fsm.h index 61e4380..aa38c4d 100644 --- a/include/fsm.h +++ b/include/fsm.h @@ -15,12 +15,20 @@ #define MAX_ALP_BUFFER_SIZE 30 #define MAX_FINAL_STATE 128 #define MAX_NUM_OF_STATES 128 +#define MAX_FSM_OUTPUT_BUFFER 1024 /***Data structures and custom datatypes***/ typedef struct fsm_ fsm_t; typedef struct state_ state_t; +typedef struct fsm_output_buff_ fsm_output_buff_t; + +/**Function Pointer**/ + +typedef void (*output_fn)(state_t *, state_t *, + char *, unsigned int, + fsm_output_buff_t *); /*Custom-defined datatype * to define boolean value @@ -51,6 +59,9 @@ typedef struct tt_entry_{ /* Size of the input symbol */ unsigned int transition_key_size; + /*Callback to execute logic to output value from fsm*/ + output_fn outp_fn; + /* Next state: The state which is the output * of transition function, i.e. * f(state_i, input_symbol) = (state_i+1)*/ @@ -79,6 +90,11 @@ struct state_{ char fsm[MAX_FSM_NAME_SIZE]; }; +struct fsm_output_buff_{ + char output_buffer[MAX_FSM_OUTPUT_BUFFER]; + unsigned int curr_pos; +}; + struct fsm_{ /*Initial state of FSM to start with*/ @@ -112,6 +128,10 @@ struct fsm_{ /*Pointer which point to the current input * from input buffer*/ unsigned int input_buffer_cursor; + + /* If FSM need to produce some output, the output + * data shall be stored in this buffer*/ + fsm_output_buff_t fsm_output_buff; }; @@ -133,6 +153,7 @@ tt_entry_t* create_and_insert_new_tt_entry(tt_t *trans_table, const char *transition_key, unsigned int sizeof_key, + output_fn outp_fn, state_t* next_state); @@ -143,12 +164,18 @@ fsm_error_t execute_fsm(fsm_t *fsm, char *input_buffer, unsigned int size, + fsm_output_buff_t *output_buffer, fsm_bool_t *fsm_result); +//Generic printing function for printing fsm. void print_fsm(fsm_t *fsm); +void +init_fsm_output_buffer(fsm_output_buff_t *fsm_output_buff); + + /**static(hidden) functions***/ static inline fsm_bool_t is_tt_entry_empty(tt_entry_t *tt_entry){ diff --git a/src/fsm.c b/src/fsm.c index 1ac3f5f..325f48e 100644 --- a/src/fsm.c +++ b/src/fsm.c @@ -97,6 +97,7 @@ tt_entry_t * create_and_insert_new_tt_entry(tt_t *trans_table, const char *transition_key, unsigned int sizeof_key, + output_fn outpfn, state_t* next_state){ @@ -113,13 +114,15 @@ create_and_insert_new_tt_entry(tt_t *trans_table, tt_entry_ptr->transition_key[sizeof_key] = '\0'; tt_entry_ptr->transition_key_size = sizeof_key; tt_entry_ptr->next_state = next_state; + tt_entry_ptr->outp_fn = outpfn; return tt_entry_ptr; } static state_t * -transition(state_t *curr_state, char *input_buffer, unsigned int *inp_ptr){ +transition(state_t *curr_state, char *input_buffer, unsigned int *inp_ptr, + fsm_output_buff_t *output_buffer){ assert(curr_state); // To check if curr_state is not NULL. assert(input_buffer); // To check input_buffer is not NULL. @@ -139,6 +142,14 @@ transition(state_t *curr_state, char *input_buffer, unsigned int *inp_ptr){ is_tt_entry_empty(entry_ptr) == FSM_FALSE ){ next_state = entry_ptr->next_state; + + if( entry_ptr->outp_fn ){ + entry_ptr->outp_fn(curr_state, + next_state, + input_buffer + *inp_ptr, + entry_ptr->transition_key_size, + output_buffer); + } *inp_ptr += entry_ptr->transition_key_size; break; } @@ -152,6 +163,7 @@ fsm_error_t execute_fsm(fsm_t *fsm, char *input_buffer, unsigned int size, + fsm_output_buff_t *output_buffer, /*output buffer to write data into*/ fsm_bool_t *fsm_result){ fsm_error_t algo_output = FSM_NO_ERROR; @@ -198,9 +210,18 @@ FSM don't have an initial state.\n"); return algo_output; } + /*If application has not supplied output buffer, + * Use FSM's internal output buffer*/ + if(!output_buffer){ + output_buffer = &fsm->fsm_output_buff; + } + + init_fsm_output_buffer(output_buffer); + while( fsm->input_buffer_cursor < input_buffer_len ){ - next_state = transition(curr_state, buffer_to_parse, &fsm->input_buffer_cursor); // Transition function + next_state = transition(curr_state, buffer_to_parse, &fsm->input_buffer_cursor, + output_buffer); // Transition function // to get to next state // for current input // symbol if it exist. @@ -232,10 +253,12 @@ For both case, the FSM is programmed not correctly.\n", curr_state->state_name, //Checking if the curr_state is accept state or not. if( curr_state->is_final == FSM_TRUE){ - *fsm_result = FSM_TRUE; + if( fsm_result ) + *fsm_result = FSM_TRUE; } else{ - *fsm_result = FSM_FALSE; + if( fsm_result ) + *fsm_result = FSM_FALSE; } return algo_output; @@ -327,4 +350,11 @@ print_fsm(fsm_t *fsm){ } +} + + +void +init_fsm_output_buffer(fsm_output_buff_t *fsm_output_buff){ + memset(fsm_output_buff->output_buffer, 0, MAX_FSM_OUTPUT_BUFFER); + fsm_output_buff->curr_pos = 0; } \ No newline at end of file