чување fed6ef481fe11238a16c4ce171f593eb80521c86
родитељ 61d59a63ad85cfb5acb2b3659d743a019a869461
Аутор: Страхиња Радић <sr@strahinja.org>
Датум: Sat, 2 Nov 2024 10:48:36 +0100
Syntax patch: remove unused variables, rebase onto correct commit
Diffstat:
измењених датотека: 3, додавања: 24(+), брисања: 795(-)
diff --git a/TODO b/TODO
@@ -1,8 +1,6 @@
TODO
====
-[ ] Syntax patch: remove unused variables
-
[~] Code optimization (struct coord...)
diff --git a/TODO.done b/TODO.done
@@ -1,6 +1,8 @@
Done or canceled todos
======================
+[x] Syntax patch: remove unused variables
+
[x] Bugfix: SEGV in format_codep when rereading the file
[x] Reconsider state.error; it might be better to store only the errno code a la
diff --git a/patch/syntax.patch b/patch/syntax.patch
@@ -1,24 +1,20 @@
-From 374ad070073bb248cbfba37053a6527b0150d5b9 Mon Sep 17 00:00:00 2001
+From 24ed247577196fa2d7075ea0bd4395d909b8f942 Mon Sep 17 00:00:00 2001
From: Страхиња Радић <sr@strahinja.org>
-Date: Sat Nov 2 09:29:39 2024 UTC
+Date: Sat Nov 2 09:46:14 2024 UTC
Subject: [PATCH] Add syntax highlighting
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
- config.def.h | 7+ 0-
- draw.c | 616+ 31-
- draw.h | 76+ 6-
- patch/bw-theme.patch | 3+ 3-
- patch/dark-theme.patch | 8+ 8-
- patch/light-theme.patch | 8+ 8-
- patch/syntax.patch | 121+ 85-
- sled.c | 82+ 15-
- 8 files changed, 921 insertions(+), 156 deletions(-)
+ config.def.h | 7+ 0-
+ draw.c | 613+ 31-
+ draw.h | 76+ 6-
+ sled.c | 82+ 15-
+ 4 files changed, 778 insertions(+), 52 deletions(-)
diff --git a/config.def.h b/config.def.h
-index fcae0e64e..374ad0700 100644
+index 61d59a63a..24ed24757 100644
--- a/config.def.h
+++ b/config.def.h
@@ -234,6 +234,13 @@ static const struct Key command_keys[] = {
@@ -36,7 +32,7 @@ index fcae0e64e..374ad0700 100644
{.format = "%s%s",
.callback = format_filename,
diff --git a/draw.c b/draw.c
-index fcae0e64e..374ad0700 100644
+index 61d59a63a..24ed24757 100644
--- a/draw.c
+++ b/draw.c
@@ -3,6 +3,7 @@
@@ -337,7 +333,7 @@ index fcae0e64e..374ad0700 100644
free(us);
return 0;
}
-@@ -650,13 +801,19 @@ free_bufferline(struct BufferLine* bl)
+@@ -650,12 +801,15 @@ free_bufferline(struct BufferLine* bl)
bl->length = 0;
bl->fg = 0;
bl->bg = 0;
@@ -348,16 +344,12 @@ index fcae0e64e..374ad0700 100644
void
free_drawstate(struct DrawState* state)
{
-+ struct Keyword32* kw;
-+ struct Comment32* cm;
-+ struct Operator32* op;
ssize_t row = 0;
- assert(state != NULL);
+
+ assert(state != NULL);
for (row = 0; row < state->buffer_size; row++)
free_bufferline(state->buffer + row);
- free(state->buffer);
-@@ -669,11 +826,13 @@ init_bufferline(struct BufferLine* bl)
+@@ -669,11 +823,13 @@ init_bufferline(struct BufferLine* bl)
{
if (!bl)
return;
@@ -376,7 +368,7 @@ index fcae0e64e..374ad0700 100644
}
void
-@@ -698,6 +857,14 @@ init_drawstate(struct DrawState* state, char* filename
+@@ -698,6 +854,14 @@ init_drawstate(struct DrawState* state, char* filename
state->orig_real_filename = NULL;
state->backup_filename = NULL;
state->rfn_len = 0;
@@ -391,7 +383,7 @@ index fcae0e64e..374ad0700 100644
}
state->input = NULL;
state->search = NULL;
-@@ -756,7 +923,402 @@ recalculate_size(struct DrawState* state)
+@@ -756,7 +920,402 @@ recalculate_size(struct DrawState* state)
recalculate_line_numbers(state);
}
@@ -794,7 +786,7 @@ index fcae0e64e..374ad0700 100644
redraw_status(struct DrawState* state)
{
assert(state != NULL);
-@@ -787,7 +1349,8 @@ redraw_status(struct DrawState* state)
+@@ -787,7 +1346,8 @@ redraw_status(struct DrawState* state)
* */
void
u32_draw_string(const int x, const int y, const uint16_t fg, const uint16_t bg,
@@ -804,7 +796,7 @@ index fcae0e64e..374ad0700 100644
const int p_r, const Alignment align, const int ds, const int fill,
const uint32_t* srch, const uint16_t sfg, const uint16_t sbg,
const int ssi, const int sei, const uint16_t slfg, const uint16_t slbg)
-@@ -825,6 +1388,8 @@ u32_draw_string(const int x, const int y, const uint16
+@@ -825,6 +1385,8 @@ u32_draw_string(const int x, const int y, const uint16
int w = 0; /* actual on-screen rune width */
@@ -813,7 +805,7 @@ index fcae0e64e..374ad0700 100644
const int ts = TAB_SIZE;
const uint32_t* ps = s; /* pointer to current character in
-@@ -833,11 +1398,23 @@ u32_draw_string(const int x, const int y, const uint16
+@@ -833,11 +1395,23 @@ u32_draw_string(const int x, const int y, const uint16
uint16_t cfg = fg; /* current fg */
uint16_t cbg = bg; /* current bg */
@@ -837,7 +829,7 @@ index fcae0e64e..374ad0700 100644
c = mc - p_l - p_r;
if (align == LEFT)
-@@ -869,7 +1446,12 @@ u32_draw_string(const int x, const int y, const uint16
+@@ -869,7 +1443,12 @@ u32_draw_string(const int x, const int y, const uint16
*/
while (*ps && sc < c)
{
@@ -851,7 +843,7 @@ index fcae0e64e..374ad0700 100644
{
cfg = slfg;
cbg = slbg;
-@@ -886,6 +1468,9 @@ u32_draw_string(const int x, const int y, const uint16
+@@ -886,6 +1465,9 @@ u32_draw_string(const int x, const int y, const uint16
}
}
@@ -861,7 +853,7 @@ index fcae0e64e..374ad0700 100644
if (*ps == '\t')
{
if (ssc < ds)
-@@ -1001,11 +1586,11 @@ u32_draw_string(const int x, const int y, const uint16
+@@ -1001,11 +1583,11 @@ u32_draw_string(const int x, const int y, const uint16
}
ssc += w;
}
@@ -878,7 +870,7 @@ index fcae0e64e..374ad0700 100644
}
diff --git a/draw.h b/draw.h
-index fcae0e64e..374ad0700 100644
+index 61d59a63a..24ed24757 100644
--- a/draw.h
+++ b/draw.h
@@ -63,17 +63,69 @@ struct Color {
@@ -1014,771 +1006,8 @@ index fcae0e64e..374ad0700 100644
+ const int ds, const int fill, const uint32_t* srch, const uint16_t sfg,
+ const uint16_t sbg, const int ssi, const int sei, const uint16_t slfg,
+ const uint16_t slbg);
-diff --git a/patch/bw-theme.patch b/patch/bw-theme.patch
-index fcae0e64e..374ad0700 100644
---- a/patch/bw-theme.patch
-+++ b/patch/bw-theme.patch
-@@ -1,6 +1,6 @@
--From 364246b5b0e7c37a3b2c0550d67605c632d72a59 Mon Sep 17 00:00:00 2001
-+From 744a42da5c6578c1febcfe3f260ed63b9cbcba94 Mon Sep 17 00:00:00 2001
- From: Страхиња Радић <sr@strahinja.org>
--Date: Sat Nov 2 08:45:40 2024 UTC
-+Date: Sat Sep 7 10:00:11 2024 UTC
- Subject: [PATCH] Set black and white theme
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
-@@ -11,7 +11,7 @@ Content-Transfer-Encoding: 8bit
- 1 file changed, 12 insertions(+), 15 deletions(-)
-
- diff --git a/config.def.h b/config.def.h
--index c012a668f..364246b5b 100644
-+index 504bf7d20..744a42da5 100644
- --- a/config.def.h
- +++ b/config.def.h
- @@ -6,25 +6,22 @@
-diff --git a/patch/dark-theme.patch b/patch/dark-theme.patch
-index fcae0e64e..374ad0700 100644
---- a/patch/dark-theme.patch
-+++ b/patch/dark-theme.patch
-@@ -1,6 +1,6 @@
--From 5c3865687fa0debec6192bd58a69d01f969254fb Mon Sep 17 00:00:00 2001
-+From 0ce620d838cec52583c50fa808af0e9dab38760c Mon Sep 17 00:00:00 2001
- From: Страхиња Радић <sr@strahinja.org>
--Date: Sat Nov 2 08:45:04 2024 UTC
-+Date: Sat Sep 7 10:09:58 2024 UTC
- Subject: [PATCH] Set dark theme
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
-@@ -12,7 +12,7 @@ Content-Transfer-Encoding: 8bit
- 2 files changed, 18 insertions(+), 23 deletions(-)
-
- diff --git a/config.def.h b/config.def.h
--index c012a668f..5c3865687 100644
-+index 504bf7d20..0ce620d83 100644
- --- a/config.def.h
- +++ b/config.def.h
- @@ -4,29 +4,23 @@
-@@ -63,15 +63,15 @@ index c012a668f..5c3865687 100644
- /* clang-format on */
-
- diff --git a/sled.c b/sled.c
--index c012a668f..5c3865687 100644
-+index 504bf7d20..0ce620d83 100644
- --- a/sled.c
- +++ b/sled.c
--@@ -3122,6 +3122,7 @@ main_skip_backups:
-+@@ -3210,6 +3210,7 @@ main_skip_backups:
-+
- init_termbox:
-- if (tb_init())
-- goto main_done;
-+ tb_init();
- + tb_set_output_mode(TB_OUTPUT_256);
-- errno = 0;
-+ *error = 0;
- state.maxx = 0;
- state.recalculate_size = 1;
- --
-diff --git a/patch/light-theme.patch b/patch/light-theme.patch
-index fcae0e64e..374ad0700 100644
---- a/patch/light-theme.patch
-+++ b/patch/light-theme.patch
-@@ -1,6 +1,6 @@
--From f564d4fb92d6daee7cbafed3fd19776ac1c5a764 Mon Sep 17 00:00:00 2001
-+From be1314e35d0efb2ae94f012693f749eb6c69cbc3 Mon Sep 17 00:00:00 2001
- From: Страхиња Радић <sr@strahinja.org>
--Date: Sat Nov 2 08:44:22 2024 UTC
-+Date: Sat Sep 7 10:05:55 2024 UTC
- Subject: [PATCH] Set light theme
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
-@@ -12,7 +12,7 @@ Content-Transfer-Encoding: 8bit
- 2 files changed, 18 insertions(+), 23 deletions(-)
-
- diff --git a/config.def.h b/config.def.h
--index c012a668f..f564d4fb9 100644
-+index 504bf7d20..be1314e35 100644
- --- a/config.def.h
- +++ b/config.def.h
- @@ -4,29 +4,23 @@
-@@ -63,15 +63,15 @@ index c012a668f..f564d4fb9 100644
- /* clang-format on */
-
- diff --git a/sled.c b/sled.c
--index c012a668f..f564d4fb9 100644
-+index 504bf7d20..be1314e35 100644
- --- a/sled.c
- +++ b/sled.c
--@@ -3122,6 +3122,7 @@ main_skip_backups:
-+@@ -3210,6 +3210,7 @@ main_skip_backups:
-+
- init_termbox:
-- if (tb_init())
-- goto main_done;
-+ tb_init();
- + tb_set_output_mode(TB_OUTPUT_256);
-- errno = 0;
-+ *error = 0;
- state.maxx = 0;
- state.recalculate_size = 1;
- --
-diff --git a/patch/syntax.patch b/patch/syntax.patch
-index fcae0e64e..374ad0700 100644
---- a/patch/syntax.patch
-+++ b/patch/syntax.patch
-@@ -1,6 +1,6 @@
--From 11d154f8f00681fdea534d624749b08167786590 Mon Sep 17 00:00:00 2001
-+From 4673c3e20138dd0ded6c3edf95c47cedd6987b7f Mon Sep 17 00:00:00 2001
- From: Страхиња Радић <sr@strahinja.org>
--Date: Sat Nov 2 08:38:49 2024 UTC
-+Date: Sat Sep 7 10:20:17 2024 UTC
- Subject: [PATCH] Add syntax highlighting
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
-@@ -8,16 +8,16 @@ Content-Transfer-Encoding: 8bit
-
- ---
- config.def.h | 7+ 0-
-- draw.c | 637+ 31-
-- draw.h | 76+ 6-
-- sled.c | 82+ 15-
-- 4 files changed, 802 insertions(+), 52 deletions(-)
-+ draw.c | 663+ 30-
-+ draw.h | 77+ 6-
-+ sled.c | 82+ 16-
-+ 4 files changed, 829 insertions(+), 52 deletions(-)
-
- diff --git a/config.def.h b/config.def.h
--index c012a668f..11d154f8f 100644
-+index 504bf7d20..4673c3e20 100644
- --- a/config.def.h
- +++ b/config.def.h
--@@ -234,6 +234,13 @@ static const struct Key command_keys[] = {
-+@@ -232,6 +232,13 @@ static const struct Key command_keys[] = {
- #endif /* SLED_C_GLOBALS */
-
- /* clang-format off */
-@@ -32,7 +32,7 @@ index c012a668f..11d154f8f 100644
- {.format = "%s%s",
- .callback = format_filename,
- diff --git a/draw.c b/draw.c
--index c012a668f..11d154f8f 100644
-+index 504bf7d20..4673c3e20 100644
- --- a/draw.c
- +++ b/draw.c
- @@ -3,6 +3,7 @@
-@@ -69,7 +69,7 @@ index c012a668f..11d154f8f 100644
- enum {
- UNKNOWN_MODE,
- COMMAND_MODE,
--@@ -86,6 +106,95 @@ static const struct {
-+@@ -88,6 +108,95 @@ static const struct {
- { .boundary = 99, .width = 3 },
- { .boundary = 9, .width = 2 }
- };
-@@ -165,7 +165,7 @@ index c012a668f..11d154f8f 100644
- const char* go_to_dialog_title = "Go to line";
- const char* prompt_dirty = "File changed, save [y/n/ESC]?";
- const char* prompt_overwrite = "Not empty, overwrite? [y/n/ESC]?";
--@@ -94,6 +203,46 @@ const char* replace_dialog_title = "Replace with";
-+@@ -96,6 +205,46 @@ const char* replace_dialog_title = "Replace with";
- const char* search_dialog_title = "Search text";
- /* clang-format on */
-
-@@ -212,7 +212,7 @@ index c012a668f..11d154f8f 100644
- void get_selection(int* ssr, int* ssc, int* ser, int* sec,
- const struct DrawState* state);
-
--@@ -267,14 +416,14 @@ draw_help(const struct DrawState* state)
-+@@ -269,14 +418,14 @@ draw_help(const struct DrawState* state)
-
- draw_box(startx, endx, starty, endy, colors[C_DLG].fg, colors[C_DLG].bg);
- if (draw_string(startx, starty, colors[C_TITLE].fg, colors[C_TITLE].bg,
-@@ -231,7 +231,7 @@ index c012a668f..11d154f8f 100644
- return 1;
- row++;
- }
--@@ -310,16 +459,16 @@ draw_input_dialog(const struct DrawState* state)
-+@@ -312,16 +461,16 @@ draw_input_dialog(const struct DrawState* state)
- colors[C_INPUT_EDIT].fg, colors[C_INPUT_EDIT].bg);
- if (state->input_title)
- if (draw_string(startx, starty, colors[C_TITLE].fg,
-@@ -252,7 +252,7 @@ index c012a668f..11d154f8f 100644
- tb_set_cursor(startx + 2 + state->input_display_column
- - state->input_first_shown_column,
- starty + 1);
--@@ -341,7 +490,7 @@ draw_line_number(const struct DrawState* state, const
-+@@ -343,7 +492,7 @@ draw_line_number(const struct DrawState* state, const
- ? numbuf_end - state->line_numbers_width
- : numbuf;
- draw_string(0, cy, colors[C_LINENO].fg, colors[C_LINENO].bg,
-@@ -261,7 +261,7 @@ index c012a668f..11d154f8f 100644
- state->line_numbers_width, 0, 0, RIGHT, 0, 1, NULL, 0,
- 0, 0, 0, 0, 0);
- }
--@@ -422,8 +571,9 @@ draw_screen(const struct DrawState* state)
-+@@ -424,8 +573,9 @@ draw_screen(const struct DrawState* state)
- ? state->line_numbers_width + 2
- : 0,
- cy, colors[C_TEXT].fg, colors[C_TEXT].bg,
-@@ -273,7 +273,7 @@ index c012a668f..11d154f8f 100644
- colors[C_SEARCH].bg, ssi, sei, colors[C_SEL].fg,
- colors[C_SEL].bg);
- i++;
--@@ -455,7 +605,7 @@ draw_status(const struct DrawState* state)
-+@@ -457,7 +607,7 @@ draw_status(const struct DrawState* state)
- if (IN(state->mode, M_PROMPT) && *state->prompt)
- {
- if (draw_string(0, state->maxy - 1, colors[C_PROMPT].fg,
-@@ -282,26 +282,25 @@ index c012a668f..11d154f8f 100644
- strlen(state->prompt) + 2, maxx, 1, 1, CENTER, 0, 1,
- NULL, 0, 0, 0, 0, 0, 0))
- return 1;
--@@ -463,15 +613,15 @@ draw_status(const struct DrawState* state)
-- else if (state->action)
-+@@ -465,7 +615,7 @@ draw_status(const struct DrawState* state)
-+ else if (state->action && *state->action)
- {
- if (draw_string(0, state->maxy - 1, colors[C_ACTION].fg,
--- colors[C_ACTION].bg, actions[state->action],
--- strlen(actions[state->action]) + 2, maxx, 1, 1,
--+ colors[C_ACTION].bg, actions[state->action], NULL,
--+ 0, strlen(actions[state->action]) + 2, maxx, 1, 1,
-- CENTER, 0, 1, NULL, 0, 0, 0, 0, 0, 0))
-+- colors[C_ACTION].bg, state->action,
-++ colors[C_ACTION].bg, state->action, NULL, 0,
-+ strlen(state->action) + 2, maxx, 1, 1, CENTER, 0, 1,
-+ NULL, 0, 0, 0, 0, 0, 0))
- return 1;
-- }
-- else if (state->error)
-+@@ -473,7 +623,7 @@ draw_status(const struct DrawState* state)
-+ else if (state->error && *state->error)
- {
- if (draw_string(0, state->maxy - 1, colors[C_ERROR].fg,
--- colors[C_ERROR].bg, errors[state->error],
--+ colors[C_ERROR].bg, errors[state->error], NULL, 0,
-- strlen(errors[state->error]) + 2, maxx, 1, 1,
-- CENTER, 0, 1, NULL, 0, 0, 0, 0, 0, 0))
-+- colors[C_ERROR].bg, state->error,
-++ colors[C_ERROR].bg, state->error, NULL, 0,
-+ strlen(state->error) + 2, maxx, 1, 1, CENTER, 0, 1,
-+ NULL, 0, 0, 0, 0, 0, 0))
- return 1;
--@@ -497,7 +647,7 @@ draw_status(const struct DrawState* state)
-+@@ -499,7 +649,7 @@ draw_status(const struct DrawState* state)
- seg_size = maxx - 1 - current_start;
- if (draw_string(current_start, state->maxy - 1,
- colors[pseg->color_index].fg,
-@@ -310,7 +309,7 @@ index c012a668f..11d154f8f 100644
- MIN(seg_size, (ssize_t)(strlen(buf) + 2)),
- last ? seg_size + 1 : seg_size, 1, 1,
- pseg->alignment, 0, 1, NULL, 0, 0, 0, 0, 0,
--@@ -532,8 +682,9 @@ draw_status(const struct DrawState* state)
-+@@ -534,8 +684,9 @@ draw_status(const struct DrawState* state)
- * */
- int
- draw_string(const int x, const int y, const uint16_t fg, const uint16_t bg,
-@@ -322,7 +321,7 @@ index c012a668f..11d154f8f 100644
- const uint32_t* srch, const uint16_t sfg, const uint16_t sbg,
- const int ssi, const int sei, const uint16_t slfg, const uint16_t slbg)
- {
--@@ -543,8 +694,8 @@ draw_string(const int x, const int y, const uint16_t f
-+@@ -545,8 +696,8 @@ draw_string(const int x, const int y, const uint16_t f
- if (!us)
- return 1;
- u8_string_to_unicode(us, s, mc);
-@@ -333,7 +332,7 @@ index c012a668f..11d154f8f 100644
- free(us);
- return 0;
- }
--@@ -650,13 +801,40 @@ free_bufferline(struct BufferLine* bl)
-+@@ -651,14 +802,41 @@ free_bufferline(struct BufferLine* bl)
- bl->length = 0;
- bl->fg = 0;
- bl->bg = 0;
-@@ -342,7 +341,8 @@ index c012a668f..11d154f8f 100644
- }
-
- void
-- free_drawstate(struct DrawState* state)
-+ free_drawstate(struct DrawState* state, const int skip_paste_free,
-+ const int skip_filename_free)
- {
- + struct Keyword32* kw;
- + struct Comment32* cm;
-@@ -374,7 +374,7 @@ index c012a668f..11d154f8f 100644
- for (row = 0; row < state->buffer_size; row++)
- free_bufferline(state->buffer + row);
- free(state->buffer);
--@@ -669,11 +847,13 @@ init_bufferline(struct BufferLine* bl)
-+@@ -684,11 +862,13 @@ init_bufferline(struct BufferLine* bl)
- {
- if (!bl)
- return;
-@@ -393,7 +393,7 @@ index c012a668f..11d154f8f 100644
- }
-
- void
--@@ -698,6 +878,14 @@ init_drawstate(struct DrawState* state, char* filename
-+@@ -714,6 +894,14 @@ init_drawstate(struct DrawState* state, char* error, c
- state->orig_real_filename = NULL;
- state->backup_filename = NULL;
- state->rfn_len = 0;
-@@ -408,7 +408,7 @@ index c012a668f..11d154f8f 100644
- }
- state->input = NULL;
- state->search = NULL;
--@@ -756,7 +944,402 @@ recalculate_size(struct DrawState* state)
-+@@ -772,7 +960,429 @@ recalculate_size(struct DrawState* state)
- recalculate_line_numbers(state);
- }
-
-@@ -460,6 +460,7 @@ index c012a668f..11d154f8f 100644
- + struct Comment32* comment;
- + struct Operator32* operator;
- + uint32_t* temp32;
-++ char* temp;
- + ssize_t i, li, ti, comment_start, quote_start, literal_start;
- + uint32_t quote;
- + int comment_index, seen_end_comment;
-@@ -484,6 +485,8 @@ index c012a668f..11d154f8f 100644
- + = calloc(keyword_count + 1, sizeof(struct Keyword32));
- + if (!state->ukeywords)
- + {
-++ MEMCCPY(state->error, errors[ERR_CANT_ALLOC],
-++ LINE_DEFAULT, temp);
- + state->running = 0;
- + return;
- + }
-@@ -496,6 +499,8 @@ index c012a668f..11d154f8f 100644
- + pklist->text = calloc(kw->size, sizeof(*ukw));
- + if (!pklist->text)
- + {
-++ MEMCCPY(state->error, errors[ERR_CANT_ALLOC],
-++ LINE_DEFAULT, temp);
- + state->running = 0;
- + return;
- + }
-@@ -522,6 +527,8 @@ index c012a668f..11d154f8f 100644
- + = calloc(comment_count + 1, sizeof(struct Comment32));
- + if (!state->ucomments)
- + {
-++ MEMCCPY(state->error, errors[ERR_CANT_ALLOC],
-++ LINE_DEFAULT, temp);
- + state->running = 0;
- + return;
- + }
-@@ -536,6 +543,8 @@ index c012a668f..11d154f8f 100644
- + = calloc(cm->start_size, sizeof(*ucm));
- + if (!pclist->start_text)
- + {
-++ MEMCCPY(state->error, errors[ERR_CANT_ALLOC],
-++ LINE_DEFAULT, temp);
- + state->running = 0;
- + return;
- + }
-@@ -553,6 +562,8 @@ index c012a668f..11d154f8f 100644
- + pclist->end_text = calloc(cm->end_size, sizeof(*ucm));
- + if (!pclist->end_text)
- + {
-++ MEMCCPY(state->error, errors[ERR_CANT_ALLOC],
-++ LINE_DEFAULT, temp);
- + state->running = 0;
- + return;
- + }
-@@ -580,6 +591,8 @@ index c012a668f..11d154f8f 100644
- + = calloc(operator_count + 1, sizeof(struct Operator32));
- + if (!state->uoperators)
- + {
-++ MEMCCPY(state->error, errors[ERR_CANT_ALLOC],
-++ LINE_DEFAULT, temp);
- + state->running = 0;
- + return;
- + }
-@@ -592,6 +605,8 @@ index c012a668f..11d154f8f 100644
- + polist->text = calloc(op->size, sizeof(*uop));
- + if (!polist->text)
- + {
-++ MEMCCPY(state->error, errors[ERR_CANT_ALLOC],
-++ LINE_DEFAULT, temp);
- + state->running = 0;
- + return;
- + }
-@@ -648,6 +663,8 @@ index c012a668f..11d154f8f 100644
- + ti - comment_start)
- + < 0)
- + {
-++ MEMCCPY(state->error, errors[ERR_CANT_ALLOC],
-++ LINE_DEFAULT, temp);
- + state->running = 0;
- + return;
- + }
-@@ -677,6 +694,8 @@ index c012a668f..11d154f8f 100644
- + curline->length - ti)
- + < 0)
- + {
-++ MEMCCPY(state->error, errors[ERR_CANT_ALLOC],
-++ LINE_DEFAULT, temp);
- + state->running = 0;
- + return;
- + }
-@@ -711,6 +730,8 @@ index c012a668f..11d154f8f 100644
- + ti - quote_start)
- + < 0)
- + {
-++ MEMCCPY(state->error, errors[ERR_CANT_ALLOC],
-++ LINE_DEFAULT, temp);
- + state->running = 0;
- + return;
- + }
-@@ -740,6 +761,8 @@ index c012a668f..11d154f8f 100644
- + ti - literal_start)
- + < 0)
- + {
-++ MEMCCPY(state->error, errors[ERR_CANT_ALLOC],
-++ LINE_DEFAULT, temp);
- + state->running = 0;
- + return;
- + }
-@@ -765,6 +788,8 @@ index c012a668f..11d154f8f 100644
- + keyword->size - 1)
- + < 0)
- + {
-++ MEMCCPY(state->error, errors[ERR_CANT_ALLOC],
-++ LINE_DEFAULT, temp);
- + state->running = 0;
- + return;
- + }
-@@ -791,6 +816,8 @@ index c012a668f..11d154f8f 100644
- + ti, operator->size - 1)
- + < 0)
- + {
-++ MEMCCPY(state->error, errors[ERR_CANT_ALLOC],
-++ LINE_DEFAULT, temp);
- + state->running = 0;
- + return;
- + }
-@@ -811,7 +838,7 @@ index c012a668f..11d154f8f 100644
- redraw_status(struct DrawState* state)
- {
- assert(state != NULL);
--@@ -787,7 +1370,8 @@ redraw_status(struct DrawState* state)
-+@@ -803,7 +1413,8 @@ redraw_status(struct DrawState* state)
- * */
- void
- u32_draw_string(const int x, const int y, const uint16_t fg, const uint16_t bg,
-@@ -821,7 +848,7 @@ index c012a668f..11d154f8f 100644
- const int p_r, const Alignment align, const int ds, const int fill,
- const uint32_t* srch, const uint16_t sfg, const uint16_t sbg,
- const int ssi, const int sei, const uint16_t slfg, const uint16_t slbg)
--@@ -825,6 +1409,8 @@ u32_draw_string(const int x, const int y, const uint16
-+@@ -841,6 +1452,8 @@ u32_draw_string(const int x, const int y, const uint16
-
- int w = 0; /* actual on-screen rune width */
-
-@@ -830,7 +857,7 @@ index c012a668f..11d154f8f 100644
- const int ts = TAB_SIZE;
-
- const uint32_t* ps = s; /* pointer to current character in
--@@ -833,11 +1419,23 @@ u32_draw_string(const int x, const int y, const uint16
-+@@ -849,11 +1462,23 @@ u32_draw_string(const int x, const int y, const uint16
- uint16_t cfg = fg; /* current fg */
- uint16_t cbg = bg; /* current bg */
-
-@@ -854,7 +881,7 @@ index c012a668f..11d154f8f 100644
- c = mc - p_l - p_r;
-
- if (align == LEFT)
--@@ -869,7 +1467,12 @@ u32_draw_string(const int x, const int y, const uint16
-+@@ -885,7 +1510,12 @@ u32_draw_string(const int x, const int y, const uint16
- */
- while (*ps && sc < c)
- {
-@@ -868,7 +895,7 @@ index c012a668f..11d154f8f 100644
- {
- cfg = slfg;
- cbg = slbg;
--@@ -886,6 +1489,9 @@ u32_draw_string(const int x, const int y, const uint16
-+@@ -902,6 +1532,9 @@ u32_draw_string(const int x, const int y, const uint16
- }
- }
-
-@@ -878,7 +905,7 @@ index c012a668f..11d154f8f 100644
- if (*ps == '\t')
- {
- if (ssc < ds)
--@@ -1001,11 +1607,11 @@ u32_draw_string(const int x, const int y, const uint16
-+@@ -1017,11 +1650,11 @@ u32_draw_string(const int x, const int y, const uint16
- }
- ssc += w;
- }
-@@ -895,10 +922,18 @@ index c012a668f..11d154f8f 100644
- }
-
- diff --git a/draw.h b/draw.h
--index c012a668f..11d154f8f 100644
-+index 504bf7d20..4673c3e20 100644
- --- a/draw.h
- +++ b/draw.h
--@@ -63,17 +63,69 @@ struct Color {
-+@@ -1,6 +1,7 @@
-+ /* This program is licensed under the terms of GNU GPL v3 or (at your option)
-+ * any later version. Copyright (C) 2022-2024 Страхиња Радић.
-+ * See the file LICENSE for exact copyright and license details. */
-++
-+ #include <stddef.h>
-+ #include <sys/types.h>
-+ #include <termios.h>
-+@@ -62,17 +63,69 @@ struct Color {
- uint16_t bg;
- };
-
-@@ -968,7 +1003,7 @@ index c012a668f..11d154f8f 100644
- };
-
- struct DrawState {
--@@ -113,12 +165,20 @@ struct DrawState {
-+@@ -112,12 +165,20 @@ struct DrawState {
- int dirty;
- int new_file;
- int recalculate_size;
-@@ -989,7 +1024,7 @@ index c012a668f..11d154f8f 100644
- };
-
- struct Key {
--@@ -134,6 +194,13 @@ struct StatusSegment {
-+@@ -133,6 +194,13 @@ struct StatusSegment {
- Alignment alignment;
- };
-
-@@ -1003,7 +1038,7 @@ index c012a668f..11d154f8f 100644
- void assign_coord(struct Coord* dest, const struct Coord src);
- ssize_t buffer_length(uint32_t* buffer, const ssize_t max_index);
- int calculate_help_width(const struct DrawState* state);
--@@ -150,7 +217,8 @@ void draw_rect(const int startx, const int endx, const
-+@@ -149,7 +217,8 @@ void draw_rect(const int startx, const int endx, const
- int draw_screen(const struct DrawState* state);
- int draw_status(const struct DrawState* state);
- int draw_string(const int x, const int y, const uint16_t fg, const uint16_t bg,
-@@ -1013,8 +1048,8 @@ index c012a668f..11d154f8f 100644
- const int padding_left, const int padding_right, const Alignment align,
- const int ds, const int fill, const uint32_t* srch, const uint16_t sfg,
- const uint16_t sbg, const int ssi, const int sei, const uint16_t slfg,
--@@ -171,10 +239,12 @@ void init_drawstate(struct DrawState* state, char* fil
-- const int skip_paste_and_mode_init, const int skip_filenames_init);
-+@@ -172,10 +241,12 @@ void init_drawstate(struct DrawState* state, char* err
-+ const int skip_filenames_init);
- void recalculate_line_numbers(struct DrawState* state);
- void recalculate_size(struct DrawState* state);
- +void recalculate_syntax(struct DrawState* state);
-@@ -1032,10 +1067,10 @@ index c012a668f..11d154f8f 100644
- + const uint16_t sbg, const int ssi, const int sei, const uint16_t slfg,
- + const uint16_t slbg);
- diff --git a/sled.c b/sled.c
--index c012a668f..11d154f8f 100644
-+index 504bf7d20..4673c3e20 100644
- --- a/sled.c
- +++ b/sled.c
--@@ -50,6 +50,18 @@ extern const char* prompt_reread_dirty;
-+@@ -67,6 +67,18 @@ extern const char* prompt_reread_dirty;
- extern const char* replace_dialog_title;
- extern const char* search_dialog_title;
-
-@@ -1054,19 +1089,20 @@ index c012a668f..11d154f8f 100644
- static int
- cancel_close(struct DrawState* state)
- {
--@@ -175,8 +187,9 @@ create_file(struct DrawState* state)
-+@@ -193,9 +205,9 @@ create_file(struct DrawState* state)
- state->buffer_size = ALLOC_DELTA;
- state->rows_count = 1;
- recalculate_line_numbers(state);
- - state->coord.row = 0;
- - state->dirty = 1;
-+-
- + state->coord.row = 0;
- + state->dirty = 1;
- + state->recalculate_syntax = 1;
--
-- return 0;
-+ return LOAD_ERR_NONE;
- }
--@@ -307,6 +320,7 @@ do_search_replace(struct DrawState* state)
-+
-+@@ -325,6 +337,7 @@ do_search_replace(struct DrawState* state)
- state->buffer[row].length = buflen;
- }
- free(buf);
-@@ -1074,7 +1110,7 @@ index c012a668f..11d154f8f 100644
- return 0;
-
- do_search_replace_alloc_error:
--@@ -357,7 +371,8 @@ erase_backwards(struct DrawState* state)
-+@@ -377,7 +390,8 @@ erase_backwards(struct DrawState* state)
- buffer_line->text[i - 1] = 0;
- buffer_line->length--;
- position_to(state, state->coord.row, state->coord.col - 1);
-@@ -1084,7 +1120,7 @@ index c012a668f..11d154f8f 100644
- }
- else if (state->coord.row > 0)
- {
--@@ -394,7 +409,8 @@ erase_forward(struct DrawState* state)
-+@@ -414,7 +428,8 @@ erase_forward(struct DrawState* state)
- }
- buffer_line->text[i] = 0;
- buffer_line->length--;
-@@ -1094,7 +1130,7 @@ index c012a668f..11d154f8f 100644
- }
- else if ((state->coord.row + 1) < state->rows_count)
- simple_join_lines(state);
--@@ -428,7 +444,8 @@ erase_line(struct DrawState* state)
-+@@ -449,7 +464,8 @@ erase_line(struct DrawState* state)
- state->coord.row--;
- position_to(state, state->coord.row, 0);
- state->rows_count--;
-@@ -1104,7 +1140,7 @@ index c012a668f..11d154f8f 100644
- recalculate_line_numbers(state);
- return 0;
-
--@@ -467,6 +484,7 @@ erase_prev_word(struct DrawState* state)
-+@@ -489,6 +505,7 @@ erase_prev_word(struct DrawState* state)
- state->coord.col = i;
- state->display_column = display_length(current->text, state->coord.col);
- state->dirty = 1;
-@@ -1112,7 +1148,7 @@ index c012a668f..11d154f8f 100644
- return 0;
- }
-
--@@ -522,7 +540,8 @@ erase_selection(struct DrawState* state)
-+@@ -544,7 +561,8 @@ erase_selection(struct DrawState* state)
- recalculate_line_numbers(state);
- }
- free(buf);
-@@ -1122,7 +1158,7 @@ index c012a668f..11d154f8f 100644
- }
- return 0;
- }
--@@ -547,7 +566,8 @@ erase_to_end(struct DrawState* state)
-+@@ -569,7 +587,8 @@ erase_to_end(struct DrawState* state)
- buffer_line->text[state->coord.col] = 0;
- buffer_line->length = state->coord.col;
- move_end(state);
-@@ -1132,7 +1168,7 @@ index c012a668f..11d154f8f 100644
- return 0;
- }
-
--@@ -581,7 +601,8 @@ erase_to_start(struct DrawState* state)
-+@@ -603,7 +622,8 @@ erase_to_start(struct DrawState* state)
- buffer_line->text[len - state->coord.col] = 0;
- buffer_line->length = len - state->coord.col;
- move_start(state);
-@@ -1142,7 +1178,7 @@ index c012a668f..11d154f8f 100644
- return 0;
- }
-
--@@ -1130,8 +1151,8 @@ insert_char(struct DrawState* state, uint32_t ch)
-+@@ -1159,8 +1179,8 @@ insert_char(struct DrawState* state, uint32_t ch)
- }
-
- insert_skip_wrap:
-@@ -1153,7 +1189,7 @@ index c012a668f..11d154f8f 100644
- return 0;
-
- insert_char_error:
--@@ -1182,7 +1203,8 @@ insert_skip_wrap:
-+@@ -1212,7 +1232,8 @@ insert_skip_wrap:
- simple_insert_line(state);
- state->saved_column = -1;
- position_to(state, state->coord.row + 1, 0);
-@@ -1163,7 +1199,7 @@ index c012a668f..11d154f8f 100644
- return 0;
- }
-
--@@ -1704,7 +1726,8 @@ paste_from_paste(struct DrawState* state)
-+@@ -1747,7 +1768,8 @@ paste_from_paste(struct DrawState* state)
- }
-
- position_to(state, newpos.row, newpos.col);
-@@ -1173,15 +1209,15 @@ index c012a668f..11d154f8f 100644
-
- paste_from_paste_cleanup:
- free(rest);
--@@ -1970,6 +1993,7 @@ reread_file(struct DrawState* state)
-+@@ -2025,6 +2047,7 @@ reread_file(struct DrawState* state)
-+ break;
-+ default:
-+ recalculate_line_numbers(state);
-++ state->recalculate_syntax = 1;
- }
--
-- recalculate_line_numbers(state);
--+ state->recalculate_syntax = 1;
-- return 0;
-+ return result;
- }
--
--@@ -2357,6 +2381,7 @@ simple_join_lines(struct DrawState* state)
-+@@ -2438,6 +2461,7 @@ simple_join_lines(struct DrawState* state)
- state->rows_count--;
- state->dirty = 1;
- recalculate_line_numbers(state);
-@@ -1189,19 +1225,19 @@ index c012a668f..11d154f8f 100644
- return;
-
- simple_join_lines_error:
--@@ -2831,6 +2856,8 @@ main(int argc, char** argv)
-+@@ -2905,6 +2929,8 @@ main(int argc, char** argv)
-+ int result = 0;
- int dir_access;
- int dir_access_errno;
-- int saved_errno;
- + int found_ending = 0;
- + int i;
-
-- *prompt = 0;
-+ *error = 0;
-+ *action = 0;
-+@@ -2988,6 +3014,40 @@ main(int argc, char** argv)
-
--@@ -2913,6 +2940,40 @@ main(int argc, char** argv)
-+ init_drawstate(&state, error, action, filename, prompt, 0, 0);
-
-- init_drawstate(&state, filename, prompt, 0, 0);
--
- + for (i = 0; (size_t)i < LEN(syntax_endings); i++)
- + {
- + int filename_len = strlen(state.filename);
-@@ -1239,21 +1275,21 @@ index c012a668f..11d154f8f 100644
- #ifdef __OpenBSD__
- if (unveil(state.filename, "rwc") < 0)
- {
--@@ -3122,9 +3183,10 @@ main_skip_backups:
-+@@ -3210,9 +3270,10 @@ main_skip_backups:
-+
- init_termbox:
-- if (tb_init())
-- goto main_done;
--- errno = 0;
-+ tb_init();
-+- *error = 0;
- - state.maxx = 0;
- - state.recalculate_size = 1;
--+ errno = 0;
-++ *error = 0;
- + state.maxx = 0;
- + state.recalculate_size = 1;
- + state.recalculate_syntax = 1;
-
- while (state.running)
- {
--@@ -3136,6 +3198,11 @@ init_termbox:
-+@@ -3224,6 +3285,11 @@ init_termbox:
- recalculate_size(&state);
- state.recalculate_size = 0;
- }
diff --git a/sled.c b/sled.c
-index fcae0e64e..374ad0700 100644
+index 61d59a63a..24ed24757 100644
--- a/sled.c
+++ b/sled.c
@@ -50,6 +50,18 @@ extern const char* prompt_reread_dirty;