Index: [Article Count Order] [Thread]

Date:  Sat, 3 Feb 2001 04:06:41 +0900 (JST)
From:  hsaka@mth.biglobe.ne.jp (Hironori Sakamoto)
Subject:  [w3m-dev 01703] Re: regex patch
To:  w3m-dev@mi.med.tohoku.ac.jp
Message-Id:  <20010203040642.EABEC0A82633.10625183@mth.biglobe.ne.jp>
In-Reply-To:  <200102021635.BAA28240@venus.me.ics.saitama-u.ac.jp>
X-Mail-Count: 01703

坂本です。

 >> 日台です。
 >> すいません、先のパッチ [w3m-dev 01701] は破棄して、
 >> このメールに添付したものを使って下さい。

最初のものだと ^ が動作しなかったのですが直ってるのかな?

なお、menu.c の一部で文字列の最初にもかかわらず firstp = 0 としている
バグがあるので patch を送ります。
ついでに [w3m-dev 01335] もある程度直しました。(宿題だった)
kokb24-test1 からの patch です。

ところで、regex.c 内での住みわけを

#include "fm.h"
#if defined(RUBY_REGEX) || defined(ほげほげ_REGEX)
#define HAVE_REGEX
#endif
#include "regex.h"

#ifndef HAVE_REGEX
/* いままでのルーチン */
#endif

#ifdef RUBY_REGEX
/* ruby の regex を使ったルーチン */
#endif

#ifdef ほげほげ_REGEX
/* ほげほげ の regex を使ったルーチン */
#endif

のようにしませんか?読みやすいですし。
-----------------------------------
坂本 浩則 <hsaka@mth.biglobe.ne.jp>
 http://www2u.biglobe.ne.jp/~hsaka/

diff -u main.c.orig main.c
--- main.c.orig	Sun Jan 28 18:35:01 2001
+++ main.c	Sat Feb  3 03:49:04 2001
@@ -1057,12 +1057,6 @@
 	disp_message("No previous regular expression", TRUE);
 	return;
     }
-    move(LASTLINE, 0);
-    addstr(searchRoutine == forwardSearch ? "Forward: " : "Backward: ");
-    addstr(SearchString);
-    clrtoeolx();
-    move(LASTLINE, 0);
-    refresh();
     if (reverse != 0)
 	reverse = 1;
     if (searchRoutine == backwardSearch)
@@ -1075,6 +1069,9 @@
     signal(SIGINT, prevtrap);
     term_raw();
     displayBuffer(Currentbuf, B_NORMAL);
+    disp_message(Sprintf("%s%s",
+	routine[reverse] == forwardSearch ? "Forward: " : "Backward: ",
+	SearchString)->ptr, FALSE);
     if (wrapped) {
 	disp_message("Search wrapped", FALSE);
     }
diff -u menu.c.orig menu.c
--- menu.c.orig	Fri Jan 26 23:14:27 2001
+++ menu.c	Sat Feb  3 03:57:36 2001
@@ -933,13 +933,16 @@
 	message (p, 0, 0);
 	return -1;
     }
+    if (from < 0)
+	from = 0;
     for (i = from; i < menu->nitem; i++)
-	if (regexMatch (menu->item[i].label, 0, 0) == 1)
-            return i;
+	if (menu->item[i].type != MENU_NOP &&
+	    regexMatch (menu->item[i].label, 0, 1) == 1)
+	    return i;
     return -1;
 }
 
-int
+static int
 menu_search_forward (Menu* menu, int from)
 {
     char *str;
@@ -948,15 +951,16 @@
     if (str != NULL && *str == '\0')
 	str = SearchString;
     if (str == NULL || *str == '\0')
-	return (MENU_NOTHING);
+	return -1;
     SearchString = str;
-    found = menuForwardSearch (menu, SearchString, from);
+    menuSearchRoutine = menuForwardSearch;
+    found = menuForwardSearch (menu, SearchString, from + 1);
     if (WrapSearch && found == -1)
         found = menuForwardSearch (menu, SearchString, 0);
-    menuSearchRoutine = menuForwardSearch;
     if (found >= 0)
         return found;
-    return from;
+    disp_message("Not found", TRUE);
+    return -1;
 }
 
 static int
