diff options
Diffstat (limited to 'hex.c')
-rw-r--r-- | hex.c | 53 |
1 files changed, 37 insertions, 16 deletions
@@ -38,17 +38,9 @@ const signed char hexval_table[256] = { int get_sha1_hex(const char *hex, unsigned char *sha1) { int i; - for (i = 0; i < 20; i++) { - unsigned int val; - /* - * hex[1]=='\0' is caught when val is checked below, - * but if hex[0] is NUL we have to avoid reading - * past the end of the string: - */ - if (!hex[0]) - return -1; - val = (hexval(hex[0]) << 4) | hexval(hex[1]); - if (val & ~0xff) + for (i = 0; i < GIT_SHA1_RAWSZ; i++) { + int val = hex2chr(hex); + if (val < 0) return -1; *sha1++ = val; hex += 2; @@ -56,15 +48,26 @@ int get_sha1_hex(const char *hex, unsigned char *sha1) return 0; } -char *sha1_to_hex(const unsigned char *sha1) +int get_oid_hex(const char *hex, struct object_id *oid) +{ + return get_sha1_hex(hex, oid->hash); +} + +int parse_oid_hex(const char *hex, struct object_id *oid, const char **end) +{ + int ret = get_oid_hex(hex, oid); + if (!ret) + *end = hex + GIT_SHA1_HEXSZ; + return ret; +} + +char *sha1_to_hex_r(char *buffer, const unsigned char *sha1) { - static int bufno; - static char hexbuffer[4][41]; static const char hex[] = "0123456789abcdef"; - char *buffer = hexbuffer[3 & ++bufno], *buf = buffer; + char *buf = buffer; int i; - for (i = 0; i < 20; i++) { + for (i = 0; i < GIT_SHA1_RAWSZ; i++) { unsigned int val = *sha1++; *buf++ = hex[val >> 4]; *buf++ = hex[val & 0xf]; @@ -73,3 +76,21 @@ char *sha1_to_hex(const unsigned char *sha1) return buffer; } + +char *oid_to_hex_r(char *buffer, const struct object_id *oid) +{ + return sha1_to_hex_r(buffer, oid->hash); +} + +char *sha1_to_hex(const unsigned char *sha1) +{ + static int bufno; + static char hexbuffer[4][GIT_MAX_HEXSZ + 1]; + bufno = (bufno + 1) % ARRAY_SIZE(hexbuffer); + return sha1_to_hex_r(hexbuffer[bufno], sha1); +} + +char *oid_to_hex(const struct object_id *oid) +{ + return sha1_to_hex(oid->hash); +} |