Re: [RFC/PATCH 04/48] builtin/apply: extract line_by_line_fuzzy_match() from match_fragment()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Mar 9, 2016 at 9:48 AM, Christian Couder
<christian.couder@xxxxxxxxx> wrote:

Some words in the commit message would be nice here as this is one of
the patches,
which isn't "obviously" a good thing to to. This comment also applies
to "builtin/apply:
introduce 'struct apply_state' to start libifying" where you lay out
the plan for the next
~40 patches.

I have only skimmed quickly over the other patches.


> Signed-off-by: Christian Couder <chriscool@xxxxxxxxxxxxx>
> ---
>  builtin/apply.c | 125 ++++++++++++++++++++++++++++++++------------------------
>  1 file changed, 71 insertions(+), 54 deletions(-)
>
> diff --git a/builtin/apply.c b/builtin/apply.c
> index c99c859..7d7a8ab 100644
> --- a/builtin/apply.c
> +++ b/builtin/apply.c
> @@ -2244,6 +2244,74 @@ static void update_pre_post_images(struct image *preimage,
>         postimage->nr -= reduced;
>  }
>
> +static int line_by_line_fuzzy_match(struct image *img,
> +                                   struct image *preimage,
> +                                   struct image *postimage,
> +                                   unsigned long try,
> +                                   int try_lno,
> +                                   int preimage_limit)
> +{
> +       int i;
> +       size_t imgoff = 0;
> +       size_t preoff = 0;
> +       size_t postlen = postimage->len;
> +       size_t extra_chars;
> +       char *buf;
> +       char *preimage_eof;
> +       char *preimage_end;
> +       struct strbuf fixed;
> +       char *fixed_buf;
> +       size_t fixed_len;
> +
> +       for (i = 0; i < preimage_limit; i++) {
> +               size_t prelen = preimage->line[i].len;
> +               size_t imglen = img->line[try_lno+i].len;
> +
> +               if (!fuzzy_matchlines(img->buf + try + imgoff, imglen,
> +                                     preimage->buf + preoff, prelen))
> +                       return 0;
> +               if (preimage->line[i].flag & LINE_COMMON)
> +                       postlen += imglen - prelen;
> +               imgoff += imglen;
> +               preoff += prelen;
> +       }
> +
> +       /*
> +        * Ok, the preimage matches with whitespace fuzz.
> +        *
> +        * imgoff now holds the true length of the target that
> +        * matches the preimage before the end of the file.
> +        *
> +        * Count the number of characters in the preimage that fall
> +        * beyond the end of the file and make sure that all of them
> +        * are whitespace characters. (This can only happen if
> +        * we are removing blank lines at the end of the file.)
> +        */
> +       buf = preimage_eof = preimage->buf + preoff;
> +       for ( ; i < preimage->nr; i++)
> +               preoff += preimage->line[i].len;
> +       preimage_end = preimage->buf + preoff;
> +       for ( ; buf < preimage_end; buf++)
> +               if (!isspace(*buf))
> +                       return 0;
> +
> +       /*
> +        * Update the preimage and the common postimage context
> +        * lines to use the same whitespace as the target.
> +        * If whitespace is missing in the target (i.e.
> +        * if the preimage extends beyond the end of the file),
> +        * use the whitespace from the preimage.
> +        */
> +       extra_chars = preimage_end - preimage_eof;
> +       strbuf_init(&fixed, imgoff + extra_chars);
> +       strbuf_add(&fixed, img->buf + try, imgoff);
> +       strbuf_add(&fixed, preimage_eof, extra_chars);
> +       fixed_buf = strbuf_detach(&fixed, &fixed_len);
> +       update_pre_post_images(preimage, postimage,
> +                              fixed_buf, fixed_len, postlen);
> +       return 1;
> +}
> +
>  static int match_fragment(struct image *img,
>                           struct image *preimage,
>                           struct image *postimage,
> @@ -2253,7 +2321,7 @@ static int match_fragment(struct image *img,
>                           int match_beginning, int match_end)
>  {
>         int i;
> -       char *fixed_buf, *buf, *orig, *target;
> +       char *fixed_buf, *orig, *target;
>         struct strbuf fixed;
>         size_t fixed_len, postlen;
>         int preimage_limit;
> @@ -2314,6 +2382,7 @@ static int match_fragment(struct image *img,
>                  * There must be one non-blank context line that match
>                  * a line before the end of img.
>                  */
> +               char *buf;
>                 char *buf_end;
>
>                 buf = preimage->buf;
> @@ -2334,59 +2403,7 @@ static int match_fragment(struct image *img,
>          * we need it to adjust whitespace if we match.
>          */
>         if (ws_ignore_action == ignore_ws_change) {
> -               size_t imgoff = 0;
> -               size_t preoff = 0;
> -               size_t postlen = postimage->len;
> -               size_t extra_chars;
> -               char *preimage_eof;
> -               char *preimage_end;
> -               for (i = 0; i < preimage_limit; i++) {
> -                       size_t prelen = preimage->line[i].len;
> -                       size_t imglen = img->line[try_lno+i].len;
> -
> -                       if (!fuzzy_matchlines(img->buf + try + imgoff, imglen,
> -                                             preimage->buf + preoff, prelen))
> -                               return 0;
> -                       if (preimage->line[i].flag & LINE_COMMON)
> -                               postlen += imglen - prelen;
> -                       imgoff += imglen;
> -                       preoff += prelen;
> -               }
> -
> -               /*
> -                * Ok, the preimage matches with whitespace fuzz.
> -                *
> -                * imgoff now holds the true length of the target that
> -                * matches the preimage before the end of the file.
> -                *
> -                * Count the number of characters in the preimage that fall
> -                * beyond the end of the file and make sure that all of them
> -                * are whitespace characters. (This can only happen if
> -                * we are removing blank lines at the end of the file.)
> -                */
> -               buf = preimage_eof = preimage->buf + preoff;
> -               for ( ; i < preimage->nr; i++)
> -                       preoff += preimage->line[i].len;
> -               preimage_end = preimage->buf + preoff;
> -               for ( ; buf < preimage_end; buf++)
> -                       if (!isspace(*buf))
> -                               return 0;
> -
> -               /*
> -                * Update the preimage and the common postimage context
> -                * lines to use the same whitespace as the target.
> -                * If whitespace is missing in the target (i.e.
> -                * if the preimage extends beyond the end of the file),
> -                * use the whitespace from the preimage.
> -                */
> -               extra_chars = preimage_end - preimage_eof;
> -               strbuf_init(&fixed, imgoff + extra_chars);
> -               strbuf_add(&fixed, img->buf + try, imgoff);
> -               strbuf_add(&fixed, preimage_eof, extra_chars);
> -               fixed_buf = strbuf_detach(&fixed, &fixed_len);
> -               update_pre_post_images(preimage, postimage,
> -                               fixed_buf, fixed_len, postlen);
> -               return 1;
> +               return line_by_line_fuzzy_match(img, preimage, postimage, try, try_lno, preimage_limit);
>         }
>
>         if (ws_error_action != correct_ws_error)
> --
> 2.8.0.rc1.49.gca61272
>
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]