update fst struct
This commit is contained in:
parent
4e9fba6dd3
commit
21592f572e
|
@ -181,6 +181,8 @@ static FstState stateDict[] = {
|
||||||
{.state = AnyTrans, .val = 0b00000000},
|
{.state = AnyTrans, .val = 0b00000000},
|
||||||
{.state = EmptyFinal, .val = 0b00000000}
|
{.state = EmptyFinal, .val = 0b00000000}
|
||||||
};
|
};
|
||||||
|
// debug
|
||||||
|
static char *fStStateStr[] = {"ONE_TRANS_NEXT", "ONE_TRANS", "ANY_TRANS", "EMPTY_FINAL"};
|
||||||
|
|
||||||
FstState fstStateCreate(State state){
|
FstState fstStateCreate(State state){
|
||||||
uint8_t idx = (uint8_t)state;
|
uint8_t idx = (uint8_t)state;
|
||||||
|
@ -507,7 +509,6 @@ FstNode *fstNodeCreate(int64_t version, CompiledAddr addr, FstSlice *slice) {
|
||||||
n->sizes = sz;
|
n->sizes = sz;
|
||||||
n->finalOutput = 0;
|
n->finalOutput = 0;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
uint64_t sz = fstStateSizes(&st, slice); // s.sizes(data)
|
uint64_t sz = fstStateSizes(&st, slice); // s.sizes(data)
|
||||||
uint32_t nTrans = fstStateNtrans(&st, slice); // s.ntrans(data)
|
uint32_t nTrans = fstStateNtrans(&st, slice); // s.ntrans(data)
|
||||||
n->data = *slice;
|
n->data = *slice;
|
||||||
|
@ -539,19 +540,19 @@ FstTransitions* fstNodeTransitions(FstNode *node) {
|
||||||
// Returns the transition at index `i`.
|
// Returns the transition at index `i`.
|
||||||
bool fstNodeGetTransitionAt(FstNode *node, uint64_t i, FstTransition *trn) {
|
bool fstNodeGetTransitionAt(FstNode *node, uint64_t i, FstTransition *trn) {
|
||||||
bool s = true;
|
bool s = true;
|
||||||
//FstState st = node->state;
|
FstState *st = &node->state;
|
||||||
if (FST_STATE_ONE_TRNAS_NEXT(node)) {
|
if (st->state == OneTransNext) {
|
||||||
trn->inp = 0;
|
trn->inp = fstStateInput(st, node);
|
||||||
trn->out = 0;
|
trn->out = 0;
|
||||||
trn->addr = 0;
|
trn->addr = fstStateTransAddr(st, node);
|
||||||
} else if (FST_STATE_ONE_TRNAS(node)) {
|
} else if (st->state == OneTrans) {
|
||||||
trn->inp = 0;
|
trn->inp = fstStateInput(st, node);
|
||||||
trn->out = 0;
|
trn->out = fstStateOutput(st, node);
|
||||||
trn->addr = 0;
|
trn->addr = fstStateTransAddr(st, node);
|
||||||
} else if (FST_STATE_ANY_TRANS(node)) {
|
} else if (st->state == AnyTrans) {
|
||||||
trn->inp = 0;
|
trn->inp = fstStateInputForAnyTrans(st, node, i);
|
||||||
trn->out = 0;
|
trn->out = fstStateOutputForAnyTrans(st, node, i);
|
||||||
trn->addr = 0;
|
trn->addr = fstStateTransAddrForAnyTrans(st, node, i);
|
||||||
} else {
|
} else {
|
||||||
s = false;
|
s = false;
|
||||||
}
|
}
|
||||||
|
@ -561,12 +562,15 @@ bool fstNodeGetTransitionAt(FstNode *node, uint64_t i, FstTransition *trn) {
|
||||||
// Returns the transition address of the `i`th transition
|
// Returns the transition address of the `i`th transition
|
||||||
bool fstNodeGetTransitionAddrAt(FstNode *node, uint64_t i, CompiledAddr *res) {
|
bool fstNodeGetTransitionAddrAt(FstNode *node, uint64_t i, CompiledAddr *res) {
|
||||||
bool s = true;
|
bool s = true;
|
||||||
if (FST_STATE_ONE_TRNAS_NEXT(node)) {
|
FstState *st = &node->state;
|
||||||
|
if (st->state == OneTransNext) {
|
||||||
} else if (FST_STATE_ONE_TRNAS(node)) {
|
assert(i == 0);
|
||||||
|
fstStateTransAddr(st, node);
|
||||||
} else if (FST_STATE_ANY_TRANS(node)) {
|
} else if (st->state == OneTrans) {
|
||||||
|
assert(i == 0);
|
||||||
|
fstStateTransAddr(st, node);
|
||||||
|
} else if (st->state == AnyTrans) {
|
||||||
|
fstStateTransAddrForAnyTrans(st, node, i);
|
||||||
} else if (FST_STATE_EMPTY_FINAL(node)){
|
} else if (FST_STATE_EMPTY_FINAL(node)){
|
||||||
s = false;
|
s = false;
|
||||||
} else {
|
} else {
|
||||||
|
@ -579,19 +583,19 @@ bool fstNodeGetTransitionAddrAt(FstNode *node, uint64_t i, CompiledAddr *res) {
|
||||||
// If no transition for this byte exists, then `false` is returned.
|
// If no transition for this byte exists, then `false` is returned.
|
||||||
bool fstNodeFindInput(FstNode *node, uint8_t b, uint64_t *res) {
|
bool fstNodeFindInput(FstNode *node, uint8_t b, uint64_t *res) {
|
||||||
bool s = true;
|
bool s = true;
|
||||||
uint8_t input; // get s.input
|
FstState *st = &node->state;
|
||||||
FstState fs = node->state;
|
if (st->state == OneTransNext) {
|
||||||
if (FST_STATE_ONE_TRNAS_NEXT(node)) {
|
if (fstStateInput(st,node) == b) { *res = 0; }
|
||||||
if (b == input) { *res = 0; }
|
else { s = false; } }
|
||||||
else { return s ; }
|
else if (st->state == OneTrans) {
|
||||||
} else if (FST_STATE_ONE_TRNAS(node)) {
|
if (fstStateInput(st, node) == b) { *res = 0 ;}
|
||||||
if (b == input) { *res = 0; }
|
else { s = false; }
|
||||||
else {return s;}
|
} else if (st->state == AnyTrans) {
|
||||||
} else if (FST_STATE_ANY_TRANS(node)) {
|
bool null = false;
|
||||||
|
uint64_t out = fstStateFindInput(st, node, b, &null);
|
||||||
} else if (FST_STATE_EMPTY_FINAL(node)) {
|
if (null == false) { *res = out; }
|
||||||
s = false;
|
else { s = false;}
|
||||||
}
|
}
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue