00001 #ifndef H_HEADER_INTERNAL
00002 #define H_HEADER_INTERNAL
00003
00008 #include <header.h>
00009
00010 #if !defined(__LCLINT__)
00011 #include <netinet/in.h>
00012 #endif
00013
00014 #define INDEX_MALLOC_SIZE 8
00015
00016
00017
00018
00019 #define HEADER_OLDFILENAMES 1027
00020 #define HEADER_BASENAMES 1117
00021
00025 typedef struct entryInfo * entryInfo;
00026 struct entryInfo {
00027 int_32 tag;
00028 int_32 type;
00029 int_32 offset;
00030 int_32 count;
00031 };
00032
00033 #define REGION_TAG_TYPE RPM_BIN_TYPE
00034 #define REGION_TAG_COUNT sizeof(struct entryInfo)
00035
00036 #define ENTRY_IS_REGION(_e) \
00037 (((_e)->info.tag >= HEADER_IMAGE) && ((_e)->info.tag < HEADER_REGIONS))
00038 #define ENTRY_IN_REGION(_e) ((_e)->info.offset < 0)
00039
00043 typedef struct indexEntry * indexEntry;
00044 struct indexEntry {
00045 struct entryInfo info;
00046 void * data;
00047 int length;
00048 int rdlen;
00049 };
00050
00054 struct headerToken {
00055 struct HV_s hv;
00056 void * blob;
00057 indexEntry index;
00058 int indexUsed;
00059 int indexAlloced;
00060 int flags;
00061 #define HEADERFLAG_SORTED (1 << 0)
00062 #define HEADERFLAG_ALLOCATED (1 << 1)
00063 #define HEADERFLAG_LEGACY (1 << 2)
00064 int nrefs;
00065 };
00066
00069 typedef struct sprintfTag * sprintfTag;
00070 struct sprintfTag {
00071 headerTagTagFunction ext;
00072 int extNum;
00073 int_32 tag;
00074 int justOne;
00075 int arrayCount;
00076 char * format;
00077 char * type;
00078 int pad;
00079 };
00080
00083 typedef struct extensionCache * extensionCache;
00084 struct extensionCache {
00085 int_32 type;
00086 int_32 count;
00087 int avail;
00088 int freeit;
00089 const void * data;
00090 };
00091
00094
00095 typedef struct sprintfToken * sprintfToken;
00096 struct sprintfToken {
00097 enum {
00098 PTOK_NONE = 0,
00099 PTOK_TAG,
00100 PTOK_ARRAY,
00101 PTOK_STRING,
00102 PTOK_COND
00103 } type;
00104 union {
00105 struct {
00106 sprintfToken format;
00107 int numTokens;
00108 } array;
00109 struct sprintfTag tag;
00110 struct {
00111 char * string;
00112 int len;
00113 } string;
00114 struct {
00115 sprintfToken ifFormat;
00116 int numIfTokens;
00117 sprintfToken elseFormat;
00118 int numElseTokens;
00119 struct {
00120 enum { TRIVIAL, StringTAG_String3 } type;
00121 union {
00122 struct sprintfTag tag;
00123 struct {
00124 int (*predicate)(const char * head, const char * const tail[3]);
00125
00126 sprintfToken headFormat;
00127 int numHeadTokens;
00128 const char * tail[3];
00129 } tag_str3;
00130 } u;
00131 } test;
00132 } cond;
00133 } u;
00134 };
00135
00136
00137 #ifdef __cplusplus
00138 extern "C" {
00139 #endif
00140
00147
00148 char ** headerGetLangs(Header h)
00149 ;
00150
00163
00164 int headerGetRawEntry(Header h, int_32 tag,
00165 hTYP_t type,
00166 hPTR_t * p,
00167 hCNT_t c)
00168 ;
00169
00170
00176 static inline int headerUsageCount(Header h) {
00177 return h->nrefs;
00178 }
00179
00187
00188 void headerDump(Header h, FILE *f, int flags,
00189 const struct headerTagTableEntry_s * tags)
00190 ;
00191 #define HEADER_DUMP_INLINE 1
00192
00193 #ifdef __cplusplus
00194 }
00195 #endif
00196
00197 #endif