diff options
author | Junio C Hamano <junkio@cox.net> | 2006-05-28 23:05:02 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-05-28 23:05:02 -0700 |
commit | 52bc0e294c0d5924db0e5e8f25284e467c6d2983 (patch) | |
tree | 86f9e8fe89841de0e69e91902865002dffdaa6bf /tree-walk.c | |
parent | Merge branch 'jc/cache-tree' into next (diff) | |
parent | Merge branch 'lt/tree' into jc/lt-tree-n-cache-tree (diff) | |
download | tgif-52bc0e294c0d5924db0e5e8f25284e467c6d2983.tar.xz |
Merge branch 'jc/lt-tree-n-cache-tree' into next
* jc/lt-tree-n-cache-tree:
Remove "tree->entries" tree-entry list from tree parser
Switch "read_tree_recursive()" over to tree-walk functionality
Make "tree_entry" have a SHA1 instead of a union of object pointers
Add raw tree buffer info to "struct tree"
Don't use "sscanf()" for tree mode scanning
git-fetch: avoid using "case ... in (arm)"
Diffstat (limited to 'tree-walk.c')
-rw-r--r-- | tree-walk.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/tree-walk.c b/tree-walk.c index 9f7abb7cb3..3922058271 100644 --- a/tree-walk.c +++ b/tree-walk.c @@ -47,18 +47,33 @@ void update_tree_entry(struct tree_desc *desc) desc->size = size - len; } +static const char *get_mode(const char *str, unsigned int *modep) +{ + unsigned char c; + unsigned int mode = 0; + + while ((c = *str++) != ' ') { + if (c < '0' || c > '7') + return NULL; + mode = (mode << 3) + (c - '0'); + } + *modep = mode; + return str; +} + const unsigned char *tree_entry_extract(struct tree_desc *desc, const char **pathp, unsigned int *modep) { void *tree = desc->buf; unsigned long size = desc->size; int len = strlen(tree)+1; const unsigned char *sha1 = tree + len; - const char *path = strchr(tree, ' '); + const char *path; unsigned int mode; - if (!path || size < len + 20 || sscanf(tree, "%o", &mode) != 1) + path = get_mode(tree, &mode); + if (!path || size < len + 20) die("corrupt tree file"); - *pathp = path+1; + *pathp = path; *modep = canon_mode(mode); return sha1; } |