]> git.ipfire.org Git - pakfire.git/blob - tools/rpmiotypes.h
04891a174d42755bb76a7a30896eae2fe1d4a48d
[pakfire.git] / tools / rpmiotypes.h
1 #ifndef _H_RPMIOTYPES_
2 #define _H_RPMIOTYPES_
3
4 /** \ingroup rpmio
5 * \file rpmio/rpmiotypes.h
6 */
7
8 /** \ingroup rpmio
9 * RPM return codes.
10 */
11 typedef enum rpmRC_e {
12 RPMRC_OK = 0, /*!< Generic success code */
13 RPMRC_NOTFOUND = 1, /*!< Generic not found code. */
14 RPMRC_FAIL = 2, /*!< Generic failure code. */
15 RPMRC_NOTTRUSTED = 3, /*!< Signature is OK, but key is not trusted. */
16 RPMRC_NOKEY = 4 /*!< Public key is unavailable. */
17 } rpmRC;
18
19 /** \ingroup rpmio
20 * Private int typedefs to avoid C99 portability issues.
21 */
22 typedef /*@unsignedintegraltype@*/ unsigned char rpmuint8_t;
23 typedef /*@unsignedintegraltype@*/ unsigned short rpmuint16_t;
24 typedef /*@unsignedintegraltype@*/ unsigned int rpmuint32_t;
25 typedef /*@unsignedintegraltype@*/ unsigned long long rpmuint64_t;
26
27 /** \ingroup rpmio
28 */
29 typedef /*@signedintegraltype@*/ int rpmint32_t;
30
31 /**
32 */
33 typedef /*@refcounted@*/ struct rpmioItem_s * rpmioItem;
34 struct rpmioItem_s {
35 /*@null@*/
36 void *use; /*!< use count -- return to pool when zero */
37 /*@kept@*/ /*@null@*/
38 void *pool; /*!< pool (or NULL if malloc'd) */
39 #if defined(__LCLINT__)
40 /*@refs@*/
41 int nrefs; /*!< (unused) keep splint happy */
42 #endif
43 };
44
45 /**
46 */
47 typedef struct rpmioPool_s * rpmioPool;
48
49 /** \ingroup rpmio
50 */
51 typedef /*@abstract@*/ /*@refcounted@*/ struct rpmiob_s * rpmiob;
52
53 /** \ingroup rpmio
54 */
55 /*@unchecked@*/
56 extern size_t _rpmiob_chunk;
57
58 /** \ingroup rpmio
59 */
60 typedef struct rpmioP_s {
61 char * str;
62 char * next;
63 const char ** av;
64 int ac;
65 } * rpmioP;
66
67 /** \ingroup rpmpgp
68 */
69 typedef /*@abstract@*/ struct DIGEST_CTX_s * DIGEST_CTX;
70
71 /** \ingroup rpmpgp
72 */
73 typedef /*@abstract@*/ struct pgpPkt_s * pgpPkt;
74
75 /** \ingroup rpmpgp
76 */
77 typedef /*@abstract@*/ /*@refcounted@*/ struct pgpDig_s * pgpDig;
78
79 /** \ingroup rpmpgp
80 */
81 typedef /*@abstract@*/ struct pgpDigParams_s * pgpDigParams;
82
83 /** \ingroup rpmpgp
84 */
85 typedef rpmuint8_t pgpKeyID_t[8];
86
87 /** \ingroup rpmpgp
88 */
89 typedef rpmuint8_t pgpTime_t[4];
90
91 /** \ingroup rpmpgp
92 * Bit(s) to control digest and signature verification.
93 */
94 typedef enum pgpVSFlags_e {
95 RPMVSF_DEFAULT = 0,
96 RPMVSF_NOHDRCHK = (1 << 0),
97 RPMVSF_NEEDPAYLOAD = (1 << 1),
98 /* bit(s) 2-7 unused */
99 RPMVSF_NOSHA1HEADER = (1 << 8),
100 RPMVSF_NOMD5HEADER = (1 << 9), /* unimplemented */
101 RPMVSF_NODSAHEADER = (1 << 10),
102 RPMVSF_NORSAHEADER = (1 << 11),
103 /* bit(s) 12-15 unused */
104 RPMVSF_NOSHA1 = (1 << 16), /* unimplemented */
105 RPMVSF_NOMD5 = (1 << 17),
106 RPMVSF_NODSA = (1 << 18),
107 RPMVSF_NORSA = (1 << 19)
108 /* bit(s) 20-31 unused */
109 } pgpVSFlags;
110
111 #define _RPMVSF_NODIGESTS \
112 ( RPMVSF_NOSHA1HEADER | \
113 RPMVSF_NOMD5HEADER | \
114 RPMVSF_NOSHA1 | \
115 RPMVSF_NOMD5 )
116
117 #define _RPMVSF_NOSIGNATURES \
118 ( RPMVSF_NODSAHEADER | \
119 RPMVSF_NORSAHEADER | \
120 RPMVSF_NODSA | \
121 RPMVSF_NORSA )
122
123 #define _RPMVSF_NOHEADER \
124 ( RPMVSF_NOSHA1HEADER | \
125 RPMVSF_NOMD5HEADER | \
126 RPMVSF_NODSAHEADER | \
127 RPMVSF_NORSAHEADER )
128
129 #define _RPMVSF_NOPAYLOAD \
130 ( RPMVSF_NOSHA1 | \
131 RPMVSF_NOMD5 | \
132 RPMVSF_NODSA | \
133 RPMVSF_NORSA )
134
135 /*@-redef@*/ /* LCL: ??? */
136 typedef /*@abstract@*/ const void * fnpyKey;
137 /*@=redef@*/
138
139 /**
140 * Bit(s) to identify progress callbacks.
141 */
142 typedef enum rpmCallbackType_e {
143 RPMCALLBACK_UNKNOWN = 0,
144 RPMCALLBACK_INST_PROGRESS = (1 << 0),
145 RPMCALLBACK_INST_START = (1 << 1),
146 RPMCALLBACK_INST_OPEN_FILE = (1 << 2),
147 RPMCALLBACK_INST_CLOSE_FILE = (1 << 3),
148 RPMCALLBACK_TRANS_PROGRESS = (1 << 4),
149 RPMCALLBACK_TRANS_START = (1 << 5),
150 RPMCALLBACK_TRANS_STOP = (1 << 6),
151 RPMCALLBACK_UNINST_PROGRESS = (1 << 7),
152 RPMCALLBACK_UNINST_START = (1 << 8),
153 RPMCALLBACK_UNINST_STOP = (1 << 9),
154 RPMCALLBACK_REPACKAGE_PROGRESS = (1 << 10),
155 RPMCALLBACK_REPACKAGE_START = (1 << 11),
156 RPMCALLBACK_REPACKAGE_STOP = (1 << 12),
157 RPMCALLBACK_UNPACK_ERROR = (1 << 13),
158 RPMCALLBACK_CPIO_ERROR = (1 << 14),
159 RPMCALLBACK_SCRIPT_ERROR = (1 << 15)
160 } rpmCallbackType;
161
162 /**
163 */
164 typedef void * rpmCallbackData;
165
166 /** \ingroup rpmpgp
167 * 9.4. Hash Algorithms
168 *
169 \verbatim
170 ID Algorithm Text Name
171 -- --------- ---- ----
172 1 - MD5 "MD5"
173 2 - SHA-1 "SHA1"
174 3 - RIPE-MD/160 "RIPEMD160"
175 4 - Reserved for double-width SHA (experimental)
176 5 - MD2 "MD2"
177 6 - Reserved for TIGER/192 "TIGER192"
178 7 - Reserved for HAVAL (5 pass, 160-bit) "HAVAL-5-160"
179 100 to 110 - Private/Experimental algorithm.
180 \endverbatim
181 *
182 * Implementations MUST implement SHA-1. Implementations SHOULD
183 * implement MD5.
184 * @todo Add SHA256.
185 */
186 typedef enum pgpHashAlgo_e {
187 PGPHASHALGO_ERROR = -1,
188 PGPHASHALGO_NONE = 0,
189 PGPHASHALGO_MD5 = 1, /*!< MD5 */
190 PGPHASHALGO_SHA1 = 2, /*!< SHA-1 */
191 PGPHASHALGO_RIPEMD160 = 3, /*!< RIPEMD-160 */
192 PGPHASHALGO_MD2 = 5, /*!< MD2 */
193 PGPHASHALGO_TIGER192 = 6, /*!< TIGER-192 */
194 PGPHASHALGO_HAVAL_5_160 = 7, /*!< HAVAL-5-160 */
195 PGPHASHALGO_SHA256 = 8, /*!< SHA-256 */
196 PGPHASHALGO_SHA384 = 9, /*!< SHA-384 */
197 PGPHASHALGO_SHA512 = 10, /*!< SHA-512 */
198 PGPHASHALGO_SHA224 = 11, /*!< SHA-224 */
199
200 PGPHASHALGO_MD4 = 104, /*!< (private) MD4 */
201 PGPHASHALGO_RIPEMD128 = 105, /*!< (private) RIPEMD-128 */
202 PGPHASHALGO_CRC32 = 106, /*!< (private) CRC-32 */
203 PGPHASHALGO_ADLER32 = 107, /*!< (private) ADLER-32 */
204 PGPHASHALGO_CRC64 = 108, /*!< (private) CRC-64 */
205 PGPHASHALGO_JLU32 = 109, /*!< (private) Jenkins lookup3.c */
206
207 PGPHASHALGO_RIPEMD256 = 111, /*!< (private) RIPEMD-256 */
208 PGPHASHALGO_RIPEMD320 = 112, /*!< (private) RIPEMD-320 */
209 PGPHASHALGO_SALSA10 = 113, /*!< (private) SALSA-10 */
210 PGPHASHALGO_SALSA20 = 114, /*!< (private) SALSA-20 */
211
212 PGPHASHALGO_MD6_224 = 128+0,/*!< (private) MD6-224 */
213 PGPHASHALGO_MD6_256 = 128+1,/*!< (private) MD6-256 */
214 PGPHASHALGO_MD6_384 = 128+2,/*!< (private) MD6-384 */
215 PGPHASHALGO_MD6_512 = 128+3,/*!< (private) MD6-512 */
216
217 PGPHASHALGO_CUBEHASH_224 = 136+0,/*!< (private) CUBEHASH-224 */
218 PGPHASHALGO_CUBEHASH_256 = 136+1,/*!< (private) CUBEHASH-256 */
219 PGPHASHALGO_CUBEHASH_384 = 136+2,/*!< (private) CUBEHASH-384 */
220 PGPHASHALGO_CUBEHASH_512 = 136+3,/*!< (private) CUBEHASH-512 */
221
222 PGPHASHALGO_KECCAK_224 = 144+0,/*!< (private) KECCAK-224 */
223 PGPHASHALGO_KECCAK_256 = 144+1,/*!< (private) KECCAK-256 */
224 PGPHASHALGO_KECCAK_384 = 144+2,/*!< (private) KECCAK-384 */
225 PGPHASHALGO_KECCAK_512 = 144+3,/*!< (private) KECCAK-384 */
226
227 PGPHASHALGO_ECHO_224 = 148+0,/*!< (private) ECHO-224 */
228 PGPHASHALGO_ECHO_256 = 148+1,/*!< (private) ECHO-256 */
229 PGPHASHALGO_ECHO_384 = 148+2,/*!< (private) ECHO-384 */
230 PGPHASHALGO_ECHO_512 = 148+3,/*!< (private) ECHO-384 */
231
232 PGPHASHALGO_EDONR_224 = 152+0,/*!< (private) EDON-R-224 */
233 PGPHASHALGO_EDONR_256 = 152+1,/*!< (private) EDON-R-256 */
234 PGPHASHALGO_EDONR_384 = 152+2,/*!< (private) EDON-R-384 */
235 PGPHASHALGO_EDONR_512 = 152+3,/*!< (private) EDON-R-512 */
236
237 PGPHASHALGO_FUGUE_224 = 156+0,/*!< (private) FUGUE-224 */
238 PGPHASHALGO_FUGUE_256 = 156+1,/*!< (private) FUGUE-256 */
239 PGPHASHALGO_FUGUE_384 = 156+2,/*!< (private) FUGUE-384 */
240 PGPHASHALGO_FUGUE_512 = 156+3,/*!< (private) FUGUE-512 */
241
242 PGPHASHALGO_SKEIN_224 = 160+0,/*!< (private) SKEIN-224 */
243 PGPHASHALGO_SKEIN_256 = 160+1,/*!< (private) SKEIN-256 */
244 PGPHASHALGO_SKEIN_384 = 160+2,/*!< (private) SKEIN-384 */
245 PGPHASHALGO_SKEIN_512 = 160+3,/*!< (private) SKEIN-512 */
246 PGPHASHALGO_SKEIN_1024 = 160+4,/*!< (private) SKEIN-1024 */
247
248 PGPHASHALGO_BMW_224 = 168+0,/*!< (private) BMW-224 */
249 PGPHASHALGO_BMW_256 = 168+1,/*!< (private) BMW-256 */
250 PGPHASHALGO_BMW_384 = 168+2,/*!< (private) BMW-384 */
251 PGPHASHALGO_BMW_512 = 168+3,/*!< (private) BMW-512 */
252
253 PGPHASHALGO_SHABAL_224 = 176+0,/*!< (private) SHABAL-224 */
254 PGPHASHALGO_SHABAL_256 = 176+1,/*!< (private) SHABAL-256 */
255 PGPHASHALGO_SHABAL_384 = 176+2,/*!< (private) SHABAL-384 */
256 PGPHASHALGO_SHABAL_512 = 176+3,/*!< (private) SHABAL-512 */
257
258 PGPHASHALGO_SHAVITE3_224 = 180+0,/*!< (private) SHAVITE3-224 */
259 PGPHASHALGO_SHAVITE3_256 = 180+1,/*!< (private) SHAVITE3-256 */
260 PGPHASHALGO_SHAVITE3_384 = 180+2,/*!< (private) SHAVITE3-384 */
261 PGPHASHALGO_SHAVITE3_512 = 180+3,/*!< (private) SHAVITE3-512 */
262
263 PGPHASHALGO_BLAKE_224 = 184+0,/*!< (private) BLAKE-224 */
264 PGPHASHALGO_BLAKE_256 = 184+1,/*!< (private) BLAKE-256 */
265 PGPHASHALGO_BLAKE_384 = 184+2,/*!< (private) BLAKE-384 */
266 PGPHASHALGO_BLAKE_512 = 184+3,/*!< (private) BLAKE-512 */
267
268 PGPHASHALGO_TIB3_224 = 192+0,/*!< (private) TIB3-224 */
269 PGPHASHALGO_TIB3_256 = 192+1,/*!< (private) TIB3-256 */
270 PGPHASHALGO_TIB3_384 = 192+2,/*!< (private) TIB3-384 */
271 PGPHASHALGO_TIB3_512 = 192+3,/*!< (private) TIB3-512 */
272
273 PGPHASHALGO_SIMD_224 = 200+0,/*!< (private) SIMD-224 */
274 PGPHASHALGO_SIMD_256 = 200+1,/*!< (private) SIMD-256 */
275 PGPHASHALGO_SIMD_384 = 200+2,/*!< (private) SIMD-384 */
276 PGPHASHALGO_SIMD_512 = 200+3,/*!< (private) SIMD-512 */
277
278 PGPHASHALGO_ARIRANG_224 = 208+0,/*!< (private) ARIRANG-224 */
279 PGPHASHALGO_ARIRANG_256 = 208+1,/*!< (private) ARIRANG-256 */
280 PGPHASHALGO_ARIRANG_384 = 208+2,/*!< (private) ARIRANG-384 */
281 PGPHASHALGO_ARIRANG_512 = 208+3,/*!< (private) ARIRANG-512 */
282
283 PGPHASHALGO_LANE_224 = 212+0,/*!< (private) LANE-224 */
284 PGPHASHALGO_LANE_256 = 212+1,/*!< (private) LANE-256 */
285 PGPHASHALGO_LANE_384 = 212+2,/*!< (private) LANE-384 */
286 PGPHASHALGO_LANE_512 = 212+3,/*!< (private) LANE-512 */
287
288 PGPHASHALGO_LUFFA_224 = 216+0,/*!< (private) LUFFA-224 */
289 PGPHASHALGO_LUFFA_256 = 216+1,/*!< (private) LUFFA-256 */
290 PGPHASHALGO_LUFFA_384 = 216+2,/*!< (private) LUFFA-384 */
291 PGPHASHALGO_LUFFA_512 = 216+3,/*!< (private) LUFFA-512 */
292
293 PGPHASHALGO_CHI_224 = 224+0,/*!< (private) CHI-224 */
294 PGPHASHALGO_CHI_256 = 224+1,/*!< (private) CHI-256 */
295 PGPHASHALGO_CHI_384 = 224+2,/*!< (private) CHI-384 */
296 PGPHASHALGO_CHI_512 = 224+3,/*!< (private) CHI-512 */
297
298 PGPHASHALGO_JH_224 = 232+0,/*!< (private) JH-224 */
299 PGPHASHALGO_JH_256 = 232+1,/*!< (private) JH-256 */
300 PGPHASHALGO_JH_384 = 232+2,/*!< (private) JH-384 */
301 PGPHASHALGO_JH_512 = 232+3,/*!< (private) JH-512 */
302
303 PGPHASHALGO_GROESTL_224 = 240+0,/*!< (private) GROESTL-224 */
304 PGPHASHALGO_GROESTL_256 = 240+1,/*!< (private) GROESTL-256 */
305 PGPHASHALGO_GROESTL_384 = 240+2,/*!< (private) GROESTL-384 */
306 PGPHASHALGO_GROESTL_512 = 240+3,/*!< (private) GROESTL-512 */
307
308 PGPHASHALGO_HAMSI_224 = 248+0,/*!< (private) HAMSI-224 */
309 PGPHASHALGO_HAMSI_256 = 248+1,/*!< (private) HAMSI-256 */
310 PGPHASHALGO_HAMSI_384 = 248+2,/*!< (private) HAMSI-384 */
311 PGPHASHALGO_HAMSI_512 = 248+3,/*!< (private) HAMSI-512 */
312
313 } pgpHashAlgo;
314
315 /** \ingroup rpmpgp
316 * Bit(s) to control digest operation.
317 */
318 typedef enum rpmDigestFlags_e {
319 RPMDIGEST_NONE = 0,
320 } rpmDigestFlags;
321
322 #if defined(_RPMIOB_INTERNAL)
323 /** \ingroup rpmio
324 */
325 struct rpmiob_s{
326 struct rpmioItem_s _item; /*!< usage mutex and pool identifier. */
327 rpmuint8_t * b; /*!< data octects. */
328 size_t blen; /*!< no. of octets used. */
329 size_t allocated; /*!< no. of octets allocated. */
330 #if defined(__LCLINT__)
331 /*@refs@*/
332 int nrefs; /*!< (unused) keep splint happy */
333 #endif
334 };
335 #endif
336
337 #ifdef __cplusplus
338 extern "C" {
339 #endif
340
341 /** \ingroup rpmpgp
342 * Return digest algorithm identifier.
343 * @param ctx digest context
344 * @return digest hash algorithm identifier
345 */
346 pgpHashAlgo rpmDigestAlgo(DIGEST_CTX ctx)
347 /*@*/;
348
349 /** \ingroup rpmpgp
350 * Return digest flags.
351 * @param ctx digest context
352 * @return digest flags
353 */
354 rpmDigestFlags rpmDigestF(DIGEST_CTX ctx)
355 /*@*/;
356
357 /** \ingroup rpmpgp
358 * Return digest name.
359 * @param ctx digest context
360 * @return digest name
361 */
362 /*@observer@*/
363 const char * rpmDigestName(DIGEST_CTX ctx)
364 /*@*/;
365
366 /** \ingroup rpmpgp
367 * Return digest ASN1 oid string.
368 * Values from PKCS#1 v2.1 (aka RFC-3447).
369 * @param ctx digest context
370 * @return digest ASN1 oid string
371 */
372 /*@observer@*/ /*@null@*/
373 const char * rpmDigestASN1(DIGEST_CTX ctx)
374 /*@*/;
375
376 /** \ingroup rpmpgp
377 * Duplicate a digest context.
378 * @param octx existing digest context
379 * @return duplicated digest context
380 */
381 /*@only@*/
382 DIGEST_CTX rpmDigestDup(DIGEST_CTX octx)
383 /*@*/;
384
385 /** \ingroup rpmpgp
386 * Initialize digest.
387 * Set bit count to 0 and buffer to mysterious initialization constants.
388 * @param hashalgo type of digest
389 * @param flags bit(s) to control digest operation
390 * @return digest context
391 */
392 /*@only@*/ /*@null@*/
393 DIGEST_CTX rpmDigestInit(pgpHashAlgo hashalgo, rpmDigestFlags flags)
394 /*@*/;
395
396 /** \ingroup rpmpgp
397 * Update context with next plain text buffer.
398 * @param ctx digest context
399 * @param data next data buffer
400 * @param len no. bytes of data
401 * @return 0 on success
402 */
403 int rpmDigestUpdate(/*@null@*/ DIGEST_CTX ctx, const void * data, size_t len)
404 /*@modifies ctx @*/;
405
406 /** \ingroup rpmpgp
407 * Return digest and destroy context.
408 *
409 * @param ctx digest context
410 * @retval *datap digest
411 * @retval *lenp no. bytes of digest
412 * @param asAscii return digest as ascii string?
413 * @return 0 on success
414 */
415 int rpmDigestFinal(/*@only@*/ /*@null@*/ DIGEST_CTX ctx,
416 /*@null@*/ /*@out@*/ void * datap,
417 /*@null@*/ /*@out@*/ size_t * lenp, int asAscii)
418 /*@modifies *datap, *lenp @*/;
419
420 /** \ingroup rpmpgp
421 *
422 * Compute key material and add to digest context.
423 * @param ctx digest context
424 * @param key HMAC key (NULL does digest instead)
425 * @param keylen HMAC key length(bytes) (0 uses strlen(key))
426 * @return 0 on success
427 */
428 int rpmHmacInit(DIGEST_CTX ctx, const void * key, size_t keylen)
429 /*@*/;
430
431 /** \ingroup rpmio
432 */
433 typedef void * (*rpmCallbackFunction)
434 (/*@null@*/ const void * h,
435 const rpmCallbackType what,
436 const rpmuint64_t amount,
437 const rpmuint64_t total,
438 /*@null@*/ fnpyKey key,
439 /*@null@*/ rpmCallbackData data)
440 /*@globals internalState@*/
441 /*@modifies internalState@*/;
442
443 #if !defined(SWIG)
444 /** \ingroup rpmio
445 * Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
446 * @param p memory to free
447 * @return NULL always
448 */
449 #if defined(WITH_DMALLOC)
450 #define _free(p) ((p) != NULL ? free((void *)(p)) : (void)0, NULL)
451 #else
452 /*@unused@*/ static inline /*@null@*/
453 void * _free(/*@only@*/ /*@null@*/ /*@out@*/ const void * p)
454 /*@modifies p @*/
455 {
456 if (p != NULL) free((void *)p);
457 return NULL;
458 }
459 #endif
460 #endif
461
462 /*@unused@*/ static inline int xislower(int c) /*@*/ {
463 return (c >= (int)'a' && c <= (int)'z');
464 }
465 /*@unused@*/ static inline int xisupper(int c) /*@*/ {
466 return (c >= (int)'A' && c <= (int)'Z');
467 }
468 /*@unused@*/ static inline int xisalpha(int c) /*@*/ {
469 return (xislower(c) || xisupper(c));
470 }
471 /*@unused@*/ static inline int xisdigit(int c) /*@*/ {
472 return (c >= (int)'0' && c <= (int)'9');
473 }
474 /*@unused@*/ static inline int xisalnum(int c) /*@*/ {
475 return (xisalpha(c) || xisdigit(c));
476 }
477 /*@unused@*/ static inline int xisblank(int c) /*@*/ {
478 return (c == (int)' ' || c == (int)'\t');
479 }
480 /*@unused@*/ static inline int xisspace(int c) /*@*/ {
481 return (xisblank(c) || c == (int)'\n' || c == (int)'\r' || c == (int)'\f' || c == (int)'\v');
482 }
483 /*@unused@*/ static inline int xiscntrl(int c) /*@*/ {
484 return (c < (int)' ');
485 }
486 /*@unused@*/ static inline int xisascii(int c) /*@*/ {
487 return ((c & 0x80) != 0x80);
488 }
489 /*@unused@*/ static inline int xisprint(int c) /*@*/ {
490 return (c >= (int)' ' && xisascii(c));
491 }
492 /*@unused@*/ static inline int xisgraph(int c) /*@*/ {
493 return (c > (int)' ' && xisascii(c));
494 }
495 /*@unused@*/ static inline int xispunct(int c) /*@*/ {
496 return (xisgraph(c) && !xisalnum(c));
497 }
498
499 /*@unused@*/ static inline int xtolower(int c) /*@*/ {
500 return ((xisupper(c)) ? (c | ('a' - 'A')) : c);
501 }
502 /*@unused@*/ static inline int xtoupper(int c) /*@*/ {
503 return ((xislower(c)) ? (c & ~('a' - 'A')) : c);
504 }
505
506 /** \ingroup rpmio
507 * Locale insensitive strcasecmp(3).
508 */
509 int xstrcasecmp(const char * s1, const char * s2) /*@*/;
510
511 /** \ingroup rpmio
512 * Locale insensitive strncasecmp(3).
513 */
514 int xstrncasecmp(const char *s1, const char * s2, size_t n) /*@*/;
515
516 /** \ingroup rpmio
517 * Force encoding of string.
518 */
519 /*@only@*/ /*@null@*/
520 const char * xstrtolocale(/*@only@*/ const char *str)
521 /*@modifies *str @*/;
522
523 /**
524 * Unreference a I/O buffer instance.
525 * @param iob hash table
526 * @return NULL if free'd
527 */
528 /*@unused@*/ /*@null@*/
529 rpmiob rpmiobUnlink (/*@killref@*/ /*@null@*/ rpmiob iob)
530 /*@globals fileSystem @*/
531 /*@modifies iob, fileSystem @*/;
532 #define rpmiobUnlink(_iob) \
533 ((rpmiob)rpmioUnlinkPoolItem((rpmioItem)(_iob), __FUNCTION__, __FILE__, __LINE__))
534
535 /**
536 * Reference a I/O buffer instance.
537 * @param iob I/O buffer
538 * @return new I/O buffer reference
539 */
540 /*@unused@*/ /*@newref@*/ /*@null@*/
541 rpmiob rpmiobLink (/*@null@*/ rpmiob iob)
542 /*@globals fileSystem @*/
543 /*@modifies iob, fileSystem @*/;
544 #define rpmiobLink(_iob) \
545 ((rpmiob)rpmioLinkPoolItem((rpmioItem)(_iob), __FUNCTION__, __FILE__, __LINE__))
546
547 /**
548 * Destroy a I/O buffer instance.
549 * @param iob I/O buffer
550 * @return NULL on last dereference
551 */
552 /*@null@*/
553 rpmiob rpmiobFree( /*@killref@*/ rpmiob iob)
554 /*@globals fileSystem @*/
555 /*@modifies iob, fileSystem @*/;
556 #define rpmiobFree(_iob) \
557 ((rpmiob)rpmioFreePoolItem((rpmioItem)(_iob), __FUNCTION__, __FILE__, __LINE__))
558
559 /**
560 * Create an I/O buffer.
561 * @param len no. of octets to allocate
562 * @return new I/O buffer
563 */
564 /*@newref@*/ /*@null@*/
565 rpmiob rpmiobNew(size_t len)
566 /*@globals fileSystem @*/
567 /*@modifies fileSystem @*/;
568
569 /**
570 * Empty an I/O buffer.
571 * @param iob I/O buffer
572 * @return I/O buffer
573 */
574 rpmiob rpmiobEmpty(/*@returned@*/ rpmiob iob)
575 /*@modifies iob @*/;
576
577 /**
578 * Trim trailing white space.
579 * @param iob I/O buffer
580 * @return I/O buffer
581 */
582 rpmiob rpmiobRTrim(/*@returned@*/ rpmiob iob)
583 /*@modifies iob @*/;
584
585 /**
586 * Append string to I/O buffer.
587 * @param iob I/O buffer
588 * @param s string
589 * @param nl append NL?
590 * @return I/O buffer
591 */
592 rpmiob rpmiobAppend(/*@returned@*/ rpmiob iob, const char * s, size_t nl)
593 /*@modifies iob @*/;
594
595 /**
596 * Return I/O buffer.
597 * @param iob I/O buffer
598 * @return I/O buffer (as octets)
599 */
600 rpmuint8_t * rpmiobBuf(rpmiob iob)
601 /*@*/;
602
603 /**
604 * Return I/O buffer (as string).
605 * @param iob I/O buffer
606 * @return I/O buffer (as string)
607 */
608 char * rpmiobStr(rpmiob iob)
609 /*@*/;
610
611 /**
612 * Return I/O buffer len.
613 * @param iob I/O buffer
614 * @return I/O buffer length
615 */
616 size_t rpmiobLen(rpmiob iob)
617 /*@*/;
618
619 #if defined(_RPMIOB_INTERNAL)
620 /**
621 * Read an entire file into a buffer.
622 * @param fn file name to read
623 * @retval *iobp I/O buffer
624 * @return 0 on success
625 */
626 int rpmiobSlurp(const char * fn, rpmiob * iobp)
627 /*@globals h_errno, fileSystem, internalState @*/
628 /*@modifies *iobp, fileSystem, internalState @*/;
629 #endif
630
631 /**
632 * Destroy a rpmioP object.
633 * @param P parser state
634 * @return NULL
635 */
636 /*@null@*/
637 rpmioP rpmioPFree(/*@only@*/ /*@null@*/ rpmioP P)
638 /*@modifies P @*/;
639
640 /**
641 * Parse next command out of a string incrementally.
642 * @param *Pptr parser state
643 * @param str string to parse
644 * @return RPMRC_OK on success
645 */
646 rpmRC rpmioParse(rpmioP *Pptr, const char * str)
647 /*@modifies *Pptr @*/;
648
649 #ifdef __cplusplus
650 }
651 #endif
652
653 #endif /* _H_RPMIOTYPES_ */