9d81c7e0a9dc4a295019b20f9a2a8ce0c775a397
[platform/upstream/rpm.git] / rpmdb / header_internal.c
1 /*@-sizeoftype@*/
2 /** \ingroup header
3  * \file rpmdb/header_internal.c
4  */
5
6 #include "system.h"
7
8 #include <header_internal.h>
9
10 #include "debug.h"
11
12 /*@-boundswrite@*/
13 char ** headerGetLangs(Header h)
14 {
15     char **s, *e, **table;
16     int i, type, count;
17
18     if (!headerGetRawEntry(h, HEADER_I18NTABLE, &type, (const void **)&s, &count))
19         return NULL;
20
21     /* XXX xcalloc never returns NULL. */
22     if ((table = (char **)xcalloc((count+1), sizeof(char *))) == NULL)
23         return NULL;
24
25     for (i = 0, e = *s; i < count; i++, e += strlen(e)+1)
26         table[i] = e;
27     table[count] = NULL;
28
29     /*@-nullret@*/ return table; /*@=nullret@*/ /* LCL: double indirection? */
30 }
31 /*@=boundswrite@*/
32
33 /*@-boundsread@*/
34 /*@-type@*/ /* FIX: shrug */
35 void headerDump(Header h, FILE *f, int flags,
36         const struct headerTagTableEntry_s * tags)
37 {
38     int i;
39     indexEntry p;
40     const struct headerTagTableEntry_s * tage;
41     const char * tag;
42     char * type;
43
44     /* First write out the length of the index (count of index entries) */
45     fprintf(f, "Entry count: %d\n", h->indexUsed);
46
47     /* Now write the index */
48     p = h->index;
49     fprintf(f, "\n             CT  TAG                  TYPE         "
50                 "      OFSET      COUNT\n");
51     for (i = 0; i < h->indexUsed; i++) {
52         switch (p->info.type) {
53         case RPM_NULL_TYPE:
54             type = "NULL";
55             /*@switchbreak@*/ break;
56         case RPM_CHAR_TYPE:
57             type = "CHAR";
58             /*@switchbreak@*/ break;
59         case RPM_BIN_TYPE:
60             type = "BIN";
61             /*@switchbreak@*/ break;
62         case RPM_INT8_TYPE:
63             type = "INT8";
64             /*@switchbreak@*/ break;
65         case RPM_INT16_TYPE:
66             type = "INT16";
67             /*@switchbreak@*/ break;
68         case RPM_INT32_TYPE:
69             type = "INT32";
70             /*@switchbreak@*/ break;
71         /*case RPM_INT64_TYPE:          type = "INT64";         break;*/
72         case RPM_STRING_TYPE:
73             type = "STRING";
74             /*@switchbreak@*/ break;
75         case RPM_STRING_ARRAY_TYPE:
76             type = "STRING_ARRAY";
77             /*@switchbreak@*/ break;
78         case RPM_I18NSTRING_TYPE:
79             type = "I18N_STRING";
80             /*@switchbreak@*/ break;
81         default:
82             type = "(unknown)";
83             /*@switchbreak@*/ break;
84         }
85
86         tage = tags;
87         while (tage->name && tage->val != p->info.tag) tage++;
88
89         if (!tage->name)
90             tag = "(unknown)";
91         else
92             tag = tage->name;
93
94         fprintf(f, "Entry      : %3.3d (%d)%-14s %-18s 0x%.8x %.8d\n", i,
95                 p->info.tag, tag, type, (unsigned) p->info.offset,
96                 (int) p->info.count);
97
98         if (flags & HEADER_DUMP_INLINE) {
99             char *dp = p->data;
100             int c = p->info.count;
101             int ct = 0;
102
103             /* Print the data inline */
104             switch (p->info.type) {
105             case RPM_INT32_TYPE:
106                 while (c--) {
107                     fprintf(f, "       Data: %.3d 0x%08x (%d)\n", ct++,
108                             (unsigned) *((int_32 *) dp),
109                             (int) *((int_32 *) dp));
110                     dp += sizeof(int_32);
111                 }
112                 /*@switchbreak@*/ break;
113
114             case RPM_INT16_TYPE:
115                 while (c--) {
116                     fprintf(f, "       Data: %.3d 0x%04x (%d)\n", ct++,
117                             (unsigned) (*((int_16 *) dp) & 0xffff),
118                             (int) *((int_16 *) dp));
119                     dp += sizeof(int_16);
120                 }
121                 /*@switchbreak@*/ break;
122             case RPM_INT8_TYPE:
123                 while (c--) {
124                     fprintf(f, "       Data: %.3d 0x%02x (%d)\n", ct++,
125                             (unsigned) (*((int_8 *) dp) & 0xff),
126                             (int) *((int_8 *) dp));
127                     dp += sizeof(int_8);
128                 }
129                 /*@switchbreak@*/ break;
130             case RPM_BIN_TYPE:
131                 while (c > 0) {
132                     fprintf(f, "       Data: %.3d ", ct);
133                     while (c--) {
134                         fprintf(f, "%02x ", (unsigned) (*(int_8 *)dp & 0xff));
135                         ct++;
136                         dp += sizeof(int_8);
137                         if (! (ct % 8)) {
138                             /*@loopbreak@*/ break;
139                         }
140                     }
141                     fprintf(f, "\n");
142                 }
143                 /*@switchbreak@*/ break;
144             case RPM_CHAR_TYPE:
145                 while (c--) {
146                     char ch = (char) *((char *) dp);
147                     fprintf(f, "       Data: %.3d 0x%2x %c (%d)\n", ct++,
148                             (unsigned)(ch & 0xff),
149                             (isprint(ch) ? ch : ' '),
150                             (int) *((char *) dp));
151                     dp += sizeof(char);
152                 }
153                 /*@switchbreak@*/ break;
154             case RPM_STRING_TYPE:
155             case RPM_STRING_ARRAY_TYPE:
156             case RPM_I18NSTRING_TYPE:
157                 while (c--) {
158                     fprintf(f, "       Data: %.3d %s\n", ct++, (char *) dp);
159                     dp = strchr(dp, 0);
160                     dp++;
161                 }
162                 /*@switchbreak@*/ break;
163             default:
164                 fprintf(stderr, _("Data type %d not supported\n"), 
165                         (int) p->info.type);
166                 /*@switchbreak@*/ break;
167             }
168         }
169         p++;
170     }
171 }
172 /*@=type@*/
173 /*@=sizeoftype@*/
174 /*@=boundsread@*/