split line reading function - iomenu - interactive terminal-based selection menu
HTML git clone git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu
DIR Log
DIR Files
DIR Refs
DIR Tags
DIR README
DIR LICENSE
---
DIR commit 376d9cfc1451c3e416065b0fdd958c491b9b4a93
DIR parent 223058fdf9e2427b8ec9ec01df7185c074b545a7
HTML Author: Josuah Demangeon <mail@josuah.net>
Date: Sun, 15 Oct 2017 23:26:30 +0200
split line reading function
Diffstat:
M iomenu.c | 41 ++++++++++++++++++++-----------
1 file changed, 26 insertions(+), 15 deletions(-)
---
DIR diff --git a/iomenu.c b/iomenu.c
@@ -53,13 +53,31 @@ die(const char *s)
exit(EXIT_FAILURE);
}
+static char *
+read_line(FILE *fp)
+{
+ char *line;
+ size_t len;
+
+ line = malloc(LINE_MAX + 1);
+ if (!(fgets(line, LINE_MAX, fp))) {
+ free(line);
+ return NULL;
+ }
+
+ len = strlen(line);
+ if (len > 0 && line[len - 1] == '\n')
+ line[len - 1] = '\0';
+
+ return (line);
+}
+
static void
-read_lines(void)
+read_stdin(void)
{
int size = 0;
- size_t len;
- do {
+ while (1) {
if (linec >= size) {
size += BUFSIZ;
linev = realloc(linev, sizeof (char **) * size);
@@ -67,18 +85,11 @@ read_lines(void)
if (!linev || !matchv)
die("realloc");
}
-
- linev[linec] = malloc(LINE_MAX + 1);
- if (!(fgets(linev[linec], LINE_MAX, stdin))) {
- free(linev[linec]);
+ if ((linev[linec] = read_line(stdin)) == NULL)
break;
- }
-
- len = strlen(linev[linec]);
- if (len > 0 && linec[linev][len - 1] == '\n')
- linev[linec][len - 1] = '\0';
-
- } while (++linec, ++matchc);
+ linec++;
+ matchc++;
+ }
}
static void
@@ -537,7 +548,7 @@ main(int argc, char *argv[])
parse_opt(argc, argv);
- read_lines();
+ read_stdin();
filter();
if (!freopen("/dev/tty", "r", stdin)) die("freopen /dev/tty");