diff options
author | Andreas Gruenbacher <agruen@linbit.com> | 2012-07-27 15:17:44 +0200 |
---|---|---|
committer | Andreas Gruenbacher <agruen@linbit.com> | 2012-07-31 21:58:30 +0200 |
commit | b0c22022be55611cf1c60401ef794dbb94767ed9 (patch) | |
tree | 4c15bcd06e6579b8c99f01513a70ab35daa5ba23 | |
parent | 6e21796422a7a83f727c201ee741cb156af36744 (diff) | |
download | patch-b0c22022be55611cf1c60401ef794dbb94767ed9.tar.gz |
Accessor functions for SHA1 hashes in git-style diffs
* src/pch.c (p_sha1): New variable.
(get_sha1): New function for saving a sha1 checksum.
(sha1_says_nonexistent): Take a NULL terminated string instead of an end
pointer.
(intuit_diff_type): Remember the SHA1 hashes from index headers in git-style
diffs in p_sha1.
(pch_sha1): New function for accessing p_sha1.
* src/pch.h (pch_sha1): Declare.
-rw-r--r-- | src/pch.c | 39 | ||||
-rw-r--r-- | src/pch.h | 1 |
2 files changed, 33 insertions, 7 deletions
@@ -24,6 +24,7 @@ #include <inp.h> #include <quotearg.h> #include <util.h> +#include <xalloc.h> #undef XTERN #define XTERN #include <pch.h> @@ -46,6 +47,7 @@ static char const *invalid_names[2]; bool p_copy[2]; /* Does this patch create a copy? */ bool p_rename[2]; /* Does this patch rename a file? */ static char *p_timestr[2]; /* timestamps as strings */ +static char *p_sha1[2]; /* SHA1 checksums */ static mode_t p_mode[2]; /* file modes */ static off_t p_filesize; /* size of the patch file */ static lin p_first; /* 1st line number */ @@ -348,24 +350,33 @@ fetchmode (char const *str) return mode; } +static void +get_sha1(char **sha1, char const *start, char const *end) +{ + unsigned int len = end - start; + *sha1 = xmalloc (len + 1); + memcpy (*sha1, start, len); + (*sha1)[len] = 0; +} + static int -sha1_says_nonexistent(char const *sha1, char const *end) +sha1_says_nonexistent(char const *sha1) { char const *empty_sha1 = "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"; char const *s; /* Nonexisting files have an all-zero checksum. */ - for (s = sha1; s != end; s++) + for (s = sha1; *s; s++) if (*s != '0') break; - if (s == end) + if (! *s) return 2; /* Empty files have empty_sha1 as their checksum. */ - for (s = sha1; s != end; s++, empty_sha1++) + for (s = sha1; *s; s++, empty_sha1++) if (*s != *empty_sha1) break; - return s == end; + return ! *s; } static char const * _GL_ATTRIBUTE_PURE @@ -450,6 +461,12 @@ intuit_diff_type (bool need_header, mode_t *p_file_type) free(p_timestr[i]); p_timestr[i] = 0; } + for (i = OLD; i <= NEW; i++) + if (p_sha1[i]) + { + free (p_sha1[i]); + p_sha1[i] = 0; + } p_git_diff = false; for (i = OLD; i <= NEW; i++) { @@ -622,8 +639,10 @@ intuit_diff_type (bool need_header, mode_t *p_file_type) && (v = skip_hex_digits (u + 2)) && (! *v || ISSPACE ((unsigned char) *v))) { - p_says_nonexistent[OLD] = sha1_says_nonexistent (s + 6, u); - p_says_nonexistent[NEW] = sha1_says_nonexistent (u + 2, v); + get_sha1(&p_sha1[OLD], s + 6, u); + get_sha1(&p_sha1[NEW], u + 2, v); + p_says_nonexistent[OLD] = sha1_says_nonexistent (p_sha1[OLD]); + p_says_nonexistent[NEW] = sha1_says_nonexistent (p_sha1[NEW]); if (*(v = skip_spaces (v))) p_mode[OLD] = p_mode[NEW] = fetchmode (v); extended_headers = true; @@ -2258,6 +2277,12 @@ pch_timestr (bool which) return p_timestr[which]; } +char const * +pch_sha1 (bool which) +{ + return p_sha1[which]; +} + mode_t pch_mode (bool which) { @@ -25,6 +25,7 @@ lin pch_hunk_beg (void) _GL_ATTRIBUTE_PURE; char const *pch_c_function (void) _GL_ATTRIBUTE_PURE; bool pch_git_diff (void) _GL_ATTRIBUTE_PURE; char const * pch_timestr (bool which) _GL_ATTRIBUTE_PURE; +char const *pch_sha1 (bool which) _GL_ATTRIBUTE_PURE; mode_t pch_mode (bool which) _GL_ATTRIBUTE_PURE; lin pch_newfirst (void) _GL_ATTRIBUTE_PURE; lin pch_prefix_context (void) _GL_ATTRIBUTE_PURE; |