| author | David Anderson <dvander@alliedmods.net> |
| Wed Mar 26 03:52:37 2008 +0000 (2008-03-26) | |
| changeset 1945 | 13106cdc0a3c |
| child 1987 | 0534b0a2ffda |
| permissions | -rw-r--r-- |
1 #include "pcre.h"
2 #include "CRegEx.h"
3 #include <sh_string.h>
4 #include "extension.h"
6 RegEx::RegEx()
7 {
8 mErrorOffset = 0;
9 mError = NULL;
10 re = NULL;
11 mFree = true;
12 subject = NULL;
13 mSubStrings = 0;
14 }
16 void RegEx::Clear ()
17 {
18 mErrorOffset = 0;
19 mError = NULL;
20 if (re)
21 pcre_free(re);
22 re = NULL;
23 mFree = true;
24 if (subject)
25 delete [] subject;
26 subject = NULL;
27 mSubStrings = 0;
28 }
30 RegEx::~RegEx()
31 {
32 Clear();
33 }
35 bool RegEx::isFree(bool set, bool val)
36 {
37 if (set)
38 {
39 mFree = val;
40 return true;
41 } else {
42 return mFree;
43 }
44 }
46 int RegEx::Compile(const char *pattern, int iFlags)
47 {
48 if (!mFree)
49 Clear();
51 re = pcre_compile(pattern, iFlags, &mError, &mErrorOffset, NULL);
53 if (re == NULL)
54 {
55 return 0;
56 }
58 mFree = false;
60 return 1;
61 }
63 int RegEx::Match(const char *str)
64 {
65 int rc = 0;
67 if (mFree || re == NULL)
68 return -1;
70 this->ClearMatch();
72 //save str
73 subject = new char[strlen(str)+1];
74 strcpy(subject, str);
76 rc = pcre_exec(re, NULL, subject, (int)strlen(subject), 0, 0, ovector, 30);
78 if (rc < 0)
79 {
80 if (rc == PCRE_ERROR_NOMATCH)
81 {
82 return 0;
83 } else {
84 mErrorOffset = rc;
85 return -1;
86 }
87 }
89 mSubStrings = rc;
91 return 1;
92 }
93 void RegEx::ClearMatch()
94 {
95 // Clears match results
96 mErrorOffset = 0;
97 mError = NULL;
98 if (subject)
99 delete [] subject;
100 subject = NULL;
101 mSubStrings = 0;
102 }
104 const char *RegEx::GetSubstring(int s, char buffer[], int max)
105 {
106 int i = 0;
107 if (s >= mSubStrings || s < 0)
108 return NULL;
110 char *substr_a = subject + ovector[2*s];
111 int substr_l = ovector[2*s+1] - ovector[2*s];
113 for (i = 0; i<substr_l; i++)
114 {
115 if (i >= max)
116 break;
117 buffer[i] = substr_a[i];
118 }
120 buffer[i] = '\0';
122 return buffer;
123 }