342 lines
10 KiB
Diff
342 lines
10 KiB
Diff
From 4b7f7a30c9ec593d68186b1dfef44d4e2bda735b Mon Sep 17 00:00:00 2001
|
|
From: Benno Schulenberg <bensberg@telfort.nl>
|
|
Date: Mon, 22 Jun 2020 08:39:59 +0200
|
|
Subject: [PATCH] build: fix compilation when configured with
|
|
--disable-speller
|
|
|
|
Move two functions that are used by the formatter too
|
|
to between the proper #ifdef.
|
|
|
|
Problem existed since commit 8089f5ad from a month ago.
|
|
|
|
Backported to v4.9.3
|
|
Signed-off-by: Lars Wendler <polynomial-c@gentoo.org>
|
|
---
|
|
src/text.c | 302 ++++++++++++++++++++++++++---------------------------
|
|
1 file changed, 151 insertions(+), 151 deletions(-)
|
|
|
|
diff --git a/src/text.c b/src/text.c
|
|
index 93ad3704..c7690fd0 100644
|
|
--- a/src/text.c
|
|
+++ b/src/text.c
|
|
@@ -2011,8 +2011,159 @@ void construct_argument_list(char ***arguments, char *command, char *filename)
|
|
(*arguments)[count - 2] = filename;
|
|
(*arguments)[count - 1] = NULL;
|
|
}
|
|
+
|
|
+/* Open the specified file, and if that succeeds, remove the text of the marked
|
|
+ * region or of the entire buffer and read the file contents into its place. */
|
|
+bool replace_buffer(const char *filename, undo_type action, const char *operation)
|
|
+{
|
|
+ linestruct *was_cutbuffer = cutbuffer;
|
|
+ int descriptor;
|
|
+ FILE *stream;
|
|
+
|
|
+ descriptor = open_file(filename, FALSE, &stream);
|
|
+
|
|
+ if (descriptor < 0)
|
|
+ return FALSE;
|
|
+
|
|
+ cutbuffer = NULL;
|
|
+
|
|
+#ifndef NANO_TINY
|
|
+ add_undo(COUPLE_BEGIN, operation);
|
|
+
|
|
+ /* Cut either the marked region or the whole buffer. */
|
|
+ add_undo(action, NULL);
|
|
+#endif
|
|
+ do_snip(FALSE, openfile->mark, openfile->mark == NULL, FALSE);
|
|
+#ifndef NANO_TINY
|
|
+ update_undo(action);
|
|
#endif
|
|
|
|
+ /* Discard what was cut. */
|
|
+ free_lines(cutbuffer);
|
|
+ cutbuffer = was_cutbuffer;
|
|
+
|
|
+ /* Insert the spell-checked file into the cleared area. */
|
|
+ read_file(stream, descriptor, filename, TRUE);
|
|
+
|
|
+#ifndef NANO_TINY
|
|
+ add_undo(COUPLE_END, operation);
|
|
+#endif
|
|
+ return TRUE;
|
|
+}
|
|
+
|
|
+/* Execute the given program, with the given temp file as last argument. */
|
|
+const char *treat(char *tempfile_name, char *theprogram, bool spelling)
|
|
+{
|
|
+ ssize_t lineno_save = openfile->current->lineno;
|
|
+ size_t current_x_save = openfile->current_x;
|
|
+ size_t pww_save = openfile->placewewant;
|
|
+ bool was_at_eol = (openfile->current->data[openfile->current_x] == '\0');
|
|
+ struct stat fileinfo;
|
|
+ long timestamp_sec, timestamp_nsec;
|
|
+ static char **arguments = NULL;
|
|
+ pid_t thepid;
|
|
+ int program_status;
|
|
+ bool replaced = FALSE;
|
|
+
|
|
+ /* Get the timestamp and the size of the temporary file. */
|
|
+ stat(tempfile_name, &fileinfo);
|
|
+ timestamp_sec = (long)fileinfo.st_mtim.tv_sec;
|
|
+ timestamp_nsec = (long)fileinfo.st_mtim.tv_nsec;
|
|
+
|
|
+ /* If the number of bytes to check is zero, get out. */
|
|
+ if (fileinfo.st_size == 0)
|
|
+ return NULL;
|
|
+
|
|
+ /* Exit from curses mode to give the program control of the terminal. */
|
|
+ endwin();
|
|
+
|
|
+ construct_argument_list(&arguments, theprogram, tempfile_name);
|
|
+
|
|
+ /* Fork a child process and run the given program in it. */
|
|
+ if ((thepid = fork()) == 0) {
|
|
+ execvp(arguments[0], arguments);
|
|
+
|
|
+ /* Terminate the child if the program is not found. */
|
|
+ exit(9);
|
|
+ } else if (thepid < 0)
|
|
+ return _("Could not fork");
|
|
+
|
|
+ /* Block SIGWINCHes while waiting for the program to end,
|
|
+ * so nano doesn't get pushed past the wait(). */
|
|
+ block_sigwinch(TRUE);
|
|
+ wait(&program_status);
|
|
+ block_sigwinch(FALSE);
|
|
+
|
|
+ /* Restore the terminal state and reenter curses mode. */
|
|
+ terminal_init();
|
|
+ doupdate();
|
|
+
|
|
+ if (!WIFEXITED(program_status) || WEXITSTATUS(program_status) > 2) {
|
|
+ statusline(ALERT, _("Error invoking '%s'"), arguments[0]);
|
|
+ return NULL;
|
|
+ } else if (WEXITSTATUS(program_status) != 0)
|
|
+ statusline(ALERT, _("Program '%s' complained"), arguments[0]);
|
|
+
|
|
+ /* Stat the temporary file again. */
|
|
+ stat(tempfile_name, &fileinfo);
|
|
+
|
|
+ /* When the temporary file wasn't touched, say so and leave. */
|
|
+ if ((long)fileinfo.st_mtim.tv_sec == timestamp_sec &&
|
|
+ (long)fileinfo.st_mtim.tv_nsec == timestamp_nsec) {
|
|
+ statusbar(_("Nothing changed"));
|
|
+ return NULL;
|
|
+ }
|
|
+
|
|
+#ifndef NANO_TINY
|
|
+ /* Replace the marked text (or entire text) with the corrected text. */
|
|
+ if (spelling && openfile->mark) {
|
|
+ ssize_t was_mark_lineno = openfile->mark->lineno;
|
|
+ bool upright = mark_is_before_cursor();
|
|
+
|
|
+ replaced = replace_buffer(tempfile_name, CUT, "spelling correction");
|
|
+
|
|
+ /* Adjust the end point of the marked region for any change in
|
|
+ * length of the region's last line. */
|
|
+ if (upright)
|
|
+ current_x_save = openfile->current_x;
|
|
+ else
|
|
+ openfile->mark_x = openfile->current_x;
|
|
+
|
|
+ /* Restore the mark. */
|
|
+ openfile->mark = line_from_number(was_mark_lineno);
|
|
+ } else
|
|
+#endif
|
|
+ {
|
|
+ openfile->current = openfile->filetop;
|
|
+ openfile->current_x = 0;
|
|
+
|
|
+ replaced = replace_buffer(tempfile_name, CUT_TO_EOF,
|
|
+ /* TRANSLATORS: The next two go with Undid/Redid messages. */
|
|
+ (spelling ? N_("spelling correction") : N_("formatting")));
|
|
+ }
|
|
+
|
|
+ /* Go back to the old position. */
|
|
+ goto_line_posx(lineno_save, current_x_save);
|
|
+ if (was_at_eol || openfile->current_x > strlen(openfile->current->data))
|
|
+ openfile->current_x = strlen(openfile->current->data);
|
|
+
|
|
+#ifndef NANO_TINY
|
|
+ if (replaced)
|
|
+ update_undo(COUPLE_END);
|
|
+#endif
|
|
+
|
|
+ openfile->placewewant = pww_save;
|
|
+ adjust_viewport(STATIONARY);
|
|
+
|
|
+ if (spelling)
|
|
+ statusbar(_("Finished checking spelling"));
|
|
+ else
|
|
+ statusbar(_("Buffer has been processed"));
|
|
+
|
|
+ return NULL;
|
|
+}
|
|
+#endif /* ENABLE_SPELLER || ENABLE_COLOR */
|
|
+
|
|
#ifdef ENABLE_SPELLER
|
|
/* Let the user edit the misspelled word. Return FALSE if the user cancels. */
|
|
bool fix_spello(const char *word)
|
|
@@ -2307,157 +2458,6 @@ const char *do_int_speller(const char *tempfile_name)
|
|
return NULL;
|
|
}
|
|
|
|
-/* Open the specified file, and if that succeeds, remove the text of the marked
|
|
- * region or of the entire buffer and read the file contents into its place. */
|
|
-bool replace_buffer(const char *filename, undo_type action, const char *operation)
|
|
-{
|
|
- linestruct *was_cutbuffer = cutbuffer;
|
|
- int descriptor;
|
|
- FILE *stream;
|
|
-
|
|
- descriptor = open_file(filename, FALSE, &stream);
|
|
-
|
|
- if (descriptor < 0)
|
|
- return FALSE;
|
|
-
|
|
- cutbuffer = NULL;
|
|
-
|
|
-#ifndef NANO_TINY
|
|
- add_undo(COUPLE_BEGIN, operation);
|
|
-
|
|
- /* Cut either the marked region or the whole buffer. */
|
|
- add_undo(action, NULL);
|
|
-#endif
|
|
- do_snip(FALSE, openfile->mark, openfile->mark == NULL, FALSE);
|
|
-#ifndef NANO_TINY
|
|
- update_undo(action);
|
|
-#endif
|
|
-
|
|
- /* Discard what was cut. */
|
|
- free_lines(cutbuffer);
|
|
- cutbuffer = was_cutbuffer;
|
|
-
|
|
- /* Insert the spell-checked file into the cleared area. */
|
|
- read_file(stream, descriptor, filename, TRUE);
|
|
-
|
|
-#ifndef NANO_TINY
|
|
- add_undo(COUPLE_END, operation);
|
|
-#endif
|
|
- return TRUE;
|
|
-}
|
|
-
|
|
-/* Execute the given program, with the given temp file as last argument. */
|
|
-const char *treat(char *tempfile_name, char *theprogram, bool spelling)
|
|
-{
|
|
- ssize_t lineno_save = openfile->current->lineno;
|
|
- size_t current_x_save = openfile->current_x;
|
|
- size_t pww_save = openfile->placewewant;
|
|
- bool was_at_eol = (openfile->current->data[openfile->current_x] == '\0');
|
|
- struct stat fileinfo;
|
|
- long timestamp_sec, timestamp_nsec;
|
|
- static char **arguments = NULL;
|
|
- pid_t thepid;
|
|
- int program_status;
|
|
- bool replaced = FALSE;
|
|
-
|
|
- /* Get the timestamp and the size of the temporary file. */
|
|
- stat(tempfile_name, &fileinfo);
|
|
- timestamp_sec = (long)fileinfo.st_mtim.tv_sec;
|
|
- timestamp_nsec = (long)fileinfo.st_mtim.tv_nsec;
|
|
-
|
|
- /* If the number of bytes to check is zero, get out. */
|
|
- if (fileinfo.st_size == 0)
|
|
- return NULL;
|
|
-
|
|
- /* Exit from curses mode to give the program control of the terminal. */
|
|
- endwin();
|
|
-
|
|
- construct_argument_list(&arguments, theprogram, tempfile_name);
|
|
-
|
|
- /* Fork a child process and run the given program in it. */
|
|
- if ((thepid = fork()) == 0) {
|
|
- execvp(arguments[0], arguments);
|
|
-
|
|
- /* Terminate the child if the program is not found. */
|
|
- exit(9);
|
|
- } else if (thepid < 0)
|
|
- return _("Could not fork");
|
|
-
|
|
- /* Block SIGWINCHes while waiting for the program to end,
|
|
- * so nano doesn't get pushed past the wait(). */
|
|
- block_sigwinch(TRUE);
|
|
- wait(&program_status);
|
|
- block_sigwinch(FALSE);
|
|
-
|
|
- /* Restore the terminal state and reenter curses mode. */
|
|
- terminal_init();
|
|
- doupdate();
|
|
-
|
|
- if (!WIFEXITED(program_status) || WEXITSTATUS(program_status) > 2) {
|
|
- statusline(ALERT, _("Error invoking '%s'"), arguments[0]);
|
|
- return NULL;
|
|
- } else if (WEXITSTATUS(program_status) != 0)
|
|
- statusline(ALERT, _("Program '%s' complained"), arguments[0]);
|
|
-
|
|
- /* Stat the temporary file again. */
|
|
- stat(tempfile_name, &fileinfo);
|
|
-
|
|
- /* When the temporary file wasn't touched, say so and leave. */
|
|
- if ((long)fileinfo.st_mtim.tv_sec == timestamp_sec &&
|
|
- (long)fileinfo.st_mtim.tv_nsec == timestamp_nsec) {
|
|
- statusbar(_("Nothing changed"));
|
|
- return NULL;
|
|
- }
|
|
-
|
|
-#ifndef NANO_TINY
|
|
- /* Replace the marked text (or entire text) with the corrected text. */
|
|
- if (spelling && openfile->mark) {
|
|
- ssize_t was_mark_lineno = openfile->mark->lineno;
|
|
- bool upright = mark_is_before_cursor();
|
|
-
|
|
- replaced = replace_buffer(tempfile_name, CUT, "spelling correction");
|
|
-
|
|
- /* Adjust the end point of the marked region for any change in
|
|
- * length of the region's last line. */
|
|
- if (upright)
|
|
- current_x_save = openfile->current_x;
|
|
- else
|
|
- openfile->mark_x = openfile->current_x;
|
|
-
|
|
- /* Restore the mark. */
|
|
- openfile->mark = line_from_number(was_mark_lineno);
|
|
- } else
|
|
-#endif
|
|
- {
|
|
- openfile->current = openfile->filetop;
|
|
- openfile->current_x = 0;
|
|
-
|
|
- replaced = replace_buffer(tempfile_name, CUT_TO_EOF,
|
|
- /* TRANSLATORS: The next two go with Undid/Redid messages. */
|
|
- (spelling ? N_("spelling correction") : N_("formatting")));
|
|
- }
|
|
-
|
|
- /* Go back to the old position. */
|
|
- goto_line_posx(lineno_save, current_x_save);
|
|
- if (was_at_eol || openfile->current_x > strlen(openfile->current->data))
|
|
- openfile->current_x = strlen(openfile->current->data);
|
|
-
|
|
-#ifndef NANO_TINY
|
|
- if (replaced)
|
|
- update_undo(COUPLE_END);
|
|
-#endif
|
|
-
|
|
- openfile->placewewant = pww_save;
|
|
- adjust_viewport(STATIONARY);
|
|
-
|
|
- if (spelling)
|
|
- statusbar(_("Finished checking spelling"));
|
|
- else
|
|
- statusbar(_("Buffer has been processed"));
|
|
-
|
|
- return NULL;
|
|
-}
|
|
-
|
|
/* Spell check the current file. If an alternate spell checker is
|
|
* specified, use it. Otherwise, use the internal spell checker. */
|
|
void do_spell(void)
|
|
--
|
|
2.28.0
|
|
|