[PATCH]: Locale's abbreviated month & vfs

Adam Byrtek / alpha alpha at student.uci.agh.edu.pl
Wed Mar 19 19:19:13 UTC 2003


On Wed, Mar 19, 2003 at 11:25:46AM -0500, Pavel Roskin wrote:
> If I apply your patch to the CVS version (this requires some manual
> intervention), 

That's because of Andrew's patch which was later.

> following bug appears.  If the viewer is positioned at the
> beginning of file, regex search cannot find anything, even strings
> without characters with special meaning.  In particular, try opening
> ChangeLog and look for "200" using F6.

0) I really love those disappearing revisions in anon cvs...

1) Silly little typo:

-    for (i = 0; (ch != -1) && (pos > 0); ch = get_byte (view, pos)) {
+    for (i = 0; (ch != -1) && (pos >= 0); ch = get_byte (view, pos)) {

But looks like Andrew has taken this issue into account in his patch
(the 'break' inside the 'for'), so it no longer applies. But the
proper '^' and '$' and 'prev' handling in reverse regexp search still
applies, see my patch.

2) Andrew's patch has broken regexp reverse search... see the usage of
strreverse() - Andrew, please could you fix this and examine/apply
(parts) of my patch? If something is unclear - tell me.

3) Try to create file:
--cut--
000
aaa
--cut--
WITHOUT final newline. Now try to search 'aaa' - not found. 
Fixed in my patch (attached).

Regards
Adam

-- 

  _.|._ |_  _.   :  Adam Byrtek /alpha/
 (_|||_)| |(_|   :  email  alpha@(irc.pl|debian.org)
     |           :  jabber alpha.pl(at)jabber.org, pgp 0xB25952C0
-------------- next part --------------
Index: view.c
===================================================================
RCS file: /cvs/gnome/mc/src/view.c,v
retrieving revision 1.117
diff -u -r1.117 view.c
--- view.c	19 Mar 2003 13:39:48 -0000	1.117
+++ view.c	19 Mar 2003 19:13:16 -0000
@@ -1521,46 +1521,40 @@
 get_line_at (WView *view, unsigned long *p, unsigned long *skipped)
 {
     char *buffer = 0;
-    int buffer_size = 0;
-    int usable_size = 0;
-    int ch;
-    int direction = view->direction;
+    int buffer_size = 0, usable_size = 0;
+    int ch, i = 0, prev = 0;
     unsigned long pos = *p;
-    long i = 0;
-    int prev = 0;
-
-    if (!pos && direction == -1)
-	return 0;
 
     /* skip over all the possible zeros in the file */
     while ((ch = get_byte (view, pos)) == 0) {
-	if (!pos && direction == -1)
+	if (pos == 0 && view->direction == -1)
 	    return 0;
-	pos += direction;
+	pos += view->direction;
 	i++;
     }
     *skipped = i;
 
-    if (pos) {
-	prev = get_byte (view, pos - 1);
+    if (pos > 0 || view->direction == -1) {
+	prev = get_byte (view, pos - view->direction);
 	if ((prev == -1) || (prev == '\n'))
 	    prev = 0;
+    } else {
+	prev=0;
     }
 
-    for (i = 0; ch != -1; ch = get_byte (view, pos)) {
+    for (i = 1; ch != -1; ch = get_byte (view, pos)) {
 
-	if (i == usable_size) {
+	if (i >= usable_size) {
 	    buffer = grow_string_buffer (buffer, &buffer_size);
 	    usable_size = buffer_size - 2;
 	}
 
-	i++;
-	buffer[i] = ch;
+	buffer[i++] = ch;
 
-	if (!pos && direction == -1)
+	if (pos == 0 && view->direction == -1)
 	    break;
 
-	pos += direction;
+	pos += view->direction;
 
 	if (ch == '\n' || !ch)
 	    break;
@@ -1666,15 +1660,13 @@
 
 	/* We found the string */
 
-	if (*s && !view->search_start && (search == regexp_view_search)
-	    && (*text == '^')) {
-
-	    /* We do not want to match a
-	     * ^ regexp when not at the real
-	     * beginning of some line
-	     */
-	    continue;
-	}
+	/* Handle ^ and $ in reexp searches when starting at
+	 * the middle of the line */
+	if (s[0] && (search == regexp_view_search))
+	    if (((text[0] == '^') && (view->direction > 0)) ||
+	        ((text[strlen(text)-1] == '$') && (view->direction < 0)))
+		continue;
+	
 	/* Record the position used to continue the search */
 	if (view->direction == 1)
 	    t += forward_line_start;


More information about the mc-devel mailing list