RPA Toolkit
implemented more compiler optimizations and postfix/prefix expressions
[rpatk.git] / rpa / rpastat.h
1 /*
2  *  Regular Pattern Analyzer (RPA)
3  *  Copyright (c) 2009-2010 Martin Stoilov
4  *
5  *  This program is free software: you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation, either version 3 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  *
18  *  Martin Stoilov <martin@rpasearch.com>
19  */
20
21 #ifndef _RPASTAT_H_
22 #define _RPASTAT_H_
23
24 #include "rpaconfig.h"
25 #include "rpaclass.h"
26 #include "rpalist.h"
27 #include "rpautf.h"
28 #include "rpatypes.h"
29 #include "rpatypedef.h"
30 #include "rpadbex.h"
31 #include "rpacbrecord.h"
32
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36
37 #define RPA_LOOPHASH_SIZE (1 << RPA_LOOPHASH_BITS)
38 #define RPA_LOOPHASH_MASK (RPA_LOOPHASH_SIZE - 1)
39 #define RPA_LOOPHASH(p) (((((rpa_word_t)(p)) >> 2) ^ (((rpa_word_t)(p)) >> 4))& RPA_LOOPHASH_MASK)
40
41 #define RPA_MCACHE_SIZE (1 << RPA_MCACHE_BITS)
42 #define RPA_MCACHE_MASK (RPA_MCACHE_SIZE - 1)
43 #define RPA_MCACHEHASH(_p_, _i_, _d_) ( ( ((rpa_word_t)(_p_)) ^ ((rpa_word_t)(_i_)) ^ (_d_)) & RPA_MCACHE_MASK)
44
45 typedef int (*RPA_CHECKSTACK_FUNCTION)(rpa_stat_t *stat);
46
47
48 typedef struct rpa_dloop_s {
49         rpa_link_t lnk;
50         rpa_match_t *match;
51         const char *input;
52         int size;
53         rpa_mnode_t *mnode;
54 } rpa_dloop_t;
55
56
57 typedef struct rpa_mcache_s {
58         rpa_match_t *match;
59         const char *input;
60         rpa_cbset_t cbset;
61         int ret;
62         int cbdisable;
63 } rpa_mcache_t;
64
65
66 struct rpa_stat_s {
67         rpa_dbex_t *hDbex;
68         /* 
69          * start and end members mark the beginning and the ending of the
70          * input stream.
71          */
72         const char *start;
73         const char *end;
74         unsigned char fail;
75         unsigned long usedstack;
76         unsigned long maxstack;
77         const unsigned char *stackmark;
78         rpa_word_t highbound;
79         rpa_mcache_t mcache[RPA_MCACHE_SIZE];
80         rpa_mcache_t ncache[RPA_MCACHE_SIZE];
81         rpa_head_t loophash[RPA_LOOPHASH_SIZE];
82         rpa_head_t loopstack;
83         rpa_word_t ud[2];
84         RPA_MATCH_FUNCTION *mtable;
85         RPA_MNODE_FUNCTION *ntable;
86         RPA_CHECKSTACK_FUNCTION checkstack;
87         rpa_progress_callback progress;
88         rpa_cbset_t cbset;
89         void *progress_userdata;
90         int (*getchar)(unsigned int *pwc, rpa_stat_t *stat, const char *input);
91         const char *where;
92         unsigned char usecache; 
93         unsigned char cbdisable;
94 };
95
96
97 int rpa_stat_getchar(unsigned int *pwc, rpa_stat_t *stat, const char *input);
98 int rpa_stat_utf8_getchar(unsigned int *pwc, rpa_stat_t *stat, const char *input);
99 int rpa_stat_utf16_getchar(unsigned int *pwc, rpa_stat_t *stat, const char *input);
100 int rpa_stat_byte_getchar(unsigned int *pwc, rpa_stat_t *stat, const char *input);
101 void rpa_stat_init(rpa_stat_t *stat);
102 void rpa_stat_cleanup(rpa_stat_t *stat);
103 int rpa_stat_checkstack_ascending(rpa_stat_t *stat);
104 int rpa_stat_checkstack_descending(rpa_stat_t *stat);
105 rpa_dloop_t *rpa_stat_current_loop(rpa_stat_t *stat);
106 void rpa_stat_cache_reset(rpa_stat_t *stat);
107 int rpa_stat_match_lite(rpa_stat_handle hStat, rpa_pattern_handle hPattern, const char *input, const char *start, const char *end);
108
109
110 #ifdef __cplusplus
111 }
112 #endif
113
114 #endif