diff --git a/src/util/disk_cache.h b/src/util/disk_cache.h index 026ca42f03c..32f638010b5 100644 --- a/src/util/disk_cache.h +++ b/src/util/disk_cache.h @@ -33,6 +33,7 @@ #include #include #include +#include "util/hex.h" #include "util/mesa-sha1.h" #include "util/detect_os.h" @@ -82,16 +83,7 @@ struct disk_cache; static inline char * disk_cache_format_hex_id(char *buf, const uint8_t *hex_id, unsigned size) { - static const char hex_digits[] = "0123456789abcdef"; - unsigned i; - - for (i = 0; i < size; i += 2) { - buf[i] = hex_digits[hex_id[i >> 1] >> 4]; - buf[i + 1] = hex_digits[hex_id[i >> 1] & 0x0f]; - } - buf[i] = '\0'; - - return buf; + return mesa_bytes_to_hex(buf, hex_id, size / 2); } #ifdef HAVE_DLADDR diff --git a/src/util/hex.h b/src/util/hex.h new file mode 100644 index 00000000000..5bd618046e1 --- /dev/null +++ b/src/util/hex.h @@ -0,0 +1,69 @@ +/* Copyright © 2023 Valve Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef UTIL_HEX_H +#define UTIL_HEX_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Convert a binary buffer of length `len` to a hexadecimal string of length + * `len * 2 + 1` (including NUL terminator). + */ +static inline char *mesa_bytes_to_hex(char *buf, const unsigned char *binary, + unsigned len) { + static const char hex_digits[] = "0123456789abcdef"; + unsigned i; + + for (i = 0; i < len * 2; i += 2) { + buf[i] = hex_digits[binary[i >> 1] >> 4]; + buf[i + 1] = hex_digits[binary[i >> 1] & 0x0f]; + } + buf[i] = '\0'; + + return buf; +} + +/* + * Read `len` pairs of hexadecimal digits from `hex` and write the values to + * `binary` as `len` bytes. + */ +static inline void mesa_hex_to_bytes(unsigned char *buf, const char *hex, + unsigned len) { + for (unsigned i = 0; i < len; i++) { + char tmp[3]; + tmp[0] = hex[i * 2]; + tmp[1] = hex[(i * 2) + 1]; + tmp[2] = '\0'; + buf[i] = strtol(tmp, NULL, 16); + } +} + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/util/mesa-sha1.c b/src/util/mesa-sha1.c index bdca1233a02..eed6e34fa5e 100644 --- a/src/util/mesa-sha1.c +++ b/src/util/mesa-sha1.c @@ -26,6 +26,7 @@ #include "sha1/sha1.h" #include "mesa-sha1.h" +#include "hex.h" #include #include @@ -42,14 +43,7 @@ _mesa_sha1_compute(const void *data, size_t size, unsigned char result[20]) void _mesa_sha1_format(char *buf, const unsigned char *sha1) { - static const char hex_digits[] = "0123456789abcdef"; - int i; - - for (i = 0; i < 40; i += 2) { - buf[i] = hex_digits[sha1[i >> 1] >> 4]; - buf[i + 1] = hex_digits[sha1[i >> 1] & 0x0f]; - } - buf[i] = '\0'; + mesa_bytes_to_hex(buf, sha1, SHA1_DIGEST_LENGTH); } /* Convert a hashs string hexidecimal representation into its more compact @@ -58,13 +52,7 @@ _mesa_sha1_format(char *buf, const unsigned char *sha1) void _mesa_sha1_hex_to_sha1(unsigned char *buf, const char *hex) { - for (unsigned i = 0; i < 20; i++) { - char tmp[3]; - tmp[0] = hex[i * 2]; - tmp[1] = hex[(i * 2) + 1]; - tmp[2] = '\0'; - buf[i] = strtol(tmp, NULL, 16); - } + mesa_hex_to_bytes(buf, hex, SHA1_DIGEST_LENGTH); } static void diff --git a/src/util/meson.build b/src/util/meson.build index e74b187ed69..9b4864cfce6 100644 --- a/src/util/meson.build +++ b/src/util/meson.build @@ -64,6 +64,7 @@ files_mesa_util = files( 'half_float.h', 'hash_table.c', 'hash_table.h', + 'hex.h', 'u_idalloc.c', 'u_idalloc.h', 'list.h',