00001
00005 #include "system.h"
00006
00007 #include <header_internal.h>
00008
00009 #include "debug.h"
00010
00011 char ** headerGetLangs(Header h)
00012 {
00013 char **s, *e, **table;
00014 int i, type, count;
00015
00016 if (!headerGetRawEntry(h, HEADER_I18NTABLE, &type, (const void **)&s, &count))
00017 return NULL;
00018
00019
00020 if ((table = (char **)xcalloc((count+1), sizeof(char *))) == NULL)
00021 return NULL;
00022
00023 for (i = 0, e = *s; i < count > 0; i++, e += strlen(e)+1)
00024 table[i] = e;
00025 table[count] = NULL;
00026
00027 return table;
00028 }
00029
00030 void headerDump(Header h, FILE *f, int flags,
00031 const struct headerTagTableEntry_s * tags)
00032 {
00033 int i;
00034 indexEntry p;
00035 const struct headerTagTableEntry_s * tage;
00036 const char * tag;
00037 char * type;
00038
00039
00040 fprintf(f, "Entry count: %d\n", h->indexUsed);
00041
00042
00043 p = h->index;
00044 fprintf(f, "\n CT TAG TYPE "
00045 " OFSET COUNT\n");
00046 for (i = 0; i < h->indexUsed; i++) {
00047 switch (p->info.type) {
00048 case RPM_NULL_TYPE: type = "NULL"; break;
00049 case RPM_CHAR_TYPE: type = "CHAR"; break;
00050 case RPM_BIN_TYPE: type = "BIN"; break;
00051 case RPM_INT8_TYPE: type = "INT8"; break;
00052 case RPM_INT16_TYPE: type = "INT16"; break;
00053 case RPM_INT32_TYPE: type = "INT32"; break;
00054
00055 case RPM_STRING_TYPE: type = "STRING"; break;
00056 case RPM_STRING_ARRAY_TYPE: type = "STRING_ARRAY"; break;
00057 case RPM_I18NSTRING_TYPE: type = "I18N_STRING"; break;
00058 default: type = "(unknown)"; break;
00059 }
00060
00061 tage = tags;
00062 while (tage->name && tage->val != p->info.tag) tage++;
00063
00064 if (!tage->name)
00065 tag = "(unknown)";
00066 else
00067 tag = tage->name;
00068
00069 fprintf(f, "Entry : %3.3d (%d)%-14s %-18s 0x%.8x %.8d\n", i,
00070 p->info.tag, tag, type, (unsigned) p->info.offset,
00071 (int) p->info.count);
00072
00073 if (flags & HEADER_DUMP_INLINE) {
00074 char *dp = p->data;
00075 int c = p->info.count;
00076 int ct = 0;
00077
00078
00079 switch (p->info.type) {
00080 case RPM_INT32_TYPE:
00081 while (c--) {
00082 fprintf(f, " Data: %.3d 0x%08x (%d)\n", ct++,
00083 (unsigned) *((int_32 *) dp),
00084 (int) *((int_32 *) dp));
00085 dp += sizeof(int_32);
00086 }
00087 break;
00088
00089 case RPM_INT16_TYPE:
00090 while (c--) {
00091 fprintf(f, " Data: %.3d 0x%04x (%d)\n", ct++,
00092 (unsigned) (*((int_16 *) dp) & 0xffff),
00093 (int) *((int_16 *) dp));
00094 dp += sizeof(int_16);
00095 }
00096 break;
00097 case RPM_INT8_TYPE:
00098 while (c--) {
00099 fprintf(f, " Data: %.3d 0x%02x (%d)\n", ct++,
00100 (unsigned) (*((int_8 *) dp) & 0xff),
00101 (int) *((int_8 *) dp));
00102 dp += sizeof(int_8);
00103 }
00104 break;
00105 case RPM_BIN_TYPE:
00106 while (c > 0) {
00107 fprintf(f, " Data: %.3d ", ct);
00108 while (c--) {
00109 fprintf(f, "%02x ", (unsigned) (*(int_8 *)dp & 0xff));
00110 ct++;
00111 dp += sizeof(int_8);
00112 if (! (ct % 8)) {
00113 break;
00114 }
00115 }
00116 fprintf(f, "\n");
00117 }
00118 break;
00119 case RPM_CHAR_TYPE:
00120 while (c--) {
00121 char ch = (char) *((char *) dp);
00122 fprintf(f, " Data: %.3d 0x%2x %c (%d)\n", ct++,
00123 (unsigned)(ch & 0xff),
00124 (isprint(ch) ? ch : ' '),
00125 (int) *((char *) dp));
00126 dp += sizeof(char);
00127 }
00128 break;
00129 case RPM_STRING_TYPE:
00130 case RPM_STRING_ARRAY_TYPE:
00131 case RPM_I18NSTRING_TYPE:
00132 while (c--) {
00133 fprintf(f, " Data: %.3d %s\n", ct++, (char *) dp);
00134 dp = strchr(dp, 0);
00135 dp++;
00136 }
00137 break;
00138 default:
00139 fprintf(stderr, _("Data type %d not supported\n"),
00140 (int) p->info.type);
00141 break;
00142 }
00143 }
00144 p++;
00145 }
00146 }
00147