On Monday 23 August 2010 11:39, Colin Watson wrote:
> > > +                                         if (gl->matched_range.rm_so == 
> > > gl->matched_range.rm_eo) {
> > > +                                                 end++;
> > 
> > Why do you think end++ does not run off the end of the line?
> 
> Fair point, thanks.  Updated version follows.
...

>                                       } else while (1) {
>                                               unsigned end = 
> gl->matched_range.rm_eo;
>                                               char old = line[end];
> -                                             line[end] = '\0';
> -                                             print_line(line + 
> gl->matched_range.rm_so,
> -                                                             end - 
> gl->matched_range.rm_so,
> -                                                             linenum, ':');
> -                                             if (old == '\0')
> -                                                     break;
> -                                             line[end] = old;
> +                                             if (gl->matched_range.rm_so == 
> gl->matched_range.rm_eo) {
> +                                                     /* Already at end of 
> line? */
> +                                                     if (line[end] == '\0')
> +                                                             break;
> +                                                     /* Otherwise make sure 
> we make some progress. */
> +                                                     if (line[++end] == '\0')
> +                                                             break;
> +                                             } else {
> +                                                     line[end] = '\0';
> +                                                     print_line(line + 
> gl->matched_range.rm_so,
> +                                                                     end - 
> gl->matched_range.rm_so,
> +                                                                     
> linenum, ':');
> +                                                     if (old == '\0')
> +                                                             break;
> +                                                     line[end] = old;
> +                                             }

Still not good. It may be not buggy now, but, for one, why do
you still save  char old = line[end]  when you don't use it?

Here's how I did it:


+                                               unsigned start = 
gl->matched_range.rm_so;
                                                unsigned end = 
gl->matched_range.rm_eo;
+                                               unsigned len = end - start;
                                                char old = line[end];
                                                line[end] = '\0';
-                                               print_line(line + 
gl->matched_range.rm_so,
-                                                               end - 
gl->matched_range.rm_so,
-                                                               linenum, ':');
+                                               /* Empty match is not printed: 
try "echo test | grep -o ''" */
+                                               if (len != 0)
+                                                       print_line(line + 
start, len, linenum, ':');
                                                if (old == '\0')
                                                        break;
                                                line[end] = old;
+                                               if (len == 0)
+                                                       end++;



Please try current git, it should have this bug fixed.

-- 
vda
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to