1/*-------------------------------------------------------------------------
4 * Multibyte encoding-aware additional StringInfo facilities
6 * This is separate from common/stringinfo.c so that frontend users
7 * of that file need not pull in unnecessary multibyte-encoding support
11 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
12 * Portions Copyright (c) 1994, Regents of the University of California
16 * src/backend/utils/mb/stringinfo_mb.c
18 *-------------------------------------------------------------------------
27 * appendStringInfoStringQuoted
29 * Append up to maxlen bytes from s to str, or the whole input string if
30 * maxlen < 0, adding single quotes around it and doubling all single quotes.
31 * Add an ellipsis if the copy is incomplete.
37 const char *chunk_search_start,
46 if (maxlen >= 0 && maxlen < slen)
51 chunk_search_start = copy;
52 chunk_copy_start = copy;
58 chunk_search_start = s;
66 while ((chunk_end = strchr(chunk_search_start,
'\'')) != NULL)
68 /* copy including the found delimiting ' */
71 chunk_end - chunk_copy_start + 1);
73 /* in order to double it, include this ' into the next chunk as well */
74 chunk_copy_start = chunk_end;
75 chunk_search_start = chunk_end + 1;
78 /* copy the last chunk and terminate */
Assert(PointerIsAligned(start, uint64))
int pg_mbcliplen(const char *mbstr, int len, int limit)
void pfree(void *pointer)
char * pnstrdup(const char *in, Size len)
void appendStringInfo(StringInfo str, const char *fmt,...)
void appendBinaryStringInfoNT(StringInfo str, const void *data, int datalen)
#define appendStringInfoCharMacro(str, ch)
void appendStringInfoStringQuoted(StringInfo str, const char *s, int maxlen)