From 1c7d2a7621579a713bea68037c6b7a6fbf879b2e Mon Sep 17 00:00:00 2001 From: gunboy001 Date: Wed, 27 Nov 2019 12:24:24 +0100 Subject: [PATCH] basic search and naming --- .sconsign.dblite | Bin 3019 -> 3124 bytes src/fbuffer.c | 8 +++--- src/fbuffer.h | 12 ++++---- src/ste.c | 67 +++++++++++++++++++++++++++++++++++++++------ src/ste.o | Bin 12880 -> 13248 bytes syntax/stes-c.json | 4 +++ 6 files changed, 72 insertions(+), 19 deletions(-) diff --git a/.sconsign.dblite b/.sconsign.dblite index 3d0adeb7cb5654fccc554685063d4be021ff8d6c..36752fa24ba3d3841c0d0260ca49aff2ddcbb27d 100644 GIT binary patch literal 3124 zcmcIm%W@M(6g9RCwq%>9!MuzB12PXWPt6RE1S4$l6RIq$-#M1NO%!tTZSq&aGwVYMV@6&*Q@^9Ki1n2^cQ;!>!sDYqo-|ZOASh$^22} z@{kN^);1vL=RJ!Cj_ukkpeE5=M!HgHZ{)+X~`@_EHZ3cr>;q;>jWjZ$VZny zOteEj#$}090xlIe7IxVmMW1gbhy<<#9P29-{1JIS@f@am|Bu5}f9NJEdUJyixW+h& za9wf4x^M7PeqIj^R*E7oatVoaomn=a5k)G*a+%FSC~}nGWz20 zR`NGUeyTjTH1lu`|0Wmf<#PG)GXCVJ)*kz-<=HjxINEzlak(wvj^y$~sv5)AOy;_d zM;$$gG~4nlQzx`Usi&2grommT=J)Y-81!}sR~_<&fG^V>a!ptjgJ5K1(cQl z52V|((!ROGzK8tOiuC4@q&(k?M-<+IfW~|?za^Ij}_h%iT70EttNPD zFu&c4A+vPL3rv%0W<)&;*MQ?iflinm1Yra( zQN3Ty-R^%S;I(2?^@nAbOEdy+ROhc3_%y%DJ1zY-;TXu44kH`eIj|#Fvuw)ne8V;H zd>x0?jWhzGl#LX)#tm*W?sDZiRjxAuk>q_W#aoL4PuFbbnStw37V0Mcu>xWeJ8(6e z+70AA=_IZzRS0xEuL<}%t;;t8Hha(K$+u$8$?| zKfmYrj>hYMEFR({0SYC74PT{sa>W!zrpF~3aen7U=Tfkzz771P$O$TM`)Feud`11|8~^4piV zQ!uHp#ESx^3LFc&gq@o#mBz>U+JGxe#x9Dno1W8Z?_5=*h&5j06Mo)sEgP3j$Y@B6 zkm|09ao{k+@*K}2h<=@8xi{2iDGC{*scb{`dk%-jbMaUNaklCH+|<(i%3?a*)QvdZ z*4I~`%v2ujMp}MqeQEywgZb6uIet=?V8}Iyfh~jA5@7eNYb3Ylx-Ox#YF*0{909I8 zVfS?hPuTNy$HNok>kd=)k9NnWxcyEw!Yu)}(~WRPz+H)wG&)x;9(&u#SM>It^lnD3 z&-;m8Wj?VYy?7vto>g#zWRnGT1v4k$VH)O{DOQE#kXHjM2$d#8{FT%MxQH z!FU{FJdqerI~bkJT2&}(0xD?~U%<023hG5Id=(_r!<5oOL$jFYYWS+?G7`C#;V^iP h^>(?uP#KF{UP>;nB$w9-muk%AjpVW}xwMPz;=hSQ!UX^T literal 3019 zcmcIm*>V#{6g9RCwqyYY48~v(Ac)xH*%y|8Eo@`U8+eZbhl=t5m50{s$BMH#_DtKIrrW(Z-yBhD|jQVLsb1| zbZF>J_wyKPHb{N9NKvKKY_y8GPy0SdLycVWUywd&tt$d+Gq0&g^s;3q!- zzR;=fgK;t~fTqN><1QAk2g1sM)DaR76ai=Y%_Nh$+PloZ=cGjxJV zVHG{P$unpq5Nal*C6 zFFnl&(G82(hGO}qk2RIkGBm?+k>;wdYdGN0?5gr$a;OtvFD1ML*R%4aQto~;m#@xm zFE3Ve_faliT3VZ5uJFI{#ZIYI+Fa*9xqM~Q+b%6u-~r_ZKa^Y^F?cMv{5adM##chc zFdV~n4NVV16=UKeLm{rEYQABs@G-CE=c!KM5B3O^9rA?1(`1LtGguhZi}uv$`d?!3 zO!~hl++Gs)Eywmfr!yPEn-xKMbr26hSt716SWhBuFxVWdiN=hhj@x4JLLzPp#EL+y z#)w{o_=!OLR3eVH+PK)1Sf4TYJc;#^!50GS&$qwzywp_PFtM!$mf|`tCYI0J9&04P zDki3F!$5^qolGcNtK@`-eaJyos(7oilW8I|vAJ6{6}P zR%~6d+%R+Vf{@}SA!KvoUHgG1p#E3U5{ zdC(CaycQmGie5^LcomLCG2o4eX&*i!0!H|}r5KF969LEj5pd!ITeu$qWBmK$4AKJ; zkm-)DIHVf^6JGAf0nSDda55U>I0a6906&oer#XR124|8faJB~Lk|{7%gY$_LxKM*> zD##6_z{MKO^i$x{dns_a2D5`HaHR%Uh4!tYcdS@-Q@#96SNJM!wGTU}eT4k~Qv%xI6a)9>ji^&Uu7 zK8=^EoHBC3* z2Fc4er;u= zoJ=@*BTBfPo$amp>hoT#{LRY2h&YC3V|YR{W&T #include -void bufInit (buf *b) +void bufInit (fbuffer *b) { b->rw = NULL; b->rownum = 0; } /* Add a row to the file buffer */ -void rowAddLast (buf *b, char *s, int len) +void rowAddLast (fbuffer *b, char *s, int len) { /* Extend the block of memory containing the lines */ row *newr = realloc(b->rw, (b->rownum + 1) * sizeof(row)); @@ -68,7 +68,7 @@ int rowDeleteChar (row *rw, int select, int pos) // WIP return 1; } -void rowAddRow (buf *b, int pos, int cur) // WIP; TO DOCUMENT +void rowAddRow (fbuffer *b, int pos, int cur) // WIP; TO DOCUMENT { /* MOVE THE ROWS AWAY */ /* add another line to the bottom containing the previous @@ -152,7 +152,7 @@ void rowAppendString (row *rw, char *s, int len) updateRender(rw); } -void rowDeleteRow (buf *b, int pos) +void rowDeleteRow (fbuffer *b, int pos) { if (b->rownum == 1) return; if (pos >= b->rownum) return; diff --git a/src/fbuffer.h b/src/fbuffer.h index 2bdfd8f..da423e7 100644 --- a/src/fbuffer.h +++ b/src/fbuffer.h @@ -19,21 +19,21 @@ typedef struct row { /* Rows structure (or file buffer) * defines rows and teh number of rows */ -typedef struct buf{ +typedef struct fbuffer{ row *rw; int rownum; -} buf; +} fbuffer; -void bufInit (buf *b); +void bufInit (fbuffer *b); void rowAddChar (row *rw, char c, int pos); int rowDeleteChar (row *rw, int select, int pos); void rowCpy (row *to, row *from); -void rowAddRow (buf *b, int pos, int cur); +void rowAddRow (fbuffer *b, int pos, int cur); void rowFree (row *rw); void rowAppendString (row *rw, char *s, int len); -void rowDeleteRow (buf *b, int pos); -void rowAddLast (buf *b, char *s, int len); +void rowDeleteRow (fbuffer *b, int pos); +void rowAddLast (fbuffer *b, char *s, int len); void updateRender (row *rw); diff --git a/src/ste.c b/src/ste.c index cc8faa3..3a14fa1 100644 --- a/src/ste.c +++ b/src/ste.c @@ -12,6 +12,13 @@ #define STAT_SIZE 128 #define _XOPEN_SOURCE_EXTENDED #define _GNU_SOURCE +#define SBUF_SIZE 2048 + +// Search buffer +typedef struct sbuf { + char c[SBUF_SIZE]; + int num; +} sbuf; /* main data structure containing: * -cursor position @@ -37,9 +44,11 @@ struct term { char statusbar[STAT_SIZE]; int pad; + char mode_b; + sbuf search_buffer; } t; -buf rows; +fbuffer rows; const char *msg[] = { "Find: ", @@ -73,6 +82,9 @@ static void handleDel (int select); /* testing */ static void updateInfo (void); static int whatsThat (void); +static void insert (sbuf *buf, int c); +static inline void flush (sbuf *buf); +static void toString (sbuf *buf, char *s); /* --------------------------------- main ------------------------------------ */ int main (int argc, char *argv[]) @@ -124,9 +136,19 @@ int main (int argc, char *argv[]) case (KEY_ENTER): case (10): case ('\r'): - rowAddRow(&rows, t.cur.y, t.cur.x); - t.cur.y++; - t.cur.x = 0; + if ((t.mode_b & 0x1) == 0x0) { + rowAddRow(&rows, t.cur.y, t.cur.x); + t.cur.y++; + t.cur.x = 0; + } else { + char *query = malloc(t.search_buffer.num + 1); + if (query == NULL) termDie("maloc in query allocation"); + toString(&t.search_buffer, query); + editorFind(query, &t.cur.y, &t.cur.x); + // Toggle mode + t.mode_b ^= 0x1; + flush (&t.search_buffer); + } break; case (KEY_END): @@ -138,16 +160,25 @@ int main (int argc, char *argv[]) break; case (CTRL('f')): - if (!editorFind("for", &t.cur.y, &t.cur.x)) { + /*if (!editorFind("for", &t.cur.y, &t.cur.x)) { t.cur.y = 0; editorFind("for", &t.cur.y, &t.cur.x); - } + }*/ + + // Toggle mode + t.mode_b ^= 0x1; + flush (&t.search_buffer); + break; default: - if (c == KEY_STAB) c = '\t'; - rowAddChar(&rows.rw[t.cur.y], c, t.cur.x); - t.cur.x++; + if ((t.mode_b & 0x1) == 0x0) { + if (c == KEY_STAB) c = '\t'; + rowAddChar(&rows.rw[t.cur.y], c, t.cur.x); + t.cur.x++; + } else { + insert(&t.search_buffer, c); + } break; } } @@ -558,4 +589,22 @@ int editorFind (const char* needle, int *y, int *x) *x = i; return 1; } + +void insert (sbuf *buf, int c) +{ + if (buf->num < SBUF_SIZE - 1) + buf->c[buf->num++] = c; +} + +void flush (sbuf *buf) +{ + buf->num = 0; +} + +void toString (sbuf *buf, char *s) +{ + for (int i = 0; i < buf->num; i++) + s[i] = buf->c[i]; + s[buf->num] = '\0'; +} /*--------------------------------- testing ------------------------------------*/ diff --git a/src/ste.o b/src/ste.o index 75c6d5d0a90b9b65a5a45a455a4483dfa2ad336e..e57b5f7c2056d2aebe5034163e71c1b1a2f93ba9 100644 GIT binary patch literal 13248 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