@@ -233,6 +233,53 @@ process_array(const char *key, const char *val, bool (*validate)(const char *s))
233
233
xbps_object_release (array );
234
234
}
235
235
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
+
236
283
static void
237
284
process_keyval_uint64 (const char * prop , const char * keyval , const char delim ,
238
285
bool (* validate_key )(const char * ),
@@ -312,74 +359,6 @@ process_dict(const char *key, const char *val, const char delim,
312
359
free (args );
313
360
}
314
361
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
-
383
362
static void
384
363
process_file (const char * file , const char * key )
385
364
{
@@ -1162,7 +1141,7 @@ main(int argc, char **argv)
1162
1141
process_array ("reverts" , reverts , NULL );
1163
1142
process_array ("shlib-provides" , shlib_provides , NULL );
1164
1143
process_array ("shlib-requires" , shlib_requires , NULL );
1165
- process_dict_of_arrays ("alternatives" , alternatives );
1144
+ process_dict ("alternatives" , alternatives , ':' , process_keyval_array , NULL , NULL );
1166
1145
1167
1146
/* save cwd */
1168
1147
memset (& cwd , 0 , sizeof (cwd ));
0 commit comments