miscellaneous bug fixes, part 2

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1331 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
This commit is contained in:
David Lawrence Ramsey 2002-12-22 16:30:00 +00:00
parent 334a94049f
commit 9b13ff31bb
14 changed files with 505 additions and 423 deletions

View File

@ -9,9 +9,72 @@ CVS code -
- Minor cosmetic tweaks to the ngettext() macro, and fix to - Minor cosmetic tweaks to the ngettext() macro, and fix to
properly detect systems lacking ngettext() and correctly properly detect systems lacking ngettext() and correctly
compile on them; the previous fix didn't work. (DLR) compile on them; the previous fix didn't work. (DLR)
- Fix problems with some code sections' not being #ifdef'ed out
when they should be, or being #ifdef'ed out improperly. (David
Benbennick and DLR)
- Change FOLLOW_SYMLINKS to NOFOLLOW_SYMLINKS, and rework the
associated logic accordingly, throughout the code. (David
Benbennick)
- Rework #ifdefs to not include mouse_init() at all if
DISABLE_MOUSE is defined or NCURSES_MOUSE_VERSION isn't. (DLR)
- For consistency, change many references of (!x) to (x == NULL)
and (x) to (x != NULL). (DLR)
- Define KEY_IC properly (and KEY_DC more portably) when slang
support is enabled, and remove the hack to work around the
former's not being defined. (David Benbennick and DLR)
- configure.ac: - configure.ac:
- Added tr to ALL_LINGUAS (Jordi). - Added tr to ALL_LINGUAS (Jordi).
- Fix now inaccurate description of --enable-tiny's effects; it
no longer disables NLS support. (DLR)
- Fix typo. (David Benbennick)
- Check for strcasecmp() and strncasecmp(), since they are
apparently only standard under BSD. (DLR)
- cut.c:
do_cut_text()
- Fix a memory corruption problem caused by accessing edittop
after it was freed but before it was reset to a sane value
from current. (David Benbennick)
do_uncut_text()
- If uncutting more than one line of unmarked text at editbot,
don't center the screen, since Pico doesn't. (DLR)
- files.c:
read_line()
- Miscellaneous cleanups. (David Benbennick)
read_file()
- Miscellaneous cleanups. (David Benbennick)
- Fix len's being off by one when reading in Mac-format files,
exposed by one of David Benbennick's cleanups. (DLR)
- If NO_CONVERT isn't set when we first enter, and it gets set
while reading in the file, unset it again afterwards. (DLR)
add_open_file()
- Fix minor logic error when determining when to resave fileage
and filebot. (DLR)
write_file()
- Change lineswritten from a long to an int, to match
filestruct->lineno. (DLR; mismatch found by David Benbennick)
input_tab()
- Variable name change: matchBuf -> matchbuf. (DLR)
diralphasort()
- Remove the HAVE_STRCASECMP #ifdef block; see the changes to
configure.ac and nano.h for why. (DLR)
- move.c:
do_page_down()
- If there's a page or less of text, do an edit_update() if the
mark is on; otherwise, the highlight won't be displayed. (DLR)
- nano.c: - nano.c:
do_prev_word()
- Make the assert match that in do_next_word(). (DLR)
do_enter()
- If smooth scrolling is on, and Enter is pressed on the
magicline, don't center the screen. (DLR)
do_justify()
- Fix memory corruption problem triggered when edittop and
current->next pointed to the same value and current->next was
destroyed during justification. (DLR)
- Center the screen when justification moves the cursor entirely
off the bottom of the screen, instead of when it moves the
cursor near the bottom of the screen, to more closely match
Pico's behavior. (DLR)
version() version()
- Remove obsolete reference to --enable-undo. (David Benbennick) - Remove obsolete reference to --enable-undo. (David Benbennick)
do_int_speller() do_int_speller()
@ -23,7 +86,22 @@ CVS code -
- Programs now return char *, NULL for successful completion, - Programs now return char *, NULL for successful completion,
otherwise the error string to display. This allows us to give otherwise the error string to display. This allows us to give
more useful feedback to the user when spell checking fails. more useful feedback to the user when spell checking fails.
ABCD()
- Renamed abcd(). (DLR)
- nano.h:
- Make sure NO_RCFILE and COLOR_SYNTAX aren't set to the same
value. (DLR; discovered by Ken Tyler)
- If strcasecmp() and/or strncasecmp() aren't available, use
strcmp() and/or strncmp instead. (DLR)
- utils.c:
is_cntrl_char()
- Rework to fix a problem with displaying certain high-bit
characters. (David Benbennick; reported by Andrzej Marecki)
- winio.c: - winio.c:
edit_refresh()
- Miscellaneous cleanups that fix a bug where the screen
isn't updated after uncutting chunks of upwardly marked cut
text that are over a page in length. (David Benbennick)
do_credits() do_credits()
- Add David Benbennick to credits. (DLR) - Add David Benbennick to credits. (DLR)
- nanorc.sample: - nanorc.sample:

View File

