David Kastrup <dak@xxxxxxx> writes: > Making a single preparation run for counting the lines will avoid memory > fragmentation. Also, fix the allocated memory size which was wrong > when sizeof(int *) != sizeof(int), and would have been too small > for sizeof(int *) < sizeof(int), admittedly unlikely. > > Signed-off-by: David Kastrup <dak@xxxxxxx> > --- I think I took sizeof(int*)->sizeof(int) patch to the 'next' branch already, which might have to conflict with this clean-up, but it should be trivial to resolve. Thanks for resending. I was busy elsewhere (i.e. "no feedback" does not mean "silent rejection" nor "silent agreement" at least from me), and such a resend does help prevent patches fall thru cracks. > diff --git a/builtin/blame.c b/builtin/blame.c > index e44a6bb..1aefedf 100644 > --- a/builtin/blame.c > +++ b/builtin/blame.c > @@ -1772,25 +1772,41 @@ static int prepare_lines(struct scoreboard *sb) > { > const char *buf = sb->final_buf; > unsigned long len = sb->final_buf_size; > + const char *end = buf + len; > + const char *p; > + int *lineno; > + int num = 0, incomplete = 0; > > + for (p = buf;;) { > + p = memchr(p, '\n', end - p); > + if (p) { > + p++; > num++; > + continue; > } > + break; > } > + > + if (len && end[-1] != '\n') > + incomplete++; /* incomplete line at the end */ > + > + sb->lineno = xmalloc(sizeof(*sb->lineno) * (num + incomplete + 1)); > + lineno = sb->lineno; > + > + *lineno++ = 0; > + for (p = buf;;) { > + p = memchr(p, '\n', end - p); > + if (p) { > + p++; > + *lineno++ = p - buf; > + continue; > + } > + break; > + } > + > + if (incomplete) > + *lineno++ = len; > + > sb->num_lines = num + incomplete; > return sb->num_lines; > } -- 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