diff --git a/.gitignore b/.gitignore index fcc1536..5e912cb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,3 @@ ste -dbg -hello -ste.c.* -*.bak -.sconsign* .sconsign.dblite -*.o \ No newline at end of file +src/*.o \ No newline at end of file diff --git a/.sconsign.dblite b/.sconsign.dblite index ac2f137..0dead31 100644 Binary files a/.sconsign.dblite and b/.sconsign.dblite differ diff --git a/src/fbuffer.c b/src/fbuffer.c index c3f6d92..daa7910 100644 --- a/src/fbuffer.c +++ b/src/fbuffer.c @@ -4,17 +4,17 @@ #include #include -void bufInit (fbuffer *b) +void bufInit (FileBuffer *b) { b->rw = NULL; b->rownum = 0; } /* Add a row to the file buffer */ -void rowAddLast (fbuffer *b, char *s, int len) +void rowAddLast (FileBuffer *b, char *s, int len) { /* Extend the block of memory containing the lines */ - row *newr = realloc(b->rw, (b->rownum + 1) * sizeof(row)); + Row *newr = realloc(b->rw, (b->rownum + 1) * sizeof(Row)); //if (newr == NULL) termDie("realloc in rowAddLast"); b->rw = newr; @@ -29,7 +29,7 @@ void rowAddLast (fbuffer *b, char *s, int len) b->rownum++; } -void rowAddChar (row *rw, char c, int pos) +void rowAddChar (Row *rw, char c, int pos) { /* Check if char is valid */ if (!c || (iscntrl(c) && c != '\t')) return; @@ -49,7 +49,7 @@ void rowAddChar (row *rw, char c, int pos) updateRender(rw); } -int rowDeleteChar (row *rw, int select, int pos) // WIP +int rowDeleteChar (Row *rw, int select, int pos) // WIP { /* Check if the character is valid */ if (rw->chars[pos - 1] == '\0' && pos) return 0; @@ -68,7 +68,7 @@ int rowDeleteChar (row *rw, int select, int pos) // WIP return 1; } -void rowAddRow (fbuffer *b, int pos, int cur) // WIP; TO DOCUMENT +void rowAddRow (FileBuffer *b, int pos, int cur) // WIP; TO DOCUMENT { /* MOVE THE ROWS AWAY */ /* add another line to the bottom containing the previous @@ -83,7 +83,7 @@ void rowAddRow (fbuffer *b, int pos, int cur) // WIP; TO DOCUMENT /* Get the row length at position after the cursor */ int len = b->rw[pos].size - cur; /* create a dummy row as the new row souce */ - row nex = EROW; + Row nex = EROW; /* allocate a buffer */ char *s = malloc(len + 1); //if (s == NULL) termDie("malloc in rowAddRow s"); @@ -111,7 +111,7 @@ void rowAddRow (fbuffer *b, int pos, int cur) // WIP; TO DOCUMENT } -void rowFree (row *rw) // WIP +void rowFree (Row *rw) // WIP { /* Free both render and memory strings */ free(rw->render); @@ -122,7 +122,7 @@ void rowFree (row *rw) // WIP rw->utf = 0; } -void rowCpy (row *to, row *from) // WIP +void rowCpy (Row *to, Row *from) // WIP { /* Free the destination row (without destroying it) */ rowFree(to); @@ -138,7 +138,7 @@ void rowCpy (row *to, row *from) // WIP updateRender(to); } -void rowAppendString (row *rw, char *s, int len) +void rowAppendString (Row *rw, char *s, int len) { /* reallocate the row to accomodate for the added string */ char *temp = realloc(rw->chars, rw->size + len + 1); @@ -152,7 +152,7 @@ void rowAppendString (row *rw, char *s, int len) updateRender(rw); } -void rowDeleteRow (fbuffer *b, int pos) +void rowDeleteRow (FileBuffer *b, int pos) { if (b->rownum == 1) return; if (pos >= b->rownum) return; @@ -163,12 +163,12 @@ void rowDeleteRow (fbuffer *b, int pos) } b->rownum--; rowFree(&b->rw[b->rownum]); - row *temp = realloc(b->rw, sizeof(row) * b->rownum); + Row *temp = realloc(b->rw, sizeof(Row) * b->rownum); //if (temp == NULL) termDie("realloc in rowDeleteRow"); b->rw = temp; } -void updateRender (row *rw) +void updateRender (Row *rw) { /* count the special characters * spaces, utf-8 continuation chars */ diff --git a/src/fbuffer.h b/src/fbuffer.h index da423e7..8ad3053 100644 --- a/src/fbuffer.h +++ b/src/fbuffer.h @@ -6,36 +6,36 @@ * and difference between render and * real size of the row * Utf-8 continuation chars */ -typedef struct row { +typedef struct Row { int size; int r_size; int utf; char *chars; char *render; -} row; +} Row; /* Empty row initializer */ #define EROW {0, 0, 0, NULL, NULL} /* Rows structure (or file buffer) * defines rows and teh number of rows */ -typedef struct fbuffer{ - row *rw; +typedef struct FileBuffer{ + Row *rw; int rownum; -} fbuffer; +} FileBuffer; -void bufInit (fbuffer *b); +void bufInit (FileBuffer *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 (fbuffer *b, int pos, int cur); -void rowFree (row *rw); -void rowAppendString (row *rw, char *s, int len); -void rowDeleteRow (fbuffer *b, int pos); -void rowAddLast (fbuffer *b, char *s, int len); +void rowAddChar (Row *rw, char c, int pos); +int rowDeleteChar (Row *rw, int select, int pos); +void rowCpy (Row *to, Row *from); +void rowAddRow (FileBuffer *b, int pos, int cur); +void rowFree (Row *rw); +void rowAppendString (Row *rw, char *s, int len); +void rowDeleteRow (FileBuffer *b, int pos); +void rowAddLast (FileBuffer *b, char *s, int len); -void updateRender (row *rw); +void updateRender (Row *rw); int isUtf (int c); int isCont (int c); diff --git a/src/ste.c b/src/ste.c index 502a62b..13d6098 100644 --- a/src/ste.c +++ b/src/ste.c @@ -13,7 +13,7 @@ /* defines */ #define CTRL(k) ((k) & 0x1f) // Control mask modifier #define STAT_SIZE 128 -#define SBUF_SIZE 2048 +#define CBUF_SIZE 2048 #define MODE_MASK 0x1 #define COMMAND_MASK 0x06 @@ -26,10 +26,10 @@ #define MODIFIED 0x80 // Search buffer -typedef struct sbuf { - char c[SBUF_SIZE]; - int num; -} sbuf; +typedef struct CharBuffer { + char c[CBUF_SIZE]; + int num, cur; +} CharBuffer; /* main data structure containing: * -cursor position @@ -56,10 +56,10 @@ struct term { char statusbar[STAT_SIZE]; int pad; char mode_b; - sbuf search_buffer; + CharBuffer search_buffer; } t; -fbuffer rows; +FileBuffer rows; const char *msg[] = { "Find: ", @@ -93,9 +93,12 @@ 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 pop (sbuf *buf); + +static void sbInsert (CharBuffer *buf, int c); +static inline void sbFlush (CharBuffer *buf); +static void sbPop (CharBuffer *buf); +static void sbMove (CharBuffer *buf, int x); + /* --------------------------------- main ------------------------------------ */ int main (int argc, char *argv[]) @@ -133,7 +136,17 @@ int main (int argc, char *argv[]) case (KEY_RIGHT): case (KEY_UP): case (KEY_DOWN): - cursorMove(c); + if ((t.mode_b & MODE_MASK) == NORMAL_M) + cursorMove(c); + else + switch (c) { + case (KEY_LEFT): + sbMove(&t.search_buffer, -1); + break; + case (KEY_RIGHT): + sbMove(&t.search_buffer, 1); + break; + } break; case (KEY_BACKSPACE): @@ -141,7 +154,7 @@ int main (int argc, char *argv[]) if ((t.mode_b & MODE_MASK) == NORMAL_M) handleDel(c); else - pop(&t.search_buffer); + sbPop(&t.search_buffer); break; case (KEY_ENTER): @@ -155,7 +168,7 @@ int main (int argc, char *argv[]) editorFind(t.search_buffer.c, &t.cur.y, &t.cur.x); // Toggle mode t.mode_b ^= MODE_MASK; - flush (&t.search_buffer); + sbFlush (&t.search_buffer); } break; @@ -170,7 +183,7 @@ int main (int argc, char *argv[]) case (CTRL('f')): // Toggle mode t.mode_b ^= MODE_MASK; - flush (&t.search_buffer); + sbFlush (&t.search_buffer); break; @@ -181,7 +194,7 @@ int main (int argc, char *argv[]) rowAddChar(&rows.rw[t.cur.y], c, t.cur.x); t.cur.x++; } else { - insert(&t.search_buffer, c); + sbInsert(&t.search_buffer, c); } break; } @@ -232,6 +245,9 @@ void termInit (void) /* Initialize the data staructure */ t.cur.x = t.cur.off_x = 0; t.cur.y = t.cur.off_y = 0; + + t.search_buffer.cur = 0; + t.search_buffer.num = 0; } /* Calculate the correct spacing for the line numbers @@ -589,7 +605,7 @@ int editorFind (const char* needle, int *y, int *x) } if (res == NULL) return 0; - /* If something wa found convert from pointer to yx coodinates */ + /* If something was found convert from pointer to yx coodinates */ *y = c = i; for (i = 0; i <= rows.rw[c].size; i++) if (&rows.rw[c].chars[i] == res) break; @@ -597,20 +613,31 @@ int editorFind (const char* needle, int *y, int *x) return 1; } -void insert (sbuf *buf, int c) +void sbMove (CharBuffer *buf, int x) { + buf->cur += (x); + if (buf->cur < 0) buf->cur = 0; + if (buf->cur >= buf->num) buf->cur = buf->num - 1; +} + +void sbInsert (CharBuffer *buf, int c) { - if (buf->num < SBUF_SIZE - 2) - buf->c[buf->num++] = c; - buf->c[buf->num] = '\0'; + if (buf->num < CBUF_SIZE - 2) { + buf->c[buf->cur++] = c; + buf->c[++(buf->num)] = '\0'; + } } -void flush (sbuf *buf) +void sbFlush (CharBuffer *buf) { buf->num = 0; + buf->cur = 0; } -void pop (sbuf *buf) +void sbPop (CharBuffer *buf) { - if (buf->num) buf->c[--(buf->num)] = '\0'; + if (buf->num) { + buf->c[--(buf->num)] = '\0'; + sbMove(buf, -1); + } } /*--------------------------------- testing ------------------------------------*/ diff --git a/src/ste.o b/src/ste.o index 07b146c..c9ef667 100644 Binary files a/src/ste.o and b/src/ste.o differ