]> git.wh0rd.org Git - nano.git/commitdiff
Carl Drinkwater's titlebar spacing fixes, David Benbennick's help browser
authorDavid Lawrence Ramsey <pooka109@gmail.com>
Fri, 21 Jun 2002 03:20:06 +0000 (03:20 +0000)
committerDavid Lawrence Ramsey <pooka109@gmail.com>
Fri, 21 Jun 2002 03:20:06 +0000 (03:20 +0000)
fixes, and my regexp searching bug fix

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1223 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
global.c
nano.c
proto.h
search.c
utils.c
winio.c

index 7ba928b6296c529dd0fd83f6e1ef73149016bdab..92d073c83def39919fd62e945ca69d16c655a160 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,12 +5,17 @@ CVS Code -
          Removed intl/ entirely, and a few more tweaks by gettextize.
        - i18nized a few strings used in DEBUG mode. (DLR)
        - Some chars being assigned 0 are now assigned '\0'. (DLR)
-       - Put header files in a more consistent order. (DLR)
+       - Put header file #includes in a more consistent order. (DLR)
        - Remove some unneeded blank lines and spaces, and make some
          spacing more consistent. (DLR)
        - When possible, use iscntrl() to determine whether a character
          is a control character or not. (DLR)
        - Miscellaneous typo fixes. (DLR)
+       - Many fixes to the help browser and shortcut lists: efficiency
+         updates, consistency fixes, help text fixes and improvements,
+         and spacing improvements. (David Benbennick)
+       - Make more functions use const variables when possible. (David
+         Benbennick)
 - files.c:
   read_file(), read_line():
        - Rework to properly handle nulls in the input file, fix
@@ -52,10 +57,17 @@ CVS Code -
          with it, instead of calling clear_filename() in two places.
          Make startline an int instead of a long, since it's supposed to
          hold a line number. (DLR)
+       - Properly handle multiple -r settings on the command line. (Carl
+         Drinkwater)
 - search.c:
   findnextstr():
        - Update the current line at current_x if we don't find a match.
-         (DLR)
+         Also, pass current_x_find to strstrwrapper() so we know whether
+         we're at the beginning of a string or not (see changes to
+         strstrwrapper() below), and reset it between lines. (DLR)
+  do_gotoline():
+       - Make sure placewewant is zero after we go to a line. (David
+         Benbennick)
   do_gotopos():
        - Simplify the sanity check to only put x within the range of the
          current line; don't call actual_x() anymore. (DLR)
@@ -64,6 +76,10 @@ CVS Code -
          other than the terminating null in strings to newlines and
          back; they're used to handle null characters in files properly.
          (DLR)
+  strstrwrapper(): Set REG_NOTBOL when we're not at the beginning of a
+         string, to avoid false positives when searching for regular
+         expressions prefixed with ^. Make it take a new parameter,
+         line_pos, to determine where we are in the string. (DLR)
 - winio.c:
   actual_x_from_start():
        - Overhaul to make cursor placement more like that of Pico: add
@@ -74,6 +90,9 @@ CVS Code -
        - After the user presses Enter at the prompt, refresh the edit
          window in case there's a list of possible filename matches
          (left over from attempted tab completion) on it. (DLR)
+  titlebar():
+       - Tweak text spacing and printing so that the titlebar text looks
+         better on smaller terminals. (Carl Drinkwater)
   update_line():
        - When marking control characters, make sure the mark moves
          forward by two characters inctead of one.  Rework control
index 1a4157e5d1ccdc47e1122acb46d65a88a7d90120..e31373f4d76d996bfe0e30ad665d5ad68da3f4d7 100644 (file)
--- a/global.c
+++ b/global.c
@@ -338,7 +338,7 @@ void shortcut_init(int unjustify)
     nano_exit_msg = _("Exit from nano");
 #endif
 
-    nano_goto_msg = _("Goto a specific line number");
+    nano_goto_msg = _("Go to a specific line number");
     nano_justify_msg = _("Justify the current paragraph");
     nano_unjustify_msg = _("Unjustify after a justify");
     nano_replace_msg = _("Replace text within the editor");
@@ -369,7 +369,7 @@ void shortcut_init(int unjustify)
        _("Make the current search or replace case (in)sensitive");
     nano_tofiles_msg = _("Go to file browser");
     nano_execute_msg = _("Execute external command");
-    nano_gotodir_msg = _("Goto Directory");
+    nano_gotodir_msg = _("Go to directory");
     nano_cancel_msg = _("Cancel the current function");
     nano_append_msg = _("Append to the current file");
     nano_prepend_msg = _("Prepend to the current file");
