PostgreSQL Source Code  git master
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-2020, 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/stringinfo_mb.h"
23 #include "mb/pg_wchar.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  */
33 void
34 appendStringInfoStringQuoted(StringInfo str, const char *s, int maxlen)
35 {
36  char *copy = NULL;
37  const char *chunk_search_start,
38  *chunk_copy_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 
50  copy = pnstrdup(s, finallen);
51  chunk_search_start = copy;
52  chunk_copy_start = copy;
53 
54  ellipsis = true;
55  }
56  else
57  {
58  chunk_search_start = s;
59  chunk_copy_start = s;
60 
61  ellipsis = false;
62  }
63 
64  appendStringInfoCharMacro(str, '\'');
65 
66  while ((chunk_end = strchr(chunk_search_start, '\'')) != NULL)
67  {
68  /* copy including the found delimiting ' */
70  chunk_copy_start,
71  chunk_end - chunk_copy_start + 1);
72 
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;
76  }
77 
78  /* copy the last chunk and terminate */
79  if (ellipsis)
80  appendStringInfo(str, "%s...'", chunk_copy_start);
81  else
82  appendStringInfo(str, "%s'", chunk_copy_start);
83 
84  if (copy)
85  pfree(copy);
86 }
char * pnstrdup(const char *in, Size len)
Definition: mcxt.c:1197
#define appendStringInfoCharMacro(str, ch)
Definition: stringinfo.h:128
void pfree(void *pointer)
Definition: mcxt.c:1056
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:91
void appendBinaryStringInfoNT(StringInfo str, const char *data, int datalen)
Definition: stringinfo.c:253
int pg_mbcliplen(const char *mbstr, int len, int limit)
Definition: mbutils.c:967
#define Assert(condition)
Definition: c.h:738
void appendStringInfoStringQuoted(StringInfo str, const char *s, int maxlen)
Definition: stringinfo_mb.c:34