diff options
| author | Peter Eisentraut | 2013-10-13 04:09:18 +0000 |
|---|---|---|
| committer | Peter Eisentraut | 2013-10-13 04:09:18 +0000 |
| commit | 5b6d08cd2992922b667564a49f19580f11676050 (patch) | |
| tree | 4104a4255eeb88e78da71477b5f7b129f9a1b599 /src/common | |
| parent | a53dee43fe585e673658b01e7354892dcede957e (diff) | |
Add use of asprintf()
Add asprintf(), pg_asprintf(), and psprintf() to simplify string
allocation and composition. Replacement implementations taken from
NetBSD.
Reviewed-by: Álvaro Herrera <alvherre@2ndquadrant.com>
Reviewed-by: Asif Naeem <anaeem.it@gmail.com>
Diffstat (limited to 'src/common')
| -rw-r--r-- | src/common/fe_memutils.c | 39 | ||||
| -rw-r--r-- | src/common/relpath.c | 38 |
2 files changed, 49 insertions, 28 deletions
diff --git a/src/common/fe_memutils.c b/src/common/fe_memutils.c index bfe79f8e43..7b96a4b6ba 100644 --- a/src/common/fe_memutils.c +++ b/src/common/fe_memutils.c @@ -93,6 +93,25 @@ pg_free(void *ptr) free(ptr); } +int +pg_asprintf(char **ret, const char *format, ...) +{ + va_list ap; + int rc; + + va_start(ap, format); + rc = vasprintf(ret, format, ap); + va_end(ap); + + if (rc < 0) + { + fprintf(stderr, _("out of memory\n")); + exit(EXIT_FAILURE); + } + + return rc; +} + /* * Frontend emulation of backend memory management functions. Useful for * programs that compile backend files. @@ -126,3 +145,23 @@ repalloc(void *pointer, Size size) { return pg_realloc(pointer, size); } + +char * +psprintf(const char *format, ...) +{ + va_list ap; + int rc; + char *ret; + + va_start(ap, format); + rc = vasprintf(&ret, format, ap); + va_end(ap); + + if (rc < 0) + { + fprintf(stderr, _("out of memory\n")); + exit(EXIT_FAILURE); + } + + return ret; +} diff --git a/src/common/relpath.c b/src/common/relpath.c index 52f6b751e3..737003aefe 100644 --- a/src/common/relpath.c +++ b/src/common/relpath.c @@ -74,7 +74,6 @@ forkname_chars(const char *str, ForkNumber *fork) char * relpathbackend(RelFileNode rnode, BackendId backend, ForkNumber forknum) { - int pathlen; char *path; if (rnode.spcNode == GLOBALTABLESPACE_OID) @@ -82,41 +81,33 @@ relpathbackend(RelFileNode rnode, BackendId backend, ForkNumber forknum) /* Shared system relations live in {datadir}/global */ Assert(rnode.dbNode == 0); Assert(backend == InvalidBackendId); - pathlen = 7 + OIDCHARS + 1 + FORKNAMECHARS + 1; - path = (char *) palloc(pathlen); if (forknum != MAIN_FORKNUM) - snprintf(path, pathlen, "global/%u_%s", + path = psprintf("global/%u_%s", rnode.relNode, forkNames[forknum]); else - snprintf(path, pathlen, "global/%u", rnode.relNode); + path = psprintf("global/%u", rnode.relNode); } else if (rnode.spcNode == DEFAULTTABLESPACE_OID) { /* The default tablespace is {datadir}/base */ if (backend == InvalidBackendId) { - pathlen = 5 + OIDCHARS + 1 + OIDCHARS + 1 + FORKNAMECHARS + 1; - path = (char *) palloc(pathlen); if (forknum != MAIN_FORKNUM) - snprintf(path, pathlen, "base/%u/%u_%s", + path = psprintf("base/%u/%u_%s", rnode.dbNode, rnode.relNode, forkNames[forknum]); else - snprintf(path, pathlen, "base/%u/%u", + path = psprintf("base/%u/%u", rnode.dbNode, rnode.relNode); } else { - /* OIDCHARS will suffice for an integer, too */ - pathlen = 5 + OIDCHARS + 2 + OIDCHARS + 1 + OIDCHARS + 1 - + FORKNAMECHARS + 1; - path = (char *) palloc(pathlen); if (forknum != MAIN_FORKNUM) - snprintf(path, pathlen, "base/%u/t%d_%u_%s", + path = psprintf("base/%u/t%d_%u_%s", rnode.dbNode, backend, rnode.relNode, forkNames[forknum]); else - snprintf(path, pathlen, "base/%u/t%d_%u", + path = psprintf("base/%u/t%d_%u", rnode.dbNode, backend, rnode.relNode); } } @@ -125,34 +116,25 @@ relpathbackend(RelFileNode rnode, BackendId backend, ForkNumber forknum) /* All other tablespaces are accessed via symlinks */ if (backend == InvalidBackendId) { - pathlen = 9 + 1 + OIDCHARS + 1 - + strlen(TABLESPACE_VERSION_DIRECTORY) + 1 + OIDCHARS + 1 - + OIDCHARS + 1 + FORKNAMECHARS + 1; - path = (char *) palloc(pathlen); if (forknum != MAIN_FORKNUM) - snprintf(path, pathlen, "pg_tblspc/%u/%s/%u/%u_%s", + path = psprintf("pg_tblspc/%u/%s/%u/%u_%s", rnode.spcNode, TABLESPACE_VERSION_DIRECTORY, rnode.dbNode, rnode.relNode, forkNames[forknum]); else - snprintf(path, pathlen, "pg_tblspc/%u/%s/%u/%u", + path = psprintf("pg_tblspc/%u/%s/%u/%u", rnode.spcNode, TABLESPACE_VERSION_DIRECTORY, rnode.dbNode, rnode.relNode); } else { - /* OIDCHARS will suffice for an integer, too */ - pathlen = 9 + 1 + OIDCHARS + 1 - + strlen(TABLESPACE_VERSION_DIRECTORY) + 1 + OIDCHARS + 2 - + OIDCHARS + 1 + OIDCHARS + 1 + FORKNAMECHARS + 1; - path = (char *) palloc(pathlen); if (forknum != MAIN_FORKNUM) - snprintf(path, pathlen, "pg_tblspc/%u/%s/%u/t%d_%u_%s", + path = psprintf("pg_tblspc/%u/%s/%u/t%d_%u_%s", rnode.spcNode, TABLESPACE_VERSION_DIRECTORY, rnode.dbNode, backend, rnode.relNode, forkNames[forknum]); else - snprintf(path, pathlen, "pg_tblspc/%u/%s/%u/t%d_%u", + path = psprintf("pg_tblspc/%u/%s/%u/t%d_%u", rnode.spcNode, TABLESPACE_VERSION_DIRECTORY, rnode.dbNode, backend, rnode.relNode); } |
