@@ -233,6 +233,53 @@ process_array(const char *key, const char *val, bool (*validate)(const char *s))
233233	xbps_object_release (array );
234234}
235235
236+ static  void 
237+ process_keyval_array (const  char  * prop , const  char  * keyval , const  char  delim ,
238+ 					 bool  (* validate_key )(const  char  * ),
239+ 					 bool  (* validate_val )(const  char  * )) {
240+ 	xbps_dictionary_t  d ;
241+ 	xbps_array_t  a ;
242+ 	char  * key , * valstr ;
243+ 	bool  alloc  =  false;
244+ 
245+ 	if  ((d  =  xbps_dictionary_get (pkg_propsd , prop )) ==  NULL ) {
246+ 		d  =  xbps_dictionary_create ();
247+ 		if  (d  ==  NULL )
248+ 			die ("xbps_dictionary_create" );
249+ 		alloc  =  true;
250+ 	}
251+ 
252+ 	key  =  strdup (keyval );
253+ 	if  (key  ==  NULL )
254+ 		die ("strdup" );
255+ 	valstr  =  strchr (key , delim );
256+ 	* valstr  =  '\0' ;
257+ 	valstr  =  valstr  +  1 ;
258+ 	assert (valstr );
259+ 
260+ 	if  (validate_key  &&  !validate_key (key )) {
261+ 		diex ("%s: invalid key: %s" , prop , key );
262+ 	}
263+ 
264+ 	if  ((a  =  xbps_dictionary_get (d , key )) ==  NULL ) {
265+ 		a  =  xbps_array_create ();
266+ 		if  (a  ==  NULL )
267+ 			die ("xbps_array_create" );
268+ 	}
269+ 
270+ 	if  (validate_val  &&  !validate_val (valstr )) {
271+ 		diex ("%s: invalid value for key `%s': %s" , prop , key , valstr );
272+ 	}
273+ 
274+ 	xbps_array_add_cstring (a , valstr );
275+ 	xbps_dictionary_set (d , key , a );
276+ 	xbps_dictionary_set (pkg_propsd , prop , d );
277+ 	if  (alloc ) {
278+ 		xbps_object_release (a );
279+ 		xbps_object_release (d );
280+ 	}
281+ }
282+ 
236283static  void 
237284process_keyval_uint64 (const  char  * prop , const  char  * keyval , const  char  delim ,
238285					  bool  (* validate_key )(const  char  * ),
@@ -312,74 +359,6 @@ process_dict(const char *key, const char *val, const char delim,
312359	free (args );
313360}
314361
315- static  void 
316- process_one_alternative (const  char  * altgrname , const  char  * val )
317- {
318- 	xbps_dictionary_t  d ;
319- 	xbps_array_t  a ;
320- 	char  * altfiles ;
321- 	bool  alloc  =  false;
322- 
323- 	if  ((d  =  xbps_dictionary_get (pkg_propsd , "alternatives" )) ==  NULL ) {
324- 		d  =  xbps_dictionary_create ();
325- 		if  (d  ==  NULL )
326- 			die ("xbps_dictionary_create" );
327- 		alloc  =  true;
328- 	}
329- 	if  ((a  =  xbps_dictionary_get (d , altgrname )) ==  NULL ) {
330- 		a  =  xbps_array_create ();
331- 		if  (a  ==  NULL )
332- 			die ("xbps_array_create" );
333- 	}
334- 	altfiles  =  strchr (val , ':' ) +  1 ;
335- 	assert (altfiles );
336- 
337- 	xbps_array_add_cstring (a , altfiles );
338- 	xbps_dictionary_set (d , altgrname , a );
339- 	xbps_dictionary_set (pkg_propsd , "alternatives" , d );
340- 
341- 	if  (alloc ) {
342- 		xbps_object_release (a );
343- 		xbps_object_release (d );
344- 	}
345- }
346- 
347- 
348- static  void 
349- process_dict_of_arrays (const  char  * key  UNUSED , const  char  * val )
350- {
351- 	char  * altgrname , * args , * p , * saveptr ;
352- 
353- 	assert (key );
354- 
355- 	if  (val  ==  NULL )
356- 		return ;
357- 
358- 	args  =  strdup (val );
359- 	assert (args );
360- 
361- 	if  (strchr (args , ' ' ) ==  NULL ) {
362- 		altgrname  =  strtok (args , ":" );
363- 		assert (altgrname );
364- 		process_one_alternative (altgrname , val );
365- 		goto out ;
366- 	}
367- 
368- 	for  ((p  =  strtok_r (args , " " , & saveptr )); p ;
369- 	     (p  =  strtok_r (NULL , " " , & saveptr ))) {
370- 		char  * b ;
371- 
372- 		b  =  strdup (p );
373- 		assert (b );
374- 		altgrname  =  strtok (b , ":" );
375- 		assert (altgrname );
376- 		process_one_alternative (altgrname , p );
377- 		free (b );
378- 	}
379- out :
380- 	free (args );
381- }
382- 
383362static  void 
384363process_file (const  char  * file , const  char  * key )
385364{
@@ -1162,7 +1141,7 @@ main(int argc, char **argv)
11621141	process_array ("reverts" , reverts , NULL );
11631142	process_array ("shlib-provides" , shlib_provides , NULL );
11641143	process_array ("shlib-requires" , shlib_requires , NULL );
1165- 	process_dict_of_arrays ("alternatives" , alternatives );
1144+ 	process_dict ("alternatives" , alternatives ,  ':' ,  process_keyval_array ,  NULL ,  NULL );
11661145
11671146	/* save cwd */ 
11681147	memset (& cwd , 0 , sizeof (cwd ));
0 commit comments