📄 pcre.pas
字号:
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.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -