From: Michael D. Lowis Date: Wed, 23 Nov 2016 14:11:23 +0000 (-0500) Subject: Fixed an infinite loop for selecting at end of buffer and fixed a bug in delete at... X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=9dd444c36572b7202a6dabe6758ead85b59a5678;p=projs%2Ftide.git Fixed an infinite loop for selecting at end of buffer and fixed a bug in delete at end of buffer --- diff --git a/.gitignore b/.gitignore index 371b261..9b5f6dc 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,4 @@ tags *.gcno *.gcda *.gcov +xedit diff --git a/libedit/buf.c b/libedit/buf.c index 471deb9..c87b467 100644 --- a/libedit/buf.c +++ b/libedit/buf.c @@ -404,40 +404,3 @@ unsigned buf_setcol(Buf* buf, unsigned pos, unsigned col) { } return curr; } - -//char* buf_getstr(Buf* buf, unsigned beg, unsigned end) { -// char utf[UTF_MAX] = {0}; -// size_t len = 0; -// char* str = NULL; -// for (; beg <= end; beg++) { -// Rune rune = buf_get(buf, beg); -// if (rune == RUNE_CRLF) { -// str = realloc(str, len + 2); -// str[len + 1] = '\r'; -// str[len + 2] = '\n'; -// len += 2; -// } else { -// size_t n = utf8encode(utf, rune); -// str = realloc(str, len + n); -// memcpy(str+len, utf, n); -// len += n; -// } -// } -// str = realloc(str, len+1); -// if (str) str[len] = '\0'; -// return str; -//} -// -//unsigned buf_putstr(Buf* buf, unsigned beg, unsigned end, char* str) { -// /* delete the selected text first */ -// for (unsigned i = beg; ((end-beg) > 1) && (i <= end); i++) -// buf_del(buf, beg); -// /* insert the text */ -// while (*str) { -// Rune rune = 0; -// size_t length = 0; -// while (!utf8decode(&rune, &length, *str++)); -// buf_ins(buf, beg++, rune); -// } -// return beg; -//} diff --git a/libedit/view.c b/libedit/view.c index 634cef4..1fcf318 100644 --- a/libedit/view.c +++ b/libedit/view.c @@ -105,8 +105,6 @@ static unsigned scroll_up(View* view) { static unsigned scroll_dn(View* view) { unsigned last = view->rows[view->nrows-1]->off + view->rows[view->nrows-1]->rlen - 1; - if (last >= buf_end(&(view->buffer))) - return last; /* delete the first row and shift the others */ if (view->nrows > 1) { free(view->rows[0]); @@ -127,7 +125,7 @@ static void sync_view(View* view, size_t csr) { unsigned last = view->rows[view->nrows-1]->off + view->rows[view->nrows-1]->rlen - 1; while (csr < first) first = scroll_up(view); - while (csr > last) + while (csr > last && last < buf_end(&(view->buffer))) last = scroll_dn(view); view->sync_needed = false; } @@ -371,8 +369,13 @@ void view_delete(View* view) { Sel sel = view->selection; selswap(&sel); size_t num = num_selected(view->selection); - for (size_t i = 0; i <= num; i++) - buf_del(&(view->buffer), sel.beg); + if (num == 0) { + if (sel.end < buf_end(&(view->buffer))) + buf_del(&(view->buffer), sel.end); + } else { + for (size_t i = 0; i < num; i++) + buf_del(&(view->buffer), sel.beg); + } view->selection.beg = view->selection.end = sel.beg; view->selection.col = buf_getcol(&(view->buffer), view->selection.end); view->sync_needed = true; diff --git a/libx/x11.c b/libx/x11.c index 385f898..fd1e167 100644 --- a/libx/x11.c +++ b/libx/x11.c @@ -375,20 +375,6 @@ void x11_draw_glyphs(int fg, int bg, XGlyphSpec* specs, size_t nspecs) { XftColorFree(X.display, X.visual, X.colormap, &fgc); } -//void x11_draw_utf8(XFont* font, int fg, int bg, int x, int y, char* str) { -// static XftGlyphFontSpec specs[256]; -// size_t nspecs = 0; -// while (*str && nspecs < 256) { -// x11_font_getglyph(font, &(specs[nspecs]), *str); -// specs[nspecs].x = x; -// specs[nspecs].y = y; -// x += font->base.width; -// nspecs++; -// str++; -// } -// x11_draw_glyphs(fg, bg, specs, nspecs); -//} -// //void x11_warp_mouse(int x, int y) { // XWarpPointer(X.display, X.window, X.window, 0, 0, X.width, X.height, x, y); //} diff --git a/xedit b/xedit index 8765c0e..41b247d 100755 Binary files a/xedit and b/xedit differ