diff options
Diffstat (limited to 'contrib/string')
-rw-r--r-- | contrib/string/Makefile | 8 | ||||
-rw-r--r-- | contrib/string/string_io.c | 37 | ||||
-rw-r--r-- | contrib/string/string_io.h | 19 |
3 files changed, 35 insertions, 29 deletions
diff --git a/contrib/string/Makefile b/contrib/string/Makefile index b77ace937cf..dd8f0e6f2a6 100644 --- a/contrib/string/Makefile +++ b/contrib/string/Makefile @@ -11,10 +11,10 @@ SRCDIR = $(PGDIR)/src include $(SRCDIR)/Makefile.global -INCLUDE_OPT = -I ./ \ - -I $(SRCDIR)/ \ - -I $(SRCDIR)/include \ - -I $(SRCDIR)/port/$(PORTNAME) +INCLUDE_OPT = -I./ \ + -I$(SRCDIR)/ \ + -I$(SRCDIR)/include \ + -I$(SRCDIR)/port/$(PORTNAME) CFLAGS += $(INCLUDE_OPT) $(CFLAGS_SL) 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)); } diff --git a/contrib/string/string_io.h b/contrib/string/string_io.h index b1d2b7e2c28..e79d7fd28fe 100644 --- a/contrib/string/string_io.h +++ b/contrib/string/string_io.h @@ -1,19 +1,16 @@ #ifndef STRING_IO_H #define STRING_IO_H -char *string_output(char *data, int size); -char *string_input(char *str, int size, int hdrsize, int *rtn_size); -char *c_charout(int32 c); -char *c_char2out(uint16 s); -char *c_char4out(uint32 s); -char *c_char8out(char *s); -char *c_char16out(char *s); -char *c_textout(struct varlena * vlena); -char *c_varcharout(char *s); +unsigned char* string_output(unsigned char *data, int size); +unsigned char* string_input(unsigned char *str, int size, int hdrsize, + int *rtn_size); +unsigned char* c_charout(int32 c); +unsigned char* c_textout(struct varlena * vlena); +unsigned char* c_varcharout(unsigned char *s); #if 0 -struct varlena *c_textin(char *str); -char *c_char16in(char *str); +struct varlena* c_textin(unsigned char *str); +int32* c_charin(unsigned char *str) #endif #endif |