rpm  4.5
header_internal.c
Go to the documentation of this file.
1 /*@-sizeoftype@*/
6 #include "system.h"
7 
8 #include <header_internal.h>
9 
10 #include "debug.h"
11 
12 /*@-boundswrite@*/
14 {
15  char **s, *e, **table;
16  int i, type, count;
17 
18  if (!headerGetRawEntry(h, HEADER_I18NTABLE, &type, &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;
76  type = "STRING_ARRAY";
77  /*@switchbreak@*/ break;
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:
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@*/