@@ -964,7 +968,8 @@
 {
     int select;
     select = menu_search_forward (CurrentMenu, CurrentMenu->select);
-    goto_menu (CurrentMenu, select, 1);
+    if (select >= 0)
+	goto_menu (CurrentMenu, select, 1);
     return (MENU_NOTHING);
 }
 
@@ -977,13 +982,16 @@
 	message (p, 0, 0);
 	return -1;
     }
-    for (i = from; i >= 0 ; i--)
-	if (regexMatch (menu->item[i].label, 0, 0) == 1)
+    if (from >= menu->nitem)
+	from = menu->nitem - 1;
+    for (i = from; i >= 0; i--)
+	if (menu->item[i].type != MENU_NOP &&
+	    regexMatch (menu->item[i].label, 0, 1) == 1)
             return i;
     return -1;
 }
 
-int
+static int
 menu_search_backward (Menu* menu, int from)
 {
     char *str;
@@ -994,13 +1002,14 @@
     if (str == NULL || *str == '\0')
 	return (MENU_NOTHING);
     SearchString = str;
-    found = menuBackwardSearch (menu, SearchString, from);
-    if (WrapSearch && found == -1)
-        found = menuBackwardSearch (menu, SearchString, 0);
     menuSearchRoutine = menuBackwardSearch;
+    found = menuBackwardSearch (menu, SearchString, from - 1);
+    if (WrapSearch && found == -1)
+        found = menuBackwardSearch (menu, SearchString, menu->nitem);
     if (found >= 0)
         return found;
-    return from;
+    disp_message("Not found", TRUE);
+    return -1;
 }
 
 static int
@@ -1008,7 +1017,8 @@
 {
     int select;
     select = menu_search_backward (CurrentMenu, CurrentMenu->select);
-    goto_menu (CurrentMenu, select, -1);
+    if (select >= 0)
+	goto_menu (CurrentMenu, select, -1);
     return (MENU_NOTHING);
 }
 
@@ -1016,7 +1026,6 @@
 menu_search_next_previous (Menu* menu, int from, int reverse)
 {
     int found;
-    int new_from;
     static int (*routine[2]) (Menu *, char *, int) =
     {
 	menuForwardSearch, menuBackwardSearch
@@ -1024,25 +1033,20 @@
 
     if (menuSearchRoutine == NULL) {
 	disp_message ("No previous regular expression", TRUE);
-	return from;
+	return -1;
     }
-    addstr(menuSearchRoutine == menuForwardSearch ? "Forward: " : "Backward: ");
-    addstr(SearchString);
     if (reverse != 0)
 	reverse = 1;
     if (menuSearchRoutine == menuBackwardSearch)
 	reverse ^= 1;
-    new_from = from - reverse * 2 + 1;
-    if (new_from >=0 && new_from < menu->nitem)
-	found = (*routine[reverse]) (menu, SearchString, new_from);
-    else
-	found = (*routine[reverse]) (menu, SearchString, from);
-    if (WrapSearch && found == -1) {
+    from += reverse ? -1 : 1;
+    found = (*routine[reverse]) (menu, SearchString, from);
+    if (WrapSearch && found == -1)
         found = (*routine[reverse]) (menu, SearchString, reverse * menu->nitem);
-    }
     if (found >= 0)
         return found;
-    return from;
+    disp_message("Not found", TRUE);
+    return -1;
 }
 
 static int
@@ -1050,7 +1054,8 @@
 {
     int select;
     select = menu_search_next_previous (CurrentMenu, CurrentMenu->select, 0);
-    goto_menu (CurrentMenu, select, 1);
+    if (select >= 0)
+	goto_menu (CurrentMenu, select, 1);
     return (MENU_NOTHING);
 }
 
@@ -1059,7 +1064,8 @@
 {
     int select;
     select = menu_search_next_previous (CurrentMenu, CurrentMenu->select, 1);
-    goto_menu (CurrentMenu, select, -1);
+    if (select >= 0)
+	goto_menu (CurrentMenu, select, -1);
     return (MENU_NOTHING);
 }
 
    

[Next]