#ifndef LIBSOLV_DATAITERATOR_H
#define LIBSOLV_DATAITERATOR_H
#include "pooltypes.h"
#include "pool.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct s_KeyValue {
Id id;
const char *str;
unsigned int num;
unsigned int num2;
int entry;
int eof;
struct s_KeyValue *parent;
} KeyValue;
#define SOLV_KV_NUM64(kv) (((unsigned long long)((kv)->num2)) << 32 | (kv)->num)
#define SEARCH_STRINGMASK 15
#define SEARCH_STRING 1
#define SEARCH_STRINGSTART 2
#define SEARCH_STRINGEND 3
#define SEARCH_SUBSTRING 4
#define SEARCH_GLOB 5
#define SEARCH_REGEX 6
#define SEARCH_ERROR 15
#define SEARCH_NOCASE (1<<7)
#define SEARCH_NO_STORAGE_SOLVABLE (1<<8)
#define SEARCH_SUB (1<<9)
#define SEARCH_ARRAYSENTINEL (1<<10)
#define SEARCH_DISABLED_REPOS (1<<11)
#define SEARCH_KEEP_TYPE_DELETED (1<<12)
#define SEARCH_SKIP_KIND (1<<16)
#define SEARCH_FILES (1<<17)
#define SEARCH_CHECKSUMS (1<<18)
#ifdef LIBSOLV_INTERNAL
#define SEARCH_SUBSCHEMA (1<<30)
#endif
#define SEARCH_THISSOLVID (1<<31)
#define SEARCH_COMPLETE_FILELIST 0
typedef struct s_Datamatcher {
int flags;
const char *match;
void *matchdata;
int error;
} Datamatcher;
int datamatcher_init(Datamatcher *ma, const char *match, int flags);
void datamatcher_free(Datamatcher *ma);
int datamatcher_match(Datamatcher *ma, const char *str);
int datamatcher_checkbasename(Datamatcher *ma, const char *str);
typedef struct s_Dataiterator
{
int state;
int flags;
Pool *pool;
Repo *repo;
Repodata *data;
unsigned char *dp;
unsigned char *ddp;
Id *idp;
Id *keyp;
struct s_Repokey *key;
KeyValue kv;
Datamatcher matcher;
Id keyname;
Id repodataid;
Id solvid;
Id repoid;
Id keynames[3 + 1];
int nkeynames;
int rootlevel;
struct di_parent {
KeyValue kv;
unsigned char *dp;
Id *keyp;
} parents[3];
int nparents;
unsigned char *vert_ddp;
Id vert_off;
Id vert_len;
Id vert_storestate;
char *dupstr;
int dupstrn;
Id *keyskip;
Id *oldkeyskip;
} Dataiterator;
int dataiterator_init(Dataiterator *di, Pool *pool, Repo *repo, Id p, Id keyname, const char *match, int flags);
void dataiterator_init_clone(Dataiterator *di, Dataiterator *from);
void dataiterator_set_search(Dataiterator *di, Repo *repo, Id p);
void dataiterator_set_keyname(Dataiterator *di, Id keyname);
int dataiterator_set_match(Dataiterator *di, const char *match, int flags);
void dataiterator_prepend_keyname(Dataiterator *di, Id keyname);
void dataiterator_free(Dataiterator *di);
int dataiterator_step(Dataiterator *di);
void dataiterator_setpos(Dataiterator *di);
void dataiterator_setpos_parent(Dataiterator *di);
int dataiterator_match(Dataiterator *di, Datamatcher *ma);
void dataiterator_skip_attribute(Dataiterator *di);
void dataiterator_skip_solvable(Dataiterator *di);
void dataiterator_skip_repo(Dataiterator *di);
void dataiterator_jump_to_solvid(Dataiterator *di, Id solvid);
void dataiterator_jump_to_repo(Dataiterator *di, Repo *repo);
void dataiterator_entersub(Dataiterator *di);
void dataiterator_clonepos(Dataiterator *di, Dataiterator *from);
void dataiterator_seek(Dataiterator *di, int whence);
void dataiterator_strdup(Dataiterator *di);
#define DI_SEEK_STAY (1 << 16)
#define DI_SEEK_CHILD 1
#define DI_SEEK_PARENT 2
#define DI_SEEK_REWIND 3
#ifdef __cplusplus
}
#endif
#endif