*** empty log message ***
[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_TAG, HEADER_EXT_FORMAT,
41                                    HEADER_EXT_MORE, HEADER_EXT_LAST = 0};
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
49 struct headerSprintfExtension {
50     enum headerSprintfExtenstionType type;
51     char * name;
52     union {
53         void * generic;
54         headerTagFormatFunction formatFunction;
55         struct headerSprintfExtension * more;
56     } u;
57 };
58
59 /* This defines some basic conversions all header users would probably like
60    to have */
61 extern const struct headerSprintfExtension headerDefaultFormats[];
62
63 /* read and write a header from a file */
64 Header headerRead(int fd, int magicp);
65 void headerWrite(int fd, Header h, int magicp);
66 unsigned int headerSizeof(Header h, int magicp);
67
68 #define HEADER_MAGIC_NO   0
69 #define HEADER_MAGIC_YES  1
70
71 /* load and unload a header from a chunk of memory */
72 Header headerLoad(void *p);
73 void *headerUnload(Header h);
74
75 Header headerNew(void);
76 void headerFree(Header h);
77
78 /* dump a header to a file, in human readable format */
79 void headerDump(Header h, FILE *f, int flags, 
80                 const struct headerTagTableEntry * tags);
81
82 /* the returned string must be free()d */
83 char * headerSprintf(Header h, const char * fmt, 
84                      const struct headerTagTableEntry * tags,
85                      const struct headerSprintfExtension * extentions,
86                      char ** error);
87
88 #define HEADER_DUMP_INLINE   1
89
90 /* I18N items need an RPM_STRING_TYPE entry (used by default) and an
91    RPM_18NSTRING_TYPE table added. Dups are okay, but only defined for
92    iteration (with the exceptions noted below) */
93 int headerAddEntry(Header h, int_32 tag, int_32 type, void *p, int_32 c);
94 int headerModifyEntry(Header h, int_32 tag, int_32 type, void *p, int_32 c);
95
96 /* Appends item p to entry w/ tag and type as passed. Won't work on
97    RPM_STRING_TYPE. Any pointers from headerGetEntry() for this entry
98    are invalid after this call has been made! */
99 int headerAppendEntry(Header h, int_32 tag, int_32 type, void * p, int_32 c);
100
101 /* Will never return RPM_I18NSTRING_TYPE! RPM_STRING_TYPE elements w/
102    RPM_I18NSTRING_TYPE equivalent enreies are translated (if HEADER_I18NTABLE
103    entry is present). */
104 int headerGetEntry(Header h, int_32 tag, int_32 *type, void **p, int_32 *c);
105
106 /* If *type is RPM_NULL_TYPE any type will match, otherwise only *type will
107    match. */
108 int headerGetRawEntry(Header h, int_32 tag, int_32 *type, void **p, int_32 *c);
109
110 int headerIsEntry(Header h, int_32 tag);
111 /* removes all entries of type tag from the header, returns 1 if none were
112    found */
113 int headerRemoveEntry(Header h, int_32 tag);
114
115 HeaderIterator headerInitIterator(Header h);
116 int headerNextIterator(HeaderIterator iter,
117                        int_32 *tag, int_32 *type, void **p, int_32 *c);
118 void headerFreeIterator(HeaderIterator iter);
119
120 Header headerCopy(Header h);
121 void headerSort(Header h);
122
123 /* Entry Types */
124
125 #define RPM_NULL_TYPE           0
126 #define RPM_CHAR_TYPE           1
127 #define RPM_INT8_TYPE           2
128 #define RPM_INT16_TYPE          3
129 #define RPM_INT32_TYPE          4
130 /* #define RPM_INT64_TYPE       5   ---- These aren't supported (yet) */
131 #define RPM_STRING_TYPE         6
132 #define RPM_BIN_TYPE            7
133 #define RPM_STRING_ARRAY_TYPE   8
134 #define RPM_I18NSTRING_TYPE     9
135
136 /* Tags -- general use tags should start at 1000 (RPM's tag space starts 
137    there) */
138
139 #define HEADER_I18NTABLE        100
140
141 #endif H_HEADER