123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- #if !defined(lpcap_h)
- #define lpcap_h
- #include "lptypes.h"
- /* kinds of captures */
- typedef enum CapKind {
- Cclose, /* not used in trees */
- Cposition,
- Cconst, /* ktable[key] is Lua constant */
- Cbackref, /* ktable[key] is "name" of group to get capture */
- Carg, /* 'key' is arg's number */
- Csimple, /* next node is pattern */
- Ctable, /* next node is pattern */
- Cfunction, /* ktable[key] is function; next node is pattern */
- Cacc, /* ktable[key] is function; next node is pattern */
- Cquery, /* ktable[key] is table; next node is pattern */
- Cstring, /* ktable[key] is string; next node is pattern */
- Cnum, /* numbered capture; 'key' is number of value to return */
- Csubst, /* substitution capture; next node is pattern */
- Cfold, /* ktable[key] is function; next node is pattern */
- Cruntime, /* not used in trees (is uses another type for tree) */
- Cgroup /* ktable[key] is group's "name" */
- } CapKind;
- /*
- ** An unsigned integer large enough to index any subject entirely.
- ** It can be size_t, but that will double the size of the array
- ** of captures in a 64-bit machine.
- */
- #if !defined(Index_t)
- typedef uint Index_t;
- #endif
- #define MAXINDT (~(Index_t)0)
- typedef struct Capture {
- Index_t index; /* subject position */
- unsigned short idx; /* extra info (group name, arg index, etc.) */
- byte kind; /* kind of capture */
- byte siz; /* size of full capture + 1 (0 = not a full capture) */
- } Capture;
- typedef struct CapState {
- Capture *cap; /* current capture */
- Capture *ocap; /* (original) capture list */
- lua_State *L;
- int ptop; /* stack index of last argument to 'match' */
- int firstcap; /* stack index of first capture pushed in the stack */
- const char *s; /* original string */
- int valuecached; /* value stored in cache slot */
- int reclevel; /* recursion level */
- } CapState;
- #define captype(cap) ((cap)->kind)
- #define isclosecap(cap) (captype(cap) == Cclose)
- #define isopencap(cap) ((cap)->siz == 0)
- /* true if c2 is (any number of levels) inside c1 */
- #define capinside(c1,c2) \
- (isopencap(c1) ? !isclosecap(c2) \
- : (c2)->index < (c1)->index + (c1)->siz - 1)
- /**
- ** Maximum number of captures to visit when looking for an 'open'.
- */
- #define MAXLOP 20
- int runtimecap (CapState *cs, Capture *close, const char *s, int *rem);
- int getcaptures (lua_State *L, const char *s, const char *r, int ptop);
- int finddyncap (Capture *cap, Capture *last);
- #endif
|