⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcre.pas

📁 East make Tray Icon in delphi
💻 PAS
📖 第 1 页 / 共 2 页
字号:

  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 + -