[pacman-dev] [PATCH 2/2] util.c: tidy multiselect_parse

Andrew Gregory andrew.gregory.8 at gmail.com
Tue Apr 2 19:57:36 EDT 2013


* loop over strtok_r results directly
* set default value upfront because it depends solely on the first value
* don't strtrim values, parseindex already takes care of any whitespace
  not removed by strtok_r
* add doxygen

Signed-off-by: Andrew Gregory <andrew.gregory.8 at gmail.com>
---
 src/pacman/util.c | 65 +++++++++++++++++++++++++++++--------------------------
 1 file changed, 34 insertions(+), 31 deletions(-)

diff --git a/src/pacman/util.c b/src/pacman/util.c
index 115f328..ee67994 100644
--- a/src/pacman/util.c
+++ b/src/pacman/util.c
@@ -1311,55 +1311,58 @@ static int parseindex(char *s, int *val, int min, int max)
 	}
 }
 
+/**
+ * @brief Parse selected values from an input string.
+ *
+ * Multiple values may be separated by spaces or commas.  Ranges can be
+ * specified with '-'.  Values can be negated by prefixing them with '^'.
+ *
+ * @param array array of integers to hold selected values
+ * @param count number of options
+ * @param response string to parse
+ *
+ * @return 0 on success, -1 on error
+ */
 static int multiselect_parse(char *array, int count, char *response)
 {
 	char *str, *saveptr;
 
-	for(str = response; ; str = NULL) {
+	str = strtok_r(response, " ,", &saveptr);
+
+	/* if first token is including, we unselect all targets */
+	if(str && str[0] != '^') {
+			memset(array, 0, count);
+	}
+
+	for(; str; str = strtok_r(NULL, " ,", &saveptr)) {
 		int include = 1;
 		int start, end;
-		size_t len;
-		char *ends = NULL;
-		char *starts = strtok_r(str, " ,", &saveptr);
-
-		if(starts == NULL) {
-			break;
-		}
-		len = strtrim(starts);
-		if(len == 0)
-			continue;
+		char *ends;
 
-		if(*starts == '^') {
-			starts++;
-			len--;
+		if(str[0] == '^') {
+			str++;
 			include = 0;
-		} else if(str) {
-			/* if first token is including, we unselect all targets */
-			memset(array, 0, count);
 		}
 
-		if(len > 1) {
-			/* check for range */
-			char *p;
-			if((p = strchr(starts + 1, '-'))) {
-				*p = 0;
-				ends = p + 1;
-			}
+		/* check for a range */
+		if((ends = strchr(str + 1, '-'))) {
+			*ends = '\0';
+			ends++;
 		}
 
-		if(parseindex(starts, &start, 1, count) != 0)
+		if(parseindex(str, &start, 1, count) != 0) {
 			return -1;
+		}
 
-		if(!ends) {
-			array[start - 1] = include;
-		} else {
-			int d;
+		if(ends) {
 			if(parseindex(ends, &end, start, count) != 0) {
 				return -1;
 			}
-			for(d = start; d <= end; d++) {
-				array[d - 1] = include;
+			for(; start <= end; start++) {
+				array[start - 1] = include;
 			}
+		} else {
+			array[start - 1] = include;
 		}
 	}
 
-- 
1.8.2



More information about the pacman-dev mailing list