- Use size_t's instead of ints for the get_verbatim_kbinput()
call and the loop that ungetch()es its returned int*,
respectively. (DLR)
+- nano.h:
+ - Since REGEXP_COMPILED is only used in search.c, convert it
+ from a flag to a static int there. (DLR)
- proto.h:
- Remove unused xpt() and add_marked_sameline() prototypes.
(DLR)
- Move "rebinddelete" up in the list of options so that the list
is in alphabetical order. (DLR)
- search.c:
+ regexp_init()
+ - Overhaul for efficiency. Also check if regcomp() failed, and
+ if so, display "Bad regex" message on the statusbar, so that
+ we don't have to display it separately after every call to
+ this function. (David Benbennick)
+ search_init()
+ - Only check whether USE_REGEXP is set, and hence whether or not
+ to display "[Regexp]" on the search prompt, if HAVE_REGEX_H is
+ defined. (DLR)
not_found_msg()
- Convert to properly handle strings generated by
display_string() that have been used in the search prompt
searched_later_lines. (DLR)
edit_refresh()
- Remove apparently unneeded leaveok() calls. (David Benbennick)
+ statusbar()
+ - Call reset_cursor() just before refreshing the edit window, so
+ that slang and other non-ncurses versions of curses will
+ properly place the cursor back in the edit window instead of
+ leaving it at the end of the statusbar. (DLR)
do_credits()
- Use napms() instead of nanosleep(), as it does the same thing
(aside from taking an argument in milliseconds instead of
#define VIEW_MODE (1<<10)
#define USE_MOUSE (1<<11)
#define USE_REGEXP (1<<12)
-#define REGEXP_COMPILED (1<<13)
-#define TEMP_OPT (1<<14)
-#define CUT_TO_END (1<<15)
-#define REVERSE_SEARCH (1<<16)
-#define MULTIBUFFER (1<<17)
-#define DOS_FILE (1<<18)
-#define MAC_FILE (1<<19)
-#define SMOOTHSCROLL (1<<20)
-#define DISABLE_CURPOS (1<<21) /* Damn, we still need it. */
-#define REBIND_DELETE (1<<22)
-#define NO_CONVERT (1<<23)
-#define BACKUP_FILE (1<<24)
-#define NO_RCFILE (1<<25)
-#define COLOR_SYNTAX (1<<26)
-#define PRESERVE (1<<27)
-#define HISTORY_CHANGED (1<<28)
-#define HISTORYLOG (1<<29)
-#define RESTRICTED (1<<30)
+#define TEMP_OPT (1<<13)
+#define CUT_TO_END (1<<14)
+#define REVERSE_SEARCH (1<<15)
+#define MULTIBUFFER (1<<16)
+#define DOS_FILE (1<<17)
+#define MAC_FILE (1<<18)
+#define SMOOTHSCROLL (1<<19)
+#define DISABLE_CURPOS (1<<20) /* Damn, we still need it. */
+#define REBIND_DELETE (1<<21)
+#define NO_CONVERT (1<<22)
+#define BACKUP_FILE (1<<23)
+#define NO_RCFILE (1<<24)
+#define COLOR_SYNTAX (1<<25)
+#define PRESERVE (1<<26)
+#define HISTORY_CHANGED (1<<27)
+#define HISTORYLOG (1<<28)
+#define RESTRICTED (1<<29)
/* Control key sequences, changing these would be very very bad. */
#define NANO_CONTROL_SPACE 0
#include "proto.h"
#include "nano.h"
-/* Regular expression helper functions */
#ifdef HAVE_REGEX_H
+static int regexp_compiled = FALSE;
+
+/* Regular expression helper functions. */
+
+/* Compile the given regular expression. Return value 0 means the
+ * expression was invalid, and we wrote an error message on the status
+ * bar. Return value 1 means success. */
int regexp_init(const char *regexp)
{
- /* Hmm, perhaps we should check for whether regcomp returns successfully */
- if (regcomp(&search_regexp, regexp, (ISSET(CASE_SENSITIVE) ? 0 : REG_ICASE)
- | REG_EXTENDED) != 0)
+ int rc = regcomp(&search_regexp, regexp, REG_EXTENDED |
+ (ISSET(CASE_SENSITIVE) ? 0 : REG_ICASE));
+
+ assert(!regexp_compiled);
+ if (rc != 0) {
+ size_t len = regerror(rc, &search_regexp, NULL, 0);
+ char *str = charalloc(len);
+
+ regerror(rc, &search_regexp, str, len);
+ statusbar(_("Bad regex \"%s\": %s"), regexp, str);
+ free(str);
return 0;
+ }
- SET(REGEXP_COMPILED);
+ regexp_compiled = TRUE;
return 1;
}
void regexp_cleanup(void)
{
- if (ISSET(REGEXP_COMPILED)) {
- UNSET(REGEXP_COMPILED);
+ if (regexp_compiled) {
+ regexp_compiled = FALSE;
regfree(&search_regexp);
}
}
#endif
"",
+#ifdef HAVE_REGEX_H
/* This string is just a modifier for the search prompt; no
* grammar is implied. */
- ISSET(USE_REGEXP) ? _(" [Regexp]") : "",
+ ISSET(USE_REGEXP) ? _(" [Regexp]") :
+#endif
+ "",
#ifndef NANO_SMALL
/* This string is just a modifier for the search prompt; no
if (i == -1 || (i < 0 && last_search[0] == '\0') ||
(!replacing && i == 0 && answer[0] == '\0')) {
statusbar(_("Search Cancelled"));
- reset_cursor();
#ifndef NANO_SMALL
search_history.current = search_history.next;
#endif
case -2: /* It's the same string. */
#ifdef HAVE_REGEX_H
/* Since answer is "", use last_search! */
- if (ISSET(USE_REGEXP) && regexp_init(last_search) == 0) {
- statusbar(_("Invalid regex \"%s\""), last_search);
- reset_cursor();
+ if (ISSET(USE_REGEXP) && regexp_init(last_search) == 0)
return -1;
- }
#endif
break;
case 0: /* They entered something new. */
last_replace[0] = '\0';
#ifdef HAVE_REGEX_H
- if (ISSET(USE_REGEXP) && regexp_init(answer) == 0) {
- statusbar(_("Invalid regex \"%s\""), answer);
- reset_cursor();
+ if (ISSET(USE_REGEXP) && regexp_init(answer) == 0)
return -1;
- }
#endif
break;
#ifndef NANO_SMALL
#ifdef HAVE_REGEX_H
/* Since answer is "", use last_search! */
- if (ISSET(USE_REGEXP) && regexp_init(last_search) == 0) {
- statusbar(_("Invalid regex \"%s\""), last_search);
- reset_cursor();
- return -1;
- }
+ if (ISSET(USE_REGEXP) && regexp_init(last_search) == 0)
+ return -1;
#endif
search_last_line = 0;
regexp_init(regexp_pat);
/* We constructed regexp_pat to be a valid expression. */
- assert(ISSET(REGEXP_COMPILED));
+ assert(regexp_compiled);
search_last_line = 0;
while (TRUE) {
waddstr(bottomwin, " ]");
wattroff(bottomwin, A_REVERSE);
wnoutrefresh(bottomwin);
+ reset_cursor();
wrefresh(edit);
/* Leave the cursor at its position in the edit window, not
* in the statusbar. */