diff options
author | Edward Thomson <ethomson@edwardthomson.com> | 2022-02-07 23:10:38 -0500 |
---|---|---|
committer | Edward Thomson <ethomson@edwardthomson.com> | 2022-02-08 09:59:03 -0500 |
commit | 06ddcaa50ee24338346241f03f382d5292f20a90 (patch) | |
tree | 1180a7d1db46d697a89a0e84756687f87c8755e1 | |
parent | ff21940200b22552138858dd0f455a5cb25f5ed7 (diff) | |
download | libgit2-06ddcaa50ee24338346241f03f382d5292f20a90.tar.gz |
str: add hexadigit encoding to strings
-rw-r--r-- | src/str.c | 26 | ||||
-rw-r--r-- | src/str.h | 3 |
2 files changed, 29 insertions, 0 deletions
@@ -217,6 +217,32 @@ int git_str_puts(git_str *buf, const char *string) return git_str_put(buf, string, strlen(string)); } +static char hex_encode[] = "0123456789abcdef"; + +int git_str_encode_hexstr(git_str *str, const char *data, size_t len) +{ + size_t new_size, i; + char *s; + + GIT_ERROR_CHECK_ALLOC_MULTIPLY(&new_size, len, 2); + GIT_ERROR_CHECK_ALLOC_ADD(&new_size, new_size, 1); + + if (git_str_grow_by(str, new_size) < 0) + return -1; + + s = str->ptr + str->size; + + for (i = 0; i < len; i++) { + *s++ = hex_encode[(data[i] & 0xf0) >> 4]; + *s++ = hex_encode[(data[i] & 0x0f)]; + } + + str->size += (len * 2); + str->ptr[str->size] = '\0'; + + return 0; +} + static const char base64_encode[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; @@ -217,6 +217,9 @@ int git_str_cmp(const git_str *a, const git_str *b); int git_str_quote(git_str *str); int git_str_unquote(git_str *str); +/* Write data as a hex string */ +int git_str_encode_hexstr(git_str *str, const char *data, size_t len); + /* Write data as base64 encoded in string buffer */ int git_str_encode_base64(git_str *str, const char *data, size_t len); /* Decode the given bas64 and write the result to the string buffer */ |