mirror of
https://github.com/Hizenberg469/Finite-State-Machine.git
synced 2026-04-19 16:42:23 +03:00
Mealy Machine - On progress
This commit is contained in:
239
app.c
239
app.c
@@ -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;
|
||||||
}
|
}
|
||||||
@@ -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){
|
||||||
|
|||||||
34
src/fsm.c
34
src/fsm.c
@@ -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,9 +253,11 @@ 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){
|
||||||
|
if( fsm_result )
|
||||||
*fsm_result = FSM_TRUE;
|
*fsm_result = FSM_TRUE;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
if( fsm_result )
|
||||||
*fsm_result = FSM_FALSE;
|
*fsm_result = FSM_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user