added virtual query tag ability, fsnames query tag,
[platform/upstream/rpm.git] / lib / header.h
1 /* RPM - Copyright (C) 1995 Red Hat Software
2  * 
3  * header.h - routines for managing rpm tagged structures
4  */
5
6 /* WARNING: 1 means success, 0 means failure (yes, this is backwards) */
7
8 #ifndef H_HEADER
9 #define H_HEADER
10 #include <stdio.h>
11
12 #if defined(__alpha__)
13 typedef long int int_64;
14 typedef int int_32;
15 typedef short int int_16;
16 typedef char int_8;
17
18 typedef unsigned int uint_32;
19 typedef unsigned short uint_16;
20
21 #else
22
23 typedef long long int int_64;
24 typedef int int_32;
25 typedef short int int_16;
26 typedef char int_8;
27
28 typedef unsigned int uint_32;
29 typedef unsigned short uint_16;
30 #endif
31
32 typedef struct headerToken *Header;
33 typedef struct headerIteratorS *HeaderIterator;
34
35 struct headerTagTableEntry {
36     char * name;
37     int val;
38 };
39
40 enum headerSprintfExtenstionType { HEADER_EXT_LAST = 0, HEADER_EXT_FORMAT,
41                                    HEADER_EXT_MORE, HEADER_EXT_TAG };
42
43 /* This will only ever be passed RPM_TYPE_INT32 or RPM_TYPE_STRING to
44    help keep things simple */
45 typedef char * (*headerTagFormatFunction)(int_32 type, const void * data, 
46                                           char * formatPrefix,
47                                           int padding, int element);
48 typedef int (*headerTagTagFunction)(Header h, int_32 * type, void ** data,
49                                        int_32 * count, int * freeData);
50
51 struct headerSprintfExtension {
52     enum headerSprintfExtenstionType type;
53     char * name;
54     union {
55         void * generic;
56         headerTagFormatFunction formatFunction;
57         headerTagTagFunction tagFunction;
58         struct headerSprintfExtension * more;
59     } u;
60 };
61
62 /* This defines some basic conversions all header users would probably like
63    to have */
64 extern const struct headerSprintfExtension headerDefaultFormats[];
65
66 /* read and write a header from a file */
67 Header headerRead(int fd, int magicp);
68 void headerWrite(int fd, Header h, int magicp);
69 unsigned int headerSizeof(Header h, int magicp);
70
71 #define HEADER_MAGIC_NO   0
72 #define HEADER_MAGIC_YES  1
73
74 /* load and unload a header from a chunk of memory */
75 Header headerLoad(void *p);
76 void *headerUnload(Header h);
77
78 Header headerNew(void);
79 void headerFree(Header h);
80
81 /* dump a header to a file, in human readable format */
82 void headerDump(Header h, FILE *f, int flags, 
83                 const struct headerTagTableEntry * tags);
84
85 /* the returned string must be free()d */
86 char * headerSprintf(Header h, const char * fmt, 
87                      const struct headerTagTableEntry * tags,
88                      const struct headerSprintfExtension * extentions,
89                      char ** error);
90
91 #define HEADER_DUMP_INLINE   1
92
93 /* I18N items need an RPM_STRING_TYPE entry (used by default) and an
94    RPM_18NSTRING_TYPE table added. Dups are okay, but only defined for
95    iteration (with the exceptions noted below) */
96 int headerAddEntry(Header h, int_32 tag, int_32 type, void *p, int_32 c);
97 int headerModifyEntry(Header h, int_32 tag, int_32 type, void *p, int_32 c);
98
99 /* Appends item p to entry w/ tag and type as passed. Won't work on
100    RPM_STRING_TYPE. Any pointers from headerGetEntry() for this entry
101    are invalid after this call has been made! */
102 int headerAppendEntry(Header h, int_32 tag, int_32 type, void * p, int_32 c);
103
104 /* Will never return RPM_I18NSTRING_TYPE! RPM_STRING_TYPE elements w/
105    RPM_I18NSTRING_TYPE equivalent enreies are translated (if HEADER_I18NTABLE
106    entry is present). */
107 int headerGetEntry(Header h, int_32 tag, int_32 *type, void **p, int_32 *c);
108
109 /* If *type is RPM_NULL_TYPE any type will match, otherwise only *type will
110    match. */
111 int headerGetRawEntry(Header h, int_32 tag, int_32 *type, void **p, int_32 *c);
112
113 int headerIsEntry(Header h, int_32 tag);
114 /* removes all entries of type tag from the header, returns 1 if none were
115    found */
116 int headerRemoveEntry(Header h, int_32 tag);
117
118 HeaderIterator headerInitIterator(Header h);
119 int headerNextIterator(HeaderIterator iter,
120                        int_32 *tag, int_32 *type, void **p, int_32 *c);
121 void headerFreeIterator(HeaderIterator iter);
122
123 Header headerCopy(Header h);
124 void headerSort(Header h);
125
126 /* Entry Types */
127
128 #define RPM_NULL_TYPE           0
129 #define RPM_CHAR_TYPE           1
130 #define RPM_INT8_TYPE           2
131 #define RPM_INT16_TYPE          3
132 #define RPM_INT32_TYPE          4
133 /* #define RPM_INT64_TYPE       5   ---- These aren't supported (yet) */
134 #define RPM_STRING_TYPE         6
135 #define RPM_BIN_TYPE            7
136 #define RPM_STRING_ARRAY_TYPE   8
137 #define RPM_I18NSTRING_TYPE     9
138
139 /* Tags -- general use tags should start at 1000 (RPM's tag space starts 
140    there) */
141
142 #define HEADER_I18NTABLE        100
143
144 #endif H_HEADER