|
|
1.1 misha 1: /** @file
2: Parser: @b regex class decls.
3:
4: Copyright (c) 2001-2009 ArtLebedev Group (http://www.artlebedev.com)
5: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
6: */
7:
8: #ifndef PA_VREGEX_H
9: #define PA_VREGEX_H
10:
1.2 ! misha 11: static const char * const IDENT_VREGEX_H="$Date: 2009-04-22 04:34:14 $";
1.1 misha 12:
13: // include
14:
15: #include "classes.h"
16: #include "pa_common.h"
17: #include "pa_vstateless_object.h"
18: #include "pa_charset.h"
19: #include "pcre.h"
20:
21: // defines
22:
23: #define VREGEX_TYPE "regex"
24:
25: enum Match_feature {
26: MF_GLOBAL_SEARCH = 0x01,
27: MF_NEED_PRE_POST_MATCH = 0x02,
28: MF_JUST_COUNT_MATCHES = 0x04
29: };
30:
31: extern Methoded* regex_class;
32:
33: // VRegex
34: class VRegex: public VStateless_object {
35:
36: public: // Value
37:
38: override const char* type() const { return VREGEX_TYPE; }
39: override VStateless_class *get_class() { return regex_class; }
40:
1.2 ! misha 41: /// VRegex: count
! 42: override int as_int() { return get_info_size(); }
! 43:
! 44: /// VRegex: count
! 45: override double as_double() { return as_int(); }
1.1 misha 46:
47: /// VRegex: true
48: override bool is_evaluated_expr() const { return true; }
49:
50: /// VRegex: scalar
51: override Value& as_expr_result(bool/*return_string_as_is=false*/);
52:
53: /// VRegex: true
1.2 ! misha 54: virtual bool is_defined() const { return as_bool(); }
1.1 misha 55:
56: /// VRegex: true
57: override bool as_bool() const { return true; }
58:
59: public: // usage
60:
61: VRegex():
62: fstudied(false) { }
63:
64: VRegex(Charset& acharset, const String* aregex, const String* aoptions):
65: fstudied(false)
66: {
67: set(acharset, aregex, aoptions);
68: compile();
69: }
70:
71: ~VRegex(){
72: if(fextra)
73: pcre_free(fextra);
74: if(fcode)
75: pcre_free(fcode);
76: }
77:
78: void set(Charset& acharset, const String* aregex, const String* aoptions);
79:
80: void compile();
81:
82: void study();
83:
84: int exec(const char* string, size_t string_len, int* ovector, int ovector_size, int prestart=0);
85:
86: // size_t info();
87:
88: size_t full_info(int type);
89:
90: size_t get_info_size();
91:
92: size_t get_study_size();
93:
94: size_t get_options();
95:
96: bool is_pre_post_match_needed(){
97: return (foptions[1] & MF_NEED_PRE_POST_MATCH)!=0;
98: }
99:
100: bool is_just_count(){
101: return (foptions[1] & MF_JUST_COUNT_MATCHES)!=0;
102: }
103:
104: bool is_global_search(){
105: return (foptions[1] & MF_GLOBAL_SEARCH)!=0;
106: }
107:
108: private:
109: static void regex_options(const String* options, int* result);
110:
111: private:
112: Charset* fcharset;
113: const char* fpattern;
114: size_t fpattern_len;
115: int foptions[2];
116:
117: pcre* fcode;
118: pcre_extra* fextra;
119: bool fstudied;
120: };
121:
1.2 ! misha 122:
! 123: class VRegexCleaner {
! 124: public:
! 125: VRegex *vregex;
! 126:
! 127: VRegexCleaner(): vregex(0) { }
! 128:
! 129: ~VRegexCleaner(){
! 130: if(vregex) delete vregex;
! 131: }
! 132:
! 133: };
! 134:
1.1 misha 135:
136: #endif