From d53a3aed65ee5a59161135baa130f91ea552a02a Mon Sep 17 00:00:00 2001 From: Hizenberg469 Date: Thu, 16 Jan 2025 10:54:09 +0530 Subject: [PATCH] basic FSM app build --- Makefile | 76 ++++++++------ app.c | 133 ++++++++++++++++++++++++- bin/debug/.fuse_hidden0000009f00000006 | Bin 0 -> 23448 bytes include/fsm.h | 26 ++++- src/fsm.c | 51 +++++++--- 5 files changed, 232 insertions(+), 54 deletions(-) create mode 100644 bin/debug/.fuse_hidden0000009f00000006 diff --git a/Makefile b/Makefile index 9fcf4b6..eddc721 100644 --- a/Makefile +++ b/Makefile @@ -1,27 +1,13 @@ #Setting a default configuration if invoked with just "make": -CFG ?= debug +CFG?=debug # Config specific settings ifeq ($(CFG),debug) -CFLAGS += -g -DDEBUG + CFLAGS=-g -DDEBUG else -CFLAGS += -O3 -DNDEBUG + CFLAGS=-O3 -DNDEBUG endif -inform: -ifneq ($(CFG),release) -ifneq ($(CFG),debug) - @echo "Invalid configuration "$(CFG)" specified." - @echo - @echo "Possible choices for configuration are 'CFG=release' and 'CFG=debug'" - @exit 1 -endif -endif - @echo "Configuration "$(CFG) - @echo "--------------------------------------------------" - -rule : dep | inform - BUILD_DIR=bin/$(CFG) OBJS_DIR=objs/$(CFG) LIBDIR=lib/${CFG} @@ -31,25 +17,49 @@ SRCDIR=src APP=$(BUILD_DIR)/app APP_OBJECT=$(OBJS_DIR)/app.o +APP_DEPFILES=$(OBJS_DIR)/app.d FSMLIB_NAME=fsm FSMLIB=$(LIBDIR)/lib$(FSMLIB_NAME) -CODEDIRS=./src -INCDIRS=. ./include/ # can be list +CODEDIRS=src +INCDIRS=./ ./include/ # can be list CC=gcc -OPT=-O0 #generate files that encode make rules for the .h dependencies -DEPFLAGS=-MP -MD +DEPFLAGS=-MMD -MP #automatically add the -I onto each include directory -CFLAGS+=-Wall -Wextra $(foreach D,$(INCDIRS),-I$(D)) $(OPT) $(DEPFLAGS) +CFLAGS+=-Wall -Wextra $(foreach D , $(INCDIRS) , -I$(D)) $(DEPFLAGS) # for-style iteration (foreach) and regular expression completions (wildcard) -CFILES=$(foreach D, $(CODEDIRS),$(wildcard $(D)/*.c)) -# regular expression replacement -OBJECTS=$(patsubst %.c,$(OBJS_DIR)/%.o,$(CFILES)) -DEPFILES=$(patsubst %.c,$(OBJS_DIR)/%.d,$(CFILES)) +CFILES=$(foreach D , $(CODEDIRS) , $(wildcard $(D)/*.c)) -all: $(FSMLIB) $(APP) | create_dir + +#WTF, this below code is f**ked me up. +#didn't change anything but still works. +#WHYYY??? +# regular expression replacement +OBJECTS=$(patsubst $(SRCDIR)/%.c, $(OBJS_DIR)/%.o , $(CFILES)) +DEPFILES=$(patsubst $(SRCDIR)/%.c, $(OBJS_DIR)/%.d , $(CFILES)) +DEPFILES += $(APP_DEPFILES) + +# $(info CFILES: $(CFILES)) +# $(info OBJECTS: $(OBJECTS)) +# $(info DEPFILES: $(DEPFILES)) +# $(info APP_OBJECT: $(APP_OBJECT)) +# $(info APP_DEPFILES: $(APP_DEPFILES)) + +all: create_dir inform $(FSMLIB) $(APP) + +inform: +ifneq ($(CFG),release) +ifneq ($(CFG),debug) + @echo "Invalid configuration $(CFG) specified." + @echo + @echo "Possible choices for configuration are 'CFG=release' and 'CFG=debug'" + @exit 1 +endif +endif + @echo "Configuration $(CFG)" + @echo "--------------------------------------------------" create_dir: mkdir -p $(BUILD_DIR) @@ -57,18 +67,18 @@ create_dir: mkdir -p $(LIBDIR) -$(APP): $(APP_OBJECT) | create_dir - $(CC) -o $@ $^ -L $(LIBDIR) -l$(FSMLIB_NAME) +$(APP): $(APP_OBJECT) $(FSMLIB).a + $(CC) -o $@ $^ -L$(LIBDIR) -l$(FSMLIB_NAME) -$(FSMLIB): $(OBJECTS) | create_dir - ar cr $(LIBDIR)/${FSMLIB}.a ${OBJECTS} +$(FSMLIB): $(OBJECTS) + ar cr $(FSMLIB).a $(OBJECTS) # only want the .c file dependency here, thus $< instead of $^. # -$(OBJS_DIR)/%.o:$(SRCDIR)/%.c | create_dir +$(OBJS_DIR)/%.o: $(SRCDIR)/%.c $(CC) $(CFLAGS) -c -o $@ $< -$(OBJS_DIR)/%.o:%.c | create_dir +$(OBJS_DIR)/%.o: %.c $(CC) $(CFLAGS) -c -o $@ $< clean: diff --git a/app.c b/app.c index 090cadd..1bc3c86 100644 --- a/app.c +++ b/app.c @@ -1,15 +1,140 @@ #include #include -#include +#include +#include "fsm.h" + +#define MAX_FSM_STATE 24 + +#define modify_string(state,num) #state ## #num +#define modify_var(state,num) state ## num + +state_t *fsm_states[MAX_FSM_STATE]; + + +void print_fsm(fsm_t *fsm){ + + printf("FSM name : %s\n", fsm->fsm_name); + printf("States : "); + char state[6]; + for(unsigned int i = 0 ; i < fsm->state_count ; i++ ){ + sprintf(state,"q%1d",i); + printf("%s", state); + + if( i < fsm->state_count - 1 ) + printf(", "); + } + putchar('\n'); + + printf("Alphabets : %s\n", fsm->alphabet); + printf("Initial State : %s\n", fsm->initial_state->state_name); + printf("Final States : %s\n", fsm->final_states); + + printf("Transition Table :\n"); + + printf(" | 1 0 \n"); + printf("------------------------\n"); + + + char state1[6] = {0}; + char state2[6] = {0}; + char state3[6] = {0}; + + tt_t *table_ptr = NULL; + tt_entry_t *entry_ptr = NULL; + for( unsigned int i = 0 ; i < fsm->state_count ; i++ ){ + + strncpy(state1, fsm_states[i]->state_name, + strlen(fsm_states[i]->state_name)); + + table_ptr = &(fsm_states[i]->state_trans_table); + FSM_ITERATE_TRANS_TABLE_BEGIN(table_ptr, entry_ptr){ + + if( is_tt_entry_empty(entry_ptr) == FSM_FALSE ){ + if( strcmp(entry_ptr->transition_key, "1") == 0 ){ + strncpy(state2, entry_ptr->next_state->state_name, + strlen(entry_ptr->next_state->state_name)); + } + else{ + strncpy(state3, entry_ptr->next_state->state_name, + strlen(entry_ptr->next_state->state_name)); + } + } + + }FSM_ITERATE_TRANS_TABLE_END(table_ptr, entry_ptr) + + printf(" %s | %s %s \n", state1, state2, state3); + + } + +} int main(){ - fsm_t* fsm = create_new_fsm("FSM_1"); + fsm_t *fsm = create_new_fsm("FSM_1", "0,1"); - state_t* initial_state = create_new_state("q0", FSM_FALSE); - set_fsm_initial_state(fsm, initial_state); + //States + state_t *q0 = create_new_state("q0", FSM_FALSE, "FSM_1", fsm); + state_t *q1 = create_new_state("q1", FSM_TRUE, "FSM_1", fsm); + state_t *q2 = create_new_state("q2", FSM_TRUE, "FSM_1", fsm); + state_t *q3 = create_new_state("q3", FSM_FALSE, "FSM_1", fsm); + fsm_states[0] = q0; + fsm_states[1] = q1; + fsm_states[2] = q2; + fsm_states[3] = q3; + + set_fsm_initial_state(fsm, q0); + + //State q0 + tt_t *trans_table = &(q0->state_trans_table); + create_and_insert_new_tt_entry(trans_table, + "0", + 1, + q2); + create_and_insert_new_tt_entry(trans_table, + "1", + 1, + q1); + + //State q1 + trans_table = &(q1->state_trans_table); + create_and_insert_new_tt_entry(trans_table, + "0", + 1, + q2); + + create_and_insert_new_tt_entry(trans_table, + "1", + 1, + q3); + + //State q2 + trans_table = &(q2->state_trans_table); + create_and_insert_new_tt_entry(trans_table, + "0", + 1, + q3); + + create_and_insert_new_tt_entry(trans_table, + "1", + 1, + q1); + + //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, + q3); + + + print_fsm(fsm); return 0; } \ No newline at end of file diff --git a/bin/debug/.fuse_hidden0000009f00000006 b/bin/debug/.fuse_hidden0000009f00000006 new file mode 100644 index 0000000000000000000000000000000000000000..8416fbc14f9743026ff6c544ce1207a1e4d5d992 GIT binary patch literal 23448 zcmeHv3v?XSndYtPzEbPmk}SV%wfw>ct7X~7fWfwe-Ezqz8?9|6HiWcWQtJ^*Ezu8S zLx_ZB2wLG;DVt0LhLe-bag0M0U=U`QjG4_2PQsZr3{F~sB!+m1GLxYF z{`=^zE~|$XL~#l^NV!Y-9cN}XaH*sCf4 zb?jzVgyTxKg5>~r3!3EDNdT@a7tKuQQFIp|>CLCg3~;d|GYz$e1W7MjnV%;)8ZxiM zNsm)i;ZFEak(AR=^Hc5lB%e9pxbj~^yB@{nK(*96uq6|oQE@q~^tB$5Nv})kbtyd! zuaHA18tQmbOz3yBvgd^BNC`zlr(T!RbHW``jcG`2P}z4m-u{QQ*R1p&tCDt{FfPeV zL*3qgfF8x=f4Asi-mBWnHV&utI4G#X%W8VMTQ_a2>1nU->5e3hRv*22Q}w2e{#c)X zy>Nm2^5I8wYUiF72K8~G>ESd7C9dreZ;s-Vd|*lPuVTX=u3tL#spC&Iy!!bo-~JyR zBtw3a4#`jz0|dSw=REDOCS3!S1ilb=5Z-G`sE+y}x;^0#H7w`ZYGg6_l5S!lGE zIf;b#C*m;{i$^1E{l{1^7>kG64hP%14hK6z-8~?LVzF>EE-}cqb%mlN-V=@xXbZ(5 zgSp&Bnvm-abw@yHI~odhbVoux-S>rAtUuZviFdHJP)|=^8|w}C#=>y|)Fc_{?Pp|y zX8$I(v#Ig+?ZNf_+Ks7dy0#%*UGKk<1snJ84z`D*;m+<@JRIG>dwWk`B)mV=+7pHo zoxOb#A8nm(xLo;sn%G+pBtw@EskPuf?a zT(Z&W{MRLEqr>4;xniTMOSIrk+33m@LGM@eTwru=>T=XZ*Ex%LgEqRjUMhu0Y;>7- zBxBS@r#5tX%tqI-Al?%;y1G;gmD4tQzBU5*tc_k^qo1+S3vKjq8=Z2CF0a_=C7K9$ z!A93}#>Sql&PHH10<#gAjlgUK{=baCuS=Hxt2OkV#~R^3s$tA}XgqFCU$BN=^1LYe zJALD3kf&GPhGR)(9V7WJ;!M6hJw4qqDsWm@O#VX}rv=XB3u&Ad7?a;jN_CCR@`uEhHxQrg2(8Ox~WxY2h%rK8@3YVRBgtpI-S( zKVuywl{=W|-}K5)IPg6VyupEQb>N#ExZi=Va^OoH_*@5G?7(vz_(!;{v-|&H244G% z#^KjLZ4JL|4ZU-vd4HgGy!O0xatp^WOjrDOh+ggRmsFlWP%r^bZuu=J)=B;Wfm^2H z6_^@-O?6C-yy;6Nm4hVrqJoe=FXV50fxw!Ntl=xx_kX#~`u>#5GG4Y`|0q5O1|Cud zJkyt?pIV>h&)}9Xfz1*(v{*x1TB&LcUyc`ABU?IvBoBTxJ)LaFXuZsPfg5*2H`PAr zPu>e=3v{gE2d1o{2c{Uc8JMz0>MVGj$UQ?7^j&@iM|Ss%q#~q;-fM=&nRaW$y>hi^ zH852>4$U(b|GL0mMjZYLv&9;o5X#AF_yXFG?6d`-O$1&dH`&=+iG7l9lC_&H+}f%g=0g^&*v@*(0m5x77Y;6;KHfmaAj{t*UhB=CxLa?alnj;2rD z05IY<5ys>wwKx2N5Gd3F_e%l88vZ^4|5Iz2BAyIDG}F*NZD?rRXAK7~OaxvNP123u zNXu*1@CEDpmrTnb;I>9uE>Lwia1jB&NES~a6hl)+;)o!etms5iv4;PVSO?G;rdf^P z(3}J9oqrR)rb*=8d&;|~zjpX9<2<!DL#nSP818B|4G(sua8eL5vq~UxW5W=xpO5Sxut)X<5C3>RqDRLgNcp#W=o= zgb4H^&Lkgtf&9@z?M_+4ub-9v-}tpW>LA7omn^W!e>;1xV*iO?qxI~T4l2>Z(h~V? zx8zamCTS^Yv*Z*lQKD5d`}91nmgKTIb3?By_CJfxw>XUtD)vhHaO9FBJ0tSQE)7r}X(VWu1KF>oj`==Vfd7?~|Rx zRD$=5ddt+yCrpwev8jnVcrB`z$kqY7EeqEbnS^0zsWc>{)@wsM%tB!WA-`UXyPV}P zbcYn5viPeopUK;xcoT!o)FBk%$zYQWOP^}{u;%JQ7)}o-p0tKr9`o5{U%UEbR2G+rYP(c z_zOTm+6|IOl#7X~B-V*~%lOM~lbjz{bM6(LttSHKs9*1{9cejtO}>0Z=F1CEykJe# zStL0WIESQlZs5od$lOTFlf$Dv_@~<&{}62tjU%_eU=95o8NB7Ur=jc7^)&wzcL}>y{tJ%d7|AqlbOg(4#A+=)umrlQ8$-+ta99Ykrun zKlBfA?@B=(N_s2h``b3w8 z^-^OZ`7;tHBd}{+=$K$@sn4U<$>!^&2xjpc$$DWZfU!qDNokB@y04Hy0!K{uqq21& z_^7C3j82#&CG29^aI%?_{pfHr7V;Rl;WsIFA=A$h3matmcA+$24s40**G_Ks#)^@-DaA}|GQjLQQ_ zIe*KP(PnA1EoJn$GWyn4T0dMRt#@ljTCQF*#gcN0QI3Gu6UhO(%uN~b!lA%b%(JTl zN6x=%jB0L3auYd3P>a6|KiBCrG~Dtg&Oe&DBK6eL1(s3~tt1n35rAKb%i2V8`qwJ) zy?g5jbjXd7-Ivsv)C%_zkExNsn`&xIL1?(SPRe0HG2CoX{XE@S(IQmbcct#MsNb_? zHUj^5BS7y|8usn>MMAw{-)7&+SU%eq55>bVAncx%we4(WjIH&t`kwx-P-{3&bP{Te zbjQ0xJw73u)(I!j@-%!f8flyqcG z!hE)FZ7um9tY!DCWB1^=p53z{^_H8lShTICBi8G0!;36*D@grhRiIRF?Ur4jH&F2~ zi<76pxOg>%A!w-IU*Cj&UDJW?n6Dwx)1ybJEgBYP!}lsXnxP=xqy^DhFtf3=P$&42 z@X>fM+}j^N7L213iARqyW0C7tdIw&F-y^@Ao<0rO^{eUW3xG!flYkbkgrk79?@v$D z%bmLbeSkg4M0J2q;R16A@O8jJz&CJxe**AMtlwS&d=~H>zyrvXxa5mM@2II5_w8lI zQLnM6FxN8*8KTo(jAzmIDiYX{i>off4iLsR;&<^E)6b=Ef_puKY}>+H zuHUd?8IeiZG7keKzw-@Dv;Sf;bKaJl8 z@Js3WQb6%t9v4Xv|26zpAZ6c5eM|Azo0|U~$lGuw%Vxh2{cZ$52QZ~?{$4oX18FVj zHHhty-F{%m-0jlgUKW+N~gf!PSmMqoAqvk~}zBLaG#nBEtLWt=FFC|IbV-l#_Fd@4tmNVq_P z)c&(Y3a7O%m4y;8y$_Anl2kPRUp|`dBm7xf8>8UiizrX13cX^ba#8W~CCXgNQM}y{ zWxj$H3TmL#*a5YFO5HxNo0UGT>#5MITPpJ;V3!m@(|xL<{T^3xc&06iZhxu5wH$6) zME}s7AmQzXz%Qtd;TewR3r*Z62>eOK$C6s$x*y8?|1qHVYda0DQ#U_#3N|ZvNWp#u z2NfJu@CgN5b;Td>`u9o2ya(L_Qw4u&0kNnS zb!+veJ5V>@L4C6@#mq|7x8z?1*;jZN$9nH)sJ?m*o;xsOhmgXv;)+~%J=`dnS-?`a?=-QKUtrz$h=!eNc@tj=sk-7mUsF;0=9DCAJ= zx3N45j%N;ezRo;?`aC?hvml>D@?3Rw)E;B`Hv=`|#{B^FGY07}1ddTp z2Qi#^@!tSK1?Smj5*2T|)P*ln}MY^5^2< zK2_Kb@H+>~BGzbe6ksuCra={H6~9+E`C@t2ehdYwveJ@?&M^_O`f8NCnft*D35%?qOi771ruL0PK3z zXq|gCdU8Xl=UxxMEZdN|G9t79ew+5K^VRdcmgc&Meubn5^X9m2# zRow4NCUfV&-Sv5re{KL&F|U)bE9Nn0OP_-wW5A$^qcfX$Bn4UHR3)7*#z3WXunSvu zR9d7nWsXRTpI1#e6Y6D1vy- zUnNhHLh@XYN}j~_isb2)$umzSPcpqwC(j>HJ1d~ODxaz|B~R))k|#xtsv>IJn1_Os zr;_I>)EA|aXFi-%$&;#x_&A_)Zi(ix+uYz z!Br2VZjK#r(U6#js!0er!}V?AhWzBdIo9N&tD4z*Jq-sE+LEt;`)5$hU5P_yDcPee z<)N^9DDHd^3M3(dyp-jSpk6o*P7?`R%B9ngqGFsX#aS<1YN}K&3FCXT@nUMT3Q~El z!78a$_MeoQ?Gk6Xlu`EbdZ6Z5yYhl`gctKzKD8p&%jOQ_19jsdo<9p865y88?B21I zs_2o65~;akt?c(9;lqCfE6;UE`M^BifQaZWF+@WZEdM^#3+W=bm{j`~Kn6uT4hJ+& zeVU`Ybhep`mr}@GV~-8E=qxjr_~<-xjeT*zMXMrnX_e$ZG9X;5TuiRH#s&w3GZEOq z6}*b9V>rm&<;B#bYwX#9TpHrl1r$!#*cqUxtWoi-%l)5V*5=2^k+J5SvbE~I=~iJ0 zwkVc2h*-MDoxxiq++qmBR|@vhE=-yXQ+=;w=HH#;G4t zYoc48#Sei(6E6o|nV$6$ZT5*vSwW#109K_g0TdLS#nYDnm%0S#3CIl28gZR6i52$%UDoAs$8LhO4-MOK+<@q+7fi zZ7qfyB@{t#fl+Fd;cl?B)L2+4+t3=o5paGBe^Jdtua2s0- z3J?ZKB>QtklLcwQJPgD&(|5jgJY`srn!|FiSwdBLl^bcoLzBHpsQc%J8zd^u@8EgkY4 z;CY1J#;bnD%Ly9->dHCGOLIKm;3dR6%U2%c6}xyjAs!!J)5I$tu|=M@BQ z<7+(gvht`M({=P6lFZqa<0^Ta-y}$f&ExY(Rj@?$VhRFjp29A zKI=%@Scm(dV=YPgp=`wqvS*-|9SFUz4l z%jZ5vJ+yO=6IaZjv%KUBG~6YgD$EzY6kzciyzmWfG;!ZX&(kp6MD}vxd~S}pdJgb) zyv)|nE zSGNk?vwS{WFXzTH{DwMSdR2OeE>VXdLB1A|uLaT$xomz?sP4kNJ;6OIc&=p8dDexA zz;E2heV(uJ+^aka5t>(AH1u-VDFBA5^PO$ zbcCbQaq6_#^8?f3Z{oZ9qH$jWo02*s;dUQA{1bl%FL&?6m~buFACIz-+VRA?WAabs zx&Rabjr!qN{Hg=x&Metm%!!Yr-|VyJKzPo}N%7 zj0x#$j`n>9Q?CYF$XKYqAKS$IHQkZ6obX@NI=oN$Kt*nBI^UZDaE54U&zfQ2Cfb*L^p8f7&TV?@Q?0 z2an=DgNjcav0et8NuKTxP3C1@^{7pW3q7LOIp`adyndght>-S@t{s<}tt4O`?()6cLnaO{8xI}jJ5=P%GeeYxB^+iz2{|)2~ zR>t(rrT(VEPZa%76)Gs|0VsPPb&?-cbXuWP$rk5a1jN8Dw{y#-oc%aczbb_MJm!3V zv=nq|MSm|x+o4A$2AiLH52xunL3a$HVBM94el!dHQP6$bs15dG!Q!K*<8?M7s`RR$ z4CCT_81NlMcRr@MDCn6s2%7}m3;W)>Ox_ieH%n9RNj3MwEOzqX=S*?94(G{C^c6zh z%bbs({aNf-S?G6Vp+`WcelbVC=<)7M{`|3^d#`!Q@aLfWbmwjGY0yi}1F=vbsbytM+)Th8J)iT^TjqM3aa7~NjyLsvFuJp%LeE)f+?~(7exvO8>V#P8;1coo zUh`(b19~aityA*jN~1i>c&*Ap-%NH82d}cD%&-O_?`6*CVxI!tr-f|r2It@E6%-4G5=U8EUvGa;I38~IubWwd7A4)mP&67kruGbXM6tO!*q-R^r7s29FtPhM zLsVYtu3d@H)vFE4*Ic{t*{hkTwKG!5h#Bk#K(l3-!V#Y@zo)iLRPALiUU9N*NNb>Vc z86->{I6*B%Y0XDpYRcf-dPxgM=O>qf?XkXK7rKnkG07!UN*iBy3O3#W%kABfU?LW7 zXP9K|EZedz7;KHjlpm?}p$M$_coi0eDa+J5^~I?SS}=&uL#YWf^WBa3n$(P+h|2t+ zRi;_md5@RXv17eh+XKd<5_aht7L4I&Kl4X$7vjg#&X4<%etc8wn2pq$=*Fkuy4w}0 z{`N-P#B?$t-i4bK=5Ie1K@$?yYjfbIu>`QfGHpJFIC;+K{KY)X;S_73%GVF{zHBVt(Y8Ui_&6 zXyMjGCnQ6WP9!6Rc1Jq;bUoDC8Vw)O7(Ry=)^$WsSBZ@Ak7g#rKOCdi76yK}e2C)w zPNaG#qPS8vg`lz=zg+yZezxx+Y8^aU&M2FJ+4Y^@MO={~O>5N5LhE9?zFwDW=*twp zM*oxG<4+6vwEub^mxj81wVg?AsYx3Rp^Ar~ss8JIUK+ka!9^h-sjB<0*R$QA;S!h9 ze?mNfVoXEY<6$ojl-&a+?ZMLiKdBtmP_G-b|5{GN&q1H|bZK1g>(Y>3)lqT!FR6^3 zM1{sg>-$I$MZTT4R2N*CVh&TQ~xWVk%+dRS|_OWf_g0n z30a);=M>0xeV@|P@RHKgKrcfye9EDZMU^ZHYPoFs&pPzIT2H|XT2Vo5Ps8sx^!4{- zHT)7yPFvA>nnd?;_WtXAks20hK?R-hllOJ$@n=3IsNiE{+*X|J{~dTFqUVpk@6wQ7 zUE7PZeR= z7X7bolL~Vk6W-YtZ6zd{Gk#~bOa1j(+ShjO%%cDE2B}Z^&0e&g9qMz}F8A0@iJei` rv*kc%%HQ-n&EcX@Y~C&PzwBV@b|shYVQ1F=S+kU&&0hB6K-vES{SjTY literal 0 HcmV?d00001 diff --git a/include/fsm.h b/include/fsm.h index a12782c..9b994e4 100644 --- a/include/fsm.h +++ b/include/fsm.h @@ -9,6 +9,8 @@ #define MAX_STATE_NAME_SIZE 32 #define MAX_FSM_NAME_SIZE 32 #define MAX_TRANSITION_KEY_SIZE 64 +#define MAX_ALP_BUFFER_SIZE 30 +#define MAX_FINAL_STATE 128 /***Data structures and custom datatypes***/ @@ -61,6 +63,9 @@ struct state_{ /*Boolean value to distinguish b/w * accept/final state or vice-versa*/ fsm_bool_t is_final; + + /*FSM which the current state belongs to*/ + char fsm[MAX_FSM_NAME_SIZE]; }; struct fsm_{ @@ -68,6 +73,15 @@ struct fsm_{ /*Initial state of FSM to start with*/ state_t *initial_state; + /*Number of states in FSM*/ + unsigned int state_count; + + /*Set of alphabet*/ + char alphabet[MAX_ALP_BUFFER_SIZE]; + + /*Set of final/accept states*/ + char final_states[MAX_FINAL_STATE]; + /*Name of FSM*/ char fsm_name[MAX_FSM_NAME_SIZE]; @@ -87,18 +101,20 @@ struct fsm_{ /***Function Prototypes***/ fsm_t* -create_new_fsm(const char *fsm_name); +create_new_fsm(const char *fsm_name, const char *inp_alpha); state_t* -create_new_state(char *state_name, - fsm_bool_t is_final); +create_new_state(const char *state_name, + fsm_bool_t is_final, + const char *fsm_name, + fsm_t *fsm); void set_fsm_initial_state(fsm_t *fsm, state_t *state); tt_entry_t* create_and_insert_new_tt_entry(tt_t *trans_table, - char *transition_key, + const char *transition_key, unsigned int sizeof_key, state_t* next_state); @@ -110,7 +126,7 @@ get_next_empty_tt_entry(tt_t *trans_table); static inline fsm_bool_t is_tt_entry_empty(tt_entry_t *tt_entry){ - if(!tt_entry->next_state) + if( tt_entry != NULL && !tt_entry->next_state) return FSM_TRUE; return FSM_FALSE; diff --git a/src/fsm.c b/src/fsm.c index b3e348f..3ef222c 100644 --- a/src/fsm.c +++ b/src/fsm.c @@ -1,29 +1,41 @@ #include #include #include +#include #include "fsm.h" -fsm_t* -create_new_fsm(const char* fsm_name) +fsm_t * +create_new_fsm(const char* fsm_name, const char *inp_alpha) { fsm_t *fsm = calloc(1, sizeof(fsm_t)); - strncpy(fsm->fsm_name, fsm_name, MAX_FSM_NAME_SIZE - 1 ); - fsm->fsm_name[MAX_FSM_NAME_SIZE] = '\0'; + strncpy(fsm->fsm_name, fsm_name, strlen(fsm_name) ); + fsm->fsm_name[strlen(fsm_name)] = '\0'; + fsm->state_count = 0; + + strncpy(fsm->alphabet, inp_alpha, strlen(inp_alpha)); + fsm->alphabet[strlen(inp_alpha)] = '\0'; + + memset(fsm->final_states, 0, 1); + memset(fsm->input_buffer, 0, 1); + fsm->input_buffer_cursor = 0; + fsm->input_buffer_size = 0; return fsm; } -state_t* -create_new_state(char *state_name, - fsm_bool_t is_final){ +state_t * +create_new_state(const char *state_name, + fsm_bool_t is_final, + const char *fsm_name, + fsm_t *fsm){ assert(state_name); state_t *state = calloc(1, sizeof(state_t)); - strncpy(state->state_name, state_name, MAX_STATE_NAME_SIZE - 1); - state->state_name[MAX_STATE_NAME_SIZE] = '\0'; + strncpy(state->state_name, state_name, strlen(state_name)); + state->state_name[strlen(state_name)] = '\0'; tt_t *trans_table = &(state->state_trans_table); tt_entry_t *tt_entry_ptr = NULL; @@ -34,6 +46,21 @@ create_new_state(char *state_name, state->is_final = is_final; + char temp_state_name[strlen(state_name)+2]; + strncpy(temp_state_name, state_name, strlen(state_name)); + temp_state_name[strlen(state_name)] = '\0'; + + if(state->is_final == FSM_TRUE){ + strcat(temp_state_name,","); + strcat(fsm->final_states,temp_state_name); + } + // fsm->final_states[strlen(fsm->final_states)+2] = '\0'; + + strncpy(state->fsm, fsm_name, strlen(fsm_name)); + state->fsm[strlen(fsm_name)] = '\0'; + + fsm->state_count++; + return state; } @@ -45,7 +72,7 @@ set_fsm_initial_state(fsm_t *fsm, state_t *state){ } -tt_entry_t* +tt_entry_t * get_next_empty_tt_entry(tt_t *trans_table){ tt_entry_t* tt_entry_ptr = NULL; @@ -64,9 +91,9 @@ get_next_empty_tt_entry(tt_t *trans_table){ return NULL; } -tt_entry_t* +tt_entry_t * create_and_insert_new_tt_entry(tt_t *trans_table, - char *transition_key, + const char *transition_key, unsigned int sizeof_key, state_t* next_state){