From db95802a1842fdf6d130316888ebf474ba3acb9f Mon Sep 17 00:00:00 2001
From: David Lawrence Ramsey <pooka109@gmail.com>
Date: Wed, 13 Jul 2005 20:18:46 +0000
Subject: [PATCH] add breakage fixes, type fixes, and as-needed color regex
 compilation

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2854 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
---
 ChangeLog    | 26 ++++++++++++++++-----
 src/color.c  | 57 ++++++++++++++++++++++++++++++++++-----------
 src/files.c  | 28 +++++++++++++++-------
 src/global.c | 17 ++++++++++----
 src/nano.c   | 21 ++++++++---------
 src/nano.h   | 65 ++++++++++++++++++++++++++++++----------------------
 src/proto.h  | 11 ++++-----
 src/rcfile.c | 54 ++++++++++++++++++++++++++++---------------
 src/search.c |  5 +++-
 src/winio.c  | 44 ++++++++++++++++++-----------------
 10 files changed, 210 insertions(+), 118 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index c035bb96..416edcf6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -21,8 +21,9 @@ CVS code -
 	  open_nextfile_void() switch_to_next_buffer(), rename
 	  write_marked() write_marked_file(), remove load_file(), rename
 	  cancel_fork() cancel_command(), rename open_pipe()
-	  execute_command(), remove execute_command(), and remove
-	  resize_variables(). (DLR)
+	  execute_command(), remove execute_command(), remove
+	  resize_variables(), rename get_buffer() get_key_buffer(), and
+	  rename get_buffer_len() get_key_buffer_len(). (DLR)
 	- Replace all mvwaddstr(hblank) calls with a new function that
 	  does the same thing without the need for hblank.  New function
 	  blank_line(); changes to do_browser(), blank_titlebar(),
@@ -31,6 +32,19 @@ CVS code -
 	- Make the static pid variable used by execute_command() and
 	  cancel_command() a pid_t instead of an int, for consistency.
 	  (DLR)
+	- Consistently make the flags global and any variables used to
+	  hold it longs. (DLR)
+	- Consistently make the fg and bg colortype struct entries and
+	  any variables used to hold them shorts.  Changes to
+	  do_colorinit() (renamed color_init()), color_to_int() (renamed
+	  color_to_short()), and parse_colors(). (DLR)
+	- Change color handling to save only the regex strings
+	  constantly, and to actually compile them on an as-needed
+	  basis.  Also, don't bother doing complete refreshes of the
+	  screen when color support is enabled if there's no regex
+	  associated with the current file.  Changes to update_color()
+	  (renamed color_update()), thanks_for_all_the_fish(),
+	  do_input(), and do_output(),  (DLR)
 - files.c:
   open_file()
 	- Assert that filename isn't NULL, and don't do anything special
@@ -64,13 +78,13 @@ CVS code -
   allow_pending_sigwinch()
 	- Simplify by using the "?" operator instead of an if clause.
 	  (DLR)
-  main()
-	- When constant cursor position display is on, only display the
-	  cursor position if there are no keys waiting in the buffer.
-	  (DLR)
 - nano.h:
 	- Since we only use vsnprintf() now, remove the #ifdef block for
 	  HAVE_SNPRINTF. (DLR)
+- rcfile.c:
+  nregcomp()
+	- Return TRUE when the compilation succeeds and FALSE otherwise,
+	  instead of the other way around. (DLR)
 - search.c:
   search_init()
 	- Don't blank out last_replace anymore when we get a new string,
diff --git a/src/color.c b/src/color.c
index 88c854d5..ccd5c9e6 100644
--- a/src/color.c
+++ b/src/color.c
@@ -29,6 +29,7 @@
 #include <stdio.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <assert.h>
 #include "proto.h"
 
 #ifdef ENABLE_COLOR
@@ -63,35 +64,38 @@ void set_colorpairs(void)
     }
 }
 
