|
Packit Service |
ff689b |
/*
|
|
Packit Service |
ff689b |
* Copyright (c) 2007, Novell Inc.
|
|
Packit Service |
ff689b |
*
|
|
Packit Service |
ff689b |
* This program is licensed under the BSD license, read LICENSE.BSD
|
|
Packit Service |
ff689b |
* for further information
|
|
Packit Service |
ff689b |
*/
|
|
Packit Service |
ff689b |
#ifndef LIBSOLV_DIRPOOL_H
|
|
Packit Service |
ff689b |
#define LIBSOLV_DIRPOOL_H
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
#include "pooltypes.h"
|
|
Packit Service |
ff689b |
#include "util.h"
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
#ifdef __cplusplus
|
|
Packit Service |
ff689b |
extern "C" {
|
|
Packit Service |
ff689b |
#endif
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
typedef struct s_Dirpool {
|
|
Packit Service |
ff689b |
Id *dirs;
|
|
Packit Service |
ff689b |
int ndirs;
|
|
Packit Service |
ff689b |
Id *dirtraverse;
|
|
Packit Service |
ff689b |
} Dirpool;
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
void dirpool_init(Dirpool *dp);
|
|
Packit Service |
ff689b |
void dirpool_free(Dirpool *dp);
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
void dirpool_make_dirtraverse(Dirpool *dp);
|
|
Packit Service |
ff689b |
Id dirpool_add_dir(Dirpool *dp, Id parent, Id comp, int create);
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
/* return the parent directory of child did */
|
|
Packit Service |
ff689b |
static inline Id dirpool_parent(Dirpool *dp, Id did)
|
|
Packit Service |
ff689b |
{
|
|
Packit Service |
ff689b |
if (!did)
|
|
Packit Service |
ff689b |
return 0;
|
|
Packit Service |
ff689b |
while (dp->dirs[--did] > 0)
|
|
Packit Service |
ff689b |
;
|
|
Packit Service |
ff689b |
return -dp->dirs[did];
|
|
Packit Service |
ff689b |
}
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
/* return the next child entry of child did */
|
|
Packit Service |
ff689b |
static inline Id
|
|
Packit Service |
ff689b |
dirpool_sibling(Dirpool *dp, Id did)
|
|
Packit Service |
ff689b |
{
|
|
Packit Service |
ff689b |
/* if this block contains another entry, simply return it */
|
|
Packit Service |
ff689b |
if (did + 1 < dp->ndirs && dp->dirs[did + 1] > 0)
|
|
Packit Service |
ff689b |
return did + 1;
|
|
Packit Service |
ff689b |
/* end of block reached, rewind to get to the block's
|
|
Packit Service |
ff689b |
* dirtraverse entry */
|
|
Packit Service |
ff689b |
while (dp->dirs[--did] > 0)
|
|
Packit Service |
ff689b |
;
|
|
Packit Service |
ff689b |
/* need to special case did == 0 to prevent looping */
|
|
Packit Service |
ff689b |
if (!did)
|
|
Packit Service |
ff689b |
return 0;
|
|
Packit Service |
ff689b |
if (!dp->dirtraverse)
|
|
Packit Service |
ff689b |
dirpool_make_dirtraverse(dp);
|
|
Packit Service |
ff689b |
return dp->dirtraverse[did];
|
|
Packit Service |
ff689b |
}
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
/* return the first child entry of directory did */
|
|
Packit Service |
ff689b |
static inline Id
|
|
Packit Service |
ff689b |
dirpool_child(Dirpool *dp, Id did)
|
|
Packit Service |
ff689b |
{
|
|
Packit Service |
ff689b |
if (!dp->dirtraverse)
|
|
Packit Service |
ff689b |
dirpool_make_dirtraverse(dp);
|
|
Packit Service |
ff689b |
return dp->dirtraverse[did];
|
|
Packit Service |
ff689b |
}
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
static inline void
|
|
Packit Service |
ff689b |
dirpool_free_dirtraverse(Dirpool *dp)
|
|
Packit Service |
ff689b |
{
|
|
Packit Service |
ff689b |
solv_free(dp->dirtraverse);
|
|
Packit Service |
ff689b |
dp->dirtraverse = 0;
|
|
Packit Service |
ff689b |
}
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
static inline Id
|
|
Packit Service |
ff689b |
dirpool_compid(Dirpool *dp, Id did)
|
|
Packit Service |
ff689b |
{
|
|
Packit Service |
ff689b |
return dp->dirs[did];
|
|
Packit Service |
ff689b |
}
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
#ifdef __cplusplus
|
|
Packit Service |
ff689b |
}
|
|
Packit Service |
ff689b |
#endif
|
|
Packit Service |
ff689b |
|
|
Packit Service |
ff689b |
#endif /* LIBSOLV_DIRPOOL_H */
|