aboutsummaryrefslogtreecommitdiff
path: root/contrib/string/string_io.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/string/string_io.c')
-rw-r--r--contrib/string/string_io.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/contrib/string/string_io.c b/contrib/string/string_io.c
index e1fc867497f..9407e6a21b3 100644
--- a/contrib/string/string_io.c
+++ b/contrib/string/string_io.c
@@ -50,8 +50,8 @@
* representation of data.
*/
-char *
-string_output(char *data, int size)
+unsigned char *
+string_output(unsigned char *data, int size)
{
register unsigned char c,
*p,
@@ -79,8 +79,6 @@ string_output(char *data, int size)
{
case '\\':
case '"':
- case '{':
- case '}':
case '\b':
case '\f':
case '\n':
@@ -89,6 +87,12 @@ string_output(char *data, int size)
case '\v':
len++;
break;
+ case '{':
+ /* Escape beginning of string, to distinguish from arrays */
+ if (p == data) {
+ len++;
+ }
+ break;
default:
if (NOTPRINTABLE(*p))
len += 3;
@@ -104,8 +108,6 @@ string_output(char *data, int size)
{
case '\\':
case '"':
- case '{':
- case '}':
*r++ = '\\';
*r++ = c;
break;
@@ -133,6 +135,13 @@ string_output(char *data, int size)
*r++ = '\\';
*r++ = 'v';
break;
+ case '{':
+ /* Escape beginning of string, to distinguish from arrays */
+ if (p == data) {
+ *r++ = '\\';
+ }
+ *r++ = c;
+ break;
default:
if (NOTPRINTABLE(c))
{
@@ -180,8 +189,8 @@ string_output(char *data, int size)
* a pointer to the new string or the header.
*/
-char *
-string_input(char *str, int size, int hdrsize, int *rtn_size)
+unsigned char *
+string_input(unsigned char *str, int size, int hdrsize, int *rtn_size)
{
register unsigned char *p,
*r;
@@ -285,7 +294,7 @@ string_input(char *str, int size, int hdrsize, int *rtn_size)
return ((char *) result);
}
-char *
+unsigned char *
c_charout(int32 c)
{
char str[2];
@@ -300,7 +309,7 @@ c_charout(int32 c)
* This can be used for SET, bytea, text and unknown data types
*/
-char *
+unsigned char *
c_textout(struct varlena * vlena)
{
int len = 0;
@@ -318,8 +327,8 @@ c_textout(struct varlena * vlena)
* This can be used for varchar and bpchar strings
*/
-char *
-c_varcharout(char *s)
+unsigned char *
+c_varcharout(unsigned char *s)
{
int len = 0;
@@ -333,7 +342,7 @@ c_varcharout(char *s)
#if 0
struct varlena *
-c_textin(char *str)
+c_textin(unsigned char *str)
{
struct varlena *result;
int len;
@@ -348,7 +357,7 @@ c_textin(char *str)
}
int32 *
-c_charin(char *str)
+c_charin(unsigned char *str)
{
return (string_input(str, 1, 0, NULL));
}