From 4ccf49d3e74bf2af010fc90d9cd6fbeb71402f99 Mon Sep 17 00:00:00 2001 From: Andrew Gregory Date: Fri, 1 Aug 2014 14:19:52 -0700 Subject: pacman.c: simplify stdin parsing Incorporate memory exhaustion and end-of-stream checks into the main loop. Signed-off-by: Andrew Gregory Signed-off-by: Allan McRae --- src/pacman/pacman.c | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index 12a4f7a3..345fb0a3 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -1087,9 +1087,9 @@ int main(int argc, char *argv[]) free(vdata); i = 0; - while((c = fgetc(stdin)) != EOF) { - line[i] = (char)c; - if(isspace((unsigned char)line[i])) { + do { + c = fgetc(stdin); + if(c == EOF || isspace(c)) { /* avoid adding zero length arg when multiple spaces separate args */ if(i > 0) { line[i] = '\0'; @@ -1098,7 +1098,7 @@ int main(int argc, char *argv[]) i = 0; } } else { - i++; + line[i++] = (char)c; /* we may be at the end of our allocated buffer now */ if(i >= current_size) { char *new = realloc(line, current_size * 2); @@ -1107,25 +1107,14 @@ int main(int argc, char *argv[]) current_size *= 2; } else { free(line); - line = NULL; - break; + pm_printf(ALPM_LOG_ERROR, + _("memory exhausted in argument parsing\n")); + cleanup(EXIT_FAILURE); } } } - } - - /* check for memory exhaustion */ - if(!line) { - pm_printf(ALPM_LOG_ERROR, _("memory exhausted in argument parsing\n")); - cleanup(EXIT_FAILURE); - } + } while(c != EOF); - /* end of stream -- check for data still in line buffer */ - if(i > 0) { - line[i] = '\0'; - pm_targets = alpm_list_add(pm_targets, strdup(line)); - target_found = 1; - } free(line); if(!freopen(ctermid(NULL), "r", stdin)) { pm_printf(ALPM_LOG_ERROR, _("failed to reopen stdin for reading: (%s)\n"), -- cgit v1.2.3-24-g4f1b