diff options
author | Bruce Momjian <bruce@momjian.us> | 2020-12-24 17:25:48 -0500 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 2020-12-24 17:25:48 -0500 |
commit | c3826f831e6e63e13a749fd3ab9fd7106707b549 (patch) | |
tree | a060a73607136f8bd58000ffc0b14410f136f986 /src/backend/utils/adt/encode.c | |
parent | 7519bd16d1a2a2007b3604f6740611c0b75a6cd0 (diff) | |
download | postgresql-c3826f831e6e63e13a749fd3ab9fd7106707b549.tar.gz postgresql-c3826f831e6e63e13a749fd3ab9fd7106707b549.zip |
move hex_decode() to /common so it can be called from frontend
This allows removal of a copy of hex_decode() from ecpg, and will be
used by the soon-to-be added pg_alterckey command.
Backpatch-through: master
Diffstat (limited to 'src/backend/utils/adt/encode.c')
-rw-r--r-- | src/backend/utils/adt/encode.c | 64 |
1 files changed, 1 insertions, 63 deletions
diff --git a/src/backend/utils/adt/encode.c b/src/backend/utils/adt/encode.c index a609d49c12c..a6c65b16578 100644 --- a/src/backend/utils/adt/encode.c +++ b/src/backend/utils/adt/encode.c @@ -15,6 +15,7 @@ #include <ctype.h> +#include "common/hex_decode.h" #include "mb/pg_wchar.h" #include "utils/builtins.h" #include "utils/memutils.h" @@ -146,17 +147,6 @@ binary_decode(PG_FUNCTION_ARGS) static const char hextbl[] = "0123456789abcdef"; -static const int8 hexlookup[128] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, - -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -}; - uint64 hex_encode(const char *src, size_t len, char *dst) { @@ -171,58 +161,6 @@ hex_encode(const char *src, size_t len, char *dst) return (uint64) len * 2; } -static inline char -get_hex(const char *cp) -{ - unsigned char c = (unsigned char) *cp; - int res = -1; - - if (c < 127) - res = hexlookup[c]; - - if (res < 0) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("invalid hexadecimal digit: \"%.*s\"", - pg_mblen(cp), cp))); - - return (char) res; -} - -uint64 -hex_decode(const char *src, size_t len, char *dst) -{ - const char *s, - *srcend; - char v1, - v2, - *p; - - srcend = src + len; - s = src; - p = dst; - while (s < srcend) - { - if (*s == ' ' || *s == '\n' || *s == '\t' || *s == '\r') - { - s++; - continue; - } - v1 = get_hex(s) << 4; - s++; - if (s >= srcend) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("invalid hexadecimal data: odd number of digits"))); - - v2 = get_hex(s); - s++; - *p++ = v1 | v2; - } - - return p - dst; -} - static uint64 hex_enc_len(const char *src, size_t srclen) { |