#ifndef SCRATCH_H_DA6D4FC06FF410
#define SCRATCH_H_DA6D4FC06FF410
#include "hs_common.h"
#include "ue2common.h"
#include "rose/rose_types.h"
#ifdef __cplusplus
extern "C"
{
#endif
UNUSED static const u32 SCRATCH_MAGIC = 0x544F4259;
struct fatbit;
struct hs_scratch;
struct RoseEngine;
struct mq;
struct queue_match {
size_t loc;
u32 queue;
};
struct catchup_pq {
struct queue_match *qm;
u32 qm_size;
};
#define STATUS_TERMINATED (1U << 0)
#define STATUS_EXHAUSTED (1U << 1)
#define STATUS_DELAY_DIRTY (1U << 2)
#define STATUS_ERROR (1U << 3)
struct core_info {
void *userContext;
int (HS_CDECL *userCallback)(unsigned int id, unsigned long long from,
unsigned long long to, unsigned int flags,
void *ctx);
const struct RoseEngine *rose;
char *state;
char *exhaustionVector;
char *logicalVector;
char *combVector;
const u8 *buf;
size_t len;
const u8 *hbuf;
size_t hlen;
u64a buf_offset;
u8 status;
};
struct RoseContext {
u8 mpv_inactive;
u64a groups;
u64a lit_offset_adjust;
u64a delayLastEndOffset;
u64a lastEndOffset;
u64a lastMatchOffset;
u64a lastCombMatchOffset;
u64a minMatchOffset;
u64a minNonMpvMatchOffset;
u64a next_mpv_offset;
u32 filledDelayedSlots;
u32 curr_qi;
const u8 *ll_buf;
size_t ll_len;
const u8 *ll_buf_nocase;
size_t ll_len_nocase;
};
struct match_deduper {
struct fatbit *log[2];
struct fatbit *som_log[2];
u64a *som_start_log[2];
u32 dkey_count;
u32 log_size;
u64a current_report_offset;
u8 som_log_dirty;
};
struct ALIGN_CL_DIRECTIVE hs_scratch {
u32 magic;
u8 in_use;
u32 queueCount;
u32 activeQueueArraySize;
u32 bStateSize;
u32 tStateSize;
u32 fullStateSize;
struct RoseContext tctxt;
char *bstate;
char *tstate;
char *fullState;
struct mq *queues;
struct fatbit *aqa;
struct fatbit **delay_slots;
struct fatbit **al_log;
u64a al_log_sum;
struct catchup_pq catchup_pq;
struct core_info core_info;
struct match_deduper deduper;
u32 anchored_literal_region_len;
u32 anchored_literal_fatbit_size;
struct fatbit *handled_roles;
u64a *som_store;
u64a *som_attempted_store;
struct fatbit *som_set_now;
struct fatbit *som_attempted_set;
u64a som_set_now_offset;
u32 som_store_count;
u32 som_fatbit_size;
u32 handledKeyFatbitSize;
u32 delay_fatbit_size;
u32 scratchSize;
char *scratch_alloc;
u64a *fdr_conf;
u8 fdr_conf_offset;
};
static really_inline
struct fatbit **getAnchoredLiteralLog(struct hs_scratch *scratch) {
return scratch->al_log;
}
static really_inline
struct fatbit **getDelaySlots(struct hs_scratch *scratch) {
return scratch->delay_slots;
}
static really_inline
char told_to_stop_matching(const struct hs_scratch *scratch) {
return scratch->core_info.status & STATUS_TERMINATED;
}
static really_inline
char can_stop_matching(const struct hs_scratch *scratch) {
return scratch->core_info.status &
(STATUS_TERMINATED | STATUS_EXHAUSTED | STATUS_ERROR);
}
static really_inline
char internal_matching_error(const struct hs_scratch *scratch) {
return scratch->core_info.status & STATUS_ERROR;
}
static really_inline
char markScratchInUse(struct hs_scratch *scratch) {
DEBUG_PRINTF("marking scratch as in use\n");
assert(scratch && scratch->magic == SCRATCH_MAGIC);
if (scratch->in_use) {
DEBUG_PRINTF("scratch already in use!\n");
return 1;
}
scratch->in_use = 1;
return 0;
}
static really_inline
void unmarkScratchInUse(struct hs_scratch *scratch) {
DEBUG_PRINTF("marking scratch as not in use\n");
assert(scratch && scratch->magic == SCRATCH_MAGIC);
assert(scratch->in_use == 1);
scratch->in_use = 0;
}
#ifdef __cplusplus
}
#endif
#endif