Mealy Machine - On progress

This commit is contained in:
Hizenberg469
2025-01-23 22:55:49 +05:30
parent 65dcbded01
commit 73147ccb60
3 changed files with 197 additions and 107 deletions

239
app.c
View File

@@ -7,6 +7,25 @@
#define modify_var(state,num) state ## num #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_t *
fsm_end_with_strict_pattern_01_or_10(){ 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, create_and_insert_new_tt_entry(trans_table,
"0", "0",
1, 1,
bit_flipper_output_fn_gen,
q2); q2);
create_and_insert_new_tt_entry(trans_table, create_and_insert_new_tt_entry(trans_table,
"1", "1",
1, 1,
bit_flipper_output_fn_gen,
q1); q1);
//State q1 //State q1
@@ -43,11 +64,13 @@ fsm_end_with_strict_pattern_01_or_10(){
create_and_insert_new_tt_entry(trans_table, create_and_insert_new_tt_entry(trans_table,
"0", "0",
1, 1,
bit_flipper_output_fn_gen,
q2); q2);
create_and_insert_new_tt_entry(trans_table, create_and_insert_new_tt_entry(trans_table,
"1", "1",
1, 1,
bit_flipper_output_fn_gen,
q3); q3);
//State q2 //State q2
@@ -55,11 +78,13 @@ fsm_end_with_strict_pattern_01_or_10(){
create_and_insert_new_tt_entry(trans_table, create_and_insert_new_tt_entry(trans_table,
"0", "0",
1, 1,
bit_flipper_output_fn_gen,
q3); q3);
create_and_insert_new_tt_entry(trans_table, create_and_insert_new_tt_entry(trans_table,
"1", "1",
1, 1,
bit_flipper_output_fn_gen,
q1); q1);
//State q3 //State q3
@@ -67,11 +92,13 @@ fsm_end_with_strict_pattern_01_or_10(){
create_and_insert_new_tt_entry(trans_table, create_and_insert_new_tt_entry(trans_table,
"0", "0",
1, 1,
bit_flipper_output_fn_gen,
q3); q3);
create_and_insert_new_tt_entry(trans_table, create_and_insert_new_tt_entry(trans_table,
"1", "1",
1, 1,
bit_flipper_output_fn_gen,
q3); q3);
return fsm; return fsm;
@@ -99,28 +126,28 @@ fsm_end_with_00_or_11(){
tt_t *trans_table = NULL; tt_t *trans_table = NULL;
//State q0 //State q0
trans_table = &(q0->state_trans_table); 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, "0", 1, NULL, q1);
create_and_insert_new_tt_entry(trans_table, "1", 1, q2); create_and_insert_new_tt_entry(trans_table, "1", 1, NULL,q2);
//State q1 //State q1
trans_table = &(q1->state_trans_table); 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, "0", 1, NULL, q3);
create_and_insert_new_tt_entry(trans_table, "1", 1, q2); create_and_insert_new_tt_entry(trans_table, "1", 1, NULL, q2);
//State q2 //State q2
trans_table = &(q2->state_trans_table); 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, "0", 1, NULL, q1);
create_and_insert_new_tt_entry(trans_table, "1", 1, q4); create_and_insert_new_tt_entry(trans_table, "1", 1, NULL, q4);
//State q3 //State q3
trans_table = &(q3->state_trans_table); 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, "0", 1, NULL, q3);
create_and_insert_new_tt_entry(trans_table, "1", 1, q2); create_and_insert_new_tt_entry(trans_table, "1", 1, NULL, q2);
//State q4 //State q4
trans_table = &(q4->state_trans_table); 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, "0", 1, NULL, q1);
create_and_insert_new_tt_entry(trans_table, "1", 1, q4); create_and_insert_new_tt_entry(trans_table, "1", 1, NULL, q4);
return fsm; return fsm;
} }
@@ -141,13 +168,13 @@ fsm_odd_1(){
tt_t *trans_table = NULL; tt_t *trans_table = NULL;
//State q0 //State q0
trans_table = &(q0->state_trans_table); 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, "0", 1, NULL, q0);
create_and_insert_new_tt_entry(trans_table, "1", 1, q1); create_and_insert_new_tt_entry(trans_table, "1", 1, NULL, q1);
//State q1 //State q1
trans_table = &(q1->state_trans_table); 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, "0", 1, NULL, q1);
create_and_insert_new_tt_entry(trans_table, "1", 1, q0); create_and_insert_new_tt_entry(trans_table, "1", 1, NULL, q0);
return fsm; return fsm;
} }
@@ -201,93 +228,93 @@ fsm_balanced_paranthesis_3_levels(){
//State q0 (initial state) //State q0 (initial state)
trans_table = &(q0->state_trans_table); 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, NULL, q1);
create_and_insert_new_tt_entry(trans_table, ")", 1, q17); create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q17);
//State q1 //State q1
trans_table = &(q1->state_trans_table); 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, NULL, q2);
create_and_insert_new_tt_entry(trans_table, ")", 1, q11); create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q11);
//State q2 //State q2
trans_table = &(q2->state_trans_table); 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, NULL, q3);
create_and_insert_new_tt_entry(trans_table, ")", 1, q13); create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q13);
//State q3 //State q3
trans_table = &(q3->state_trans_table); 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, NULL, q17);
create_and_insert_new_tt_entry(trans_table, ")", 1, q4); create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q4);
//State q4 //State q4
trans_table = &(q4->state_trans_table); 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, NULL, q17);
create_and_insert_new_tt_entry(trans_table, ")", 1, q5); create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q5);
//State q5 //State q5
trans_table = &(q5->state_trans_table); 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, NULL, q17);
create_and_insert_new_tt_entry(trans_table, ")", 1, q6); create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q6);
//State q6 //State q6
trans_table = &(q6->state_trans_table); 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, NULL, q7);
create_and_insert_new_tt_entry(trans_table, ")", 1, q17); create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q17);
//State q7 //State q7
trans_table = &(q7->state_trans_table); 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, NULL, q8);
create_and_insert_new_tt_entry(trans_table, ")", 1, q17); create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q17);
//State q8 //State q8
trans_table = &(q8->state_trans_table); 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, NULL, q9);
create_and_insert_new_tt_entry(trans_table, ")", 1, q17); create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q17);
//State q9 //State q9
trans_table = &(q9->state_trans_table); 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, NULL, q17);
create_and_insert_new_tt_entry(trans_table, ")", 1, q10); create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q10);
//State q10 //State q10
trans_table = &(q10->state_trans_table); 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, NULL, q17);
create_and_insert_new_tt_entry(trans_table, ")", 1, q5); create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q5);
//State q11 //State q11
trans_table = &(q11->state_trans_table); 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, NULL, q12);
create_and_insert_new_tt_entry(trans_table, ")", 1, q17); create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q17);
//State q12 //State q12
trans_table = &(q12->state_trans_table); 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, NULL, q17);
create_and_insert_new_tt_entry(trans_table, ")", 1, q11); create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q11);
//State q13 //State q13
trans_table = &(q13->state_trans_table); 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, NULL, q17);
create_and_insert_new_tt_entry(trans_table, ")", 1, q14); create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q14);
//State q14 //State q14
trans_table = &(q14->state_trans_table); 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, NULL, q15);
create_and_insert_new_tt_entry(trans_table, ")", 1, q17); create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q17);
//State q15 //State q15
trans_table = &(q15->state_trans_table); 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, NULL, q16);
create_and_insert_new_tt_entry(trans_table, ")", 1, q17); create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q17);
//State q16 //State q16
trans_table = &(q16->state_trans_table); 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, NULL, q17);
create_and_insert_new_tt_entry(trans_table, ")", 1, q13); create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q13);
//State q17 //State q17
trans_table = &(q17->state_trans_table); 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, NULL, q17);
create_and_insert_new_tt_entry(trans_table, ")", 1, q17); create_and_insert_new_tt_entry(trans_table, ")", 1, NULL, q17);
return fsm; return fsm;
} }
@@ -321,84 +348,90 @@ fsm_phone_validation_6_digits(){
tt_t *trans_table = NULL; tt_t *trans_table = NULL;
//State q0 //State q0
trans_table = &(q0->state_trans_table); 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, "0", 1, NULL, q7);
create_and_insert_new_tt_entry(trans_table, "1", 1, q1); create_and_insert_new_tt_entry(trans_table, "1", 1, NULL, q1);
create_and_insert_new_tt_entry(trans_table, "2", 1, q1); create_and_insert_new_tt_entry(trans_table, "2", 1, NULL, q1);
create_and_insert_new_tt_entry(trans_table, "3", 1, q1); create_and_insert_new_tt_entry(trans_table, "3", 1, NULL, q1);
create_and_insert_new_tt_entry(trans_table, "4", 1, q1); create_and_insert_new_tt_entry(trans_table, "4", 1, NULL, q1);
create_and_insert_new_tt_entry(trans_table, "5", 1, q1); create_and_insert_new_tt_entry(trans_table, "5", 1, NULL, q1);
create_and_insert_new_tt_entry(trans_table, "6", 1, q1); create_and_insert_new_tt_entry(trans_table, "6", 1, NULL, q1);
create_and_insert_new_tt_entry(trans_table, "7", 1, q1); create_and_insert_new_tt_entry(trans_table, "7", 1, NULL, q1);
create_and_insert_new_tt_entry(trans_table, "8", 1, q1); create_and_insert_new_tt_entry(trans_table, "8", 1, NULL, q1);
create_and_insert_new_tt_entry(trans_table, "9", 1, q1); create_and_insert_new_tt_entry(trans_table, "9", 1, NULL, q1);
for(int i = 1 ; i <= 6 ; i++){ for(int i = 1 ; i <= 6 ; i++){
trans_table = &(fsm->states[i]->state_trans_table); 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, "0", 1, NULL, 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, "1", 1, NULL, 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, "2", 1, NULL, 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, "3", 1, NULL, 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, "4", 1, NULL, 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, "5", 1, NULL, 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, "6", 1, NULL, 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, "7", 1, NULL, 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, "8", 1, NULL, 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, "9", 1, NULL, fsm->states[i+1]);
} }
trans_table = &(fsm->states[7]->state_trans_table); 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, "0", 1, NULL, fsm->states[7]);
create_and_insert_new_tt_entry(trans_table, "1", 1, 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, 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, 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, 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, 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, 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, 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, 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, fsm->states[7]); create_and_insert_new_tt_entry(trans_table, "9", 1, NULL, fsm->states[7]);
return fsm; return fsm;
} }
int main(){ int main(){
fsm_t *fsm1 = fsm_end_with_strict_pattern_01_or_10(); 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(); // fsm_t *fsm2 = fsm_end_with_00_or_11();
print_fsm(fsm2); // print_fsm(fsm2);
fsm_t *fsm3 = fsm_odd_1(); // fsm_t *fsm3 = fsm_odd_1();
print_fsm(fsm3); // print_fsm(fsm3);
fsm_t *fsm4 = fsm_balanced_paranthesis_3_levels(); // fsm_t *fsm4 = fsm_balanced_paranthesis_3_levels();
print_fsm(fsm4); // print_fsm(fsm4);
fsm_t *fsm5 = fsm_phone_validation_6_digits(); // fsm_t *fsm5 = fsm_phone_validation_6_digits();
print_fsm(fsm5); // print_fsm(fsm5);
/*FSM Algorithm execution*/ /*FSM Algorithm execution*/
// fsm_bool_t fsm_result; fsm_bool_t fsm_result;
// fsm_error_t fsm_error; fsm_error_t fsm_error;
// fsm_error = execute_fsm(fsm1, fsm_output_buff_t fsm_output_buff;
// "00", init_fsm_output_buffer(&fsm_output_buff);
// strlen("00"),
// &fsm_result);
// if(fsm_error == FSM_NO_ERROR ){ fsm_error = execute_fsm(fsm1,
// if( fsm_result == FSM_TRUE ){ "0101010101",
// printf("Input String is Validated\n"); strlen("0101010101"),
// } &fsm_output_buff,
// else{ &fsm_result);
// 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; return 0;
} }

