#if !defined(__COLL_H__)
#define __COLL_H__
#include "bwstring.h"
#include "sort.h"
struct n_hint {
unsigned long long n1;
unsigned char si;
bool empty;
bool neg;
};
struct g_hint {
double d;
bool nan;
bool notnum;
};
struct M_hint {
int m;
};
typedef enum {
HS_ERROR = -1, HS_UNINITIALIZED = 0, HS_INITIALIZED = 1
} hint_status;
struct key_hint {
hint_status status;
union
{
struct n_hint nh;
struct g_hint gh;
struct M_hint Mh;
} v;
};
struct key_value {
struct bwstring *k;
struct key_hint hint[0];
};
struct keys_array {
struct key_value key[0];
};
struct key_specs {
struct sort_mods sm;
size_t c1;
size_t c2;
size_t f1;
size_t f2;
bool pos1b;
bool pos2b;
};
struct sort_list_item {
struct bwstring *str;
struct keys_array ka;
};
typedef int (*listcoll_t)(struct sort_list_item **ss1, struct sort_list_item **ss2);
extern struct key_specs *keys;
extern size_t keys_num;
cmpcoll_t get_sort_func(struct sort_mods *sm);
struct keys_array *keys_array_alloc(void);
size_t keys_array_size(void);
void set_key_on_keys_array(struct keys_array *ka, struct bwstring *s, size_t ind);
void clean_keys_array(const struct bwstring *s, struct keys_array *ka);
struct sort_list_item *sort_list_item_alloc(void);
void sort_list_item_set(struct sort_list_item *si, struct bwstring *str);
void sort_list_item_clean(struct sort_list_item *si);
size_t sort_list_item_size(struct sort_list_item *si);
int preproc(struct bwstring *s, struct keys_array *ka);
int top_level_str_coll(const struct bwstring *, const struct bwstring *);
int key_coll(struct keys_array *ks1, struct keys_array *ks2, size_t offset);
int str_list_coll(struct bwstring *str1, struct sort_list_item **ss2);
int list_coll_by_str_only(struct sort_list_item **ss1, struct sort_list_item **ss2);
int list_coll(const void *ss1, const void *ss2);
int list_coll_offset(struct sort_list_item **ss1, struct sort_list_item **ss2, size_t offset);
listcoll_t get_list_call_func(size_t offset);
#endif