commit e1e0fd634b99086f1ba1cb67d1ca27a60b24f663
parent 0f4a7dc53ab5cab9f6c75083f719b1d794ab428a
Author: Chris Allegretta <chrisa@asty.org>
Date: Tue, 15 Apr 2003 01:15:09 +0000
DLR and DB's latest fixes
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1489 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
Diffstat:
10 files changed, 123 insertions(+), 70 deletions(-)
diff --git a/ChangeLog b/ChangeLog
@@ -10,6 +10,28 @@ CVS code -
if ~/.nano_history is unwritable, and prevent ~/.nano_history
from being completely overwritten by save_history() if it's
unreadable but writable. (David Benbennick)
+ - Only unset KEEP_CUTBUFFER in main() when we do something other
+ than cut text in the main input loop, instead of unsetting it
+ all over the place (which, as written, didn't handle cases
+ like a cut followed by M-Space properly). Also, instead of
+ checking for keyhandled's not being set inside the for loops,
+ do it in if blocks surrounding the for loops to increase
+ efficiency. (David Benbennick) DLR: Also unset KEEP_CUTBUFFER
+ if we hit a shortcut key other than the one for cutting text.
+ - Make it so a marked cut immediately followed by an unmarked
+ cut tacks the latter's text onto the end of the former's text
+ instead of putting it on a new line, as Pico does. (DLR)
+ - Convert instances of "(char *)nrealloc()" to the macro
+ charealloc(), which does the same thing. (DLR)
+- cut.c:
+ do_cut_text()
+ - Tweak where KEEP_CUTBUFFER is set so that a marked cut
+ immediately followed by an unmarked cut preserves the
+ cutbuffer between the two. (David Benbennick) DLR: Also
+ properly set KEEP_CUTBUFFER in tiny mode.
+ do_uncut_text()
+ - If we're about to uncut on the magicline, always make a new
+ magicline in advance, as Pico does. (DLR)
- global.c:
shortcut_init()
- Simplify the #ifdef used to enable file insertion in view mode
@@ -22,6 +44,17 @@ CVS code -
- nano.h:
- Simplify #ifdefs relating to HAVE_STRCASECMP and
HAVE_STRNCASECMP. (David Benbennick)
+- search.c:
+ goto_abort()
+ - Removed, with all instances replaced with display_main_list(),
+ since with the removal of all the scattered calls to
+ SET(KEEP_CUTBUFFER), that function was all that was left of
+ it. (DLR)
+ do_find_bracket()
+ - If a matching bracket wasn't found, call update_line() after
+ setting current and current_x back to their original values,
+ in case current_x's original value is greater than the width
+ of the screen. (DLR)
- configure.ac:
- Enable autodetection of broken regexec(). (DLR) Re-added
regex.h check to ensure compile under Debian w/autoconf 1.6.
diff --git a/cut.c b/cut.c
@@ -29,6 +29,12 @@
#include "nano.h"
static int marked_cut; /* Is the cutbuffer from a mark? */
+
+#ifndef NANO_SMALL
+static int concatenate_cut; /* Should we add this cut string to the
+ end of the last one? */
+#endif
+
static filestruct *cutbottom = NULL;
/* Pointer to end of cutbuffer */
@@ -47,6 +53,15 @@ void add_to_cutbuffer(filestruct *inptr)
if (cutbuffer == NULL) {
cutbuffer = inptr;
inptr->prev = NULL;
+#ifndef NANO_SMALL
+ } else if (concatenate_cut && !justify_mode) {
+ /* Just tack the text in inptr onto the text in cutbottom,
+ unless we're backing up lines while justifying text. */
+ cutbottom->data = charealloc(cutbottom->data,
+ strlen(cutbottom->data) + strlen(inptr->data) + 1);
+ strcat(cutbottom->data, inptr->data);
+ return;
+#endif
} else {
cutbottom->next = inptr;
inptr->prev = cutbottom;
@@ -118,15 +133,13 @@ void cut_marked_segment(filestruct *top, size_t top_x, filestruct *bot,
move text from the end forward first. */
memmove(top->data + top_x, bot->data + bot_x,
newsize - top_x);
- top->data = (char *)nrealloc(top->data,
- sizeof(char) * newsize);
+ top->data = charealloc(top->data, newsize);
} else {
totsize -= bot_x + 1;
/* Here, the remainder line might get longer, so we
realloc() it first. */
- top->data = (char *)nrealloc(top->data,
- sizeof(char) * newsize);
+ top->data = charealloc(top->data, newsize);
memmove(top->data + top_x, bot->data + bot_x,
newsize - top_x);
}
@@ -172,6 +185,9 @@ void cut_marked_segment(filestruct *top, size_t top_x, filestruct *bot,
new_magicline();
}
}
+#ifdef DEBUG
+ dump_buffer(cutbuffer);
+#endif
}
#endif
@@ -190,6 +206,9 @@ int do_cut_text(void)
free_filestruct(cutbuffer);
cutbuffer = NULL;
marked_cut = 0;
+#ifndef NANO_SMALL
+ concatenate_cut = 0;
+#endif
#ifdef DEBUG
fprintf(stderr, _("Blew away cutbuffer =)\n"));
#endif
@@ -204,6 +223,8 @@ int do_cut_text(void)
)
return 0;
+ SET(KEEP_CUTBUFFER);
+
#ifndef NANO_SMALL
if (ISSET(CUT_TO_END) && !ISSET(MARK_ISSET)) {
assert(current_x >= 0 && current_x <= strlen(current->data));
@@ -223,12 +244,10 @@ int do_cut_text(void)
}
do_delete();
- SET(KEEP_CUTBUFFER);
marked_cut = 2;
return 1;
} else {
SET(MARK_ISSET);
- SET(KEEP_CUTBUFFER);
mark_beginx = strlen(current->data);
mark_beginbuf = current;
@@ -249,6 +268,11 @@ int do_cut_text(void)
placewewant = xplustabs();
UNSET(MARK_ISSET);
+ /* If we just did a marked cut of part of a line, we should add
+ the first line of any cut done immediately afterward to the
+ end of this cut, as Pico does. */
+ if (current == mark_beginbuf && current_x < strlen(current->data))
+ concatenate_cut = 1;
marked_cut = 1;
if (dontupdate)
edit_refresh();
@@ -283,8 +307,10 @@ int do_cut_text(void)
edit_refresh();
set_modified();
marked_cut = 0;
+#ifndef NANO_SMALL
+ concatenate_cut = 0;
+#endif
placewewant = 0;
- SET(KEEP_CUTBUFFER);
return 1;
}
@@ -312,6 +338,11 @@ int do_uncut_text(void)
placewewant = 0;
}
+ /* If we're going to uncut on the magicline, always make a new
+ magicline in advance. */
+ if (current->next == NULL)
+ new_magicline();
+
if (marked_cut == 0 || cutbuffer->next != NULL)
{
newbuf = copy_filestruct(cutbuffer);
@@ -338,10 +369,6 @@ int do_uncut_text(void)
current_x += buf_len;
totsize += buf_len;
- /* If we've uncut a line, make sure there's a magicline after
- it */
- if (current->next == NULL)
- new_magicline();
placewewant = xplustabs();
update_cursor();
@@ -426,7 +453,6 @@ int do_uncut_text(void)
edit_update(current, CENTER);
else
edit_refresh();
- UNSET(KEEP_CUTBUFFER);
return 0;
}
@@ -464,6 +490,5 @@ int do_uncut_text(void)
#endif
set_modified();
- UNSET(KEEP_CUTBUFFER);
return 1;
}
diff --git a/files.c b/files.c
@@ -495,7 +495,6 @@ int do_insertfile(int loading_file)
_("Command to execute"));
if (ts == -1 || answer == NULL || answer[0] == '\0') {
statusbar(_("Cancelled"));
- UNSET(KEEP_CUTBUFFER);
display_main_list();
return 0;
}
@@ -618,7 +617,6 @@ int do_insertfile(int loading_file)
free(inspath);
inspath = NULL;
- UNSET(KEEP_CUTBUFFER);
display_main_list();
return i;
}
diff --git a/global.c b/global.c
@@ -65,6 +65,7 @@ openfilestruct *open_files = NULL; /* The list of open files */
#endif
#ifndef DISABLE_JUSTIFY
+int justify_mode = 0; /* Whether we're justifying now. */
char *quotestr = NULL; /* Quote string. The default value is
set in main(). */
#endif
diff --git a/move.c b/move.c
@@ -30,7 +30,6 @@
int do_home(void)
{
- UNSET(KEEP_CUTBUFFER);
current_x = 0;
placewewant = 0;
update_line(current, current_x);
@@ -39,7 +38,6 @@ int do_home(void)
int do_end(void)
{
- UNSET(KEEP_CUTBUFFER);
current_x = strlen(current->data);
placewewant = xplustabs();
update_line(current, current_x);
@@ -89,7 +87,6 @@ int do_page_up(void)
edit_update(current, TOP);
update_cursor();
- UNSET(KEEP_CUTBUFFER);
check_statblank();
return 1;
}
@@ -132,7 +129,6 @@ int do_page_down(void)
}
update_cursor();
- UNSET(KEEP_CUTBUFFER);
check_statblank();
return 1;
}
@@ -151,7 +147,6 @@ int do_up(void)
update_line(current, current_x);
} else
page_up();
- UNSET(KEEP_CUTBUFFER);
check_statblank();
}
return 1;
@@ -162,7 +157,6 @@ int do_up(void)
int do_down(void)
{
wrap_reset();
- UNSET(KEEP_CUTBUFFER);
check_statblank();
if (current->next == NULL)
@@ -207,7 +201,6 @@ int do_left(void)
}
placewewant = xplustabs();
update_line(current, current_x);
- UNSET(KEEP_CUTBUFFER);
check_statblank();
return 1;
}
@@ -224,7 +217,6 @@ int do_right(void)
}
placewewant = xplustabs();
update_line(current, current_x);
- UNSET(KEEP_CUTBUFFER);
check_statblank();
return 1;
}
diff --git a/nano.c b/nano.c
@@ -1018,8 +1018,6 @@ void do_char(char ch)
if (refresh)
edit_refresh();
#endif
-
- UNSET(KEEP_CUTBUFFER);
}
int do_backspace(void)
@@ -1093,7 +1091,6 @@ int do_backspace(void)
#ifdef DEBUG
fprintf(stderr, _("After, data = \"%s\"\n"), current->data);
#endif
- UNSET(KEEP_CUTBUFFER);
refresh = 1;
}
@@ -1152,7 +1149,6 @@ int do_delete(void)
totsize--;
set_modified();
- UNSET(KEEP_CUTBUFFER);
update_line(current, current_x);
if (refresh)
edit_refresh();
@@ -2428,6 +2424,7 @@ int do_justify(void)
/* Next step, we loop through the lines of this paragraph, justifying
* each one individually. */
+ justify_mode = 1;
for(; par_len > 0; current_y++, par_len--) {
size_t line_len;
size_t display_len;
@@ -2491,9 +2488,8 @@ int do_justify(void)
indent_len = quote_len +
indent_length(current->next->data + quote_len);
- current->next->data = (char *)nrealloc(current->next->data,
- sizeof(char) * (next_line_len + line_len -
- break_pos + 1));
+ current->next->data = charealloc(current->next->data,
+ next_line_len + line_len - break_pos + 1);
memmove(current->next->data + indent_len + line_len - break_pos,
current->next->data + indent_len,
@@ -2537,7 +2533,7 @@ int do_justify(void)
fill - display_len - 1, FALSE);
assert(break_pos != -1);
- current->data = (char *)nrealloc(current->data,
+ current->data = charealloc(current->data,
line_len + break_pos + 2);
current->data[line_len] = ' ';
strncpy(current->data + line_len + 1,
@@ -2580,6 +2576,8 @@ int do_justify(void)
continue_loc:
current = current->next;
}
+ justify_mode = 0;
+
/* We are now done justifying the paragraph. There are cleanup things to
* do, and we check for unjustify. */
@@ -2664,10 +2662,9 @@ int do_justify(void)
}
edit_refresh();
}
- UNSET(KEEP_CUTBUFFER);
cutbuffer = cutbuffer_save;
blank_statusbar_refresh();
- /* display shortcut list without UnCut */
+ /* display shortcut list with UnCut */
shortcut_init(0);
display_main_list();
@@ -3632,20 +3629,25 @@ int main(int argc, char *argv[])
kbinput <= 'Z' && kbinput == s->altval - 32)) {
if (ISSET(VIEW_MODE) && !s->viewok)
print_view_warning();
- else
+ else {
+ if (s->func != do_cut_text)
+ UNSET(KEEP_CUTBUFFER);
s->func();
+ }
keyhandled = 1;
break;
}
#ifndef NANO_SMALL
- /* And for toggle switches */
- for (t = toggles; t != NULL && !keyhandled; t = t->next)
- if (kbinput == t->val || (t->val >= 'a' &&
- t->val <= 'z' && kbinput == t->val - 32)) {
- do_toggle(t);
- keyhandled = 1;
- break;
- }
+ if (!keyhandled)
+ /* And for toggle switches */
+ for (t = toggles; t != NULL; t = t->next)
+ if (kbinput == t->val || (t->val >= 'a' &&
+ t->val <= 'z' && kbinput == t->val - 32)) {
+ UNSET(KEEP_CUTBUFFER);
+ do_toggle(t);
+ keyhandled = 1;
+ break;
+ }
#endif
#ifdef DEBUG
fprintf(stderr, _("I got Alt-%c! (%d)\n"), kbinput,
@@ -3675,25 +3677,33 @@ int main(int argc, char *argv[])
/* Look through the main shortcut list to see if we've hit a
shortcut key */
+ if (!keyhandled)
#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
- for (s = main_list; s != NULL && !keyhandled; s = s->next) {
+ for (s = main_list; s != NULL && !keyhandled; s = s->next) {
#endif
- if (kbinput == s->val ||
- (s->misc1 && kbinput == s->misc1) ||
- (s->misc2 && kbinput == s->misc2)) {
- if (ISSET(VIEW_MODE) && !s->viewok)
- print_view_warning();
- else
- s->func();
- keyhandled = 1;
- /* Rarely, the value of s can change after s->func(),
- leading to problems; get around this by breaking out
- explicitly once we successfully handle a shortcut */
- break;
+ if (kbinput == s->val ||
+ (s->misc1 && kbinput == s->misc1) ||
+ (s->misc2 && kbinput == s->misc2)) {
+ if (ISSET(VIEW_MODE) && !s->viewok)
+ print_view_warning();
+ else {
+ if (s->func != do_cut_text)
+ UNSET(KEEP_CUTBUFFER);
+ s->func();
+ }
+ keyhandled = 1;
+ /* Rarely, the value of s can change after
+ s->func(), leading to problems; get around this
+ by breaking out explicitly once we successfully
+ handle a shortcut */
+ break;
+ }
}
- }
+
+ if (!keyhandled)
+ UNSET(KEEP_CUTBUFFER);
#ifdef _POSIX_VDISABLE
/* Don't even think about changing this string */
diff --git a/proto.h b/proto.h
@@ -44,6 +44,7 @@ extern int search_offscreen;
extern int currslen;
#ifndef DISABLE_JUSTIFY
+extern int justify_mode;
extern char *quotestr;
#endif
@@ -367,7 +368,6 @@ char *replace_line(void);
int do_replace_loop(const char *prevanswer, const filestruct *begin,
int *beginx, int wholewords, int *i);
int do_replace(void);
-void goto_abort(void);
int do_gotoline(int line, int save_pos);
int do_gotoline_void(void);
#if defined (ENABLE_MULTIBUFFER) || !defined (DISABLE_SPELLER)
diff --git a/search.c b/search.c
@@ -67,7 +67,6 @@ void not_found_msg(const char *str)
void search_abort(void)
{
- UNSET(KEEP_CUTBUFFER);
display_main_list();
wrefresh(bottomwin);
if (ISSET(MARK_ISSET))
@@ -768,12 +767,6 @@ int do_replace(void)
return 1;
}
-void goto_abort(void)
-{
- UNSET(KEEP_CUTBUFFER);
- display_main_list();
-}
-
int do_gotoline(int line, int save_pos)
{
if (line <= 0) { /* Ask for it */
@@ -787,7 +780,7 @@ int do_gotoline(int line, int save_pos)
if (st == -1 || st == -2)
statusbar(_("Aborted"));
if (st != 0) {
- goto_abort();
+ display_main_list();
return 0;
}
@@ -796,7 +789,7 @@ int do_gotoline(int line, int save_pos)
/* Bounds check */
if (line <= 0) {
statusbar(_("Come on, be reasonable"));
- goto_abort();
+ display_main_list();
return 0;
}
}
@@ -813,7 +806,7 @@ int do_gotoline(int line, int save_pos)
else
edit_update(current, CENTER);
placewewant = 0;
- goto_abort();
+ display_main_list();
return 1;
}
@@ -909,6 +902,7 @@ int do_find_bracket(void)
statusbar(_("No matching bracket"));
current_x = current_x_save;
current = current_save;
+ update_line(current, current_x);
break;
}
}
diff --git a/utils.c b/utils.c
@@ -74,7 +74,7 @@ void align(char **strp)
void null_at(char **data, size_t index)
{
assert(data != NULL);
- *data = (char *)nrealloc(*data, sizeof(char) * (index + 1));
+ *data = charealloc(*data, index + 1);
(*data)[index] = '\0';
}
diff --git a/winio.c b/winio.c
@@ -221,7 +221,7 @@ int nanogetstr(int allowtabs, const char *buf, const char *def,
if (x == -1 || x > xend || resetstatuspos)
x = xend;
- answer = (char *)nrealloc(answer, xend + 1);
+ answer = charealloc(answer, xend + 1);
if (xend > 0)
strcpy(answer, def);
else