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-2023, PostgreSQL Global Development Group
12 * Portions Copyright (c) 1994, Regents of the University of California
16 * src/backend/utils/mb/stringinfo_mb.c
18 *-------------------------------------------------------------------------
22 #include "mb/stringinfo_mb.h"
23 #include "mb/pg_wchar.h"
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.
34 appendStringInfoStringQuoted(StringInfo str
, const char *s
, int maxlen
)
37 const char *chunk_search_start
,
46 if (maxlen
>= 0 && maxlen
< slen
)
48 int finallen
= pg_mbcliplen(s
, slen
, maxlen
);
50 copy
= pnstrdup(s
, finallen
);
51 chunk_search_start
= copy
;
52 chunk_copy_start
= copy
;
58 chunk_search_start
= s
;
64 appendStringInfoCharMacro(str
, '\'');
66 while ((chunk_end
= strchr(chunk_search_start
, '\'')) != NULL
)
68 /* copy including the found delimiting ' */
69 appendBinaryStringInfoNT(str
,
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 */
80 appendStringInfo(str
, "%s...'", chunk_copy_start
);
82 appendStringInfo(str
, "%s'", chunk_copy_start
);