Pull together attribute store and repo. dumpsolv actually now really
[platform/upstream/libsolv.git] / tools / dumpsolv.c
1 /*
2  * Copyright (c) 2007, Novell Inc.
3  *
4  * This program is licensed under the BSD license, read LICENSE.BSD
5  * for further information
6  */
7
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <unistd.h>
11 #include <string.h>
12
13 #include "pool.h"
14 #include "repo_solv.h"
15 #include "attr_store.h"
16 #include "attr_store_p.h"
17
18 static void
19 dump_attrs_1 (Attrstore *s, unsigned int entry)
20 {
21   attr_iterator ai;
22   FOR_ATTRS (s, entry, &ai)
23     {
24       fprintf (stdout, "%s:", id2str (s->pool, ai.name));
25       switch (ai.type)
26         {
27         case TYPE_ATTR_INT:
28           fprintf (stdout, "int  %u\n", ai.as_int);
29           break;
30         case TYPE_ATTR_CHUNK:
31           {
32             const char *str = attr_retrieve_blob (s, ai.as_chunk[0], ai.as_chunk[1]);
33             if (str)
34               fprintf (stdout, "blob %s\n", str);
35             else
36               fprintf (stdout, "blob %u+%u\n", ai.as_chunk[0], ai.as_chunk[1]);
37           }
38           break;
39         case TYPE_ATTR_STRING:
40           fprintf (stdout, "str  %s\n", ai.as_string);
41           break;
42         case TYPE_ATTR_INTLIST:
43           {
44             fprintf (stdout, "lint\n ");
45             while (1)
46               {
47                 int val;
48                 get_num (ai.as_numlist, val);
49                 if (!val)
50                   break;
51                 fprintf (stdout, " %d", val);
52               }
53             fprintf (stdout, "\n");
54             break;
55           }
56         case TYPE_ATTR_LOCALIDS:
57           {
58             fprintf (stdout, "lids");
59             while (1)
60               {
61                 Id val;
62                 get_num (ai.as_numlist, val);
63                 if (!val)
64                   break;
65                 fprintf (stdout, "\n  %s(%d)", localid2str (s, val), val);
66               }
67             fprintf (stdout, "\n");
68             break;
69           }
70         default:
71           break;
72         }
73     }
74 }
75
76 static void
77 dump_attrs (Repo *repo, unsigned int entry)
78 {
79   unsigned i;
80   for (i = 0; i < repo->nrepodata; i++)
81     {
82       Attrstore *s = repo->repodata[i].s;
83       if (s && entry < s->entries)
84         dump_attrs_1 (s, entry);
85     }
86 }
87
88 static void
89 printids(Repo *repo, char *kind, Offset ido)
90 {
91   Pool *pool = repo->pool;
92   Id id, *ids;
93   if (!ido)
94     return;
95   printf("%s:\n", kind);
96   ids = repo->idarraydata + ido;
97   while((id = *ids++) != 0)
98     printf("  %s\n", dep2str(pool, id));
99 }
100
101 int main(int argc, char **argv)
102 {
103   Repo *repo;
104   Pool *pool;
105   int i, n;
106   Solvable *s;
107
108   if (argc != 1)
109     {
110       if (freopen(argv[1], "r", stdin) == 0)
111         {
112           perror(argv[1]);
113           exit(1);
114         }
115     }
116   pool = pool_create();
117   repo = repo_create(pool, argc != 1 ? argv[1] : "<stdin>");
118   repo_add_solv(repo, stdin);
119   printf("repo contains %d solvables\n", repo->nsolvables);
120   for (i = repo->start, n = 1; i < repo->end; i++)
121     {
122       s = pool->solvables + i;
123       if (s->repo != repo)
124         continue;
125       printf("\n");
126       printf("solvable %d:\n", n);
127       if (s->name || s->evr || s->arch)
128         printf("name: %s %s %s\n", id2str(pool, s->name), id2str(pool, s->evr), id2str(pool, s->arch));
129       if (s->vendor)
130         printf("vendor: %s\n", id2str(pool, s->vendor));
131       printids(repo, "provides", s->provides);
132       printids(repo, "obsoletes", s->obsoletes);
133       printids(repo, "conflicts", s->conflicts);
134       printids(repo, "requires", s->requires);
135       printids(repo, "recommends", s->recommends);
136       printids(repo, "suggests", s->suggests);
137       printids(repo, "supplements", s->supplements);
138       printids(repo, "enhances", s->enhances);
139       printids(repo, "freshens", s->freshens);
140       dump_attrs (repo, n - 1);
141       n++;
142     }
143   pool_free(pool);
144   exit(0);
145 }