I have use for a tool to merge .solv files.
[platform/upstream/libsolv.git] / tools / mergesolv.c
1 /*
2  * mergesolv
3  * 
4  */
5
6 #include <sys/types.h>
7 #include <limits.h>
8 #include <fcntl.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <assert.h>
13
14 #include "pool.h"
15 #include "source_solv.h"
16 #include "source_write.h"
17
18 static void
19 adjust (Id **val, Id * new_id, Source *source)
20 {
21   if (!*val)
22     return;
23   assert (source->idarraydata <= *val);
24   assert (*val < source->idarraydata + source->idarraysize);
25   *val = new_id + (*val - source->idarraydata);
26 }
27
28 int
29 main(int argc, char **argv)
30 {
31   Pool *pool = pool_create();
32   int i;
33   int new_id_size;
34   Id *new_id;
35
36   while (argc-- > 1)
37     {
38       FILE *fp;
39       argv++;
40       if ((fp = fopen(*argv, "r")) == NULL)
41         {
42           perror(argv[1]);
43           exit(0);
44         }
45       pool_addsource_solv(pool, fp, "");
46       fclose(fp);
47     }
48   if (!pool->nsources)
49     return 0;
50
51   new_id_size = 0;
52   for (i = 0; i < pool->nsources; i++)
53     new_id_size += pool->sources[i]->idarraysize;
54   new_id = (Id*) malloc (sizeof (Id) * new_id_size);
55   new_id_size = 0;
56   for (i = 0; i < pool->nsources; i++)
57     {
58       Source *source = pool->sources[i];
59       int si;
60       memcpy (new_id + new_id_size, source->idarraydata,
61               source->idarraysize * sizeof (new_id[0]));
62       for (si = source->start; si < source->start + source->nsolvables; si++)
63         {
64           Solvable *s = pool->solvables + si;
65           adjust (&s->provides, new_id + new_id_size, source);
66           adjust (&s->obsoletes, new_id + new_id_size, source);
67           adjust (&s->conflicts, new_id + new_id_size, source);
68           adjust (&s->requires, new_id + new_id_size, source);
69           adjust (&s->recommends, new_id + new_id_size, source);
70           adjust (&s->suggests, new_id + new_id_size, source);
71           adjust (&s->supplements, new_id + new_id_size, source);
72           adjust (&s->enhances, new_id + new_id_size, source);
73           adjust (&s->freshens, new_id + new_id_size, source);
74         }
75       new_id_size += source->idarraysize;
76       if (i > 0)
77         {
78           pool->sources[0]->nsolvables += source->nsolvables;
79           source->nsolvables = 0;
80           source->start = pool->nsolvables;
81           free (source->idarraydata);
82           source->idarraydata = 0;
83         }
84     }
85   while (pool->nsources > 1)
86     {
87       pool_freesource (pool, pool->sources[1]);
88     }
89   free (pool->sources[0]->idarraydata);
90   pool->sources[0]->idarraydata = new_id;
91   pool->sources[0]->idarraysize = new_id_size;
92
93   pool_writesource(pool, pool->sources[0], stdout);
94   pool_free(pool);
95
96   return 0;
97 }