diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/pacman/pacman.c | 18 | ||||
| -rw-r--r-- | src/pacman/util.c | 34 | ||||
| -rw-r--r-- | src/pacman/util.h | 1 | 
3 files changed, 51 insertions, 2 deletions
| diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index 9f0293f8..31d31da1 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -315,6 +315,8 @@ static int parseargs(int argc, char *argv[])  	};  	while((opt = getopt_long(argc, argv, "ARUFQSTr:b:vkhscVfmnoldepituwygz", opts, &option_index))) { +		alpm_list_t *list = NULL, *item = NULL; /* lists for splitting strings */ +  		if(opt < 0) {  			break;  		} @@ -327,7 +329,13 @@ static int parseargs(int argc, char *argv[])  				}  				config->configfile = strndup(optarg, PATH_MAX);  				break; -			case 1002: alpm_option_add_ignorepkg(strdup(optarg)); break; +			case 1002: +				list = strsplit(optarg, ','); +				for(item = list; item; item = alpm_list_next(item)) { +					alpm_option_add_ignorepkg((char *)alpm_list_getdata(item)); +				} +				FREELIST(list); +				break;  			case 1003:  				/* debug levels are made more 'human readable' than using a raw logmask  				 * here, error and warning are set in config_new, though perhaps a @@ -371,7 +379,13 @@ static int parseargs(int argc, char *argv[])  				}  				config->have_logfile = 1;  				break; -			case 1010: alpm_option_add_ignoregrp(strdup(optarg)); break; +			case 1010: +				list = strsplit(optarg, ','); +				for(item = list; item; item = alpm_list_next(item)) { +					alpm_option_add_ignoregrp((char *)alpm_list_getdata(item)); +				} +				FREELIST(list); +				break;  			case 'A': config->op = (config->op != PM_OP_MAIN ? 0 : PM_OP_ADD); break;  			case 'F':  				config->op = (config->op != PM_OP_MAIN ? 0 : PM_OP_UPGRADE); diff --git a/src/pacman/util.c b/src/pacman/util.c index b91ec131..a0402ab0 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -293,6 +293,40 @@ char *strreplace(const char *str, const char *needle, const char *replace)  	return newstr;  } +/** Splits a string into a list of strings using the chosen character as + * a delimiter. + * + * @param str the string to split + * @param splitchar the character to split at + * + * @return a list containing the duplicated strings + */ +alpm_list_t *strsplit(const char *str, const char splitchar) +{ +	alpm_list_t *list = NULL; +	const char *prev = str; +	char *dup = NULL; + +	while((str = strchr(str, splitchar))) { +		dup = strndup(prev, str - prev); +		if(dup == NULL) { +			return(NULL); +		} +		list = alpm_list_add(list, dup); + +		str++; +		prev = str; +	} + +	dup = strdup(prev); +	if(dup == NULL) { +		return(NULL); +	} +	list = alpm_list_add(list, strdup(prev)); + +	return(list); +} +  void list_display(const char *title, const alpm_list_t *list)  {  	const alpm_list_t *i; diff --git a/src/pacman/util.h b/src/pacman/util.h index 4d17b179..931b456b 100644 --- a/src/pacman/util.h +++ b/src/pacman/util.h @@ -46,6 +46,7 @@ void indentprint(const char *str, int indent);  char *strtoupper(char *str);  char *strtrim(char *str);  char *strreplace(const char *str, const char *needle, const char *replace); +alpm_list_t *strsplit(const char *str, const char splitchar);  void list_display(const char *title, const alpm_list_t *list);  void display_targets(const alpm_list_t *syncpkgs, pmdb_t *db_local);  int yesno(char *fmt, ...); | 
