extensions/regex/CRegEx.cpp
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--
merged branch-1.1.0 back into trunk
     1 #include "pcre.h"
     2 #include "CRegEx.h"
     3 #include <sh_string.h>
     4 #include "extension.h"
     5 
     6 RegEx::RegEx()
     7 {
     8 	mErrorOffset = 0;
     9 	mError = NULL;
    10 	re = NULL;
    11 	mFree = true;
    12 	subject = NULL;
    13 	mSubStrings = 0;
    14 }
    15 
    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 }
    29 
    30 RegEx::~RegEx()
    31 {
    32 	Clear();
    33 }
    34 
    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 }
    45 
    46 int RegEx::Compile(const char *pattern, int iFlags)
    47 {
    48 	if (!mFree)
    49 		Clear();
    50 		
    51 	re = pcre_compile(pattern, iFlags, &mError, &mErrorOffset, NULL);
    52 
    53 	if (re == NULL)
    54 	{
    55 		return 0;
    56 	}
    57 
    58 	mFree = false;
    59 
    60 	return 1;
    61 }
    62 
    63 int RegEx::Match(const char *str)
    64 {
    65 	int rc = 0;
    66 
    67 	if (mFree || re == NULL)
    68 		return -1;
    69 		
    70 	this->ClearMatch();
    71 
    72 	//save str
    73 	subject = new char[strlen(str)+1];
    74 	strcpy(subject, str);
    75 
    76 	rc = pcre_exec(re, NULL, subject, (int)strlen(subject), 0, 0, ovector, 30);
    77 
    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 	}
    88 
    89 	mSubStrings = rc;
    90 
    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 }
   103 
   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;
   109 
   110 	char *substr_a = subject + ovector[2*s];
   111 	int substr_l = ovector[2*s+1] - ovector[2*s];
   112 
   113 	for (i = 0; i<substr_l; i++)
   114 	{
   115 		if (i >= max)
   116 			break;
   117 		buffer[i] = substr_a[i];
   118 	}
   119 
   120 	buffer[i] = '\0';
   121 
   122 	return buffer;
   123 }
   124