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.
Этот коммит содержится в:
родитель
a7aab18dfe
Коммит
0f0b620c65
306
src/text.c
306
src/text.c
@ -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)
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user