245
return 0;
246
}
247
248
-define_commit_slab(buffer_slab, void *);
248
+struct commit_buffer {
249
+ void *buffer;
250
+ unsigned long size;
251
+};
252
+define_commit_slab(buffer_slab, struct commit_buffer);
253
static struct buffer_slab buffer_slab = COMMIT_SLAB_INIT(1, buffer_slab);
254
251
-void set_commit_buffer(struct commit *commit, void *buffer)
255
+void set_commit_buffer(struct commit *commit, void *buffer, unsigned long size)
256
{
253
- *buffer_slab_at(&buffer_slab, commit) = buffer;
257
+ struct commit_buffer *v = buffer_slab_at(&buffer_slab, commit);
258
+ v->buffer = buffer;
259
+ v->size = size;
260
}
261
256
-const void *get_cached_commit_buffer(const struct commit *commit)
262
+const void *get_cached_commit_buffer(const struct commit *commit, unsigned long *sizep)
263
{
258
- return *buffer_slab_at(&buffer_slab, commit);
264
+ struct commit_buffer *v = buffer_slab_at(&buffer_slab, commit);
265
+ if (sizep)
266
+ *sizep = v->size;
267
+ return v->buffer;
268
}
269
261
-const void *get_commit_buffer(const struct commit *commit)
270
+const void *get_commit_buffer(const struct commit *commit, unsigned long *sizep)
271
{
263
- const void *ret = get_cached_commit_buffer(commit);
272
+ const void *ret = get_cached_commit_buffer(commit, sizep);
273
if (!ret) {
274
enum object_type type;
275
unsigned long size;
280
if (type != OBJ_COMMIT)
281
die("expected commit for %s, got %s",
282
sha1_to_hex(commit->object.sha1), typename(type));
283
+ if (sizep)
284
+ *sizep = size;
285
}
286
return ret;
287
}
288
289
void unuse_commit_buffer(const struct commit *commit, const void *buffer)
290
{
280
- void *cached = *buffer_slab_at(&buffer_slab, commit);
281
- if (cached != buffer)
291
+ struct commit_buffer *v = buffer_slab_at(&buffer_slab, commit);
292
+ if (v->buffer != buffer)
293
free((void *)buffer);
294
}
295
296
void free_commit_buffer(struct commit *commit)
297
{
287
- void **b = buffer_slab_at(&buffer_slab, commit);
288
- free(*b);
289
- *b = NULL;
298
+ struct commit_buffer *v = buffer_slab_at(&buffer_slab, commit);
299
+ free(v->buffer);
300
+ v->buffer = NULL;
301
+ v->size = 0;
302
}
303
292
-const void *detach_commit_buffer(struct commit *commit)
304
+const void *detach_commit_buffer(struct commit *commit, unsigned long *sizep)
305
{
294
- void **b = buffer_slab_at(&buffer_slab, commit);
295
- void *ret = *b;
296
- *b = NULL;
306
+ struct commit_buffer *v = buffer_slab_at(&buffer_slab, commit);
307
+ void *ret;
308
+
309
+ ret = v->buffer;
310
+ if (sizep)
311
+ *sizep = v->size;
312
+
313
+ v->buffer = NULL;
314
+ v->size = 0;
315
return ret;
316
}
317
392
}
393
ret = parse_commit_buffer(item, buffer, size);
394
if (save_commit_buffer && !ret) {
377
- set_commit_buffer(item, buffer);
395
+ set_commit_buffer(item, buffer, size);
396
return 0;
397
}
398
free(buffer);
607
struct commit *commit)
608
{
609
const char *buf, *line_end, *ident_line;
592
- const char *buffer = get_commit_buffer(commit);
610
+ const char *buffer = get_commit_buffer(commit, NULL);
611
struct ident_split ident;
612
char *date_end;
613
unsigned long date;