diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index 3e05ac3..ca085c2 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -354,6 +354,18 @@ pg_strdup(const char *s) return result; } +static char * +escape_quotes(const char *src) +{ + char *result = escape_single_quotes(src); + if (!result) + { + fprintf(stderr, _("%s: out of memory\n"), progname); + exit(1); + } + return result; +} + /* * make a copy of the array of lines, with token replaced by replacement * the first time it occurs on each line. @@ -2415,35 +2427,6 @@ check_ok(void) } } -/* - * Escape (by doubling) any single quotes or backslashes in given string - * - * Note: this is used to process both postgresql.conf entries and SQL - * string literals. Since postgresql.conf strings are defined to treat - * backslashes as escapes, we have to double backslashes here. Hence, - * when using this for a SQL string literal, use E'' syntax. - * - * We do not need to worry about encoding considerations because all - * valid backend encodings are ASCII-safe. - */ -static char * -escape_quotes(const char *src) -{ - int len = strlen(src), - i, - j; - char *result = pg_malloc(len * 2 + 1); - - for (i = 0, j = 0; i < len; i++) - { - if (SQL_STR_DOUBLE(src[i], true)) - result[j++] = src[i]; - result[j++] = src[i]; - } - result[j] = '\0'; - return result; -} - /* Hack to suppress a warning about %x from some versions of gcc */ static inline size_t my_strftime(char *s, size_t max, const char *fmt, const struct tm * tm) diff --git a/src/include/port.h b/src/include/port.h index c429c77..b5a11c3 100644 --- a/src/include/port.h +++ b/src/include/port.h @@ -465,4 +465,7 @@ extern int pg_check_dir(const char *dir); /* port/pgmkdirp.c */ extern int pg_mkdir_p(char *path, int omode); +/* port/quotes.c */ +extern char *escape_single_quotes(const char *src); + #endif /* PG_PORT_H */ diff --git a/src/port/Makefile b/src/port/Makefile index bace576..04253f8 100644 --- a/src/port/Makefile +++ b/src/port/Makefile @@ -32,7 +32,7 @@ LIBS += $(PTHREAD_LIBS) OBJS = $(LIBOBJS) chklocale.o dirmod.o erand48.o exec.o fls.o inet_net_ntop.o \ noblock.o path.o pgcheckdir.o pg_crc.o pgmkdirp.o pgsleep.o \ - pgstrcasecmp.o qsort.o qsort_arg.o sprompt.o thread.o + pgstrcasecmp.o quotes.o qsort.o qsort_arg.o sprompt.o thread.o # foo_srv.o and foo.o are both built from foo.c, but only foo.o has -DFRONTEND OBJS_SRV = $(OBJS:%.o=%_srv.o) diff --git a/src/port/quotes.c b/src/port/quotes.c new file mode 100644 index 0000000..989fea6 --- /dev/null +++ b/src/port/quotes.c @@ -0,0 +1,37 @@ +#include "c.h" + +/* + * Escape (by doubling) any single quotes or backslashes in given string + * + * Note: this is used to process both postgresql.conf entries and SQL + * string literals. Since postgresql.conf strings are defined to treat + * backslashes as escapes, we have to double backslashes here. Hence, + * when using this for a SQL string literal, use E'' syntax. + * + * We do not need to worry about encoding considerations because all + * valid backend encodings are ASCII-safe. + * + * Returns a malloced() string that it's the responsibility of the caller + * to free. + */ +char * +escape_single_quotes(const char *src) +{ + int len = strlen(src), + i, + j; + char *result = malloc(len * 2 + 1); + + if (!result) + return NULL; + + for (i = 0, j = 0; i < len; i++) + { + if (SQL_STR_DOUBLE(src[i], true)) + result[j++] = src[i]; + result[j++] = src[i]; + } + result[j] = '\0'; + return result; +} +