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