1
1

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.
Этот коммит содержится в:
Benno Schulenberg 2020-06-22 08:39:59 +02:00
родитель a7aab18dfe
Коммит 0f0b620c65

Просмотреть файл

@ -2042,7 +2042,160 @@ 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(openfile->mark != NULL, 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) {
openfile->filetop->has_anchor = FALSE;
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. */
@ -2340,159 +2493,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(openfile->mark != NULL, 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) {
openfile->filetop->has_anchor = FALSE;
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)