#ifndef RE_MEMO_H
#define RE_MEMO_H
#include <stddef.h>
typedef struct {
unsigned char* memo;
size_t entry_node;
size_t entry_offset;
size_t memo_stride;
} re_memo_ctx_t;
#define RE_MEMO_IDX(ctx) \
((ctx).entry_node * (ctx).memo_stride + (ctx).entry_offset)
#define RE_MEMO_GET(ctx) \
(((ctx).memo[RE_MEMO_IDX(ctx) / 8u] >> (RE_MEMO_IDX(ctx) % 8u)) & 1u)
#define RE_MEMO_SET(ctx) \
((ctx).memo[RE_MEMO_IDX(ctx) / 8u] |= (1u << (RE_MEMO_IDX(ctx) % 8u)))
#define RE_MEMO_FAIL(memo_ctx, match_ctx, pre_len, r_expr) do { \
int _r = (r_expr); \
if (!_r) { \
*(match_ctx)->matchlength = (pre_len); \
if ((memo_ctx).memo && (memo_ctx).entry_offset < (memo_ctx).memo_stride) \
RE_MEMO_SET(memo_ctx); \
} \
return _r; \
} while (0)
#endif