24 static text *
dotrim(
const char *
string,
int stringlen,
25 const char *
set,
int setlen,
26 bool doltrim,
bool dortrim);
28 bool doltrim,
bool dortrim);
186 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
187 errmsg(
"requested length too large")));
194 ptr2end = ptr2 + s2len;
201 memcpy(ptr_ret, ptr2, mlen);
214 memcpy(ptr_ret, ptr1, mlen);
284 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
285 errmsg(
"requested length too large")));
297 memcpy(ptr_ret, ptr1, mlen);
303 ptr2end = ptr2 + s2len;
309 memcpy(ptr_ret, ptr2, mlen);
374 dotrim(
const char *
string,
int stringlen,
375 const char *
set,
int setlen,
376 bool doltrim,
bool dortrim)
381 if (stringlen > 0 && setlen > 0)
390 const char **stringchars;
391 const char **setchars;
404 stringchars = (
const char **)
palloc(stringlen *
sizeof(
char *));
405 stringmblen = (
int *)
palloc(stringlen *
sizeof(
int));
411 stringchars[stringnchars] = p;
412 stringmblen[stringnchars] = mblen =
pg_mblen(p);
418 setchars = (
const char **)
palloc(setlen *
sizeof(
char *));
419 setmblen = (
int *)
palloc(setlen *
sizeof(
int));
425 setchars[setnchars] = p;
426 setmblen[setnchars] = mblen =
pg_mblen(p);
433 resultnchars = stringnchars;
437 while (resultnchars > 0)
439 str_pos = stringchars[resultndx];
440 str_len = stringmblen[resultndx];
441 for (i = 0; i < setnchars; i++)
443 if (str_len == setmblen[i] &&
444 memcmp(str_pos, setchars[i], str_len) == 0)
450 stringlen -= str_len;
458 while (resultnchars > 0)
460 str_pos = stringchars[resultndx + resultnchars - 1];
461 str_len = stringmblen[resultndx + resultnchars - 1];
462 for (i = 0; i < setnchars; i++)
464 if (str_len == setmblen[i] &&
465 memcmp(str_pos, setchars[i], str_len) == 0)
470 stringlen -= str_len;
487 while (stringlen > 0)
491 for (i = 0; i < setlen; i++)
493 if (str_ch ==
set[i])
505 while (stringlen > 0)
507 char str_ch =
string[stringlen - 1];
509 for (i = 0; i < setlen; i++)
511 if (str_ch ==
set[i])
545 if (stringlen <= 0 || setlen <= 0)
550 end = ptr + stringlen - 1;
552 end2 = ptr2start + setlen - 1;
832 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
833 errmsg(
"requested length too large")));
844 for (i = 0; i < fromlen; i += len)
847 if (len == source_len &&
848 memcmp(source, &from_ptr[i], len) == 0)
858 for (i = 0; i < from_index; i++)
861 if (p >= (to_ptr + tolen))
864 if (p < (to_ptr + tolen))
867 memcpy(target, p, len);
876 memcpy(target, source, source_len);
877 target += source_len;
878 retlen += source_len;
881 source += source_len;
930 if (encoding ==
PG_UTF8 && *data > 127)
940 result = *data & 0x07;
943 else if (*data >= 0xE0)
945 result = *data & 0x0F;
951 result = *data & 0x1f;
957 for (
i = 1;
i <= tbytes;
i++)
959 Assert((data[
i] & 0xC0) == 0x80);
960 result = (result << 6) + (data[
i] & 0x3f);
969 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
970 errmsg(
"requested character too large")));
1006 if (encoding ==
PG_UTF8 && cvalue > 127)
1017 if (cvalue > 0x0010ffff)
1019 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1020 errmsg(
"requested character too large for encoding: %d",
1023 if (cvalue > 0xffff)
1025 else if (cvalue > 0x07ff)
1032 wch = (
unsigned char *)
VARDATA(result);
1036 wch[0] = 0xC0 | ((cvalue >> 6) & 0x1F);
1037 wch[1] = 0x80 | (cvalue & 0x3F);
1039 else if (bytes == 3)
1041 wch[0] = 0xE0 | ((cvalue >> 12) & 0x0F);
1042 wch[1] = 0x80 | ((cvalue >> 6) & 0x3F);
1043 wch[2] = 0x80 | (cvalue & 0x3F);
1047 wch[0] = 0xF0 | ((cvalue >> 18) & 0x07);
1048 wch[1] = 0x80 | ((cvalue >> 12) & 0x3F);
1049 wch[2] = 0x80 | ((cvalue >> 6) & 0x3F);
1050 wch[3] = 0x80 | (cvalue & 0x3F);
1060 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1061 errmsg(
"requested character not valid for encoding: %d",
1074 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1075 errmsg(
"null character not permitted")));
1079 if ((is_mb && (cvalue > 127)) || (!is_mb && (cvalue > 255)))
1081 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1082 errmsg(
"requested character too large for encoding: %d",
1087 *
VARDATA(result) = (char) cvalue;
1127 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1128 errmsg(
"requested length too large")));
1135 for (i = 0; i < count; i++)
1137 memcpy(cp, sp, slen);
#define PG_GETARG_UINT32(n)
#define PG_GETARG_INT32(n)
bool pg_utf8_islegal(const unsigned char *source, int length)
static bytea * dobyteatrim(bytea *string, bytea *set, bool doltrim, bool dortrim)
static bool pg_mul_s32_overflow(int32 a, int32 b, int32 *result)
Datum lower(PG_FUNCTION_ARGS)
Datum chr(PG_FUNCTION_ARGS)
def bytes(source, encoding='ascii', errors='strict')
#define PG_RETURN_INT32(x)
Datum ascii(PG_FUNCTION_ARGS)
int errcode(int sqlerrcode)
#define PG_RETURN_BYTEA_P(x)
Datum upper(PG_FUNCTION_ARGS)
#define PG_GET_COLLATION()
Datum translate(PG_FUNCTION_ARGS)
#define PG_GETARG_TEXT_PP(n)
int pg_mbstrlen_with_len(const char *mbstr, int limit)
Datum bytealtrim(PG_FUNCTION_ARGS)
Datum btrim(PG_FUNCTION_ARGS)
void pfree(void *pointer)
Datum ltrim(PG_FUNCTION_ARGS)
Datum ltrim1(PG_FUNCTION_ARGS)
Datum repeat(PG_FUNCTION_ARGS)
Datum rtrim1(PG_FUNCTION_ARGS)
Datum initcap(PG_FUNCTION_ARGS)
int pg_encoding_max_length(int encoding)
text * cstring_to_text_with_len(const char *s, int len)
Datum rpad(PG_FUNCTION_ARGS)
Datum byteatrim(PG_FUNCTION_ARGS)
int GetDatabaseEncoding(void)
Datum btrim1(PG_FUNCTION_ARGS)
#define ereport(elevel,...)
#define PG_RETURN_TEXT_P(x)
text * cstring_to_text(const char *s)
Datum byteartrim(PG_FUNCTION_ARGS)
#define Assert(condition)
static bool pg_add_s32_overflow(int32 a, int32 b, int32 *result)
static rewind_source * source
#define PG_GETARG_BYTEA_PP(n)
Datum lpad(PG_FUNCTION_ARGS)
int pg_mblen(const char *mbstr)
int pg_database_encoding_max_length(void)
#define VARSIZE_ANY_EXHDR(PTR)
int errmsg(const char *fmt,...)
Datum rtrim(PG_FUNCTION_ARGS)
static text * dotrim(const char *string, int stringlen, const char *set, int setlen, bool doltrim, bool dortrim)
#define CHECK_FOR_INTERRUPTS()
#define SET_VARSIZE(PTR, len)