]>
jfr.im git - irc/quakenet/newserv.git/blob - newsearch/ns-regex.c
12 struct regex_localdata
{
13 struct searchNode
*targnode
;
14 struct searchNode
*patnode
;
16 pcre_extra
*pcre_extra
;
19 void *regex_exe(struct searchNode
*thenode
, int type
, void *theinput
);
20 void regex_free(struct searchNode
*thenode
);
22 struct searchNode
*regex_parse(int type
, int argc
, char **argv
) {
23 struct regex_localdata
*localdata
;
24 struct searchNode
*thenode
;
25 struct searchNode
*targnode
, *patnode
;
29 pcre_extra
*pcre_extra
;
32 parseError
="regex: usage: regex source pattern";
36 if (!(targnode
= search_parse(type
, argv
[0])))
39 if (!(patnode
= search_parse(type
, argv
[1]))) {
40 (targnode
->free
)(targnode
);
44 if (!(patnode
->returntype
& RETURNTYPE_CONST
)) {
45 parseError
="regex: only constant regexes allowed";
46 (targnode
->free
)(targnode
);
47 (patnode
->free
)(patnode
);
51 if (!(pcre
=pcre_compile((char *)(patnode
->exe
)(patnode
,RETURNTYPE_STRING
,NULL
),
52 PCRE_CASELESS
, &err
, &erroffset
, NULL
))) {
57 pcre_extra
=pcre_study(pcre
, 0, &err
);
59 localdata
=(struct regex_localdata
*)malloc(sizeof (struct regex_localdata
));
61 localdata
->targnode
=targnode
;
62 localdata
->patnode
=patnode
;
64 localdata
->pcre_extra
=pcre_extra
;
66 thenode
= (struct searchNode
*)malloc(sizeof (struct searchNode
));
68 thenode
->returntype
= RETURNTYPE_BOOL
;
69 thenode
->localdata
= localdata
;
70 thenode
->exe
= regex_exe
;
71 thenode
->free
= regex_free
;
76 void *regex_exe(struct searchNode
*thenode
, int type
, void *theinput
) {
77 struct regex_localdata
*localdata
;
80 localdata
= thenode
->localdata
;
82 target
= (char *)((localdata
->targnode
->exe
)(localdata
->targnode
,RETURNTYPE_STRING
, theinput
));
84 if (pcre_exec(localdata
->pcre
, localdata
->pcre_extra
,target
,strlen(target
),0,
87 return falseval(type
);
93 void regex_free(struct searchNode
*thenode
) {
94 struct regex_localdata
*localdata
;
96 localdata
=thenode
->localdata
;
98 if (localdata
->pcre_extra
)
99 pcre_free(localdata
->pcre_extra
);
102 pcre_free(localdata
->pcre
);
104 (localdata
->patnode
->free
)(localdata
->patnode
);
105 (localdata
->targnode
->free
)(localdata
->targnode
);