PostgreSQL Source Code git master
Loading...
Searching...
No Matches
stringinfo_mb.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * stringinfo_mb.c
4 * Multibyte encoding-aware additional StringInfo facilities
5 *
6 * This is separate from common/stringinfo.c so that frontend users
7 * of that file need not pull in unnecessary multibyte-encoding support
8 * code.
9 *
10 *
11 * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
12 * Portions Copyright (c) 1994, Regents of the University of California
13 *
14 *
15 * IDENTIFICATION
16 * src/backend/utils/mb/stringinfo_mb.c
17 *
18 *-------------------------------------------------------------------------
19 */
20#include "postgres.h"
21
22#include "mb/pg_wchar.h"
23#include "mb/stringinfo_mb.h"
24
25
26/*
27 * appendStringInfoStringQuoted
28 *
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.
32 */
33void
34appendStringInfoStringQuoted(StringInfo str, const char *s, int maxlen)
35{
36 char *copy = NULL;
37 const char *chunk_search_start,
39 *chunk_end;
40 int slen;
41 bool ellipsis;
42
43 Assert(str != NULL);
44
45 slen = strlen(s);
46 if (maxlen >= 0 && maxlen < slen)
47 {
48 int finallen = pg_mbcliplen(s, slen, maxlen);
49
53
54 ellipsis = true;
55 }
56 else
57 {
60
61 ellipsis = false;
62 }
63
65
66 while ((chunk_end = strchr(chunk_search_start, '\'')) != NULL)
67 {
68 /* copy including the found delimiting ' */
72
73 /* in order to double it, include this ' into the next chunk as well */
76 }
77
78 /* copy the last chunk and terminate */
79 if (ellipsis)
81 else
83
84 if (copy)
85 pfree(copy);
86}
#define Assert(condition)
Definition c.h:873
const char * str
int pg_mbcliplen(const char *mbstr, int len, int limit)
Definition mbutils.c:1086
void pfree(void *pointer)
Definition mcxt.c:1616
char * pnstrdup(const char *in, Size len)
Definition mcxt.c:1792
static int fb(int x)
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition stringinfo.c:145
void appendBinaryStringInfoNT(StringInfo str, const void *data, int datalen)
Definition stringinfo.c:307
#define appendStringInfoCharMacro(str, ch)
Definition stringinfo.h:231
void appendStringInfoStringQuoted(StringInfo str, const char *s, int maxlen)