2008-10-04 22:59:11 +02:00
/**
2016-08-23 15:34:00 +02:00
* vim : set ts = 4 sw = 4 tw = 99 noet :
2008-10-04 22:59:11 +02:00
* =============================================================================
2009-04-14 23:40:48 +02:00
* SourceMod ( C ) 2004 - 2008 AlliedModders LLC . All rights reserved .
2008-10-04 22:59:11 +02:00
* =============================================================================
*
* This file is part of the SourceMod / SourcePawn SDK .
*
* This program is free software ; you can redistribute it and / or modify it under
* the terms of the GNU General Public License , version 3.0 , as published by the
* Free Software Foundation .
*
* This program is distributed in the hope that it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE . See the GNU General Public License for more
* details .
*
* You should have received a copy of the GNU General Public License along with
* this program . If not , see < http :// www . gnu . org / licenses />.
*
* As a special exception , AlliedModders LLC gives you permission to link the
* code of this program ( as well as its derivative works ) to " Half-Life 2, " the
* " Source Engine, " the " SourcePawn JIT, " and any Game MODs that run on software
* by the Valve Corporation . You must obey the GNU General Public License in
* all respects for all other code used . Additionally , AlliedModders LLC grants
* this exception to all derivative works . AlliedModders LLC defines further
* exceptions , found in LICENSE . txt ( as of this writing , version JULY - 31 - 2007 ),
* or < http :// www . sourcemod . net / license . php >.
*
2009-04-14 23:40:48 +02:00
* Version : $Id $
2008-10-04 22:59:11 +02:00
*/
#if defined _regex_included
#endinput
#endif
#define _regex_included
/**
* @ section Flags for compiling regex expressions . These come directly from the
* pcre library and can be used in MatchRegex and CompileRegex .
*/
#define PCRE_CASELESS 0x00000001 /* Ignore Case */
#define PCRE_MULTILINE 0x00000002 /* Multilines (affects ^ and $ so that they match the start/end of a line rather than matching the start/end of the string). */
#define PCRE_DOTALL 0x00000004 /* Single line (affects . so that it matches any character, even new line characters). */
#define PCRE_EXTENDED 0x00000008 /* Pattern extension (ignore whitespace and # comments). */
2014-07-30 11:03:42 +02:00
#define PCRE_ANCHORED 0x00000010 /* Force pattern anchoring. */
#define PCRE_DOLLAR_ENDONLY 0x00000020 /* $ not to match newline at end. */
2008-10-04 22:59:11 +02:00
#define PCRE_UNGREEDY 0x00000200 /* Invert greediness of quantifiers */
2014-07-30 11:03:42 +02:00
#define PCRE_NOTEMPTY 0x00000400 /* An empty string is not a valid match. */
2008-10-04 22:59:11 +02:00
#define PCRE_UTF8 0x00000800 /* Use UTF-8 Chars */
#define PCRE_NO_UTF8_CHECK 0x00002000 /* Do not check the pattern for UTF-8 validity (only relevant if PCRE_UTF8 is set) */
2014-07-30 11:03:42 +02:00
#define PCRE_UCP 0x20000000 /* Use Unicode properties for \ed, \ew, etc. */
2008-10-04 22:59:11 +02:00
/**
* Regex expression error codes .
*/
enum RegexError
{
REGEX_ERROR_NONE = 0 , /* No error */
REGEX_ERROR_NOMATCH = - 1 , /* No match was found */
REGEX_ERROR_NULL = - 2 ,
REGEX_ERROR_BADOPTION = - 3 ,
REGEX_ERROR_BADMAGIC = - 4 ,
REGEX_ERROR_UNKNOWN_OPCODE = - 5 ,
REGEX_ERROR_NOMEMORY = - 6 ,
REGEX_ERROR_NOSUBSTRING = - 7 ,
REGEX_ERROR_MATCHLIMIT = - 8 ,
REGEX_ERROR_CALLOUT = - 9 , /* Never used by PCRE itself */
REGEX_ERROR_BADUTF8 = - 10 ,
REGEX_ERROR_BADUTF8_OFFSET = - 11 ,
REGEX_ERROR_PARTIAL = - 12 ,
REGEX_ERROR_BADPARTIAL = - 13 ,
REGEX_ERROR_INTERNAL = - 14 ,
REGEX_ERROR_BADCOUNT = - 15 ,
REGEX_ERROR_DFA_UITEM = - 16 ,
REGEX_ERROR_DFA_UCOND = - 17 ,
REGEX_ERROR_DFA_UMLIMIT = - 18 ,
REGEX_ERROR_DFA_WSSIZE = - 19 ,
REGEX_ERROR_DFA_RECURSE = - 20 ,
REGEX_ERROR_RECURSIONLIMIT = - 21 ,
REGEX_ERROR_NULLWSLIMIT = - 22 , /* No longer actually used */
2014-07-30 11:03:42 +02:00
REGEX_ERROR_BADNEWLINE = - 23 ,
REGEX_ERROR_BADOFFSET = - 24 ,
REGEX_ERROR_SHORTUTF8 = - 25 ,
REGEX_ERROR_RECURSELOOP = - 26 ,
REGEX_ERROR_JIT_STACKLIMIT = - 27 ,
REGEX_ERROR_BADMODE = - 28 ,
REGEX_ERROR_BADENDIANNESS = - 29 ,
REGEX_ERROR_DFA_BADRESTART = - 30 ,
REGEX_ERROR_JIT_BADOPTION = - 31 ,
REGEX_ERROR_BADLENGTH = - 32 ,
2008-10-04 22:59:11 +02:00
};
2016-08-23 15:34:00 +02:00
// Regular expression objects are used to match or decompose strings based on
// patterns.
methodmap Regex < Handle
{
// Compile a regular expression.
//
// @param pattern The regular expression pattern.
// @param flags General flags for the regular expression.
// @param error Error message encountered, if applicable.
// @param maxLen Maximum string length of the error buffer.
// @param errcode Regex type error code encountered, if applicable.
public native Regex ( const char [] pattern , int flags = 0 , char [] error = " " , int maxLen = 0 , RegexError & errcode = REGEX_ERROR_NONE );
// Matches a string against a pre-compiled regular expression pattern.
//
// @param str The string to check.
// @param regex Regex Handle from CompileRegex()
// @param ret Error code, if applicable.
// @return Number of substrings found or -1 on failure.
//
// @note Use the regex handle passed to this function to extract
// matches with GetRegexSubString().
public native int Match ( const char [] str , RegexError & ret = REGEX_ERROR_NONE );
// Returns a matched substring from a regex handle.
//
// Substring ids start at 0 and end at substrings-1, where substrings is the
// number returned by Regex.Match.
//
// @param regex The regex handle to extract data from.
// @param str_id The index of the expression to get - starts at 0, and ends at substrings - 1.
// @param buffer The buffer to set to the matching substring.
// @param maxlen The maximum string length of the buffer.
// @return True if a substring was found, False on fail/error
public native bool GetSubString ( int str_id , char [] buffer , int maxlen );
};
2008-10-04 22:59:11 +02:00
/**
* Precompile a regular expression . Use this if you intend on using the
* same expression multiple times . Pass the regex handle returned here to
* MatchRegex to check for matches .
*
* @ param pattern The regular expression pattern .
* @ param flags General flags for the regular expression .
* @ param error Error message encountered , if applicable .
* @ param maxLen Maximum string length of the error buffer .
* @ param errcode Regex type error code encountered , if applicable .
* @ return Valid regex handle on success , INVALID_HANDLE on failure .
*/
2015-03-21 15:43:24 +01:00
native Regex CompileRegex ( const char [] pattern , int flags = 0 , char [] error = " " , int maxLen = 0 , RegexError & errcode = REGEX_ERROR_NONE );
2008-10-04 22:59:11 +02:00
/**
* Matches a string against a pre - compiled regular expression pattern .
*
* @ param str The string to check .
* @ param regex Regex Handle from CompileRegex ()
* @ param ret Error code , if applicable .
* @ return Number of substrings found or - 1 on failure .
*
* @ note Use the regex handle passed to this function to extract
* matches with GetRegexSubString () .
*/
2015-03-21 15:43:24 +01:00
native int MatchRegex ( Handle regex , const char [] str , RegexError & ret = REGEX_ERROR_NONE );
2008-10-04 22:59:11 +02:00
/**
* Returns a matched substring from a regex handle .
* Substring ids start at 0 and end at substrings - 1 , where substrings is the number returned
* by MatchRegex
*
* @ param regex The regex handle to extract data from .
* @ param str_id The index of the expression to get - starts at 0 , and ends at substrings - 1.
* @ param buffer The buffer to set to the matching substring .
2014-07-30 11:03:42 +02:00
* @ param maxlen The maximum string length of the buffer .
2008-10-04 22:59:11 +02:00
* @ return True if a substring was found , False on fail / error
*/
2015-03-21 15:43:24 +01:00
native bool GetRegexSubString ( Handle regex , int str_id , char [] buffer , int maxlen );
2008-10-04 22:59:11 +02:00
/**
* Matches a string against a regular expression pattern .
*
* @ note If you intend on using the same regular expression pattern
* multiple times , consider using CompileRegex and MatchRegex
* instead of making this function reparse the expression each time .
*
* @ param str The string to check .
* @ param pattern The regular expression pattern .
* @ param flags General flags for the regular expression .
* @ param error Error message , if applicable .
* @ param maxLen Maximum length of the error buffer .
* @ return Number of substrings found or - 1 on failure .
*/
2015-03-21 15:43:24 +01:00
stock int SimpleRegexMatch ( const char [] str , const char [] pattern , int flags = 0 , char [] error = " " , int maxLen = 0 )
2008-10-04 22:59:11 +02:00
{
2015-03-21 15:43:24 +01:00
Regex regex = new Regex ( pattern , flags , error , maxLen );
if ( ! regex )
2008-10-04 22:59:11 +02:00
return - 1 ;
2015-03-21 15:43:24 +01:00
int substrings = regex . Match ( str );
delete regex ;
2008-10-04 22:59:11 +02:00
return substrings ;
}
/**
* @ endsection
*/
/**
* Do not edit below this line !
*/
2016-08-23 15:34:00 +02:00
public Extension __ext_regex =
2008-10-04 22:59:11 +02:00
{
name = " Regex Extension " ,
file = " regex.ext " ,
#if defined AUTOLOAD_EXTENSIONS
autoload = 1 ,
#else
autoload = 0 ,
#endif
#if defined REQUIRE_EXTENSIONS
required = 1 ,
#else
required = 0 ,
#endif
};