diff options
Diffstat (limited to 'src/bin/initdb/initdb.c')
-rw-r--r-- | src/bin/initdb/initdb.c | 46 |
1 files changed, 14 insertions, 32 deletions
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index 73ddf408654..861b8817b93 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -468,14 +468,11 @@ filter_lines_with_token(char **lines, const char *token) static char ** readfile(const char *path) { + char **result; FILE *infile; - int maxlength = 1, - linelen = 0; - int nlines = 0; + int maxlines; int n; - char **result; - char *buffer; - int c; + char *ln; if ((infile = fopen(path, "r")) == NULL) { @@ -483,39 +480,24 @@ readfile(const char *path) exit(1); } - /* pass over the file twice - the first time to size the result */ + maxlines = 1024; + result = (char **) pg_malloc(maxlines * sizeof(char *)); - while ((c = fgetc(infile)) != EOF) + n = 0; + while ((ln = pg_get_line(infile)) != NULL) { - linelen++; - if (c == '\n') + /* make sure there will be room for a trailing NULL pointer */ + if (n >= maxlines - 1) { - nlines++; - if (linelen > maxlength) - maxlength = linelen; - linelen = 0; + maxlines *= 2; + result = (char **) pg_realloc(result, maxlines * sizeof(char *)); } - } - - /* handle last line without a terminating newline (yuck) */ - if (linelen) - nlines++; - if (linelen > maxlength) - maxlength = linelen; - /* set up the result and the line buffer */ - result = (char **) pg_malloc((nlines + 1) * sizeof(char *)); - buffer = (char *) pg_malloc(maxlength + 1); - - /* now reprocess the file and store the lines */ - rewind(infile); - n = 0; - while (fgets(buffer, maxlength + 1, infile) != NULL && n < nlines) - result[n++] = pg_strdup(buffer); + result[n++] = ln; + } + result[n] = NULL; fclose(infile); - free(buffer); - result[n] = NULL; return result; } |