2002-03-25 23:16:26 +03:00
/*@-type@*/ /* FIX: cast to HV_t bogus */
# ifndef H_HDRINLINE
# define H_HDRINLINE
/** \ingroup header
2005-10-15 18:12:36 +04:00
* \ file rpmdb / hdrinline . h
2002-03-25 23:16:26 +03:00
*/
# ifdef __cplusplus
extern " C " {
# endif
/*@+voidabstract -nullpass -mustmod -compdef -shadow -predboolothers @*/
/** \ingroup header
* Header methods for rpm headers .
*/
/*@observer@*/ /*@unchecked@*/
extern struct HV_s * hdrVec ;
/** \ingroup header
*/
/*@unused@*/ static inline HV_t h2hv ( Header h )
/*@*/
{
/*@-abstract -castexpose -refcounttrans@*/
return ( ( HV_t ) h ) ;
/*@=abstract =castexpose =refcounttrans@*/
}
/** \ingroup header
* Create new ( empty ) header instance .
* @ return header
*/
/*@unused@*/ static inline
Header headerNew ( void )
/*@*/
{
return hdrVec - > hdrnew ( ) ;
}
/** \ingroup header
* Dereference a header instance .
* @ param h header
* @ return NULL always
*/
/*@unused@*/ static inline
2005-10-15 18:12:36 +04:00
/*@null@*/ Header headerFree ( /*@killref@*/ /*@null@*/ Header h )
2002-03-25 23:16:26 +03:00
/*@modifies h @*/
{
/*@-abstract@*/
if ( h = = NULL ) return NULL ;
/*@=abstract@*/
return ( h2hv ( h ) - > hdrfree ) ( h ) ;
}
/** \ingroup header
* Reference a header instance .
* @ param h header
* @ return new header reference
*/
/*@unused@*/ static inline
Header headerLink ( Header h )
/*@modifies h @*/
{
return ( h2hv ( h ) - > hdrlink ) ( h ) ;
}
/** \ingroup header
* Dereference a header instance .
* @ param h header
* @ return new header reference
*/
/*@unused@*/ static inline
Header headerUnlink ( /*@killref@*/ /*@null@*/ Header h )
/*@modifies h @*/
{
/*@-abstract@*/
if ( h = = NULL ) return NULL ;
/*@=abstract@*/
return ( h2hv ( h ) - > hdrunlink ) ( h ) ;
}
/*@-exportlocal@*/
/** \ingroup header
* Sort tags in header .
* @ param h header
*/
/*@unused@*/ static inline
void headerSort ( Header h )
/*@modifies h @*/
{
/*@-noeffectuncon@*/ /* FIX: add rc */
( h2hv ( h ) - > hdrsort ) ( h ) ;
/*@=noeffectuncon@*/
return ;
}
/** \ingroup header
* Restore tags in header to original ordering .
* @ param h header
*/
/*@unused@*/ static inline
void headerUnsort ( Header h )
/*@modifies h @*/
{
/*@-noeffectuncon@*/ /* FIX: add rc */
( h2hv ( h ) - > hdrunsort ) ( h ) ;
/*@=noeffectuncon@*/
return ;
}
/*@=exportlocal@*/
/** \ingroup header
* Return size of on - disk header representation in bytes .
* @ param h header
* @ param magicp include size of 8 bytes for ( magic , 0 ) ?
* @ return size of on - disk header
*/
/*@unused@*/ static inline
unsigned int headerSizeof ( /*@null@*/ Header h , enum hMagic magicp )
/*@modifies h @*/
{
/*@-abstract@*/
if ( h = = NULL ) return 0 ;
/*@=abstract@*/
return ( h2hv ( h ) - > hdrsizeof ) ( h , magicp ) ;
}
/** \ingroup header
* Convert header to on - disk representation .
* @ param h header ( with pointers )
* @ return on - disk header blob ( i . e . with offsets )
*/
/*@unused@*/ static inline
/*@only@*/ /*@null@*/ void * headerUnload ( Header h )
/*@modifies h @*/
{
return ( h2hv ( h ) - > hdrunload ) ( h ) ;
}
/** \ingroup header
* Convert header to on - disk representation , and then reload .
* This is used to insure that all header data is in one chunk .
* @ param h header ( with pointers )
* @ param tag region tag
* @ return on - disk header ( with offsets )
*/
/*@unused@*/ static inline
/*@null@*/ Header headerReload ( /*@only@*/ Header h , int tag )
/*@modifies h @*/
{
/*@-onlytrans@*/
return ( h2hv ( h ) - > hdrreload ) ( h , tag ) ;
/*@=onlytrans@*/
}
/** \ingroup header
* Duplicate a header .
* @ param h header
* @ return new header instance
*/
/*@unused@*/ static inline
/*@null@*/ Header headerCopy ( Header h )
/*@modifies h @*/
{
return ( h2hv ( h ) - > hdrcopy ) ( h ) ;
}
/** \ingroup header
* Convert header to in - memory representation .
* @ param uh on - disk header blob ( i . e . with offsets )
* @ return header
*/
/*@unused@*/ static inline
/*@null@*/ Header headerLoad ( /*@kept@*/ void * uh )
/*@modifies uh @*/
{
return hdrVec - > hdrload ( uh ) ;
}
/** \ingroup header
* Make a copy and convert header to in - memory representation .
* @ param uh on - disk header blob ( i . e . with offsets )
* @ return header
*/
/*@unused@*/ static inline
/*@null@*/ Header headerCopyLoad ( const void * uh )
/*@*/
{
return hdrVec - > hdrcopyload ( uh ) ;
}
/** \ingroup header
* Read ( and load ) header from file handle .
* @ param fd file handle
* @ param magicp read ( and verify ) 8 bytes of ( magic , 0 ) ?
* @ return header ( or NULL on error )
*/
/*@unused@*/ static inline
/*@null@*/ Header headerRead ( FD_t fd , enum hMagic magicp )
/*@modifies fd @*/
{
return hdrVec - > hdrread ( fd , magicp ) ;
}
/** \ingroup header
* Write ( with unload ) header to file handle .
* @ param fd file handle
* @ param h header
* @ param magicp prefix write with 8 bytes of ( magic , 0 ) ?
* @ return 0 on success , 1 on error
*/
/*@unused@*/ static inline
int headerWrite ( FD_t fd , /*@null@*/ Header h , enum hMagic magicp )
/*@modifies fd, h @*/
{
/*@-abstract@*/
if ( h = = NULL ) return 0 ;
/*@=abstract@*/
return ( h2hv ( h ) - > hdrwrite ) ( fd , h , magicp ) ;
}
/** \ingroup header
* Check if tag is in header .
* @ param h header
* @ param tag tag
* @ return 1 on success , 0 on failure
*/
/*@unused@*/ static inline
int headerIsEntry ( /*@null@*/ Header h , int_32 tag )
/*@modifies h @*/
{
/*@-abstract@*/
if ( h = = NULL ) return 0 ;
/*@=abstract@*/
return ( h2hv ( h ) - > hdrisentry ) ( h , tag ) ;
}
/** \ingroup header
* Free data allocated when retrieved from header .
* @ param h header
2005-10-15 18:12:36 +04:00
* @ param data pointer to tag value ( s )
2002-03-25 23:16:26 +03:00
* @ param type type of data ( or - 1 to force free )
* @ return NULL always
*/
/*@unused@*/ static inline
/*@null@*/ void * headerFreeTag ( Header h ,
/*@only@*/ /*@null@*/ const void * data , rpmTagType type )
/*@modifies data @*/
{
return ( h2hv ( h ) - > hdrfreetag ) ( h , data , type ) ;
}
/** \ingroup header
* Retrieve tag value .
* Will never return RPM_I18NSTRING_TYPE ! RPM_STRING_TYPE elements with
* RPM_I18NSTRING_TYPE equivalent entries are translated ( if HEADER_I18NTABLE
* entry is present ) .
*
* @ param h header
* @ param tag tag
2005-10-15 18:12:36 +04:00
* @ retval * type tag value data type ( or NULL )
* @ retval * p pointer to tag value ( s ) ( or NULL )
* @ retval * c number of values ( or NULL )
2002-03-25 23:16:26 +03:00
* @ return 1 on success , 0 on failure
*/
/*@unused@*/ static inline
int headerGetEntry ( Header h , int_32 tag ,
/*@null@*/ /*@out@*/ hTYP_t type ,
/*@null@*/ /*@out@*/ void * * p ,
/*@null@*/ /*@out@*/ hCNT_t c )
/*@modifies *type, *p, *c @*/
{
return ( h2hv ( h ) - > hdrget ) ( h , tag , type , p , c ) ;
}
/** \ingroup header
* Retrieve tag value using header internal array .
* Get an entry using as little extra RAM as possible to return the tag value .
* This is only an issue for RPM_STRING_ARRAY_TYPE .
*
* @ param h header
* @ param tag tag
2005-10-15 18:12:36 +04:00
* @ retval * type tag value data type ( or NULL )
* @ retval * p pointer to tag value ( s ) ( or NULL )
* @ retval * c number of values ( or NULL )
2002-03-25 23:16:26 +03:00
* @ return 1 on success , 0 on failure
*/
/*@unused@*/ static inline
int headerGetEntryMinMemory ( Header h , int_32 tag ,
/*@null@*/ /*@out@*/ hTYP_t type ,
/*@null@*/ /*@out@*/ hPTR_t * p ,
/*@null@*/ /*@out@*/ hCNT_t c )
/*@modifies *type, *p, *c @*/
{
return ( h2hv ( h ) - > hdrgetmin ) ( h , tag , type , p , c ) ;
}
/** \ingroup header
* Add tag to header .
* Duplicate tags are okay , but only defined for iteration ( with the
* exceptions noted below ) . While you are allowed to add i18n string
* arrays through this function , you probably don ' t mean to . See
* headerAddI18NString ( ) instead .
*
* @ param h header
* @ param tag tag
* @ param type tag value data type
* @ param p pointer to tag value ( s )
* @ param c number of values
* @ return 1 on success , 0 on failure
*/
/*@mayexit@*/
/*@unused@*/ static inline
int headerAddEntry ( Header h , int_32 tag , int_32 type , const void * p , int_32 c )
/*@modifies h @*/
{
return ( h2hv ( h ) - > hdradd ) ( h , tag , type , p , c ) ;
}
/** \ingroup header
* Append element to tag array in header .
* Appends item p to entry w / tag and type as passed . Won ' t work on
* RPM_STRING_TYPE . Any pointers into header memory returned from
* headerGetEntryMinMemory ( ) for this entry are invalid after this
* call has been made !
*
* @ param h header
* @ param tag tag
* @ param type tag value data type
* @ param p pointer to tag value ( s )
* @ param c number of values
* @ return 1 on success , 0 on failure
*/
/*@unused@*/ static inline
int headerAppendEntry ( Header h , int_32 tag , int_32 type ,
const void * p , int_32 c )
/*@modifies h @*/
{
return ( h2hv ( h ) - > hdrappend ) ( h , tag , type , p , c ) ;
}
/** \ingroup header
* Add or append element to tag array in header .
* @ todo Arg " p " should have const .
* @ param h header
* @ param tag tag
* @ param type tag value data type
* @ param p pointer to tag value ( s )
* @ param c number of values
* @ return 1 on success , 0 on failure
*/
/*@unused@*/ static inline
int headerAddOrAppendEntry ( Header h , int_32 tag , int_32 type ,
const void * p , int_32 c )
/*@modifies h @*/
{
return ( h2hv ( h ) - > hdraddorappend ) ( h , tag , type , p , c ) ;
}
/** \ingroup header
* Add locale specific tag to header .
* A NULL lang is interpreted as the C locale . Here are the rules :
* \ verbatim
* - If the tag isn ' t in the header , it ' s added with the passed string
* as new value .
* - If the tag occurs multiple times in entry , which tag is affected
* by the operation is undefined .
* - If the tag is in the header w / this language , the entry is
* * replaced * ( like headerModifyEntry ( ) ) .
* \ endverbatim
* This function is intended to just " do the right thing " . If you need
* more fine grained control use headerAddEntry ( ) and headerModifyEntry ( ) .
*
* @ param h header
* @ param tag tag
* @ param string tag value
* @ param lang locale
* @ return 1 on success , 0 on failure
*/
/*@unused@*/ static inline
int headerAddI18NString ( Header h , int_32 tag , const char * string ,
const char * lang )
/*@modifies h @*/
{
return ( h2hv ( h ) - > hdraddi18n ) ( h , tag , string , lang ) ;
}
/** \ingroup header
* Modify tag in header .
* If there are multiple entries with this tag , the first one gets replaced .
* @ param h header
* @ param tag tag
* @ param type tag value data type
* @ param p pointer to tag value ( s )
* @ param c number of values
* @ return 1 on success , 0 on failure
*/
/*@unused@*/ static inline
int headerModifyEntry ( Header h , int_32 tag , int_32 type ,
const void * p , int_32 c )
/*@modifies h @*/
{
return ( h2hv ( h ) - > hdrmodify ) ( h , tag , type , p , c ) ;
}
/** \ingroup header
* Delete tag in header .
* Removes all entries of type tag from the header , returns 1 if none were
* found .
*
* @ param h header
* @ param tag tag
* @ return 0 on success , 1 on failure ( INCONSISTENT )
*/
/*@unused@*/ static inline
int headerRemoveEntry ( Header h , int_32 tag )
/*@modifies h @*/
{
return ( h2hv ( h ) - > hdrremove ) ( h , tag ) ;
}
/** \ingroup header
* Return formatted output string from header tags .
* The returned string must be free ( ) d .
*
* @ param h header
* @ param fmt format to use
* @ param tbltags array of tag name / value pairs
* @ param extensions chained table of formatting extensions .
* @ retval errmsg error message ( if any )
* @ return formatted output string ( malloc ' ed )
*/
/*@unused@*/ static inline
/*@only@*/ char * headerSprintf ( Header h , const char * fmt ,
const struct headerTagTableEntry_s * tbltags ,
const struct headerSprintfExtension_s * extensions ,
/*@null@*/ /*@out@*/ errmsg_t * errmsg )
/*@modifies *errmsg @*/
{
return ( h2hv ( h ) - > hdrsprintf ) ( h , fmt , tbltags , extensions , errmsg ) ;
}
/** \ingroup header
* Duplicate tag values from one header into another .
* @ param headerFrom source header
* @ param headerTo destination header
* @ param tagstocopy array of tags that are copied
*/
/*@unused@*/ static inline
void headerCopyTags ( Header headerFrom , Header headerTo , hTAG_t tagstocopy )
/*@modifies headerFrom, headerTo @*/
{
/*@-noeffectuncon@*/ /* FIX: add rc */
hdrVec - > hdrcopytags ( headerFrom , headerTo , tagstocopy ) ;
/*@=noeffectuncon@*/
return ;
}
/** \ingroup header
* Destroy header tag iterator .
* @ param hi header tag iterator
* @ return NULL always
*/
/*@unused@*/ static inline
HeaderIterator headerFreeIterator ( /*@only@*/ HeaderIterator hi )
/*@modifies hi @*/
{
return hdrVec - > hdrfreeiter ( hi ) ;
}
/** \ingroup header
* Create header tag iterator .
* @ param h header
* @ return header tag iterator
*/
/*@unused@*/ static inline
HeaderIterator headerInitIterator ( Header h )
/*@modifies h */
{
return hdrVec - > hdrinititer ( h ) ;
}
/** \ingroup header
* Return next tag from header .
* @ param hi header tag iterator
2005-10-15 18:12:36 +04:00
* @ retval * tag tag
* @ retval * type tag value data type
* @ retval * p pointer to tag value ( s )
* @ retval * c number of values
2002-03-25 23:16:26 +03:00
* @ return 1 on success , 0 on failure
*/
/*@unused@*/ static inline
int headerNextIterator ( HeaderIterator hi ,
/*@null@*/ /*@out@*/ hTAG_t tag ,
/*@null@*/ /*@out@*/ hTYP_t type ,
/*@null@*/ /*@out@*/ hPTR_t * p ,
/*@null@*/ /*@out@*/ hCNT_t c )
/*@modifies hi, *tag, *type, *p, *c @*/
{
return hdrVec - > hdrnextiter ( hi , tag , type , p , c ) ;
}
/*@=voidabstract =nullpass =mustmod =compdef =shadow =predboolothers @*/
# ifdef __cplusplus
}
# endif
# endif /* H_HDRINLINE */
/*@=type@*/