[pacman-dev] [PATCH 09/11] pacman.c: simplify stdin parsing
Andrew Gregory
andrew.gregory.8 at gmail.com
Fri Aug 1 17:19:52 EDT 2014
Incorporate memory exhaustion and end-of-stream
checks into the main loop.
Signed-off-by: Andrew Gregory <andrew.gregory.8 at gmail.com>
---
src/pacman/pacman.c | 27 ++++++++-------------------
1 file changed, 8 insertions(+), 19 deletions(-)
diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index 12a4f7a..345fb0a 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"),
--
2.0.2
More information about the pacman-dev
mailing list