335
}
336
337
/*
338
- * Convert a partial SHA1 hex string to the corresponding partial SHA1 value.
339
- * - hex - Partial SHA1 segment in ASCII hex format
340
- * - hex_len - Length of above segment. Must be multiple of 2 between 0 and 40
341
- * - oid - Partial SHA1 value is written here
342
- * Return 0 on success or -1 on error (invalid arguments or input not
343
- * in hex format).
338
+ * Read `len` pairs of hexadecimal digits from `hex` and write the
339
+ * values to `binary` as `len` bytes. Return 0 on success, or -1 if
340
+ * the input does not consist of hex digits).
341
*/
345
-static int get_oid_hex_segment(const char *hex, unsigned int hex_len,
346
- unsigned char *oid)
342
+static int hex_to_bytes(unsigned char *binary, const char *hex, size_t len)
343
{
348
- unsigned int i, len = hex_len >> 1;
349
- if (hex_len % 2 != 0)
350
- return -1;
351
- for (i = 0; i < len; i++) {
344
+ for (; len; len--, hex += 2) {
345
unsigned int val = (hexval(hex[0]) << 4) | hexval(hex[1]);
346
+
347
if (val & ~0xff)
348
return -1;
355
- *oid++ = val;
356
- hex += 2;
349
+ *binary++ = val;
350
}
351
return 0;
352
}
431
/* notes must be blobs */
432
goto handle_non_note;
433
441
- if (get_oid_hex_segment(entry.path, path_len,
442
- object_oid.hash + prefix_len))
434
+ if (hex_to_bytes(object_oid.hash + prefix_len, entry.path,
435
+ GIT_SHA1_RAWSZ - prefix_len))
436
goto handle_non_note; /* entry.path is not a SHA1 */
437
438
type = PTR_TYPE_NOTE;
444
/* internal nodes must be trees */
445
goto handle_non_note;
446
454
- if (get_oid_hex_segment(entry.path, 2,
455
- object_oid.hash + len++))
447
+ if (hex_to_bytes(object_oid.hash + len++, entry.path, 1))
448
goto handle_non_note; /* entry.path is not a SHA1 */
449
450
/*