diff src/regexp_nfa.c @ 27000:8c0730eca2ce v8.2.4029

patch 8.2.4029: debugging NFA regexp my crash, cached indent may be wrong Commit: https://github.com/vim/vim/commit/b2d85e3784ac89f5209489844c1ee0f54d117abb Author: Bram Moolenaar <Bram@vim.org> Date: Fri Jan 7 16:55:32 2022 +0000 patch 8.2.4029: debugging NFA regexp my crash, cached indent may be wrong Problem: Debugging NFA regexp my crash, cached indent may be wrong. Solution: Fix some debug warnings in the NFA regexp code. Make sure log_fd is set when used. Fix breakindent and indent caching. (Christian Brabandt, closes #9482)
author Bram Moolenaar <Bram@vim.org>
date Fri, 07 Jan 2022 18:00:04 +0100
parents ac75c145f0a9
children fb4c30606b4a
line wrap: on
line diff
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -2885,7 +2885,7 @@ nfa_print_state2(FILE *debugf, nfa_state
 	char_u	save[2];
 
 	STRNCPY(save, &p[last], 2);
-	STRNCPY(&p[last], "+-", 2);
+	memcpy(&p[last], "+-", 2);
 	fprintf(debugf, " %s", p);
 	STRNCPY(&p[last], save, 2);
     }
@@ -4292,6 +4292,23 @@ sub_equal(regsub_T *sub1, regsub_T *sub2
 
 #ifdef ENABLE_LOG
     static void
+open_debug_log(int result)
+{
+    log_fd = fopen(NFA_REGEXP_RUN_LOG, "a");
+    if (log_fd == NULL)
+    {
+	emsg(_(e_log_open_failed));
+	log_fd = stderr;
+    }
+
+    fprintf(log_fd, "****************************\n");
+    fprintf(log_fd, "FINISHED RUNNING nfa_regmatch() recursively\n");
+    fprintf(log_fd, "MATCH = %s\n", result == TRUE ? "OK" : result == MAYBE
+	    ? "MAYBE" : "FALSE");
+    fprintf(log_fd, "****************************\n");
+}
+
+    static void
 report_state(char *action,
 	     regsub_T *sub,
 	     nfa_state_T *state,
@@ -4307,6 +4324,9 @@ report_state(char *action,
     else
 	col = (int)(sub->list.line[0].start - rex.line);
     nfa_set_code(state->c);
+    if (log_fd == NULL)
+	open_debug_log(MAYBE);
+
     fprintf(log_fd, "> %s state %d to list %d. char %d: %s (start col %d)%s\n",
 	    action, abs(state->id), lid, state->c, code, col,
 	    pim_info(pim));
@@ -5430,19 +5450,7 @@ recursive_regmatch(
     nfa_endp = save_nfa_endp;
 
 #ifdef ENABLE_LOG
-    log_fd = fopen(NFA_REGEXP_RUN_LOG, "a");
-    if (log_fd != NULL)
-    {
-	fprintf(log_fd, "****************************\n");
-	fprintf(log_fd, "FINISHED RUNNING nfa_regmatch() recursively\n");
-	fprintf(log_fd, "MATCH = %s\n", result == TRUE ? "OK" : "FALSE");
-	fprintf(log_fd, "****************************\n");
-    }
-    else
-    {
-	emsg(_(e_log_open_failed));
-	log_fd = stderr;
-    }
+    open_debug_log(result);
 #endif
 
     return result;
@@ -5775,19 +5783,16 @@ nfa_regmatch(
 
 #ifdef ENABLE_LOG
     log_fd = fopen(NFA_REGEXP_RUN_LOG, "a");
-    if (log_fd != NULL)
-    {
-	fprintf(log_fd, "**********************************\n");
-	nfa_set_code(start->c);
-	fprintf(log_fd, " RUNNING nfa_regmatch() starting with state %d, code %s\n",
-	abs(start->id), code);
-	fprintf(log_fd, "**********************************\n");
-    }
-    else
+    if (log_fd == NULL)
     {
 	emsg(_(e_log_open_failed));
 	log_fd = stderr;
     }
+    fprintf(log_fd, "**********************************\n");
+    nfa_set_code(start->c);
+    fprintf(log_fd, " RUNNING nfa_regmatch() starting with state %d, code %s\n",
+    abs(start->id), code);
+    fprintf(log_fd, "**********************************\n");
 #endif
 
     thislist = &list[0];
@@ -6919,7 +6924,7 @@ nfa_regmatch(
 
 #ifdef DEBUG
 		if (c < 0)
-		    siemsg("INTERNAL: Negative state char: %ld", c);
+		    siemsg("INTERNAL: Negative state char: %ld", (long)c);
 #endif
 		result = (c == curc);