ledit

Text editor (WIP)
git clone git://lumidify.org/ledit.git (fast, but not encrypted)
git clone https://lumidify.org/git/ledit.git (encrypted, but very slow)
Log | Files | Refs | README | LICENSE

commit 320bd075762fe538d0e997bc2573bea19385c3a8
parent fbec4c07cb92b740d88ac37f69754f796fa1ebb9
Author: lumidify <nobody@lumidify.org>
Date:   Sun, 16 Jan 2022 13:25:28 +0100

Fix minor issues

Diffstat:
MLICENSE | 2+-
Mbuffer.c | 9++++++++-
Mkeys_basic.c | 7+++++--
Mtheme_config.h | 2+-
Mtxtbuf.c | 2++
Mview.c | 9+++++----
Mview.h | 2++
7 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/LICENSE b/LICENSE @@ -3,7 +3,7 @@ Note 2: Some stuff is stolen from OpenBSD (https://openbsd.org) ISC License -Copyright (c) 2021 lumidify <nobody@lumidify.org> +Copyright (c) 2022 lumidify <nobody@lumidify.org> Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/buffer.c b/buffer.c @@ -311,7 +311,14 @@ buffer_remove_view(ledit_buffer *buffer, ledit_view *view) { buffer->views + i + 1, (buffer->views_num - i - 1) * sizeof(ledit_view *) ); - buffer->views = ledit_reallocarray(buffer->views, --buffer->views_num, sizeof(ledit_view *)); + --buffer->views_num; + /* FIXME: use generic "vector" library to avoid problems like this */ + if (buffer->views_num == 0) { + free(buffer->views); + buffer->views = NULL; + } else { + buffer->views = ledit_reallocarray(buffer->views, --buffer->views_num, sizeof(ledit_view *)); + } } } diff --git a/keys_basic.c b/keys_basic.c @@ -449,6 +449,9 @@ insert_text( if (set_range_end) { cur_range.line2 = cur_line2; cur_range.byte2 = cur_index2; + } else { + /* to make static analysis happy */ + cur_range.line2 = cur_range.byte2 = 0; } /* FIXME: why did I ever decide to make set_range_end mean exactly the opposite for the two functions? */ @@ -1226,7 +1229,6 @@ paste_normal_backwards(ledit_view *view, char *text, size_t len) { } if (paste_buffer_line_based) { view_wipe_line_cursor_attrs(view, view->cur_line); - ledit_line *ll = buffer_get_line(view->buffer, view->cur_line); size_t brk = 0; if (!view->buffer->hard_line_based) { size_t tmp; @@ -1238,7 +1240,7 @@ paste_normal_backwards(ledit_view *view, char *text, size_t len) { "\n", 1, 0, 0, view->cur_line, view->cur_index, 0, 1, 1 ); size_t text_len = paste_buffer->len; - ll = buffer_get_line(view->buffer, view->cur_line); + ledit_line *ll = buffer_get_line(view->buffer, view->cur_line); if (paste_buffer->text[text_len-1] == '\n') { /* remove trailing newline if it exists */ text_len--; @@ -2251,6 +2253,7 @@ handle_key(ledit_view *view, char *key_text, size_t len, KeySym sym, unsigned in return (struct action){ACTION_NONE, NULL}; } else if (len > 0 && grab_char_cb) { *found = 1; + *type = 0; return grab_char_cb(view, key_text, len); } *found = 0; diff --git a/theme_config.h b/theme_config.h @@ -19,7 +19,7 @@ static const char *SELECTION_BG = "#000000"; static const char *BAR_FG = "#000000"; /* background color of status bar/line editor */ static const char *BAR_BG = "#CCCCCC"; -/* color of text cursor in status bar/line editor */ +/* color of text cursor in line editor */ static const char *BAR_CURSOR = "#000000"; /* FIXME: give in units other than pixels */ diff --git a/txtbuf.c b/txtbuf.c @@ -4,6 +4,7 @@ #include "util.h" #include "memory.h" #include "txtbuf.h" +#include "assert.h" txtbuf * txtbuf_new(void) { @@ -22,6 +23,7 @@ txtbuf_resize(txtbuf *buf, size_t sz) { buf->text = ledit_realloc(buf->text, cap); buf->cap = cap; } + ledit_assert(buf->cap >= add_sz(sz, 1)); } void diff --git a/view.c b/view.c @@ -1335,7 +1335,6 @@ view_delete_range_base( size_t l1 = line_index1, b1 = byte_index1; size_t l2 = line_index2, b2 = byte_index2; ledit_line *ll2 = buffer_get_line(view->buffer, l2); - ledit_view_line *vl1 = view_get_line(view, l1); ledit_view_line *vl2 = view_get_line(view, l2); PangoLayout *layout1 = get_pango_layout(view, l1); PangoLayout *layout2 = get_pango_layout(view, l2); @@ -1423,9 +1422,7 @@ view_delete_range_base( new_line = l1; /* important so vl1->softlines is updated */ set_pango_text_and_highlight(view, l1); - /* important because line pointers may only stay - valid until something is deleted or inserted */ - vl1 = view_get_line(view, l1); + ledit_view_line *vl1 = view_get_line(view, l1); /* it's technically possible that the remaining part of the second line is so small that it doesn't generate a new softline, so there needs to be a special case - this is @@ -1632,6 +1629,8 @@ view_xy_to_line_byte(ledit_view *view, int x, int y, int snap_to_nearest, size_t } h += vline->h; } + *line_ret = 0; + *byte_ret = 0; } static void @@ -2012,6 +2011,8 @@ paste_callback(void *data, char *text, size_t len) { ledit_range cur_range; cur_range.line1 = view->cur_line; cur_range.byte1 = view->cur_index; + /* just to avoid false positives during static analysis */ + cur_range.line2 = cur_range.byte2 = 0; buffer_insert_with_undo( view->buffer, cur_range, 1, 1, view->mode, view->cur_line, view->cur_index, text, len, diff --git a/view.h b/view.h @@ -123,6 +123,8 @@ void view_unlock(ledit_view *view); /* * Get the view line at the given index. + * The returned line is only valid until the next + * action that appends or deletes line entries. */ ledit_view_line *view_get_line(ledit_view *view, size_t index);