git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 08/17] xdiff: delete chastore from xdfile_t, view with --color-words

From
Elijah Newren <newren@gmail.com>
Date
Sep 9, 2025, 08:58 UTC
Message-ID
<CABPp-BHdKu2nsWhpfGY4MexfChxfwv_0mqvpgrV3kbYgdCYKEg@mail.gmail.com>
In-Reply-To
<e7d1933d1c470528de94118fe9c58b47bcc67aca.1757274320.git.gitgitgadget@gmail.com>

On Sun, Sep 7, 2025 at 12:46 PM Ezekiel Newren via GitGitGadget <gitgitgadget@gmail.com> wrote:

>
> From: Ezekiel Newren <ezekielnewren@gmail.com>

My personal bias is that things like "view with --color-words" makes more sense to include near the end of the commit message, just before the sign-offs. Not sure if others agree on that.

> The chastore_t type is very unfriendly to Rust FFI. It's also redundant
> since 'recs' is a vector type that grows every time an xrecord_t is
> added.

The second sentence seems to presume the reader knows what chastore_t type is for, and about the confusing dual layering between it and recs.its confusing dual layering. I liked your more extended explanation in https://lore.kernel.org/git/7ea2dccd71fc502f20614ce217fc9885d1b17413.1756496539.git.gitgitgadget@gmail.com/; could some of that be used here?

