165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{
265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcRegExp - Perl compatible regular expressions for Virtual Pascal
365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (c) 2001 Peter S. Voronov aka Chem O'Dun <petervrn@yahoo.com>
465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  Based on PCRE library interface unit for Virtual Pascal.
665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (c) 2001 Alexander Tokarev <dwalin@dwalin.ru>
765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  The current PCRE version is: 3.7
965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
1065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  This software may be distributed under the terms of the modified BSD license
1165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  Copyright (c) 2001, Alexander Tokarev
1265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  All rights reserved.
1365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
1465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  Redistribution and use in source and binary forms, with or without
1565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  modification, are permitted provided that the following conditions are met:
1665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
1765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    * Redistributions of source code must retain the above copyright notice,
1865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      this list of conditions and the following disclaimer.
1965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    * Redistributions in binary form must reproduce the above copyright notice,
2065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      this list of conditions and the following disclaimer in the documentation
2165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      and/or other materials provided with the distribution.
2265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    * Neither the name of the <ORGANIZATION> nor the names of its contributors
2365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      may be used to endorse or promote products derived from this software without
2465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      specific prior written permission.
2565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
2665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
2765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
2865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
2965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
3065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
3265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
3365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
3465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
3765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  The PCRE library is written by: Philip Hazel <ph10@cam.ac.uk>
3865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  Copyright (c) 1997-2004 University of Cambridge
3965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
4065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  AngelsHolocaust 4-11-04 updated to use version v5.0
4165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (INFO: this is regex-directed, NFA)
4265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  AH:  9-11-04 - pcre_free: removed var, pcre already gives the ptr, now
4365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			    everything works as it should (no more crashes)
4465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		 -> removed CheckRegExp because pcre handles errors perfectly
4565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      10-11-04 - added pcError (errorhandling), pcInit
4665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      13-11-04 - removed the ErrorPos = 0 check -> always print erroroffset
4765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      17-10-05 - support for \1-\9 backreferences in TpcRegExp.GetReplStr
4865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      17-02-06 - added RunTimeOptions: caller can set options while searching
4965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      19-02-06 - added SearchOfs(): let PCRE use the complete string and offset
5065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		 into the string itself
5165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      20-12-06 - support for version 7.0
5265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      27.08.08 - support for v7.7
5365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich}
5465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
5565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$H+} {$DEFINE PCRE_3_7} {$DEFINE PCRE_5_0} {$DEFINE PCRE_7_0} {$DEFINE PCRE_7_7}
5665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
5765de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichUnit pcregexp;
5865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
5965de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichInterface
6065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
6165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichuses objects;
6265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
6365de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichType
6465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PpcRegExp = ^TpcRegExp;
6565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich// TpcRegExp = object
6665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich TpcRegExp = object(TObject)
6765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  MatchesCount: integer;
6865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  RegExpC, RegExpExt : Pointer;
6965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  Matches:Pointer;
7065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  RegExp: shortstring;
7165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  SourceLen: integer;
7265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PartialMatch : boolean;
7365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  Error : boolean;
7465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  ErrorMsg : Pchar;
7565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  ErrorPos : integer;
7665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  RunTimeOptions: Integer; // options which can be set by the caller
7765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  constructor Init(const ARegExp : shortstring; AOptions : integer; ALocale : Pointer);
7865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  function Search(AStr: Pchar; ALen : longint) : boolean; virtual;
7965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  function SearchNext( AStr: Pchar; ALen : longint) : boolean; virtual;
8065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  function SearchOfs ( AStr: Pchar; ALen, AOfs : longint) : boolean; virtual;
8165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  function MatchSub(ANom: integer; var Pos, Len : longint) : boolean; virtual;
8265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  function MatchFull(var Pos, Len : longint) : boolean; virtual;
8365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  function GetSubStr(ANom: integer; AStr: Pchar) : string; virtual;
8465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  function GetFullStr(AStr: Pchar) : string; virtual;
8565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  function GetReplStr(AStr: Pchar; const ARepl: string) : string; virtual;
8665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  function GetPreSubStr(AStr: Pchar) : string; virtual;
8765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  function GetPostSubStr(AStr: Pchar) : string; virtual;
8865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  function ErrorStr : string; virtual;
8965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  destructor Done; virtual;
9065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich end;
9165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
9265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcGrepMatch(WildCard, aStr: string; AOptions:integer; ALocale : Pointer): Boolean;
9365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcGrepSub(WildCard, aStr, aRepl: string; AOptions:integer; ALocale : Pointer): string;
9465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
9565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcFastGrepMatch(WildCard, aStr: string): Boolean;
9665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcFastGrepSub(WildCard, aStr, aRepl: string): string;
9765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
9865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_5_0}
9965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcGetVersion : pchar;
10065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF}
10165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
10265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcError (var pRegExp : Pointer) : Boolean;
10365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcInit  (const Pattern: Shortstring; CaseSens: Boolean) : Pointer;
10465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
10565de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichConst { Options }
10665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_CASELESS         = $0001;
10765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_MULTILINE        = $0002;
10865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_DOTALL           = $0004;
10965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_EXTENDED         = $0008;
11065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ANCHORED         = $0010;
11165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_DOLLAR_ENDONLY   = $0020;
11265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_EXTRA            = $0040;
11365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_NOTBOL           = $0080;
11465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_NOTEOL           = $0100;
11565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_UNGREEDY         = $0200;
11665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_NOTEMPTY         = $0400;
11765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_5_0}
11865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_UTF8             = $0800;
11965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_NO_AUTO_CAPTURE  = $1000;
12065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_NO_UTF8_CHECK    = $2000;
12165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_AUTO_CALLOUT     = $4000;
12265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_PARTIAL          = $8000;
12365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF}
12465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_7_0}
12565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_DFA_SHORTEST     = $00010000;
12665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_DFA_RESTART      = $00020000;
12765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_FIRSTLINE        = $00040000;
12865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_DUPNAMES         = $00080000;
12965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_NEWLINE_CR       = $00100000;
13065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_NEWLINE_LF       = $00200000;
13165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_NEWLINE_CRLF     = $00300000;
13265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_NEWLINE_ANY      = $00400000;
13365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_NEWLINE_ANYCRLF  = $00500000;
13465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
13565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_NEWLINE_BITS     = PCRE_NEWLINE_CR or PCRE_NEWLINE_LF or PCRE_NEWLINE_ANY;
13665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
13765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF}
13865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_7_7}
13965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_BSR_ANYCRLF      = $00800000;
14065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_BSR_UNICODE      = $01000000;
14165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_JAVASCRIPT_COMPAT= $02000000;
14265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF}
14365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
14465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_COMPILE_ALLOWED_OPTIONS = PCRE_ANCHORED + PCRE_AUTO_CALLOUT + PCRE_CASELESS  +
14565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				PCRE_DOLLAR_ENDONLY + PCRE_DOTALL + PCRE_EXTENDED  +
14665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				PCRE_EXTRA + PCRE_MULTILINE + PCRE_NO_AUTO_CAPTURE +
14765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				PCRE_UNGREEDY + PCRE_UTF8 + PCRE_NO_UTF8_CHECK
14865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				{$IFDEF PCRE_7_0}
14965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				+ PCRE_DUPNAMES + PCRE_FIRSTLINE + PCRE_NEWLINE_BITS
15065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				{$ENDIF}
15165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				{$IFDEF PCRE_7_7}
15265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				+ PCRE_BSR_ANYCRLF + PCRE_BSR_UNICODE + PCRE_JAVASCRIPT_COMPAT
15365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				{$ENDIF}
15465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				;
15565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
15665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_EXEC_ALLOWED_OPTIONS = PCRE_ANCHORED + PCRE_NOTBOL + PCRE_NOTEOL +
15765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			     PCRE_NOTEMPTY + PCRE_NO_UTF8_CHECK + PCRE_PARTIAL
15865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			     {$IFDEF PCRE_7_0}
15965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			     + PCRE_NEWLINE_BITS
16065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			     {$ENDIF}
16165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			     {$IFDEF PCRE_7_7}
16265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			     + PCRE_BSR_ANYCRLF + PCRE_BSR_UNICODE
16365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			     {$ENDIF}
16465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			     ;
16565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
16665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_7_0}
16765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_DFA_EXEC_ALLOWED_OPTIONS = PCRE_ANCHORED + PCRE_NOTBOL + PCRE_NOTEOL +
16865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				 PCRE_NOTEMPTY + PCRE_NO_UTF8_CHECK + PCRE_PARTIAL +
16965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				 PCRE_DFA_SHORTEST + PCRE_DFA_RESTART +
17065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				 PCRE_NEWLINE_BITS
17165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				 {$IFDEF PCRE_7_7}
17265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				 + PCRE_BSR_ANYCRLF + PCRE_BSR_UNICODE
17365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				 {$ENDIF}
17465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				 ;
17565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF}
17665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
17765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{ Exec-time and get/set-time error codes }
17865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_NOMATCH        =  -1;
17965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_NULL	   =  -2;
18065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_BADOPTION      =  -3;
18165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_BADMAGIC       =  -4;
18265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_UNKNOWN_MODE   =  -5;
18365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_NOMEMORY       =  -6;
18465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_NOSUBSTRING    =  -7;
18565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_5_0}
18665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_MATCHLIMIT     =  -8;
18765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_CALLOUT        =  -9;  { Never used by PCRE itself }
18865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_BADUTF8        = -10;
18965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_BADUTF8_OFFSET = -11;
19065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_PARTIAL        = -12;
19165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_BADPARTIAL     = -13;
19265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_INTERNAL       = -14;
19365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_BADCOUNT       = -15;
19465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF}
19565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_7_0}
19665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_DFA_UITEM      = -16;
19765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_DFA_UCOND      = -17;
19865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_DFA_UMLIMIT    = -18;
19965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_DFA_WSSIZE     = -19;
20065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_DFA_RECURSE    = -20;
20165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_RECURSIONLIMIT = -21;
20265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_NULLWSLIMIT    = -22;
20365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_ERROR_BADNEWLINE     = -23;
20465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF}
20565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
20665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{ Request types for pcre_fullinfo() }
20765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
20865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_INFO_OPTIONS         =  0;
20965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_INFO_SIZE 	   =  1;
21065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_INFO_CAPTURECOUNT    =  2;
21165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_INFO_BACKREFMAX      =  3;
21265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_INFO_FIRSTBYTE       =  4;
21365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_INFO_FIRSTCHAR       =  4; { For backwards compatibility }
21465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_INFO_FIRSTTABLE      =  5;
21565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_5_0}
21665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_INFO_LASTLITERAL     =  6;
21765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_INFO_NAMEENTRYSIZE   =  7;
21865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_INFO_NAMECOUNT       =  8;
21965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_INFO_NAMETABLE       =  9;
22065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_INFO_STUDYSIZE       = 10;
22165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_INFO_DEFAULT_TABLES  = 11;
22265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF PCRE_5_0}
22365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_7_7}
22465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_INFO_OKPARTIAL       = 12;
22565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_INFO_JCHANGED        = 13;
22665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_INFO_HASCRORLF       = 14;
22765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF}
22865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
22965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{ Request types for pcre_config() }
23065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_5_0}
23165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_CONFIG_UTF8       	    = 0;
23265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_CONFIG_NEWLINE    	    = 1;
23365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_CONFIG_LINK_SIZE  	    = 2;
23465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_CONFIG_POSIX_MALLOC_THRESHOLD = 3;
23565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_CONFIG_MATCH_LIMIT	    = 4;
23665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_CONFIG_STACKRECURSE           = 5;
23765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_CONFIG_UNICODE_PROPERTIES     = 6;
23865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF PCRE_5_0}
23965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_7_0}
24065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_CONFIG_MATCH_LIMIT_RECURSION  = 7;
24165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF}
24265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_7_7}
24365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_CONFIG_BSR		    = 8;
24465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF}
24565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
24665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{ Bit flags for the pcre_extra structure }
24765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_5_0}
24865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_EXTRA_STUDY_DATA  	  = $0001;
24965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_EXTRA_MATCH_LIMIT 	  = $0002;
25065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_EXTRA_CALLOUT_DATA	  = $0004;
25165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_EXTRA_TABLES      	  = $0008;
25265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF PCRE_5_0}
25365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_7_0}
25465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PCRE_EXTRA_MATCH_LIMIT_RECURSION = $0010;
25565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF}
25665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
25765de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichConst
25865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich// DefaultOptions : integer = 0;
25965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich DefaultLocaleTable : pointer = nil;
26065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
26165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_5_0}
26265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{ The structure for passing additional data to pcre_exec(). This is defined in
26365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichsuch as way as to be extensible. Always add new fields at the end, in order to
26465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichremain compatible. }
26565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
26665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtype ppcre_extra = ^tpcre_extra;
26765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich     tpcre_extra = record
26865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       flags : longint; 	       { Bits for which fields are set }
26965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       study_data : pointer;           { Opaque data from pcre_study() }
27065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       match_limit : longint;          { Maximum number of calls to match() }
27165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       callout_data : pointer;         { Data passed back in callouts }
27265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       tables : pointer;	       { Pointer to character tables }
27365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       match_limit_recursion: longint; { Max recursive calls to match() }
27465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich     end;
27565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
27665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtype ppcre_callout_block = ^pcre_callout_block;
27765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich     pcre_callout_block = record
27865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       version,
27965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (* ------------------------ Version 0 ------------------------------- *)
28065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       callout_number : integer;
28165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       offset_vector : pointer;
28265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       subject : pchar;
28365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       subject_length, start_match, current_position, capture_top,
28465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       capture_last : integer;
28565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       callout_data : pointer;
28665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (* ------------------- Added for Version 1 -------------------------- *)
28765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       pattern_position, next_item_length : integer;
28865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich     end;
28965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF PCRE_5_0}
29065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
29165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$OrgName+}
29265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF VIRTUALPASCAL} {&Cdecl+} {$ENDIF VIRTUALPASCAL}
29365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
29465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { local replacement of external pcre memory management functions }
29565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_malloc( size : integer ) : pointer;
29665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich procedure pcre_free( {var} p : pointer );
29765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_5_0}
29865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich const pcre_stack_malloc: function ( size : integer ): pointer = pcre_malloc;
29965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       pcre_stack_free: procedure ( {var} p : pointer ) = pcre_free;
30065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_callout(var p : ppcre_callout_block) : integer;
30165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF PCRE_5_0}
30265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF VIRTUALPASCAL} {&Cdecl-} {$ENDIF VIRTUALPASCAL}
30365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
30465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichImplementation
30565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
30665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichUses strings, collect, messages, dnapp, commands, advance0, stringsx
30765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    {$IFDEF VIRTUALPASCAL} ,vpsyslow {$ENDIF VIRTUALPASCAL};
30865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
30965de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichConst
31065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich MAGIC_NUMBER = $50435245; { 'PCRE' }
31165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich MAX_MATCHES = 90; { changed in 3.5 version; should be divisible by 3, was 64}
31265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
31365de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichType
31465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PMatchArray = ^TMatchArray;
31565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich TMatchArray = array[0..( MAX_MATCHES * 3 )] of integer;
31665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
31765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PRegExpCollection = ^TRegExpCollection;
31865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich TRegExpCollection =  object(TSortedCollection)
31965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   MaxRegExp : integer;
32065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   SearchRegExp : shortstring;
32165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   CompareModeInsert : boolean;
32265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   constructor Init(AMaxRegExp:integer);
32365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   procedure FreeItem(P: Pointer); virtual;
32465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   function  Compare(P1, P2: Pointer): Integer; virtual;
32565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   function  Find(ARegExp:shortstring;var P: PpcRegExp):boolean; virtual;
32665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   function CheckNew(ARegExp:shortstring):PpcRegExp;virtual;
32765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich end;
32865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
32965de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichVar
33065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PRegExpCache : PRegExpCollection;
33165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
33265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
33365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF VIRTUALPASCAL} {&Cdecl+} {$ENDIF VIRTUALPASCAL}
33465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
33565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { imported original pcre functions }
33665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
33765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_compile( const pattern : PChar; options : integer;
33865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			var errorptr : PChar; var erroroffset : integer;
33965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			const tables : PChar ) : pointer {pcre}; external;
34065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_7_0}
34165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_compile2( const pattern : PChar; options : integer;
34265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			 var errorcodeptr : Integer;
34365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			 var errorptr : PChar; var erroroffset : integer;
34465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			 const tables : PChar ) : pointer {pcre}; external;
34565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF}
34665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_5_0}
34765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_config( what : integer; where : pointer) : integer; external;
34865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_copy_named_substring( const code : pointer {pcre};
34965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				     const subject : pchar;
35065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				     var ovector : integer;
35165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				     stringcount : integer;
35265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				     const stringname : pchar;
35365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				     var buffer : pchar;
35465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				     size : integer) : integer; external;
35565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_copy_substring( const subject : pchar; var ovector : integer;
35665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			       stringcount, stringnumber : integer;
35765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			       var buffer : pchar; size : integer )
35865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			       : integer; external;
35965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_exec( const argument_re : pointer {pcre};
36065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		     const extra_data : pointer {pcre_extra};
36165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ELSE}
36265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_exec( const external_re : pointer;
36365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		     const external_extra : pointer;
36465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF}
36565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		     const subject : PChar;
36665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		     length, start_offset, options : integer;
36765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		     offsets : pointer;
36865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		     offsetcount : integer ) : integer; external;
36965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_7_0}
37065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_dfa_exec( const argument_re : pointer {pcre};
37165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			 const extra_data : pointer {pcre_extra};
37265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			 const subject : pchar;
37365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			 length, start_offset, options : integer;
37465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			 offsets : pointer;
37565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			 offsetcount : integer;
37665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			 workspace : pointer;
37765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			 wscount : integer ) : integer; external;
37865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF}
37965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_5_0}
38065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich procedure pcre_free_substring( const p : pchar ); external;
38165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich procedure pcre_free_substring_list( var p : pchar ); external;
38265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_fullinfo( const argument_re : pointer {pcre};
38365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			 const extra_data : pointer {pcre_extra};
38465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			 what : integer;
38565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			 where : pointer ) : integer; external;
38665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_get_named_substring( const code : pointer {pcre};
38765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				    const subject : pchar;
38865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				    var ovector : integer;
38965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				    stringcount : integer;
39065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				    const stringname : pchar;
39165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				    var stringptr : pchar ) : integer; external;
39265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_get_stringnumber( const code : pointer {pcre};
39365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				 const stringname : pchar ) : integer; external;
39465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_get_stringtable_entries( const code : pointer {pcre};
39565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich					const stringname : pchar;
39665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich					var firstptr,
39765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich					    lastptr : pchar ) : integer; external;
39865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_get_substring( const subject : pchar; var ovector : integer;
39965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			      stringcount, stringnumber : integer;
40065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			      var stringptr : pchar ) : integer; external;
40165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_get_substring_list( const subject : pchar; var ovector : integer;
40265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				   stringcount : integer;
40365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				   listptr : pointer {const char ***listptr}) : integer; external;
40465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_info( const argument_re : pointer {pcre};
40565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		     var optptr : integer;
40665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		     var first_byte : integer ) : integer; external;
40765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_maketables : pchar; external;
40865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF}
40965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_7_0}
41065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_refcount( const argument_re : pointer {pcre};
41165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			 adjust : integer ) : pchar; external;
41265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF}
41365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_study( const external_re : pointer {pcre};
41465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		      options : integer;
41565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		      var errorptr : PChar ) : pointer {pcre_extra}; external;
41665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_5_0}
41765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_version : pchar; external;
41865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF}
41965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
42065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_malloc( size : integer ) : pointer;
42165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich begin
42265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  GetMem( result, size );
42365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich end;
42465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
42565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich procedure pcre_free( {var} p : pointer );
42665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich begin
42765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (p <> nil) then
42865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    FreeMem( p, 0 );
42965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {@p := nil;}
43065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich end;
43165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
43265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_5_0}
43365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich(* Called from PCRE as a result of the (?C) item. We print out where we are in
43465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichthe match. Yield zero unless more callouts than the fail count, or the callout
43565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdata is not zero. *)
43665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
43765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function pcre_callout;
43865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich begin
43965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich end;
44065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF}
44165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
44265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF VIRTUALPASCAL} {&Cdecl-} {$ENDIF VIRTUALPASCAL}
44365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
44465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich// Always include the newest version of the library
44565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_7_7}
44665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {$L pcre77.lib}
44765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ELSE}
44865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {$IFDEF PCRE_7_0}
44965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    {$L pcre70.lib}
45065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {$ELSE}
45165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    {$IFDEF PCRE_5_0}
45265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      {$L pcre50.lib}
45365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    {$ELSE}
45465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      {$IFDEF PCRE_3_7}
45565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	{$L pcre37.lib}
45665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      {$ENDIF PCRE_3_7}
45765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    {$ENDIF PCRE_5_0}
45865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {$ENDIF PCRE_7_0}
45965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF PCRE_7_7}
46065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
46165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{TpcRegExp}
46265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
46365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich constructor TpcRegExp.Init(const ARegExp:shortstring; AOptions:integer; ALocale : Pointer);
46465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich var
46565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pRegExp : PChar;
46665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich begin
46765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  RegExp:=ARegExp;
46865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  RegExpC:=nil;
46965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  RegExpExt:=nil;
47065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  Matches:=nil;
47165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  MatchesCount:=0;
47265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  Error:=true;
47365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  ErrorMsg:=nil;
47465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  ErrorPos:=0;
47565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  RunTimeOptions := 0;
47665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if length(RegExp) < 255 then
47765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   begin
47865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    RegExp[length(RegExp)+1]:=#0;
47965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    pRegExp:=@RegExp[1];
48065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   end
48165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  else
48265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   begin
48365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    GetMem(pRegExp,length(RegExp)+1);
48465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    pRegExp:=strpcopy(pRegExp,RegExp);
48565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   end;
48665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  RegExpC := pcre_compile( pRegExp,
48765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			   AOptions and PCRE_COMPILE_ALLOWED_OPTIONS,
48865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			   ErrorMsg, ErrorPos, ALocale);
48965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if length(RegExp) = 255 then
49065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   StrDispose(pRegExp);
49165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if RegExpC = nil then
49265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   exit;
49365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  ErrorMsg:=nil;
49465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  RegExpExt := pcre_study( RegExpC, 0, ErrorMsg );
49565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (RegExpExt = nil) and (ErrorMsg <> nil) then
49665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   begin
49765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    pcre_free(RegExpC);
49865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    exit;
49965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   end;
50065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  GetMem(Matches,SizeOf(TMatchArray));
50165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  Error:=false;
50265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich end;
50365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
50465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich destructor TpcRegExp.Done;
50565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich begin
50665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if RegExpC <> nil then
50765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    pcre_free(RegExpC);
50865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if RegExpExt <> nil then
50965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    pcre_free(RegExpExt);
51065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if Matches <> nil then
51165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    FreeMem(Matches,SizeOf(TMatchArray));
51265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich end;
51365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
51465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function TpcRegExp.SearchNext( AStr: Pchar; ALen : longint ) : boolean;
51565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich var Options: Integer;
51665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich begin // must handle PCRE_ERROR_PARTIAL here
51765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  Options := (RunTimeOptions or startup.MiscMultiData.cfgRegEx.DefaultOptions) and
51865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	     PCRE_EXEC_ALLOWED_OPTIONS;
51965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if MatchesCount > 0 then
52065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    MatchesCount:=pcre_exec( RegExpC, RegExpExt, AStr, ALen, PMatchArray(Matches)^[1],
52165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			     Options, Matches, MAX_MATCHES ) else
52265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    MatchesCount:=pcre_exec( RegExpC, RegExpExt, AStr, ALen, 0,
52365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			     Options, Matches, MAX_MATCHES );
52465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{  if MatchesCount = 0 then
52565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    MatchesCount := MatchesCount div 3;}
52665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PartialMatch := MatchesCount = PCRE_ERROR_PARTIAL;
52765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  SearchNext := MatchesCount > 0;
52865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich end;
52965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
53065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function TpcRegExp.Search( AStr: Pchar; ALen : longint):boolean;
53165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich begin
53265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  MatchesCount:=0;
53365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  Search:=SearchNext(AStr,ALen);
53465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  SourceLen:=ALen;
53565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich end;
53665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
53765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function TpcRegExp.SearchOfs( AStr: Pchar; ALen, AOfs: longint ) : boolean;
53865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich var Options: Integer;
53965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich begin
54065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  MatchesCount:=0;
54165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  Options := (RunTimeOptions or startup.MiscMultiData.cfgRegEx.DefaultOptions) and
54265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	     PCRE_EXEC_ALLOWED_OPTIONS;
54365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  MatchesCount:=pcre_exec( RegExpC, RegExpExt, AStr, ALen, AOfs,
54465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich			   Options, Matches, MAX_MATCHES );
54565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PartialMatch := MatchesCount = PCRE_ERROR_PARTIAL;
54665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  SearchOfs := MatchesCount > 0;
54765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  SourceLen := ALen-AOfs;
54865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich end;
54965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
55065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function TpcRegExp.MatchSub(ANom:integer; var Pos,Len:longint):boolean;
55165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich begin
55265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (MatchesCount > 0) and (ANom <= (MatchesCount-1)) then
55365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   begin
55465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    ANom:=ANom*2;
55565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    Pos:=PMatchArray(Matches)^[ANom];
55665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    Len:=PMatchArray(Matches)^[ANom+1]-Pos;
55765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    MatchSub:=true;
55865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   end
55965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  else
56065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   MatchSub:=false;
56165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich end;
56265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
56365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function TpcRegExp.MatchFull(var Pos,Len:longint):boolean;
56465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich begin
56565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  MatchFull:=MatchSub(0,Pos,Len);
56665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich end;
56765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
56865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function TpcRegExp.GetSubStr(ANom: integer; AStr: Pchar):string;
56965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich var
57065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  s: ansistring;
57165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pos,len: longint;
57265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich begin
57365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  s:='';
57465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if MatchSub(ANom, pos, len) then
57565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   begin
57665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    setlength(s, len);
57765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    Move(AStr[pos], s[1], len);
57865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   end;
57965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  GetSubStr:=s;
58065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich end;
58165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
58265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function TpcRegExp.GetPreSubStr(AStr: Pchar):string;
58365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich var
58465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  s: ansistring;
58565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  l: longint;
58665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich begin
58765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  s:='';
58865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (MatchesCount > 0) then
58965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   begin
59065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    l:=PMatchArray(Matches)^[0]-1;
59165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if l > 0 then
59265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich     begin
59365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      setlength(s,l);
59465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      Move(AStr[1],s[1],l);
59565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich     end;
59665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   end;
59765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  GetPreSubStr:=s;
59865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich end;
59965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
60065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function TpcRegExp.GetPostSubStr(AStr: Pchar):string;
60165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich var
60265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  s: ansistring;
60365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  l: longint;
60465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  ANom: integer;
60565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich begin
60665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  s:='';
60765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (MatchesCount > 0) then
60865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   begin
60965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    ANom:=(MatchesCount-1){*2} shl 1;
61065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    l:=SourceLen-PMatchArray(Matches)^[ANom+1]+1;
61165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if l > 0 then
61265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich     begin
61365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      setlength(s,l);
61465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      Move(AStr[PMatchArray(Matches)^[ANom+1]],s[1],l);
61565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich     end;
61665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   end;
61765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  GetPostSubStr:=s;
61865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich end;
61965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
62065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
62165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function TpcRegExp.GetFullStr(AStr: Pchar):string;
62265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich var
62365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  s: ansistring;
62465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  l: longint;
62565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich begin
62665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  GetFullStr:=GetSubStr(0,AStr);
62765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich end;
62865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
62965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function TpcRegExp.GetReplStr(AStr: Pchar; const ARepl: string):string;
63065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich var
63165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  s: ansistring;
63265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  l,i,lasti: longint;
63365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich begin
63465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  l:=length(ARepl);
63565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  i:=1;
63665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  lasti:=1;
63765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  s:='';
63865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  while i <= l do
63965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   begin
64065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case ARepl[i] of
64165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich     '\' :
64265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      begin
64365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       if i < l then
64465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	begin
64565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	 s:=s+copy(ARepl,lasti,i-lasti){+ARepl[i+1]};
64665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	 {AH 17-10-05 support for POSIX \1-\9 backreferences}
64765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	 case ARepl[i+1] of
64865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  '0' : s:=s+GetFullStr(AStr);
64965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  '1'..'9' : s:=s+GetSubStr(ord(ARepl[i+1])-ord('0'),AStr);
65065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  else s:=s+ARepl[i+1]; // copy the escaped character
65165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	 end;
65265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	end;
65365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       inc(i);
65465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       lasti:=i+1;
65565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      end;
65665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich     '$' :
65765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      begin
65865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       if i < l then
65965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	begin
66065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	 s:=s+copy(ARepl,lasti,i-lasti);
66165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	 case ARepl[i+1] of
66265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  '&' : s:=s+GetFullStr(AStr);
66365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  '1'..'9' : s:=s+GetSubStr(ord(ARepl[i+1])-ord('0'),AStr);
66465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  '`' : s:=s+GetPreSubStr(AStr);
66565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	  #39 : s:=s+GetPostSubStr(AStr);
66665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	 end;
66765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich	end;
66865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       inc(i);
66965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       lasti:=i+1;
67065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      end;
67165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    end;
67265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    inc(i);
67365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   end;
67465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if lasti <= {AH 25-10-2004 added =, else l==1 won't work} l then
67565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    s:=s+copy(ARepl,lasti,l-lasti+1);
67665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  GetReplStr:=s;
67765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich end;
67865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
67965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich function TpcRegExp.ErrorStr:string;
68065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  begin
68165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   ErrorStr:=StrPas(ErrorMsg);
68265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  end;
68365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
68465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{TRegExpCollection}
68565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
68665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichconstructor TRegExpCollection.Init(AMaxRegExp: integer);
68765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbegin
68865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich Inherited Init(1,1);
68965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich MaxRegExp:=AMaxRegExp;
69065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich CompareModeInsert:=true;
69165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichend;
69265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
69365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichprocedure TRegExpCollection.FreeItem(P: Pointer);
69465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbegin
69565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if P <> nil then
69665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  begin
69765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   Dispose(PpcRegExp(P),Done);
69865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  end;
69965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichend;
70065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
70165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfunction  TRegExpCollection.Compare(P1, P2: Pointer): Integer;
70265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//var
70365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich// l,l1,l2,i : byte;
70465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//// wPos: pchar;
70565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbegin
70665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if CompareModeInsert then
70765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  begin
70865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//   l1:=length(PpcRegExp(P1)^.RegExp);
70965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//   l2:=length(PpcRegExp(P2)^.RegExp);
71065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//   if l1 > l2 then l:=l2 else
71165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//      	     l:=l1;
71265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//   for i:=1 to l do
71365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//     if PpcRegExp(P1).RegExp[i] <> PpcRegExp(P2).RegExp[i] then break;
71465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//   if i <=l then
71565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//     Compare:=ord(PpcRegExp(P1).RegExp[i])-ord(PpcRegExp(P2).RegExp[i]) else
71665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//     Compare:=l1-l2;
71765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    Compare := stringsx.PasStrCmp(PpcRegExp(P1).RegExp, PpcRegExp(P2).RegExp, False);
71865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  end
71965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich else
72065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  begin
72165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//   l1:=length(PpcRegExp(P1)^.RegExp);
72265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//   l2:=length(SearchRegExp);
72365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//   if l1 > l2 then l:=l2 else
72465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//      	     l:=l1;
72565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//   for i:=1 to l do
72665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//     if PpcRegExp(P1).RegExp[i] <> SearchRegExp[i] then
72765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//     begin
72865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//       Compare:=ord(PpcRegExp(P1).RegExp[i])-ord(SearchRegExp[i]);
72965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//       break;
73065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//     end;
73165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich//   if i > l then Compare:=l1-l2;
73265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    Compare := stringsx.PasStrCmp(PpcRegExp(P1).RegExp, SearchRegExp, False);
73365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  end;
73465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichend;
73565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
73665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfunction  TRegExpCollection.Find(ARegExp:shortstring;var P: PpcRegExp):boolean;
73765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichvar I : integer;
73865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbegin
73965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich CompareModeInsert:=false;
74065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich SearchRegExp:=ARegExp;
74165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if Search(nil,I) then
74265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  begin
74365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   P:=PpcRegExp(At(I));
74465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   Find:=true;
74565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  end
74665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich else
74765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  begin
74865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   P:=nil;
74965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   Find:=false;
75065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  end;
75165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich CompareModeInsert:=true;
75265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichend;
75365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
75465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfunction TRegExpCollection.CheckNew(ARegExp:shortstring):PpcRegExp;
75565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichvar
75665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich P : PpcRegExp;
75765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbegin
75865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if not Find(ARegExp,P) then
75965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  begin
76065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   if Count = MaxRegExp then
76165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    AtFree(0);
76265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   P:=New(ppcRegExp,Init(ARegExp,PCRE_CASELESS,nil));
76365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   Insert(P);
76465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  end;
76565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich CheckNew:=P;
76665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichend;
76765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
76865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfunction pcGrepMatch(WildCard, aStr: string; AOptions:integer; ALocale : Pointer): Boolean;
76965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichvar
77065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PpcRE:PpcRegExp;
77165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbegin
77265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PpcRE:=New(ppcRegExp,Init(WildCard,AOptions,Alocale));
77365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich pcGrepMatch:=PpcRE^.Search(pchar(AStr),Length(AStr));
77465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich Dispose(PpcRE,Done);
77565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichend;
77665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
77765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfunction pcGrepSub(WildCard, aStr, aRepl: string; AOptions:integer; ALocale : Pointer): string;
77865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichvar
77965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PpcRE:PpcRegExp;
78065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbegin
78165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PpcRE:=New(ppcRegExp,Init(WildCard,AOptions,Alocale));
78265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if PpcRE^.Search(pchar(AStr),Length(AStr)) then
78365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcGrepSub:=PpcRE^.GetReplStr(pchar(AStr),ARepl)
78465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich else
78565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcGrepSub:='';
78665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich Dispose(PpcRE,Done);
78765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichend;
78865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
78965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfunction pcFastGrepMatch(WildCard, aStr: string): Boolean;
79065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichvar
79165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PpcRE:PpcRegExp;
79265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbegin
79365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PpcRE:=PRegExpCache^.CheckNew(WildCard);
79465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich pcFastGrepMatch:=PpcRE^.Search(pchar(AStr),Length(AStr));
79565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichend;
79665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
79765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfunction pcFastGrepSub(WildCard, aStr, aRepl: string): string;
79865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichvar
79965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PpcRE:PpcRegExp;
80065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbegin
80165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PpcRE:=PRegExpCache^.CheckNew(WildCard);
80265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if PpcRE^.Search(pchar(AStr),Length(AStr)) then
80365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcFastGrepSub:=PpcRE^.GetReplStr(pchar(AStr),ARepl)
80465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich else
80565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcFastGrepSub:='';
80665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichend;
80765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
80865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$IFDEF PCRE_5_0}
80965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfunction pcGetVersion : pchar; assembler; {$FRAME-}{$USES none}
81065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichasm
81165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  call pcre_version
81265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichend;
81365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{$ENDIF PCRE_5_0}
81465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
81565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfunction pcError;
81665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichvar P: ppcRegExp absolute pRegExp;
81765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbegin
81865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  Result := (P = nil) or P^.Error;
81965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  If Result and (P <> nil) then
82065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  begin
82165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{     if P^.ErrorPos = 0 then
82265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      MessageBox(GetString(erRegExpCompile)+'"'+P^.ErrorStr+'"', nil,mfConfirmation+mfOkButton)
82365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    else}
82465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      MessageBox(GetString(erRegExpCompile)+'"'+P^.ErrorStr+'"'+GetString(erRegExpCompPos),
82565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich		 @P^.ErrorPos,mfConfirmation+mfOkButton);
82665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    Dispose(P, Done);
82765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    P:=nil;
82865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  end;
82965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichend;
83065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
83165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfunction pcInit;
83265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichvar Options : Integer;
83365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbegin
83465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  If CaseSens then Options := 0 else Options := PCRE_CASELESS;
83565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  Result := New( PpcRegExp, Init( Pattern,
83665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				  {DefaultOptions}
83765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				  startup.MiscMultiData.cfgRegEx.DefaultOptions or Options,
83865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich				  DefaultLocaleTable) );
83965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichend;
84065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
84165de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichInitialization
84265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PRegExpCache:=New(PRegExpCollection,Init(64));
84365de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichFinalization
84465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich Dispose(PRegExpCache,Done);
84565de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichEnd.
846