@@ -541,10 +541,20 @@ void shortcut_init(int unjustify)
                IFHELP(nano_enter_msg, 0),
                KEY_ENTER, NANO_CONTROL_M, NOVIEW, do_enter_void);
 
-    sc_init_one(&main_list, NANO_GOTO_KEY, _("Goto Line"),
+    sc_init_one(&main_list, NANO_GOTO_KEY, _("Go To Line"),
                    IFHELP(nano_goto_msg, NANO_ALT_GOTO_KEY),
                    NANO_GOTO_FKEY, 0, VIEW, do_gotoline_void);
 
+#ifndef NANO_SMALL
+    sc_init_one(&main_list, NANO_NEXTWORD_KEY, _("Next Word"),
+               IFHELP(_("Move forward one word"), 0),
+               0, 0, VIEW, do_next_word_void);
+
+    sc_init_one(&main_list, -9, _("Prev Word"),
+               IFHELP(_("Move backward one word"), NANO_PREVWORD_KEY), 0, 0,
+               VIEW, do_prev_word_void);
+#endif
+
 #if (!defined NANO_SMALL) && (defined HAVE_REGEX_H)
     sc_init_one(&main_list, -9, _("Find Other Bracket"),
                    IFHELP(nano_bracket_msg, NANO_BRACKET_KEY),
@@ -560,15 +570,6 @@ void shortcut_init(int unjustify)
                    0, 0, VIEW, open_nextfile_void);
 #endif
 
-#ifndef NANO_SMALL
-    sc_init_one(&main_list, NANO_NEXTWORD_KEY, _("Next Word"),
-               IFHELP(_("Move forward one word"), 0),
-               0, 0, VIEW, do_next_word_void);
-    sc_init_one(&main_list, -9, _("Prev Word"),
-               IFHELP(_("Move backward one word"), NANO_PREVWORD_KEY), 0, 0,
-               VIEW, do_prev_word_void);
-#endif
-
     free_shortcutage(&whereis_list);
 
     sc_init_one(&whereis_list, NANO_HELP_KEY, _("Get Help"),
@@ -587,7 +588,7 @@ void shortcut_init(int unjustify)
     sc_init_one(&whereis_list, NANO_OTHERSEARCH_KEY, _("Replace"),
                IFHELP(nano_replace_msg, 0), 0, 0, VIEW, do_replace);
 
-    sc_init_one(&whereis_list, NANO_FROMSEARCHTOGOTO_KEY, _("Goto Line"), 
+    sc_init_one(&whereis_list, NANO_FROMSEARCHTOGOTO_KEY, _("Go To Line"), 
                IFHELP(nano_goto_msg, 0), 0, 0, VIEW, do_gotoline_void);
 
 #ifndef NANO_SMALL
@@ -620,7 +621,7 @@ void shortcut_init(int unjustify)
     sc_init_one(&replace_list, NANO_OTHERSEARCH_KEY, _("No Replace"),
                IFHELP(nano_whereis_msg, 0), 0, 0, VIEW, do_search);
 
-    sc_init_one(&replace_list, NANO_FROMSEARCHTOGOTO_KEY, _("Goto Line"), 
+    sc_init_one(&replace_list, NANO_FROMSEARCHTOGOTO_KEY, _("Go To Line"), 
                IFHELP(nano_goto_msg, 0), 0, 0, VIEW, do_gotoline_void);
 
 #ifndef NANO_SMALL
@@ -747,8 +748,8 @@ void shortcut_init(int unjustify)
     sc_init_one(&browser_list, NANO_HELP_KEY, _("Get Help"),
                IFHELP(nano_help_msg, 0), 0, 0, VIEW, do_help);
 
-    sc_init_one(&browser_list, NANO_EXIT_KEY, _("Exit"),
-               IFHELP(nano_exit_msg, 0), NANO_EXIT_FKEY, 0, VIEW, 0);
+    sc_init_one(&browser_list, NANO_CANCEL_KEY, _("Cancel"),
+               IFHELP(nano_cancel_msg, 0), NANO_EXIT_FKEY, 0, VIEW, 0);
 
     sc_init_one(&browser_list, NANO_PREVPAGE_KEY, _("Prev Page"),
                IFHELP(nano_prevpage_msg, 0), NANO_PREVPAGE_FKEY,
@@ -758,7 +759,7 @@ void shortcut_init(int unjustify)
                IFHELP(nano_nextpage_msg, 0), NANO_NEXTPAGE_FKEY,
                KEY_NPAGE, VIEW, 0);
 
-    sc_init_one(&browser_list, NANO_GOTO_KEY, _("Goto"),
+    sc_init_one(&browser_list, NANO_GOTO_KEY, _("Go To Dir"),
                IFHELP(nano_gotodir_msg, NANO_ALT_GOTO_KEY),
                NANO_GOTO_FKEY, 0, VIEW, 0);
 
diff --git a/nano.c b/nano.c
index 5a2d18bf9cebdc6745186cceecbdf33552076c60..25f94a2fe5db2294e709681a692a737dcdb90459 100644 (file)
--- a/nano.c
+++ b/nano.c
@@ -70,10 +70,6 @@ int wrap_at = 0;/* Right justified fill value, allows resize */
 struct termios oldterm;                /* The user's original term settings */
 static struct sigaction act;   /* For all our fun signal handlers */
 
-#ifndef DISABLE_HELP
-static char *help_text_init = "";      /* Initial message, not including shortcuts */
-#endif
-
 char *last_search = NULL;      /* Last string we searched for */
 char *last_replace = NULL;     /* Last replacement string */
 int search_last_line;          /* Is this the last search line? */
@@ -248,33 +244,7 @@ void global_init(int save_cutbuffer)
 
 }
 
-#ifndef DISABLE_HELP
-void init_help_msg(void)
-{
-
-    help_text_init =
-       _(" nano help text\n\n "
-         "The nano editor is designed to emulate the functionality and "
-         "ease-of-use of the UW Pico text editor.  There are four main "
-         "sections of the editor: The top line shows the program "
-         "version, the current filename being edited, and whether "
-         "or not the file has been modified.  Next is the main editor "
-         "window showing the file being edited.  The status line is "
-         "the third line from the bottom and shows important messages. "
-         "The bottom two lines show the most commonly used shortcuts "
-         "in the editor.\n\n "
-         "The notation for shortcuts is as follows: Control-key "
-         "sequences are notated with a caret (^) symbol and are entered "
-         "with the Control (Ctrl) key.  Escape-key sequences are notated "
-         "with the Meta (M) symbol and can be entered using either the "
-         "Esc, Alt or Meta key depending on your keyboard setup.  The "
-         "following keystrokes are available in the main editor window. "
-         "Optional keys are shown in parentheses:\n\n");
-}
-#endif
-
-/* Make a copy of a node to a pointer (space will be malloc()ed).  This
-   does NOT copy the data members used only by open_files. */
+/* Make a copy of a node to a pointer (space will be malloc()ed). */
 filestruct *copy_node(filestruct * src)
 {
     filestruct *dst;
@@ -2514,17 +2484,16 @@ int do_justify(void)
 }
 
 #ifndef DISABLE_HELP
+/* This function allocates help_text, and stores the help string in it. 
+ * help_text should be NULL initially. */
 void help_init(void)
 {
-    int i, sofar = 0, helplen;
-    long allocsize = 1;                /* How much space we're gonna need for the help text */
+    size_t allocsize = 1;      /* space needed for help_text */
     char *ptr = NULL;
 #ifndef NANO_SMALL
-    toggle *t;
+    const toggle *t;
 #endif
-    shortcut *s;
-
-    helplen = length_of_list(currshortcut);
+    const shortcut *s;
 
     /* First set up the initial help text for the current function */
     if (currshortcut == whereis_list || currshortcut == replace_list
@@ -2534,29 +2503,29 @@ void help_init(void)
                "for, then hit enter.  If there is a match for the text you "
                "entered, the screen will be updated to the location of the "
                "nearest match for the search string.\n\n "
-               "If using Pico Mode via the -p or --pico flags, using the "
-               "Meta-P toggle or using a nanorc file, the previous search "
+               "If using Pico Mode via the -p or --pico flags, the "
+               "Meta-P toggle, or a nanorc file, the previous search "
                "string will be shown in brackets after the Search: prompt.  "
-               "Hitting enter without entering any text will perform the "
-               "previous search. Otherwise, the previous string will be "
-               "placed in front of the cursor, and can be edited or deleted "
-               "before hitting enter.\n\n The following functions keys are "
+               "Hitting Enter without entering any text will perform the "
+               "previous search.  Otherwise, the previous string will be "
+               "placed before the cursor, and can be edited or deleted "
+               "before hitting enter.\n\n The following function keys are "
                "available in Search mode:\n\n");
     else if (currshortcut == goto_list)
-       ptr = _("Goto Line Help Text\n\n "
+       ptr = _("Go To Line Help Text\n\n "
                "Enter the line number that you wish to go to and hit "
                "Enter.  If there are fewer lines of text than the "
                "number you entered, you will be brought to the last line "
-               "of the file.\n\n The following functions keys are "
-               "available in Goto Line mode:\n\n");
+               "of the file.\n\n The following function keys are "
+               "available in Go To Line mode:\n\n");
     else if (currshortcut == insertfile_list)
        ptr = _("Insert File Help Text\n\n "
                "Type in the name of a file to be inserted into the current "
                "file buffer at the current cursor location.\n\n "
                "If you have compiled nano with multiple file buffer "
                "support, and enable multiple buffers with the -F "
-               "or --multibuffer command line flags, the Meta-F toggle or "
-               "using a nanorc file, inserting a file will cause it to be "
+               "or --multibuffer command line flags, the Meta-F toggle, or "
+               "a nanorc file, inserting a file will cause it to be "
                "loaded into a separate buffer (use Meta-< and > to switch "
                "between file buffers).\n\n If you need another blank "
                "buffer, do not enter any filename, or type in a "
@@ -2566,14 +2535,13 @@ void help_init(void)
     else if (currshortcut == writefile_list)
        ptr = _("Write File Help Text\n\n "
                "Type the name that you wish to save the current file "
-               "as and hit enter to save the file.\n\n "
-               "If you are using the marker code with Ctrl-^ and have "
-               "selected text, you will be prompted to save only the "
-               "selected portion to a separate file.  To reduce the "
-               "chance of overwriting the current file with just a portion "
-               "of it, the current filename is not the default in this "
-               "mode.\n\n The following function keys are available in "
-               "Write File mode:\n\n");
+               "as and hit Enter to save the file.\n\n If you have "
+               "selected text with Ctrl-^, you will be prompted to "
+               "save only the selected portion to a separate file.  To "
+               "reduce the chance of overwriting the current file with "
+               "just a portion of it, the current filename is not the "
+               "default in this mode.\n\n The following function keys "
+               "are available in Write File mode:\n\n");
 #ifndef DISABLE_BROWSER
     else if (currshortcut == browser_list)
        ptr = _("File Browser Help Text\n\n "
@@ -2582,17 +2550,17 @@ void help_init(void)
                "or writing.  You may use the arrow keys or Page Up/"
                "Down to browse through the files, and S or Enter to "
                "choose the selected file or enter the selected "
-               "directory. To move up one level, select the directory "
+               "directory.  To move up one level, select the directory "
                "called \"..\" at the top of the file list.\n\n The "
-               "following functions keys are available in the file "
+               "following function keys are available in the file "
                "browser:\n\n");
     else if (currshortcut == gotodir_list)
-       ptr = _("Browser Goto Directory Help Text\n\n "
+       ptr = _("Browser Go To Directory Help Text\n\n "
                "Enter the name of the directory you would like to "
                "browse to.\n\n If tab completion has not been disabled, "
                "you can use the TAB key to (attempt to) automatically "
-               "complete the directory name.\n\n  The following function "
-               "keys are available in Browser GotoDir mode:\n\n");
+               "complete the directory name.\n\n The following function "
+               "keys are available in Browser Go To Directory mode:\n\n");
 #endif
     else if (currshortcut == spell_list)
        ptr = _("Spell Check Help Text\n\n "
@@ -2612,107 +2580,117 @@ void help_init(void)
                "available in this mode:\n\n");
 #endif
     else /* Default to the main help list */
-       ptr = help_text_init;
+       ptr = _(" nano help text\n\n "
+         "The nano editor is designed to emulate the functionality and "
+         "ease-of-use of the UW Pico text editor.  There are four main "
+         "sections of the editor: The top line shows the program "
+         "version, the current filename being edited, and whether "
+         "or not the file has been modified.  Next is the main editor "
+         "window showing the file being edited.  The status line is "
+         "the third line from the bottom and shows important messages. "
+         "The bottom two lines show the most commonly used shortcuts "
+         "in the editor.\n\n "
+         "The notation for shortcuts is as follows: Control-key "
+         "sequences are notated with a caret (^) symbol and are entered "
+         "with the Control (Ctrl) key.  Escape-key sequences are notated "
+         "with the Meta (M) symbol and can be entered using either the "
+         "Esc, Alt or Meta key depending on your keyboard setup.  The "
+         "following keystrokes are available in the main editor window.  "
+         "Alternative keys are shown in parentheses:\n\n");
 
-    /* Compute the space needed for the shortcut lists - we add 15 to
-       have room for the shortcut abbrev and its possible alternate keys */
-    s = currshortcut;
-    for (i = 0; i <= helplen - 1; i++) {
-       if (s->help != NULL)
-           allocsize += strlen(s->help) + 15;
-       s = s->next;
+    assert(currshortcut != NULL);
+    /* Compute the space needed for the shortcut lists */
+    for (s = currshortcut; s != NULL; s = s->next) {
+       assert(s->help != NULL);
+       /* Each shortcut has at most 24 chars for the shortcut keys, plus
+        * the help description, plus 1 for \n. */
+       allocsize += strlen(s->help) + 25;
     }
 
 #ifndef NANO_SMALL
-    /* If we're on the main list, we also allocate space for toggle help text. */
+    /* If we're on the main list, we also count the toggle help text. */
     if (currshortcut == main_list) {
-       for (t = toggles; t != NULL; t = t->next)
-           if (t->desc != NULL)
-               allocsize += strlen(t->desc) + 30;
+       for (t = toggles; t != NULL; t = t->next) {
+           size_t len;
+
+           assert(t->desc != NULL);
+           len = strlen(t->desc);
+
+           /* 6 for "M-%c\t\t\t", which fills 24 columns. */
+           allocsize += 6 + (len < COLS-24 ? len : COLS-24);
+       }
     }
 #endif /* !NANO_SMALL */
 
     allocsize += strlen(ptr);
 
-    if (help_text != NULL)
-       free(help_text);
+    /* Other routines should have set help_text to NULL before */
+    assert(help_text == NULL);
 
     /* Allocate space for the help text */
     help_text = charalloc(allocsize);
 
     /* Now add the text we want */
     strcpy(help_text, ptr);
-    sofar = strlen(help_text);
+    ptr = help_text + strlen(help_text);
 
     /* Now add our shortcut info */
-    s = currshortcut;
-    for (i = 0; i <= helplen - 1; i++) {
+    for (s = currshortcut; s != NULL; s = s->next) {
+       /* true if the character in s->altval is shown in first column */
        int meta_shortcut = 0;
 
        if (s->val > 0 && s->val < 32)
-           sofar += sprintf(help_text + sofar, "^%c\t", s->val + 64);
+           ptr += sprintf(ptr, "^%c", s->val + 64);
 #ifndef NANO_SMALL
        else if (s->val == NANO_CONTROL_SPACE)
-           sofar += sprintf(help_text + sofar, "^%s\t", _("Space"));
-#endif
-       else if (s->altval > 0)
+           ptr += snprintf(ptr, 8, "^%s", _("Space"));
+       else if (s->altval == NANO_ALT_SPACE) {
            meta_shortcut = 1;
-       else
-           help_text[sofar++] = '\t';
-
-       if (!meta_shortcut) {
-           if (s->misc1 > KEY_F0 && s->misc1 <= KEY_F(64))
-               sofar += sprintf(help_text + sofar, "(F%d)",
-                               s->misc1 - KEY_F0);
-           help_text[sofar++] = '\t';
+           ptr += snprintf(ptr, 8, "M-%s", _("Space"));
        }
-
-#ifndef NANO_SMALL
-       if (s->altval == NANO_ALT_SPACE)
-           sofar += sprintf(help_text + sofar, "M-%s", _("Space"));
-       else
 #endif
-       if (s->altval > 0)
-           sofar += sprintf(help_text + sofar,
-               (meta_shortcut ? "M-%c" : "(M-%c)"), s->altval -
-               (('A' <= s->altval && s->altval <= 'Z') || 'a' <= s->altval
-                       ? 32 : 0));
+       else if (s->altval > 0) {
+           meta_shortcut = 1;
+           ptr += sprintf(ptr, "M-%c", s->altval -
+                       (('A' <= s->altval && s->altval <= 'Z') ||
+                       'a' <= s->altval ? 32 : 0));
+       }
        /* Hack */
-       else if (s->val >= 'a')
-           sofar += sprintf(help_text + sofar,
-               (meta_shortcut ? "(M-%c)\t" : "M-%c\t"), s->val - 32);
-
-       help_text[sofar++] = '\t';
-
-       if (meta_shortcut) {
-           if (s->misc1 > KEY_F0 && s->misc1 <= KEY_F(64))
-               sofar += sprintf(help_text + sofar,
-                               "(F%d)", s->misc1 - KEY_F0);
-           help_text[sofar++] = '\t';
-           help_text[sofar++] = '\t';
+       else if (s->val >= 'a') {
+           meta_shortcut = 1;
+           ptr += sprintf(ptr, "M-%c", s->val - 32);
        }
 
-       if (s->help != NULL)
-           sofar += sprintf(help_text + sofar, "%s", s->help);
+       *(ptr++) = '\t';
+
+       if (s->misc1 > KEY_F0 && s->misc1 <= KEY_F(64))
+           ptr += sprintf(ptr, "(F%d)", s->misc1 - KEY_F0);
 
-       help_text[sofar++] = '\n';
+       *(ptr++) = '\t';
 
-       s = s->next;
+       if (!meta_shortcut && s->altval > 0)
+           ptr += sprintf(ptr, "(M-%c)", s->altval -
+               (('A' <= s->altval && s->altval <= 'Z') || 'a' <= s->altval
+                       ? 32 : 0));
+
+       *(ptr++) = '\t';
+
+       ptr += sprintf(ptr, "%s\n", s->help);
     }
 
 #ifndef NANO_SMALL
     /* And the toggles... */
     if (currshortcut == main_list)
        for (t = toggles; t != NULL; t = t->next) {
-           sofar += sprintf(help_text + sofar, "M-%c\t\t\t",
-                               t->val - 32);
-           if (t->desc != NULL) {
-               sofar += sprintf(help_text + sofar,
-                               _("%s enable/disable"), t->desc);
-           }
-           help_text[sofar++] = '\n';
+           ptr += sprintf(ptr, "M-%c\t\t\t", t->val - 32);
+           ptr += snprintf(ptr, COLS-24, _("%s enable/disable\n"),
+                               t->desc);
        }
 #endif /* !NANO_SMALL */
+
+    /* If all went well, we didn't overwrite the allocated space for
+       help_text. */
+    assert(strlen(help_text) < allocsize);
 }
 #endif
 
@@ -3007,6 +2985,8 @@ int main(int argc, char *argv[])
            fill = atoi(optarg);
            if (fill < 0)
                wrap_at = fill;
+           else if (fill > 0)
+               wrap_at = 0;
            else if (fill == 0) {
                usage();        /* To stop bogus data (like a string) */
                finish(1);
@@ -3093,10 +3073,6 @@ int main(int argc, char *argv[])
     /* Set up some global variables */
     global_init(0);
     shortcut_init(0);
-#ifndef DISABLE_HELP
-    init_help_msg();
-    help_init();
-#endif
     signal_init();
 
 #ifdef DEBUG
diff --git a/proto.h b/proto.h
index f13a64bc1697f30e3c78a720422e8dedfea98223..1c4436a66b3d6ca6091d4fedf51f44420533c058 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -114,7 +114,7 @@ void thanks_for_all_the_fish(void);
 char *revstrstr(char *haystack, char *needle, char *rev_start);
 char *stristr(char *haystack, char *needle);
 char *revstristr(char *haystack, char *needle, char *rev_start);
-char *strstrwrapper(char *haystack, char *needle, char *rev_start);
+char *strstrwrapper(char *haystack, char *needle, char *rev_start, int line_pos);
 int search_init(int replacing);
 int renumber(filestruct * fileptr);
 int free_filestruct(filestruct * src);
index 2862a6a399c9fc175fdcce3ef13dd798d32da0de..aee3e3cd7aa56801f735cbf71f0e88c0ecf8eb5f 100644 (file)
--- a/search.c
+++ b/search.c
@@ -268,7 +268,7 @@ filestruct *findnextstr(int quiet, int bracket_mode, filestruct * begin, int beg
        searchstr = &fileptr->data[current_x_find];
 
        /* Look for needle in searchstr */
-       while ((found = strstrwrapper(searchstr, needle, rev_start)) == NULL) {
+       while ((found = strstrwrapper(searchstr, needle, rev_start, current_x_find)) == NULL) {
 
            /* finished processing file, get out */
            if (search_last_line) {
@@ -279,6 +279,10 @@ filestruct *findnextstr(int quiet, int bracket_mode, filestruct * begin, int beg
            }
 
            update_line(fileptr, 0);
+
+           /* reset current_x_find between lines */
+           current_x_find = 0;
+
            fileptr = fileptr->next;
 
            if (fileptr == editbot)
@@ -286,7 +290,8 @@ filestruct *findnextstr(int quiet, int bracket_mode, filestruct * begin, int beg
 
            /* EOF reached ?, wrap around once */
            if (fileptr == NULL) {
-               if (bracket_mode)               /* don't wrap if looking for bracket match */
+               /* don't wrap if looking for bracket match */
+               if (bracket_mode)
                    return NULL;
                fileptr = fileage;
                past_editbuff = 1;
@@ -332,7 +337,7 @@ filestruct *findnextstr(int quiet, int bracket_mode, filestruct * begin, int beg
        searchstr = fileptr->data;
 
        /* Look for needle in searchstr */
-       while ((found = strstrwrapper(searchstr, needle, rev_start)) == NULL) {
+       while ((found = strstrwrapper(searchstr, needle, rev_start, current_x_find)) == NULL) {
 
            /* finished processing file, get out */
            if (search_last_line) {
@@ -342,6 +347,10 @@ filestruct *findnextstr(int quiet, int bracket_mode, filestruct * begin, int beg
            }
 
            update_line(fileptr, 0);
+
+           /* reset current_x_find between lines */
+           current_x_find = 0;
+
            fileptr = fileptr->prev;
 
            if (fileptr == edittop->prev)
@@ -811,14 +820,8 @@ void goto_abort(void)
 
 int do_gotoline(int line, int save_pos)
 {
-    int i = 1;
-
     if (line <= 0) {           /* Ask for it */
-
-       int j = 0;
-
-       j = statusq(0, goto_list, "", _("Enter line number"));
-       if (j != 0) {
+       if (statusq(0, goto_list, "", _("Enter line number"))) {
            statusbar(_("Aborted"));
            goto_abort();
            return 0;
@@ -834,7 +837,7 @@ int do_gotoline(int line, int save_pos)
        }
     }
 
-    for (current = fileage; ((current->next != NULL) && (i < line)); i++)
+    for (current = fileage; current->next != NULL && line > 1; line--)
        current = current->next;
 
     current_x = 0;
@@ -846,7 +849,7 @@ int do_gotoline(int line, int save_pos)
     else
        edit_update(current, CENTER);
 
-    placewewant = xplustabs();
+    placewewant = 0;
     goto_abort();
     return 1;
 }
diff --git a/utils.c b/utils.c
index 207a9f79c423f3fdff6c7ef6cf44d53d829eb1bd..f86ff47b6980446d0bf11fbec5c4cc48073dcea3 100644 (file)
--- a/utils.c
+++ b/utils.c
@@ -137,15 +137,15 @@ char *stristr(char *haystack, char *needle)
     return NULL;
 }
 
-char *strstrwrapper(char *haystack, char *needle, char *rev_start)
+char *strstrwrapper(char *haystack, char *needle, char *rev_start, int line_pos)
 {
 
 #ifdef HAVE_REGEX_H
-    int  result;
+    int result;
 
     if (ISSET(USE_REGEXP)) {
        if (!ISSET(REVERSE_SEARCH)) {
-           result = regexec(&search_regexp, haystack, 10, regmatches, 0);
+           result = regexec(&search_regexp, haystack, 10, regmatches, (line_pos > 0) ? REG_NOTBOL : 0);
            if (!result)
                return haystack + regmatches[0].rm_so;
 #ifndef NANO_SMALL
@@ -155,12 +155,13 @@ char *strstrwrapper(char *haystack, char *needle, char *rev_start)
            /* do a quick search forward first */
            if (!(regexec(&search_regexp, haystack, 10, regmatches, 0))) {
                /* there's a match somewhere in the line - now search for it backwards, much slower */
-               for(i = rev_start ; i >= haystack ; --i)
-                   if (!(result = regexec(&search_regexp, i, 10, regmatches, 0))) {
+               for (i = rev_start; i >= haystack; --i) {
+                   if (!(result = regexec(&search_regexp, i, 10, regmatches, (i > haystack) ? REG_NOTBOL : 0))) {
                        j = i + regmatches[0].rm_so;
                        if (j <= rev_start)
                            return j;
                    }
+               }
            }
 #endif
        }
@@ -172,7 +173,7 @@ char *strstrwrapper(char *haystack, char *needle, char *rev_start)
        if (ISSET(REVERSE_SEARCH))
            return revstrstr(haystack, needle, rev_start);
         else
-           return strstr(haystack,needle);
+           return strstr(haystack, needle);
 
     } else {
        if (ISSET(REVERSE_SEARCH))
diff --git a/winio.c b/winio.c
index 525dd428c1bb5850da000665f25891989339cb05..6d1da81d8ae9bbc539e58d5bb14dc4f7b83746cb 100644 (file)
--- a/winio.c
+++ b/winio.c
@@ -68,7 +68,7 @@ int do_last_line(void)
 }
 
 /* Like xplustabs, but for a specific index of a specific filestruct */
-int xpt(filestruct * fileptr, int index)
+int xpt(const filestruct *fileptr, int index)
 {
     int i, tabs = 0;
 
@@ -558,36 +558,37 @@ void titlebar(char *path)
     wattron(topwin, A_REVERSE);
 #endif
 
-
-    mvwaddstr(topwin, 0, 3, VERMSG);
+    mvwaddnstr(topwin, 0, 2, VERMSG, COLS - 3);
 
     space = COLS - strlen(VERMSG) - strlen(VERSION) - 21;
 
     namelen = strlen(what);
 
-    if (what[0] == '\0')
-       mvwaddstr(topwin, 0, COLS / 2 - 6, _("New Buffer"));
-    else {
-       if (namelen > space) {
-           if (path == NULL)
-               waddstr(topwin, _("  File: ..."));
-           else
-               waddstr(topwin, _("   DIR: ..."));
-           waddstr(topwin, &what[namelen - space]);
-       } else {
-           if (path == NULL)
-               mvwaddstr(topwin, 0, COLS / 2 - (namelen / 2 + 1),
-                         _("File: "));
-           else
-               mvwaddstr(topwin, 0, COLS / 2 - (namelen / 2 + 1),
-                         _(" DIR: "));
-           waddstr(topwin, what);
+    if (space > 0) {
+        if (what[0] == '\0')
+           mvwaddstr(topwin, 0, COLS / 2 - 6, _("New Buffer"));
+        else {
+           if (namelen > space) {
+               if (path == NULL)
+                   waddstr(topwin, _("  File: ..."));
+               else
+                   waddstr(topwin, _("   DIR: ..."));
+               waddstr(topwin, &what[namelen - space]);
+           } else {
+               if (path == NULL)
+                   mvwaddstr(topwin, 0, COLS / 2 - (namelen / 2 + 1),
+                             _("File: "));
+               else
+                   mvwaddstr(topwin, 0, COLS / 2 - (namelen / 2 + 1),
+                             _(" DIR: "));
+               waddstr(topwin, what);
+           }
        }
-    }
+    } /* If we don't have space, we shouldn't bother */
     if (ISSET(MODIFIED))
-       mvwaddstr(topwin, 0, COLS - 10, _("Modified"));
+       mvwaddstr(topwin, 0, COLS - 11, _(" Modified "));
     else if (ISSET(VIEW_MODE))
-       mvwaddstr(topwin, 0, COLS - 10, _("View"));
+       mvwaddstr(topwin, 0, COLS - 11, _(" View "));
 
 #ifdef ENABLE_COLOR
     color_off(topwin, COLOR_TITLEBAR);
@@ -1733,12 +1734,11 @@ int do_cursorpos_void(void)
     return do_cursorpos(0);
 }
 
-/* Our broken, non-shortcut list compliant help function.
  But, hey, it's better than nothing, and it's dynamic! */
+/* Our shortcut-list-compliant help function, which is
* better than nothing, and dynamic! */
 int do_help(void)
 {
 #ifndef DISABLE_HELP
-    char *ptr, *end;
     int i, j, row = 0, page = 1, kbinput = 0, no_more = 0, kp, kp2;
     int no_help_flag = 0;
     shortcut *oldshortcut;
@@ -1748,8 +1748,9 @@ int do_help(void)
     wattroff(bottomwin, A_REVERSE);
     blank_statusbar();
 
+    /* set help_text as the string to display */
     help_init();
-    ptr = help_text;
+    assert(help_text != NULL);
 
     oldshortcut = currshortcut;
 
@@ -1771,7 +1772,8 @@ int do_help(void)
        bottombars(help_list);
 
     do {
-       ptr = help_text;
+       const char *ptr = help_text;
+
        switch (kbinput) {
 #ifndef DISABLE_MOUSE
 #ifdef NCURSES_MOUSE_VERSION
@@ -1842,14 +1844,10 @@ int do_help(void)
            }
        }
 
-       if (i > 1) {
-
-       }
-
        i = 0;
        j = 0;
        while (i < editwinrows && *ptr != '\0') {
-           end = ptr;
+           const char *end = ptr;
            while (*end != '\n' && *end != '\0' && j != COLS - 5) {
                end++;
                j++;
@@ -1895,6 +1893,11 @@ int do_help(void)
     nano_disabled_msg();
 #endif
 
+    /* The help_init() at the beginning allocated help_text, which has
+       now been written to screen. */
+    free(help_text);
+    help_text = NULL;
+
     return 1;
 }