View File

@@ -15,12 +15,20 @@
#define MAX_ALP_BUFFER_SIZE 30 #define MAX_ALP_BUFFER_SIZE 30
#define MAX_FINAL_STATE 128 #define MAX_FINAL_STATE 128
#define MAX_NUM_OF_STATES 128 #define MAX_NUM_OF_STATES 128
#define MAX_FSM_OUTPUT_BUFFER 1024
/***Data structures and custom datatypes***/ /***Data structures and custom datatypes***/
typedef struct fsm_ fsm_t; typedef struct fsm_ fsm_t;
typedef struct state_ state_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 /*Custom-defined datatype
* to define boolean value * to define boolean value
@@ -51,6 +59,9 @@ typedef struct tt_entry_{
/* Size of the input symbol */ /* Size of the input symbol */
unsigned int transition_key_size; 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 /* Next state: The state which is the output
* of transition function, i.e. * of transition function, i.e.
* f(state_i, input_symbol) = (state_i+1)*/ * f(state_i, input_symbol) = (state_i+1)*/
@@ -79,6 +90,11 @@ struct state_{
char fsm[MAX_FSM_NAME_SIZE]; char fsm[MAX_FSM_NAME_SIZE];
}; };
struct fsm_output_buff_{
char output_buffer[MAX_FSM_OUTPUT_BUFFER];
unsigned int curr_pos;
};
struct fsm_{ struct fsm_{
/*Initial state of FSM to start with*/ /*Initial state of FSM to start with*/
@@ -112,6 +128,10 @@ struct fsm_{
/*Pointer which point to the current input /*Pointer which point to the current input
* from input buffer*/ * from input buffer*/
unsigned int input_buffer_cursor; 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, create_and_insert_new_tt_entry(tt_t *trans_table,
const char *transition_key, const char *transition_key,
unsigned int sizeof_key, unsigned int sizeof_key,
output_fn outp_fn,
state_t* next_state); state_t* next_state);
@@ -143,12 +164,18 @@ fsm_error_t
execute_fsm(fsm_t *fsm, execute_fsm(fsm_t *fsm,
char *input_buffer, char *input_buffer,
unsigned int size, unsigned int size,
fsm_output_buff_t *output_buffer,
fsm_bool_t *fsm_result); fsm_bool_t *fsm_result);
//Generic printing function for printing fsm.
void void
print_fsm(fsm_t *fsm); print_fsm(fsm_t *fsm);
void
init_fsm_output_buffer(fsm_output_buff_t *fsm_output_buff);
/**static(hidden) functions***/ /**static(hidden) functions***/
static inline fsm_bool_t static inline fsm_bool_t
is_tt_entry_empty(tt_entry_t *tt_entry){ is_tt_entry_empty(tt_entry_t *tt_entry){

View File

@@ -97,6 +97,7 @@ tt_entry_t *
create_and_insert_new_tt_entry(tt_t *trans_table, create_and_insert_new_tt_entry(tt_t *trans_table,
const char *transition_key, const char *transition_key,
unsigned int sizeof_key, unsigned int sizeof_key,
output_fn outpfn,
state_t* next_state){ 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[sizeof_key] = '\0';
tt_entry_ptr->transition_key_size = sizeof_key; tt_entry_ptr->transition_key_size = sizeof_key;
tt_entry_ptr->next_state = next_state; tt_entry_ptr->next_state = next_state;
tt_entry_ptr->outp_fn = outpfn;
return tt_entry_ptr; return tt_entry_ptr;
} }
static state_t * 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(curr_state); // To check if curr_state is not NULL.
assert(input_buffer); // To check input_buffer 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 ){ is_tt_entry_empty(entry_ptr) == FSM_FALSE ){
next_state = entry_ptr->next_state; 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; *inp_ptr += entry_ptr->transition_key_size;
break; break;
} }
@@ -152,6 +163,7 @@ fsm_error_t
execute_fsm(fsm_t *fsm, execute_fsm(fsm_t *fsm,
char *input_buffer, char *input_buffer,
unsigned int size, unsigned int size,
fsm_output_buff_t *output_buffer, /*output buffer to write data into*/
fsm_bool_t *fsm_result){ fsm_bool_t *fsm_result){
fsm_error_t algo_output = FSM_NO_ERROR; fsm_error_t algo_output = FSM_NO_ERROR;
@@ -198,9 +210,18 @@ FSM don't have an initial state.\n");
return algo_output; 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 ){ 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 // to get to next state
// for current input // for current input
// symbol if it exist. // 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. //Checking if the curr_state is accept state or not.
if( curr_state->is_final == FSM_TRUE){ if( curr_state->is_final == FSM_TRUE){
*fsm_result = FSM_TRUE; if( fsm_result )
*fsm_result = FSM_TRUE;
} }
else{ else{
*fsm_result = FSM_FALSE; if( fsm_result )
*fsm_result = FSM_FALSE;
} }
return algo_output; return algo_output;
@@ -328,3 +351,10 @@ 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;
}