{**************************************************************************************************} { } { 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.