From d6ffc8d784d41977397a49ce5333cfe7db1e9c2c Mon Sep 17 00:00:00 2001 From: Martin Koegler Date: Mon, 25 Feb 2008 22:46:09 +0100 Subject: add common fsck error printing function Signed-off-by: Martin Koegler Signed-off-by: Junio C Hamano --- fsck.c | 29 +++++++++++++++++++++++++++++ fsck.h | 2 ++ 2 files changed, 31 insertions(+) diff --git a/fsck.c b/fsck.c index 0680862151..6883d1bd68 100644 --- a/fsck.c +++ b/fsck.c @@ -304,3 +304,32 @@ int fsck_object(struct object *obj, int strict, fsck_error error_func) return error_func(obj, FSCK_ERROR, "unknown type '%d' (internal fsck error)", obj->type); } + +int fsck_error_function(struct object *obj, int type, const char *fmt, ...) +{ + va_list ap; + int len; + struct strbuf sb; + + strbuf_init(&sb, 0); + strbuf_addf(&sb, "object %s:", obj->sha1?sha1_to_hex(obj->sha1):"(null)"); + + va_start(ap, fmt); + len = vsnprintf(sb.buf + sb.len, strbuf_avail(&sb), fmt, ap); + va_end(ap); + + if (len < 0) + len = 0; + if (len >= strbuf_avail(&sb)) { + strbuf_grow(&sb, len + 2); + va_start(ap, fmt); + len = vsnprintf(sb.buf + sb.len, strbuf_avail(&sb), fmt, ap); + va_end(ap); + if (len >= strbuf_avail(&sb)) + die("this should not happen, your snprintf is broken"); + } + + error(sb.buf); + strbuf_release(&sb); + return 1; +} diff --git a/fsck.h b/fsck.h index 9bd37c9f1c..990ee02335 100644 --- a/fsck.h +++ b/fsck.h @@ -17,6 +17,8 @@ typedef int (*fsck_walk_func)(struct object *obj, int type, void *data); /* callback for fsck_object, type is FSCK_ERROR or FSCK_WARN */ typedef int (*fsck_error)(struct object *obj, int type, const char *err, ...); +int fsck_error_function(struct object *obj, int type, const char *fmt, ...); + /* descend in all linked child objects * the return value is: * -1 error in processing the object -- cgit v1.2.3