revert removal of hex_decode() from ecpg from commit c3826f831e
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. Backpatch-through: master
This commit is contained in:
parent
c3826f831e
commit
558a6e8e21
@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include "common/hex_decode.h"
|
|
||||||
#include "ecpgerrno.h"
|
#include "ecpgerrno.h"
|
||||||
#include "ecpglib.h"
|
#include "ecpglib.h"
|
||||||
#include "ecpglib_extern.h"
|
#include "ecpglib_extern.h"
|
||||||
@ -137,6 +136,57 @@ ecpg_hex_dec_len(unsigned srclen)
|
|||||||
return srclen >> 1;
|
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
|
unsigned
|
||||||
ecpg_hex_encode(const char *src, unsigned len, char *dst)
|
ecpg_hex_encode(const char *src, unsigned len, char *dst)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user