37 uint64 (*
encode) (
const char *src,
size_t srclen,
38 char *dst,
size_t dstlen);
39 uint64 (*
decode) (
const char *src,
size_t srclen,
40 char *dst,
size_t dstlen);
67 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
68 errmsg(
"unrecognized encoding: \"%s\"", namebuf)));
81 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
82 errmsg(
"result of encoding conversion is too large")));
86 res = enc->
encode(dataptr, datalen,
VARDATA(result), resultlen);
111 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
112 errmsg(
"unrecognized encoding: \"%s\"", namebuf)));
117 resultlen = enc->
decode_len(dataptr, datalen);
125 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
126 errmsg(
"result of decoding conversion is too large")));
130 res = enc->
decode(dataptr, datalen,
VARDATA(result), resultlen);
163 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
166 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
167 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
168 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
169 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
170 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
171 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
172 -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
173 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,
191 buf |= (
unsigned char) *s << (pos << 3);
198 if ((p - dst + 4) > dstlen)
199 elog(
ERROR,
"overflow of destination buffer in base64 encoding");
200 *p++ =
_base64[(buf >> 18) & 0x3f];
201 *p++ =
_base64[(buf >> 12) & 0x3f];
202 *p++ =
_base64[(buf >> 6) & 0x3f];
210 if ((p - dst + 1) > dstlen)
211 elog(
ERROR,
"overflow of destination buffer in base64 encoding");
218 if ((p - dst + 4) > dstlen)
219 elog(
ERROR,
"overflow of destination buffer in base64 encoding");
220 *p++ =
_base64[(buf >> 18) & 0x3f];
221 *p++ =
_base64[(buf >> 12) & 0x3f];
222 *p++ = (pos == 0) ?
_base64[(buf >> 6) & 0x3f] :
'=';
226 Assert((p - dst) <= dstlen);
233 const char *srcend = src + srclen,
246 if (c ==
' ' || c ==
'\t' || c ==
'\n' || c ==
'\r')
260 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
261 errmsg(
"unexpected \"=\" while decoding base64 sequence")));
268 if (c > 0 && c < 127)
272 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
273 errmsg(
"invalid symbol \"%.*s\" found while decoding base64 sequence",
277 buf = (buf << 6) + b;
281 if ((p - dst + 1) > dstlen)
282 elog(
ERROR,
"overflow of destination buffer in base64 decoding");
283 *p++ = (buf >> 16) & 255;
284 if (end == 0 || end > 1)
286 if ((p - dst + 1) > dstlen)
287 elog(
ERROR,
"overflow of destination buffer in base64 decoding");
288 *p++ = (buf >> 8) & 255;
290 if (end == 0 || end > 2)
292 if ((p - dst + 1) > dstlen)
293 elog(
ERROR,
"overflow of destination buffer in base64 decoding");
303 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
304 errmsg(
"invalid base64 end sequence"),
305 errhint(
"Input data is missing padding, is truncated, or is otherwise corrupted.")));
307 Assert((p - dst) <= dstlen);
316 return ((uint64) srclen + 2) * 4 / 3 + (uint64) srclen / (76 * 3 / 4);
322 return ((uint64) srclen * 3) >> 2;
339 #define VAL(CH) ((CH) - '0') 340 #define DIG(VAL) ((VAL) + '0') 343 esc_encode(
const char *src,
size_t srclen,
char *dst,
size_t dstlen)
345 const char *end = src + srclen;
351 unsigned char c = (
unsigned char) *src;
355 if ((rp - dst + 4) > dstlen)
356 elog(
ERROR,
"overflow of destination buffer in escape encoding");
359 rp[2] =
DIG((c >> 3) & 7);
366 if ((rp - dst + 2) > dstlen)
367 elog(
ERROR,
"overflow of destination buffer in escape encoding");
375 if ((rp - dst + 1) > dstlen)
376 elog(
ERROR,
"overflow of destination buffer in escape encoding");
384 Assert((rp - dst) <= dstlen);
389 esc_decode(
const char *src,
size_t srclen,
char *dst,
size_t dstlen)
391 const char *end = src + srclen;
399 if ((rp - dst + 1) > dstlen)
400 elog(
ERROR,
"overflow of destination buffer in escape decoding");
403 else if (src + 3 < end &&
404 (src[1] >=
'0' && src[1] <=
'3') &&
405 (src[2] >=
'0' && src[2] <=
'7') &&
406 (src[3] >=
'0' && src[3] <=
'7'))
414 if ((rp - dst + 1) > dstlen)
415 elog(
ERROR,
"overflow of destination buffer in escape decoding");
416 *rp++ = val +
VAL(src[3]);
419 else if (src + 1 < end &&
422 if ((rp - dst + 1) > dstlen)
423 elog(
ERROR,
"overflow of destination buffer in escape decoding");
434 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
435 errmsg(
"invalid input syntax for type %s",
"bytea")));
441 Assert((rp - dst) <= dstlen);
448 const char *end = src + srclen;
455 else if (*src ==
'\\')
469 const char *end = src + srclen;
476 else if (src + 3 < end &&
477 (src[1] >=
'0' && src[1] <=
'3') &&
478 (src[2] >=
'0' && src[2] <=
'7') &&
479 (src[3] >=
'0' && src[3] <=
'7'))
486 else if (src + 1 < end &&
500 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
501 errmsg(
"invalid input syntax for type %s",
"bytea")));
541 NULL, NULL, NULL, NULL
int errhint(const char *fmt,...)
uint64 pg_hex_enc_len(size_t srclen)
#define PG_GETARG_DATUM(n)
int errcode(int sqlerrcode)
static uint64 esc_dec_len(const char *src, size_t srclen)
static uint64 pg_base64_decode(const char *src, size_t srclen, char *dst, size_t dstlen)
int pg_strcasecmp(const char *s1, const char *s2)
#define PG_RETURN_BYTEA_P(x)
static const char _base64[]
static uint64 pg_base64_enc_len(const char *src, size_t srclen)
uint64 pg_hex_dec_len(size_t srclen)
Datum binary_encode(PG_FUNCTION_ARGS)
#define PG_GETARG_TEXT_PP(n)
uint64(* decode_len)(const char *src, size_t srclen)
uint64(* encode_len)(const char *src, size_t srclen)
#define IS_HIGHBIT_SET(ch)
static uint64 hex_dec_len(const char *src, size_t srclen)
static const struct pg_encoding * pg_find_encoding(const char *name)
uint64 pg_hex_encode(const char *src, size_t srclen, char *dst, size_t dstlen)
uint64(* decode)(const char *src, size_t srclen, char *dst, size_t dstlen)
static uint64 esc_decode(const char *src, size_t srclen, char *dst, size_t dstlen)
#define TextDatumGetCString(d)
#define ereport(elevel,...)
static uint64 pg_base64_encode(const char *src, size_t srclen, char *dst, size_t dstlen)
#define PG_RETURN_TEXT_P(x)
#define Assert(condition)
static uint64 esc_enc_len(const char *src, size_t srclen)
uint64 pg_hex_decode(const char *src, size_t srclen, char *dst, size_t dstlen)
static uint64 hex_enc_len(const char *src, size_t srclen)
#define PG_GETARG_BYTEA_PP(n)
int pg_mblen(const char *mbstr)
uint64(* encode)(const char *src, size_t srclen, char *dst, size_t dstlen)
#define VARSIZE_ANY_EXHDR(PTR)
int errmsg(const char *fmt,...)
static const struct @24 enclist[]
Datum binary_decode(PG_FUNCTION_ARGS)
#define SET_VARSIZE(PTR, len)
static uint64 esc_encode(const char *src, size_t srclen, char *dst, size_t dstlen)
static uint64 pg_base64_dec_len(const char *src, size_t srclen)
static const int8 b64lookup[128]