Remove splint tags.
[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 extern int _rpmds_debug;
14
15 /**
16  */
17 extern int _rpmds_nopromote;
18
19 #if defined(_RPMDS_INTERNAL)
20 /**
21  * A package dependency set.
22  */
23 struct rpmds_s {
24     const char * Type;          /*!< Tag name. */
25     const char * DNEVR;         /*!< Formatted dependency string. */
26     Header h;                   /*!< Header for dependency set (or NULL) */
27     const char ** N;            /*!< Name. */
28     const char ** EVR;          /*!< Epoch-Version-Release. */
29     int_32 * Flags;             /*!< Bit(s) identifying context/comparison. */
30     uint_32 * Color;            /*!< Bit(s) calculated from file color(s). */
31     int_32 * Refs;              /*!< No. of file refs. */
32     int_32 BT;                  /*!< Package build time tie breaker. */
33     rpmTag tagN;                /*!< Header tag. */
34     rpmTagType Nt, EVRt, Ft;    /*!< Tag data types. */
35     int_32 Count;               /*!< No. of elements */
36     int i;                      /*!< Element index. */
37     unsigned l;                 /*!< Low element (bsearch). */
38     unsigned u;                 /*!< High element (bsearch). */
39     int nopromote;              /*!< Don't promote Epoch: in rpmdsCompare()? */
40     int nrefs;                  /*!< Reference count. */
41 };
42 #endif  /* _RPMDS_INTERNAL */
43
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47
48 /**
49  * Unreference a dependency set instance.
50  * @param ds            dependency set
51  * @param msg
52  * @return              NULL always
53  */
54 rpmds rpmdsUnlink (rpmds ds,
55                 const char * msg);
56
57 /** @todo Remove debugging entry from the ABI. */
58 rpmds XrpmdsUnlink (rpmds ds,
59                 const char * msg, const char * fn, unsigned ln);
60 #define rpmdsUnlink(_ds, _msg)  XrpmdsUnlink(_ds, _msg, __FILE__, __LINE__)
61
62 /**
63  * Reference a dependency set instance.
64  * @param ds            dependency set
65  * @param msg
66  * @return              new dependency set reference
67  */
68 rpmds rpmdsLink (rpmds ds, const char * msg);
69
70 /** @todo Remove debugging entry from the ABI. */
71 rpmds XrpmdsLink (rpmds ds, const char * msg,
72                 const char * fn, unsigned ln);
73 #define rpmdsLink(_ds, _msg)    XrpmdsLink(_ds, _msg, __FILE__, __LINE__)
74
75 /**
76  * Destroy a dependency set.
77  * @param ds            dependency set
78  * @return              NULL always
79  */
80 rpmds rpmdsFree(rpmds ds);
81 /**
82  * Create and load a dependency set.
83  * @deprecated Only scareMem = 0 will be permitted.
84  * @param h             header
85  * @param tagN          type of dependency
86  * @param flags         scareMem(0x1), nofilter(0x2)
87  * @return              new dependency set
88  */
89 rpmds rpmdsNew(Header h, rpmTag tagN, int flags);
90
91 /**
92  * Return new formatted dependency string.
93  * @param dspfx         formatted dependency string prefix
94  * @param ds            dependency set
95  * @return              new formatted dependency (malloc'ed)
96  */
97 char * rpmdsNewDNEVR(const char * dspfx, const rpmds ds);
98
99 /**
100  * Create, load and initialize a dependency for this header. 
101  * @param h             header
102  * @param tagN          type of dependency
103  * @param Flags         comparison flags
104  * @return              new dependency set
105  */
106 rpmds rpmdsThis(Header h, rpmTag tagN, int_32 Flags);
107
108 /**
109  * Create, load and initialize a dependency set of size 1.
110  * @param tagN          type of dependency
111  * @param N             name
112  * @param EVR           epoch:version-release
113  * @param Flags         comparison flags
114  * @return              new dependency set
115  */
116 rpmds rpmdsSingle(rpmTag tagN, const char * N, const char * EVR, int_32 Flags);
117
118 /**
119  * Return dependency set count.
120  * @param ds            dependency set
121  * @return              current count
122  */
123 int rpmdsCount(const rpmds ds);
124
125 /**
126  * Return dependency set index.
127  * @param ds            dependency set
128  * @return              current index
129  */
130 int rpmdsIx(const rpmds ds);
131
132 /**
133  * Set dependency set index.
134  * @param ds            dependency set
135  * @param ix            new index
136  * @return              current index
137  */
138 int rpmdsSetIx(rpmds ds, int ix);
139
140 /**
141  * Return current formatted dependency string.
142  * @param ds            dependency set
143  * @return              current dependency DNEVR, NULL on invalid
144  */
145 extern const char * rpmdsDNEVR(const rpmds ds);
146
147 /**
148  * Return current dependency name.
149  * @param ds            dependency set
150  * @return              current dependency name, NULL on invalid
151  */
152 extern const char * rpmdsN(const rpmds ds);
153
154 /**
155  * Return current dependency epoch-version-release.
156  * @param ds            dependency set
157  * @return              current dependency EVR, NULL on invalid
158  */
159 extern const char * rpmdsEVR(const rpmds ds);
160
161 /**
162  * Return current dependency flags.
163  * @param ds            dependency set
164  * @return              current dependency flags, 0 on invalid
165  */
166 int_32 rpmdsFlags(const rpmds ds);
167
168 /**
169  * Return current dependency type.
170  * @param ds            dependency set
171  * @return              current dependency type, 0 on invalid
172  */
173 rpmTag rpmdsTagN(const rpmds ds);
174
175 /**
176  * Return dependency build time.
177  * @param ds            dependency set
178  * @return              dependency build time, 0 on invalid
179  */
180 time_t rpmdsBT(const rpmds ds);
181
182 /**
183  * Set dependency build time.
184  * @param ds            dependency set
185  * @param BT            build time
186  * @return              dependency build time, 0 on invalid
187  */
188 time_t rpmdsSetBT(const rpmds ds, time_t BT);
189
190 /**
191  * Return current "Don't promote Epoch:" flag.
192  *
193  * This flag controls for Epoch: promotion when a dependency set is
194  * compared. If the flag is set (for already installed packages), then
195  * an unspecified value will be treated as Epoch: 0. Otherwise (for added
196  * packages), the Epoch: portion of the comparison is skipped if the value
197  * is not specified, i.e. an unspecified Epoch: is assumed to be equal
198  * in dependency comparisons.
199  *
200  * @param ds            dependency set
201  * @return              current "Don't promote Epoch:" flag
202  */
203 int rpmdsNoPromote(const rpmds ds);
204
205 /**
206  * Set "Don't promote Epoch:" flag.
207  * @param ds            dependency set
208  * @param nopromote     Should an unspecified Epoch: be treated as Epoch: 0?
209  * @return              previous "Don't promote Epoch:" flag
210  */
211 int rpmdsSetNoPromote(rpmds ds, int nopromote);
212
213 /**
214  * Return current dependency color.
215  * @param ds            dependency set
216  * @return              current dependency color
217  */
218 uint_32 rpmdsColor(const rpmds ds);
219
220 /**
221  * Return current dependency color.
222  * @param ds            dependency set
223  * @param color         new dependency color
224  * @return              previous dependency color
225  */
226 uint_32 rpmdsSetColor(const rpmds ds, uint_32 color);
227
228 /**
229  * Return current dependency file refs.
230  * @param ds            dependency set
231  * @return              current dependency file refs, -1 on global
232  */
233 int_32 rpmdsRefs(const rpmds ds);
234
235 /**
236  * Return current dependency color.
237  * @param ds            dependency set
238  * @param refs          new dependency refs
239  * @return              previous dependency refs
240  */
241 int_32 rpmdsSetRefs(const rpmds ds, int_32 refs);
242
243 /**
244  * Notify of results of dependency match.
245  * @param ds            dependency set
246  * @param where         where dependency was resolved (or NULL)
247  * @param rc            0 == YES, otherwise NO
248  */
249 /* FIX: rpmMessage annotation is a lie */
250 void rpmdsNotify(rpmds ds, const char * where, int rc);
251
252 /**
253  * Return next dependency set iterator index.
254  * @param ds            dependency set
255  * @return              dependency set iterator index, -1 on termination
256  */
257 int rpmdsNext(rpmds ds);
258
259 /**
260  * Initialize dependency set iterator.
261  * @param ds            dependency set
262  * @return              dependency set
263  */
264 rpmds rpmdsInit(rpmds ds);
265
266 /**
267  * Find a dependency set element using binary search.
268  * @param ds            dependency set to search
269  * @param ods           dependency set element to find.
270  * @return              dependency index (or -1 if not found)
271  */
272 int rpmdsFind(rpmds ds, const rpmds ods);
273
274 /**
275  * Merge a dependency set maintaining (N,EVR,Flags) sorted order.
276  * @retval *dsp         (merged) dependency set
277  * @param ods           dependency set to merge
278  * @return              (merged) dependency index
279  */
280 int rpmdsMerge(rpmds * dsp, rpmds ods);
281
282 /**
283  * Compare two versioned dependency ranges, looking for overlap.
284  * @param A             1st dependency
285  * @param B             2nd dependency
286  * @return              1 if dependencies overlap, 0 otherwise
287  */
288 int rpmdsCompare(const rpmds A, const rpmds B);
289
290 /**
291  * Report a Requires: or Conflicts: dependency problem.
292  * @param ps            transaction set problems
293  * @param pkgNEVR       package name/epoch/version/release
294  * @param ds            dependency set
295  * @param suggestedKeys filename or python object address
296  * @param adding        dependency problem is from added package set?
297  */
298 void rpmdsProblem(rpmps ps, const char * pkgNEVR, const rpmds ds,
299                 const fnpyKey * suggestedKeys,
300                 int adding);
301
302 /**
303  * Compare package provides dependencies from header with a single dependency.
304  * @param h             header
305  * @param req           dependency set
306  * @param nopromote     Don't promote Epoch: in comparison?
307  * @return              1 if any dependency overlaps, 0 otherwise
308  */
309 int rpmdsAnyMatchesDep (const Header h, const rpmds req, int nopromote);
310
311 /**
312  * Compare package name-version-release from header with a single dependency.
313  * @param h             header
314  * @param req           dependency set
315  * @param nopromote     Don't promote Epoch: in comparison?
316  * @return              1 if dependency overlaps, 0 otherwise
317  */
318 int rpmdsNVRMatchesDep(const Header h, const rpmds req, int nopromote);
319
320 #ifdef __cplusplus
321 }
322 #endif
323
324 #endif  /* H_RPMDS */