diff options
authorJohannes Schindelin <>2014-09-10 13:52:44 (GMT)
committerJunio C Hamano <>2014-09-10 20:52:13 (GMT)
commitfe8e3b71805cd13d139b62fa5a0c75387568c9ea (patch)
parent0c72b98f31bf6eabd75be565a08ffcf0d8e74b1f (diff)
Refactor type_from_string() to allow continuing after detecting an error
In the next commits, we will enhance the fsck_tag() function to check tag objects more thoroughly. To this end, we need a function to verify that a given string is a valid object type, but that does not die() in the negative case. While at it, prepare type_from_string() for counted strings, i.e. strings with an explicitly specified length rather than a NUL termination. Signed-off-by: Johannes Schindelin <> Signed-off-by: Junio C Hamano <>
2 files changed, 11 insertions, 3 deletions
diff --git a/object.c b/object.c
index a16b9f9..aedac24 100644
--- a/object.c
+++ b/object.c
@@ -33,13 +33,20 @@ const char *typename(unsigned int type)
return object_type_strings[type];
-int type_from_string(const char *str)
+int type_from_string_gently(const char *str, ssize_t len, int gentle)
int i;
+ if (len < 0)
+ len = strlen(str);
for (i = 1; i < ARRAY_SIZE(object_type_strings); i++)
- if (!strcmp(str, object_type_strings[i]))
+ if (!strncmp(str, object_type_strings[i], len))
return i;
+ if (gentle)
+ return -1;
die("invalid object type \"%s\"", str);
diff --git a/object.h b/object.h
index 5e8d8ee..e028ced 100644
--- a/object.h
+++ b/object.h
@@ -53,7 +53,8 @@ struct object {
extern const char *typename(unsigned int type);
-extern int type_from_string(const char *str);
+extern int type_from_string_gently(const char *str, ssize_t, int gentle);
+#define type_from_string(str) type_from_string_gently(str, -1, 0)
* Return the current number of buckets in the object hashmap.