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