@@ -233,6 +233,56 @@ 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+ {
241+ xbps_dictionary_t d ;
242+ xbps_array_t a ;
243+ char * key , * valstr ;
244+ bool alloc = false;
245+
246+ if ((d = xbps_dictionary_get (pkg_propsd , prop )) == NULL ) {
247+ d = xbps_dictionary_create ();
248+ if (d == NULL )
249+ die ("xbps_dictionary_create" );
250+ alloc = true;
251+ }
252+
253+ key = strdup (keyval );
254+ if (key == NULL )
255+ die ("strdup" );
256+ if ((valstr = strchr (key , delim )) == NULL ) {
257+ die ("key-value missing delimiter" );
258+ }
259+ * valstr = '\0' ;
260+ valstr = valstr + 1 ;
261+ assert (valstr );
262+
263+ if (validate_key && !validate_key (key )) {
264+ diex ("%s: invalid key: %s" , prop , key );
265+ }
266+
267+ if ((a = xbps_dictionary_get (d , key )) == NULL ) {
268+ a = xbps_array_create ();
269+ if (a == NULL )
270+ die ("xbps_array_create" );
271+ }
272+
273+ if (validate_val && !validate_val (valstr )) {
274+ diex ("%s: invalid value for key `%s': %s" , prop , key , valstr );
275+ }
276+
277+ xbps_array_add_cstring (a , valstr );
278+ xbps_dictionary_set (d , key , a );
279+ xbps_dictionary_set (pkg_propsd , prop , d );
280+ if (alloc ) {
281+ xbps_object_release (a );
282+ xbps_object_release (d );
283+ }
284+ }
285+
236286static void
237287process_keyval_uint64 (const char * prop , const char * keyval , const char delim ,
238288 bool (* validate_key )(const char * ),
@@ -253,7 +303,9 @@ process_keyval_uint64(const char *prop, const char *keyval, const char delim,
253303 key = strdup (keyval );
254304 if (key == NULL )
255305 die ("strdup" );
256- valstr = strchr (key , delim );
306+ if ((valstr = strchr (key , delim )) == NULL ) {
307+ die ("key-value missing delimiter" );
308+ }
257309 * valstr = '\0' ;
258310 valstr = valstr + 1 ;
259311 assert (valstr );
@@ -314,74 +366,6 @@ process_dict(const char *key, const char *val, const char delim,
314366 free (args );
315367}
316368
317- static void
318- process_one_alternative (const char * altgrname , const char * val )
319- {
320- xbps_dictionary_t d ;
321- xbps_array_t a ;
322- char * altfiles ;
323- bool alloc = false;
324-
325- if ((d = xbps_dictionary_get (pkg_propsd , "alternatives" )) == NULL ) {
326- d = xbps_dictionary_create ();
327- if (d == NULL )
328- die ("xbps_dictionary_create" );
329- alloc = true;
330- }
331- if ((a = xbps_dictionary_get (d , altgrname )) == NULL ) {
332- a = xbps_array_create ();
333- if (a == NULL )
334- die ("xbps_array_create" );
335- }
336- altfiles = strchr (val , ':' ) + 1 ;
337- assert (altfiles );
338-
339- xbps_array_add_cstring (a , altfiles );
340- xbps_dictionary_set (d , altgrname , a );
341- xbps_dictionary_set (pkg_propsd , "alternatives" , d );
342-
343- if (alloc ) {
344- xbps_object_release (a );
345- xbps_object_release (d );
346- }
347- }
348-
349-
350- static void
351- process_dict_of_arrays (const char * key UNUSED , const char * val )
352- {
353- char * altgrname , * args , * p , * saveptr ;
354-
355- assert (key );
356-
357- if (val == NULL )
358- return ;
359-
360- args = strdup (val );
361- assert (args );
362-
363- if (strchr (args , ' ' ) == NULL ) {
364- altgrname = strtok (args , ":" );
365- assert (altgrname );
366- process_one_alternative (altgrname , val );
367- goto out ;
368- }
369-
370- for ((p = strtok_r (args , " " , & saveptr )); p ;
371- (p = strtok_r (NULL , " " , & saveptr ))) {
372- char * b ;
373-
374- b = strdup (p );
375- assert (b );
376- altgrname = strtok (b , ":" );
377- assert (altgrname );
378- process_one_alternative (altgrname , p );
379- free (b );
380- }
381- out :
382- free (args );
383- }
384-
385369static void
386370process_file (const char * file , const char * key )
387371{
@@ -1174,7 +1158,7 @@ main(int argc, char **argv)
11741158 process_array ("reverts" , reverts , NULL );
11751159 process_array ("shlib-provides" , shlib_provides , NULL );
11761160 process_array ("shlib-requires" , shlib_requires , NULL );
1177- process_dict_of_arrays ("alternatives" , alternatives );
1161+ process_dict ("alternatives" , alternatives , ':' , process_keyval_array , NULL , NULL );
11781162
11791163 /* save cwd */
11801164 memset (& cwd , 0 , sizeof (cwd ));
0 commit comments