436 lines
16 KiB
ObjectPascal
436 lines
16 KiB
ObjectPascal
{**************************************************************************************************}
|
|
{ }
|
|
{ Project JEDI Code Library (JCL) }
|
|
{ }
|
|
{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); }
|
|
{ you may not use this file except in compliance with the License. You may obtain a copy of the }
|
|
{ License at http://www.mozilla.org/MPL/ }
|
|
{ }
|
|
{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF }
|
|
{ ANY KIND, either express or implied. See the License for the specific language governing rights }
|
|
{ and limitations under the License. }
|
|
{ }
|
|
{ The Original Code is JclPRCE.pas. }
|
|
{ }
|
|
{ The Initial Developer of the Original Code is Peter Thornqvist. }
|
|
{ Portions created by Peter Thornqvist are Copyright (C) of Peter Thornqvist. All rights reserved. }
|
|
{ Portions created by University of Cambridge are }
|
|
{ Copyright (C) 1997-2001 by University of Cambridge. }
|
|
{ }
|
|
{ Contributor(s): }
|
|
{ Robert Rossmair (rrossmair) }
|
|
{ }
|
|
{ The latest release of PCRE is always available from }
|
|
{ ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz }
|
|
{ }
|
|
{**************************************************************************************************}
|
|
{ }
|
|
{ Header conversion of pcre.h }
|
|
{ }
|
|
{ Unit owner: Peter Thornqvist }
|
|
{ Last modified: $Date: 2004/11/06 02:19:34 $ }
|
|
{ }
|
|
{**************************************************************************************************}
|
|
|
|
unit pcre;
|
|
|
|
{$I jedi.inc}
|
|
|
|
interface
|
|
|
|
(*************************************************
|
|
* Perl-Compatible Regular Expressions *
|
|
*************************************************)
|
|
|
|
{$WEAKPACKAGEUNIT ON}
|
|
|
|
// (p3) this is the switch to change between static and dynamic linking.
|
|
// It is set to dynamic by default. To disable simply insert a '.' before the '$'
|
|
//
|
|
// NOTE: if you enable static linking of DLL, this means that the pcre.dll *must*
|
|
// be in the users path or an AV will occur at startup
|
|
|
|
{$DEFINE PCRE_LINKONREQUEST}
|
|
(*$HPPEMIT '#include "pcre.h"'*)
|
|
|
|
const
|
|
MAX_PATTERN_LENGTH = $10003;
|
|
{$EXTERNALSYM MAX_PATTERN_LENGTH}
|
|
MAX_QUANTIFY_REPEAT = $10000;
|
|
{$EXTERNALSYM MAX_QUANTIFY_REPEAT}
|
|
MAX_CAPTURE_COUNT = $FFFF;
|
|
{$EXTERNALSYM MAX_CAPTURE_COUNT}
|
|
MAX_NESTING_DEPTH = 200;
|
|
{$EXTERNALSYM MAX_NESTING_DEPTH}
|
|
|
|
const
|
|
(* Options *)
|
|
PCRE_CASELESS = $0001;
|
|
{$EXTERNALSYM PCRE_CASELESS}
|
|
PCRE_MULTILINE = $0002;
|
|
{$EXTERNALSYM PCRE_MULTILINE}
|
|
PCRE_DOTALL = $0004;
|
|
{$EXTERNALSYM PCRE_DOTALL}
|
|
PCRE_EXTENDED = $0008;
|
|
{$EXTERNALSYM PCRE_EXTENDED}
|
|
PCRE_ANCHORED = $0010;
|
|
{$EXTERNALSYM PCRE_ANCHORED}
|
|
PCRE_DOLLAR_ENDONLY = $0020;
|
|
{$EXTERNALSYM PCRE_DOLLAR_ENDONLY}
|
|
PCRE_EXTRA = $0040;
|
|
{$EXTERNALSYM PCRE_EXTRA}
|
|
PCRE_NOTBOL = $0080;
|
|
{$EXTERNALSYM PCRE_NOTBOL}
|
|
PCRE_NOTEOL = $0100;
|
|
{$EXTERNALSYM PCRE_NOTEOL}
|
|
PCRE_UNGREEDY = $0200;
|
|
{$EXTERNALSYM PCRE_UNGREEDY}
|
|
PCRE_NOTEMPTY = $0400;
|
|
{$EXTERNALSYM PCRE_NOTEMPTY}
|
|
PCRE_UTF8 = $0800;
|
|
{$EXTERNALSYM PCRE_UTF8}
|
|
|
|
(* Exec-time and get-time error codes *)
|
|
|
|
PCRE_ERROR_NOMATCH = -1;
|
|
{$EXTERNALSYM PCRE_ERROR_NOMATCH}
|
|
PCRE_ERROR_NULL = -2;
|
|
{$EXTERNALSYM PCRE_ERROR_NULL}
|
|
PCRE_ERROR_BADOPTION = -3;
|
|
{$EXTERNALSYM PCRE_ERROR_BADOPTION}
|
|
PCRE_ERROR_BADMAGIC = -4;
|
|
{$EXTERNALSYM PCRE_ERROR_BADMAGIC}
|
|
PCRE_ERROR_UNKNOWN_NODE = -5;
|
|
{$EXTERNALSYM PCRE_ERROR_UNKNOWN_NODE}
|
|
PCRE_ERROR_NOMEMORY = -6;
|
|
{$EXTERNALSYM PCRE_ERROR_NOMEMORY}
|
|
PCRE_ERROR_NOSUBSTRING = -7;
|
|
{$EXTERNALSYM PCRE_ERROR_NOSUBSTRING}
|
|
|
|
(* Request types for pcre_fullinfo() *)
|
|
|
|
PCRE_INFO_OPTIONS = 0;
|
|
{$EXTERNALSYM PCRE_INFO_OPTIONS}
|
|
PCRE_INFO_SIZE = 1;
|
|
{$EXTERNALSYM PCRE_INFO_SIZE}
|
|
PCRE_INFO_CAPTURECOUNT = 2;
|
|
{$EXTERNALSYM PCRE_INFO_CAPTURECOUNT}
|
|
PCRE_INFO_BACKREFMAX = 3;
|
|
{$EXTERNALSYM PCRE_INFO_BACKREFMAX}
|
|
PCRE_INFO_FIRSTCHAR = 4;
|
|
{$EXTERNALSYM PCRE_INFO_FIRSTCHAR}
|
|
PCRE_INFO_FIRSTTABLE = 5;
|
|
{$EXTERNALSYM PCRE_INFO_FIRSTTABLE}
|
|
PCRE_INFO_LASTLITERAL = 6;
|
|
{$EXTERNALSYM PCRE_INFO_LASTLITERAL}
|
|
|
|
type
|
|
(* Types *)
|
|
PPChar = ^PChar;
|
|
PPPChar = ^PPChar;
|
|
PInteger = ^Integer;
|
|
PPointer = ^Pointer;
|
|
|
|
real_pcre = record
|
|
magic_number: Longword;
|
|
size: Integer;
|
|
tables: PChar;
|
|
options: Longword;
|
|
top_bracket: Word;
|
|
top_backref: word;
|
|
first_char: PChar;
|
|
req_char: PChar;
|
|
code: array [0..0] of Char;
|
|
end;
|
|
{$EXTERNALSYM real_pcre}
|
|
TPCRE = real_pcre;
|
|
PPCRE = ^TPCRE;
|
|
|
|
real_pcre_extra = record
|
|
options: PChar;
|
|
start_bits: array [0..31] of Char;
|
|
end;
|
|
{$EXTERNALSYM real_pcre_extra}
|
|
TPCREExtra = real_pcre_extra;
|
|
PPCREExtra = ^TPCREExtra;
|
|
|
|
(* Functions *)
|
|
{$IFNDEF PCRE_LINKONREQUEST}
|
|
|
|
function pcre_compile(const pattern: PChar; options: Integer;
|
|
const errptr: PPChar; erroffset: PInteger; const tableptr: PChar): PPCRE; cdecl;
|
|
{$EXTERNALSYM pcre_compile}
|
|
function pcre_copy_substring(const subject: PChar; ovector: PInteger; stringcount, stringnumber: Integer;
|
|
buffer: PChar; buffersize: Integer): Integer; cdecl;
|
|
{$EXTERNALSYM pcre_copy_substring}
|
|
function pcre_exec(const code: PPCRE; const extra: PPCREExtra; const subject: PChar;
|
|
{$EXTERNALSYM pcre_exec}
|
|
length, startoffset, options: Integer; ovector: PInteger; ovecsize: Integer): Integer; cdecl;
|
|
function pcre_study(const code: PPCRE; options: Integer; const errptr: PPChar): PPCREExtra; cdecl;
|
|
{$EXTERNALSYM pcre_study}
|
|
function pcre_get_substring(const subject: PChar; ovector: PInteger;
|
|
{$EXTERNALSYM pcre_get_substring}
|
|
stringcount, stringnumber: Integer; const stringptr: PPChar): Integer; cdecl;
|
|
function pcre_get_substring_list(const subject: PChar; ovector: PInteger;
|
|
stringcount: Integer; listptr: PPPChar): Integer; cdecl;
|
|
{$EXTERNALSYM pcre_get_substring_list}
|
|
procedure pcre_free_substring(var stringptr: PChar); cdecl;
|
|
{$EXTERNALSYM pcre_free_substring}
|
|
procedure pcre_free_substring_list(var stringptr: PChar); cdecl;
|
|
{$EXTERNALSYM pcre_free_substring_list}
|
|
function pcre_maketables: PChar; cdecl;
|
|
{$EXTERNALSYM pcre_maketables}
|
|
function pcre_fullinfo(const code: PPCRE; const extra: PPCREExtra;
|
|
what: Integer; where: Pointer): Integer; cdecl;
|
|
{$EXTERNALSYM pcre_fullinfo}
|
|
function pcre_info(const code: PPCRE; optptr, firstcharptr: PInteger): Integer; cdecl;
|
|
{$EXTERNALSYM pcre_info}
|
|
function pcre_version: PChar; cdecl;
|
|
{$EXTERNALSYM pcre_version}
|
|
|
|
// Don't use! These do *not* work!!!
|
|
function pcre_malloc(Size: Integer): Pointer; cdecl;
|
|
{$EXTERNALSYM pcre_malloc}
|
|
procedure pcre_free(P: Pointer); cdecl;
|
|
{$EXTERNALSYM pcre_free}
|
|
|
|
{$ELSE}
|
|
// dynamic linking
|
|
type
|
|
TPCRELibNotLoadedHandler = procedure; cdecl;
|
|
pcre_compile_func = function(const pattern: PChar; options: Integer;
|
|
const errptr: PPChar; erroffset: PInteger; const tableptr: PChar): PPCRE; cdecl;
|
|
pcre_copy_substring_func = function(const subject: PChar; ovector: PInteger; stringcount, stringnumber: Integer;
|
|
buffer: PChar; buffersize: Integer): Integer; cdecl;
|
|
pcre_exec_func = function(const code: PPCRE; const extra: PPCREExtra; const subject: PChar;
|
|
length, startoffset, options: Integer; ovector: PInteger; ovecsize: Integer): Integer; cdecl;
|
|
pcre_study_func = function(const code: PPCRE; options: Integer; const errptr: PPChar): PPCREExtra; cdecl;
|
|
pcre_get_substring_func = function(const subject: PChar; ovector: PInteger;
|
|
stringcount, stringnumber: Integer; const stringptr: PPChar): Integer; cdecl;
|
|
pcre_get_substring_list_func = function(const subject: PChar; ovector: PInteger;
|
|
stringcount: Integer; listptr: PPPChar): Integer; cdecl;
|
|
pcre_free_substring_func = procedure(var stringptr: PChar); cdecl;
|
|
pcre_free_substring_list_func = procedure(var stringptr: PChar); cdecl;
|
|
pcre_maketables_func = function: PChar; cdecl;
|
|
pcre_fullinfo_func = function(const code: PPCRE; const extra: PPCREExtra;
|
|
what: Integer; where: Pointer): Integer; cdecl;
|
|
pcre_info_func = function(const code: PPCRE; optptr, firstcharptr: PInteger): Integer; cdecl;
|
|
pcre_version_func = function: PChar; cdecl;
|
|
|
|
pcre_malloc_func = function(Size: Integer): Pointer; cdecl;
|
|
pcre_free_func = procedure(P: Pointer); cdecl;
|
|
var
|
|
// Value to initialize function pointers below with, in case LoadPCRE fails
|
|
// or UnloadPCRE is called. Typically the handler will raise an exception.
|
|
LibNotLoadedHandler: TPCRELibNotLoadedHandler = nil;
|
|
|
|
pcre_compile: pcre_compile_func = nil;
|
|
{$EXTERNALSYM pcre_compile}
|
|
pcre_copy_substring: pcre_copy_substring_func = nil;
|
|
{$EXTERNALSYM pcre_copy_substring}
|
|
pcre_exec: pcre_exec_func = nil;
|
|
{$EXTERNALSYM pcre_exec}
|
|
pcre_study: pcre_study_func = nil;
|
|
{$EXTERNALSYM pcre_study}
|
|
pcre_get_substring: pcre_get_substring_func = nil;
|
|
{$EXTERNALSYM pcre_get_substring}
|
|
pcre_get_substring_list: pcre_get_substring_list_func = nil;
|
|
{$EXTERNALSYM pcre_get_substring_list}
|
|
pcre_free_substring: pcre_free_substring_func = nil;
|
|
{$EXTERNALSYM pcre_free_substring}
|
|
pcre_free_substring_list: pcre_free_substring_list_func = nil;
|
|
{$EXTERNALSYM pcre_free_substring_list}
|
|
pcre_maketables: pcre_maketables_func = nil;
|
|
{$EXTERNALSYM pcre_maketables}
|
|
pcre_fullinfo: pcre_fullinfo_func = nil;
|
|
{$EXTERNALSYM pcre_fullinfo}
|
|
pcre_info: pcre_info_func = nil;
|
|
{$EXTERNALSYM pcre_info}
|
|
pcre_version: pcre_version_func = nil;
|
|
{$EXTERNALSYM pcre_version}
|
|
|
|
// Don't use! These don't work!!!
|
|
pcre_malloc: pcre_malloc_func = nil;
|
|
{$EXTERNALSYM pcre_malloc}
|
|
pcre_free: pcre_free_func = nil;
|
|
{$EXTERNALSYM pcre_free}
|
|
|
|
{$ENDIF ~PCRE_LINKONREQUEST}
|
|
|
|
function IsPCRELoaded: Boolean;
|
|
function LoadPCRE: Boolean;
|
|
procedure UnloadPCRE;
|
|
|
|
implementation
|
|
|
|
uses
|
|
{$IFDEF MSWINDOWS}
|
|
Windows;
|
|
{$ENDIF MSWINDOWS}
|
|
{$IFDEF UNIX}
|
|
{$IFDEF HAS_UNIT_TYPES}
|
|
Types,
|
|
{$ENDIF HAS_UNIT_TYPES}
|
|
{$IFDEF HAS_UNIT_LIBC}
|
|
Libc;
|
|
{$ELSE ~HAS_UNIT_LIBC}
|
|
dl;
|
|
{$ENDIF ~HAS_UNIT_LIBC}
|
|
{$ENDIF UNIX}
|
|
|
|
type
|
|
{$IFDEF MSWINDOWS}
|
|
TModuleHandle = HINST;
|
|
{$ENDIF MSWINDOWS}
|
|
{$IFDEF LINUX}
|
|
TModuleHandle = Pointer;
|
|
{$ENDIF LINUX}
|
|
|
|
const
|
|
{$IFDEF MSWINDOWS}
|
|
libpcremodulename = 'pcre.dll';
|
|
{$ENDIF MSWINDOWS}
|
|
{$IFDEF UNIX}
|
|
libpcremodulename = 'libpcre.so.0';
|
|
{$ENDIF UNIX}
|
|
INVALID_MODULEHANDLE_VALUE = TModuleHandle(0);
|
|
|
|
{$IFDEF PCRE_LINKONREQUEST}
|
|
var
|
|
PCRELib: TModuleHandle = INVALID_MODULEHANDLE_VALUE;
|
|
|
|
procedure InitPCREFuncPtrs(const Value: Pointer);
|
|
begin
|
|
@pcre_compile := Value;
|
|
@pcre_copy_substring := Value;
|
|
@pcre_exec := Value;
|
|
@pcre_study := Value;
|
|
@pcre_get_substring := Value;
|
|
@pcre_get_substring_list := Value;
|
|
@pcre_free_substring := Value;
|
|
@pcre_free_substring_list := Value;
|
|
@pcre_maketables := Value;
|
|
@pcre_fullinfo := Value;
|
|
@pcre_info := Value;
|
|
@pcre_version := Value;
|
|
|
|
@pcre_malloc := Value;
|
|
@pcre_free := Value;
|
|
end;
|
|
{$ENDIF PCRE_LINKONREQUEST}
|
|
|
|
function IsPCRELoaded: Boolean;
|
|
begin
|
|
{$IFDEF PCRE_LINKONREQUEST}
|
|
Result := PCRELib <> INVALID_MODULEHANDLE_VALUE;
|
|
{$ELSE}
|
|
Result := True;
|
|
{$ENDIF PCRE_LINKONREQUEST}
|
|
end;
|
|
|
|
function LoadPCRE: Boolean;
|
|
|
|
function GetSymbol(SymbolName: PChar): Pointer;
|
|
begin
|
|
{$IFDEF MSWINDOWS}
|
|
Result := GetProcAddress(PCRELib, PChar(SymbolName));
|
|
{$ENDIF MSWINDOWS}
|
|
{$IFDEF UNIX}
|
|
Result := dlsym(PCRELib, PChar(SymbolName));
|
|
{$ENDIF UNIX}
|
|
end;
|
|
|
|
begin
|
|
Result := PCRELib <> INVALID_MODULEHANDLE_VALUE;
|
|
if Result then
|
|
Exit;
|
|
{$IFDEF PCRE_LINKONREQUEST}
|
|
if PCRELib = INVALID_MODULEHANDLE_VALUE then
|
|
{$IFDEF MSWINDOWS}
|
|
PCRELib := LoadLibrary(libpcremodulename);
|
|
{$ENDIF MSWINDOWS}
|
|
{$IFDEF UNIX}
|
|
PCRELib := dlopen(PChar(libpcremodulename), RTLD_NOW);
|
|
{$ENDIF UNIX}
|
|
Result := PCRELib <> INVALID_MODULEHANDLE_VALUE;
|
|
if Result then
|
|
begin
|
|
@pcre_compile := GetSymbol('pcre_compile');
|
|
@pcre_copy_substring := GetSymbol('pcre_copy_substring');
|
|
@pcre_exec := GetSymbol('pcre_exec');
|
|
@pcre_study := GetSymbol('pcre_study');
|
|
@pcre_get_substring := GetSymbol('pcre_get_substring');
|
|
@pcre_get_substring_list := GetSymbol('pcre_get_substring_list');
|
|
@pcre_free_substring := GetSymbol('pcre_free_substring');
|
|
@pcre_free_substring_list := GetSymbol('pcre_free_substring_list');
|
|
@pcre_maketables := GetSymbol('pcre_maketables');
|
|
@pcre_fullinfo := GetSymbol('pcre_fullinfo');
|
|
@pcre_info := GetSymbol('pcre_info');
|
|
@pcre_version := GetSymbol('pcre_version');
|
|
|
|
@pcre_malloc := GetSymbol('pcre_malloc');
|
|
@pcre_free := GetSymbol('pcre_free');
|
|
end
|
|
else
|
|
InitPCREFuncPtrs(@LibNotLoadedHandler);
|
|
{$ELSE}
|
|
Result := True;
|
|
{$ENDIF PCRE_LINKONREQUEST}
|
|
end;
|
|
|
|
procedure UnloadPCRE;
|
|
begin
|
|
{$IFDEF PCRE_LINKONREQUEST}
|
|
if PCRELib <> INVALID_MODULEHANDLE_VALUE then
|
|
{$IFDEF MSWINDOWS}
|
|
FreeLibrary(PCRELib);
|
|
{$ENDIF MSWINDOWS}
|
|
{$IFDEF UNIX}
|
|
dlclose(Pointer(PCRELib));
|
|
{$ENDIF UNIX}
|
|
PCRELib := INVALID_MODULEHANDLE_VALUE;
|
|
InitPCREFuncPtrs(@LibNotLoadedHandler);
|
|
{$ENDIF PCRE_LINKONREQUEST}
|
|
end;
|
|
|
|
{$IFNDEF PCRE_LINKONREQUEST}
|
|
function pcre_compile; external libpcremodulename name 'pcre_compile';
|
|
function pcre_copy_substring; external libpcremodulename name 'pcre_copy_substring';
|
|
function pcre_exec; external libpcremodulename name 'pcre_exec';
|
|
function pcre_study; external libpcremodulename name 'pcre_study';
|
|
function pcre_get_substring; external libpcremodulename name 'pcre_get_substring';
|
|
function pcre_get_substring_list; external libpcremodulename name 'pcre_get_substring_list';
|
|
procedure pcre_free_substring; external libpcremodulename name 'pcre_free_substring';
|
|
procedure pcre_free_substring_list; external libpcremodulename name 'pcre_free_substring_list';
|
|
function pcre_maketables; external libpcremodulename name 'pcre_maketables';
|
|
function pcre_fullinfo; external libpcremodulename name 'pcre_fullinfo';
|
|
function pcre_info; external libpcremodulename name 'pcre_info';
|
|
function pcre_version; external libpcremodulename name 'pcre_version';
|
|
function pcre_malloc; external libpcremodulename name 'pcre_malloc';
|
|
procedure pcre_free; external libpcremodulename name 'pcre_free';
|
|
{$ENDIF ~PCRE_LINKONREQUEST}
|
|
|
|
// History
|
|
|
|
// $Log: pcre.pas,v $
|
|
// Revision 1.6 2004/11/06 02:19:34 rrossmair
|
|
// - bug fix (Windows: module handle was tested against INVALID_HANDLE_VALUE = -1, instead of 0)
|
|
// - better handling of calls into DLL when it got not loaded.
|
|
//
|
|
// Revision 1.5 2004/10/02 05:47:28 marquardt
|
|
// added check for incompatible jedi.inc
|
|
// replaced jedi.inc with jvcl.inc
|
|
//
|
|
// Revision 1.4 2004/07/27 06:42:23 marquardt
|
|
// style cleaning of pcre files
|
|
//
|
|
// Revision 1.3 2004/07/26 06:01:39 rrossmair
|
|
// *** empty log message ***
|
|
//
|
|
// Revision 1.2 2004/07/26 05:13:52 rrossmair
|
|
// made it compile under Kylix (no functional tests performed yet)
|
|
//
|
|
|
|
end.
|
|
|