From a8907ffff4e7fb99925a23a6319d65ad8f9b67d4 Mon Sep 17 00:00:00 2001 From: josuah Date: Thu, 20 Oct 2016 19:41:01 -0400 Subject: [PATCH] Renamed to iomenu. --- .gitignore | 1 + Makefile | 8 ++-- README | 14 +++---- config.h | 1 - iomenu | Bin 0 -> 24944 bytes iomenu.1 | 4 ++ complete.c => iomenu.c | 97 +++++++++++++++++++++++++++++++++++++++---------- complete.h => iomenu.h | 35 ++++++++++-------- log | 0 9 files changed, 112 insertions(+), 48 deletions(-) create mode 100755 iomenu create mode 100644 iomenu.1 rename complete.c => iomenu.c (87%) rename complete.h => iomenu.h (63%) delete mode 100644 log diff --git a/.gitignore b/.gitignore index 659e381..6854b26 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ complete *.o +tags diff --git a/Makefile b/Makefile index 4cab28c..c1a6eb4 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,9 @@ CFLAGS = -std=c89 -pedantic -Wall -Wextra -g -all: complete +all: iomenu -complete: - cc complete.c -o $@ $(CFLAGS) +iomenu: + cc iomenu.c -o $@ $(CFLAGS) clean: - rm complete + rm iomenu diff --git a/README b/README index 8d2bec6..5b98770 100644 --- a/README +++ b/README @@ -1,9 +1,9 @@ - ,--. | | - | ,--. --.-. ---. | ,--. |-- ,--. - | | | | | | | | | |--' | |--' - `--' `--' ' ' ' |--' ' `--' ' `--' 2016-10-18 ----------------- | ------------------------------------------------------------- -Filter lines form stdin to print to stdout using user keyboard input + * + , ,--. --.-. ,--. ---. , , + | | | | | | |--' | | | | + ' `--' ' ' ' `--' ' ' `--` 2016-10-20 +-------------------------------------------------------------------------------- +Filter lines form stdin with an interactive menu I will hopefully write this in ANSI C some day... At least I really wish I will ever be able to! @@ -59,7 +59,7 @@ Description of the features I will possibly implement. categories at the same time. -l LINES - Number of lines to display at once. Default is 10. + Number of lines to display at once. Default is 30. -b Display (and update) the prompt to be at the bottom of diff --git a/config.h b/config.h index 194a049..241ca94 100644 --- a/config.h +++ b/config.h @@ -1,2 +1 @@ #define LINE_SIZE 1024 -#define INPUT_SIZE 1024 diff --git a/iomenu b/iomenu new file mode 100755 index 0000000000000000000000000000000000000000..8c0af0c4586be626f794b7467c7a6bed4cd31f6d GIT binary patch literal 24944 zcwX&%Yj{*ewrK5sBs)nbX$XN3UQHkfYSQ7A6Gfy0Gc~-NPR5JcF^EwSqawL$)noVG zo9=VZeBb@fFAB1&)~fZYRjX=O)!x0k+>Ogjl0-x@k*f(pu6!4TT^zrEwMqiGI+6$1 zX~aQt0JduAT*Rfzhq-8x%bd;(e-`+wGcmZ%QOHnCSnZ)3GCb@L^QBEgv!FL1j<&gh+vh(~#t}mNkWNyF6ML#&hp_bZt&TybA9Ev11 zRBfoMt*V_@9gkMep*Gn$?KRgmQ+nY?2VpjkAuI;4evzZK%Qy7VU;f%KeeF-LxctF0 z{T1&aeHlsj8&^!NK>QV7^oY>NnD)cp=nVMEEci)T@C8}$Rax-2Wx-#a1>cngKPLyw{krhg<0zA+2FEDL^I7X0We_^ny+?kxB_vfwws-zYMk z^w+GVuo%At;@gkmTub6g%-^|@1UG~f(i-gyMi3M6cXYBGsyY)&oV2zD6+gYku_Daq z;6G9P@u1>UpwtSKK;sWb<3ZBl3x}hA;`REKjh#Vnix;7|5(vg(Boy^4VbZ!j7E*%1 z6$?d_R*=)i<#@elo;R-eVv4uJ7mAS9STIPO?a_{)^Nwgd;cItRgE(Ip$LW>X@F1tH zBO2jyyyTk3hQ&*~bE@a6r8(8}(HW+!|1PXEQ>+A69I|4bDG7xNam0Vcaf$L!9`cUx z`XMLtKaTYRl1{@Ke31q(`U~#`Wg2`L$LEstT!qP@!K+g|q?sDLS%a_9;Kdw^sZN8} z-iKToymlV;Xz;lje3J&R#vG*88hoAxzgC0K*WlYVc$)^_slgX&@EbJvVhw(?1~2*y z(>4u$lm@?3gV&C$JsNz82ESK>AEUuPt-+US@cT9Ru^RjV4St*k@991zdwQ&umpF)L zYp-G&>GO0Sm0u+z^D6)~QaK&2#Zz2RLbx4S2Kq-JRhA=+p)$}%;n4_Vhz#^nI3HmQ zje-3XHX)25F|e1y-_8ISLt$Vig}*=;LttPtg+DtKGpCgQ2Juq}0;inL` z)Am#NpAa5J+fU(#5gtw3PvM6UE}`wG@cjsnq3s8F_NNWWKi=+1e&FdoIn=bO;aKn9 zi7w(fcBF=8$CL@+^U?<@9pp^$6jaeDG3$3fuK3%*|8OC z4-sn2vDAy-1L@Y@#4||m>Df6G@mNgmbU^X&Ot3QbYa~j(!trH-q-QfN9wQ%P?`bhE z*?>CcqSJ&9Gsb`c^Pu=JwIJE#$XZi|HLt%)z1n@M#*^H1!jnw&F;nxYskE(qKnFE{ z#%B5%dIjsZv8p~mCyqd*VXyaELL9;sf#?m)%L^+K$fF(StvrW3I%wBnj%RUT+& z$R3x>8}u;99JEnn+S|jbS6twgR5EeWlWYckEBYFf?&His1K(wI(6i?Sno4x=zQJ-C zFQ(%sv6lw1kB&10?MYO3ocCSYN(WlWSU0oIr3R#q zx#&%Fu!+{~Xp)&nsG&=s0tVP*L_rKm+_oNRvdJ=7z-!f3^tc>Uc=x7Zl6YpP zYJnXr0LcmL{2>&7$G7P&=#d$gcH$_gfN_$005uL;=}0#OA@AEuP{fgbvj@Wj;Pv0~ zvCIcOuNWs!8fAex6*FmsmiDC@RHJb9lPlL(*VL1|)*r{kb@D|K{oL0ICUT zs#j?2QMt!K?lu#!3`>HK+SvUK*tEbsT>RjM5u7VD3aC5vElVceN;dZ$bD!bkMLua@XJxwqHTHQc&=o=gZ$z!x*QeO^(4)+Onab7sxTe z9yzt(oAhKnc$ufC^xG*89J;Br`-%_sLg+!ux|mFfc@rZOkXH^fN3N55+-DZJ`|ddi zIZh7l;lW9u_va`t`PyL|P^pDF2@s1j*9*3{fcD-g8Qc1kVS|k~F&q0c*!bSpdK>%E z#z((4+6c-|CP_4xD9@&Hc$0?|axlcJP7B z!$kypC0g6#8Ute&&495nXofrq-eLo^OdX&~L67_7W$yk3?lWDlvmsmPNzW347RrGh zu1^cSRI45%`;p$_=a2U^qglgj2+#T+okItKenwC(hu~k}K6%gn!3uEA*-1v%*wHn` zUo&=2`{$jnXYs?1=Aj<<`-e(a5hCJo8g-@hu}Lf%aKV;x04?Qtp}PT(mvEr!6@v_X#Krc=k<=cwbcMbk64XyI9G(K(6T z(iXVSb^UKBGQFQqH0pigD>VdQHM5goH@}S2NAlMSP9i&+dwaIh5)H+jU*UwgG5@dw zRhe_?%mHEQ-t579L(;tsa=7iecd|*zy@$n`doS~Y`)N8QCEfe61KkID+}peRAzrqF zqRmXvA+!rr&HoC$yOmF6pu^5@H!{7;C2^9#`yk$an)}%;31+-x(@c8bPd3%SohsQ> z$7QH)?1X-OI+@s)Y~Gt(@fcg4-H5F@d4}IDcYt-xkFhTJKhSN1r9CSi>uKKGlh_B= zKaJ=U-_ubfLW?%}TDEqRFgDO_kI46HWM&g_59B@;10%z}wy;7VQr zw?29^nD`~Gd{S^5bkjR*(tU1lH1Fziub#FRHHaJtiM{2z3^7`WE zfxv_Ql6rBTdw~?c&|8TIPT;cNX!Shz#owc+_3zN5{6;j;1H*sdW=Y?`1*n)U5BpzR zYEQeP9H}o8)VK;j7nW-frHIJWAU=lCIDoS}jK27I<8AR)jJxe$@EMuUbL=+!=;tFN ztYZ%2IDL>35ol2JDUb9gTwL%LxoC^7)HdL*&qvt87zYMh0^owH_<8p!ST`VoEvxjc zyXvgY4mtxT%0%sUl5Uh!l(m#&8Aj|R`uS#qF0FW^rx%9eelj@IqrFk66Tf!tiL`@- zDjlf$t+-qLCjuS+MS%{TK(@#}o=hA~FN}`EGL(hj@gBl<5yyq6|M-x zniJg}NAc#uR}T)V^~K-4$&%;m4{(=oBxS~0c8|w9zudUwv-EP~DBiEn_pT zeEu0~sR;pQ!ifwf44l@RK$o}sPG4YxXb~>TO2@L>umgw7(^>(X{5>EVDs_;a6{p|^ zap+F%ZE(+NYVsdTjSc!CHt3Vn={3`#PuU_B%m4PNb{1#bjvniF6atZUD52F*3o;I) z$kg`J{PX~VExGAUnE89f?g8@DM<J~^4-GOM3jf=5yG9>qjm1_F}q_r+Sk!tVCx z7P#NM_l$=xH`aV6rU14D^1}Slv*LYqO+t~Qzs`Vsdzda%ptR*{J_Wu0YWno0b!Yt# z>Tjw~j?_2TuWH;;`TQscY4+@>!hB^z@@zx$?Z#Oj(zCcD-o?+FQw z$xj-SXP1J6kumRkx?hz%SNtXM37*y6x~BfN`Ze{p*Lz>xnb!E_tAw5H(bGJ3u8b*0 zoPppvXIu${A_y<>MI4c+;=uEHM{6h?bhJiej#$tK^=;LJOt^J9{LSvb%YwNz9i;Lf z0uyen>2NT_T&$?+$R~wBm=ER3Kt0jQZ3`+6B^c`nMSNigp23G&5=t=cSRYc_9qPgS z%vsgUE=Ac$MbXREs3cA*1J23-loF&eo=+}y5NU#WK`&wFn1R8O5gSCvQE=J&0KW*) zH4k7rbmc0@XTUgCAb%6`MFMdb@FojbjPaGIs?cQ5$qCZww`vOi#2QkY}DK>|^PM;d z7+F7uVe~VisW&}|)wF&e{MCTp@7L9DQtOYx-@{OUjjn#NT7MG$egpOI>gwNC>n&hc z9QtvrNoSu)*f$;OL(reOT7D*;wIAx6pkCIs&zx>Q;Ok&Tv`eRdyQ+T+)IS6DeqH_T z>GnhYDX2fGtN)L5`=Ne6#Mf?J{g2Y^hx%y{cc19m_o3Q83*bM6xVu5e->C9Whx*CG z+3S}={q<0PrB42QRek{QA&BR>T7JS3Z9mlC1NHlL^8ba($Jp8j^<@zML9Aa~WdBFg z;-a!2ncYQ>9hSvKGq+nkMKurPc#7(}b5|6(VnucJMK$$BGZz;*fDY&v7s)ivPk|g4 z$k9G;x|lAei|Jyzm@cM^>0-K=E~bm=V*2k+_5v5phxmKmB1wi^yd(B&o{M+Pj>|5Z zi+9WRO=R$R4vY7PCvaH2<5tdd!rz}3FY$`{ug;G|G2dfyQCPfVS7v3f*vIwqdhsq? z0XJB@J1E`>)V@=ONqxtUzegtaX5#&HaXyjDbMcN@Uye(M-^O8Kw}@%${$b9j7?<@pSr*Bathq-&NexzaK7n(LZpIclqCSI>6LshM3{Q&%%b zUo%IonOj3HCn645Z`Sg$aa#K#q$VY8;+;@g>H@R%&Q z{{ta87Z1@)QqCD#XZ;?y%@%7YqClOs7?74Al6T(@A}r^yxCM*A*aMYTIY)ko3eWit zz+5cLmIZLlcYX=iyhCW8lxN2}ri2|z&@oKe5c!a*T@CDS7BOL{xy>L7#mnF2e zv+xAg*eIYB{sP@wB;nc5hQfZV87<92-xT7plC?x?0O0;Yd_mGWMtTEq-Gy6`r%ZYm zfNh2Q5tu4<0>REgJfgDBlI{m!PhmX*mr`JFp$CD>DDZUQ^$1)}f&GOyAy6%0KOQLD zgN8b(ZM}s#=#JS^zX{JEi*V|+K3afJf6J_oVIyr#Nd3?Bk%0|E)cQC!SGK)`q)(v` zJIRrE04_(y4lKsNL9^|56HGZWb|u9Q32X@&)dWo%-G{OlNQfW(IhL~ zc;r}eE!0|mj+#qe2iWp2w1`f$`~r&wN1!O@OxOfsZ4Uu^&LpfPw(GDw8OtWyeIO)f z3T3jTfH22_Cl-J(n;%EVgzmHl{$TfkD#OJX*iD{wI zrXY!(NprkUCF8q!c@-aU$-AlP+fY6V&6|dZF}K5|&XPAX4t}=%3h}d;f)i-&r9Ytk zG#BxgBZ*v!9h6r^6^-cfHhAc9)65*oo#{`@6=6h;%8fHSG$QPeQ4enUK-6Yi;=s6mz+0 z3$0yUj=q{zq z36x_;N}qCYZ8`R_bee;=m1EaRpGmBlP35!DLqi<&kjeNAPI_B1^DBDhqbl>bDE3{H+Ie>=6Yz=ZlmQSh@y_5z zq}KxmJzZtA?{DVb zex$4HS7r^ovuh&leF1OpDvx7RZk13L_QyJO@$J&%W~|=Z1<`RHD95#+4T~t+!tFSz z+R=-TM5x?FT<*zxnV@dzA%nI`&*Nt(u)S22GGu!)&1z{c_GiBu`MXq>MllitKO5J?`* z^vIIX^RcRj==Bi29sxG7K_I|J7CCWw{4^q6BE zR=hk|%qqsJ;dT$~My68vFEjC;sW`t$FEf!#r&3cm*6Qbnx=pX?LTKe#&)_>G&3=v>Oe0 zqlihpMwMzW5K?z@r%k1^!EVOAmN+g$VVgXh^L~}{TI8gCwTXAtG%BY{jNa)un@fHK zpDJYBKU2AnsN8;=3Ra3r%|HGT+1}-gem-vQ_%`49c3ixoASsC~0)A zeH`GYlY)Y)0R_T%5vVO=iMi;?f&~Q)C9q&C20Yy7F+(_a2Ek0WNC+d91Yq7wV8NAD zJ}m%4L5XB8Dku;Hwn9~A9n=2@|0OsB_`OKj|UZU z8Z4iutDQgv$xM(=4ERFJH%Y5eM>zSynxC+mDb3W4`JPQv6p3_+!C8Wd& z#e_pG&Njc_xuLGsTRX3+)6ahu-WEwX>1JE-5Ul`0LeY+3BvDOoK=>orcy&9fi7SCX zuocQCS`I~_Xr@2O6-D~{*eVSReK#k{fkY$(Y=V-iXh#+Fhqeq2!EF+w(p)ad)4Jc0 zYZ6a6KQvutmwV+~<%B#{cEaCOd6)d~^4c%ok=tPRF6F=m-C~kQ!`1RcJEhyiKm$#|D)j5aOA!JU-k5k0sIp$({^@-*4<%$GYxJZ7p4Oo9G ze|%k={3hyuf*LVGiFd-)EIV=@MBFcF#e#H&lJlVa+iWZk$Zs4xxMaCG?<#ruhl%x0 zTKNk!<$k2TiZ*`X0p^sP{b}bM$C_(t^$O=NO*2YXnD2U#lbQ4HSKB8aqsVJ>wxW(k zd7Zpa-YUN%FJJU5ny`!7A!zo??<|$?mJ?5zt}fXv-(p%?@)LQvJXo-%^vUjnx60@*3+)Q#LbS!)nqzW~l@nR3Ub;;_c<@&Ex8~q&^6T==Pns%9z@X)F z=}Yp|gD*qh+;;Q)?vI=={qnV6VckG+RFUbe@ebn8ZNXQ{1rYzF6ImxdM$}8l?y*Hao zFm%JdxIzL^Z)YsH&I_Y5NWAg(XiRBIv=VQ__4uRnJG}~_KQRZQXh)|aeuR$IK;{ib z0<=tjjZPtdIOvOcmDPiEl8|wN{Bp$jeh(<*d3N<9|TgU8RqaIYQ z2hIfWsS^sd-RHkE(Fs{R2>L?t&R`H5vN9Z9AB5K7TY`}&@%y3qsKJZES8fP|+CoeX zzCFmeeX%zB)BF&$7Tbrv><>lSNF%mRycXz<2dSrVzrox|8^1p8-Ow4@5DarRSd!#L>ctep+?jTM8{_>_B#@Sc; zBT6hxs5e-XS&QR|wzgoLBI2DsKahGmeSz65o5QlXEStx&`QTM%;yT6G5)ML_wxSPU zVef4Xpwrgj_dOg->aH*xxjL#kltd)Buq_w~#zKAoeKCLgLiQ06M^&4n3anq~zoJI} zNrR?X^p2oki8~=oI>SMQHm5TY@oV~v1?x)cYeFO4fu#hYE2M^-A3Y#h6BQhLJvuF27J)@ zVz4!=^o2XyeXKzkgS7YJ7-kz;n5lyO?LM$3jw9Xg^-~jr8#;Xv=yqRAToYIraoB1v z70Tnt!{W3x6oa6ErYJZrK?{s?W(72tEM^Y$qSX*gFsj)o;{y}ggS0JSU*t~YjYZe< zKGC(Fe!+sz1Vo7{KF|QhhiG#Xot;6PFZ_PZsEYGh2jUX=(56I3L>u}re|ec%wev8_ z6Olwbh+)jJ+H{&yyL}6m=$72E0lAo{t`HCQ3%UMSZTN$6M9sS$ceq`rJ#8 z&&~L}$V_DQIg=irr#`RJhWcyHzPj%eHlHz zoMcL7^{J^5KapfgW-=)YesUK4lnZdUz_*akM~ETGS@0#4=R$uv2<{yUNv9zmDmZ?> z0Y9JPjnAQ%6O=!mq`2Ss#+lqg%NO?VeT2yo&$UIO+w2T+@(c3!wHKd%OAv>hQ(Zdz zt0c1@FlCbS2YMZSf&KjiBr@CXAH}$IC-m=pWC5-_P|L4+>wB&^u+M&mjL*PH#NC z`+XMqPKv*99{V5*{aG&GctCG9F}(4R%x=moXId6~Z5Dh(7JPda{M{zzAEW=baXXD? z>HnBT&OQ?x^TzZ)0YA!AMvfcg_aa_1|64fz4_vSDJnmhNui^ATPX9?3d(Lxu<8dOM zX4qjq88X;&AEy`hFY#Lyd7g8BTutZn#v}UK9B+K`RLk+kGx#Ou%L++Eb zzb;&#oaXe#M>WG)?6Fxg<0~y$z6TeIgcR6U`eRC5fkiKFF}>F=xzXF$uyU2xOJKnn zYzxJ4|Dbeu{jkEvHL4f3gKgnx3v3PputuuOsLUBsw}^pWxL%UbIX{n%)F^m)%&u!tHfmx76$9_KLEO3s&h%Z@#X6 zMZ*$(4gD}2pkNp0b$hrp&(a%-_nOA*7uPp>uV1!orF)fkRsCYv5sA;z`Qr&{Km913 z%ccF6obDike?Cu7q1~79@9gOb*ys54IQ#&g0i)e21Yrl|)9%UH7x*ra3;V!KQuwKe zZhJ@%APtt|2LKHy{NA4)b-}0mE))_sa-jLVFZlTa|0JN1Q1>-I;EPAS?Xceqvtt8x zWPtl1-T6Yg)3E3HX9@L^)svhHc8OkZOFYhP(;bAcJ)QQPNd1+hUbgymM1v#nmz;*+ z2?h0MD7w=o{63>W1l`>leY9%D5iEVE z5DK{xV|lwMK~sXUPEs9-D#7ad#SK*oY|$Ci1_QVy5ef&YLIFadc3-@mR0lRjKpx9s z*G_BJ1!M70G@=8%P!|h^eMrblonZx4LKjync!pI?$7ppdN=HX^u$|8;?SWVtVjOHb zU>u@+hd)Nm@O6azpgOA13)8|RLS&F?aiUip2(~2JfY}#mgYm<`P^2}gR<*R?5g>&177jXNxf=o3Df!+WFPPk+~!!43nxh3M04qURUq1PVt? zH_#jTm%`uKk&&q27v~9k4E*A~S@r(K({+TsBP;lOO)j1@cs0-QJzH$M;1}<+;`e9q z@rmFU=M!aIVS&M6M*rbUj3XNR#W}`w{$lSOju-Zu4Eddey;Cb-ao(|-^Ve{^(SDKc zBFv|PU!03<zL!5a2(Mm zWB(_Ko?o2D^mG2T28Y`XIexEK%ddXto4-iiVptRzUxEE6qURU;qJ4beXunyC$!Pyx zq91=^AF!YEziFU1_TSS)&!7H2HiM5E=#BdEeK;+@I9GDFyCi2Z)Go=zkq{|UnE7yRPfLH>X6i-hk2Vc!Y<^!Lme+|T1j^snF- zaqtn*>lf!^Lry)NNJjeyiJo6Qr{Dv(m*|s`AHU0@$nku_I45GV%x1Y!u90?J7XEphe~0!Xz$C-{D+~XTg)Cnw z1_nJv&M #include -#include "complete.h" +#include "iomenu.h" #include "config.h" +/* add abstraction at no cost, but may add more complexity as well? */ enum { FALSE = 0, TRUE = 1 }; +/* preprocessor macros */ #define LENGTH(x) (sizeof(x) / sizeof(*x)) #define CONTROL(char) (char ^ 0x40) #define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) @@ -27,21 +29,30 @@ fill_buffer(char *separator) char string[LINE_SIZE]; Line *last = NULL; Buffer *buffer = malloc(sizeof(Buffer)); - FILE *fp = fopen("complete.c", "r"); + FILE *fp = fopen("/dev/stdin", "r"); if (!fp) { die("Can not open file for reading."); } - /* read the file into a doubly linked list of lines. */ + /* read the file into a doubly linked list of lines */ while (fgets(string, LINE_SIZE, fp)) { buffer->total++; last = add_line(buffer, buffer->total, string, separator, last); } - /* set the buffer stats. */ + /* set the buffer stats */ buffer->current = buffer->first; + /* empty line */ + buffer->empty = malloc(sizeof(Line)); + buffer->empty->content = ""; + buffer->empty->comment = ""; + buffer->empty->number = 0; + buffer->empty->matches = 0; + buffer->empty->next = buffer->first; + buffer->empty->prev = buffer->first; + return buffer; } @@ -340,7 +351,6 @@ get_input(Buffer *buffer, int count, int offset, int tty) /* get input char by char from the keyboard. */ while (do_key(fgetc(tty_fd), buffer)) { - filter_lines(buffer); update_screen(buffer, count, offset, tty); } @@ -358,7 +368,6 @@ do_key(char key, Buffer *buffer) { size_t length; int i; - Line *line = NULL; switch (key) { @@ -367,6 +376,7 @@ do_key(char key, Buffer *buffer) case CONTROL('U'): buffer->input[0] = '\0'; + filter_lines(buffer); break; case CONTROL('W'): @@ -381,30 +391,28 @@ do_key(char key, Buffer *buffer) buffer->input[i] = '\0'; } + filter_lines(buffer); + break; case CONTROL('H'): case 127: /* backspace */ buffer->input[strlen(buffer->input) - 1] = '\0'; + filter_lines(buffer); break; case CONTROL('N'): - line = buffer->current; - while (line->next) { - line = line->next; - - if (line->matches) { - buffer->current = line; - break; - } - } - + do_next_line(buffer); break; case CONTROL('P'): - if (buffer->current->prev) { - buffer->current = buffer->current->prev; - } + do_prev_line(buffer); + break; + + case CONTROL('I'): + /* do_prev_line(buffer); */ + /* strcpy(buffer->input, buffer->current->content); */ + filter_lines(buffer); break; case CONTROL('M'): @@ -419,12 +427,61 @@ do_key(char key, Buffer *buffer) buffer->input[length] = key; buffer->input[length + 1] = '\0'; } + + filter_lines(buffer); + + if (!buffer->current->matches) { + do_next_line(buffer); + do_prev_line(buffer); + } + + if (!buffer->current->matches) { + buffer->current = buffer->empty; + } } return TRUE; } /* + * Set the current line to the next matching line, if any. + */ +void +do_prev_line(Buffer *buffer) +{ + Line * line = buffer->current; + + while (line->prev) { + line = line->prev; + + if (line->matches) { + buffer->current = line; + break; + } + } + +} + +/* + * Set the current line to the next matching line, if any. + */ +void +do_next_line(Buffer *buffer) +{ + Line * line = buffer->current; + + while (line->next) { + line = line->next; + + if (line->matches) { + buffer->current = line; + break; + } + } + +} + +/* * Print the prompt, before the input, with the number of candidates that * match. */ @@ -461,7 +518,7 @@ print_prompt(Buffer *buffer, int cols) fputs("\033[1;30m", stderr); /* suggest without overflowing terminal width */ - for (i = 0; i < strlen(suggest) && cols > digits; cols--, i++) { + for (; i < strlen(suggest) && cols > digits; cols--, i++) { fputc(suggest[i], stderr); } diff --git a/complete.h b/iomenu.h similarity index 63% rename from complete.h rename to iomenu.h index 8eda03d..131eaa4 100644 --- a/complete.h +++ b/iomenu.h @@ -41,29 +41,32 @@ typedef struct Buffer { int total; /* total number of line in buffer */ int matching; /* number lines matching the input */ - char input[INPUT_SIZE]; /* string from user's keyboard */ + char input[LINE_SIZE]; /* string from user's keyboard */ char *prompt; /* specified from the command line */ Header *current_h; /* header containing the selected line */ + Line *empty; /* empty line, for when needed */ Line *current; /* selected line, highlighted */ Line *first; /* boundaries of the linked list */ Line *last; } Buffer; -void die(const char *); -Buffer * fill_buffer(char *); -Line * parse_line(char *, char *); -Line * add_line(Buffer *, int, char *, char *, Line *); -int line_match_input(Line *, char *); -void filter_lines(Buffer *); -char * expand_tabs(char *); -void print_line(Line *, int, int); -void print_header(); -void print_lines(Buffer *, int, int, int); -void update_screen(Buffer *, int, int, int); -struct termios terminal_set(int); -void get_input(Buffer *, int, int, int); -int do_key(char, Buffer *); -void print_prompt(Buffer *, int); +void die(const char *); +Buffer * fill_buffer(char *); +Line * parse_line(char *, char *); +Line * add_line(Buffer *, int, char *, char *, Line *); +int line_match_input(Line *, char *); +void filter_lines(Buffer *); +char * expand_tabs(char *); +void print_line(Line *, int, int); +void print_header(); +void print_lines(Buffer *, int, int, int); +void update_screen(Buffer *, int, int, int); +struct termios terminal_set(int); +void get_input(Buffer *, int, int, int); +int do_key(char, Buffer *); +void do_next_line(Buffer *); +void do_prev_line(Buffer *); +void print_prompt(Buffer *, int); diff --git a/log b/log deleted file mode 100644 index e69de29..0000000 -- 2.11.4.GIT