[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