@ -78,13 +78,13 @@ void do_colorinit(void)
defok = use_default_colors() != ERR; defok = use_default_colors() != ERR;
#endif #endif
for (tmpcolor = colorstrings; tmpcolor != NULL; for (tmpcolor = colorstrings; tmpcolor != NULL;
tmpcolor = tmpcolor->next) { tmpcolor = tmpcolor->next) {
short background = tmpcolor->bg; short background = tmpcolor->bg;
if (background == -1) if (background == -1)
#ifdef HAVE_USE_DEFAULT_COLORS #ifdef HAVE_USE_DEFAULT_COLORS
if (!defok) if (defok == 0)
#endif #endif
background = COLOR_BLACK; background = COLOR_BLACK;

View File

@ -37,8 +37,7 @@ AC_ARG_ENABLE(extra,
fi]) fi])
AC_ARG_ENABLE(tiny, AC_ARG_ENABLE(tiny,
[ --enable-tiny Disable features for the sake of size [ --enable-tiny Disable features for the sake of size],
(currently disables detailed help and i18n)],
[if test x$enableval = xyes; then [if test x$enableval = xyes; then
AC_DEFINE(NANO_SMALL, 1, [Define this to make the nano executable as small as possible.]) tiny_support=yes AC_DEFINE(NANO_SMALL, 1, [Define this to make the nano executable as small as possible.]) tiny_support=yes
AC_DEFINE(DISABLE_BROWSER, 1, [Define this to disable the built-in (crappy) file browser.]) AC_DEFINE(DISABLE_BROWSER, 1, [Define this to disable the built-in (crappy) file browser.])
@ -223,7 +222,7 @@ AC_MSG_WARN([*** Can not use slang when cross-compiling])),
esac], [AC_MSG_RESULT(no)]) esac], [AC_MSG_RESULT(no)])
dnl Checks for functions dnl Checks for functions
AC_CHECK_FUNCS(snprintf vsnprintf) AC_CHECK_FUNCS(snprintf vsnprintf strcasecmp strncasecmp)
if test "x$ac_cv_func_snprintf" = "xno" -o "xac_cv_func_vsnprintf" = "xno" if test "x$ac_cv_func_snprintf" = "xno" -o "xac_cv_func_vsnprintf" = "xno"
then then
AM_PATH_GLIB(1.2.4,, AM_PATH_GLIB(1.2.4,,
@ -284,7 +283,7 @@ if test x$slang_support != xyes; then
AC_CHECK_LIB([$CURSES_LIB_NAME], wresize, AC_DEFINE(HAVE_WRESIZE, 1, [Define this if you have the wresize function in your ncurses-type library.])) AC_CHECK_LIB([$CURSES_LIB_NAME], wresize, AC_DEFINE(HAVE_WRESIZE, 1, [Define this if you have the wresize function in your ncurses-type library.]))
AC_CHECK_LIB([$CURSES_LIB_NAME], resizeterm, AC_DEFINE(HAVE_RESIZETERM, 1, [Define this if you have the resizeterm function in your ncurses-type library.])) AC_CHECK_LIB([$CURSES_LIB_NAME], resizeterm, AC_DEFINE(HAVE_RESIZETERM, 1, [Define this if you have the resizeterm function in your ncurses-type library.]))
# Taken from aumix (can't tell form the variable name?) # Taken from aumix (can't tell from the variable name?)
AC_CACHE_CHECK([for private member _use_keypad in WINDOW], AC_CACHE_CHECK([for private member _use_keypad in WINDOW],
aumix_cv_struct_window_usekeypad, aumix_cv_struct_window_usekeypad,
[AC_TRY_COMPILE([#ifdef HAVE_NCURSES_H [AC_TRY_COMPILE([#ifdef HAVE_NCURSES_H

33
cut.c
View File

@ -29,7 +29,8 @@
#include "nano.h" #include "nano.h"
static int marked_cut; /* Is the cutbuffer from a mark? */ static int marked_cut; /* Is the cutbuffer from a mark? */
static filestruct *cutbottom = NULL; /* Pointer to end of cutbuffer */ static filestruct *cutbottom = NULL;
/* Pointer to end of cutbuffer */
filestruct *get_cutbottom(void) filestruct *get_cutbottom(void)
{ {
@ -39,7 +40,7 @@ filestruct *get_cutbottom(void)
void add_to_cutbuffer(filestruct *inptr) void add_to_cutbuffer(filestruct *inptr)
{ {
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, _("add_to_cutbuffer called with inptr->data = %s\n"), fprintf(stderr, _("add_to_cutbuffer() called with inptr->data = %s\n"),
inptr->data); inptr->data);
#endif #endif
@ -57,6 +58,7 @@ void add_to_cutbuffer(filestruct *inptr)
#ifndef NANO_SMALL #ifndef NANO_SMALL
/* Cut a marked segment instead of a whole line. /* Cut a marked segment instead of a whole line.
*
* The first cut character is top->data[top_x]. Unless top == bot, the * The first cut character is top->data[top_x]. Unless top == bot, the
* last cut line has length bot_x. That is, if bot_x > 0 then we cut to * last cut line has length bot_x. That is, if bot_x > 0 then we cut to
* bot->data[bot_x - 1]. * bot->data[bot_x - 1].
@ -121,8 +123,8 @@ void cut_marked_segment(filestruct *top, size_t top_x, filestruct *bot,
} else { } else {
totsize -= bot_x + 1; totsize -= bot_x + 1;
/* Here, the remainder line might get longer, so we realloc /* Here, the remainder line might get longer, so we
it first. */ realloc() it first. */
top->data = (char *)nrealloc(top->data, top->data = (char *)nrealloc(top->data,
sizeof(char) * newsize); sizeof(char) * newsize);
memmove(top->data + top_x, bot->data + bot_x, memmove(top->data + top_x, bot->data + bot_x,
@ -248,12 +250,11 @@ int do_cut_text(void)
UNSET(MARK_ISSET); UNSET(MARK_ISSET);
marked_cut = 1; marked_cut = 1;
set_modified(); if (dontupdate)
if (dontupdate) {
fix_editbot();
edit_refresh(); edit_refresh();
} else else
edit_update(current, CENTER); edit_update(current, CENTER);
set_modified();
return 1; return 1;
} }
@ -291,8 +292,7 @@ int do_cut_text(void)
int do_uncut_text(void) int do_uncut_text(void)
{ {
filestruct *tmp = current, *fileptr = current; filestruct *tmp = current, *fileptr = current;
filestruct *newbuf = NULL; filestruct *newbuf = NULL, *newend = NULL;
filestruct *newend = NULL;
#ifndef NANO_SMALL #ifndef NANO_SMALL
char *tmpstr, *tmpstr2; char *tmpstr, *tmpstr2;
filestruct *hold = current; filestruct *hold = current;
@ -305,7 +305,7 @@ int do_uncut_text(void)
return 0; /* AIEEEEEEEEEEEE */ return 0; /* AIEEEEEEEEEEEE */
#ifndef NANO_SMALL #ifndef NANO_SMALL
if (!marked_cut || cutbuffer->next != NULL) if (marked_cut == 0 || cutbuffer->next != NULL)
#endif #endif
{ {
newbuf = copy_filestruct(cutbuffer); newbuf = copy_filestruct(cutbuffer);
@ -316,7 +316,7 @@ int do_uncut_text(void)
/* Hook newbuf into fileptr */ /* Hook newbuf into fileptr */
#ifndef NANO_SMALL #ifndef NANO_SMALL
if (marked_cut) { if (marked_cut != 0) {
int recenter_me = 0; int recenter_me = 0;
/* Should we eventually use edit_update(CENTER)? */ /* Should we eventually use edit_update(CENTER)? */
@ -329,7 +329,7 @@ int do_uncut_text(void)
memmove(current->data + current_x + buf_len, memmove(current->data + current_x + buf_len,
current->data + current_x, cur_len - current_x + 1); current->data + current_x, cur_len - current_x + 1);
strncpy(current->data + current_x, cutbuffer->data, buf_len); strncpy(current->data + current_x, cutbuffer->data, buf_len);
/* Use strncpy to not copy the terminal '\0'. */ /* Use strncpy() to not copy the terminal '\0'. */
current_x += buf_len; current_x += buf_len;
totsize += buf_len; totsize += buf_len;
@ -398,8 +398,7 @@ int do_uncut_text(void)
if (marked_cut == 2) { if (marked_cut == 2) {
tmp = make_new_node(current); tmp = make_new_node(current);
tmp->data = charalloc(strlen(&current->data[current_x]) + 1); tmp->data = mallocstrcpy(NULL, current->data + current_x);
strcpy(tmp->data, &current->data[current_x]);
splice_node(current, tmp, current->next); splice_node(current, tmp, current->next);
null_at(&current->data, current_x); null_at(&current->data, current_x);
current = current->next; current = current->next;
@ -449,7 +448,9 @@ int do_uncut_text(void)
i = editbot->lineno; i = editbot->lineno;
renumber(newbuf); renumber(newbuf);
if (i < newend->lineno) /* Center the screen if we've moved beyond the line numbers of both
the old and new editbots */
if (i < newend->lineno && editbot->lineno < newend->lineno)
edit_update(fileptr, CENTER); edit_update(fileptr, CENTER);
else else
edit_refresh(); edit_refresh();

365
files.c

File diff suppressed because it is too large Load Diff

View File

@ -111,20 +111,22 @@ shortcut *writefile_list = NULL;
shortcut *insertfile_list = NULL; shortcut *insertfile_list = NULL;
shortcut *help_list = NULL; shortcut *help_list = NULL;
shortcut *spell_list = NULL; shortcut *spell_list = NULL;
#ifndef NANO_SMALL #ifndef NANO_SMALL
shortcut *extcmd_list = NULL; shortcut *extcmd_list = NULL;
#endif #endif
#ifndef DISABLE_BROWSER #ifndef DISABLE_BROWSER
shortcut *browser_list = NULL; shortcut *browser_list = NULL;
#endif #endif
#ifdef ENABLE_COLOR #ifdef ENABLE_COLOR
const colortype *colorstrings = NULL; const colortype *colorstrings = NULL;
syntaxtype *syntaxes = NULL; syntaxtype *syntaxes = NULL;
char *syntaxstr = NULL; char *syntaxstr = NULL;
#endif #endif
#if !defined(DISABLE_BROWSER) || !defined(DISABLE_MOUSE) || !defined(DISABLE_HELP) #if !defined(DISABLE_BROWSER) || !defined(DISABLE_HELP) || (!defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION))
const shortcut *currshortcut; /* Current shortcut list we're using */ const shortcut *currshortcut; /* Current shortcut list we're using */
#endif #endif
@ -207,9 +209,12 @@ void toggle_init_one(int val, const char *desc, int flag)
void toggle_init(void) void toggle_init(void)
{ {
char *toggle_const_msg, *toggle_autoindent_msg, *toggle_suspend_msg, char *toggle_const_msg, *toggle_autoindent_msg, *toggle_suspend_msg,
*toggle_nohelp_msg, *toggle_picomode_msg, *toggle_mouse_msg, *toggle_nohelp_msg, *toggle_picomode_msg, *toggle_cuttoend_msg,
*toggle_cuttoend_msg, *toggle_noconvert_msg, *toggle_dos_msg, *toggle_noconvert_msg, *toggle_dos_msg, *toggle_mac_msg,
*toggle_mac_msg, *toggle_backup_msg, *toggle_smooth_msg; *toggle_backup_msg, *toggle_smooth_msg;
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
char *toggle_mouse_msg;
#endif
#ifndef DISABLE_WRAPPING #ifndef DISABLE_WRAPPING
char *toggle_wrap_msg; char *toggle_wrap_msg;
#endif #endif
@ -232,7 +237,9 @@ void toggle_init(void)
toggle_suspend_msg = _("Suspend"); toggle_suspend_msg = _("Suspend");
toggle_nohelp_msg = _("Help mode"); toggle_nohelp_msg = _("Help mode");
toggle_picomode_msg = _("Pico mode"); toggle_picomode_msg = _("Pico mode");
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
toggle_mouse_msg = _("Mouse support"); toggle_mouse_msg = _("Mouse support");
#endif
toggle_cuttoend_msg = _("Cut to end"); toggle_cuttoend_msg = _("Cut to end");
toggle_noconvert_msg = _("No conversion from DOS/Mac format"); toggle_noconvert_msg = _("No conversion from DOS/Mac format");
toggle_dos_msg = _("Writing file in DOS format"); toggle_dos_msg = _("Writing file in DOS format");
@ -257,7 +264,9 @@ void toggle_init(void)
#ifndef DISABLE_WRAPPING #ifndef DISABLE_WRAPPING
toggle_init_one(TOGGLE_WRAP_KEY, toggle_wrap_msg, NO_WRAP); toggle_init_one(TOGGLE_WRAP_KEY, toggle_wrap_msg, NO_WRAP);
#endif #endif
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
toggle_init_one(TOGGLE_MOUSE_KEY, toggle_mouse_msg, USE_MOUSE); toggle_init_one(TOGGLE_MOUSE_KEY, toggle_mouse_msg, USE_MOUSE);
#endif
toggle_init_one(TOGGLE_CUTTOEND_KEY, toggle_cuttoend_msg, CUT_TO_END); toggle_init_one(TOGGLE_CUTTOEND_KEY, toggle_cuttoend_msg, CUT_TO_END);
#ifdef ENABLE_MULTIBUFFER #ifdef ENABLE_MULTIBUFFER
toggle_init_one(TOGGLE_LOAD_KEY, toggle_load_msg, MULTIBUFFER); toggle_init_one(TOGGLE_LOAD_KEY, toggle_load_msg, MULTIBUFFER);
@ -401,7 +410,7 @@ void shortcut_init(int unjustify)
do_help); do_help);
#ifdef ENABLE_MULTIBUFFER #ifdef ENABLE_MULTIBUFFER
if (open_files != NULL && (open_files->prev || open_files->next)) if (open_files != NULL && (open_files->prev != NULL || open_files->next != NULL))
sc_init_one(&main_list, NANO_EXIT_KEY, _("Close"), sc_init_one(&main_list, NANO_EXIT_KEY, _("Close"),
IFHELP(nano_exit_msg, 0), NANO_EXIT_FKEY, 0, VIEW, IFHELP(nano_exit_msg, 0), NANO_EXIT_FKEY, 0, VIEW,
do_exit); do_exit);
@ -775,7 +784,7 @@ void shortcut_init(int unjustify)
IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0); IFHELP(nano_cancel_msg, 0), 0, 0, VIEW, 0);
#endif #endif
#if !defined(DISABLE_BROWSER) || !defined(DISABLE_MOUSE) || !defined (DISABLE_HELP) #if !defined(DISABLE_BROWSER) || !defined(DISABLE_HELP) || (!defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION))
currshortcut = main_list; currshortcut = main_list;
#endif #endif
#ifndef NANO_SMALL #ifndef NANO_SMALL

13
move.c
View File

@ -104,10 +104,16 @@ int do_page_down(void)
return 0; return 0;
/* AHEM, if we only have a screen or less of text, DON'T do an /* AHEM, if we only have a screen or less of text, DON'T do an
edit_update, just move the cursor to editbot! */ edit_update(), just move the cursor to editbot! */
if (edittop == fileage && editbot == filebot && totlines < editwinrows) { if (edittop == fileage && editbot == filebot && totlines < editwinrows) {
current = editbot; current = editbot;
reset_cursor(); reset_cursor();
#ifndef NANO_SMALL
/* ...unless marking is on, in which case we need it to update
the highlight. */
if (ISSET(MARK_ISSET))
edit_update(current, NONE);
#endif
} else if (editbot != filebot || edittop == fileage) { } else if (editbot != filebot || edittop == fileage) {
current_y = 0; current_y = 0;
current = editbot; current = editbot;
@ -153,7 +159,8 @@ int do_up(void)
/* Return value 1 means we moved down, 0 means we were already at the /* Return value 1 means we moved down, 0 means we were already at the
* bottom. */ * bottom. */
int do_down(void) { int do_down(void)
{
wrap_reset(); wrap_reset();
UNSET(KEEP_CUTBUFFER); UNSET(KEEP_CUTBUFFER);
check_statblank(); check_statblank();
@ -211,7 +218,7 @@ int do_right(void)
if (current->data[current_x] != '\0') if (current->data[current_x] != '\0')
current_x++; current_x++;
else if (current->next) { else if (current->next != NULL) {
do_down(); do_down();
current_x = 0; current_x = 0;
} }

175
nano.c
View File

@ -111,15 +111,15 @@ void die(const char *msg, ...)
#ifdef ENABLE_MULTIBUFFER #ifdef ENABLE_MULTIBUFFER
/* then save all of the other modified loaded files, if any */ /* then save all of the other modified loaded files, if any */
if (open_files) { if (open_files != NULL) {
openfilestruct *tmp; openfilestruct *tmp;
tmp = open_files; tmp = open_files;
while (open_files->prev) while (open_files->prev != NULL)
open_files = open_files->prev; open_files = open_files->prev;
while (open_files->next) { while (open_files->next != NULL) {
/* if we already saved the file above (i. e. if it was the /* if we already saved the file above (i. e. if it was the
currently loaded file), don't save it again */ currently loaded file), don't save it again */
@ -228,17 +228,16 @@ void window_init(void)
bottomwin = newwin(3 - no_help(), COLS, LINES - 3 + no_help(), 0); bottomwin = newwin(3 - no_help(), COLS, LINES - 3 + no_help(), 0);
#ifdef PDCURSES #ifdef PDCURSES
/* Oops, I guess we need this again. /* Oops, I guess we need this again. Moved here so the keypad still
Moved here so the keypad still works after a Meta-X, for example */ works after a Meta-X, for example */
keypad(edit, TRUE); keypad(edit, TRUE);
keypad(bottomwin, TRUE); keypad(bottomwin, TRUE);
#endif #endif
} }
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
void mouse_init(void) void mouse_init(void)
{ {
#ifndef DISABLE_MOUSE
#ifdef NCURSES_MOUSE_VERSION
if (ISSET(USE_MOUSE)) { if (ISSET(USE_MOUSE)) {
keypad_on(edit, 1); keypad_on(edit, 1);
keypad_on(bottomwin, 1); keypad_on(bottomwin, 1);
@ -247,9 +246,8 @@ void mouse_init(void)
mouseinterval(50); mouseinterval(50);
} else } else
mousemask(0, NULL); mousemask(0, NULL);
#endif
#endif
} }
#endif
#ifndef DISABLE_HELP #ifndef DISABLE_HELP
/* This function allocates help_text, and stores the help string in it. /* This function allocates help_text, and stores the help string in it.
@ -651,11 +649,9 @@ void usage(void)
print1opt("-k", "--cut", _("Let ^K cut from cursor to end of line")); print1opt("-k", "--cut", _("Let ^K cut from cursor to end of line"));
#endif #endif
print1opt("-l", "--nofollow", _("Don't follow symbolic links, overwrite")); print1opt("-l", "--nofollow", _("Don't follow symbolic links, overwrite"));
#ifndef DISABLE_MOUSE #if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
#ifdef NCURSES_MOUSE_VERSION
print1opt("-m", "--mouse", _("Enable mouse")); print1opt("-m", "--mouse", _("Enable mouse"));
#endif #endif
#endif
#ifndef DISABLE_OPERATINGDIR #ifndef DISABLE_OPERATINGDIR
print1opt(_("-o [dir]"), _("--operatingdir=[dir]"), _("Set operating directory")); print1opt(_("-o [dir]"), _("--operatingdir=[dir]"), _("Set operating directory"));
#endif #endif
@ -706,7 +702,7 @@ void version(void)
#ifdef DISABLE_JUSTIFY #ifdef DISABLE_JUSTIFY
printf(" --disable-justify"); printf(" --disable-justify");
#endif #endif
#ifdef DISABLE_MOUSE #if defined(DISABLE_MOUSE) || !defined(NCURSES_MOUSE_VERSION)
printf(" --disable-mouse"); printf(" --disable-mouse");
#endif #endif
#ifndef ENABLE_NLS #ifndef ENABLE_NLS
@ -769,7 +765,8 @@ static int pid; /* This is the PID of the newly forked process
RETSIGTYPE cancel_fork(int signal) RETSIGTYPE cancel_fork(int signal)
{ {
if (kill(pid, SIGKILL)==-1) nperror("kill"); if (kill(pid, SIGKILL) == -1)
nperror("kill");
} }
int open_pipe(const char *command) int open_pipe(const char *command)
@ -780,7 +777,7 @@ int open_pipe(const char *command)
/* original and temporary handlers for SIGINT */ /* original and temporary handlers for SIGINT */
#ifdef _POSIX_VDISABLE #ifdef _POSIX_VDISABLE
struct termios term, newterm; struct termios term, newterm;
#endif /* _POSIX_VDISABLE */ #endif /* _POSIX_VDISABLE */
int cancel_sigs = 0; int cancel_sigs = 0;
/* cancel_sigs == 1 means that sigaction() failed without changing /* cancel_sigs == 1 means that sigaction() failed without changing
* the signal handlers. cancel_sigs == 2 means the signal handler * the signal handlers. cancel_sigs == 2 means the signal handler
@ -836,11 +833,11 @@ int open_pipe(const char *command)
/* See if the platform supports disabling individual control /* See if the platform supports disabling individual control
* characters. */ * characters. */
#ifdef _POSIX_VDISABLE #ifdef _POSIX_VDISABLE
if (!cancel_sigs && tcgetattr(0, &term) == -1) { if (cancel_sigs == 0 && tcgetattr(0, &term) == -1) {
cancel_sigs = 2; cancel_sigs = 2;
nperror("tcgetattr"); nperror("tcgetattr");
} }
if (!cancel_sigs) { if (cancel_sigs == 0) {
newterm = term; newterm = term;
/* Grab oldterm's VINTR key :-) */ /* Grab oldterm's VINTR key :-) */
newterm.c_cc[VINTR] = oldterm.c_cc[VINTR]; newterm.c_cc[VINTR] = oldterm.c_cc[VINTR];
@ -852,7 +849,7 @@ int open_pipe(const char *command)
#endif /* _POSIX_VDISABLE */ #endif /* _POSIX_VDISABLE */
f = fdopen(fd[0], "rb"); f = fdopen(fd[0], "rb");
if (!f) if (f == NULL)
nperror("fdopen"); nperror("fdopen");
read_file(f, "stdin", 0); read_file(f, "stdin", 0);
@ -865,7 +862,7 @@ int open_pipe(const char *command)
nperror("wait"); nperror("wait");
#ifdef _POSIX_VDISABLE #ifdef _POSIX_VDISABLE
if (!cancel_sigs && tcsetattr(0, TCSANOW, &term) == -1) if (cancel_sigs == 0 && tcsetattr(0, TCSANOW, &term) == -1)
nperror("tcsetattr"); nperror("tcsetattr");
#endif /* _POSIX_VDISABLE */ #endif /* _POSIX_VDISABLE */
@ -876,8 +873,7 @@ int open_pipe(const char *command)
} }
#endif /* NANO_SMALL */ #endif /* NANO_SMALL */
#ifndef DISABLE_MOUSE #if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
#ifdef NCURSES_MOUSE_VERSION
void do_mouse(void) void do_mouse(void)
{ {
MEVENT mevent; MEVENT mevent;
@ -968,7 +964,6 @@ void do_mouse(void)
} }
} }
#endif #endif
#endif
/* The user typed a printable character; add it to the edit buffer. */ /* The user typed a printable character; add it to the edit buffer. */
void do_char(char ch) void do_char(char ch)
@ -1225,7 +1220,12 @@ int do_enter(void)
* where we think the cursor is. * where we think the cursor is.
*/ */
if (current_y == editwinrows - 1) { if (current_y == editwinrows - 1) {
edit_update(current, CENTER); #ifndef NANO_SMALL
if (ISSET(SMOOTHSCROLL))
edit_update(current, NONE);
else
#endif
edit_update(current, CENTER);
reset_cursor(); reset_cursor();
} else { } else {
current_y++; current_y++;
@ -1300,7 +1300,7 @@ int do_prev_word(void)
{ {
filestruct *old = current; filestruct *old = current;
assert(current != NULL); assert(current != NULL && current->data != NULL);
/* Skip letters in this word first. */ /* Skip letters in this word first. */
while (current_x >= 0 && isalnum((int)current->data[current_x])) while (current_x >= 0 && isalnum((int)current->data[current_x]))
@ -1529,9 +1529,9 @@ int do_wrap(filestruct *inptr)
temp->prev = inptr; temp->prev = inptr;
temp->next = inptr->next; temp->next = inptr->next;
temp->prev->next = temp; temp->prev->next = temp;
/* If !temp->next, then temp is the last line of the file, so we /* If temp->next is NULL, then temp is the last line of the
* must set filebot. */ * file, so we must set filebot. */
if (temp->next) if (temp->next != NULL)
temp->next->prev = temp; temp->next->prev = temp;
else else
filebot = temp; filebot = temp;
@ -1623,7 +1623,7 @@ int do_int_spell_fix(const char *word)
while (1) { while (1) {
/* make sure word is still mis-spelt (i.e. when multi-errors) */ /* make sure word is still mis-spelt (i.e. when multi-errors) */
if (findnextstr(TRUE, FALSE, fileage, beginx_top, word) != NULL) { if (findnextstr(TRUE, FALSE, fileage, beginx_top, word)) {
/* find whole words only */ /* find whole words only */
if (!is_whole_word(current_x, current->data, word)) if (!is_whole_word(current_x, current->data, word))
@ -1678,8 +1678,8 @@ int do_int_spell_fix(const char *word)
return TRUE; return TRUE;
} }
/* Integrated spell checking using 'spell' program. /* Integrated spell checking using 'spell' program. Return value: NULL
Return value: NULL for normal termination, otherwise the error string */ * for normal termination, otherwise the error string. */
char *do_int_speller(char *tempfile_name) char *do_int_speller(char *tempfile_name)
{ {
char *read_buff, *read_buff_ptr, *read_buff_word; char *read_buff, *read_buff_ptr, *read_buff_word;
@ -1834,17 +1834,17 @@ char *do_int_speller(char *tempfile_name)
} }
*read_buff_ptr = (char) NULL; *read_buff_ptr = (char)NULL;
close(uniq_fd[0]); close(uniq_fd[0]);
/* Process the spelling errors */ /* Process the spelling errors */
read_buff_word = read_buff_ptr = read_buff; read_buff_word = read_buff_ptr = read_buff;
while (*read_buff_ptr) { while (*read_buff_ptr != '\0') {
if ((*read_buff_ptr == '\n') || (*read_buff_ptr == '\r')) { if ((*read_buff_ptr == '\n') || (*read_buff_ptr == '\r')) {
*read_buff_ptr = (char) NULL; *read_buff_ptr = (char)NULL;
if (read_buff_word != read_buff_ptr) { if (read_buff_word != read_buff_ptr) {
if (!do_int_spell_fix(read_buff_word)) { if (!do_int_spell_fix(read_buff_word)) {
read_buff_word = read_buff_ptr; read_buff_word = read_buff_ptr;
@ -1883,8 +1883,8 @@ char *do_int_speller(char *tempfile_name)
return NULL; return NULL;
} }
/* External spell checking. /* External spell checking. Return value: NULL for normal termination,
Return value: NULL for normal termination, otherwise the error string */ * otherwise the error string. */
char *do_alt_speller(char *tempfile_name) char *do_alt_speller(char *tempfile_name)
{ {
int alt_spell_status, lineno_cur = current->lineno; int alt_spell_status, lineno_cur = current->lineno;
@ -1979,7 +1979,7 @@ int do_spell(void)
{ {
#ifdef DISABLE_SPELLER #ifdef DISABLE_SPELLER
nano_disabled_msg(); nano_disabled_msg();
return (TRUE); return TRUE;
#else #else
char *temp, *spell_msg = _("Generic error"); char *temp, *spell_msg = _("Generic error");
@ -2001,7 +2001,7 @@ int do_spell(void)
add_open_file(1); add_open_file(1);
#endif #endif
if (alt_speller) if (alt_speller != NULL)
spell_msg = do_alt_speller(temp); spell_msg = do_alt_speller(temp);
else else
spell_msg = do_int_speller(temp); spell_msg = do_int_speller(temp);
@ -2052,6 +2052,8 @@ size_t indent_length(const char *line)
* not be whitespace. */ * not be whitespace. */
int justify_format(int changes_allowed, filestruct *line, size_t skip) int justify_format(int changes_allowed, filestruct *line, size_t skip)
{ {
const char *punct = ".?!";
const char *brackets = "'\")}]>";
char *back, *front; char *back, *front;
/* These four asserts are assumptions about the input data. */ /* These four asserts are assumptions about the input data. */
@ -2072,9 +2074,7 @@ int justify_format(int changes_allowed, filestruct *line, size_t skip)
*front = ' '; *front = ' ';
} }
/* these tests are safe since line->data + skip is not a space */ /* these tests are safe since line->data + skip is not a space */
if (*front == ' ' && *(front-1) == ' ') { if (*front == ' ' && *(front - 1) == ' ') {
const char *brackets = _("'\")}]>");
const char *punct = _(".?!");
const char *bob = front - 2; const char *bob = front - 2;
remove_space = 1; remove_space = 1;
@ -2105,16 +2105,16 @@ int justify_format(int changes_allowed, filestruct *line, size_t skip)
/* Remove spaces from the end of the line, except maintain 1 after a /* Remove spaces from the end of the line, except maintain 1 after a
* sentence punctuation. */ * sentence punctuation. */
while (line->data < back && *(back-1) == ' ') while (line->data < back && *(back - 1) == ' ')
back--; back--;
if (line->data < back && *back == ' ' && if (line->data < back && *back == ' ' &&
(*(back-1) == '.' || *(back-1) == '!' || *(back-1) == '?')) strchr(punct, *(back - 1)) != NULL)
back++; back++;
if (!changes_allowed && back != front) if (!changes_allowed && back != front)
return 1; return 1;
/* This assert merely documents a fact about the loop above. */ /* This assert merely documents a fact about the loop above. */
assert(changes_allowed || back == front); assert(changes_allowed != 0 || back == front);
/* Now back is the new end of line->data. */ /* Now back is the new end of line->data. */
if (back != front) { if (back != front) {
@ -2364,7 +2364,7 @@ int do_justify(void)
/* This line is part of a paragraph. So we must search back to /* This line is part of a paragraph. So we must search back to
* the first line of this paragraph. First we check items 1) and * the first line of this paragraph. First we check items 1) and
* 3) above. */ * 3) above. */
while (current->prev && quotes_match(current->data, while (current->prev != NULL && quotes_match(current->data,
quote_len, IFREG(current->prev->data, &qreg))) { quote_len, IFREG(current->prev->data, &qreg))) {
size_t temp_id_len = size_t temp_id_len =
indent_length(current->prev->data + quote_len); indent_length(current->prev->data + quote_len);
@ -2392,7 +2392,7 @@ int do_justify(void)
/* There is no next paragraph, so nothing to justify. */ /* There is no next paragraph, so nothing to justify. */
if (current->next == NULL) { if (current->next == NULL) {
placewewant = 0; placewewant = 0;
if (current_y > editwinrows - 4) if (current_y > editwinrows - 1)
edit_update(current, CENTER); edit_update(current, CENTER);
else else
edit_refresh(); edit_refresh();
@ -2412,7 +2412,7 @@ int do_justify(void)
par_len = 1; par_len = 1;
indent_len = indent_length(line->data + quote_len); indent_len = indent_length(line->data + quote_len);
while (line->next && quotes_match(current->data, quote_len, while (line->next != NULL && quotes_match(current->data, quote_len,
IFREG(line->next->data, &qreg))) { IFREG(line->next->data, &qreg))) {
size_t temp_id_len = indent_length(line->next->data + quote_len); size_t temp_id_len = indent_length(line->next->data + quote_len);
@ -2453,8 +2453,7 @@ int do_justify(void)
* made. If there are, we do backup_lines(), which copies the * made. If there are, we do backup_lines(), which copies the
* original paragraph to the cutbuffer for unjustification, and * original paragraph to the cutbuffer for unjustification, and
* then calls justify_format() on the remaining lines. */ * then calls justify_format() on the remaining lines. */
if (first_mod_line == NULL && if (first_mod_line == NULL && justify_format(0, current, indent_len))
justify_format(0, current, indent_len))
first_mod_line = backup_lines(current, par_len, quote_len); first_mod_line = backup_lines(current, par_len, quote_len);
line_len = strlen(current->data); line_len = strlen(current->data);
@ -2557,6 +2556,11 @@ int do_justify(void)
#endif #endif
if (indent_len + break_pos == next_line_len) { if (indent_len + break_pos == next_line_len) {
line = current->next; line = current->next;
/* Don't destroy edittop! */
if (line == edittop)
edittop = current;
unlink_node(line); unlink_node(line);
delete_node(line); delete_node(line);
totlines--; totlines--;
@ -2588,7 +2592,7 @@ int do_justify(void)
renumber(first_mod_line); renumber(first_mod_line);
} }
if (current_y > editwinrows - 4) if (current_y > editwinrows - 1)
edit_update(current, CENTER); edit_update(current, CENTER);
else else
edit_refresh(); edit_refresh();
@ -2602,15 +2606,13 @@ int do_justify(void)
/* Now get a keystroke and see if it's unjustify; if not, unget the /* Now get a keystroke and see if it's unjustify; if not, unget the
* keystroke and return. */ * keystroke and return. */
#ifndef DISABLE_MOUSE #if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
#ifdef NCURSES_MOUSE_VERSION
/* If it was a mouse click, parse it with do_mouse() and it might /* If it was a mouse click, parse it with do_mouse() and it might
* become the unjustify key. Else give it back to the input stream. */ * become the unjustify key. Else give it back to the input stream. */
if ((i = wgetch(edit)) == KEY_MOUSE) if ((i = wgetch(edit)) == KEY_MOUSE)
do_mouse(); do_mouse();
else else
ungetch(i); ungetch(i);
#endif
#endif #endif
if ((i = wgetch(edit)) != NANO_UNJUSTIFY_KEY) { if ((i = wgetch(edit)) != NANO_UNJUSTIFY_KEY) {
@ -2803,8 +2805,8 @@ RETSIGTYPE do_suspend(int signal)
tcsetattr(0, TCSANOW, &oldterm); tcsetattr(0, TCSANOW, &oldterm);
/* We used to re-enable the default SIG_DFL and raise SIGTSTP, but /* We used to re-enable the default SIG_DFL and raise SIGTSTP, but
then we could be (and were) interrupted in the middle of the call. then we could be (and were) interrupted in the middle of the call.
So we do it the mutt way instead */ So we do it the mutt way instead */
kill(0, SIGSTOP); kill(0, SIGSTOP);
} }
@ -2833,7 +2835,7 @@ void handle_sigwinch(int s)
int result = 0; int result = 0;
struct winsize win; struct winsize win;
if (!tty) if (tty == NULL)
return; return;
fd = open(tty, O_RDWR); fd = open(tty, O_RDWR);
if (fd == -1) if (fd == -1)
@ -2933,9 +2935,11 @@ void do_toggle(const toggle *which)
case TOGGLE_SUSPEND_KEY: case TOGGLE_SUSPEND_KEY:
signal_init(); signal_init();
break; break;
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
case TOGGLE_MOUSE_KEY: case TOGGLE_MOUSE_KEY:
mouse_init(); mouse_init();
break; break;
#endif
case TOGGLE_NOHELP_KEY: case TOGGLE_NOHELP_KEY:
wclear(bottomwin); wclear(bottomwin);
wrefresh(bottomwin); wrefresh(bottomwin);
@ -2950,9 +2954,11 @@ void do_toggle(const toggle *which)
case TOGGLE_MAC_KEY: case TOGGLE_MAC_KEY:
UNSET(DOS_FILE); UNSET(DOS_FILE);
break; break;
#ifdef ENABLE_COLOR
case TOGGLE_SYNTAX_KEY: case TOGGLE_SYNTAX_KEY:
edit_refresh(); edit_refresh();
break; break;
#endif
} }
/* We are assuming here that shortcut_init() above didn't free and /* We are assuming here that shortcut_init() above didn't free and
@ -2968,21 +2974,21 @@ void do_toggle(const toggle *which)
/* This function returns the correct keystroke, given the A,B,C or D /* This function returns the correct keystroke, given the A,B,C or D
input key. This is a common sequence of many terms which send input key. This is a common sequence of many terms which send
Esc-O-[A-D] or Esc-[-[A-D]. */ Esc-O-[A-D] or Esc-[-[A-D]. */
int ABCD(int input) int abcd(int input)
{ {
switch (input) { switch (input) {
case 'A': case 'A':
case 'a': case 'a':
return (KEY_UP); return KEY_UP;
case 'B': case 'B':
case 'b': case 'b':
return (KEY_DOWN); return KEY_DOWN;
case 'C': case 'C':
case 'c': case 'c':
return (KEY_RIGHT); return KEY_RIGHT;
case 'D': case 'D':
case 'd': case 'd':
return (KEY_LEFT); return KEY_LEFT;
default: default:
return 0; return 0;
} }
@ -3007,7 +3013,7 @@ int main(int argc, char *argv[])
#ifdef HAVE_GETOPT_LONG #ifdef HAVE_GETOPT_LONG
int option_index = 0; int option_index = 0;
struct option long_options[] = { const struct option long_options[] = {
{"help", 0, 0, 'h'}, {"help", 0, 0, 'h'},
#ifdef ENABLE_MULTIBUFFER #ifdef ENABLE_MULTIBUFFER
{"multibuffer", 0, 0, 'F'}, {"multibuffer", 0, 0, 'F'},
@ -3029,7 +3035,9 @@ int main(int argc, char *argv[])
#endif #endif
{"const", 0, 0, 'c'}, {"const", 0, 0, 'c'},
{"nofollow", 0, 0, 'l'}, {"nofollow", 0, 0, 'l'},
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
{"mouse", 0, 0, 'm'}, {"mouse", 0, 0, 'm'},
#endif
#ifndef DISABLE_OPERATINGDIR #ifndef DISABLE_OPERATINGDIR
{"operatingdir", 1, 0, 'o'}, {"operatingdir", 1, 0, 'o'},
#endif #endif
@ -3060,16 +3068,11 @@ int main(int argc, char *argv[])
}; };
#endif #endif
/* Flag inits... */
SET(FOLLOW_SYMLINKS);
#ifndef NANO_SMALL
#ifdef ENABLE_NLS #ifdef ENABLE_NLS
setlocale(LC_ALL, ""); setlocale(LC_ALL, "");
bindtextdomain(PACKAGE, LOCALEDIR); bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE); textdomain(PACKAGE);
#endif #endif
#endif
#ifdef ENABLE_NANORC #ifdef ENABLE_NANORC
{ {
@ -3151,13 +3154,10 @@ int main(int argc, char *argv[])
SET(NO_CONVERT); SET(NO_CONVERT);
break; break;
#endif #endif
case 'Q':
#ifndef DISABLE_JUSTIFY #ifndef DISABLE_JUSTIFY
case 'Q':
quotestr = optarg; quotestr = optarg;
break; break;
#else
usage();
exit(1);
#endif #endif
#ifdef HAVE_REGEX_H #ifdef HAVE_REGEX_H
case 'R': case 'R':
@ -3208,11 +3208,13 @@ int main(int argc, char *argv[])
break; break;
#endif #endif
case 'l': case 'l':
UNSET(FOLLOW_SYMLINKS); SET(NOFOLLOW_SYMLINKS);
break; break;
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
case 'm': case 'm':
SET(USE_MOUSE); SET(USE_MOUSE);
break; break;
#endif
#ifndef DISABLE_OPERATINGDIR #ifndef DISABLE_OPERATINGDIR
case 'o': case 'o':
operating_dir = mallocstrcpy(operating_dir, optarg); operating_dir = mallocstrcpy(operating_dir, optarg);
@ -3249,14 +3251,11 @@ int main(int argc, char *argv[])
case 'v': case 'v':
SET(VIEW_MODE); SET(VIEW_MODE);
break; break;
case 'w':
#ifdef DISABLE_WRAPPING #ifdef DISABLE_WRAPPING
usage(); case 'w':
exit(0);
#else
SET(NO_WRAP); SET(NO_WRAP);
break; break;
#endif /* DISABLE_WRAPPING */ #endif
case 'x': case 'x':
SET(NO_HELP); SET(NO_HELP);
break; break;
@ -3281,8 +3280,8 @@ int main(int argc, char *argv[])
/* See if we were invoked with the name "pico" */ /* See if we were invoked with the name "pico" */
argv0 = strrchr(argv[0], '/'); argv0 = strrchr(argv[0], '/');
if ((argv0 && strstr(argv0, "pico")) if ((argv0 != NULL && strstr(argv0, "pico") != NULL)
|| (!argv0 && strstr(argv[0], "pico"))) || (argv0 == NULL && strstr(argv[0], "pico") != NULL))
SET(PICO_MODE); SET(PICO_MODE);
/* See if there's a non-option in argv (first non-option is the /* See if there's a non-option in argv (first non-option is the
@ -3326,7 +3325,9 @@ int main(int argc, char *argv[])
#endif #endif
window_init(); window_init();
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
mouse_init(); mouse_init();
#endif
if (!ISSET(ALT_KEYPAD)) { if (!ISSET(ALT_KEYPAD)) {
keypad(edit, TRUE); keypad(edit, TRUE);
@ -3374,7 +3375,7 @@ int main(int argc, char *argv[])
while (1) { while (1) {
#if !defined(DISABLE_BROWSER) || !defined(DISABLE_MOUSE) || !defined(DISABLE_HELP) #if !defined(DISABLE_BROWSER) || !defined(DISABLE_HELP) || (!defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION))
currshortcut = main_list; currshortcut = main_list;
#endif #endif
@ -3394,7 +3395,7 @@ int main(int argc, char *argv[])
kbinput = wgetch(edit); kbinput = wgetch(edit);
if ((kbinput <= 'D' && kbinput >= 'A') || if ((kbinput <= 'D' && kbinput >= 'A') ||
(kbinput <= 'd' && kbinput >= 'a')) (kbinput <= 'd' && kbinput >= 'a'))
kbinput = ABCD(kbinput); kbinput = abcd(kbinput);
else if (kbinput <= 'z' && kbinput >= 'j') else if (kbinput <= 'z' && kbinput >= 'j')
print_numlock_warning(); print_numlock_warning();
else if (kbinput <= 'S' && kbinput >= 'P') else if (kbinput <= 'S' && kbinput >= 'P')
@ -3513,7 +3514,7 @@ int main(int argc, char *argv[])
case 'b': case 'b':
case 'c': case 'c':
case 'd': case 'd':
kbinput = ABCD(kbinput); kbinput = abcd(kbinput);
break; break;
case 'H': case 'H':
kbinput = KEY_HOME; kbinput = KEY_HOME;
@ -3590,7 +3591,7 @@ int main(int argc, char *argv[])
/* Look through the main shortcut list to see if we've hit a /* Look through the main shortcut list to see if we've hit a
shortcut key */ shortcut key */
#if !defined(DISABLE_BROWSER) || !defined(DISABLE_MOUSE) || !defined (DISABLE_HELP) #if !defined(DISABLE_BROWSER) || !defined (DISABLE_HELP) || (!defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION))
for (s = currshortcut; s != NULL && !keyhandled; s = s->next) { for (s = currshortcut; s != NULL && !keyhandled; s = s->next) {
#else #else
for (s = main_list; s != NULL && !keyhandled; s = s->next) { for (s = main_list; s != NULL && !keyhandled; s = s->next) {
@ -3628,12 +3629,8 @@ int main(int argc, char *argv[])
keyhandled = 1; keyhandled = 1;
} }
#ifndef USE_SLANG
/* Hack, make insert key do something useful, like insert file */ /* Hack, make insert key do something useful, like insert file */
if (kbinput == KEY_IC) { if (kbinput == KEY_IC) {
#else
if (0) {
#endif
do_insertkey: do_insertkey:
#ifdef ENABLE_MULTIBUFFER #ifdef ENABLE_MULTIBUFFER
@ -3654,12 +3651,10 @@ int main(int argc, char *argv[])
/* Last gasp, stuff that's not in the main lists */ /* Last gasp, stuff that's not in the main lists */
if (!keyhandled) if (!keyhandled)
switch (kbinput) { switch (kbinput) {
#ifndef DISABLE_MOUSE #if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
#ifdef NCURSES_MOUSE_VERSION
case KEY_MOUSE: case KEY_MOUSE:
do_mouse(); do_mouse();
break; break;
#endif
#endif #endif
case 0: /* Erg */ case 0: /* Erg */

17
nano.h
View File

@ -39,7 +39,8 @@
#ifdef USE_SLANG /* Slang support enabled */ #ifdef USE_SLANG /* Slang support enabled */
#include <slcurses.h> #include <slcurses.h>
#define KEY_DC 0x113 #define KEY_IC SL_KEY_IC
#define KEY_DC SL_KEY_DELETE
#elif defined(HAVE_NCURSES_H) #elif defined(HAVE_NCURSES_H)
#include <ncurses.h> #include <ncurses.h>
#else /* Uh oh */ #else /* Uh oh */
@ -71,6 +72,15 @@
# endif # endif
#endif #endif
#if !defined(HAVE_STRCASECMP) || !defined(HAVE_STRNCASECMP)
# ifndef HAVE_STRCASECMP
# define strcasecmp strcmp
# endif
# ifndef HAVE_STRNCASECMP
# define strncasecmp strncmp
# endif
#endif
/* HP-UX 10 & 11 do not seem to support KEY_HOME and KEY_END */ /* HP-UX 10 & 11 do not seem to support KEY_HOME and KEY_END */
#ifndef KEY_HOME #ifndef KEY_HOME
#define KEY_HOME -1 #define KEY_HOME -1
@ -80,7 +90,6 @@
#define KEY_END -1 #define KEY_END -1
#endif /* KEY_END */ #endif /* KEY_END */
#define VERMSG "GNU nano " VERSION #define VERMSG "GNU nano " VERSION
#if defined(DISABLE_WRAPPING) && defined(DISABLE_JUSTIFY) #if defined(DISABLE_WRAPPING) && defined(DISABLE_JUSTIFY)
@ -191,7 +200,7 @@ typedef struct syntaxtype {
#define CONSTUPDATE (1<<4) #define CONSTUPDATE (1<<4)
#define NO_HELP (1<<5) #define NO_HELP (1<<5)
#define PICO_MODE (1<<6) #define PICO_MODE (1<<6)
#define FOLLOW_SYMLINKS (1<<7) #define NOFOLLOW_SYMLINKS (1<<7)
#define SUSPEND (1<<8) #define SUSPEND (1<<8)
#define NO_WRAP (1<<9) #define NO_WRAP (1<<9)
#define AUTOINDENT (1<<10) #define AUTOINDENT (1<<10)
@ -213,7 +222,7 @@ typedef struct syntaxtype {
#define NO_CONVERT (1<<26) #define NO_CONVERT (1<<26)
#define BACKUP_FILE (1<<27) #define BACKUP_FILE (1<<27)
#define NO_RCFILE (1<<28) #define NO_RCFILE (1<<28)
#define COLOR_SYNTAX (1<<28) #define COLOR_SYNTAX (1<<29)
/* Control key sequences, changing these would be very very bad */ /* Control key sequences, changing these would be very very bad */

11
proto.h
View File

@ -33,7 +33,9 @@ extern int wrap_at;
extern int editwinrows; extern int editwinrows;
extern int current_x, current_y, totlines; extern int current_x, current_y, totlines;
extern int placewewant; extern int placewewant;
#ifndef NANO_SMALL
extern int mark_beginx; extern int mark_beginx;
#endif
extern long totsize; extern long totsize;
extern int temp_opt; extern int temp_opt;
extern int wrap_at, flags, tabsize; extern int wrap_at, flags, tabsize;
@ -64,7 +66,10 @@ extern char *alt_speller;
extern struct stat fileinfo; extern struct stat fileinfo;
extern filestruct *current, *fileage, *edittop, *editbot, *filebot; extern filestruct *current, *fileage, *edittop, *editbot, *filebot;
extern filestruct *cutbuffer, *mark_beginbuf; extern filestruct *cutbuffer;
#ifndef NANO_SMALL
extern filestruct *mark_beginbuf;
#endif
#ifdef ENABLE_MULTIBUFFER #ifdef ENABLE_MULTIBUFFER
extern openfilestruct *open_files; extern openfilestruct *open_files;
@ -215,7 +220,9 @@ void die_too_small(void);
void print_view_warning(void); void print_view_warning(void);
void global_init(int save_cutbuffer); void global_init(int save_cutbuffer);
void window_init(void); void window_init(void);
#if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
void mouse_init(void); void mouse_init(void);
#endif
#ifndef DISABLE_HELP #ifndef DISABLE_HELP
void help_init(void); void help_init(void);
#endif #endif
@ -300,7 +307,7 @@ void print_numlock_warning(void);
#ifndef NANO_SMALL #ifndef NANO_SMALL
void do_toggle(const toggle *which); void do_toggle(const toggle *which);
#endif #endif
int ABCD(int input); int abcd(int input);
/* Public functions in rcfile.c */ /* Public functions in rcfile.c */
#ifdef ENABLE_NANORC #ifdef ENABLE_NANORC

View File

@ -50,7 +50,7 @@ const static rcoption rcopts[] = {
{"fill", 0}, {"fill", 0},
#endif #endif
{"keypad", ALT_KEYPAD}, {"keypad", ALT_KEYPAD},
#ifndef DISABLE_MOUSE #if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
{"mouse", USE_MOUSE}, {"mouse", USE_MOUSE},
#endif #endif
#ifdef ENABLE_MULTIBUFFER #ifdef ENABLE_MULTIBUFFER
@ -59,7 +59,7 @@ const static rcoption rcopts[] = {
#ifndef NANO_SMALL #ifndef NANO_SMALL
{"noconvert", NO_CONVERT}, {"noconvert", NO_CONVERT},
#endif #endif
{"nofollow", FOLLOW_SYMLINKS}, {"nofollow", NOFOLLOW_SYMLINKS},
{"nohelp", NO_HELP}, {"nohelp", NO_HELP},
#ifndef DISABLE_WRAPPING #ifndef DISABLE_WRAPPING
{"nowrap", NO_WRAP}, {"nowrap", NO_WRAP},
@ -68,7 +68,7 @@ const static rcoption rcopts[] = {
{"operatingdir", 0}, {"operatingdir", 0},
#endif #endif
{"pico", PICO_MODE}, {"pico", PICO_MODE},
#ifndef NANO_SMALL #ifndef DISABLE_JUSTIFY
{"quotestr", 0}, {"quotestr", 0},
#endif #endif
#ifdef HAVE_REGEX_H #ifdef HAVE_REGEX_H
@ -403,7 +403,7 @@ void parse_colors(char *ptr)
else { else {
if (ptr == NULL || strncasecmp(ptr, "end=", 4)) { if (ptr == NULL || strncasecmp(ptr, "end=", 4)) {
rcfile_error(_ rcfile_error(_
("\n\t\"start=\" requires a corresponding \"end=\"")); ("\"start=\" requires a corresponding \"end=\""));
return; return;
} }
@ -455,7 +455,7 @@ void parse_rcfile(FILE *rcstream)
/* Else skip to the next space */ /* Else skip to the next space */
keyword = ptr; keyword = ptr;
ptr = parse_next_word(ptr); ptr = parse_next_word(ptr);
if (!ptr) if (ptr == NULL)
continue; continue;
/* Else try to parse the keyword */ /* Else try to parse the keyword */
@ -485,7 +485,7 @@ void parse_rcfile(FILE *rcstream)
fprintf(stderr, _("parse_rcfile: Parsing option %s\n"), fprintf(stderr, _("parse_rcfile: Parsing option %s\n"),
rcopts[i].name); rcopts[i].name);
#endif #endif
if (set == 1 || rcopts[i].flag == FOLLOW_SYMLINKS) { if (set == 1) {
if (!strcasecmp(rcopts[i].name, "tabsize") if (!strcasecmp(rcopts[i].name, "tabsize")
#ifndef DISABLE_OPERATINGDIR #ifndef DISABLE_OPERATINGDIR
|| !strcasecmp(rcopts[i].name, "operatingdir") || !strcasecmp(rcopts[i].name, "operatingdir")

View File

@ -30,6 +30,9 @@
#include "proto.h" #include "proto.h"
#include "nano.h" #include "nano.h"
static int past_editbuff;
/* findnextstr() is now searching lines not displayed */
/* Regular expression helper functions */ /* Regular expression helper functions */
#ifdef HAVE_REGEX_H #ifdef HAVE_REGEX_H
@ -101,7 +104,7 @@ int search_init(int replacing)
search_init_globals(); search_init_globals();
/* Clear the backupstring if we've changed from Pico mode to regular /* Clear the backupstring if we've changed from Pico mode to regular
mode */ mode */
if (ISSET(CLEAR_BACKUPSTRING)) { if (ISSET(CLEAR_BACKUPSTRING)) {
free(backupstring); free(backupstring);
backupstring = NULL; backupstring = NULL;
@ -117,14 +120,16 @@ int search_init(int replacing)
last_search. */ last_search. */
if (ISSET(PICO_MODE)) { if (ISSET(PICO_MODE)) {
if (backupstring == NULL || !strcmp(backupstring, last_search)) if (backupstring == NULL || !strcmp(backupstring, last_search)) {
backupstring = mallocstrcpy(backupstring, ""); backupstring = charalloc(1);
backupstring[0] = '\0';
}
} }
else if (backupstring == NULL) else if (backupstring == NULL)
backupstring = mallocstrcpy(backupstring, last_search); backupstring = mallocstrcpy(backupstring, last_search);
/* If using Pico messages, we do things the old fashioned way... */ /* If using Pico messages, we do things the old fashioned way... */
if (ISSET(PICO_MODE) && last_search[0]) { if (ISSET(PICO_MODE) && last_search[0] != '\0') {
buf = charalloc(COLS / 3 + 7); buf = charalloc(COLS / 3 + 7);
/* We use COLS / 3 here because we need to see more on the line */ /* We use COLS / 3 here because we need to see more on the line */
sprintf(buf, " [%.*s%s]", COLS / 3, last_search, sprintf(buf, " [%.*s%s]", COLS / 3, last_search,
@ -227,9 +232,6 @@ int is_whole_word(int curr_pos, const char *datastr, const char *searchword)
(sln == strlen(datastr) || !isalpha((int) datastr[sln])); (sln == strlen(datastr) || !isalpha((int) datastr[sln]));
} }
static int past_editbuff;
/* findnextstr() is now searching lines not displayed */
filestruct *findnextstr(int quiet, int bracket_mode, filestruct *findnextstr(int quiet, int bracket_mode,
const filestruct *begin, int beginx, const filestruct *begin, int beginx,
const char *needle) const char *needle)
@ -326,7 +328,7 @@ filestruct *findnextstr(int quiet, int bracket_mode,
if (fileptr == edittop->prev) if (fileptr == edittop->prev)
past_editbuff = 1; past_editbuff = 1;
/* SOF reached ?, wrap around once */ /* SOF reached?, wrap around once */
/* ? */ if (fileptr == NULL) { /* ? */ if (fileptr == NULL) {
if (bracket_mode) if (bracket_mode)
return NULL; return NULL;
@ -416,8 +418,7 @@ int do_search(void)
search_last_line = 0; search_last_line = 0;
didfind = findnextstr(FALSE, FALSE, current, current_x, answer); didfind = findnextstr(FALSE, FALSE, current, current_x, answer);
if ((fileptr == current) && (fileptr_x == current_x) && if ((fileptr == current) && (fileptr_x == current_x) && didfind != NULL)
didfind != NULL)
statusbar(_("This is the only occurrence")); statusbar(_("This is the only occurrence"));
search_abort(); search_abort();
@ -451,7 +452,7 @@ int replace_regexp(char *string, int create_flag)
* replacement using \1, \2, \3, etc. */ * replacement using \1, \2, \3, etc. */
c = last_replace; c = last_replace;
while (*c) { while (*c != '\0') {
if (*c != '\\') { if (*c != '\\') {
if (create_flag) if (create_flag)
*string++ = *c; *string++ = *c;
@ -532,7 +533,7 @@ char *replace_line(void)
strcat(copy, last_replace); strcat(copy, last_replace);
#ifdef HAVE_REGEX_H #ifdef HAVE_REGEX_H
else else
(void) replace_regexp(copy + current_x, 1); replace_regexp(copy + current_x, 1);
#endif #endif
/* The tail of the original line */ /* The tail of the original line */
@ -593,7 +594,7 @@ int do_replace_loop(const char *prevanswer, const filestruct *begin,
FALSE, begin, *beginx, prevanswer); FALSE, begin, *beginx, prevanswer);
/* No more matches. Done! */ /* No more matches. Done! */
if (!fileptr) if (fileptr == NULL)
break; break;
/* Make sure only whole words are found */ /* Make sure only whole words are found */
@ -616,7 +617,7 @@ int do_replace_loop(const char *prevanswer, const filestruct *begin,
replaceall = 1; replaceall = 1;
copy = replace_line(); copy = replace_line();
if (!copy) { if (copy == NULL) {
statusbar(_("Replace failed: unknown subexpression!")); statusbar(_("Replace failed: unknown subexpression!"));
replace_abort(); replace_abort();
return 0; return 0;
@ -773,7 +774,7 @@ int do_gotoline(int line, int save_pos)
current_x = 0; current_x = 0;
/* if save_pos is non-zero, don't change the cursor position when /* if save_pos is nonzero, don't change the cursor position when
updating the edit window */ updating the edit window */
if (save_pos) if (save_pos)
edit_update(current, NONE); edit_update(current, NONE);
@ -820,7 +821,7 @@ int do_find_bracket(void)
ch_under_cursor = current->data[current_x]; ch_under_cursor = current->data[current_x];
if ((!(pos = strchr(brackets, ch_under_cursor))) || (!((offset = pos - brackets) < 8))) { if (((pos = strchr(brackets, ch_under_cursor)) == NULL) || (((offset = pos - brackets) < 8) == 0)) {
statusbar(_("Not a bracket")); statusbar(_("Not a bracket"));
return 1; return 1;
} }
@ -850,7 +851,7 @@ int do_find_bracket(void)
while (1) { while (1) {
search_last_line = 0; search_last_line = 0;
if (findnextstr(1, 1, current, current_x, regexp_pat)) { if (findnextstr(1, 1, current, current_x, regexp_pat) != NULL) {
have_past_editbuff |= past_editbuff; have_past_editbuff |= past_editbuff;
if (current->data[current_x] == ch_under_cursor) /* found identical bracket */ if (current->data[current_x] == ch_under_cursor) /* found identical bracket */
count++; count++;

42
utils.c
View File

@ -32,10 +32,8 @@
int is_cntrl_char(int c) int is_cntrl_char(int c)
{ {
if (iscntrl(c) || ((c & 127) != 127 && iscntrl(c & 127))) return (-128 <= c && c < -96) || (0 <= c && c < 32) ||
return 1; (127 <= c && c < 160);
else
return 0;
} }
int num_of_digits(int n) int num_of_digits(int n)
@ -120,20 +118,20 @@ const char *revstristr(const char *haystack, const char *needle,
#endif /* !NANO_SMALL */ #endif /* !NANO_SMALL */
/* This is now mutt's version (called mutt_stristr) because it doesn't /* This is now mutt's version (called mutt_stristr) because it doesn't
use memory allocation to do a simple search (yuck). */ * use memory allocation to do a simple search (yuck). */
const char *stristr(const char *haystack, const char *needle) const char *stristr(const char *haystack, const char *needle)
{ {
const char *p, *q; const char *p, *q;
if (!haystack) if (haystack == NULL)
return NULL; return NULL;
if (!needle) if (needle == NULL)
return (haystack); return haystack;
while (*(p = haystack)) { while (*(p = haystack) != '\0') {
for (q = needle; *p && *q && tolower(*p) == tolower(*q); p++, q++) for (q = needle; *p != 0 && *q != 0 && tolower(*p) == tolower(*q); p++, q++)
; ;
if (!*q) if (*q == 0)
return haystack; return haystack;
haystack++; haystack++;
} }
@ -191,7 +189,7 @@ const char *strstrwrapper(const char *haystack, const char *needle,
* screen. Note that nperror causes the window to flicker once. */ * screen. Note that nperror causes the window to flicker once. */
void nperror(const char *s) void nperror(const char *s)
{ {
/* leave ncurses mode, go to the terminal */ /* leave ncurses mode, go to the terminal */
if (endwin() != ERR) { if (endwin() != ERR) {
perror(s); /* print the error */ perror(s); /* print the error */
total_refresh(); /* return to ncurses and repaint */ total_refresh(); /* return to ncurses and repaint */
@ -205,14 +203,14 @@ void *nmalloc(size_t howmuch)
/* Panic save? */ /* Panic save? */
if (!(r = malloc(howmuch))) if ((r = malloc(howmuch)) == NULL)
die(_("nano: malloc: out of memory!")); die(_("nano: malloc: out of memory!"));
return r; return r;
} }
/* We're going to need this too - Hopefully this will minimize /* We're going to need this too - Hopefully this will minimize the
the transition cost of moving to the appropriate function. */ * transition cost of moving to the appropriate function. */
char *charalloc(size_t howmuch) char *charalloc(size_t howmuch)
{ {
char *r = (char *)malloc(howmuch * sizeof(char)); char *r = (char *)malloc(howmuch * sizeof(char));
@ -227,7 +225,7 @@ void *nrealloc(void *ptr, size_t howmuch)
{ {
void *r; void *r;
if (!(r = realloc(ptr, howmuch))) if ((r = realloc(ptr, howmuch)) == NULL)
die(_("nano: realloc: out of memory!")); die(_("nano: realloc: out of memory!"));
return r; return r;
@ -240,10 +238,10 @@ char *mallocstrcpy(char *dest, const char *src)
if (src == dest) if (src == dest)
return dest; return dest;
if (dest) if (dest != NULL)
free(dest); free(dest);
if (!src) if (src == NULL)
return NULL; return NULL;
dest = charalloc(strlen(src) + 1); dest = charalloc(strlen(src) + 1);
@ -292,7 +290,7 @@ int check_wildcard_match(const char *text, const char *pattern)
retrypat = NULL; retrypat = NULL;
retrytext = NULL; retrytext = NULL;
while (*text || *pattern) { while (*text != '\0' || *pattern != '\0') {
ch = *pattern++; ch = *pattern++;
switch (ch) { switch (ch) {
@ -346,12 +344,12 @@ int check_wildcard_match(const char *text, const char *pattern)
default: default:
if (*text == ch) { if (*text == ch) {
if (*text) if (*text != '\0')
text++; text++;
break; break;
} }
if (*text) { if (*text != '\0') {
pattern = retrypat; pattern = retrypat;
text = ++retrytext; text = ++retrytext;
break; break;
@ -360,7 +358,7 @@ int check_wildcard_match(const char *text, const char *pattern)
return FALSE; return FALSE;
} }
if (!pattern) if (pattern == NULL)
return FALSE; return FALSE;
} }

109
winio.c
View File

@ -210,7 +210,7 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
else else
answer[0] = '\0'; answer[0] = '\0';
#if !defined(DISABLE_HELP) || !defined(DISABLE_MOUSE) #if !defined(DISABLE_HELP) || (!defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION))
currshortcut = s; currshortcut = s;
#endif #endif
@ -261,12 +261,10 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
case 545: /* Right alt again */ case 545: /* Right alt again */
break; break;
#endif #endif
#ifndef DISABLE_MOUSE #if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
#ifdef NCURSES_MOUSE_VERSION
case KEY_MOUSE: case KEY_MOUSE:
do_mouse(); do_mouse();
break; break;
#endif
#endif #endif
case NANO_HOME_KEY: case NANO_HOME_KEY:
case KEY_HOME: case KEY_HOME:
@ -515,7 +513,7 @@ void bottombars(const shortcut *s)
s = s->next; s = s->next;
if (s == NULL) if (s == NULL)
goto break_completely_out; goto break_completely_out;
} }
} }
break_completely_out: break_completely_out:
@ -572,8 +570,8 @@ void reset_cursor(void)
const filestruct *ptr = edittop; const filestruct *ptr = edittop;
size_t x; size_t x;
/* Yuck. This condition can be true after open_file when opening the /* Yuck. This condition can be true after open_file() when opening
* first file. */ * the first file. */
if (edittop == NULL) if (edittop == NULL)
return; return;
@ -640,8 +638,8 @@ void edit_add(const filestruct *fileptr, int yval, int start
while (k < start + COLS) { while (k < start + COLS) {
/* Note the fifth parameter to regexec. It says not to /* Note the fifth parameter to regexec. It says not to
* match the beginning-of-line character unless * match the beginning-of-line character unless
* k == 0. If regexec returns non-zero, there are * k == 0. If regexec returns nonzero, there are no
* no more matches in the line. */ * more matches in the line. */
if (regexec(&start_regexp, &fileptr->data[k], 1, if (regexec(&start_regexp, &fileptr->data[k], 1,
&startmatch, k == 0 ? 0 : REG_NOTBOL)) &startmatch, k == 0 ? 0 : REG_NOTBOL))
break; break;
@ -732,14 +730,12 @@ void edit_add(const filestruct *fileptr, int yval, int start
* fileptr and after the start. Is there an end after * fileptr and after the start. Is there an end after
* the start at all? We don't paint unterminated starts. */ * the start at all? We don't paint unterminated starts. */
end_line = fileptr; end_line = fileptr;
while (end_line != NULL && while (end_line != NULL && regexec(&end_regexp, end_line->data,
regexec(&end_regexp, end_line->data, 1, 1, &endmatch, 0))
&endmatch, 0))
end_line = end_line->next; end_line = end_line->next;
/* No end found, or it is too early. */ /* No end found, or it is too early. */
if (end_line == NULL || if (end_line == NULL || end_line->lineno < fileptr->lineno ||
end_line->lineno < fileptr->lineno ||
(end_line == fileptr && endmatch.rm_eo <= start)) (end_line == fileptr && endmatch.rm_eo <= start))
goto step_two; goto step_two;
@ -801,9 +797,8 @@ void edit_add(const filestruct *fileptr, int yval, int start
/* There is no end on this line. But we haven't /* There is no end on this line. But we haven't
* yet looked for one on later lines. */ * yet looked for one on later lines. */
end_line = fileptr->next; end_line = fileptr->next;
while (end_line != NULL && while (end_line != NULL && regexec(&end_regexp,
regexec(&end_regexp, end_line->data, 1, end_line->data, 1, &endmatch, 0))
&endmatch, 0))
end_line = end_line->next; end_line = end_line->next;
if (end_line != NULL) { if (end_line != NULL) {
assert(0 <= x_start && x_start < COLS); assert(0 <= x_start && x_start < COLS);
@ -900,7 +895,7 @@ void update_line(filestruct *fileptr, int index)
size_t pos; size_t pos;
size_t page_start; size_t page_start;
if (!fileptr) if (fileptr == NULL)
return; return;
line = fileptr->lineno - edittop->lineno; line = fileptr->lineno - edittop->lineno;
@ -996,9 +991,6 @@ void center_cursor(void)
/* Refresh the screen without changing the position of lines. */ /* Refresh the screen without changing the position of lines. */
void edit_refresh(void) void edit_refresh(void)
{ {
static int noloop = 0;
int nlines = 0, currentcheck = 0;
/* Neither of these conditions should occur, but they do. edittop is /* Neither of these conditions should occur, but they do. edittop is
* NULL when you open an existing file on the command line, and * NULL when you open an existing file on the command line, and
* ENABLE_COLOR is defined. Yuck. */ * ENABLE_COLOR is defined. Yuck. */
@ -1007,40 +999,35 @@ void edit_refresh(void)
if (edittop == NULL) if (edittop == NULL)
edittop = current; edittop = current;
/* Don't make the cursor jump around the screen whilst updating */ if (current->lineno >= edittop->lineno + editwinrows)
leaveok(edit, TRUE); /* Note that edit_update() changes edittop so that
* current->lineno = edittop->lineno + editwinrows / 2. Thus
editbot = edittop; * when it then calls edit_refresh(), there is no danger of
while (nlines < editwinrows) { * getting an infinite loop. */
update_line(editbot, current_x);
if (editbot == current)
currentcheck = 1;
nlines++;
if (editbot->next == NULL)
break;
editbot = editbot->next;
}
/* If noloop == 1, then we already did an edit_update without finishing
this function. So we don't run edit_update again */
if (!currentcheck && !noloop) {
/* Then current has run off the screen... */
edit_update(current, CENTER); edit_update(current, CENTER);
noloop = 1; else {
} else if (noloop) int nlines = 0;
noloop = 0;
while (nlines < editwinrows) { /* Don't make the cursor jump around the screen whilst updating */
mvwaddstr(edit, nlines, 0, hblank); leaveok(edit, TRUE);
nlines++;
editbot = edittop;
while (nlines < editwinrows) {
update_line(editbot, current_x);
nlines++;
if (editbot->next == NULL)
break;
editbot = editbot->next;
}
while (nlines < editwinrows) {
mvwaddstr(edit, nlines, 0, hblank);
nlines++;
}
/* What the hell are we expecting to update the screen if this
isn't here? Luck?? */
wrefresh(edit);
leaveok(edit, FALSE);
} }
/* What the hell are we expecting to update the screen if this isn't
here? Luck?? */
wrefresh(edit);
leaveok(edit, FALSE);
} }
/* /*
@ -1137,8 +1124,8 @@ int statusq(int tabs, const shortcut *s, const char *def,
/* /*
* Ask a simple yes/no question on the statusbar. Returns 1 for Y, 0 * Ask a simple yes/no question on the statusbar. Returns 1 for Y, 0
* for N, 2 for All (if all is non-zero when passed in) and -1 for * for N, 2 for All (if all is nonzero when passed in) and -1 for abort
* abort (^C). * (^C).
*/ */
int do_yesno(int all, int leavecursor, const char *msg, ...) int do_yesno(int all, int leavecursor, const char *msg, ...)
{ {
@ -1148,10 +1135,8 @@ int do_yesno(int all, int leavecursor, const char *msg, ...)
const char *yesstr; /* String of yes characters accepted */ const char *yesstr; /* String of yes characters accepted */
const char *nostr; /* Same for no */ const char *nostr; /* Same for no */
const char *allstr; /* And all, surprise! */ const char *allstr; /* And all, surprise! */
#ifndef DISABLE_MOUSE #if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
#ifdef NCURSES_MOUSE_VERSION
MEVENT mevent; MEVENT mevent;
#endif
#endif #endif
/* Yes, no and all are strings of any length. Each string consists of /* Yes, no and all are strings of any length. Each string consists of
@ -1204,8 +1189,7 @@ int do_yesno(int all, int leavecursor, const char *msg, ...)
kbinput = wgetch(edit); kbinput = wgetch(edit);
switch (kbinput) { switch (kbinput) {
#ifndef DISABLE_MOUSE #if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
#ifdef NCURSES_MOUSE_VERSION
case KEY_MOUSE: case KEY_MOUSE:
/* Look ma! We get to duplicate lots of code from do_mouse!! */ /* Look ma! We get to duplicate lots of code from do_mouse!! */
@ -1232,7 +1216,6 @@ int do_yesno(int all, int leavecursor, const char *msg, ...)
ungetch(yesnosquare[mevent.y][mevent.x / (COLS / 6)]); ungetch(yesnosquare[mevent.y][mevent.x / (COLS / 6)]);
} }
break; break;
#endif
#endif #endif
case NANO_CONTROL_C: case NANO_CONTROL_C:
ok = -2; ok = -2;
@ -1436,12 +1419,10 @@ int do_help(void)
const char *ptr = help_text; const char *ptr = help_text;
switch (kbinput) { switch (kbinput) {
#ifndef DISABLE_MOUSE #if !defined(DISABLE_MOUSE) && defined(NCURSES_MOUSE_VERSION)
#ifdef NCURSES_MOUSE_VERSION
case KEY_MOUSE: case KEY_MOUSE:
do_mouse(); do_mouse();
break; break;
#endif
#endif #endif
case 27: case 27:
kbinput = wgetch(edit); kbinput = wgetch(edit);
@ -1562,7 +1543,7 @@ int do_help(void)
return 1; return 1;
} }
int keypad_on(WINDOW * win, int newval) int keypad_on(WINDOW *win, int newval)
{ {
/* This is taken right from aumix. Don't sue me. */ /* This is taken right from aumix. Don't sue me. */
#ifdef HAVE_USEKEYPAD #ifdef HAVE_USEKEYPAD