Remove custom getdelim(3) and fix a small memory leak.

Originally from Andre Smagin.

Obtained from:	OpenBSD
MFC after:	1 week
This commit is contained in:
Pedro F. Giffuni 2015-04-07 01:17:49 +00:00
parent b904ab99bc
commit 0f4b9a9057
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=281182
3 changed files with 27 additions and 71 deletions

View File

@ -187,42 +187,6 @@ file_is_tmp(const char* fn)
return (ret); return (ret);
} }
/*
* Read zero-terminated line from a file
*/
char *
read_file0_line(struct file0_reader *f0r)
{
size_t pos = 0;
int c;
if ((f0r->f == NULL) || feof(f0r->f))
return (NULL);
if (f0r->current_line && f0r->current_sz > 0)
f0r->current_line[0] = 0;
while (!feof(f0r->f)) {
c = fgetc(f0r->f);
if (feof(f0r->f) || (c == -1))
break;
if ((pos + 1) >= f0r->current_sz) {
size_t newsz = (f0r->current_sz + 2) * 2;
f0r->current_line = sort_realloc(f0r->current_line,
newsz);
f0r->current_sz = newsz;
}
f0r->current_line[pos] = (char)c;
if (c == 0)
break;
else
f0r->current_line[pos + 1] = 0;
++pos;
}
return f0r->current_line;
}
/* /*
* Generate new temporary file name * Generate new temporary file name
*/ */

View File

@ -70,16 +70,6 @@ struct file_list
bool tmp; bool tmp;
}; };
/*
* Structure for zero-separated file reading (for input files list)
*/
struct file0_reader
{
char *current_line;
FILE *f;
size_t current_sz;
};
/* memory */ /* memory */
/**/ /**/
@ -110,8 +100,6 @@ struct file_reader *file_reader_init(const char *fsrc);
struct bwstring *file_reader_readline(struct file_reader *fr); struct bwstring *file_reader_readline(struct file_reader *fr);
void file_reader_free(struct file_reader *fr); void file_reader_free(struct file_reader *fr);
char *read_file0_line(struct file0_reader *f0r);
void init_tmp_files(void); void init_tmp_files(void);
void clear_tmp_files(void); void clear_tmp_files(void);
char *new_tmp_file_name(void); char *new_tmp_file_name(void);

View File

@ -229,21 +229,20 @@ usage(bool opt_err)
static void static void
read_fns_from_file0(const char *fn) read_fns_from_file0(const char *fn)
{ {
if (fn) {
struct file0_reader f0r;
FILE *f; FILE *f;
char *line = NULL;
size_t linesize = 0;
ssize_t linelen;
if (fn == NULL)
return;
f = fopen(fn, "r"); f = fopen(fn, "r");
if (f == NULL) if (f == NULL)
err(2, NULL); err(2, "%s", fn);
memset(&f0r, 0, sizeof(f0r)); while ((linelen = getdelim(&line, &linesize, '\0', f)) != -1) {
f0r.f = f; if (*line != '\0') {
while (!feof(f)) {
char *line = read_file0_line(&f0r);
if (line && *line) {
if (argc_from_file0 == (size_t) - 1) if (argc_from_file0 == (size_t) - 1)
argc_from_file0 = 0; argc_from_file0 = 0;
++argc_from_file0; ++argc_from_file0;
@ -251,13 +250,18 @@ read_fns_from_file0(const char *fn)
argc_from_file0 * sizeof(char *)); argc_from_file0 * sizeof(char *));
if (argv_from_file0 == NULL) if (argv_from_file0 == NULL)
err(2, NULL); err(2, NULL);
argv_from_file0[argc_from_file0 - 1] = argv_from_file0[argc_from_file0 - 1] = line;
sort_strdup(line); } else {
free(line);
} }
line = NULL;
linesize = 0;
} }
if (ferror(f))
err(2, "%s: getdelim", fn);
closefile(f, fn); closefile(f, fn);
} }
}
/* /*
* Check how much RAM is available for the sort. * Check how much RAM is available for the sort.