-void do_colorinit(void)
+void color_init(void)
 {
+    assert(openfile != NULL);
+
     if (has_colors()) {
-	const colortype *tmpcolor = NULL;
+	const colortype *tmpcolor;
 #ifdef HAVE_USE_DEFAULT_COLORS
 	bool defok;
 #endif
 
 	start_color();
 
-	/* Add in colors, if available. */
 #ifdef HAVE_USE_DEFAULT_COLORS
+	/* Add in colors, if available. */
 	defok = (use_default_colors() != ERR);
 #endif
 
-	for (tmpcolor = colorstrings; tmpcolor != NULL;
+	for (tmpcolor = openfile->colorstrings; tmpcolor != NULL;
 		tmpcolor = tmpcolor->next) {
 	    short background = tmpcolor->bg;
 
-	    if (background == -1)
+	    if (background == -1) {
 #ifdef HAVE_USE_DEFAULT_COLORS
 		if (!defok)
 #endif
 		    background = COLOR_BLACK;
+	    }
 
 	    init_pair(tmpcolor->pairnum, tmpcolor->fg, background);
 
 #ifdef DEBUG
-	    fprintf(stderr, "init_pair(): fg = %d, bg = %d\n",
+	    fprintf(stderr, "init_pair(): fg = %hd, bg = %hd\n",
 		tmpcolor->fg, tmpcolor->bg);
 #endif
 	}
@@ -99,11 +103,14 @@ void do_colorinit(void)
 }
 
 /* Update the color information based on the current filename. */
-void update_color(void)
+void color_update(void)
 {
     const syntaxtype *tmpsyntax;
+    colortype *tmpcolor;
+
+    assert(openfile != NULL);
 
-    colorstrings = NULL;
+    openfile->colorstrings = NULL;
     for (tmpsyntax = syntaxes; tmpsyntax != NULL;
 	tmpsyntax = tmpsyntax->next) {
 	const exttype *e;
@@ -111,22 +118,44 @@ void update_color(void)
 	for (e = tmpsyntax->extensions; e != NULL; e = e->next) {
 	    /* Set colorstrings if we matched the extension regex. */
 	    if (regexec(&e->val, openfile->filename, 0, NULL, 0) == 0)
-		colorstrings = tmpsyntax->color;
+		openfile->colorstrings = tmpsyntax->color;
 
-	    if (colorstrings != NULL)
+	    if (openfile->colorstrings != NULL)
 		break;
 	}
     }
 
     /* If we haven't found a match, use the override string. */
-    if (colorstrings == NULL && syntaxstr != NULL) {
+    if (openfile->colorstrings == NULL && syntaxstr != NULL) {
 	for (tmpsyntax = syntaxes; tmpsyntax != NULL;
 		tmpsyntax = tmpsyntax->next) {
-	    if (mbstrcasecmp(tmpsyntax->desc, syntaxstr) == 0)
-		colorstrings = tmpsyntax->color;
+	    if (mbstrcasecmp(tmpsyntax->desc, syntaxstr) == 0) {
+		openfile->colorstrings = tmpsyntax->color;
+
+		if (openfile->colorstrings != NULL)
+		    break;
+	    }
+	}
+    }
+
+    /* tmpcolor->startstr and tmpcolor->endstr have already been checked
+     * for validity elsewhere.  Compile their associated regexes if we
+     * haven't already. */
+    for (tmpcolor = openfile->colorstrings; tmpcolor != NULL;
+	tmpcolor = tmpcolor->next) {
+	if (tmpcolor->startstr != NULL) {
+	    tmpcolor->start = (regex_t *)nmalloc(sizeof(regex_t));
+	    nregcomp(tmpcolor->start, tmpcolor->startstr,
+		tmpcolor->icase ? REG_ICASE : 0);
+	}
+	if (tmpcolor->endstr != NULL) {
+	    tmpcolor->end = (regex_t *)nmalloc(sizeof(regex_t));
+	    nregcomp(tmpcolor->end, tmpcolor->endstr,
+		tmpcolor->icase ? REG_ICASE : 0);
 	}
     }
-    do_colorinit();
+
+    color_init();
 }
 
 #endif /* ENABLE_COLOR */
diff --git a/src/files.c b/src/files.c
index 98550957..02f2d56a 100644
--- a/src/files.c
+++ b/src/files.c
@@ -147,6 +147,9 @@ void initialize_buffer(void)
 
     memset(&openfile->originalfilestat, 0, sizeof(struct stat));
 #endif
+#ifndef ENABLE_COLOR
+    openfile->colorstrings = NULL;
+#endif
 }
 
 #ifndef DISABLE_SPELLER
@@ -163,8 +166,8 @@ void reinitialize_buffer(void)
 }
 #endif
 
-/* filename is a file to open.  We make a new buffer, if necessary, and
- * then open and read the file. */
+/* If it's not "", filename is a file to open.  We make a new buffer, if
+ * necessary, and then open and read the file, if applicable. */
 void open_buffer(const char *filename)
 {
     bool new_buffer = (openfile == NULL
@@ -215,16 +218,19 @@ void open_buffer(const char *filename)
      * to the first line of the buffer. */
     if (rc != -1 && new_buffer)
 	openfile->current = openfile->fileage;
+
+#ifdef ENABLE_COLOR
+    /* If we're loading into a new buffer, update the buffer's
+     * associated colors, if applicable. */
+    if (new_buffer)
+	color_update();
+#endif
 }
 
 /* Update the screen to account for the current buffer. */
 void display_buffer(void)
 {
     titlebar(NULL);
-#ifdef ENABLE_COLOR
-    /* Update the buffer's associated colors, if applicable. */
-    update_color();
-#endif
     edit_refresh();
 }
 
@@ -1559,8 +1565,14 @@ int write_file(const char *name, FILE *f_open, bool tmp, int append,
 	    openfile->filename = mallocstrcpy(openfile->filename,
 		realname);
 #ifdef ENABLE_COLOR
-	    update_color();
-	    if (!ISSET(NO_COLOR_SYNTAX))
+	    /* We might have changed the filename, so update the
+	     * buffer's associated colors, if applicable. */
+	    color_update();
+
+	    /* If color syntaxes are available and turned on, we need to
+	     * call edit_refresh(). */
+	    if (openfile->colorstrings != NULL &&
+		!ISSET(NO_COLOR_SYNTAX))
 		edit_refresh();
 #endif
 	}
diff --git a/src/global.c b/src/global.c
index bd4b4db4..f3c2b6e7 100644
--- a/src/global.c
+++ b/src/global.c
@@ -39,7 +39,7 @@ ssize_t wrap_at = -CHARS_FROM_EOL;	/* Right justified fill value,
 char *last_search = NULL;	/* Last string we searched for */
 char *last_replace = NULL;	/* Last replacement string */
 
-unsigned long flags = 0;	/* Our flag containing many options */
+long flags = 0;			/* Our flag containing many options */
 WINDOW *topwin;			/* Top buffer */
 WINDOW *edit;			/* The file portion of the editor */
 WINDOW *bottomwin;		/* Bottom buffer */
@@ -124,7 +124,6 @@ shortcut *gotodir_list = NULL;
 #endif
 
 #ifdef ENABLE_COLOR
-const colortype *colorstrings = NULL;
 syntaxtype *syntaxes = NULL;
 char *syntaxstr = NULL;
 #endif
@@ -1226,10 +1225,18 @@ void thanks_for_all_the_fish(void)
 	    colortype *bob = syntaxes->color;
 
 	    syntaxes->color = bob->next;
-	    regfree(&bob->start);
-	    if (bob->end != NULL)
+	    if (bob->startstr != NULL)
+		free(bob->startstr);
+	    if (bob->start != NULL) {
+		regfree(bob->start);
+		free(bob->start);
+	    }
+	    if (bob->endstr != NULL)
+		free(bob->endstr);
+	    if (bob->end != NULL) {
 		regfree(bob->end);
-	    free(bob->end);
+		free(bob->end);
+	    }
 	    free(bob);
 	}
 	syntaxes = syntaxes->next;
diff --git a/src/nano.c b/src/nano.c
index 3bb685c5..2d7338e8 100644
--- a/src/nano.c
+++ b/src/nano.c
@@ -1359,9 +1359,9 @@ void do_delete(void)
     set_modified();
 
 #ifdef ENABLE_COLOR
-    /* If color syntaxes are turned on, we need to call
+    /* If color syntaxes are available and turned on, we need to call
      * edit_refresh(). */
-    if (!ISSET(NO_COLOR_SYNTAX))
+    if (openfile->colorstrings != NULL && !ISSET(NO_COLOR_SYNTAX))
 	do_refresh = TRUE;
 #endif
 
@@ -3932,7 +3932,7 @@ int do_input(bool *meta_key, bool *func_key, bool *s_or_t, bool
 	 * display all the characters in the input buffer if it isn't
 	 * empty.  Note that it should be empty if we're in view
 	 * mode. */
-	 if (*s_or_t == TRUE || get_buffer_len() == 0) {
+	 if (*s_or_t == TRUE || get_key_buffer_len() == 0) {
 	    if (kbinput != NULL) {
 		/* Display all the characters in the input buffer at
 		 * once, filtering out control characters. */
@@ -4159,9 +4159,9 @@ void do_output(char *output, size_t output_len, bool allow_cntrls)
 #endif
 
 #ifdef ENABLE_COLOR
-	/* If color syntaxes are turned on, we need to call
-	 * edit_refresh(). */
-	if (!ISSET(NO_COLOR_SYNTAX))
+	/* If color syntaxes are available and turned on, we need to
+	 * call edit_refresh(). */
+	if (openfile->colorstrings != NULL && !ISSET(NO_COLOR_SYNTAX))
 	    do_refresh = TRUE;
 #endif
     }
@@ -4475,7 +4475,7 @@ int main(int argc, char **argv)
 	char *alt_speller_cpy = alt_speller;
 #endif
 	ssize_t tabsize_cpy = tabsize;
-	unsigned long flags_cpy = flags;
+	long flags_cpy = flags;
 
 #ifndef DISABLE_OPERATINGDIR
 	operating_dir = NULL;
@@ -4727,10 +4727,9 @@ int main(int argc, char **argv)
 	/* Make sure the cursor is in the edit window. */
 	reset_cursor();
 
-	/* If constant cursor position display is on, and there are no
-	 * keys waiting in the buffer, display the current cursor
-	 * position on the statusbar. */
-	if (ISSET(CONST_UPDATE) && get_buffer_len() == 0)
+	/* If constant cursor position display is on, display the
+	 * current cursor position on the statusbar. */
+	if (ISSET(CONST_UPDATE))
 	    do_cursorpos(TRUE);
 
 	currshortcut = main_list;
diff --git a/src/nano.h b/src/nano.h
index 705726a6..32341347 100644
--- a/src/nano.h
+++ b/src/nano.h
@@ -160,6 +160,40 @@ typedef struct filestruct {
     ssize_t lineno;		/* The line number. */
 } filestruct;
 
+#ifdef ENABLE_COLOR
+typedef struct colortype {
+    short fg;			/* Foreground color. */
+    short bg;			/* Background color. */
+    bool bright;		/* Is this color A_BOLD? */
+    bool icase;			/* Is this regex string case
+				 * insensitive? */
+    int pairnum;		/* Color pair number used for this
+				 * foreground/background. */
+    char *startstr;		/* Start (or all) of the regex
+				 * string. */
+    regex_t *start;		/* Compiled start (or all) of the regex
+				 * string. */
+    char *endstr;		/* End (if any) of the regex string. */
+    regex_t *end;		/* Compiled end (if any) of the regex
+				 * string. */
+    struct colortype *next;
+} colortype;
+
+typedef struct exttype {
+    regex_t val;		/* The extensions that match this
+				 * syntax. */
+    struct exttype *next;
+} exttype;
+
+typedef struct syntaxtype {
+    char *desc;			/* Name of this syntax type. */
+    exttype *extensions;	/* List of extensions that this syntax
+				 * applies to. */
+    colortype *color;		/* Color struct for this syntax. */
+    struct syntaxtype *next;
+} syntaxtype;
+#endif /* ENABLE_COLOR */
+
 typedef struct openfilestruct {
     char *filename;		/* Current file's name. */
     filestruct *fileage;	/* Current file's first line. */
@@ -185,6 +219,9 @@ typedef struct openfilestruct {
     file_format fmt;		/* Current file's format. */
     struct stat originalfilestat;
 				/* Current file's stat. */
+#endif
+#ifdef ENABLE_COLOR
+    colortype *colorstrings;	/* Current file's associated colors. */
 #endif
     struct openfilestruct *next;
 				/* Next node. */
@@ -236,34 +273,6 @@ typedef struct rcoption {
 } rcoption;
 #endif
 
-#ifdef ENABLE_COLOR
-typedef struct colortype {
-    int fg;			/* Foreground color. */
-    int bg;			/* Background color. */
-    bool bright;		/* Is this color A_BOLD? */
-    int pairnum;		/* Color pair number used for this
-				 * foreground/background. */
-    regex_t start;		/* Start (or all) of the regex
-				 * string. */
-    regex_t *end;		/* End (if any) of the regex string. */
-    struct colortype *next;
-} colortype;
-
-typedef struct exttype {
-    regex_t val;		/* The extensions that match this
-				 * syntax. */
-    struct exttype *next;
-} exttype;
-
-typedef struct syntaxtype {
-    char *desc;			/* Name of this syntax type. */
-    exttype *extensions;	/* List of extensions that this syntax
-				 * applies to. */
-    colortype *color;		/* Color struct for this syntax. */
-    struct syntaxtype *next;
-} syntaxtype;
-#endif
-
 /* Bitwise flags so that we can save space (or, more correctly, not
  * waste it). */
 #define CASE_SENSITIVE		(1<<0)
diff --git a/src/proto.h b/src/proto.h
index 2262f1ad..a8e4f005 100644
--- a/src/proto.h
+++ b/src/proto.h
@@ -37,7 +37,7 @@
 extern ssize_t wrap_at;
 #endif
 extern int editwinrows;
-extern unsigned long flags;
+extern long flags;
 extern ssize_t tabsize;
 extern int currslen;
 
@@ -88,7 +88,6 @@ extern partition *filepart;
 extern openfilestruct *openfile;
 
 #ifdef ENABLE_COLOR
-extern const colortype *colorstrings;
 extern syntaxtype *syntaxes;
 extern char *syntaxstr;
 #endif
@@ -211,7 +210,7 @@ bool is_valid_mbstring(const char *s);
 /* Public functions in color.c. */
 #ifdef ENABLE_COLOR
 void set_colorpairs(void);
-void do_colorinit(void);
+void color_init(void);
 void update_color(void);
 #endif /* ENABLE_COLOR */
 
@@ -466,7 +465,7 @@ void rcfile_error(const char *msg, ...);
 char *parse_next_word(char *ptr);
 char *parse_argument(char *ptr);
 #ifdef ENABLE_COLOR
-int color_to_int(const char *colorname, bool *bright);
+int color_to_short(const char *colorname, bool *bright);
 char *parse_next_regex(char *ptr);
 bool nregcomp(regex_t *preg, const char *regex, int eflags);
 void parse_syntax(char *ptr);
@@ -573,8 +572,8 @@ void get_totals(const filestruct *begin, const filestruct *end, size_t
 #ifndef NANO_SMALL
 void reset_kbinput(void);
 #endif
-void get_buffer(WINDOW *win);
-size_t get_buffer_len(void);
+void get_key_buffer(WINDOW *win);
+size_t get_key_buffer_len(void);
 void unget_input(int *input, size_t input_len);
 void unget_kbinput(int kbinput, bool meta_key, bool func_key);
 int *get_input(WINDOW *win, size_t input_len);
diff --git a/src/rcfile.c b/src/rcfile.c
index 8fed47b1..347d346f 100644
--- a/src/rcfile.c
+++ b/src/rcfile.c
@@ -182,9 +182,9 @@ char *parse_argument(char *ptr)
 }
 
 #ifdef ENABLE_COLOR
-int color_to_int(const char *colorname, bool *bright)
+int color_to_short(const char *colorname, bool *bright)
 {
-    int mcolor = -1;
+    short mcolor = -1;
 
     assert(colorname != NULL && bright != NULL);
 
@@ -246,8 +246,8 @@ char *parse_next_regex(char *ptr)
     return ptr;
 }
 
-/* Compile the regular expression regex to preg.  Return FALSE on
- * success, or TRUE if the expression is invalid. */
+/* Compile the regular expression regex to preg.  Return TRUE on
+ * success, or FALSE if the expression is invalid. */
 bool nregcomp(regex_t *preg, const char *regex, int eflags)
 {
     int rc = regcomp(preg, regex, REG_EXTENDED | eflags);
@@ -261,7 +261,7 @@ bool nregcomp(regex_t *preg, const char *regex, int eflags)
 	free(str);
     }
 
-    return (rc != 0);
+    return (rc == 0);
 }
 
 void parse_syntax(char *ptr)
@@ -329,7 +329,7 @@ void parse_syntax(char *ptr)
 	    break;
 
 	newext = (exttype *)nmalloc(sizeof(exttype));
-	if (nregcomp(&newext->val, fileregptr, REG_NOSUB))
+	if (!nregcomp(&newext->val, fileregptr, REG_NOSUB))
 	    free(newext);
 	else {
 	    if (endext == NULL)
@@ -346,7 +346,7 @@ void parse_syntax(char *ptr)
  * treat the color stuff as case insensitive. */
 void parse_colors(char *ptr, bool icase)
 {
-    int fg, bg;
+    short fg, bg;
     bool bright = FALSE, no_fgcolor = FALSE;
     char *fgstr;
 
@@ -377,12 +377,12 @@ void parse_colors(char *ptr, bool icase)
 		bgcolorname);
 	    return;
 	}
-	bg = color_to_int(bgcolorname, &bright);
+	bg = color_to_short(bgcolorname, &bright);
     } else
 	bg = -1;
 
     if (!no_fgcolor) {
-	fg = color_to_int(fgstr, &bright);
+	fg = color_to_short(fgstr, &bright);
 
 	/* Don't try to parse screwed-up foreground colors. */
 	if (fg == -1)
@@ -431,28 +431,40 @@ void parse_colors(char *ptr, bool icase)
 	if (ptr == NULL)
 	    break;
 
-	if (nregcomp(&newcolor->start, fgstr, icase ? REG_ICASE : 0)) {
-	    free(newcolor);
-	    cancelled = TRUE;
-	} else {
+	newcolor->start = (regex_t *)nmalloc(sizeof(regex_t));
+	if (nregcomp(newcolor->start, fgstr, icase ? REG_ICASE : 0)) {
+	    /* Free this regex, now that we know it's valid, and save
+	     * the original string, so that we can recompile this regex
+	     * later as needed. */
+	    newcolor->startstr = mallocstrcpy(NULL, fgstr);
+	    regfree(newcolor->start);
+	    free(newcolor->start);
+	    newcolor->start = NULL;
+
 	    newcolor->fg = fg;
 	    newcolor->bg = bg;
 	    newcolor->bright = bright;
-	    newcolor->next = NULL;
+	    newcolor->icase = icase;
+	    newcolor->endstr = NULL;
 	    newcolor->end = NULL;
+	    newcolor->next = NULL;
 
 	    if (endcolor == NULL) {
 		endsyntax->color = newcolor;
 #ifdef DEBUG
-		fprintf(stderr, "Starting a new colorstring for fg %d, bg %d\n", fg, bg);
+		fprintf(stderr, "Starting a new colorstring for fg %hd, bg %hd\n", fg, bg);
 #endif
 	    } else {
 #ifdef DEBUG
-		fprintf(stderr, "Adding new entry for fg %d, bg %d\n", fg, bg);
+		fprintf(stderr, "Adding new entry for fg %hd, bg %hd\n", fg, bg);
 #endif
 		endcolor->next = newcolor;
 	    }
 	    endcolor = newcolor;
+	} else {
+	    free(newcolor->start);
+	    free(newcolor);
+	    cancelled = TRUE;
 	}
 
 	if (expectend) {
@@ -482,9 +494,15 @@ void parse_colors(char *ptr, bool icase)
 
 	    newcolor->end = (regex_t *)nmalloc(sizeof(regex_t));
 	    if (nregcomp(newcolor->end, fgstr, icase ? REG_ICASE : 0)) {
-		free(newcolor->end);
-		newcolor->end = NULL;
+		/* Free this regex, now that we know it's valid, and
+		 * save the original string, so that we can recompile
+		 * this regex later as needed. */
+		newcolor->endstr = mallocstrcpy(NULL, fgstr);
+		regfree(newcolor->end);
 	    }
+
+	    free(newcolor->end);
+	    newcolor->end = NULL;
 	}
     }
 }
diff --git a/src/search.c b/src/search.c
index 11f6f8c5..c169c18f 100644
--- a/src/search.c
+++ b/src/search.c
@@ -842,7 +842,10 @@ ssize_t do_replace_loop(const char *needle, const filestruct
 
 	    if (!replaceall) {
 #ifdef ENABLE_COLOR
-		if (!ISSET(NO_COLOR_SYNTAX))
+		/* If color syntaxes are available and turned on, we
+		 * need to call edit_refresh(). */
+		if (openfile->colorstrings != NULL &&
+			!ISSET(NO_COLOR_SYNTAX))
 		    edit_refresh();
 		else
 #endif
diff --git a/src/winio.c b/src/winio.c
index 01d96dcd..3ee48fbf 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -127,7 +127,7 @@ void reset_kbinput(void)
 /* Read in a sequence of keystrokes from win and save them in the
  * default keystroke buffer.  This should only be called when the
  * default keystroke buffer is empty. */
-void get_buffer(WINDOW *win)
+void get_key_buffer(WINDOW *win)
 {
     int input;
 
@@ -190,12 +190,12 @@ void get_buffer(WINDOW *win)
     nodelay(win, FALSE);
 
 #ifdef DEBUG
-    fprintf(stderr, "get_buffer(): key_buffer_len = %lu\n", (unsigned long)key_buffer_len);
+    fprintf(stderr, "get_key_buffer(): key_buffer_len = %lu\n", (unsigned long)key_buffer_len);
 #endif
 }
 
 /* Return the length of the default keystroke buffer. */
-size_t get_buffer_len(void)
+size_t get_key_buffer_len(void)
 {
     return key_buffer_len;
 }
@@ -270,7 +270,7 @@ int *get_input(WINDOW *win, size_t input_len)
 
     if (key_buffer_len == 0) {
 	if (win != NULL)
-	    get_buffer(win);
+	    get_key_buffer(win);
 
 	if (key_buffer_len == 0)
 	    return NULL;
@@ -504,7 +504,7 @@ int parse_kbinput(WINDOW *win, bool *meta_key, bool *func_key
 		     * waiting, we have a true escape sequence, so
 		     * interpret it. */
 		    escapes = 0;
-		    if (get_buffer_len() == 0) {
+		    if (get_key_buffer_len() == 0) {
 			*meta_key = TRUE;
 			retval = tolower(*kbinput);
 		    } else {
@@ -517,7 +517,7 @@ int parse_kbinput(WINDOW *win, bool *meta_key, bool *func_key
 			 * sequence into its corresponding key value,
 			 * and save that as the result. */
 			unget_input(kbinput, 1);
-			seq_len = get_buffer_len();
+			seq_len = get_key_buffer_len();
 			seq = get_input(NULL, seq_len);
 			retval = get_escape_seq_kbinput(seq, seq_len,
 				&ignore_seq);
@@ -1460,7 +1460,7 @@ int *parse_verbatim_kbinput(WINDOW *win, size_t *kbinput_len)
 
     /* Get the complete sequence, and save the characters in it as the
      * result. */
-    *kbinput_len = get_buffer_len();
+    *kbinput_len = get_key_buffer_len();
     retval = get_input(NULL, *kbinput_len);
 
     return retval;
@@ -1700,7 +1700,7 @@ int do_statusbar_input(bool *meta_key, bool *func_key, bool *s_or_t,
 	/* If we got a shortcut, or if there aren't any other characters
 	 * waiting after the one we read in, we need to display all the
 	 * characters in the input buffer if it isn't empty. */
-	 if (*s_or_t == TRUE || get_buffer_len() == 0) {
+	 if (*s_or_t == TRUE || get_key_buffer_len() == 0) {
 	    if (kbinput != NULL) {
 
 		/* Display all the characters in the input buffer at
@@ -3113,7 +3113,7 @@ void edit_add(const filestruct *fileptr, const char *converted, int
 	 * string. */
 #endif
 
-    assert(fileptr != NULL && converted != NULL);
+    assert(openfile != NULL && fileptr != NULL && converted != NULL);
     assert(strlenpt(converted) <= COLS);
 
     /* Just paint the string in any case (we'll add color or reverse on
@@ -3121,8 +3121,10 @@ void edit_add(const filestruct *fileptr, const char *converted, int
     mvwaddstr(edit, yval, 0, converted);
 
 #ifdef ENABLE_COLOR
-    if (colorstrings != NULL && !ISSET(NO_COLOR_SYNTAX)) {
-	const colortype *tmpcolor = colorstrings;
+    /* If color syntaxes are available and turned on, we need to display
+     * them. */
+    if (openfile->colorstrings != NULL && !ISSET(NO_COLOR_SYNTAX)) {
+	const colortype *tmpcolor = openfile->colorstrings;
 
 	for (; tmpcolor != NULL; tmpcolor = tmpcolor->next) {
 	    int x_start;
@@ -3157,7 +3159,7 @@ void edit_add(const filestruct *fileptr, const char *converted, int
 		     * not to match the beginning-of-line character
 		     * unless k is 0.  If regexec() returns REG_NOMATCH,
 		     * there are no more matches in the line. */
-		    if (regexec(&tmpcolor->start, &fileptr->data[k], 1,
+		    if (regexec(tmpcolor->start, &fileptr->data[k], 1,
 			&startmatch, (k == 0) ? 0 :
 			REG_NOTBOL) == REG_NOMATCH)
 			break;
@@ -3208,9 +3210,9 @@ void edit_add(const filestruct *fileptr, const char *converted, int
 		    /* Where it starts in that line. */
 		const filestruct *end_line;
 
-		while (start_line != NULL &&
-			regexec(&tmpcolor->start, start_line->data, 1,
-			&startmatch, 0) == REG_NOMATCH) {
+		while (start_line != NULL && regexec(tmpcolor->start,
+			start_line->data, 1, &startmatch,
+			0) == REG_NOMATCH) {
 		    /* If there is an end on this line, there is no need
 		     * to look for starts on earlier lines. */
 		    if (regexec(tmpcolor->end, start_line->data, 0,
@@ -3235,7 +3237,7 @@ void edit_add(const filestruct *fileptr, const char *converted, int
 			/* No end found after this start. */
 			break;
 		    start_col++;
-		    if (regexec(&tmpcolor->start, start_line->data +
+		    if (regexec(tmpcolor->start, start_line->data +
 			start_col, 1, &startmatch,
 			REG_NOTBOL) == REG_NOMATCH)
 			/* No later start on this line. */
@@ -3280,11 +3282,10 @@ void edit_add(const filestruct *fileptr, const char *converted, int
 		start_col = 0;
 
 		while (start_col < endpos) {
-		    if (regexec(&tmpcolor->start,
-			fileptr->data + start_col, 1, &startmatch,
-			(start_col == 0) ? 0 :
-			REG_NOTBOL) == REG_NOMATCH ||
-			start_col + startmatch.rm_so >= endpos)
+		    if (regexec(tmpcolor->start, fileptr->data +
+			start_col, 1, &startmatch, (start_col == 0) ?
+			0 : REG_NOTBOL) == REG_NOMATCH || start_col +
+			startmatch.rm_so >= endpos)
 			/* No more starts on this line. */
 			break;
 		    /* Translate the match to be relative to the
@@ -3353,6 +3354,7 @@ void edit_add(const filestruct *fileptr, const char *converted, int
 #endif /* ENABLE_COLOR */
 
 #ifndef NANO_SMALL
+    /* If the mark is on, we need to display it. */
     if (openfile->mark_set && (fileptr->lineno <=
 	openfile->mark_begin->lineno || fileptr->lineno <=
 	openfile->current->lineno) && (fileptr->lineno >=
-- 
GitLab