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:
parent
b904ab99bc
commit
0f4b9a9057
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=281182
@ -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
|
||||||
*/
|
*/
|
||||||
|
@ -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);
|
||||||
|
@ -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.
|
||||||
|
Loading…
Reference in New Issue
Block a user