mirror of
https://github.com/rspamd/rspamd.git
synced 2024-08-26 17:54:48 +02:00
78 lines
1.6 KiB
C
78 lines
1.6 KiB
C
/*
|
|
** $Id: lptree.h,v 1.2 2013/03/24 13:51:12 roberto Exp $
|
|
*/
|
|
|
|
#if !defined(lptree_h)
|
|
#define lptree_h
|
|
|
|
|
|
#include "lptypes.h"
|
|
|
|
|
|
/*
|
|
** types of trees
|
|
*/
|
|
typedef enum TTag {
|
|
TChar = 0, TSet, TAny, /* standard PEG elements */
|
|
TTrue, TFalse,
|
|
TRep,
|
|
TSeq, TChoice,
|
|
TNot, TAnd,
|
|
TCall,
|
|
TOpenCall,
|
|
TRule, /* sib1 is rule's pattern, sib2 is 'next' rule */
|
|
TGrammar, /* sib1 is initial (and first) rule */
|
|
TBehind, /* match behind */
|
|
TCapture, /* regular capture */
|
|
TRunTime /* run-time capture */
|
|
} TTag;
|
|
|
|
/* number of siblings for each tree */
|
|
extern const byte numsiblings[];
|
|
|
|
|
|
/*
|
|
** Tree trees
|
|
** The first sibling of a tree (if there is one) is immediately after
|
|
** the tree. A reference to a second sibling (ps) is its position
|
|
** relative to the position of the tree itself. A key in ktable
|
|
** uses the (unique) address of the original tree that created that
|
|
** entry. NULL means no data.
|
|
*/
|
|
typedef struct TTree {
|
|
byte tag;
|
|
byte cap; /* kind of capture (if it is a capture) */
|
|
unsigned short key; /* key in ktable for Lua data (0 if no key) */
|
|
union {
|
|
int ps; /* occasional second sibling */
|
|
int n; /* occasional counter */
|
|
} u;
|
|
} TTree;
|
|
|
|
|
|
/*
|
|
** A complete pattern has its tree plus, if already compiled,
|
|
** its corresponding code
|
|
*/
|
|
typedef struct Pattern {
|
|
union Instruction *code;
|
|
int codesize;
|
|
TTree tree[1];
|
|
} Pattern;
|
|
|
|
|
|
/* number of siblings for each tree */
|
|
extern const byte numsiblings[];
|
|
|
|
/* access to siblings */
|
|
#define sib1(t) ((t) + 1)
|
|
#define sib2(t) ((t) + (t)->u.ps)
|
|
|
|
|
|
int luaopen_lpeg (lua_State *L);
|
|
|
|
|
|
|
|
#endif
|
|
|