From: Joel Rosdahl Date: Mon, 21 Sep 2020 19:42:47 +0000 (+0200) Subject: Add base32hex implementation by Peter Conrad X-Git-Tag: v4.0~71 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d28c654d293637769df20171e9c5a7c1b85d5e97;p=thirdparty%2Fccache.git Add base32hex implementation by Peter Conrad Implementation copied verbatim from (a patch in) . --- diff --git a/LICENSE.adoc b/LICENSE.adoc index 20ca0a449..b6a18140b 100644 --- a/LICENSE.adoc +++ b/LICENSE.adoc @@ -52,6 +52,29 @@ the GPL: that is, if separated from the ccache sources, they may be usable under less restrictive terms. +src/third_party/base32hex.[hc] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This base32hex implementation comes from +. + +------------------------------------------------------------------------------- +(C) 2012 Peter Conrad + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License version 3 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +------------------------------------------------------------------------------- + + src/third_party/blake3/*.[hcS] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/third_party/CMakeLists.txt b/src/third_party/CMakeLists.txt index d4876cdaa..7c62046a1 100644 --- a/src/third_party/CMakeLists.txt +++ b/src/third_party/CMakeLists.txt @@ -1,4 +1,4 @@ -set(third_party_source_files format.cpp xxhash.c) +set(third_party_source_files base32hex.c format.cpp xxhash.c) if(NOT MSVC) list(APPEND third_party_source_files getopt_long.c) diff --git a/src/third_party/base32hex.c b/src/third_party/base32hex.c new file mode 100644 index 000000000..354c04371 --- /dev/null +++ b/src/third_party/base32hex.c @@ -0,0 +1,79 @@ +/* (C) 2012 Peter Conrad + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "base32hex.h" + +#define to_32hex(c) ((c) < 10 ? (c) + '0' : (c) + 'a' - 10) + +/* out must point to a buffer of at least (len * 8 / 5) + 1 bytes. + * Encoded string is *not* padded. + * See RFC-4648. This implementation produces lowercase hex characters. + * Returns length of encoded string. + */ +unsigned int base32hex(char *out, uint8_t *in, unsigned int len) { +int buf = 0, bits = 0; +char *x = out; + + while (len-- > 0) { + buf <<= 8; + buf |= *in++; + bits += 8; + while (bits >= 5) { + char c = (buf >> (bits - 5)) & 0x1f; + *x++ = to_32hex(c); + bits -= 5; + } + } + if (bits > 0) { + char c = (buf << (5 - bits)) & 0x1f; + *x++ = to_32hex(c); + } + return x - out; +} + +#ifdef TEST +#include +#include +#include + +static void test(char *in, char *expected, int explen) { +char buf[255]; +int r; + + if ((r = base32hex(buf, in, strlen(in))) != explen) { + printf("Failed: b32h('%s') yields %d chars (expected %d)\n", + in, r, explen); + exit(1); + } + if (strncmp(buf, expected, r)) { + buf[r] = 0; + printf("Failed: b32h('%s') = '%s' (expected %s)\n", + in, buf, expected); + exit(1); + } +} + +int main(int argc, char **argv) { + test("", "", 0); + test("f", "co", 2); + test("fo", "cpng", 4); + test("foo", "cpnmu", 5); + test("foob", "cpnmuog", 7); + test("fooba", "cpnmuoj1", 8); + test("foobar", "cpnmuoj1e8", 10); + printf("Success!\n"); +} + +#endif diff --git a/src/third_party/base32hex.h b/src/third_party/base32hex.h new file mode 100644 index 000000000..0ea92abd4 --- /dev/null +++ b/src/third_party/base32hex.h @@ -0,0 +1,23 @@ +/* (C) 2012 Peter Conrad + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _BASE32_HEX_H +#define _BASE32_HEX_H + +#include + +extern unsigned int base32hex(char *out, uint8_t *in, unsigned int len); + +#endif