move hex_decode() to /common so it can be called from frontend
authorBruce Momjian <bruce@momjian.us>
Thu, 24 Dec 2020 22:25:48 +0000 (17:25 -0500)
committerBruce Momjian <bruce@momjian.us>
Thu, 24 Dec 2020 22:25:48 +0000 (17:25 -0500)
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

src/backend/utils/adt/encode.c
src/backend/utils/adt/varlena.c
src/common/Makefile
src/common/hex_decode.c [new file with mode: 0644]
src/include/common/hex_decode.h [new file with mode: 0644]
src/include/utils/builtins.h
src/interfaces/ecpg/ecpglib/data.c
src/tools/msvc/Mkvcbuild.pm

index a609d49c12c2f9b2906de39e50ad80db8121267c..a6c65b16578ae11c77e3d6f5ab0644526bdacb59 100644 (file)
@@ -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)
 {
index ff9bf238f34888c24210306b55be752db6c78156..9300d19e0c0136e94b7a2b054f3bd14cfdac2a80 100644 (file)
@@ -22,6 +22,7 @@
 #include "catalog/pg_type.h"
 #include "common/hashfn.h"
 #include "common/int.h"
+#include "common/hex_decode.h"
 #include "common/unicode_norm.h"
 #include "lib/hyperloglog.h"
 #include "libpq/pqformat.h"
index af891cb0cea92b412dbb60fa0740ee8bbd000939..f62497793956fb775d5b766f2be518caded9e9cd 100644 (file)
@@ -58,6 +58,7 @@ OBJS_COMMON = \
        file_perm.o \
        file_utils.o \
        hashfn.o \
+       hex_decode.o \
        ip.o \
        jsonapi.o \
        keywords.o \
diff --git a/src/common/hex_decode.c b/src/common/hex_decode.c
new file mode 100644 (file)
index 0000000..3ecdc73
--- /dev/null
@@ -0,0 +1,106 @@
+/*-------------------------------------------------------------------------
+ *
+ * hex_decode.c
+ *             hex decoding
+ *
+ *
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ *       src/common/hex_decode.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+
+#ifndef FRONTEND
+#include "postgres.h"
+#else
+#include "postgres_fe.h"
+#endif
+
+#ifdef FRONTEND
+#include "common/logging.h"
+#else
+#include "mb/pg_wchar.h"
+#endif
+#include "common/hex_decode.h"
+
+
+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,
+};
+
+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)
+       {
+#ifdef FRONTEND
+               pg_log_fatal("invalid hexadecimal digit");
+               exit(EXIT_FAILURE);
+#else
+               ereport(ERROR,
+                               (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+                                errmsg("invalid hexadecimal digit: \"%.*s\"",
+                                               pg_mblen(cp), cp)));
+#endif
+       }
+
+       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)
+               {
+#ifdef FRONTEND
+                       pg_log_fatal("invalid hexadecimal data: odd number of digits");
+                       exit(EXIT_FAILURE);
+#else
+                       ereport(ERROR,
+                                       (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+                                        errmsg("invalid hexadecimal data: odd number of digits")));
+#endif
+               }
+               v2 = get_hex(s);
+               s++;
+               *p++ = v1 | v2;
+       }
+
+       return p - dst;
+}
diff --git a/src/include/common/hex_decode.h b/src/include/common/hex_decode.h
new file mode 100644 (file)
index 0000000..1f99f06
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ *     hex_decode.h
+ *             hex decoding
+ *
+ *     Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
+ *     Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *     src/include/common/hex_decode.h
+ */
+#ifndef COMMON_HEX_DECODE_H
+#define COMMON_HEX_DECODE_H
+
+extern uint64 hex_decode(const char *src, size_t len, char *dst);
+
+
+#endif                                                 /* COMMON_HEX_DECODE_H */
index 4db5ad3f12e5e2889169dd4cdbffa397ddd8413e..19271e0696067ff6db809a40de5c271d9ce5a87c 100644 (file)
@@ -33,7 +33,6 @@ extern int    errdomainconstraint(Oid datatypeOid, const char *conname);
 
 /* encode.c */
 extern uint64 hex_encode(const char *src, size_t len, char *dst);
-extern uint64 hex_decode(const char *src, size_t len, char *dst);
 
 /* int.c */
 extern int2vector *buildint2vector(const int16 *int2s, int n);
index 6bc91ef7eb6d92f810b91ce5cf45792500e017d2..326de71cb1b255b5d5345a1f748175c3ac6a19a4 100644 (file)
@@ -5,6 +5,7 @@
 
 #include <math.h>
 
+#include "common/hex_decode.h"
 #include "ecpgerrno.h"
 #include "ecpglib.h"
 #include "ecpglib_extern.h"
@@ -136,57 +137,6 @@ ecpg_hex_dec_len(unsigned srclen)
        return srclen >> 1;
 }
 
-static inline char
-get_hex(char c)
-{
-       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,
-       };
-       int                     res = -1;
-
-       if (c > 0 && c < 127)
-               res = hexlookup[(unsigned char) c];
-
-       return (char) res;
-}
-
-static unsigned
-hex_decode(const char *src, unsigned 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;
-               if (s >= srcend)
-                       return -1;
-
-               v2 = get_hex(*s++);
-               *p++ = v1 | v2;
-       }
-
-       return p - dst;
-}
-
 unsigned
 ecpg_hex_encode(const char *src, unsigned len, char *dst)
 {
index f92c14030dce7ef5b3e8c10683115d3049f8a6b9..7f014a12c9a4725c28d30d7a264d69e964399518 100644 (file)
@@ -121,7 +121,7 @@ sub mkvcbuild
        our @pgcommonallfiles = qw(
          archive.c base64.c checksum_helper.c
          config_info.c controldata_utils.c d2s.c encnames.c exec.c
-         f2s.c file_perm.c file_utils.c hashfn.c ip.c jsonapi.c
+         f2s.c file_perm.c file_utils.c hashfn.c hex_decode.c ip.c jsonapi.c
          keywords.c kwlookup.c link-canary.c md5_common.c
          pg_get_line.c pg_lzcompress.c pgfnames.c psprintf.c relpath.c rmtree.c
          saslprep.c scram-common.c string.c stringinfo.c unicode_norm.c username.c