From 4b7f7a30c9ec593d68186b1dfef44d4e2bda735b Mon Sep 17 00:00:00 2001 From: Benno Schulenberg 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 --- 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