From 29fa585018eead850c1c505e301649d705fa1525 Mon Sep 17 00:00:00 2001 From: marcusDenslow Date: Tue, 23 Sep 2025 23:39:13 +0200 Subject: [PATCH] added history suggestions (finnaly) --- include/history/persistent_history.h | 5 +- shell | Bin 597672 -> 598768 bytes src/history/persistent_history.c | 700 ++++++++++++++------------- src/input/line_reader.c | 163 +++++-- 4 files changed, 491 insertions(+), 377 deletions(-) diff --git a/include/history/persistent_history.h b/include/history/persistent_history.h index 2c1b873..00d1fd0 100644 --- a/include/history/persistent_history.h +++ b/include/history/persistent_history.h @@ -82,10 +82,13 @@ char **get_matching_history_entries(const char *prefix); // Free matching entries void free_matching_entries(char **entries); +// get the most recent command that starts with the given prefix +char *get_most_recent_history_match(const char *prefix); + // Expose global variables for stats command extern CommandFrequency *command_frequencies; extern int frequency_count; extern PersistentHistoryEntry *history_entries; extern int history_size; -#endif // PERSISTENT_HISTORY_H \ No newline at end of file +#endif // PERSISTENT_HISTORY_H diff --git a/shell b/shell index 3380097ef1320bd958e2d2ff7e07859e88764ef8..6ae20ee1c3c943671793cff9c2ae7c8b8cdd12e1 100755 GIT binary patch delta 92306 zcmZ@>2YeL8_s`9;)PxX{OYfnCCcTEx502gyL7I)KfD!=(0)!L7auLMv=uMQ~kL69aQ@B{MyzL`x!|9tdz=e;+tPuV4(zA1OC0R%{NMUHPYymHyT| z_+O>J=ajX)R$}mRS@IY>r>&*FW#pX6mUJI`ur7gl*EwCqm=e!RD$3_`&WKZf4^sTc zju|zl%eufnr{$_*2W^R{l?SdU&`4d*J7b-7j<8@sosy`^8xLeZS>1QS=LXC*9IXSbL>y zOSg;{;)^X*^Pt5~tW8L3bI?*v1h(7c;bBj9%=%wWj@?j~WS9HBkJDxzw$!rtSJ?`_ ze|E)>|94unHf0TCqh~-f$@$6CB@sgswrD&IG!sFIOn(Qh3s5*X%K2NlG+*&OG zX?;CKM)6|b76lKZ1eLdnh{PK9Q=u&pWcG-J}$J7G} zC1I3@$E_X~Xa}GjI>j`3nPX43-8b~*pigpJl5KZxm6HVeG(e1=ckJ(+wP*ZN#BMol zH<+XMR1bw8R0yAF5*R)2+l`K3{sZ&h-t1)#syKdtU?^3$P!+QV$QH*#jfS@S-bvpm zLeKvsv^{}+_dQ0JgZlUF&MxpS%&?q>d5sez6H24_gr#~zYW7EVqvsPzs0boQH+9ct zIk3X$2n-ap9QWQ)*6zLktlfhDPJ5?$c&8mm$|~+SkWluO>eceuZ*B_qzDXb4u_R5n zJ}?{0S9-JG{6%3rjNjs--9+ZW+B^e7Y^2PW2qE~Rm6 zSj)UkGyO%l7~6!_`-{NDivt1GZ{oM%!SP){why=LY^V?&_cF)Oj{<-cv(K|27mUQ;Q zbm{CgcPS)>J-KCZL$3sM(g84!#EnaTZ6Hkv5RJvn0dych1c>hk(3JoY=2aD3kqpsb zyLHv1}&GFwD)^WHs^h5?696!j=6L4oakgR_o;e+s7(AJh*PQJ+6K9R~o z^P~xG56S&vH6WewISU17GIrO3w)^3C5BENhX1}e>)IA1hp4^U}_Gef8uRm=G6xKvf z4zM)+tc0J(Z?20hr(Mm8Gb6+UU}^Gp++&#L0A4*x~mt=c{M)e7*G_*Y$zt+UNCm@~SK;^vd)G}BE`IX}OPJIMu zP4~Q8k46TI>f&5IS{^K-8l3J6g;E(6-&Q0<9G7-m@CW9ItDT=n3DKCrU`1FW6;Ql}6RSZ{d4+!TqH z@N)Rg(*h0A(TvqfZc*IOO8_O)#G@}Q3K2oU`|6@Dcj7H`~mtw51WJ}Q?^&XdmCK0MD^YwECqvV%8MDWEctPU|eDaeCF9j~cRf zP|<1I2&r@!v9>3wbZI6DGIj?8rV`?k)Jx{lI+llKm7hzy^N~?z&HOA}3}kL9wSzCO z_xaCM%9P-y1yanAsg%vq3Z~K$@KdR@2vs2s?#r;i^k4HI7Cac|lfCV~><;I1S`E0r)8dvn5YffMF1O8oB@;m7WDcHwY2Q)Pgi zb$=uFeBm_OhyZgM4Kb_+DjWK2W_WPIn=t(&23SYqH#c3l)1|jUM9Df+>g6VtT~f6x zKxH|oa!RIDO(0}S#rBpdB`(yWrQyO~yr?HrNVKj;KZJ{bn%}+2?s-1Gm<)2Z9~4*s zkkRvbu5`=kzH*E;^kg9V&Z#-qmnuaFZ!z>uY7`-A)LUJPmEy7GHLlqaHILadZead$ zRE_)?F67i?1gu8a-WZfc-lSy_B3QV4(cTCV6?n3jRKt7bSY$l+ZDXTAwW*gJx)WXS zeYP$&EYN*A_3u+T$z1MB)j50ADBTJ527y~43ph&*y$ge1Q4eM3C<{8jufQw$4D3+Z zKJ_(DARgeOd(n(Y5m(krwHG(?=l~0SQJXGBiWqD0nlN8Zl01RBp^kav`b5gv7@ zPL!xAPS&PDQKFLgr6zqDC2F^guYoEiZB2EbWg3<|0rMn%{p*N6<{l*teGP8mG&4Tv zXKYUl0LJ-X{C=HEM~f<@-(+gTBRj}$SUbK>ZK6e#S7nofpP^TLof4u&L_|@5FuEhn zFm5mxXBP|KBx6Xo-snl&qD2$2yeIt?Eh>3FhW#q2!+TO}j0p4F2RoriktEw?OOovx zJkzo#y%{4aiWb#qN{p!PIWVuzr5>~ob-ZF#op_kEp$GjDBWil@W_y#hB->4JNa#To z%ZU+Ucr}_=PE;1ns-+z+Cp;~pY>l+D<%LC*Xp$mZ&;1v4<|B)L*#Q+%+v&LfLiWk- z8?i6vWc=ZmKSP@oX`4__Deedcv_a`kLdY9?w#*dx~*hB9(kG^mBo_HL?&PgZr zj}_rj7b>7Xdw~|qM7{DV*1#;(4Kh+>wdXR~ev>RJkE|(b*_gkVF8TM%VEzYDv6HIk zV?)L4k$Gf4q)>PzQKi9r81&G)U&cdkA9R$M7W0VdjQ?dO_h1Q^5s)l!`Y?lY@fnXh z=)XPO=gQOMN}_RMDw83@;=vqa-$t|e8j6ze)?n`L4F@+Pd(wg8_GH^Ew?`FrxosYJ zV+z7u{6bkzPK=lVksF;g&THlb!OndSr)rzPb zH_VxALbkUggYM&Jp!wD7ko1v$RI=%R}#~2e7i^ z*wqkr``pn=E+Z+C*Lp3cXc#!GS=w$NUr9r zBPDfww4^?ooFR#o1`|P<*Vjg3q3h1><91@%mG04tHB5w!$SJn|8jqm7@>ACT7W*>i zeeZk6&<>A&6rNs;sRwc}482wmD3Jl(P}$v_naSk-6@fPN_l8rOY9c)G1F%Cv>h8Z$ zQ@Q#XB4VzKu_jK|yMe@|H^VR2cj={J0RMC8#mzf($XOnvt0U#Il&5$Bn*~4hN2T3~ zptUC>O;5SKp>3w_0@NeBSf<`|SR(G+Dcrv}t$#p8cym3lyO=+B1JZyWVNbH{dD4XE z9-|u@w&$>^4QFdIkAl?#ITT*uGdOSar{eEJl1raCRH-VxEQi}p;Lc8&3kGPz^v-J{ z%(ENF-~^jX4;@A`Uqd3ELlbxDL1y(#J(}+_^*(%&OA8w(agp34t^;xvKSOs9!MJUX z;X5Vc1Pm-^0Y!ga0tUXFEMPrue#oPA=`%pd?wuv8dj00o$FVF4p$C_>D0-{9s35wO zr>WINU9l^g_EZ;k(YZY7HN+`qmJ0L%gH7xuJ(E+}w(zWm44Nme53R z$LHVunVrW$HPe7lG-wuYnDvT=(aTyQpzLH>&bRJ*2vw{tqGOLiy<`r8Z5exb zw=7;mSTI|ZOJ|M2-NR^9ZP8W~52L-cg)P_uvLxF93#LACw!PyoNV7n9D=aOfj`+h8 z>;XNJZ0A96KF)S|Vjh7zghK0y4WexbeP2)X)E>SR6jNWc6jh(o;QFF{(9i!v6pSLm zp6n=t)|TY(z^}z!E`?6i7i-Hlo?-^+l(KicKmD9w2@oHL(((r4s(2ho6B~+;+b(~~ zZ2W{BbAxQ28_4kW@t5H%sp1icP01ujRiG{IlSWQXLwP@bOI{t9d&}F@s1dxL9YjMK ziBR!DC{1f5s%vje7O4ZZ(2xm!oRFylSOg^9%ac?jlaEmWIZQTB4|L+LCw?V(IxN%vXItcl+c!cI?91llSfX z2cz$I+wuD@{4To-^yBWD2hek!=H&!08o3?197jRK?LFHL+;-rM)T94U>82u}cxrBG z_Hf~wc(5#@FUfgM2UJ5@;N`pCk9oo)OF)ASw)QCUKbPLtyaUZgYU68kFz(;yd(eNV z=)0q+=u70)Y?BAGV(pLZ2ySN%Hf(<+id;L2{haJL4VXP?A74C1_XCjxRFSlDd2|I! z?`&^FKa;xzKZ+YeKZsxZJEu*q=6+{nLIp!#{T~=Bc6#?^mvrgVf#iQkk*t5HOJCua zI1HeM4tDp%&W7F>B_owfl@4NkrS=T$?;On&l!3I$Vx`rJDc;JRSj9rM4rWf(nZzS$ zA2afp*w2vsrM^z~0`riY7C+b%;ftq8T9afR*98h1<}OIxtIo1G{a4;A!(h%AUU|6m z3%KP0z|hm=UIGslQaRa+ZsY9+BUQ?iy{P;3H`w=%%dA1tKE8N(Cr&*jdqD{`niWTK zrR*yNN!A6WR0Q|V_(7j?`^eZG2nE&VLlVq% z>9^i6LtsdeiJS~oU&q94Af&n+Cs-@|%WeagOHB;~grRD=tC>6GhIKI*8BT@a<*a6R zhL&V*i#Rc{fRVhA@8dz(P!@QP!8Ft}S?>inwn~%~)LYe)vpx<`<ictn}_siC*W zU4d+KdNtyzYJSobiHyBdrkIC8D-xK@B4v0euu3AAyCYn+I|o+VEAi~(cdYUZuWP*g z!!kUP6<6zUr`JseDz>*gF>cfZ`A#OcZj|Kw)FIaaPOlw+DZZ-84%nTkFX2{*m8Kcs z(U{feS(u5ZH+Bqo1?C}|d$SLnY#|zU?2D$F?AZQS4$LV5*2uA7L-&?<6U!i%f$_jH zmz`s-^^+Yt0n9~tCGF#)hxb&APT?&@r^K~BoY;#1w9CY1tV!)Xbq@GIw`Gil_cwZR z)DFSosc20yjtpsd$U6y}76mD%N=kNRZ>BVyiiO<4=!G!~DeS1gRk|2q4JAdMkak?v z>4{X4?Zot+teJzFx9;-@lxxMWD7YMZS!w(;^pm|PrKN~zu$r4gDqDqkavwpQ{j!gc znpk8XVYY8rHXWSNh4!LbEk&f5PliSnYY7u9Md>U67(Kqos6fSVzIWuECrx^t53 z!LQn@$;}bNd0F~Ps_ZVUjNKvIt3I3SSf_QTovp-ceo4r>TcZ`Gv&7iC(=$jEeM(ae zo2cnmoGG5lDCp=9NvNDIPGgtPqb)#oC5$5|5;(>0X6%Y}UtF;?dZY_etdUA#T4phm~G_W#lW=+~l5q}O?=rT{(I{@ZM&Q`ZVI+rxAiA(%@Z zv)@1FTKUWp=SnK;d4{WW!rsF7vJ`(p66bGL4VAR!z~OQaE5R{84E`?1X8b}2k8GcG zehTYOhb2i8YBA&`P7;p40nI;qp)_BJ_|Qjf;Do-fX!S^!CfZEG_dtjpg+eXfomGly z3O?vC^m#qF!F#7{Q||DVY|XXqGUn;jb3T&7l`CfgX6SDxqFT}c9V@Ne2YU5Ed95Jj zJ4}g{81}VnPbT;QomLRt3TXMz&-Nq^yPRk``tpMKax5HkmgmayR3wZ`{}uVn|6H1W zy*qtw7va59J4*wmzKceS7HO7Vm!)q&j*eV+KUT}dkb(l%7Xe4xBYtr1vfX5^hTaR+ zG37$GcBbcc5hP+eQ$Sl0?&$|a!-Eq&4ZUP%YTg!)m=}*K;FVDDGW3g`KxBI~AtGtQ zO^=B|hV3TCg>j(c>@n9e4>k76O@6e@k9Q5*ojBXgiR_*C3Nrkj$@FoO;T<`;j>3K3 z6KKs&VeLfmN`H)m63)6+xT-V$cPFtM%6I%-{h@(LU}{~5w}%rZp0rUhLvl<8HHvv-qh!|w|`b29mrlup8)C4hML%a7eZH&K}NeP)VMczrt9;F0*m64)I{);~oF z4l5@0H*<9cB*N0GyxKs2^uLl+roE_HeB)!b!M`iDZ7<$TTm=j5$&Rs?xcxQ2FaLAt z%et6Zr7y_4`zr4)#k|YZiSIDJa((rP@AoIt@vTO%)QsK!FjGx=P8NS@ZlN5Kibzi|K_rU5iqhDQ7&rEPK-nEd zSehl)E?O!4%cd8%_cWX)#>Ytac{n1@~tX3g3Lh8aelI zeLNDm{|8@E@Bb{Tbozkmb`mi)Cvz3ZxXMs#6P8#YyuOm5{_bN2yWCUJb5Yb#;alw6 zyE!@TN_Xh%PNHhn6vU91EF0i8Lw~ESD&2_WQa@EnIVVd4I@13j)i(|`jMQdOtdbgF zD|e)tokdvj5ZUYK9ckp7@Z3uaP3SBJ2TtWy=NQd)@GOHDeayN8?e8sui+7W4vT+B> z>Wzok?|4vyE+V2r*_X;NHW#YbhRX^}(N47CLF!-|D%}S=0H>qJk{|c;%0++Nnx))nO`Cd(F!5B- z4?RVNAr|mUcChj8P-Lx3-`q~6B?8JBmlqDN$RTDp%;7EVe;i-E_+KgJ@iLI#vf?LcUl+&?Noa5A4m09=F(Y#6AEU(o+@~LLad=zu z>LH@UrMnc|T~xM&lC3+QHvMDgx#&o+Fm%3G>z!M6n%G?g)mV3nC!LJ-7~Rp(=d_Xp zEpa>ocS%ny6C23Kl)uoSaB}J64@(=8}6T-Tws_`zpFQ}w8yLl|uU$;xrVi|ve z^xF{f=^?^8F6P1%S&wZh;q7o>pf>b-h;&04sL`bj{Q*ksfo%|K=)cNRLM+y3xMMvs z^`CI(Azj>QmYWTm+)`EX1aCu6Ql*racv@@dLr}u{*Qh%jH}n5_nS3VsXtLfN1>lsZ zlto}`=zZGE?J0umbw=74dPAV{8v&;Zg2?e6fZQmMrB7RM>fLKWT{!igKcNvl@igqx zOX@mA_!eIvv9nsp#MBleRZjIpd;8`Y^?zRky?YL0Y{8k((0^o7?76Fw;wm(`H6Kro z4ZR#PoSm{s4#NU$QA+8Er?1%aY;IbZjhj3R&!PaFjhgpGM{o#vRj4D_YLgv7v9Hl2 z4c$p2-oysy=g;Wx*Tvx1JsId2ju_>;0Lv}pgj&0)*5h@d831x3=l&7tZ0LuXg4b?) zfHBu@na61=#Rv!$|p%HFx6f^y-|?q6b*q zS|`KT@KyC<^U117^#VYVDD^81l&PO4sa)>3!qU$-W$DN9`>OP_3{zHL`WyWjFD<`i zYU?6NU3h7^5-^o6s!EBK$e&DoW=l=B3CivzN=38;5l43}^4idCD533nJEqBE>z1l7 zkK&Xq*q4`SsrqsYI2w9(3)Pq3{DG`q~E1m@2x3>b=`Ormln0 zdq4S$L*S5u6_Ps$?ktepTjSXYtK(Jg{T*nz_g>swah&~>Ieyk$_1-Jsivm^SWYwCg zs%Y|;?7c@El^AodO{P9S(izsXV!tG-H1KBQKxK+Cddq#Krh!Abo zBiZ#@DRL+b^}3;Y+l9ZOmzm^i_7LK1mIT)sz+fA|hQ2gTx%=4zZa&LVVt1!xqv+CC z!27DZ8yhG4FuM7c2x-yJ3{jeFfQ=Q0lxfVt8jX^n$Kuy=8e@`CHw?FV4Y7#C1~*j= z@$V+DMDb=56~zm1y`iT!QBmCa7ai)0me_=$j(1;aiGg5Js3jI_l$Vp9lFwtfUuOEB z4f8Vn7u<3W7W`1P#KW@8>oE7Rd$J{NH7Rbx-vwfs1hC;Xj*+jl#L4+AJ_if4B@ScZ za!b+dD0=6U^+%c*dRtJuCiQCul-UyNN-CH8gTm5_0&I9ar%`VU-!?_^IhBAw+4wFu z0D<)f{1#qCJH0LfRUe`B-l?dmT|)lL8nx4qMtX&L$$lw>kwpy<-aB2PIP zFbQG=pBHS~K%-N=L@40oPV(;iY(`q~a)$Vg0K<^wOW=*G!AMxXnw83lf_h zr_v&mlcZqd{w_|X#kXj5hCVA!riFJhP6J@Ry^QlAY2PwBjeS@09Vpto?#*ys5sH4{_VGae8LSZgdC(rsalFu__n+)@V+Idd>9k<*cgx^v9!BJV3{lUpw zGR!+nio5V&f&O3`z=qcZM!wP?IPzJ{01GqbBUpIBEbNz0_6}OHp?3s@8kt)GWd^;W zq;k1O6_#ESV8hFUk*`QEE-Od_ydYh64%cdd+IkkhuXYYU0#-2QC4NM5W$Fj(si61m z#{)(Lb~9AaH5qh1?TYCV(h*^HJVV!j(X#=E1CAWCo3D<|s&(?k!+Yw*5^`HCqlX;3 z)Sl0{Kd9{cB1Wro*Btm7-_GCYH9J+MLDXy8IASi zEf0uLO6pR{5WI?jjUJVY4lh|U%shR_y;-5vlhx1?Sj$9FG0 zAp8C<^?LWZ(rYR_2Q~lXG~~^0+~44P_~e!wD3{K?GyikxCmP75hxp_ITM!=mBMflk zDlMFqkwweRA`$Nrvp5BCt`E#IP_`E=}Z+nf?ZOv*VV7_C zMf&*V73K2qY&8d({ae8~Q0cQWElMxC2(M1!tqeo|r78^^it~q=RcXRdtWj1~rA0$= z%JV!-!6{EUYRXpXDea+#XT!`wG~UGk8N`b^}dTz;~R@Yr9KsmpM9 z>{4YKK3s$q+gX{D&Q8lQ&FuUe;*jL9E4R%9rlBlIw@pTo-Il?za_JwUsN6O@@2;D9 zck53$#$EhZ`fIo-XUU?#5AZx;@$b~>1L0pM;UWxk#-HoJ_7&U(drP)EsWi)ZapQ%# zDb_NJ=6xXA1%8I4N_Gr@c9@ytUM=@OsHT?t)qmjSK4U#bw=?vBN|KlCZ(B#pgz29QA(ZWL4U81bfqH#nR z^vkr}L*ukMILhc2zTjG{$H1rd(P_(*2#m3<9)2*x2ZH%yq6<2Bg7;I2|c9jl{!NB>= zCAv69)D{CSQK_*aq*k(wn>=u2M>Kij>)>A2aCF%OKO`OSg=gN+CyM!zdX2>)qw`m2 z+F0@0;2cg5IPDbgw3lHInNJ(8p2KX>!9H_ZFPKEkQ3cj{g=HmRCtk^M+F8zy|BqS9 zISLymf=W1Y38?E-7~S<8^&TfGHrxqr*&|sEZ0Y5y;TC{$Z_$vq@Sz`X;RBCd|B@z~ zpCy|X7tf-4cpjD9JK3Fs6<_Y;35+rw_fQwcqz>4`Jj@Li>9~47lJ!$jv2?Wy5SVlT z$H83gGv}z?ry|y;&1KGiM=!1fu=_kEeJZMljkyGHvZDdO*%fDHdxzotQ3FG}yn=2!5`tx!=_kT&$WNT)x;5&4fR(9_TGCP343RCT#VZk;d$wmSU_%7=V^xF;Crq-?F>Dd09`trp|FWKY8HN;;wOp-t$%ZQ zHceFdfhJAFLyWB#X#PYI9sHqmi6au#rFXlSd@7uw3&8t-#G=p}HDle(X1f0zc_oUf zBJwoFB_h47=h9wJ6n!jW-YMEP35_cLEWMnBM)mj%*(Qtffu~?#rsL;ynHY|&rApPO zCuz!L*qMHk)=w4{{2s?chSNmLgh@R;cdGEycE^i3IWPUi+~ZW8)7cqMHKvHjkT;LB zZmC_EAL>cXWxcF3G;E6K<#neqYb`F@6cA zgm7j9Q^VCKsCyCz><1c?BqBu8ahjI|r*1n%JCj5mziV-?YW&#`QsZTDO5^cImBt^( zDUF*R{eLvhJjEI}qa#yAV6C%_^3{WXCs-{J*oc;ZKs?HnYL&=ts0h<#`wmIVETmmJhe`zdGL|6|Wwnk)I6SgvwXT7Vew`hF_k<{I1?NuRvf3~X(Cn&GRb~ET!^g8al%>MU{U8d{WDFp7ilhP zHC;6JzlG$uHMbPEZpT=}l{H#goaO>2D3i`lM+5D7jEW|Urk3+mBL$DA-bzMeJ$r1-cO#h!8Bq&b(js}>j!A!Y%m>gfWDs% zrj_2!Nt7?WjE&-#uMS(>o2w8JdaieN&`uJ) zgWIHGWnnvtgBeHTY&+!{@5|gWs;5!ad1yt$ijjRDP6{L!qoMP}AQ4%N&dtNLXw)ux zHczx@va2L7oDzI6B&;o}78dC@FmxoiY;HA_!ZS{5CyB$d^^&_YwmEP_1;BAd>C^e} zQe08mIUmE`7qD2JTuz?w+@%jLN!jxe;Gefs)dhH*yLUTv#X7Mox07;NM zBCj*c$Jk?g-4QOZK`rdZL4I68UM)P~Hg(6pqs=kM|D1r9mDLWz2rS~pMPZx_u z;`NPGcZpbE+WlP~!To7b)Z7!VW0YAcj*Cs}>Dp2;AhF|m5IFUe2(~XX9ld~ud)&4c zIqp`Q@pEb`eui#f9(vqzp^lTVA3jmAiUnZ@*I}{35p=tOP3M<(-5)ZSr{Fggv)!`{ zY0NB(ZREWk{7c-A8L)?1;%HDs0_CBVbVj)Efv1A8X6YEhJlt3FU|dYc`o_cUVi-2N z)KVuMyLKM#ZFzKDRHiM>gGqkHhBBd%2b9Xl^KWDFV7#7BN9XL}ekTtm1@l=gcW1!h zoXBM=KW4$YLK#rZM7Y+g4A@pjWxyA8R0cGzqcR|>?SwN(bJSg$f*=z5g_G3!+Z zoLr|ez*r|UK=fTlomPr;zazm=z^TiN8gUzKqNr~~OU<_a1?`M1Qc+x8lQ!!c5p5|l z4UQ(yZ$&g+{#L|^9jnN?3X`Y~tEuTKH1tyIXuv8_tz76T909>eIP3d(BLZC<9|+&i z+Z#v#wdeF~C2d)SLqy#JY20cNS@zIMP9}3%=W@6D_5}?nZwV5;)+&xezBM`i5%B+T zY-4gf8=yFrDa>*9Hzvn#)==hZyl^o-K+rXTH!f1YX3^F(e|AH`g=N)sRDF%8sSQEZ zpQ4L|h*ICuq%|<}_-b0dMw}6@)iiposO(qADs`ImPu`qm+}E^qt@uDpvQpGKVHF=Q zrv~f9TFnJkSrv*z(C=$S6{@~oSc?qz6CQKdV1Cqb8TDH)c8YDwDG;x-h}GZFI~(xr zg>t@vnp7wf8uDz3R5Y}#QZ!%M>~HD#1`Ls3d`+PnMP%$;lLB7f&8cRN0y~zf=@K5% zz*4Wz%F?~P!s;{21V2gP<@rXD(wu^DFZ&%t#Y6qvWe~ZlrRZ`e~Llao-|( z6{o*;;_S$rIcb5r#C1!Z;YIWOTUge@+0y^}isa$V8EUQhRA~?T+;($m;2!wDtDfhE zg8m=%Wx?sHS3O<&->ba@j~)Oghv?GxUX>K62|zE4NRTM@B^B8#8j6`;Qq#S{Keo;s zjHUYyBMI=ZBTa_RIz)R_v!942?8PkDBbCl1K}LA}I!jVj0BENIiHup)ZlCBT7N^pZePWNu`YNr@elf!$Zl=&5>7sJ<*e|eZ zFF7l_*sSa#v$8FGl(*1Jgblu=+6P2ek?N$+4~T(20y5BHoW?tEJXn03LQf8edcF%` zEzZ`vKX#hkKwA%Lo*{xmIvFx1%{-*#S+bg38+NN z9Lsz;Q^6ODIa%LXH#5h=T|pL2-lzpsST%!j4(z8%m11Y|@wOAp2SAfu%uI?sDCQMk zBc=3xLYp^ewdmPFv9EIQOUdj$s_%!E`CZ_Z>5?xa*wo%L=*A(jSY$hC(qS>*#{;b7 z+plW2*F2dj9}(g0yCx&DeNt-;IvUL%p+9GQS44Gz$2@2Q_M%I!jmNt9=RXVKV~^ z>(oMZesa+DOwrVD#}kf|e(@PD%A-}BRKq3W{01pZdOqgbOiFZNJ!F|dYhBplX=6~< zG0{LQ{+wPrDk5SVv#@=Wo^j)J+~OYCX&v>C)YLvd*h zYx20n@KYtH^|Qy4OUtKuTHc>Q!;V20>vWoX3|#soD=u56N-iN?99Zh$nIvblOhPpx zxZH0{qaMdaWV?5ydFBTXWZP*8|Jw0t4D^RbS~5O&_a#=L4k%P?L6p~Y+J79&o08Mh zYJM*&S;Wtu6K=}Uq!YprA3DhEq?jz?Cey5wm@=H1OuJ8FES)tq?dnNU(GtB>ooRR9 zOJw1;`!3tH#_*iWmc_FwLm&1Ll{W(J>zwnSkPKyZ7bO|{M$l-_78juoS z0fJ)ML;CQv2rV~)i(nuVaK8t863ul!O8}Jb;}dD)Y0QjK6*3|p7A4Ts7Ra|yox-5%2pBDb!&&ElbuXBM>t2KYG3liAzE-J6MPc_eph#G4c zWZ1F_`{|qtOBVZSjC8E+F5hQ=Mw8A7ztVUmMAl;1u?e)|oT!>uoJBdAPNw5EFvhYE zU#_u9HlbWaeiM&9Dp!y}?0NR+<-#7#V1rDWBTAB_zXJG9_WiBz@snx0i#$7kJCE%5 zCQqP_=f%j@9k^;?DQ%IO|0U&tvRrchyMV+JpJKL`VDT4SCQ!%)5n6nTM7Au$IokDs zOpL>kM$2+Z?jp%}$--!fuW4ZW8SL<|%Z0C?utu)|UdHHoS*~pu|75J{%6u5HKN2(y z6=P`E1#ESsj-{d(F`t?B301i$Dtb+m%C#(mNKO5de70(V<)?hYUTImzj1>1QV6Yzg zWS3_+NZTmV(l(Qn2`Y`FgBQgx-vLAUYZ~{CJ@l@OFKU$0-^#I2vr9O~T5%{1zJ#{@ zbO?QUNxUPrkD-4qiE<)k424}54Z^ldW{v|qbH#LnU+k0j;648n`slJq5ko#9aYcMs zy;1_Js9vT8dMIkDrQZF~SOmu52TLc7sD26dkxOKJ*zjvXGSZqp0amXjgut=#8JmR-aiT zBsy2eGb1VZXVFod{g{UQETRJLeTcrqF%{M%JBH&oo4>6j-lpY03%}@_K)M_wd49%0 z3<2uOK+HsQ!*z2wUHVzr8aM#Niw>YOoTHhQ9JL3@+G7jWeyd>ZLBpv>mT2np3Fr!V zanOgfG7Ao0K8lWKiI8IFC0gTj6Rkd?fE%J=K-&*g_LQ+3TAnsNhS8uKh}fy&bm9iK zJx>p%>>Hws=MoTu4heDMhRhwYU?>gzMfjFJG78y(CnAiSt#Drbhbn4>q}2zs>KC!K zvO9~LvRqXao=n#t0$PRO5bhjGNxzDiQra-&KCc{iWYLyiML@`n!Axg8cU|$}aYywE z_M!CaucEboXO>_%+!AB1IrfgArZ+`Uh2_Ipp!m*n78*E3f&IQ<6Gl4QM$Vz@&W)#JJuEtuuYu=N1q5kHgZ=+!QeuabyTR{tYK7P7irO z0}tb+gc?wQmIN0Gpc;SR?BdAZML<~PpP(?9tsTV8Tz=srVXR_QY$&b#U7RgBjI9O9 zp7&|eALzmThNRISVxaK*@dCR+FME~ovUBV_lm^@u;Z*sy@T@%NU1@I?&dqW4R_{sQ zeXc6q{V}i7|Aug-%05jC)8BuW7T(7AF=a6Ax{WTR?_m1rwisXe4|GHvD}0lna1iSa zWC7;)5M1uGw`pp&h=~{Pm_gigMOD20>heEpfYj`))XZ@oc+;FVZ_~|e(YRAD7Kz9y zOVpmh5jc#$K$R+?5R11c%xY_uAtt$d-TTZwRq}P#wO*kQ@8Hu-;ZkUxwo9RWvf~;{ z057S6%e`PAZMg%F|N2ha(L17=MT~xz{`phP>tF5?o1#bXMR|UDe+WrdFS#e}lkdEb zt^@7l7h;`WC74oeeW>-fG9sE|k_*PSTA?`3LU*IPcSX;zcHM+W6~{`f&XNyi+>WrE zKJz5maTG;EuhNYM+`}Ge#cnkI9#(Xg0krm>=+yE-U&+r6qP%%T{9E}j9zr-5#z9-v zgLdwhhh@a1{uFl~-*mY1HjTKCUF)|m(Ej@(x@<=y z!E)WeVPfgIJ==ml6!icr)iFQNTMsb9o7jgYJizB$iuIxG55#MgqR*?)qE11_G=qZt zK;0=H?K`c-&Qqy}nB1J`P1PTYZcPL8jbgRm%(t71$6*vc48S~5^_+~A;ERgYus(F) zp=cgkmO;w<&69cVrh;;VGb2AJzx1a{e+hTu3Y?-s%op=T@hRFHgs;RLp8!%x;Eca3 zDKmECeHiooxt^RP`JBHk?0W*cbkO2E#BX9k!gsg6R}=jTXDmJ}JSt!Kj5lfdBN5#` zg+X~d&9o{kCkAqo_N|6HJiJqyDUQ2NOKZ0CMOhQ}CYAnMl<(ZBAVVI16wggyf(ZfI zk#wt9=l>>~u541@gK)W%`_h!Z(RqB;msb5PDtI=AWy;1Cz39r{qCu|}_+SIOl`p1S zd;Qz3wT)C2POnLMd6pkSlk^TQuaci1FOl6Y{zof=_*W)4a#n(Wc&X{;~K( zr>cCv;Ui{ zKFIQHaJd`wrgKlkmjWLt9Q0Jw^$R#5RVvFDrP60TX!BFy_qJ1NnX$VZazoAl-RIy? zySehHhX$c63$puz%S6RxTt1gyx)oHv9;(Ude5oD`#t9~`am@Y|OC}T$ASS;-GyW&u z@yk3WHO%0P(y($jvOE`2iGN6MW$dnzr(puL!jQ4^SMImGo-p2U9OY7h&w4FWM4J`S zZ~sm7nIv+omUUh3YtkIn`%oTzcprM%QdK#_82$#` zdoKL_HXfCjHGENamF-IFUWl-mVUjpwcVwPj17BymOiNtut@w=N3lUSjV^@F?NPNcI zaoW`MDZ`xBP{lnUpZlaPl6#kDGDrnG)l+EV1-M6|D3j&ZZC;$`vz{hdJMKf${@h)U zIo&DnrHJ(V%q6Y)gfGgPpF2~Bmm;ir0?W(QJwI#56&Cs_Cx+A7OD2*OVX}$pMr&W< z98SgKbp54>iCohW`!DTPt10_0>UCWyG6%;JKI}&EIih0!3ur|+#f0~pxRvddsZ{VQ zP&Vbk(V@UD`4_e#u$kOG_sKIhr>st6VmyjoDkbd zI-yw*^ZvIJ4ss*U1-smbkY&pAPHAAOdI`I(ek^r>78X(!av-I;l2SQe%AAg=^R%$U zy)xJtyDR7AjckP`e`ov&6Caa@KgemFFW;Aon7oq$*xs3mBa%Ha{iCccVm$X6^4VYv;FX z4Yji)bE`Px7n&4R^Z4K3K<2V^xoe?lDAiv%MmDw!{bkX{3jd?@fzXDF(=NIyv@oA7 zZI$hE8U+UJsf4Bt5p6oqXibap?FQeg(7c8HGqmWME?TQ;okW#M^i0$K6ldGfts>e@ z-&P2V{M^#_GCnSMA3J5~TA=S9Oczma2Vax}BWPd=&6mQ9YNguTm(&IOvJc^2BlQ~A ztmt(_ru3MbO9i^J1snp*7bO@kad$`?SycPflGwQ&!}ZO4#0RsvGIm*9ZWeE}!J2<2 zVD2;=It7f~7R=F_wgqDBYqw-+rFZj`LB7lAKfb#h+ z=1d;$ws|m~MyqGTb@O2P&xWG_gZd8}DD}HRUle~ei!oeuT7Taw{dt2g%Af6^G!oMN z54nqL{xQQ2F(zYoO~_J1@O&qq9y!Y z<6m6gEl6uLrjcc|ieg1e8tA8m(T*}&t$+tj{zJsxy_8c%3lcZtn0r78p6J6DmX_4W zN2?m}@qg86X4ZK})(IC$Eodhb{~iAy0uJv{0)A^G1<-XLtymMCbEc8^e&;Fa##bEl z0Wt_?1JyhkhxO0w<|YTN)S4o>k+Q8>JS{A%)fMv_)7i4f$I8vf$5)FK4H{EzU#+>t zMg#n`a5~vZD^3f2HJtEjCLI{?SKNQ7>DomveBp;*8%QFHMkC5-vEtJ>c3>AVy{QC? z;&D{QU&9L~JL#UE7Ao%6SMbtJshSlsCO4wqRxLubH}P-Rr}sTjsfw?m11DO>(-VKKMo>lr(ER&3Xl1;R z8lb&}zX?D~1CYHQJ5=@t)TNsNFyXy=R4-5q7w^?cdp%IYzQpVG$PuJf46RnLpg)#z zBXU|FZQ~eRQ%M?Dn+Akx0p)pwMsmbADx864m6Zjnd|!)d1jE2V+h|g-78LYlt^cgk zP@%rj;tt$wkMYn5JITv~t_S5r}s zW{(u4?$&@64li=HHa5>jg=x{$IYje~JiSI%Mq;&9iDgddRAMc}IX+Ypd+IA)YSpGS zp;|LBsTO62YIaeyo=PykTJ%Pk)*;-#?!W!!yw3^kw02!h8DTI#v^xD92D@t4qvGL+ z-Ikir^xv@yu0vhJ5xe1aX;V1TYgu*rp0DR?&>!L27SV7SEr`%QOgy=PyDGA0NOlP7IAxky79jy&7-?ED8I>QaCXC%6I90%uFhcRg$ z(oGE(%_`AnFLaY30gkTP&6$)UX0t+|5e# zPkAj$Opc}C3W(z53e*VKA~&j`#^&-``G}pkgJ88KfUnA9)+c8^a)}aBHEmf1t(+yy z8v7sOmwn5LGxL9BDXaMky*xdxsMQd@RnuZ)wQH83-^%}IR6E5|SY@rRXj-1eS4Q7* zGdhhbYt{6K4s$Iyr6RjF9`AB@-BcO|h7n$9>RXk*l(8Nl6H0HqM3x4tQVmrasY>OR z(C`}CGjT482G`V@h}(swaZ5N9pX-O^Mw=Y!qbwP7$1HCwc z!fR{Wiw%n438bAqKppzKwiYHPE|7%95(2RRi4}CJCPF$WoO;yJR*5Fz^rDWoPRzy^ ziR+^54yEq(!2NO{&8ep?7Ha}&U47*6;S}mrAJ%_qr6KhZn606dTp!xiF!AjbzDST2 zfpXT@LIWFy$`IhMm~e*h*+TAh&IM3l1Fd}MyCv{_EuKNUyZJMn-W>og&Ix!yr$cZI z>Uj{20HvrKnl`tAwy#vF*Grna$t5OHzgAj6NS)%S>9kgu0H-1i^3QxMEJ3qcX|4TN zBm#r^i8`F20^{vXcUoyd5sykq^-P@mZ!hMRDw#Oz_D`hYo3ya_!NnMAJ`%^vv=E4A z0qV$yl85u00AiW|Af5&A2AA5xuU3jC+O!jRu$U|N9W5Owc&F`{;6C`B};uY8Kc2OwC7XUyApCp$j85oL;|?_TDJ1ibYhq zPG5ec#YEL%e)!NDZ-#-NO%*SiMgQy1Y4SjOtAb$X!&G&8-hV&&h79 zDDeWRBo$K1zeq!v6z@&x?Ow&#P`v(kNV;tJzm$1+Tq3#yAzNrB^-9)AydO*tlC{c- zpQq(%kL+iP;ShzWe*gp*H>hI2d^+Bq0b=TrSFH54{il`d5B}TA!MUWpxXIyv4`sz< zre!lX=Mogg4+I{%oyDg{3%k76F^Sj(1nc(nFg={1?e{sR=x=|gz-y0ChN0CF+Yi$} zhE`iN&7`U`wN8G$Y6I`o+qYseIToFCQOZoMoL@}_In6I-O3ZhelsQwIR&HKPU=TaG z2$q9i+B3lZI0(B%{@GGvQHThG-{8sv|Y_9Nu`g;rV2OsA$_VA%aWg9e}+kdw|na7vBv z4N_LjS$B7HTK)yNx%aX#Ye|!vJgz3SPCQK4nA@TK%q@T-W@*KRkSv3ITP0y?fOkRV zhp<`6dg;`2mey3%-A{98VRHWcemXDFYLigC04AY%bglNtWG!PXwl;FPTI0S^TpfI zDy7F2R%3U*rmR(!ebnqL?H3WSpUS0b8$zC>!6el5a4*?eNd1Uiv~Q6XsJ*xMIXyKj zEvW5W47z9c(vZ1YKOy4e@KpBDcWg=C@YE{pxp`Q65BZWdLKIu8TzP+ua^>YTf-8g4 z?hyRhmi@`KrNu6H(H-dL94An658IaOX$wnu#nXMa=fT*f@Eyw2Gnk$7v|j`1=`t_3 zGNn^4hn?2H>$A)7wWtM}SBVpha#}Cer+Nzzla;Etvp)4hvCMc`%=LBaN~&V7)A%D< z?Y6SRLn2Q?M^iJ_qIABZTuj`-j`o|oP|FnCcF@s3h?N( zRXSaK^&MSWgzxD7UWa^EX?}DkMe{7%coQp}=j(l&m9LAOfj8#-&@Y^JFV-RhHhpcu zXG9O=Kee?T#m6eXrUyWZd0WVLi53-Gz7A52-(Gj>Rn#pW+UT{^Eg#vGPaOJhp|_T3 z)qQ_pcPqa>=1vA^8hBCod)YR!_8nKljn`{a#uBvSppEp)60N3h=4N!Pw!L_V$LMeb za;zK5(T7X5uqrz?a2?xav+F~Gv$wJ!BD+SR3URe%g|H7%f!`EL!tr76lP#&Jgof{tR$U}m@>(;Uxvz#NJ!_R!~d}Iw8 zxI&9A@d*$pwyQxiS7@PqyK)h=Os|>??9XI&sgr>bQl5TV&iLUM89Ie32ZiCX?@W|c zQGRO{e_v1f*IG@#MWIm4sc*-Nw&wWavqd&$dgp8O4DNN5^tJYhXts&|_cd0#DQNjC zwQ|K`*YOCOMGsQ3;<>wlCal!DN1R!toYx#Fjcsr|Q-l1yCUE>3y0=pMKy+N2*6$mv z%*5o1+zKMAkNt*i&T9abR&!X9VSE0#=%A!-Af_7T_RiQsu!O^!@vQTTwDipXH`F(IDHC(OL*2-0|%o&gnB%)T* zjMZ2pR9;0}R%4uO7e+@{W69%Z!mF*L(rd8BYg(C_t$Ew-_giXy6J5#X;37q6Ng?_#m(rSz@beZEeQrd z3UwIL#hT)t^D4L=y9h1TXz7=GWK#Yynb($3{1z=dun8pdnG`-5S$uyax)k=KeIb3k zMQbmvE}{clFm_*BKsUE&kzN;APZr~}E{K*p6y;7YP$08KoBOHHILM|xOBPedty;%& z#lBF<^Ts0JlDWITkzy%yEb_M)+P_uv7rRpE;#P>AokGvHYSqQ0MO0-Q+U|jc)P5T# zLXQ_x!Zxj4)gPs7)>qtD5ty1k`dRzF6OMX}j>ezo`@;ZpgTJpLv-0#p zNr*ZIMOzoTeRV+8yDV zPb+sK?z`ra*oD4*8$M5q)2L$m9BQ)*Tbv@5=I?@E#2nhSOM73O2&Smrz#sUM;&yBI z#m29w+8(W9fa5FH%rTGWFXmgAPHTs;$E$}_;fC1?8P`f{Y(0F zFB;wKRI0pBs~F;*3q_pP)d6q|x&S$!lD_LdhlcOd>iG@)7sfh=cI?yA#PHcPVn0|m z^P}1O(X!g6(ANE0d23c_shVVE&Og0V=+1tvN$@x5IG{C9ZIhoO466Ux<;3Pd*Zo*j zUipgNPS@&*u|;X%0a(`FNt@HrDvQoyQ9*P!9WME?tdv*e*O|H1w6Cba0qk*Z(Pg!w zQ-R6;RI-d|@x{MAojW<}t4npLroR?YBsQ0wmwgUe;J(w)(qnWCbFr2%CmRuSC^Q3` zsEbn|;NP35MQ77{8Q5<7$4Q4XkR2huDmxy|pb`g>9nEG^pM%JbW;5usgUF7$WmR^( zOr{qHv5Qb^CapPy;NC64dU?vN@9>~xp5P!^F7v9ze8%Lo9wuSzgYsxu6+)dDFy9Ex_}Q&mp6^;dlfQbYnPn zHD1fqN{K3-67Ay$G_qr}3aR_Zbow?^dr$l@oxEH~fc4Xf^Lwm#YL!spdro>){FD>? z(53jR>=Fpy5w5%d4~e`7OfqRC8~=1>9AUQRM2Q`bR7 zPiZZ*uiq@riE z#2zm-_)!ff4HMxWDDVc;?5|>u%o@VQ=YeWUXf+f1r=m^3lUmlsx+kB_!-;g|j27PV zt9+0PUSl47WQ(b%=cCq}s9Z+l@=>!VQlqol|MB%6@KqGw`|$SMBsabHgd`9`Lhm*7 z&{0DXDFFf`5FjAEk0)683gGRwXw50!qJ#?D{FYU7XT z&X<3XBgF>QQKv=p(#`Wl1>p;0_yyFGJW8QCLNIZpVjiLe!@7yqmA5vLZM-DEBTbs( zZ2zM?Qj!i%V!JNODS^+^Mf@(w#9*q)l7hXN^v2iibmnpebLFgbHs*?)9N4{*Ok+H5 zwnS}{&URhF0{7e?7JC&kYp}!p!p>6MeZVhY4`Rcw;t86dLG0R9xq9HWfm{YZL``MQ zn|S2#{GruX2L2+CSF&Em zsBLjg4s-tXi(E^TJ{--WuVdTc=s4ExI!@;DOboK|KK8V@>f?vKvoz?%6BSh)sK$iLd*8+tD*|Z1pYd$LmQn~j~?s0N( z-az)-1Ke=$KA5$52)#OkS-*$!M^ef_r~4yWlq8RV%=3x7K=S{Uu_y9N(uscT&J&ED zHT{_H-||Z#PX}Ny&?P-BahK$!G;NF1NWj8t0!zP$PY(_6!&d%{c;yaYSO1oK)gRl1 zCaBMD{{po|=*j9pWK@2GY;Io~UTS+&a^9;f-L8bPyr*)*hBx{cmm9p-n#CQBHfOQl zdeIKbb9_h!(~{{5igNT}_nxBZyazD%XK45JXIbrMsOpYhtlKk$thhJJ0oJwsU$zIC zw%uX-KXw!PvXjrSPKfBw%AVnzme!jEJ(uf9FZE`fpUYt(X=&unIdX@ZIF%v;cmC|f za-U;o`Q6^E`9E?sm)%zcL7#Y=9S=}~rOB_bx&NTcF6hVh{v*HIu0L$#_k38_Zt7qw>G-tLhj~1nrS5{uen`N_Kavl(s#-bG5l|7b} z+R|@bSiG#f60#2;EJ>xUK6W|iyJGytv zwl5x>y4Q+*V^;!V=8+Kpk*pb8=d^!fb$pVg$^>>~s)rIQZT;Bj@OxXajvh*kB(`QF z2|Zi0d=Dioz^4^&G#WFOYRxw6h=-CEW9vXANQ>s-jyBw!_nhv?F3AfvOK6h9>Ut_| zrMMI}*;9#(ifak+d3MOcm;VYoTd}>K%5y2dE!*Lxydqs{#bj@#rL?*gJLIjzvKBr{ zL~#B-nv841Ld97)y*Yc!TZxqN+LCCZG`A)D-CL<6ooLBIeUy}tkN5sxT8o;Muwri| zLfpzie3Ur$v$x_RZEwMj`Y7{4@1L|(Qs>;W^+CLh%e!})vH`xzXlcwzcGg#k2s_>c z!O34)VALNE&R{vsFF8MJ!4yAbvXpj=&Gb`(q+w0iDnBJ5a_lE$*q;kpH#A^l&OFMJ zS&6q2u3T@1Ggyj`5)yNyCkf_zJla4CqRjpVj8iZ z0+gmwd`lJ>s7!GD(#V{3Dm7ug$IN5@_r%kxAx1~a|F$^ecAox+k?+w0b}G+Br46VH zn#I}6`_~VsKVN&NG-EY_lr|DR^ffj}sowBosAIH0$6KEH>OPC`1hK~=_yuppKHZ`* z`#MNz7~TuPGbf^Q_L6STan^d}D2onO!s;EZPu}p8h&3SILRHKxtMhNEn8kMfE!PM+ z-n5cwOR`C$@;T0%T?|%wO0P6wnCSeR%|g&UrNNDz{X)?rQb*js%L@UkxU-=mI$1|D)MtA(99vdHxq4=aWb4Du((&C!z zdbF}b`k)Rgj8TS4-zTxBF~}d4%%ZC(QBq=U*1C#POCGmZ;2-4)4^4#c`2k@VO6W=z z9`)H(r-aqsich=UufeWXQNrZ{{Lb^Nt@zSMk6J7|R_W%Sx(7P=<-r%XJ$EFsnX$?; zN!Y`D;*>yXb^@y&hkDdXW;5cHbg9E`$`2B&v8Qp$IB7_AmKBe2Jt>*3jE8gklGw-b z$~@^l?od|6AnZ|<`_^-(;oFPbxW6T{iB*+M>1-nVrK*w}c>kjc-kYOuOLg{oHT3SK zHP}bhl$nwT#|YLX0gk+pNSP7riv;C$siZn9Zg)Vme)&QacydGr?8lDzbxHtXAI*9@WCJF8%z(1T)L+qtFN?;@jI zAq@)j>5cq=+Qh~-zz*~K8^+WmjgMh}Br08e&VbEZ-N+A&VeM-uHJYt3j2f9&qES>L zj4Z8~dzy0TCj;kJ%-tEyKCGcM9nrF4<_Hq)ns?+FD${x*{YH9XMRqE&lMQw|&JL`| zu1;)EucPxw9aGX8MCKSR)Na2S!@4FZP4ILVTabhyol}*4nWRKZxmDPopqng?r?~Pr z;LNLld=C-vgE!~L;nCjhg9Aik0YI#$x5Wy=(7(h1?^M>kMM1{;q`GIeGaC1 z4est1$dzlq6TyzuR6-ifub4Rrs&}iRc`7QWOr-E-RFvx;!8~dy;ZjO8t5Hj-;c_FE zb~>)Hb4gf2Jd9$~YAH!g{E%5*E&c{wzQ^LNm8w+`&a1T=x#f<{2xq_4Qs#8IyQNaC zZijKve~?=)dI5QSo6qcjebJrJm(od-KFw#uZbul~UR%lbDd4K-7ky%6*9l{Zb(Bf3 zR7ZCEMJL)X!g8pbxgivmsoD)ImiGp7v2ytZ`?&DowoZNfe|H(DL^~hXQC3RQ`Ea(l zzLFVKEvV#we_wP+1aobGh0~otR;Pi|!0p2gykfWS2Cd}D<=o~&~rJmf$v-VH@eGm0oCFO1Vc?Mfw7Ck+Q`mqvnkv%nKpj?xX_ z+Y6~Dnf9(AFnDgY^7o>uA=9{7goToK>Y|x+rVKM&#rwRxK7NqF4g|har9L0UBT=aQ zHxm2VlE#WX_QreMe@pYb5Uv>u&HaYvd6gY(tb{stRu)|KLU6hv=#M?a%E2~n*;PZQ zTur;5c&&$?>>)c9UWoY$zVe2BQK=w^3$M*iiIte}Y!7<$s;D<(h6;D0!h9dDupIhI*`b%8VS4T_mdMEw5>V$QbM!z>IQD9a) z-=X?KYrx4~sf%tQ{yiZ|1Nl$Lfb4COKO5v≪aYw-}@mnnOOM5nwkW_Z4To2;AG? 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�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 +#include #include #include #include #include #include +#include #include #include -#include // Global variables for persistent history PersistentHistoryEntry *history_entries = NULL; @@ -33,471 +33,519 @@ static char frequency_file_path[PATH_MAX]; * Initialize the persistent history system */ void init_persistent_history(void) { - // Allocate initial history capacity - history_capacity = PERSISTENT_HISTORY_SIZE; - history_entries = (PersistentHistoryEntry *)malloc(history_capacity * sizeof(PersistentHistoryEntry)); - if (!history_entries) { - fprintf(stderr, "Failed to allocate memory for history entries\n"); - return; + // Allocate initial history capacity + history_capacity = PERSISTENT_HISTORY_SIZE; + history_entries = (PersistentHistoryEntry *)malloc( + history_capacity * sizeof(PersistentHistoryEntry)); + if (!history_entries) { + fprintf(stderr, "Failed to allocate memory for history entries\n"); + return; + } + + // Allocate initial frequency capacity + frequency_capacity = 100; + command_frequencies = + (CommandFrequency *)malloc(frequency_capacity * sizeof(CommandFrequency)); + if (!command_frequencies) { + fprintf(stderr, "Failed to allocate memory for command frequencies\n"); + free(history_entries); + history_entries = NULL; + return; + } + + // Initialize history and frequency counters + history_size = 0; + history_position = -1; + frequency_count = 0; + + // Set up file paths + char *home_dir = getenv("HOME"); + if (home_dir) { + // Create .lsh directory if it doesn't exist + char lsh_dir[PATH_MAX]; + snprintf(lsh_dir, sizeof(lsh_dir), "%s/.lsh", home_dir); + + struct stat st = {0}; + if (stat(lsh_dir, &st) == -1) { + mkdir(lsh_dir, 0700); } - // Allocate initial frequency capacity - frequency_capacity = 100; - command_frequencies = (CommandFrequency *)malloc(frequency_capacity * sizeof(CommandFrequency)); - if (!command_frequencies) { - fprintf(stderr, "Failed to allocate memory for command frequencies\n"); - free(history_entries); - history_entries = NULL; - return; + snprintf(history_file_path, sizeof(history_file_path), "%s/.lsh/history", + home_dir); + snprintf(frequency_file_path, sizeof(frequency_file_path), + "%s/.lsh/frequency", home_dir); + } else { + // Fallback to current directory + strcpy(history_file_path, ".lsh_history"); + strcpy(frequency_file_path, ".lsh_frequency"); + } + + // Load history and frequency data + load_history_from_file(); + load_frequencies_from_file(); +} + +/** + * Get the most recent command that starts with the given prefix + * returns NULL if no match found + */ +char *get_most_recent_history_match(const char *prefix) { + if (!prefix || !history_entries || strlen(prefix) == 0) { + return NULL; + } + + size_t prefix_len = strlen(prefix); + + // Search from most recent to oldest (reverse order) + // Find the first (most recent) command that starts with the exact prefix + for (int i = history_size - 1; i >= 0; i--) { + if (history_entries[i].command && + strncasecmp(history_entries[i].command, prefix, prefix_len) == 0 && + strlen(history_entries[i].command) > prefix_len) { + + // Make sure it's an exact prefix match (not a substring) + // For "git s", we want "git status", not "git branch" where "git s" is not a real prefix + const char *cmd = history_entries[i].command; + + // If prefix ends with a space, any command starting with prefix is good + if (prefix_len > 0 && prefix[prefix_len - 1] == ' ') { + return strdup(cmd); + } + + // If prefix doesn't end with space, make sure the next char in command + // is either a space or continues the word we're typing + if (cmd[prefix_len] == ' ' || isalnum(cmd[prefix_len]) || cmd[prefix_len] == '-') { + return strdup(cmd); + } } - - // Initialize history and frequency counters - history_size = 0; - history_position = -1; - frequency_count = 0; - - // Set up file paths - char *home_dir = getenv("HOME"); - if (home_dir) { - // Create .lsh directory if it doesn't exist - char lsh_dir[PATH_MAX]; - snprintf(lsh_dir, sizeof(lsh_dir), "%s/.lsh", home_dir); - - struct stat st = {0}; - if (stat(lsh_dir, &st) == -1) { - mkdir(lsh_dir, 0700); - } - - snprintf(history_file_path, sizeof(history_file_path), "%s/.lsh/history", home_dir); - snprintf(frequency_file_path, sizeof(frequency_file_path), "%s/.lsh/frequency", home_dir); - } else { - // Fallback to current directory - strcpy(history_file_path, ".lsh_history"); - strcpy(frequency_file_path, ".lsh_frequency"); - } - - // Load history and frequency data - load_history_from_file(); - load_frequencies_from_file(); + } + return NULL; } /** * Clean up persistent history resources */ void cleanup_persistent_history(void) { - if (history_entries) { - for (int i = 0; i < history_size; i++) { - free(history_entries[i].command); - } - free(history_entries); - history_entries = NULL; + if (history_entries) { + for (int i = 0; i < history_size; i++) { + free(history_entries[i].command); } + free(history_entries); + history_entries = NULL; + } - if (command_frequencies) { - for (int i = 0; i < frequency_count; i++) { - free(command_frequencies[i].command); - } - free(command_frequencies); - command_frequencies = NULL; + if (command_frequencies) { + for (int i = 0; i < frequency_count; i++) { + free(command_frequencies[i].command); } + free(command_frequencies); + command_frequencies = NULL; + } - history_size = 0; - history_capacity = 0; - frequency_count = 0; - frequency_capacity = 0; + history_size = 0; + history_capacity = 0; + frequency_count = 0; + frequency_capacity = 0; } /** * Shutdown persistent history */ void shutdown_persistent_history(void) { - save_history_to_file(); - save_frequencies_to_file(); - cleanup_persistent_history(); + save_history_to_file(); + save_frequencies_to_file(); + cleanup_persistent_history(); } /** * Add a command to the persistent history */ void add_to_history(const char *command) { - if (!command || !*command || !history_entries) { - return; // Skip empty commands - } + if (!command || !*command || !history_entries) { + return; // Skip empty commands + } - // Check for duplicates (don't add the same command twice in a row) - if (history_size > 0 && strcmp(history_entries[history_size - 1].command, command) == 0) { - return; - } + // Check for duplicates (don't add the same command twice in a row) + if (history_size > 0 && + strcmp(history_entries[history_size - 1].command, command) == 0) { + return; + } - // Update command frequency - update_command_frequency(command); + // Update command frequency + update_command_frequency(command); - // Add to history - if (history_size >= history_capacity) { - // History is full, shift entries - free(history_entries[0].command); - memmove(&history_entries[0], &history_entries[1], - (history_capacity - 1) * sizeof(PersistentHistoryEntry)); - history_size = history_capacity - 1; - } + // Add to history + if (history_size >= history_capacity) { + // History is full, shift entries + free(history_entries[0].command); + memmove(&history_entries[0], &history_entries[1], + (history_capacity - 1) * sizeof(PersistentHistoryEntry)); + history_size = history_capacity - 1; + } - // Add new entry - history_entries[history_size].command = strdup(command); - history_entries[history_size].timestamp = time(NULL); - history_size++; + // Add new entry + history_entries[history_size].command = strdup(command); + history_entries[history_size].timestamp = time(NULL); + history_size++; - // Reset history position for navigation - history_position = -1; + // Reset history position for navigation + history_position = -1; } /** * Update command frequency statistics */ void update_command_frequency(const char *command) { - if (!command || !*command || !command_frequencies) { - return; - } + if (!command || !*command || !command_frequencies) { + return; + } - // Check if command exists in frequencies - for (int i = 0; i < frequency_count; i++) { - if (strcmp(command_frequencies[i].command, command) == 0) { - // Update existing entry - command_frequencies[i].count++; - return; - } + // Check if command exists in frequencies + for (int i = 0; i < frequency_count; i++) { + if (strcmp(command_frequencies[i].command, command) == 0) { + // Update existing entry + command_frequencies[i].count++; + return; } + } - // Add new frequency entry - if (frequency_count >= frequency_capacity) { - // Expand capacity - frequency_capacity *= 2; - CommandFrequency *new_freq = (CommandFrequency *)realloc( - command_frequencies, frequency_capacity * sizeof(CommandFrequency)); - if (!new_freq) { - fprintf(stderr, "Failed to allocate memory for command frequencies\n"); - return; - } - command_frequencies = new_freq; + // Add new frequency entry + if (frequency_count >= frequency_capacity) { + // Expand capacity + frequency_capacity *= 2; + CommandFrequency *new_freq = (CommandFrequency *)realloc( + command_frequencies, frequency_capacity * sizeof(CommandFrequency)); + if (!new_freq) { + fprintf(stderr, "Failed to allocate memory for command frequencies\n"); + return; } + command_frequencies = new_freq; + } - // Add new entry - command_frequencies[frequency_count].command = strdup(command); - command_frequencies[frequency_count].count = 1; - frequency_count++; + // Add new entry + command_frequencies[frequency_count].command = strdup(command); + command_frequencies[frequency_count].count = 1; + frequency_count++; } /** * Save history to file */ void save_history_to_file(void) { - if (!history_entries || history_size == 0) { - return; - } + if (!history_entries || history_size == 0) { + return; + } - FILE *fp = fopen(history_file_path, "w"); - if (!fp) { - fprintf(stderr, "Failed to open history file for writing: %s\n", history_file_path); - return; - } + FILE *fp = fopen(history_file_path, "w"); + if (!fp) { + fprintf(stderr, "Failed to open history file for writing: %s\n", + history_file_path); + return; + } - // Write version and metadata - fprintf(fp, "# LSH Persistent History\n"); - fprintf(fp, "# Version: 1.0\n"); - fprintf(fp, "# Format: timestamp command\n\n"); + // Write version and metadata + fprintf(fp, "# LSH Persistent History\n"); + fprintf(fp, "# Version: 1.0\n"); + fprintf(fp, "# Format: timestamp command\n\n"); - // Write entries - for (int i = 0; i < history_size; i++) { - fprintf(fp, "%ld %s\n", (long)history_entries[i].timestamp, history_entries[i].command); - } + // Write entries + for (int i = 0; i < history_size; i++) { + fprintf(fp, "%ld %s\n", (long)history_entries[i].timestamp, + history_entries[i].command); + } - fclose(fp); + fclose(fp); } /** * Load history from file */ void load_history_from_file(void) { - FILE *fp = fopen(history_file_path, "r"); - if (!fp) { - return; // File doesn't exist or can't be opened + FILE *fp = fopen(history_file_path, "r"); + if (!fp) { + return; // File doesn't exist or can't be opened + } + + char line[1024]; + time_t timestamp; + char command[900]; // Allow space for timestamp and whitespace + + // Skip header lines + while (fgets(line, sizeof(line), fp) && line[0] == '#') { + // Skip header line + } + + // Clear history + for (int i = 0; i < history_size; i++) { + free(history_entries[i].command); + } + history_size = 0; + + // Read entries + while (fgets(line, sizeof(line), fp)) { + // Parse line: timestamp command + if (sscanf(line, "%ld %[^\n]", ×tamp, command) == 2) { + if (history_size < history_capacity) { + history_entries[history_size].command = strdup(command); + history_entries[history_size].timestamp = timestamp; + history_size++; + } } + } - char line[1024]; - time_t timestamp; - char command[900]; // Allow space for timestamp and whitespace - - // Skip header lines - while (fgets(line, sizeof(line), fp) && line[0] == '#') { - // Skip header line - } - - // Clear history - for (int i = 0; i < history_size; i++) { - free(history_entries[i].command); - } - history_size = 0; - - // Read entries - while (fgets(line, sizeof(line), fp)) { - // Parse line: timestamp command - if (sscanf(line, "%ld %[^\n]", ×tamp, command) == 2) { - if (history_size < history_capacity) { - history_entries[history_size].command = strdup(command); - history_entries[history_size].timestamp = timestamp; - history_size++; - } - } - } - - fclose(fp); + fclose(fp); } /** * Save command frequencies to file */ void save_frequencies_to_file(void) { - if (!command_frequencies || frequency_count == 0) { - return; - } + if (!command_frequencies || frequency_count == 0) { + return; + } - FILE *fp = fopen(frequency_file_path, "w"); - if (!fp) { - fprintf(stderr, "Failed to open frequency file for writing: %s\n", frequency_file_path); - return; - } + FILE *fp = fopen(frequency_file_path, "w"); + if (!fp) { + fprintf(stderr, "Failed to open frequency file for writing: %s\n", + frequency_file_path); + return; + } - // Write version and metadata - fprintf(fp, "# LSH Command Frequencies\n"); - fprintf(fp, "# Version: 1.0\n"); - fprintf(fp, "# Format: count command\n\n"); + // Write version and metadata + fprintf(fp, "# LSH Command Frequencies\n"); + fprintf(fp, "# Version: 1.0\n"); + fprintf(fp, "# Format: count command\n\n"); - // Write entries - for (int i = 0; i < frequency_count; i++) { - fprintf(fp, "%d %s\n", command_frequencies[i].count, command_frequencies[i].command); - } + // Write entries + for (int i = 0; i < frequency_count; i++) { + fprintf(fp, "%d %s\n", command_frequencies[i].count, + command_frequencies[i].command); + } - fclose(fp); + fclose(fp); } /** * Load command frequencies from file */ void load_frequencies_from_file(void) { - FILE *fp = fopen(frequency_file_path, "r"); - if (!fp) { - return; // File doesn't exist or can't be opened + FILE *fp = fopen(frequency_file_path, "r"); + if (!fp) { + return; // File doesn't exist or can't be opened + } + + char line[1024]; + int count; + char command[900]; // Allow space for count and whitespace + + // Skip header lines + while (fgets(line, sizeof(line), fp) && line[0] == '#') { + // Skip header line + } + + // Clear frequencies + for (int i = 0; i < frequency_count; i++) { + free(command_frequencies[i].command); + } + frequency_count = 0; + + // Read entries + while (fgets(line, sizeof(line), fp)) { + // Parse line: count command + if (sscanf(line, "%d %[^\n]", &count, command) == 2) { + if (frequency_count < frequency_capacity) { + command_frequencies[frequency_count].command = strdup(command); + command_frequencies[frequency_count].count = count; + frequency_count++; + } } + } - char line[1024]; - int count; - char command[900]; // Allow space for count and whitespace - - // Skip header lines - while (fgets(line, sizeof(line), fp) && line[0] == '#') { - // Skip header line - } - - // Clear frequencies - for (int i = 0; i < frequency_count; i++) { - free(command_frequencies[i].command); - } - frequency_count = 0; - - // Read entries - while (fgets(line, sizeof(line), fp)) { - // Parse line: count command - if (sscanf(line, "%d %[^\n]", &count, command) == 2) { - if (frequency_count < frequency_capacity) { - command_frequencies[frequency_count].command = strdup(command); - command_frequencies[frequency_count].count = count; - frequency_count++; - } - } - } - - fclose(fp); + fclose(fp); } /** * Get the history entry at the specified index */ PersistentHistoryEntry *get_history_entry(int index) { - if (index < 0 || index >= history_size) { - return NULL; - } - return &history_entries[index]; + if (index < 0 || index >= history_size) { + return NULL; + } + return &history_entries[index]; } /** * Get the total number of history entries */ -int get_history_count(void) { - return history_size; -} +int get_history_count(void) { return history_size; } /** * Find the best matching command based on frequency */ char *find_best_frequency_match(const char *prefix) { - if (!prefix || !*prefix || !command_frequencies) { - return NULL; - } - - int best_freq = 0; - int best_index = -1; - - // Find the most frequent command that starts with the prefix - for (int i = 0; i < frequency_count; i++) { - if (strncasecmp(command_frequencies[i].command, prefix, strlen(prefix)) == 0) { - if (command_frequencies[i].count > best_freq) { - best_freq = command_frequencies[i].count; - best_index = i; - } - } - } - - if (best_index >= 0) { - return strdup(command_frequencies[best_index].command); - } - + if (!prefix || !*prefix || !command_frequencies) { return NULL; + } + + int best_freq = 0; + int best_index = -1; + + // Find the most frequent command that starts with the prefix + for (int i = 0; i < frequency_count; i++) { + if (strncasecmp(command_frequencies[i].command, prefix, strlen(prefix)) == + 0) { + if (command_frequencies[i].count > best_freq) { + best_freq = command_frequencies[i].count; + best_index = i; + } + } + } + + if (best_index >= 0) { + return strdup(command_frequencies[best_index].command); + } + + return NULL; } /** * Debug function to print frequency data */ void debug_print_frequencies(void) { - printf("Command Frequencies:\n"); - for (int i = 0; i < frequency_count; i++) { - printf("%3d: %s (%d)\n", i + 1, command_frequencies[i].command, command_frequencies[i].count); - } + printf("Command Frequencies:\n"); + for (int i = 0; i < frequency_count; i++) { + printf("%3d: %s (%d)\n", i + 1, command_frequencies[i].command, + command_frequencies[i].count); + } } /** * Case-insensitive substring search */ char *_stristr(const char *haystack, const char *needle) { - if (!haystack || !needle) - return NULL; + if (!haystack || !needle) + return NULL; - char *h = strdup(haystack); - char *n = strdup(needle); - - if (!h || !n) { - if (h) free(h); - if (n) free(n); - return NULL; - } + char *h = strdup(haystack); + char *n = strdup(needle); - // Convert both strings to lowercase - for (char *p = h; *p; p++) - *p = tolower(*p); - for (char *p = n; *p; p++) - *p = tolower(*p); + if (!h || !n) { + if (h) + free(h); + if (n) + free(n); + return NULL; + } - char *result = strstr(h, n); - char *original = NULL; + // Convert both strings to lowercase + for (char *p = h; *p; p++) + *p = tolower(*p); + for (char *p = n; *p; p++) + *p = tolower(*p); - // If found, map back to original string position - if (result) { - original = (char *)haystack + (result - h); - } + char *result = strstr(h, n); + char *original = NULL; - free(h); - free(n); - return original; + // If found, map back to original string position + if (result) { + original = (char *)haystack + (result - h); + } + + free(h); + free(n); + return original; } /** * Get previous history entry for up-arrow key navigation */ char *get_previous_history_entry(int *position) { - if (!history_entries || history_size == 0) { - return NULL; - } + if (!history_entries || history_size == 0) { + return NULL; + } - if (*position < 0) { - // First time accessing history, start from the most recent entry - *position = history_size - 1; - } else if (*position > 0) { - // Move to previous entry - (*position)--; - } else { - // Already at the oldest entry, can't go back further - return history_entries[0].command; - } + if (*position < 0) { + // First time accessing history, start from the most recent entry + *position = history_size - 1; + } else if (*position > 0) { + // Move to previous entry + (*position)--; + } else { + // Already at the oldest entry, can't go back further + return history_entries[0].command; + } - return history_entries[*position].command; + return history_entries[*position].command; } /** * Get next history entry for down-arrow key navigation */ char *get_next_history_entry(int *position) { - if (!history_entries || history_size == 0 || *position < 0) { - return NULL; - } + if (!history_entries || history_size == 0 || *position < 0) { + return NULL; + } - if (*position < history_size - 1) { - // Move to next (more recent) entry - (*position)++; - return history_entries[*position].command; - } else { - // We've reached the end of history, return NULL to indicate - // user should get an empty prompt - *position = -1; - return NULL; - } + if (*position < history_size - 1) { + // Move to next (more recent) entry + (*position)++; + return history_entries[*position].command; + } else { + // We've reached the end of history, return NULL to indicate + // user should get an empty prompt + *position = -1; + return NULL; + } } /** * Get matching history entries for tab completion */ char **get_matching_history_entries(const char *prefix) { - if (!prefix || !history_entries) { - return NULL; - } + if (!prefix || !history_entries) { + return NULL; + } - // Count matching entries - int matches = 0; - for (int i = 0; i < history_size; i++) { - if (strncasecmp(history_entries[i].command, prefix, strlen(prefix)) == 0) { - matches++; - } + // Count matching entries + int matches = 0; + for (int i = 0; i < history_size; i++) { + if (strncasecmp(history_entries[i].command, prefix, strlen(prefix)) == 0) { + matches++; } + } - if (matches == 0) { - return NULL; + if (matches == 0) { + return NULL; + } + + // Allocate result array + char **result = (char **)malloc((matches + 1) * sizeof(char *)); + if (!result) { + return NULL; + } + + // Fill the array with matching commands + int count = 0; + for (int i = 0; i < history_size && count < matches; i++) { + if (strncasecmp(history_entries[i].command, prefix, strlen(prefix)) == 0) { + result[count++] = strdup(history_entries[i].command); } + } + result[count] = NULL; - // Allocate result array - char **result = (char **)malloc((matches + 1) * sizeof(char *)); - if (!result) { - return NULL; - } - - // Fill the array with matching commands - int count = 0; - for (int i = 0; i < history_size && count < matches; i++) { - if (strncasecmp(history_entries[i].command, prefix, strlen(prefix)) == 0) { - result[count++] = strdup(history_entries[i].command); - } - } - result[count] = NULL; - - return result; + return result; } /** * Free matching entries array */ void free_matching_entries(char **entries) { - if (!entries) { - return; - } + if (!entries) { + return; + } - for (int i = 0; entries[i] != NULL; i++) { - free(entries[i]); - } - free(entries); -} \ No newline at end of file + for (int i = 0; entries[i] != NULL; i++) { + free(entries[i]); + } + free(entries); +} diff --git a/src/input/line_reader.c b/src/input/line_reader.c index 6fd628a..7c9d07b 100644 --- a/src/input/line_reader.c +++ b/src/input/line_reader.c @@ -16,6 +16,8 @@ #include #include #include +#include +#include #include #include #include @@ -37,6 +39,10 @@ static int max_menu_lines = 0; static int cycling_mode = 0; static char cycle_prefix[LSH_RL_BUFSIZE] = {0}; +// history suggestion state +static char *history_suggestion = NULL; +static int has_history_suggestion = 0; + // Define colors for suggestions #define SUGGESTION_COLOR "\033[2;37m" // Dim white color for suggestions #define HIGHLIGHT_COLOR "\033[7;36m" // Highlighted background for selected item @@ -270,7 +276,14 @@ void update_suggestions(const char *buffer, int position) { suggestion_count = 0; } + // Free previous history suggestion + if (history_suggestion) { + free(history_suggestion); + history_suggestion = NULL; + } + has_suggestion = 0; + has_history_suggestion = 0; // Parse command line prefix_start = 0; @@ -297,6 +310,19 @@ void update_suggestions(const char *buffer, int position) { current_token[position - prefix_start] = '\0'; } + // get history suggestion for the entire command line typed so far + if (position > 0) { + // Use the entire buffer typed so far as the search prefix + char search_prefix[LSH_RL_BUFSIZE]; + strncpy(search_prefix, buffer, position); + search_prefix[position] = '\0'; + + history_suggestion = get_most_recent_history_match(search_prefix); + if (history_suggestion) { + has_history_suggestion = 1; + } + } + // Get suggestions from the tab completion engine SuggestionList *suggestion_list = get_suggestion_list(buffer, cycling_mode ? cycle_prefix : current_token); @@ -351,7 +377,11 @@ void update_suggestions(const char *buffer, int position) { */ void display_inline_suggestion(const char *prompt_buffer, const char *buffer, int position) { - if (has_suggestion && suggestion_count > 0) { + // Prioritize history suggestions when available, tab suggestions as fallback + int show_history = has_history_suggestion; + int show_tab = has_suggestion && suggestion_count > 0 && !show_history; + + if (show_history || show_tab) { // Determine what part should be in normal text and what part in suggestion // color char current_text[LSH_RL_BUFSIZE] = ""; @@ -360,56 +390,62 @@ void display_inline_suggestion(const char *prompt_buffer, const char *buffer, strncpy(current_text, buffer, position); current_text[position] = '\0'; - // Extract just the suggestion part (after what user typed) - int current_len = 0; - - if (prefix_start > 0) { - char current_arg[LSH_RL_BUFSIZE] = ""; - strncpy(current_arg, &buffer[prefix_start], position - prefix_start); - current_arg[position - prefix_start] = '\0'; - current_len = strlen(current_arg); - - if (current_len > 0) { - // Handle nested paths with subdirectories - char *last_slash = strrchr(current_arg, '/'); - if (last_slash) { - // We're in a subdirectory path - char *filename_part = last_slash + 1; - int filename_len = strlen(filename_part); - - // When dealing with a path like "cd shelltest/ha", we need to match - // "ha" against the entry in the suggestions array (which would be - // e.g. "halla") - - // Check if the filename part is a prefix of the suggestions entry - if (strncasecmp(suggestions[suggestion_index], filename_part, - filename_len) == 0) { - // Copy the suggestion text starting from where the user input ends - strncpy(suggestion_text, - suggestions[suggestion_index] + filename_len, - sizeof(suggestion_text) - 1); - } - } else { - // Regular path (no subdirectories) - // Find where the current argument ends in the suggestion - char *suggestion_part = suggestions[suggestion_index]; - if (strncasecmp(suggestion_part, current_arg, current_len) == 0) { - strncpy(suggestion_text, suggestion_part + current_len, - sizeof(suggestion_text) - 1); - } - } - } else { - // Use the entire suggestion - strncpy(suggestion_text, suggestions[suggestion_index], + if (show_history) { + // Show history suggestion + if (strlen(buffer) < strlen(history_suggestion) && + strncasecmp(history_suggestion, buffer, strlen(buffer)) == 0) { + strncpy(suggestion_text, history_suggestion + strlen(buffer), sizeof(suggestion_text) - 1); } - } else { - // Completing a command - if (strlen(buffer) <= strlen(suggestions[suggestion_index]) && - strncasecmp(suggestions[suggestion_index], buffer, strlen(buffer)) == - 0) { - strncpy(suggestion_text, suggestions[suggestion_index] + strlen(buffer), - sizeof(suggestion_text) - 1); + } else if (show_tab) { + // Show tab completion suggestion + // Extract just the suggestion part (after what user typed) + int current_len = 0; + + if (prefix_start > 0) { + char current_arg[LSH_RL_BUFSIZE] = ""; + strncpy(current_arg, &buffer[prefix_start], position - prefix_start); + current_arg[position - prefix_start] = '\0'; + current_len = strlen(current_arg); + + if (current_len > 0) { + // Handle nested paths with subdirectories + char *last_slash = strrchr(current_arg, '/'); + if (last_slash) { + // We're in a subdirectory path + char *filename_part = last_slash + 1; + int filename_len = strlen(filename_part); + + // Check if the filename part is a prefix of the suggestions entry + if (strncasecmp(suggestions[suggestion_index], filename_part, + filename_len) == 0) { + // Copy the suggestion text starting from where the user input ends + strncpy(suggestion_text, + suggestions[suggestion_index] + filename_len, + sizeof(suggestion_text) - 1); + } + } else { + // Regular path (no subdirectories) + // Find where the current argument ends in the suggestion + char *suggestion_part = suggestions[suggestion_index]; + if (strncasecmp(suggestion_part, current_arg, current_len) == 0) { + strncpy(suggestion_text, suggestion_part + current_len, + sizeof(suggestion_text) - 1); + } + } + } else { + // Use the entire suggestion + strncpy(suggestion_text, suggestions[suggestion_index], + sizeof(suggestion_text) - 1); + } + } else { + // Completing a command + if (strlen(buffer) <= strlen(suggestions[suggestion_index]) && + strncasecmp(suggestions[suggestion_index], buffer, strlen(buffer)) == + 0) { + strncpy(suggestion_text, suggestions[suggestion_index] + strlen(buffer), + sizeof(suggestion_text) - 1); + } } } @@ -1142,7 +1178,27 @@ char *lsh_read_line(void) { } } else if (c == KEY_RIGHT && !menu_mode) { // Accept inline suggestion with right arrow - if (has_suggestion && suggestion_count > 0) { + if (has_history_suggestion) { + // Accept history suggestion + strncpy(buffer, history_suggestion, bufsize - 1); + buffer[bufsize - 1] = '\0'; + position = strlen(buffer); + + // Redraw the line with accepted suggestion + printf("\r\033[K%s%s", prompt_buffer, buffer); + fflush(stdout); + + // Clear history suggestion after accepting + if (history_suggestion) { + free(history_suggestion); + history_suggestion = NULL; + } + has_history_suggestion = 0; + + // Update suggestions after accepting history + update_suggestions(buffer, position); + display_inline_suggestion(prompt_buffer, buffer, position); + } else if (has_suggestion && suggestion_count > 0) { // Update buffer with the inline suggestion if (prefix_start > 0) { // We're completing an argument @@ -1301,7 +1357,14 @@ char *lsh_read_line(void) { suggestions = NULL; suggestion_count = 0; } + + if (history_suggestion) { + free(history_suggestion); + history_suggestion = NULL; + } + has_suggestion = 0; + has_history_suggestion = 0; return buffer; }