Show 454 quoted lines
>
> Signed-off-by: Ezekiel Newren <ezekielnewren@gmail.com>
> ---
>  xdiff/xdiffi.c     | 24 ++++++++++----------
>  xdiff/xemit.c      |  6 ++---
>  xdiff/xhistogram.c |  2 +-
>  xdiff/xmerge.c     | 56 +++++++++++++++++++++++-----------------------
>  xdiff/xpatience.c  | 10 ++++-----
>  xdiff/xprepare.c   | 19 ++++++----------
>  xdiff/xtypes.h     |  3 +--
>  xdiff/xutils.c     | 12 +++++-----
>  8 files changed, 63 insertions(+), 69 deletions(-)
>
> diff --git a/xdiff/xdiffi.c b/xdiff/xdiffi.c
> index 11cd090b53..a66125d44a 100644
> --- a/xdiff/xdiffi.c
> +++ b/xdiff/xdiffi.c
> @@ -24,7 +24,7 @@
>
>  static unsigned long get_hash(xdfile_t *xdf, long index)
>  {
> -       return xdf->recs[xdf->rindex[index]]->ha;
> +       return xdf->recs[xdf->rindex[index]].ha;
>  }
>
>  #define XDL_MAX_COST_MIN 256
> @@ -489,13 +489,13 @@ static void measure_split(const xdfile_t *xdf, long split,
>                 m->indent = -1;
>         } else {
>                 m->end_of_file = 0;
> -               m->indent = get_indent(xdf->recs[split]);
> +               m->indent = get_indent(&xdf->recs[split]);
>         }
>
>         m->pre_blank = 0;
>         m->pre_indent = -1;
>         for (i = split - 1; i >= 0; i--) {
> -               m->pre_indent = get_indent(xdf->recs[i]);
> +               m->pre_indent = get_indent(&xdf->recs[i]);
>                 if (m->pre_indent != -1)
>                         break;
>                 m->pre_blank += 1;
> @@ -508,7 +508,7 @@ static void measure_split(const xdfile_t *xdf, long split,
>         m->post_blank = 0;
>         m->post_indent = -1;
>         for (i = split + 1; i < xdf->nrec; i++) {
> -               m->post_indent = get_indent(xdf->recs[i]);
> +               m->post_indent = get_indent(&xdf->recs[i]);
>                 if (m->post_indent != -1)
>                         break;
>                 m->post_blank += 1;
> @@ -752,7 +752,7 @@ static inline int group_previous(xdfile_t *xdf, struct xdlgroup *g)
>  static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g)
>  {
>         if (g->end < xdf->nrec &&
> -           recs_match(xdf->recs[g->start], xdf->recs[g->end])) {
> +           recs_match(&xdf->recs[g->start], &xdf->recs[g->end])) {
>                 xdf->rchg[g->start++] = 0;
>                 xdf->rchg[g->end++] = 1;
>
> @@ -773,7 +773,7 @@ static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g)
>  static int group_slide_up(xdfile_t *xdf, struct xdlgroup *g)
>  {
>         if (g->start > 0 &&
> -           recs_match(xdf->recs[g->start - 1], xdf->recs[g->end - 1])) {
> +           recs_match(&xdf->recs[g->start - 1], &xdf->recs[g->end - 1])) {
>                 xdf->rchg[--g->start] = 1;
>                 xdf->rchg[--g->end] = 0;
>
> @@ -988,16 +988,16 @@ static void xdl_mark_ignorable_lines(xdchange_t *xscr, xdfenv_t *xe, long flags)
>
>         for (xch = xscr; xch; xch = xch->next) {
>                 int ignore = 1;
> -               xrecord_t **rec;
> +               xrecord_t *rec;
>                 long i;
>
>                 rec = &xe->xdf1.recs[xch->i1];
>                 for (i = 0; i < xch->chg1 && ignore; i++)
> -                       ignore = xdl_blankline(rec[i]->ptr, rec[i]->size, flags);
> +                       ignore = xdl_blankline(rec[i].ptr, rec[i].size, flags);
>
>                 rec = &xe->xdf2.recs[xch->i2];
>                 for (i = 0; i < xch->chg2 && ignore; i++)
> -                       ignore = xdl_blankline(rec[i]->ptr, rec[i]->size, flags);
> +                       ignore = xdl_blankline(rec[i].ptr, rec[i].size, flags);
>
>                 xch->ignore = ignore;
>         }
> @@ -1021,7 +1021,7 @@ static void xdl_mark_ignorable_regex(xdchange_t *xscr, const xdfenv_t *xe,
>         xdchange_t *xch;
>
>         for (xch = xscr; xch; xch = xch->next) {
> -               xrecord_t **rec;
> +               xrecord_t *rec;
>                 int ignore = 1;
>                 long i;
>
> @@ -1033,11 +1033,11 @@ static void xdl_mark_ignorable_regex(xdchange_t *xscr, const xdfenv_t *xe,
>
>                 rec = &xe->xdf1.recs[xch->i1];
>                 for (i = 0; i < xch->chg1 && ignore; i++)
> -                       ignore = record_matches_regex(rec[i], xpp);
> +                       ignore = record_matches_regex(&rec[i], xpp);
>
>                 rec = &xe->xdf2.recs[xch->i2];
>                 for (i = 0; i < xch->chg2 && ignore; i++)
> -                       ignore = record_matches_regex(rec[i], xpp);
> +                       ignore = record_matches_regex(&rec[i], xpp);
>
>                 xch->ignore = ignore;
>         }
> diff --git a/xdiff/xemit.c b/xdiff/xemit.c
> index 2161ac3cd0..b2f1f30cd3 100644
> --- a/xdiff/xemit.c
> +++ b/xdiff/xemit.c
> @@ -25,7 +25,7 @@
>
>  static int xdl_emit_record(xdfile_t *xdf, long ri, char const *pre, xdemitcb_t *ecb)
>  {
> -       xrecord_t *rec = xdf->recs[ri];
> +       xrecord_t *rec = &xdf->recs[ri];
>
>         if (xdl_emit_diffrec(rec->ptr, rec->size, pre, strlen(pre), ecb) < 0)
>                 return -1;
> @@ -110,7 +110,7 @@ static long def_ff(const char *rec, long len, char *buf, long sz)
>  static long match_func_rec(xdfile_t *xdf, xdemitconf_t const *xecfg, long ri,
>                            char *buf, long sz)
>  {
> -       xrecord_t *rec = xdf->recs[ri];
> +       xrecord_t *rec = &xdf->recs[ri];
>
>         if (!xecfg->find_func)
>                 return def_ff(rec->ptr, rec->size, buf, sz);
> @@ -150,7 +150,7 @@ static long get_func_line(xdfenv_t *xe, xdemitconf_t const *xecfg,
>
>  static int is_empty_rec(xdfile_t *xdf, long ri)
>  {
> -       xrecord_t *rec = xdf->recs[ri];
> +       xrecord_t *rec = &xdf->recs[ri];
>         long i = 0;
>
>         for (; i < rec->size && XDL_ISSPACE(rec->ptr[i]); i++);
> diff --git a/xdiff/xhistogram.c b/xdiff/xhistogram.c
> index 040d81e0bc..4d857e8ae2 100644
> --- a/xdiff/xhistogram.c
> +++ b/xdiff/xhistogram.c
> @@ -86,7 +86,7 @@ struct region {
>         ((LINE_MAP(index, ptr))->cnt)
>
>  #define REC(env, s, l) \
> -       (env->xdf##s.recs[l - 1])
> +       (&env->xdf##s.recs[l - 1])
>
>  static int cmp_recs(xrecord_t *r1, xrecord_t *r2)
>  {
> diff --git a/xdiff/xmerge.c b/xdiff/xmerge.c
> index af40c88a5b..fd600cbb5d 100644
> --- a/xdiff/xmerge.c
> +++ b/xdiff/xmerge.c
> @@ -97,12 +97,12 @@ static int xdl_merge_cmp_lines(xdfenv_t *xe1, int i1, xdfenv_t *xe2, int i2,
>                 int line_count, long flags)
>  {
>         int i;
> -       xrecord_t **rec1 = xe1->xdf2.recs + i1;
> -       xrecord_t **rec2 = xe2->xdf2.recs + i2;
> +       xrecord_t *rec1 = xe1->xdf2.recs + i1;
> +       xrecord_t *rec2 = xe2->xdf2.recs + i2;
>
>         for (i = 0; i < line_count; i++) {
> -               int result = xdl_recmatch(rec1[i]->ptr, rec1[i]->size,
> -                       rec2[i]->ptr, rec2[i]->size, flags);
> +               int result = xdl_recmatch(rec1[i].ptr, rec1[i].size,
> +                       rec2[i].ptr, rec2[i].size, flags);
>                 if (!result)
>                         return -1;
>         }
> @@ -111,7 +111,7 @@ static int xdl_merge_cmp_lines(xdfenv_t *xe1, int i1, xdfenv_t *xe2, int i2,
>
>  static int xdl_recs_copy_0(int use_orig, xdfenv_t *xe, int i, int count, int needs_cr, int add_nl, char *dest)
>  {
> -       xrecord_t **recs;
> +       xrecord_t *recs;
>         int size = 0;
>
>         recs = (use_orig ? xe->xdf1.recs : xe->xdf2.recs) + i;
> @@ -119,12 +119,12 @@ static int xdl_recs_copy_0(int use_orig, xdfenv_t *xe, int i, int count, int nee
>         if (count < 1)
>                 return 0;
>
> -       for (i = 0; i < count; size += recs[i++]->size)
> +       for (i = 0; i < count; size += recs[i++].size)
>                 if (dest)
> -                       memcpy(dest + size, recs[i]->ptr, recs[i]->size);
> +                       memcpy(dest + size, recs[i].ptr, recs[i].size);
>         if (add_nl) {
> -               i = recs[count - 1]->size;
> -               if (i == 0 || recs[count - 1]->ptr[i - 1] != '\n') {
> +               i = recs[count - 1].size;
> +               if (i == 0 || recs[count - 1].ptr[i - 1] != '\n') {
>                         if (needs_cr) {
>                                 if (dest)
>                                         dest[size] = '\r';
> @@ -160,22 +160,22 @@ static int is_eol_crlf(xdfile_t *file, int i)
>
>         if (i < file->nrec - 1)
>                 /* All lines before the last *must* end in LF */
> -               return (size = file->recs[i]->size) > 1 &&
> -                       file->recs[i]->ptr[size - 2] == '\r';
> +               return (size = file->recs[i].size) > 1 &&
> +                       file->recs[i].ptr[size - 2] == '\r';
>         if (!file->nrec)
>                 /* Cannot determine eol style from empty file */
>                 return -1;
> -       if ((size = file->recs[i]->size) &&
> -                       file->recs[i]->ptr[size - 1] == '\n')
> +       if ((size = file->recs[i].size) &&
> +                       file->recs[i].ptr[size - 1] == '\n')
>                 /* Last line; ends in LF; Is it CR/LF? */
>                 return size > 1 &&
> -                       file->recs[i]->ptr[size - 2] == '\r';
> +                       file->recs[i].ptr[size - 2] == '\r';
>         if (!i)
>                 /* The only line has no eol */
>                 return -1;
>         /* Determine eol from second-to-last line */
> -       return (size = file->recs[i - 1]->size) > 1 &&
> -               file->recs[i - 1]->ptr[size - 2] == '\r';
> +       return (size = file->recs[i - 1].size) > 1 &&
> +               file->recs[i - 1].ptr[size - 2] == '\r';
>  }
>
>  static int is_cr_needed(xdfenv_t *xe1, xdfenv_t *xe2, xdmerge_t *m)
> @@ -334,22 +334,22 @@ static int recmatch(xrecord_t *rec1, xrecord_t *rec2, unsigned long flags)
>  static void xdl_refine_zdiff3_conflicts(xdfenv_t *xe1, xdfenv_t *xe2, xdmerge_t *m,
>                 xpparam_t const *xpp)
>  {
> -       xrecord_t **rec1 = xe1->xdf2.recs, **rec2 = xe2->xdf2.recs;
> +       xrecord_t *rec1 = xe1->xdf2.recs, *rec2 = xe2->xdf2.recs;
>         for (; m; m = m->next) {
>                 /* let's handle just the conflicts */
>                 if (m->mode)
>                         continue;
>
>                 while(m->chg1 && m->chg2 &&
> -                     recmatch(rec1[m->i1], rec2[m->i2], xpp->flags)) {
> +                     recmatch(&rec1[m->i1], &rec2[m->i2], xpp->flags)) {
>                         m->chg1--;
>                         m->chg2--;
>                         m->i1++;
>                         m->i2++;
>                 }
>                 while (m->chg1 && m->chg2 &&
> -                      recmatch(rec1[m->i1 + m->chg1 - 1],
> -                               rec2[m->i2 + m->chg2 - 1], xpp->flags)) {
> +                      recmatch(&rec1[m->i1 + m->chg1 - 1],
> +                               &rec2[m->i2 + m->chg2 - 1], xpp->flags)) {
>                         m->chg1--;
>                         m->chg2--;
>                 }
> @@ -381,12 +381,12 @@ static int xdl_refine_conflicts(xdfenv_t *xe1, xdfenv_t *xe2, xdmerge_t *m,
>                  * This probably does not work outside git, since
>                  * we have a very simple mmfile structure.
>                  */
> -               t1.ptr = (char *)xe1->xdf2.recs[m->i1]->ptr;
> -               t1.size = xe1->xdf2.recs[m->i1 + m->chg1 - 1]->ptr
> -                       + xe1->xdf2.recs[m->i1 + m->chg1 - 1]->size - t1.ptr;
> -               t2.ptr = (char *)xe2->xdf2.recs[m->i2]->ptr;
> -               t2.size = xe2->xdf2.recs[m->i2 + m->chg2 - 1]->ptr
> -                       + xe2->xdf2.recs[m->i2 + m->chg2 - 1]->size - t2.ptr;
> +               t1.ptr = (char *)xe1->xdf2.recs[m->i1].ptr;
> +               t1.size = xe1->xdf2.recs[m->i1 + m->chg1 - 1].ptr
> +                       + xe1->xdf2.recs[m->i1 + m->chg1 - 1].size - t1.ptr;
> +               t2.ptr = (char *)xe2->xdf2.recs[m->i2].ptr;
> +               t2.size = xe2->xdf2.recs[m->i2 + m->chg2 - 1].ptr
> +                       + xe2->xdf2.recs[m->i2 + m->chg2 - 1].size - t2.ptr;
>                 if (xdl_do_diff(&t1, &t2, xpp, &xe) < 0)
>                         return -1;
>                 if (xdl_change_compact(&xe.xdf1, &xe.xdf2, xpp->flags) < 0 ||
> @@ -440,8 +440,8 @@ static int line_contains_alnum(const char *ptr, long size)
>  static int lines_contain_alnum(xdfenv_t *xe, int i, int chg)
>  {
>         for (; chg; chg--, i++)
> -               if (line_contains_alnum(xe->xdf2.recs[i]->ptr,
> -                               xe->xdf2.recs[i]->size))
> +               if (line_contains_alnum(xe->xdf2.recs[i].ptr,
> +                               xe->xdf2.recs[i].size))
>                         return 1;
>         return 0;
>  }
> diff --git a/xdiff/xpatience.c b/xdiff/xpatience.c
> index 77dc411d19..bf69a58527 100644
> --- a/xdiff/xpatience.c
> +++ b/xdiff/xpatience.c
> @@ -88,9 +88,9 @@ static int is_anchor(xpparam_t const *xpp, const char *line)
>  static void insert_record(xpparam_t const *xpp, int line, struct hashmap *map,
>                           int pass)
>  {
> -       xrecord_t **records = pass == 1 ?
> +       xrecord_t *records = pass == 1 ?
>                 map->env->xdf1.recs : map->env->xdf2.recs;
> -       xrecord_t *record = records[line - 1];
> +       xrecord_t *record = &records[line - 1];
>         /*
>          * After xdl_prepare_env() (or more precisely, due to
>          * xdl_classify_record()), the "ha" member of the records (AKA lines)
> @@ -121,7 +121,7 @@ static void insert_record(xpparam_t const *xpp, int line, struct hashmap *map,
>                 return;
>         map->entries[index].line1 = line;
>         map->entries[index].hash = record->ha;
> -       map->entries[index].anchor = is_anchor(xpp, map->env->xdf1.recs[line - 1]->ptr);
> +       map->entries[index].anchor = is_anchor(xpp, map->env->xdf1.recs[line - 1].ptr);
>         if (!map->first)
>                 map->first = map->entries + index;
>         if (map->last) {
> @@ -246,8 +246,8 @@ static int find_longest_common_sequence(struct hashmap *map, struct entry **res)
>
>  static int match(struct hashmap *map, int line1, int line2)
>  {
> -       xrecord_t *record1 = map->env->xdf1.recs[line1 - 1];
> -       xrecord_t *record2 = map->env->xdf2.recs[line2 - 1];
> +       xrecord_t *record1 = &map->env->xdf1.recs[line1 - 1];
> +       xrecord_t *record2 = &map->env->xdf2.recs[line2 - 1];
>         return record1->ha == record2->ha;
>  }
>
> diff --git a/xdiff/xprepare.c b/xdiff/xprepare.c
> index 6f1d4b4725..92f9845003 100644
> --- a/xdiff/xprepare.c
> +++ b/xdiff/xprepare.c
> @@ -131,7 +131,6 @@ static void xdl_free_ctx(xdfile_t *xdf)
>         xdl_free(xdf->rindex);
>         xdl_free(xdf->rchg - 1);
>         xdl_free(xdf->recs);
> -       xdl_cha_free(&xdf->rcha);
>  }
>
>
> @@ -146,8 +145,6 @@ static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, long narec, xpparam_
>         xdf->rchg = NULL;
>         xdf->recs = NULL;
>
> -       if (xdl_cha_init(&xdf->rcha, sizeof(xrecord_t), narec / 4 + 1) < 0)
> -               goto abort;
>         if (!XDL_ALLOC_ARRAY(xdf->recs, narec))
>                 goto abort;
>
> @@ -158,12 +155,10 @@ static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, long narec, xpparam_
>                         hav = xdl_hash_record(&cur, top, xpp->flags);
>                         if (XDL_ALLOC_GROW(xdf->recs, xdf->nrec + 1, narec))
>                                 goto abort;
> -                       if (!(crec = xdl_cha_alloc(&xdf->rcha)))
> -                               goto abort;
> +                       crec = &xdf->recs[xdf->nrec++];
>                         crec->ptr = prev;
>                         crec->size = (long) (cur - prev);
>                         crec->ha = hav;
> -                       xdf->recs[xdf->nrec++] = crec;
>                         if (xdl_classify_record(pass, cf, crec) < 0)
>                                 goto abort;
>                 }
> @@ -263,7 +258,7 @@ static int xdl_clean_mmatch(char const *dis, long i, long s, long e) {
>   */
>  static int xdl_cleanup_records(xdlclassifier_t *cf, xdfile_t *xdf1, xdfile_t *xdf2) {
>         long i, nm, nreff, mlim;
> -       xrecord_t **recs;
> +       xrecord_t *recs;
>         xdlclass_t *rcrec;
>         char *dis, *dis1, *dis2;
>         int need_min = !!(cf->flags & XDF_NEED_MINIMAL);
> @@ -276,7 +271,7 @@ static int xdl_cleanup_records(xdlclassifier_t *cf, xdfile_t *xdf1, xdfile_t *xd
>         if ((mlim = xdl_bogosqrt(xdf1->nrec)) > XDL_MAX_EQLIMIT)
>                 mlim = XDL_MAX_EQLIMIT;
>         for (i = xdf1->dstart, recs = &xdf1->recs[xdf1->dstart]; i <= xdf1->dend; i++, recs++) {
> -               rcrec = cf->rcrecs[(*recs)->ha];
> +               rcrec = cf->rcrecs[recs->ha];
>                 nm = rcrec ? rcrec->len2 : 0;
>                 dis1[i] = (nm == 0) ? 0: (nm >= mlim && !need_min) ? 2: 1;
>         }
> @@ -284,7 +279,7 @@ static int xdl_cleanup_records(xdlclassifier_t *cf, xdfile_t *xdf1, xdfile_t *xd
>         if ((mlim = xdl_bogosqrt(xdf2->nrec)) > XDL_MAX_EQLIMIT)
>                 mlim = XDL_MAX_EQLIMIT;
>         for (i = xdf2->dstart, recs = &xdf2->recs[xdf2->dstart]; i <= xdf2->dend; i++, recs++) {
> -               rcrec = cf->rcrecs[(*recs)->ha];
> +               rcrec = cf->rcrecs[recs->ha];
>                 nm = rcrec ? rcrec->len1 : 0;
>                 dis2[i] = (nm == 0) ? 0: (nm >= mlim && !need_min) ? 2: 1;
>         }
> @@ -320,13 +315,13 @@ static int xdl_cleanup_records(xdlclassifier_t *cf, xdfile_t *xdf1, xdfile_t *xd
>   */
>  static int xdl_trim_ends(xdfile_t *xdf1, xdfile_t *xdf2) {
>         long i, lim;
> -       xrecord_t **recs1, **recs2;
> +       xrecord_t *recs1, *recs2;
>
>         recs1 = xdf1->recs;
>         recs2 = xdf2->recs;
>         for (i = 0, lim = XDL_MIN(xdf1->nrec, xdf2->nrec); i < lim;
>              i++, recs1++, recs2++)
> -               if ((*recs1)->ha != (*recs2)->ha)
> +               if (recs1->ha != recs2->ha)
>                         break;
>
>         xdf1->dstart = xdf2->dstart = i;
> @@ -334,7 +329,7 @@ static int xdl_trim_ends(xdfile_t *xdf1, xdfile_t *xdf2) {
>         recs1 = xdf1->recs + xdf1->nrec - 1;
>         recs2 = xdf2->recs + xdf2->nrec - 1;
>         for (lim -= i, i = 0; i < lim; i++, recs1--, recs2--)
> -               if ((*recs1)->ha != (*recs2)->ha)
> +               if (recs1->ha != recs2->ha)
>                         break;
>
>         xdf1->dend = xdf1->nrec - i - 1;
> diff --git a/xdiff/xtypes.h b/xdiff/xtypes.h
> index 85848f1685..3d26cbf1ec 100644
> --- a/xdiff/xtypes.h
> +++ b/xdiff/xtypes.h
> @@ -45,10 +45,9 @@ typedef struct s_xrecord {
>  } xrecord_t;
>
>  typedef struct s_xdfile {
> -       chastore_t rcha;
> +       xrecord_t *recs;
>         long nrec;
>         long dstart, dend;
> -       xrecord_t **recs;
>         char *rchg;
>         long *rindex;
>         long nreff;
> diff --git a/xdiff/xutils.c b/xdiff/xutils.c
> index 444a108f87..332982b509 100644
> --- a/xdiff/xutils.c
> +++ b/xdiff/xutils.c
> @@ -416,12 +416,12 @@ int xdl_fall_back_diff(xdfenv_t *diff_env, xpparam_t const *xpp,
>         mmfile_t subfile1, subfile2;
>         xdfenv_t env;
>
> -       subfile1.ptr = (char *)diff_env->xdf1.recs[line1 - 1]->ptr;
> -       subfile1.size = diff_env->xdf1.recs[line1 + count1 - 2]->ptr +
> -               diff_env->xdf1.recs[line1 + count1 - 2]->size - subfile1.ptr;
> -       subfile2.ptr = (char *)diff_env->xdf2.recs[line2 - 1]->ptr;
> -       subfile2.size = diff_env->xdf2.recs[line2 + count2 - 2]->ptr +
> -               diff_env->xdf2.recs[line2 + count2 - 2]->size - subfile2.ptr;
> +       subfile1.ptr = (char *)diff_env->xdf1.recs[line1 - 1].ptr;
> +       subfile1.size = diff_env->xdf1.recs[line1 + count1 - 2].ptr +
> +               diff_env->xdf1.recs[line1 + count1 - 2].size - subfile1.ptr;
> +       subfile2.ptr = (char *)diff_env->xdf2.recs[line2 - 1].ptr;
> +       subfile2.size = diff_env->xdf2.recs[line2 + count2 - 2].ptr +
> +               diff_env->xdf2.recs[line2 + count2 - 2].size - subfile2.ptr;
>         if (xdl_do_diff(&subfile1, &subfile2, xpp, &env) < 0)
>                 return -1;
>
> --
> gitgitgadget

You weren't kidding with the --color-words callout; there's an awful lot of places where you only change one or two characters (e.g. '->' becoming '.'); that's much easier to see when viewing the diff with that flag.

Anyway, looks good.
Previous: Ezekiel Newren via GitGitGadgetNext: Phillip Wood
Message 17 of 158 in “Use rust types in xdiff.”
  1. 00/17 Use rust types in xdiff.Ezekiel Newren via GitGitGadget, Sep 7, 2025
  2. 01/17 xdiff: delete static forward declarations in xprepareEzekiel Newren via GitGitGadget, Sep 7, 2025
  3. Elijah NewrenSep 9, 2025
  4. 02/17 xdiff: delete local variables and initialize/free xdfile_t directlyEzekiel Newren via GitGitGadget, Sep 7, 2025
  5. Elijah NewrenSep 9, 2025
  6. 03/17 xdiff: delete unnecessary fields from xrecord_t and xdfile_tEzekiel Newren via GitGitGadget, Sep 7, 2025
  7. Elijah NewrenSep 9, 2025
  8. 04/17 xdiff: delete xdl_get_rec() in xemitEzekiel Newren via GitGitGadget, Sep 7, 2025
  9. Elijah NewrenSep 9, 2025
  10. 05/17 xdiff: delete struct diffdata_tEzekiel Newren via GitGitGadget, Sep 7, 2025
  11. Elijah NewrenSep 9, 2025
  12. 06/17 xdiff: delete redundant array xdfile_t.haEzekiel Newren via GitGitGadget, Sep 7, 2025
  13. Elijah NewrenSep 9, 2025
  14. 07/17 xdiff: delete fields ha, line, size in xdlclass_t in favor of an xrecord_tEzekiel Newren via GitGitGadget, Sep 7, 2025
  15. Elijah NewrenSep 9, 2025
  16. 08/17 xdiff: delete chastore from xdfile_t, view with --color-wordsEzekiel Newren via GitGitGadget, Sep 7, 2025
  17. Elijah NewrenSep 9, 2025
  18. Phillip WoodSep 9, 2025
  19. Junio C HamanoSep 9, 2025
  20. Ben KnobleSep 10, 2025
  21. 09/17 xdiff: treat xdfile_t.rchg like an enumEzekiel Newren via GitGitGadget, Sep 7, 2025
  22. Elijah NewrenSep 9, 2025
  23. 10/17 compat/rust_types.h: define rust primitive typesEzekiel Newren via GitGitGadget, Sep 7, 2025
  24. Junio C HamanoSep 8, 2025
  25. Ezekiel NewrenSep 8, 2025
  26. 11/17 xdiff: include compat/rust_types.hEzekiel Newren via GitGitGadget, Sep 7, 2025
  27. 12/17 xdiff: make xrecord_t.ptr a u8 instead of charEzekiel Newren via GitGitGadget, Sep 7, 2025
  28. 13/17 xdiff: make xrecord_t.size a usize instead of longEzekiel Newren via GitGitGadget, Sep 7, 2025
  29. 14/17 xdiff: split xrecord_t.ha into line_hash and minimal_perfect_hashEzekiel Newren via GitGitGadget, Sep 7, 2025
  30. 15/17 xdiff: make xdfile_t.nrec a usize instead of longEzekiel Newren via GitGitGadget, Sep 7, 2025
  31. 16/17 xdiff: make xdfile_t.nreff a usize instead of longEzekiel Newren via GitGitGadget, Sep 7, 2025
  32. 17/17 xdiff: change the types of dstart, dend, rchg, and rindex in xdfile_tEzekiel Newren via GitGitGadget, Sep 7, 2025
  33. Junio C HamanoSep 16, 2025
  34. Ezekiel NewrenSep 16, 2025
  35. Elijah NewrenSep 17, 2025
  36. Junio C HamanoSep 17, 2025
  37. Junio C HamanoSep 17, 2025
  38. 00/10 Use rust types in xdiff.Ezekiel Newren via GitGitGadget, Sep 18, 2025
  39. 01/10 xdiff: delete static forward declarations in xprepareEzekiel Newren via GitGitGadget, Sep 18, 2025
  40. 02/10 xdiff: delete local variables and initialize/free xdfile_t directlyEzekiel Newren via GitGitGadget, Sep 18, 2025
  41. 03/10 xdiff: delete unnecessary fields from xrecord_t and xdfile_tEzekiel Newren via GitGitGadget, Sep 18, 2025
  42. 04/10 xdiff: delete xdl_get_rec() in xemitEzekiel Newren via GitGitGadget, Sep 18, 2025
  43. 05/10 xdiff: delete struct diffdata_tEzekiel Newren via GitGitGadget, Sep 18, 2025
  44. 06/10 xdiff: delete redundant array xdfile_t.haEzekiel Newren via GitGitGadget, Sep 18, 2025
  45. 07/10 xdiff: delete fields ha, line, size in xdlclass_t in favor of an xrecord_tEzekiel Newren via GitGitGadget, Sep 18, 2025
  46. 08/10 xdiff: delete chastore from xdfile_tEzekiel Newren via GitGitGadget, Sep 18, 2025
  47. 10/10 xdiff: treat xdfile_t.rchg like an enumEzekiel Newren via GitGitGadget, Sep 18, 2025
  48. Junio C HamanoSep 19, 2025
  49. Ezekiel NewrenSep 19, 2025
  50. Ezekiel NewrenSep 19, 2025
  51. 00/10 Cleanup xdfile_t and xrecord_t in xdiff.Ezekiel Newren via GitGitGadget, Sep 19, 2025
  52. 01/10 xdiff: delete static forward declarations in xprepareEzekiel Newren via GitGitGadget, Sep 19, 2025
  53. Junio C HamanoSep 20, 2025
  54. Ezekiel NewrenSep 20, 2025
  55. Elijah NewrenSep 20, 2025
  56. Ben KnobleSep 20, 2025
  57. Junio C HamanoSep 20, 2025
  58. Ben KnobleSep 20, 2025
  59. Jeff KingSep 20, 2025
  60. Ben KnobleSep 20, 2025
  61. Junio C HamanoSep 20, 2025
  62. Jeff KingSep 20, 2025
  63. 02/10 xdiff: delete local variables and initialize/free xdfile_t directlyEzekiel Newren via GitGitGadget, Sep 19, 2025
  64. Junio C HamanoSep 20, 2025
  65. 03/10 xdiff: delete unnecessary fields from xrecord_t and xdfile_tEzekiel Newren via GitGitGadget, Sep 19, 2025
  66. 04/10 xdiff: delete xdl_get_rec() in xemitEzekiel Newren via GitGitGadget, Sep 19, 2025
  67. Junio C HamanoSep 20, 2025
  68. Phillip WoodSep 21, 2025
  69. Ezekiel NewrenSep 21, 2025
  70. 05/10 xdiff: delete struct diffdata_tEzekiel Newren via GitGitGadget, Sep 19, 2025
  71. Phillip WoodSep 21, 2025
  72. Ezekiel NewrenSep 21, 2025
  73. 06/10 xdiff: delete redundant array xdfile_t.haEzekiel Newren via GitGitGadget, Sep 19, 2025
  74. 07/10 xdiff: delete fields ha, line, size in xdlclass_t in favor of an xrecord_tEzekiel Newren via GitGitGadget, Sep 19, 2025
  75. Phillip WoodSep 21, 2025
  76. Ezekiel NewrenSep 21, 2025
  77. 08/10 xdiff: delete chastore from xdfile_tEzekiel Newren via GitGitGadget, Sep 19, 2025
  78. 09/10 xdiff: delete rchg aliasingEzekiel Newren via GitGitGadget, Sep 19, 2025
  79. Phillip WoodSep 21, 2025
  80. Ezekiel NewrenSep 21, 2025
  81. 10/10 xdiff: treat xdfile_t.rchg like an enumEzekiel Newren via GitGitGadget, Sep 19, 2025
  82. Junio C HamanoSep 21, 2025
  83. Ezekiel NewrenSep 21, 2025
  84. Phillip WoodSep 21, 2025
  85. Ezekiel NewrenSep 21, 2025
  86. Elijah NewrenSep 19, 2025
  87. Ezekiel NewrenSep 19, 2025
  88. 00/12 Cleanup xdfile_t and xrecord_t in xdiff.Ezekiel Newren via GitGitGadget, Sep 22, 2025
  89. 01/12 xdiff: delete static forward declarations in xprepareEzekiel Newren via GitGitGadget, Sep 22, 2025
  90. 02/12 xdiff: delete local variables and initialize/free xdfile_t directlyEzekiel Newren via GitGitGadget, Sep 22, 2025
  91. 03/12 xdiff: delete unnecessary fields from xrecord_t and xdfile_tEzekiel Newren via GitGitGadget, Sep 22, 2025
  92. 04/12 xdiff: delete superfluous function xdl_get_rec() in xemitEzekiel Newren via GitGitGadget, Sep 22, 2025
  93. 05/12 xdiff: delete superfluous local variables that alias fields in xrecord_tEzekiel Newren via GitGitGadget, Sep 22, 2025
  94. 06/12 xdiff: delete struct diffdata_tEzekiel Newren via GitGitGadget, Sep 22, 2025
  95. 07/12 xdiff: delete redundant array xdfile_t.haEzekiel Newren via GitGitGadget, Sep 22, 2025
  96. 08/12 xdiff: delete fields ha, line, size in xdlclass_t in favor of an xrecord_tEzekiel Newren via GitGitGadget, Sep 22, 2025
  97. 09/12 xdiff: delete chastore from xdfile_tEzekiel Newren via GitGitGadget, Sep 22, 2025
  98. 10/12 xdiff: delete rchg aliasingEzekiel Newren via GitGitGadget, Sep 22, 2025
  99. 11/12 xdiff: use bool literals for xdfile_t.rchgEzekiel Newren via GitGitGadget, Sep 22, 2025
  100. 12/12 xdiff: refactor 'char *rchg' to 'bool *changed' in xdfile_tEzekiel Newren via GitGitGadget, Sep 22, 2025
  101. Junio C HamanoSep 22, 2025
  102. Ezekiel NewrenSep 23, 2025
  103. Junio C HamanoSep 23, 2025
  104. Ezekiel NewrenSep 23, 2025
  105. Junio C HamanoSep 23, 2025
  106. Ezekiel NewrenSep 23, 2025
  107. 00/13 Cleanup xdfile_t and xrecord_t in xdiff.Ezekiel Newren via GitGitGadget, Sep 23, 2025
  108. 01/13 xdiff: delete static forward declarations in xprepareEzekiel Newren via GitGitGadget, Sep 23, 2025
  109. 02/13 xdiff: delete local variables and initialize/free xdfile_t directlyEzekiel Newren via GitGitGadget, Sep 23, 2025
  110. 03/13 xdiff: delete unnecessary fields from xrecord_t and xdfile_tEzekiel Newren via GitGitGadget, Sep 23, 2025
  111. 04/13 xdiff: delete superfluous function xdl_get_rec() in xemitEzekiel Newren via GitGitGadget, Sep 23, 2025
  112. Kristoffer HaugsbakkSep 30, 2025
  113. Ezekiel NewrenSep 30, 2025
  114. Junio C HamanoSep 30, 2025
  115. 05/13 xdiff: delete superfluous local variables that alias fields in xrecord_tEzekiel Newren via GitGitGadget, Sep 23, 2025
  116. Phillip WoodSep 24, 2025
  117. Ezekiel NewrenSep 24, 2025
  118. 06/13 xdiff: delete struct diffdata_tEzekiel Newren via GitGitGadget, Sep 23, 2025
  119. 07/13 xdiff: delete redundant array xdfile_t.haEzekiel Newren via GitGitGadget, Sep 23, 2025
  120. 08/13 xdiff: delete fields ha, line, size in xdlclass_t in favor of an xrecord_tEzekiel Newren via GitGitGadget, Sep 23, 2025
  121. 09/13 xdiff: delete chastore from xdfile_tEzekiel Newren via GitGitGadget, Sep 23, 2025
  122. 10/13 xdiff: delete rchg aliasingEzekiel Newren via GitGitGadget, Sep 23, 2025
  123. Phillip WoodSep 24, 2025
  124. Ezekiel NewrenSep 24, 2025
  125. Junio C HamanoSep 24, 2025
  126. Ezekiel NewrenSep 24, 2025
  127. Junio C HamanoSep 24, 2025
  128. Ezekiel NewrenSep 24, 2025
  129. Junio C HamanoSep 25, 2025
  130. Ezekiel NewrenSep 25, 2025
  131. 11/13 xdiff: rename rchg -> changed in xdfile_tEzekiel Newren via GitGitGadget, Sep 23, 2025
  132. Phillip WoodSep 24, 2025
  133. Ezekiel NewrenSep 24, 2025
  134. Phillip WoodSep 24, 2025
  135. 12/13 xdiff: use enum macros NONE(0), SOME(1), TOO_MANY(2) in xprepare.cEzekiel Newren via GitGitGadget, Sep 23, 2025
  136. Phillip WoodSep 24, 2025
  137. Ezekiel NewrenSep 24, 2025
  138. Phillip WoodSep 24, 2025
  139. Junio C HamanoSep 24, 2025
  140. Ezekiel NewrenSep 25, 2025
  141. Ezekiel NewrenSep 26, 2025
  142. 13/13 xdiff: change type of xdfile_t.changed from char to boolEzekiel Newren via GitGitGadget, Sep 23, 2025
  143. Phillip WoodSep 24, 2025
  144. Ezekiel NewrenSep 24, 2025
  145. 00/12 Cleanup xdfile_t and xrecord_t in xdiff.Ezekiel Newren via GitGitGadget, Sep 26, 2025
  146. 01/12 xdiff: delete static forward declarations in xprepareEzekiel Newren via GitGitGadget, Sep 26, 2025
  147. 02/12 xdiff: delete local variables and initialize/free xdfile_t directlyEzekiel Newren via GitGitGadget, Sep 26, 2025
  148. 03/12 xdiff: delete unnecessary fields from xrecord_t and xdfile_tEzekiel Newren via GitGitGadget, Sep 26, 2025
  149. 04/12 xdiff: delete superfluous function xdl_get_rec() in xemitEzekiel Newren via GitGitGadget, Sep 26, 2025
  150. 05/12 xdiff: delete local variables that alias fields in xrecord_tEzekiel Newren via GitGitGadget, Sep 26, 2025
  151. 06/12 xdiff: delete struct diffdata_tEzekiel Newren via GitGitGadget, Sep 26, 2025
  152. 07/12 xdiff: delete redundant array xdfile_t.haEzekiel Newren via GitGitGadget, Sep 26, 2025
  153. 08/12 xdiff: delete fields ha, line, size in xdlclass_t in favor of an xrecord_tEzekiel Newren via GitGitGadget, Sep 26, 2025
  154. 09/12 xdiff: delete chastore from xdfile_tEzekiel Newren via GitGitGadget, Sep 26, 2025
  155. 10/12 xdiff: rename rchg -> changed in xdfile_tEzekiel Newren via GitGitGadget, Sep 26, 2025
  156. 11/12 xdiff: add macros DISCARD(0), KEEP(1), INVESTIGATE(2) in xprepare.cEzekiel Newren via GitGitGadget, Sep 26, 2025
  157. 12/12 xdiff: change type of xdfile_t.changed from char to boolEzekiel Newren via GitGitGadget, Sep 26, 2025
  158. Phillip WoodOct 3, 2025

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.