- install rpmal.h and rpmhash.h, implicit rpmps.hinclude, for now.
[platform/upstream/rpm.git] / lib / rpmds.h
1 #ifndef H_RPMDS
2 #define H_RPMDS
3
4 /** \ingroup rpmdep rpmtrans
5  * \file lib/rpmds.h
6  * Structure(s) used for dependency tag sets.
7  */
8
9 #include "rpmps.h"
10
11 /**
12  */
13 /*@-exportlocal@*/
14 /*@unchecked@*/
15 extern int _rpmds_debug;
16 /*@=exportlocal@*/
17
18 #if defined(_RPMDS_INTERNAL)
19 /**
20  * A package dependency set.
21  */
22 struct rpmds_s {
23     int i;                      /*!< Element index. */
24
25 /*@observer@*/
26     const char * Type;          /*!< Tag name. */
27 /*@only@*/ /*@null@*/
28     const char * DNEVR;         /*!< Formatted dependency string. */
29
30     rpmTag tagN;                /*!< Header tag. */
31 /*@refcounted@*/ /*@null@*/
32     Header h;                   /*!< Header for dependency set (or NULL) */
33
34 /*@only@*/
35     const char ** N;            /*!< Name. */
36 /*@only@*/
37     const char ** EVR;          /*!< Epoch-Version-Release. */
38 /*@only@*/
39     int_32 * Flags;             /*!< Flags identifying context/comparison. */
40     rpmTagType Nt, EVRt, Ft;    /*!< Tag data types. */
41     int_32 Count;               /*!< No. of elements */
42 /*@refs@*/
43     int nrefs;                  /*!< Reference count. */
44 };
45 #endif  /* _RPMDS_INTERNAL */
46
47 #ifdef __cplusplus
48 extern "C" {
49 #endif
50
51 /**
52  * Unreference a dependency set instance.
53  * @param ds            dependency set
54  * @param msg
55  * @return              NULL always
56  */
57 /*@unused@*/ /*@null@*/
58 rpmds rpmdsUnlink (/*@killref@*/ /*@only@*/ /*@null@*/ rpmds ds,
59                 /*@null@*/ const char * msg)
60         /*@modifies ds @*/;
61
62 /** @todo Remove debugging entry from the ABI. */
63 /*@-exportlocal@*/
64 /*@null@*/
65 rpmds XrpmdsUnlink (/*@killref@*/ /*@only@*/ /*@null@*/ rpmds ds,
66                 /*@null@*/ const char * msg, const char * fn, unsigned ln)
67         /*@modifies ds @*/;
68 /*@=exportlocal@*/
69 #define rpmdsUnlink(_ds, _msg)  XrpmdsUnlink(_ds, _msg, __FILE__, __LINE__)
70
71 /**
72  * Reference a dependency set instance.
73  * @param ds            dependency set
74  * @param msg
75  * @return              new dependency set reference
76  */
77 /*@unused@*/ /*@newref@*/
78 rpmds rpmdsLink (/*@null@*/ rpmds ds, /*@null@*/ const char * msg)
79         /*@modifies ds @*/;
80
81 /** @todo Remove debugging entry from the ABI. */
82 /*@newref@*/
83 rpmds XrpmdsLink (/*@null@*/ rpmds ds, /*@null@*/ const char * msg,
84                 const char * fn, unsigned ln)
85         /*@modifies ds @*/;
86 #define rpmdsLink(_ds, _msg)    XrpmdsLink(_ds, _msg, __FILE__, __LINE__)
87
88 /**
89  * Destroy a dependency set.
90  * @param ds            dependency set
91  * @return              NULL always
92  */
93 /*@null@*/
94 rpmds rpmdsFree(/*@killref@*/ /*@only@*/ /*@null@*/ rpmds ds)
95         /*@modifies ds@*/;
96 /**
97  * Create and load a dependency set.
98  * @param h             header
99  * @param tagN          type of dependency
100  * @param scareMem      Use pointers to refcounted header memory?
101  * @return              new dependency set
102  */
103 /*@null@*/
104 rpmds rpmdsNew(Header h, rpmTag tagN, int scareMem)
105         /*@modifies h @*/;
106
107 /**
108  * Return new formatted dependency string.
109  * @param dspfx         formatted dependency string prefix
110  * @param ds            dependency set
111  * @return              new formatted dependency (malloc'ed)
112  */
113 /*@only@*/
114 char * rpmdsNewDNEVR(const char * dspfx, const rpmds ds)
115         /*@*/;
116
117 /**
118  * Create, load and initialize a dependency for this header. 
119  * @param h             header
120  * @param tagN          type of dependency
121  * @param Flags         comparison flags
122  * @return              new dependency set
123  */
124 /*@null@*/
125 rpmds rpmdsThis(Header h, rpmTag tagN, int_32 Flags)
126         /*@*/;
127
128 /**
129  * Create, load and initialize a dependency set of size 1.
130  * @param tagN          type of dependency
131  * @param N             name
132  * @param EVR           epoch:version-release
133  * @param Flags         comparison flags
134  * @return              new dependency set
135  */
136 /*@null@*/
137 rpmds rpmdsSingle(rpmTag tagN, const char * N, const char * EVR, int_32 Flags)
138         /*@*/;
139
140 /**
141  * Return dependency set count.
142  * @param ds            dependency set
143  * @return              current count
144  */
145 int rpmdsCount(/*@null@*/ const rpmds ds)
146         /*@*/;
147
148 /**
149  * Return dependency set index.
150  * @param ds            dependency set
151  * @return              current index
152  */
153 int rpmdsIx(/*@null@*/ const rpmds ds)
154         /*@*/;
155
156 /**
157  * Set dependency set index.
158  * @param ds            dependency set
159  * @param ix            new index
160  * @return              current index
161  */
162 int rpmdsSetIx(/*@null@*/ rpmds ds, int ix)
163         /*@modifies ds @*/;
164
165 /**
166  * Return current formatted dependency string.
167  * @param ds            dependency set
168  * @return              current dependency DNEVR, NULL on invalid
169  */
170 /*@observer@*/ /*@null@*/
171 extern const char * rpmdsDNEVR(/*@null@*/ const rpmds ds)
172         /*@*/;
173
174 /**
175  * Return current dependency name.
176  * @param ds            dependency set
177  * @return              current dependency name, NULL on invalid
178  */
179 /*@observer@*/ /*@null@*/
180 extern const char * rpmdsN(/*@null@*/ const rpmds ds)
181         /*@*/;
182
183 /**
184  * Return current dependency epoch-version-release.
185  * @param ds            dependency set
186  * @return              current dependency EVR, NULL on invalid
187  */
188 /*@observer@*/ /*@null@*/
189 extern const char * rpmdsEVR(/*@null@*/ const rpmds ds)
190         /*@*/;
191
192 /**
193  * Return current dependency flags.
194  * @param ds            dependency set
195  * @return              current dependency flags, 0 on invalid
196  */
197 int_32 rpmdsFlags(/*@null@*/ const rpmds ds)
198         /*@*/;
199
200 /**
201  * Return current dependency type.
202  * @param ds            dependency set
203  * @return              current dependency type, 0 on invalid
204  */
205 rpmTag rpmdsTagN(/*@null@*/ const rpmds ds)
206         /*@*/;
207
208 /**
209  * Notify of results of dependency match.
210  * @param ds            dependency set
211  * @param where         where dependency was resolved (or NULL)
212  * @param rc            0 == YES, otherwise NO
213  */
214 /*@-globuse@*/ /* FIX: rpmMessage annotation is a lie */
215 void rpmdsNotify(/*@null@*/ rpmds ds, /*@null@*/ const char * where, int rc)
216         /*@globals fileSystem @*/
217         /*@modifies fileSystem @*/;
218 /*@=globuse@*/
219
220 /**
221  * Return next dependency set iterator index.
222  * @param ds            dependency set
223  * @return              dependency set iterator index, -1 on termination
224  */
225 int rpmdsNext(/*@null@*/ rpmds ds)
226         /*@modifies ds @*/;
227
228 /**
229  * Initialize dependency set iterator.
230  * @param ds            dependency set
231  * @return              dependency set
232  */
233 /*@null@*/
234 rpmds rpmdsInit(/*@null@*/ rpmds ds)
235         /*@modifies ds @*/;
236
237 /**
238  * Compare two versioned dependency ranges, looking for overlap.
239  * @param A             1st dependency
240  * @param B             2nd dependency
241  * @return              1 if dependencies overlap, 0 otherwise
242  */
243 int rpmdsCompare(const rpmds A, const rpmds B)
244         /*@*/;
245
246 /**
247  * Report a Requires: or Conflicts: dependency problem.
248  * @param ps            transaction set problems
249  * @param pkgNEVR       package name/epoch/version/release
250  * @param ds            dependency set
251  * @param suggestedKeys filename or python object address
252  * @param adding        dependency problem is from added package set?
253  */
254 void rpmdsProblem(/*@null@*/ rpmps ps, const char * pkgNEVR, const rpmds ds,
255                 /*@only@*/ /*@null@*/ const fnpyKey * suggestedKeys,
256                 int adding)
257         /*@modifies ps @*/;
258
259 /**
260  * Compare package provides dependencies from header with a single dependency.
261  * @param h             header
262  * @param req           dependency set
263  */
264 int rangeMatchesDepFlags (Header h, const rpmds req)
265         /*@modifies h @*/;
266
267 /**
268  * Compare package name-version-release from header with a single dependency.
269  * @deprecated Remove from API when obsoletes is correctly implemented.
270  * @param h             header
271  * @param req           dependency
272  * @return              1 if dependency overlaps, 0 otherwise
273  */
274 int headerMatchesDepFlags(const Header h, const rpmds req)
275         /*@*/;
276
277 #ifdef __cplusplus
278 }
279 #endif
280
281 #endif  /* H_RPMDS */