Re: [RFC/PATCH 04/48] builtin/apply: extract line_by_line_fuzzy_match() from match_fragment()
- From
Stefan Beller <sbeller@google.com>
- Date
- Mar 9, 2016, 22:55 UTC
- Message-ID
- <CAGZ79kbKCZGrBw8OOJzMES0BpMm1V8KQ6Xh2oS5ARB9KNMo+dA@mail.gmail.com>
- In-Reply-To
- <1457545756-20616-5-git-send-email-chriscool@tuxfamily.org>
On Wed, Mar 9, 2016 at 9:48 AM, Christian Couder <christian.couder@gmail.com> 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.
Show 165 quoted lines
> Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
> ---
> 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
>