revert removal of hex_decode() from ecpg from commit c3826f831e
authorBruce Momjian <[email protected]>
Thu, 24 Dec 2020 23:21:37 +0000 (18:21 -0500)
committerBruce Momjian <[email protected]>
Thu, 24 Dec 2020 23:21:37 +0000 (18:21 -0500)
ecpglib on certain platforms can't handle the pg_log_fatal calls from
libraries.  This was reported by the buildfarm.  It needs a refactoring
and return value change if it is later removed.

Back-through: master

src/interfaces/ecpg/ecpglib/data.c

index 326de71cb1b255b5d5345a1f748175c3ac6a19a4..6bc91ef7eb6d92f810b91ce5cf45792500e017d2 100644 (file)
@@ -5,7 +5,6 @@
 
 #include <math.h>
 
-#include "common/hex_decode.h"
 #include "ecpgerrno.h"
 #include "ecpglib.h"
 #include "ecpglib_extern.h"
@@ -137,6 +136,57 @@ 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)
 {