#define ROOT ((STATE) 0)
int
-acism_more(ac_trie_t const *psp, MEMREF const text,
- ACISM_ACTION *cb, void *context, int *statep)
+acism_lookup(ac_trie_t const *psp, const char *text, size_t len,
+ ACISM_ACTION *cb, void *context)
{
ac_trie_t const ps = *psp;
- char const *cp = text.ptr, *endp = cp + text.len;
- STATE state = *statep;
+ char const *cp = text, *endp = cp + len;
+ STATE state = 0;
int ret = 0;
while (cp < endp) {
strno = ps.hashv[i].strno;
}
- if ((ret = cb(strno, cp - text.ptr, context)))
+ if ((ret = cb(strno, cp - text, context)))
goto EXIT;
}
}
}
EXIT:
- return *statep = state, ret;
+ return ret;
}
//EOF
#ifndef ACISM_H
#define ACISM_H
+#include "config.h"
// "acism" uses MEMREF {ptr,len} bytevec structs for "string" args,
// rather than NUL-terminated "C" strings.
-#ifndef MSUTIL_H
-#include <stdio.h>
-typedef struct { char const *ptr; size_t len; } MEMREF;
-#endif
+typedef struct { char const *ptr; size_t len; } ac_trie_pat_t;
typedef struct acism ac_trie_t;
-ac_trie_t* acism_create(MEMREF const *strv, int nstrs);
+ac_trie_t* acism_create(ac_trie_pat_t const *strv, int nstrs);
void acism_destroy(ac_trie_t*);
// For each match, acism_scan calls its ACISM_ACTION fn,
// string matches can cross block boundaries.
// *state should initially be (0).
-int acism_more(ac_trie_t const*, MEMREF const text,
- ACISM_ACTION *fn, void *fndata, int *state);
-
-static inline int acism_scan(ac_trie_t const*psp, MEMREF const text,
- ACISM_ACTION *fn, void *fndata)
-{
- int state = 0;
- return acism_more(psp, text, fn, fndata, &state);
-}
+int acism_lookup(ac_trie_t const *psp, const char *text, size_t len,
+ ACISM_ACTION *cb, void *context);
#endif//ACISM_H
if (u & 0x00000002) ret++;
return ret;
}
-static void fill_symv(ac_trie_t*, MEMREF const*, int ns);
-static int create_tree(TNODE*, SYMBOL const*symv, MEMREF const*strv, int nstrs);
+static void fill_symv(ac_trie_t*, ac_trie_pat_t const*, int ns);
+static int create_tree(TNODE*, SYMBOL const*symv, ac_trie_pat_t const*strv, int nstrs);
static void add_backlinks(TNODE*, TNODE**, TNODE**);
static void prune_backlinks(TNODE*);
static int interleave(TNODE*, int nnodes, int nsyms, TNODE**, TNODE**);
//--------------|---------------------------------------------
ac_trie_t*
-acism_create(MEMREF const* strv, int nstrs)
+acism_create(ac_trie_pat_t const* strv, int nstrs)
{
TNODE *tp, **v1 = NULL, **v2 = NULL;
ac_trie_t *psp = calloc(1, sizeof*psp);
static int frcmp(FRANK*a, FRANK*b) { return a->freq - b->freq; }
static void
-fill_symv(ac_trie_t *psp, MEMREF const *strv, int nstrs)
+fill_symv(ac_trie_t *psp, ac_trie_pat_t const *strv, int nstrs)
{
int i, j;
FRANK frv[256];
}
static int
-create_tree(TNODE *Tree, SYMBOL const *symv, MEMREF const *strv, int nstrs)
+create_tree(TNODE *Tree, SYMBOL const *symv, ac_trie_pat_t const *strv, int nstrs)
{
int i, j;
TNODE *nextp = Tree + 1;