pcre.pas 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145
  1. {**************************************************************************************************}
  2. { }
  3. { Project JEDI Code Library (JCL) }
  4. { }
  5. { The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); }
  6. { you may not use this file except in compliance with the License. You may obtain a copy of the }
  7. { License at http://www.mozilla.org/MPL/ }
  8. { }
  9. { Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF }
  10. { ANY KIND, either express or implied. See the License for the specific language governing rights }
  11. { and limitations under the License. }
  12. { }
  13. { The Original Code is pcre.pas. }
  14. { }
  15. { The Initial Developer of the Original Code is Peter Thornqvist. }
  16. { Portions created by Peter Thornqvist are Copyright (C) of Peter Thornqvist. All rights reserved. }
  17. { Portions created by University of Cambridge are }
  18. { Copyright (C) 1997-2001 by University of Cambridge. }
  19. { }
  20. { Contributor(s): }
  21. { Robert Rossmair (rrossmair) }
  22. { Mario R. Carro }
  23. { Florent Ouchet (outchy) }
  24. { }
  25. { The latest release of PCRE is always available from }
  26. { ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz }
  27. { }
  28. { Modified by Jan Goyvaerts for use with TPerlRegEx }
  29. { TPerlRegEx is available at http://www.regular-expressions.info/delphi.html }
  30. { }
  31. {**************************************************************************************************}
  32. { }
  33. { Header conversion of pcre.h }
  34. { }
  35. {**************************************************************************************************}
  36. unit pcre;
  37. interface
  38. (*************************************************
  39. * Perl-Compatible Regular Expressions *
  40. *************************************************)
  41. {$WEAKPACKAGEUNIT ON}
  42. // Define PCRE_STATICLINK to link the OBJ files with PCRE 7.9.
  43. {$DEFINE PCRE_STATICLINK}
  44. // Define PCRE_LINKDLL to use pcrelib.dll
  45. {.$DEFINE PCRE_LINKDLL}
  46. // The supplied pcrelib.dll compiled PCRE 7.9 using the C calling convention
  47. {$IFDEF PCRE_LINKDLL}
  48. {$DEFINE PCRE_EXPORT_CDECL}
  49. {$ENDIF}
  50. (*$HPPEMIT '#include "pcre.h"'*)
  51. const
  52. MAX_PATTERN_LENGTH = $10003;
  53. {$EXTERNALSYM MAX_PATTERN_LENGTH}
  54. MAX_QUANTIFY_REPEAT = $10000;
  55. {$EXTERNALSYM MAX_QUANTIFY_REPEAT}
  56. MAX_CAPTURE_COUNT = $FFFF;
  57. {$EXTERNALSYM MAX_CAPTURE_COUNT}
  58. MAX_NESTING_DEPTH = 200;
  59. {$EXTERNALSYM MAX_NESTING_DEPTH}
  60. const
  61. (* Options *)
  62. PCRE_CASELESS = $00000001;
  63. {$EXTERNALSYM PCRE_CASELESS}
  64. PCRE_MULTILINE = $00000002;
  65. {$EXTERNALSYM PCRE_MULTILINE}
  66. PCRE_DOTALL = $00000004;
  67. {$EXTERNALSYM PCRE_DOTALL}
  68. PCRE_EXTENDED = $00000008;
  69. {$EXTERNALSYM PCRE_EXTENDED}
  70. PCRE_ANCHORED = $00000010;
  71. {$EXTERNALSYM PCRE_ANCHORED}
  72. PCRE_DOLLAR_ENDONLY = $00000020;
  73. {$EXTERNALSYM PCRE_DOLLAR_ENDONLY}
  74. PCRE_EXTRA = $00000040;
  75. {$EXTERNALSYM PCRE_EXTRA}
  76. PCRE_NOTBOL = $00000080;
  77. {$EXTERNALSYM PCRE_NOTBOL}
  78. PCRE_NOTEOL = $00000100;
  79. {$EXTERNALSYM PCRE_NOTEOL}
  80. PCRE_UNGREEDY = $00000200;
  81. {$EXTERNALSYM PCRE_UNGREEDY}
  82. PCRE_NOTEMPTY = $00000400;
  83. {$EXTERNALSYM PCRE_NOTEMPTY}
  84. PCRE_UTF8 = $00000800;
  85. {$EXTERNALSYM PCRE_UTF8}
  86. PCRE_NO_AUTO_CAPTURE = $00001000;
  87. {$EXTERNALSYM PCRE_NO_AUTO_CAPTURE}
  88. PCRE_NO_UTF8_CHECK = $00002000;
  89. {$EXTERNALSYM PCRE_NO_UTF8_CHECK}
  90. PCRE_AUTO_CALLOUT = $00004000;
  91. {$EXTERNALSYM PCRE_AUTO_CALLOUT}
  92. PCRE_PARTIAL = $00008000;
  93. {$EXTERNALSYM PCRE_PARTIAL}
  94. PCRE_DFA_SHORTEST = $00010000;
  95. {$EXTERNALSYM PCRE_DFA_SHORTEST}
  96. PCRE_DFA_RESTART = $00020000;
  97. {$EXTERNALSYM PCRE_DFA_RESTART}
  98. PCRE_FIRSTLINE = $00040000;
  99. {$EXTERNALSYM PCRE_FIRSTLINE}
  100. PCRE_DUPNAMES = $00080000;
  101. {$EXTERNALSYM PCRE_DUPNAMES}
  102. PCRE_NEWLINE_CR = $00100000;
  103. {$EXTERNALSYM PCRE_NEWLINE_CR}
  104. PCRE_NEWLINE_LF = $00200000;
  105. {$EXTERNALSYM PCRE_NEWLINE_LF}
  106. PCRE_NEWLINE_CRLF = $00300000;
  107. {$EXTERNALSYM PCRE_NEWLINE_CRLF}
  108. PCRE_NEWLINE_ANY = $00400000;
  109. {$EXTERNALSYM PCRE_NEWLINE_ANY}
  110. PCRE_NEWLINE_ANYCRLF = $00500000;
  111. {$EXTERNALSYM PCRE_NEWLINE_ANYCRLF}
  112. PCRE_BSR_ANYCRLF = $00800000;
  113. {$EXTERNALSYM PCRE_BSR_ANYCRLF}
  114. PCRE_BSR_UNICODE = $01000000;
  115. {$EXTERNALSYM PCRE_BSR_UNICODE}
  116. PCRE_JAVASCRIPT_COMPAT = $02000000;
  117. {$EXTERNALSYM PCRE_JAVASCRIPT_COMPAT}
  118. PCRE_NO_START_OPTIMIZE = $04000000;
  119. {$EXTERNALSYM PCRE_NO_START_OPTIMIZE}
  120. PCRE_NO_START_OPTIMISE = $04000000;
  121. {$EXTERNALSYM PCRE_NO_START_OPTIMISE}
  122. (* Exec-time and get-time error codes *)
  123. PCRE_ERROR_NOMATCH = -1;
  124. {$EXTERNALSYM PCRE_ERROR_NOMATCH}
  125. PCRE_ERROR_NULL = -2;
  126. {$EXTERNALSYM PCRE_ERROR_NULL}
  127. PCRE_ERROR_BADOPTION = -3;
  128. {$EXTERNALSYM PCRE_ERROR_BADOPTION}
  129. PCRE_ERROR_BADMAGIC = -4;
  130. {$EXTERNALSYM PCRE_ERROR_BADMAGIC}
  131. PCRE_ERROR_UNKNOWN_NODE = -5;
  132. {$EXTERNALSYM PCRE_ERROR_UNKNOWN_NODE}
  133. PCRE_ERROR_NOMEMORY = -6;
  134. {$EXTERNALSYM PCRE_ERROR_NOMEMORY}
  135. PCRE_ERROR_NOSUBSTRING = -7;
  136. {$EXTERNALSYM PCRE_ERROR_NOSUBSTRING}
  137. PCRE_ERROR_MATCHLIMIT = -8;
  138. {$EXTERNALSYM PCRE_ERROR_MATCHLIMIT}
  139. PCRE_ERROR_CALLOUT = -9; (* Never used by PCRE itself *)
  140. {$EXTERNALSYM PCRE_ERROR_CALLOUT}
  141. PCRE_ERROR_BADUTF8 = -10;
  142. {$EXTERNALSYM PCRE_ERROR_BADUTF8}
  143. PCRE_ERROR_BADUTF8_OFFSET = -11;
  144. {$EXTERNALSYM PCRE_ERROR_BADUTF8_OFFSET}
  145. PCRE_ERROR_PARTIAL = -12;
  146. {$EXTERNALSYM PCRE_ERROR_PARTIAL}
  147. PCRE_ERROR_BADPARTIAL = -13;
  148. {$EXTERNALSYM PCRE_ERROR_BADPARTIAL}
  149. PCRE_ERROR_INTERNAL = -14;
  150. {$EXTERNALSYM PCRE_ERROR_INTERNAL}
  151. PCRE_ERROR_BADCOUNT = -15;
  152. {$EXTERNALSYM PCRE_ERROR_BADCOUNT}
  153. PCRE_ERROR_DFA_UITEM = -16;
  154. {$EXTERNALSYM PCRE_ERROR_DFA_UITEM}
  155. PCRE_ERROR_DFA_UCOND = -17;
  156. {$EXTERNALSYM PCRE_ERROR_DFA_UCOND}
  157. PCRE_ERROR_DFA_UMLIMIT = -18;
  158. {$EXTERNALSYM PCRE_ERROR_DFA_UMLIMIT}
  159. PCRE_ERROR_DFA_WSSIZE = -19;
  160. {$EXTERNALSYM PCRE_ERROR_DFA_WSSIZE}
  161. PCRE_ERROR_DFA_RECURSE = -20;
  162. {$EXTERNALSYM PCRE_ERROR_DFA_RECURSE}
  163. PCRE_ERROR_RECURSIONLIMIT = -21;
  164. {$EXTERNALSYM PCRE_ERROR_RECURSIONLIMIT}
  165. PCRE_ERROR_NULLWSLIMIT = -22; (* No longer actually used *)
  166. {$EXTERNALSYM PCRE_ERROR_NULLWSLIMIT}
  167. PCRE_ERROR_BADNEWLINE = -23;
  168. {$EXTERNALSYM PCRE_ERROR_BADNEWLINE}
  169. (* Request types for pcre_fullinfo() *)
  170. PCRE_INFO_OPTIONS = 0;
  171. {$EXTERNALSYM PCRE_INFO_OPTIONS}
  172. PCRE_INFO_SIZE = 1;
  173. {$EXTERNALSYM PCRE_INFO_SIZE}
  174. PCRE_INFO_CAPTURECOUNT = 2;
  175. {$EXTERNALSYM PCRE_INFO_CAPTURECOUNT}
  176. PCRE_INFO_BACKREFMAX = 3;
  177. {$EXTERNALSYM PCRE_INFO_BACKREFMAX}
  178. PCRE_INFO_FIRSTCHAR = 4;
  179. {$EXTERNALSYM PCRE_INFO_FIRSTCHAR}
  180. PCRE_INFO_FIRSTTABLE = 5;
  181. {$EXTERNALSYM PCRE_INFO_FIRSTTABLE}
  182. PCRE_INFO_LASTLITERAL = 6;
  183. {$EXTERNALSYM PCRE_INFO_LASTLITERAL}
  184. PCRE_INFO_NAMEENTRYSIZE = 7;
  185. {$EXTERNALSYM PCRE_INFO_NAMEENTRYSIZE}
  186. PCRE_INFO_NAMECOUNT = 8;
  187. {$EXTERNALSYM PCRE_INFO_NAMECOUNT}
  188. PCRE_INFO_NAMETABLE = 9;
  189. {$EXTERNALSYM PCRE_INFO_NAMETABLE}
  190. PCRE_INFO_STUDYSIZE = 10;
  191. {$EXTERNALSYM PCRE_INFO_STUDYSIZE}
  192. PCRE_INFO_DEFAULT_TABLES = 11;
  193. {$EXTERNALSYM PCRE_INFO_DEFAULT_TABLES}
  194. PCRE_INFO_OKPARTIAL = 12;
  195. {$EXTERNALSYM PCRE_INFO_OKPARTIAL}
  196. PCRE_INFO_JCHANGED = 13;
  197. {$EXTERNALSYM PCRE_INFO_JCHANGED}
  198. PCRE_INFO_HASCRORLF = 14;
  199. {$EXTERNALSYM PCRE_INFO_HASCRORLF}
  200. (* Request types for pcre_config() *)
  201. PCRE_CONFIG_UTF8 = 0;
  202. {$EXTERNALSYM PCRE_CONFIG_UTF8}
  203. PCRE_CONFIG_NEWLINE = 1;
  204. {$EXTERNALSYM PCRE_CONFIG_NEWLINE}
  205. PCRE_CONFIG_LINK_SIZE = 2;
  206. {$EXTERNALSYM PCRE_CONFIG_LINK_SIZE}
  207. PCRE_CONFIG_POSIX_MALLOC_THRESHOLD = 3;
  208. {$EXTERNALSYM PCRE_CONFIG_POSIX_MALLOC_THRESHOLD}
  209. PCRE_CONFIG_MATCH_LIMIT = 4;
  210. {$EXTERNALSYM PCRE_CONFIG_MATCH_LIMIT}
  211. PCRE_CONFIG_STACKRECURSE = 5;
  212. {$EXTERNALSYM PCRE_CONFIG_STACKRECURSE}
  213. PCRE_CONFIG_UNICODE_PROPERTIES = 6;
  214. {$EXTERNALSYM PCRE_CONFIG_UNICODE_PROPERTIES}
  215. PCRE_CONFIG_MATCH_LIMIT_RECURSION = 7;
  216. {$EXTERNALSYM PCRE_CONFIG_MATCH_LIMIT_RECURSION}
  217. PCRE_CONFIG_BSR = 8;
  218. {$EXTERNALSYM PCRE_CONFIG_BSR}
  219. (* Bit flags for the pcre_extra structure *)
  220. PCRE_EXTRA_STUDY_DATA = $0001;
  221. {$EXTERNALSYM PCRE_EXTRA_STUDY_DATA}
  222. PCRE_EXTRA_MATCH_LIMIT = $0002;
  223. {$EXTERNALSYM PCRE_EXTRA_MATCH_LIMIT}
  224. PCRE_EXTRA_CALLOUT_DATA = $0004;
  225. {$EXTERNALSYM PCRE_EXTRA_CALLOUT_DATA}
  226. PCRE_EXTRA_TABLES = $0008;
  227. {$EXTERNALSYM PCRE_EXTRA_TABLES}
  228. PCRE_EXTRA_MATCH_LIMIT_RECURSION = $0010;
  229. {$EXTERNALSYM PCRE_EXTRA_MATCH_LIMIT_RECURSION}
  230. type
  231. (* Types *)
  232. PPAnsiChar = ^PAnsiChar;
  233. {$EXTERNALSYM PPAnsiChar}
  234. PPPAnsiChar = ^PPAnsiChar;
  235. {$EXTERNALSYM PPPAnsiChar}
  236. PInteger = ^Integer;
  237. {$EXTERNALSYM PInteger}
  238. real_pcre = packed record
  239. {magic_number: Longword;
  240. size: Integer;
  241. tables: PAnsiChar;
  242. options: Longword;
  243. top_bracket: Word;
  244. top_backref: word;
  245. first_char: PAnsiChar;
  246. req_char: PAnsiChar;
  247. code: array [0..0] of AnsiChar;}
  248. end;
  249. TPCRE = real_pcre;
  250. PPCRE = ^TPCRE;
  251. real_pcre_extra = packed record
  252. {options: PAnsiChar;
  253. start_bits: array [0..31] of AnsiChar;}
  254. flags: Cardinal; (* Bits for which fields are set *)
  255. study_data: Pointer; (* Opaque data from pcre_study() *)
  256. match_limit: Cardinal; (* Maximum number of calls to match() *)
  257. callout_data: Pointer; (* Data passed back in callouts *)
  258. tables: PAnsiChar; (* Pointer to character tables *)
  259. match_limit_recursion: Cardinal; (* Max recursive calls to match() *)
  260. end;
  261. TPCREExtra = real_pcre_extra;
  262. PPCREExtra = ^TPCREExtra;
  263. pcre_callout_block = packed record
  264. version: Integer; (* Identifies version of block *)
  265. (* ------------------------ Version 0 ------------------------------- *)
  266. callout_number: Integer; (* Number compiled into pattern *)
  267. offset_vector: PInteger; (* The offset vector *)
  268. subject: PAnsiChar; (* The subject being matched *)
  269. subject_length: Integer; (* The length of the subject *)
  270. start_match: Integer; (* Offset to start of this match attempt *)
  271. current_position: Integer; (* Where we currently are in the subject *)
  272. capture_top: Integer; (* Max current capture *)
  273. capture_last: Integer; (* Most recently closed capture *)
  274. callout_data: Pointer; (* Data passed in with the call *)
  275. (* ------------------- Added for Version 1 -------------------------- *)
  276. pattern_position: Integer; (* Offset to next item in the pattern *)
  277. next_item_length: Integer; (* Length of next item in the pattern *)
  278. (* ------------------------------------------------------------------ *)
  279. end;
  280. pcre_malloc_callback = function(Size: Integer): Pointer; {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  281. {$EXTERNALSYM pcre_malloc_callback}
  282. pcre_free_callback = procedure(P: Pointer); {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  283. {$EXTERNALSYM pcre_free_callback}
  284. pcre_stack_malloc_callback = function(Size: Integer): Pointer; {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  285. {$EXTERNALSYM pcre_stack_malloc_callback}
  286. pcre_stack_free_callback = procedure(P: Pointer); {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  287. {$EXTERNALSYM pcre_stack_free_callback}
  288. pcre_callout_callback = function(var callout_block: pcre_callout_block): Integer; {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  289. {$EXTERNALSYM pcre_callout_callback}
  290. var
  291. // renamed from "pcre_X" to "pcre_X_func" to allow functions with name "pcre_X" to be
  292. // declared in implementation when static linked
  293. pcre_malloc_func: ^pcre_malloc_callback = nil;
  294. {$EXTERNALSYM pcre_malloc_func}
  295. pcre_free_func: ^pcre_free_callback = nil;
  296. {$EXTERNALSYM pcre_free_func}
  297. pcre_stack_malloc_func: ^pcre_stack_malloc_callback = nil;
  298. {$EXTERNALSYM pcre_stack_malloc_func}
  299. pcre_stack_free_func: ^pcre_stack_free_callback = nil;
  300. {$EXTERNALSYM pcre_stack_free_func}
  301. pcre_callout_func: ^pcre_callout_callback = nil;
  302. {$EXTERNALSYM pcre_callout_func}
  303. procedure SetPCREMallocCallback(const Value: pcre_malloc_callback);
  304. {$EXTERNALSYM SetPCREMallocCallback}
  305. function GetPCREMallocCallback: pcre_malloc_callback;
  306. {$EXTERNALSYM GetPCREMallocCallback}
  307. function CallPCREMalloc(Size: Integer): Pointer;
  308. {$EXTERNALSYM CallPCREMalloc}
  309. procedure SetPCREFreeCallback(const Value: pcre_free_callback);
  310. {$EXTERNALSYM SetPCREFreeCallback}
  311. function GetPCREFreeCallback: pcre_free_callback;
  312. {$EXTERNALSYM GetPCREFreeCallback}
  313. procedure CallPCREFree(P: Pointer);
  314. {$EXTERNALSYM CallPCREFree}
  315. procedure SetPCREStackMallocCallback(const Value: pcre_stack_malloc_callback);
  316. {$EXTERNALSYM SetPCREStackMallocCallback}
  317. function GetPCREStackMallocCallback: pcre_stack_malloc_callback;
  318. {$EXTERNALSYM GetPCREStackMallocCallback}
  319. function CallPCREStackMalloc(Size: Integer): Pointer;
  320. {$EXTERNALSYM CallPCREStackMalloc}
  321. procedure SetPCREStackFreeCallback(const Value: pcre_stack_free_callback);
  322. {$EXTERNALSYM SetPCREStackFreeCallback}
  323. function GetPCREStackFreeCallback: pcre_stack_free_callback;
  324. {$EXTERNALSYM GetPCREStackFreeCallback}
  325. procedure CallPCREStackFree(P: Pointer);
  326. {$EXTERNALSYM CallPCREStackFree}
  327. procedure SetPCRECalloutCallback(const Value: pcre_callout_callback);
  328. {$EXTERNALSYM SetPCRECalloutCallback}
  329. function GetPCRECalloutCallback: pcre_callout_callback;
  330. {$EXTERNALSYM GetPCRECalloutCallback}
  331. function CallPCRECallout(var callout_block: pcre_callout_block): Integer;
  332. {$EXTERNALSYM CallPCRECallout}
  333. type
  334. TPCRELibNotLoadedHandler = procedure; {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  335. var
  336. // Value to initialize function pointers below with, in case LoadPCRE fails
  337. // or UnloadPCRE is called. Typically the handler will raise an exception.
  338. LibNotLoadedHandler: TPCRELibNotLoadedHandler = nil;
  339. (* Functions *)
  340. {$IFNDEF PCRE_LINKONREQUEST}
  341. // static link and static dll import
  342. function pcre_compile(const pattern: PAnsiChar; options: Integer;
  343. const errptr: PPAnsiChar; erroffset: PInteger; const tableptr: PAnsiChar): PPCRE;
  344. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  345. {$EXTERNALSYM pcre_compile}
  346. function pcre_compile2(const pattern: PAnsiChar; options: Integer;
  347. const errorcodeptr: PInteger; const errorptr: PPAnsiChar; erroroffset: PInteger;
  348. const tables: PAnsiChar): PPCRE;
  349. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  350. {$EXTERNALSYM pcre_compile2}
  351. function pcre_config(what: Integer; where: Pointer): Integer;
  352. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  353. {$EXTERNALSYM pcre_config}
  354. function pcre_copy_named_substring(const code: PPCRE; const subject: PAnsiChar;
  355. ovector: PInteger; stringcount: Integer; const stringname: PAnsiChar;
  356. buffer: PAnsiChar; size: Integer): Integer;
  357. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  358. {$EXTERNALSYM pcre_copy_named_substring}
  359. function pcre_copy_substring(const subject: PAnsiChar; ovector: PInteger;
  360. stringcount, stringnumber: Integer; buffer: PAnsiChar; buffersize: Integer): Integer;
  361. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  362. {$EXTERNALSYM pcre_copy_substring}
  363. function pcre_dfa_exec(const argument_re: PPCRE; const extra_data: PPCREExtra;
  364. const subject: PAnsiChar; length: Integer; start_offset: Integer;
  365. options: Integer; offsets: PInteger; offsetcount: Integer; workspace: PInteger;
  366. wscount: Integer): Integer;
  367. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  368. {$EXTERNALSYM pcre_dfa_exec}
  369. function pcre_exec(const code: PPCRE; const extra: PPCREExtra; const subject: PAnsiChar;
  370. length, startoffset, options: Integer; ovector: PInteger; ovecsize: Integer): Integer;
  371. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  372. {$EXTERNALSYM pcre_exec}
  373. procedure pcre_free_substring(stringptr: PAnsiChar);
  374. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  375. {$EXTERNALSYM pcre_free_substring}
  376. procedure pcre_free_substring_list(stringlistptr: PPAnsiChar);
  377. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  378. {$EXTERNALSYM pcre_free_substring_list}
  379. function pcre_fullinfo(const code: PPCRE; const extra: PPCREExtra;
  380. what: Integer; where: Pointer): Integer;
  381. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  382. {$EXTERNALSYM pcre_fullinfo}
  383. function pcre_get_named_substring(const code: PPCRE; const subject: PAnsiChar;
  384. ovector: PInteger; stringcount: Integer; const stringname: PAnsiChar;
  385. const stringptr: PPAnsiChar): Integer;
  386. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  387. {$EXTERNALSYM pcre_get_named_substring}
  388. function pcre_get_stringnumber(const code: PPCRE; const stringname: PAnsiChar): Integer;
  389. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  390. {$EXTERNALSYM pcre_get_stringnumber}
  391. function pcre_get_stringtable_entries(const code: PPCRE; const stringname: PAnsiChar;
  392. firstptr: PPAnsiChar; lastptr: PPAnsiChar): Integer;
  393. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  394. {$EXTERNALSYM pcre_get_stringtable_entries}
  395. function pcre_get_substring(const subject: PAnsiChar; ovector: PInteger;
  396. stringcount, stringnumber: Integer; const stringptr: PPAnsiChar): Integer;
  397. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  398. {$EXTERNALSYM pcre_get_substring}
  399. function pcre_get_substring_list(const subject: PAnsiChar; ovector: PInteger;
  400. stringcount: Integer; listptr: PPPAnsiChar): Integer;
  401. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  402. {$EXTERNALSYM pcre_get_substring_list}
  403. function pcre_info(const code: PPCRE; optptr, firstcharptr: PInteger): Integer;
  404. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  405. {$EXTERNALSYM pcre_info}
  406. function pcre_maketables: PAnsiChar;
  407. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  408. {$EXTERNALSYM pcre_maketables}
  409. function pcre_refcount(argument_re: PPCRE; adjust: Integer): Integer;
  410. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  411. {$EXTERNALSYM pcre_refcount}
  412. function pcre_study(const code: PPCRE; options: Integer; const errptr: PPAnsiChar): PPCREExtra;
  413. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  414. {$EXTERNALSYM pcre_study}
  415. function pcre_version: PAnsiChar; {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  416. {$EXTERNALSYM pcre_version}
  417. // Calling pcre_free in the DLL causes an access violation error; use pcre_dispose instead
  418. procedure pcre_dispose(pattern, hints, chartable: Pointer); {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  419. {$ELSE}
  420. // dynamic dll import
  421. type
  422. pcre_compile_func = function(const pattern: PAnsiChar; options: Integer;
  423. const errptr: PPAnsiChar; erroffset: PInteger; const tableptr: PAnsiChar): PPCRE;
  424. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  425. {$EXTERNALSYM pcre_compile_func}
  426. pcre_compile2_func = function(const pattern: PAnsiChar; options: Integer;
  427. const errorcodeptr: PInteger; const errorptr: PPAnsiChar; erroroffset: PInteger;
  428. const tables: PAnsiChar): PPCRE; {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  429. {$EXTERNALSYM pcre_compile2_func}
  430. pcre_config_func = function(what: Integer; where: Pointer): Integer;
  431. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  432. {$EXTERNALSYM pcre_config_func}
  433. pcre_copy_named_substring_func = function(const code: PPCRE; const subject: PAnsiChar;
  434. ovector: PInteger; stringcount: Integer; const stringname: PAnsiChar;
  435. buffer: PAnsiChar; size: Integer): Integer; {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  436. {$EXTERNALSYM pcre_copy_named_substring_func}
  437. pcre_copy_substring_func = function(const subject: PAnsiChar; ovector: PInteger;
  438. stringcount, stringnumber: Integer; buffer: PAnsiChar; buffersize: Integer): Integer;
  439. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  440. {$EXTERNALSYM pcre_copy_substring_func}
  441. pcre_dfa_exec_func = function(const argument_re: PPCRE; const extra_data: PPCREExtra;
  442. const subject: PAnsiChar; length: Integer; start_offset: Integer;
  443. options: Integer; offsets: PInteger; offsetcount: Integer; workspace: PInteger;
  444. wscount: Integer): Integer; {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  445. {$EXTERNALSYM pcre_dfa_exec_func}
  446. pcre_exec_func = function(const code: PPCRE; const extra: PPCREExtra; const subject: PAnsiChar;
  447. length, startoffset, options: Integer; ovector: PInteger; ovecsize: Integer): Integer;
  448. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  449. {$EXTERNALSYM pcre_exec_func}
  450. pcre_free_substring_func = procedure(stringptr: PAnsiChar);
  451. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  452. {$EXTERNALSYM pcre_free_substring_func}
  453. pcre_free_substring_list_func = procedure(stringptr: PPAnsiChar);
  454. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  455. {$EXTERNALSYM pcre_free_substring_list_func}
  456. pcre_fullinfo_func = function(const code: PPCRE; const extra: PPCREExtra;
  457. what: Integer; where: Pointer): Integer;
  458. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  459. {$EXTERNALSYM pcre_fullinfo_func}
  460. pcre_get_named_substring_func = function(const code: PPCRE; const subject: PAnsiChar;
  461. ovector: PInteger; stringcount: Integer; const stringname: PAnsiChar;
  462. const stringptr: PPAnsiChar): Integer; {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  463. {$EXTERNALSYM pcre_get_named_substring_func}
  464. pcre_get_stringnumber_func = function(const code: PPCRE;
  465. const stringname: PAnsiChar): Integer; {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  466. {$EXTERNALSYM pcre_get_stringnumber_func}
  467. pcre_get_stringtable_entries_func = function(const code: PPCRE; const stringname: PAnsiChar;
  468. firstptr: PPAnsiChar; lastptr: PPAnsiChar): Integer;
  469. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  470. {$EXTERNALSYM pcre_get_stringtable_entries_func}
  471. pcre_get_substring_func = function(const subject: PAnsiChar; ovector: PInteger;
  472. stringcount, stringnumber: Integer; const stringptr: PPAnsiChar): Integer;
  473. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  474. {$EXTERNALSYM pcre_get_substring_func}
  475. pcre_get_substring_list_func = function(const subject: PAnsiChar; ovector: PInteger;
  476. stringcount: Integer; listptr: PPPAnsiChar): Integer;
  477. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  478. {$EXTERNALSYM pcre_get_substring_list_func}
  479. pcre_info_func = function(const code: PPCRE; optptr, firstcharptr: PInteger): Integer;
  480. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  481. {$EXTERNALSYM pcre_info_func}
  482. pcre_maketables_func = function: PAnsiChar; {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  483. {$EXTERNALSYM pcre_maketables_func}
  484. pcre_refcount_func = function(argument_re: PPCRE; adjust: Integer): Integer;
  485. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  486. {$EXTERNALSYM pcre_refcount_func}
  487. pcre_study_func = function(const code: PPCRE; options: Integer; const errptr: PPAnsiChar): PPCREExtra;
  488. {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  489. {$EXTERNALSYM pcre_study_func}
  490. pcre_version_func = function: PAnsiChar; {$IFDEF PCRE_EXPORT_CDECL} cdecl; {$ENDIF PCRE_EXPORT_CDECL}
  491. {$EXTERNALSYM pcre_version_func}
  492. var
  493. pcre_compile: pcre_compile_func = nil;
  494. {$EXTERNALSYM pcre_compile}
  495. pcre_compile2: pcre_compile2_func = nil;
  496. {$EXTERNALSYM pcre_compile2}
  497. pcre_config: pcre_config_func = nil;
  498. {$EXTERNALSYM pcre_config}
  499. pcre_copy_named_substring: pcre_copy_named_substring_func = nil;
  500. {$EXTERNALSYM pcre_copy_named_substring}
  501. pcre_copy_substring: pcre_copy_substring_func = nil;
  502. {$EXTERNALSYM pcre_copy_substring}
  503. pcre_dfa_exec: pcre_dfa_exec_func = nil;
  504. {$EXTERNALSYM pcre_dfa_exec}
  505. pcre_exec: pcre_exec_func = nil;
  506. {$EXTERNALSYM pcre_exec}
  507. pcre_free_substring: pcre_free_substring_func = nil;
  508. {$EXTERNALSYM pcre_free_substring}
  509. pcre_free_substring_list: pcre_free_substring_list_func = nil;
  510. {$EXTERNALSYM pcre_free_substring_list}
  511. pcre_fullinfo: pcre_fullinfo_func = nil;
  512. {$EXTERNALSYM pcre_fullinfo}
  513. pcre_get_named_substring: pcre_get_named_substring_func = nil;
  514. {$EXTERNALSYM pcre_get_named_substring}
  515. pcre_get_stringnumber: pcre_get_stringnumber_func = nil;
  516. {$EXTERNALSYM pcre_get_stringnumber}
  517. pcre_get_stringtable_entries: pcre_get_stringtable_entries_func = nil;
  518. {$EXTERNALSYM pcre_get_stringtable_entries}
  519. pcre_get_substring: pcre_get_substring_func = nil;
  520. {$EXTERNALSYM pcre_get_substring}
  521. pcre_get_substring_list: pcre_get_substring_list_func = nil;
  522. {$EXTERNALSYM pcre_get_substring_list}
  523. pcre_info: pcre_info_func = nil;
  524. {$EXTERNALSYM pcre_info}
  525. pcre_maketables: pcre_maketables_func = nil;
  526. {$EXTERNALSYM pcre_maketables}
  527. pcre_refcount: pcre_refcount_func = nil;
  528. {$EXTERNALSYM pcre_refcount}
  529. pcre_study: pcre_study_func = nil;
  530. {$EXTERNALSYM pcre_study}
  531. pcre_version: pcre_version_func = nil;
  532. {$EXTERNALSYM pcre_version}
  533. {$ENDIF ~PCRE_LINKONREQUEST}
  534. function IsPCRELoaded: Boolean;
  535. function LoadPCRE: Boolean;
  536. procedure UnloadPCRE;
  537. implementation
  538. uses
  539. SysUtils,
  540. {$IFDEF MSWINDOWS}
  541. Windows;
  542. {$ENDIF MSWINDOWS}
  543. {$IFDEF UNIX}
  544. {$IFDEF HAS_UNIT_TYPES}
  545. Types,
  546. {$ENDIF HAS_UNIT_TYPES}
  547. {$IFDEF HAS_UNIT_LIBC}
  548. Libc;
  549. {$ELSE ~HAS_UNIT_LIBC}
  550. dl;
  551. {$ENDIF ~HAS_UNIT_LIBC}
  552. {$ENDIF UNIX}
  553. {$IFDEF PCRE_STATICLINK}
  554. {$LINK pcre\pcre_compile.obj}
  555. {$LINK pcre\pcre_config.obj}
  556. {$LINK pcre\pcre_dfa_exec.obj}
  557. {$LINK pcre\pcre_exec.obj}
  558. {$LINK pcre\pcre_fullinfo.obj}
  559. {$LINK pcre\pcre_get.obj}
  560. {$LINK pcre\pcre_globals.obj}
  561. {$LINK pcre\pcre_info.obj}
  562. {$LINK pcre\pcre_maketables.obj}
  563. {$LINK pcre\pcre_newline.obj}
  564. {$LINK pcre\pcre_ord2utf8.obj}
  565. {$LINK pcre\pcre_refcount.obj}
  566. {$LINK pcre\pcre_study.obj}
  567. {$LINK pcre\pcre_tables.obj}
  568. {$LINK pcre\pcre_try_flipped.obj}
  569. {$LINK pcre\pcre_ucd.obj}
  570. {$LINK pcre\pcre_valid_utf8.obj}
  571. {$LINK pcre\pcre_version.obj}
  572. {$LINK pcre\pcre_xclass.obj}
  573. {$LINK pcre\pcre_default_tables.obj}
  574. // user's defined callbacks
  575. var
  576. pcre_malloc_user: pcre_malloc_callback;
  577. pcre_free_user: pcre_free_callback;
  578. pcre_stack_malloc_user: pcre_stack_malloc_callback;
  579. pcre_stack_free_user: pcre_stack_free_callback;
  580. pcre_callout_user: pcre_callout_callback;
  581. function pcre_compile; external;
  582. function pcre_compile2; external;
  583. function pcre_config; external;
  584. function pcre_copy_named_substring; external;
  585. function pcre_copy_substring; external;
  586. function pcre_dfa_exec; external;
  587. function pcre_exec; external;
  588. procedure pcre_free_substring; external;
  589. procedure pcre_free_substring_list; external;
  590. function pcre_fullinfo; external;
  591. function pcre_get_named_substring; external;
  592. function pcre_get_stringnumber; external;
  593. function pcre_get_stringtable_entries; external;
  594. function pcre_get_substring; external;
  595. function pcre_get_substring_list; external;
  596. function pcre_info; external;
  597. function pcre_maketables; external;
  598. function pcre_refcount; external;
  599. function pcre_study; external;
  600. function pcre_version; external;
  601. type
  602. size_t = Longint;
  603. const
  604. szMSVCRT = 'MSVCRT.DLL';
  605. function _memcpy(dest, src: Pointer; count: size_t): Pointer; cdecl; external szMSVCRT name 'memcpy';
  606. function _memmove(dest, src: Pointer; count: size_t): Pointer; cdecl; external szMSVCRT name 'memmove';
  607. function _memset(dest: Pointer; val: Integer; count: size_t): Pointer; cdecl; external szMSVCRT name 'memset';
  608. function _strncmp(s1: PAnsiChar; s2: PAnsiChar; n: size_t): Integer; cdecl; external szMSVCRT name 'strncmp';
  609. function _memcmp(s1: Pointer; s2: Pointer; n: size_t): Integer; cdecl; external szMSVCRT name 'memcmp';
  610. function _strlen(s: PAnsiChar): size_t; cdecl; external szMSVCRT name 'strlen';
  611. function __ltolower(__ch: Integer): Integer; cdecl; external szMSVCRT name 'tolower';
  612. function __ltoupper(__ch: Integer): Integer; cdecl; external szMSVCRT name 'toupper';
  613. function _isalnum(__ch: Integer): Integer; cdecl; external szMSVCRT name 'isalnum';
  614. function _isalpha(__ch: Integer): Integer; cdecl; external szMSVCRT name 'isalpha';
  615. function _iscntrl(__ch: Integer): Integer; cdecl; external szMSVCRT name 'iscntrl';
  616. function _isdigit(__ch: Integer): Integer; cdecl; external szMSVCRT name 'isdigit';
  617. function _isgraph(__ch: Integer): Integer; cdecl; external szMSVCRT name 'isgraph';
  618. function _islower(__ch: Integer): Integer; cdecl; external szMSVCRT name 'islower';
  619. function _isprint(__ch: Integer): Integer; cdecl; external szMSVCRT name 'isprint';
  620. function _ispunct(__ch: Integer): Integer; cdecl; external szMSVCRT name 'ispunct';
  621. function _isspace(__ch: Integer): Integer; cdecl; external szMSVCRT name 'isspace';
  622. function _isupper(__ch: Integer): Integer; cdecl; external szMSVCRT name 'isupper';
  623. function _isxdigit(__ch: Integer): Integer; cdecl; external szMSVCRT name 'isxdigit';
  624. function _strchr(__s: PAnsiChar; __c: Integer): PAnsiChar; cdecl; external szMSVCRT name 'strchr';
  625. function malloc(size: size_t): Pointer; cdecl; external szMSVCRT name 'malloc';
  626. function pcre_malloc(Size: Integer): Pointer;
  627. begin
  628. if Assigned(pcre_malloc_user) then
  629. Result := pcre_malloc_user(Size)
  630. else
  631. Result := malloc(Size);
  632. end;
  633. function pcre_stack_malloc(Size: Integer): Pointer;
  634. begin
  635. if Assigned(pcre_stack_malloc_user) then
  636. Result := pcre_stack_malloc_user(Size)
  637. else
  638. Result := malloc(Size);
  639. end;
  640. function _malloc(size: size_t): Pointer;
  641. begin
  642. Result := pcre_malloc(size);
  643. end;
  644. procedure free(pBlock: Pointer); cdecl; external szMSVCRT name 'free';
  645. procedure pcre_free(P: Pointer);
  646. begin
  647. if Assigned(pcre_free_user) then
  648. pcre_free_user(P)
  649. else
  650. free(P);
  651. end;
  652. procedure pcre_stack_free(P: Pointer);
  653. begin
  654. if Assigned(pcre_stack_free_user) then
  655. pcre_stack_free_user(P)
  656. else
  657. free(P);
  658. end;
  659. procedure _free(pBlock: Pointer);
  660. begin
  661. pcre_free(pBlock);
  662. end;
  663. function pcre_callout(var callout_block: pcre_callout_block): Integer; cdecl;
  664. begin
  665. if Assigned(pcre_callout_user) then
  666. Result := pcre_callout_user(callout_block)
  667. else
  668. Result := 0;
  669. end;
  670. {$ELSE ~PCRE_STATICLINK}
  671. type
  672. {$IFDEF MSWINDOWS}
  673. TModuleHandle = HINST;
  674. {$ENDIF MSWINDOWS}
  675. {$IFDEF LINUX}
  676. TModuleHandle = Pointer;
  677. {$ENDIF LINUX}
  678. const
  679. {$IFDEF MSWINDOWS}
  680. libpcremodulename = 'pcrelib.dll';
  681. {$ENDIF MSWINDOWS}
  682. {$IFDEF UNIX}
  683. libpcremodulename = 'libpcre.so.0';
  684. {$ENDIF UNIX}
  685. PCRECompileExportName = 'pcre_compile';
  686. PCRECompile2ExportName = 'pcre_compile2';
  687. PCREConfigExportName = 'pcre_config';
  688. PCRECopyNamedSubstringExportName = 'pcre_copy_named_substring';
  689. PCRECopySubStringExportName = 'pcre_copy_substring';
  690. PCREDfaExecExportName = 'pcre_dfa_exec';
  691. PCREExecExportName = 'pcre_exec';
  692. PCREFreeSubStringExportName = 'pcre_free_substring';
  693. PCREFreeSubStringListExportName = 'pcre_free_substring_list';
  694. PCREFullInfoExportName = 'pcre_fullinfo';
  695. PCREGetNamedSubstringExportName = 'pcre_get_named_substring';
  696. PCREGetStringNumberExportName = 'pcre_get_stringnumber';
  697. PCREGetStringTableEntriesExportName = 'pcre_get_stringtable_entries';
  698. PCREGetSubStringExportName = 'pcre_get_substring';
  699. PCREGetSubStringListExportName = 'pcre_get_substring_list';
  700. PCREInfoExportName = 'pcre_info';
  701. PCREMakeTablesExportName = 'pcre_maketables';
  702. PCRERefCountExportName = 'pcre_refcount';
  703. PCREStudyExportName = 'pcre_study';
  704. PCREVersionExportName = 'pcre_version';
  705. PCREMallocExportName = 'pcre_malloc';
  706. PCREFreeExportName = 'pcre_free';
  707. PCREStackMallocExportName = 'pcre_stack_malloc';
  708. PCREStackFreeExportName = 'pcre_stack_free';
  709. PCRECalloutExportName = 'pcre_callout';
  710. INVALID_MODULEHANDLE_VALUE = TModuleHandle(0);
  711. var
  712. PCRELib: TModuleHandle = INVALID_MODULEHANDLE_VALUE;
  713. {$ENDIF ~PCRE_STATICLINK}
  714. procedure SetPCREMallocCallback(const Value: pcre_malloc_callback);
  715. begin
  716. {$IFDEF PCRE_STATICLINK}
  717. pcre_malloc_user := Value;
  718. {$ELSE ~PCRE_STATICLINK}
  719. if not Assigned(pcre_malloc_func) then
  720. LoadPCRE;
  721. if Assigned(pcre_malloc_func) then
  722. pcre_malloc_func^ := Value
  723. else if Assigned(LibNotLoadedHandler) then
  724. LibNotLoadedHandler;
  725. {$ENDIF ~PCRE_STATICLINK}
  726. end;
  727. function GetPCREMallocCallback: pcre_malloc_callback;
  728. begin
  729. {$IFDEF PCRE_STATICLINK}
  730. Result := pcre_malloc_user;
  731. {$ELSE ~PCRE_STATICLINK}
  732. if not Assigned(pcre_malloc_func) then
  733. LoadPCRE;
  734. if not Assigned(pcre_malloc_func) then
  735. begin
  736. Result := nil;
  737. if Assigned(LibNotLoadedHandler) then
  738. LibNotLoadedHandler;
  739. end
  740. else
  741. Result := pcre_malloc_func^;
  742. {$ENDIF ~PCRE_STATICLINK}
  743. end;
  744. function CallPCREMalloc(Size: Integer): Pointer;
  745. begin
  746. {$IFDEF PCRE_STATICLINK}
  747. Result := pcre_malloc(Size);
  748. {$ELSE ~PCRE_STATICLINK}
  749. Result := pcre_malloc_func^(Size);
  750. {$ENDIF ~PCRE_STATICLINK}
  751. end;
  752. procedure SetPCREFreeCallback(const Value: pcre_free_callback);
  753. begin
  754. {$IFDEF PCRE_STATICLINK}
  755. pcre_free_user := Value;
  756. {$ELSE ~PCRE_STATICLINK}
  757. if not Assigned(pcre_free_func) then
  758. LoadPCRE;
  759. if Assigned(pcre_free_func) then
  760. pcre_free_func^ := Value
  761. else if Assigned(LibNotLoadedHandler) then
  762. LibNotLoadedHandler;
  763. {$ENDIF ~PCRE_STATICLINK}
  764. end;
  765. function GetPCREFreeCallback: pcre_free_callback;
  766. begin
  767. {$IFDEF PCRE_STATICLINK}
  768. Result := pcre_free_user;
  769. {$ELSE ~PCRE_STATICLINK}
  770. if not Assigned(pcre_free_func) then
  771. LoadPCRE;
  772. if not Assigned(pcre_free_func) then
  773. begin
  774. Result := nil;
  775. if Assigned(LibNotLoadedHandler) then
  776. LibNotLoadedHandler;
  777. end
  778. else
  779. Result := pcre_free_func^
  780. {$ENDIF ~PCRE_STATICLINK}
  781. end;
  782. procedure CallPCREFree(P: Pointer);
  783. begin
  784. {$IFDEF PCRE_STATICLINK}
  785. pcre_free(P);
  786. {$ELSE ~PCRE_STATICLINK}
  787. if not Assigned(pcre_free_func) then
  788. LoadPCRE;
  789. pcre_free_func^(P);
  790. {$ENDIF ~PCRE_STATICLINK}
  791. end;
  792. procedure SetPCREStackMallocCallback(const Value: pcre_stack_malloc_callback);
  793. begin
  794. {$IFDEF PCRE_STATICLINK}
  795. pcre_stack_malloc_user := Value;
  796. {$ELSE ~PCRE_STATICLINK}
  797. if not Assigned(pcre_stack_malloc_func) then
  798. LoadPCRE;
  799. if Assigned(pcre_stack_malloc_func) then
  800. pcre_stack_malloc_func^ := Value
  801. else if Assigned(LibNotLoadedHandler) then
  802. LibNotLoadedHandler;
  803. {$ENDIF ~PCRE_STATICLINK}
  804. end;
  805. function GetPCREStackMallocCallback: pcre_stack_malloc_callback;
  806. begin
  807. {$IFDEF PCRE_STATICLINK}
  808. Result := pcre_stack_malloc_user;
  809. {$ELSE ~PCRE_STATICLINK}
  810. if not Assigned(pcre_stack_malloc_func) then
  811. LoadPCRE;
  812. if not Assigned(pcre_stack_malloc_func) then
  813. begin
  814. Result := nil;
  815. if Assigned(LibNotLoadedHandler) then
  816. LibNotLoadedHandler;
  817. end
  818. else
  819. Result := pcre_stack_malloc_func^;
  820. {$ENDIF ~PCRE_STATICLINK}
  821. end;
  822. function CallPCREStackMalloc(Size: Integer): Pointer;
  823. begin
  824. {$IFDEF PCRE_STATICLINK}
  825. Result := pcre_stack_malloc(Size);
  826. {$ELSE ~PCRE_STATICLINK}
  827. Result := pcre_stack_malloc_func^(Size);
  828. {$ENDIF ~PCRE_STATICLINK}
  829. end;
  830. procedure SetPCREStackFreeCallback(const Value: pcre_stack_free_callback);
  831. begin
  832. {$IFDEF PCRE_STATICLINK}
  833. pcre_stack_free_user := Value;
  834. {$ELSE ~PCRE_STATICLINK}
  835. if not Assigned(pcre_stack_free_func) then
  836. LoadPCRE;
  837. if Assigned(pcre_stack_free_func) then
  838. pcre_stack_free_func^ := Value
  839. else if Assigned(LibNotLoadedHandler) then
  840. LibNotLoadedHandler;
  841. {$ENDIF ~PCRE_STATICLINK}
  842. end;
  843. function GetPCREStackFreeCallback: pcre_stack_free_callback;
  844. begin
  845. {$IFDEF PCRE_STATICLINK}
  846. Result := pcre_stack_free_user;
  847. {$ELSE ~PCRE_STATICLINK}
  848. if not Assigned(pcre_stack_free_func) then
  849. LoadPCRE;
  850. if not Assigned(pcre_stack_free_func) then
  851. begin
  852. Result := nil;
  853. if Assigned(LibNotLoadedHandler) then
  854. LibNotLoadedHandler;
  855. end
  856. else
  857. Result := pcre_stack_free_func^;
  858. {$ENDIF ~PCRE_STATICLINK}
  859. end;
  860. procedure CallPCREStackFree(P: Pointer);
  861. begin
  862. {$IFDEF PCRE_STATICLINK}
  863. pcre_stack_free(P);
  864. {$ELSE ~PCRE_STATICLINK}
  865. pcre_stack_free_func^(P);
  866. {$ENDIF ~PCRE_STATICLINK}
  867. end;
  868. procedure SetPCRECalloutCallback(const Value: pcre_callout_callback);
  869. begin
  870. {$IFDEF PCRE_STATICLINK}
  871. pcre_callout_user := Value;
  872. {$ELSE ~PCRE_STATICLINK}
  873. if not Assigned(pcre_callout_func) then
  874. LoadPCRE;
  875. if Assigned(pcre_callout_func) then
  876. pcre_callout_func^ := Value
  877. else if Assigned(LibNotLoadedHandler) then
  878. LibNotLoadedHandler;
  879. {$ENDIF ~PCRE_STATICLINK}
  880. end;
  881. function GetPCRECalloutCallback: pcre_callout_callback;
  882. begin
  883. {$IFDEF PCRE_STATICLINK}
  884. Result := pcre_callout_user;
  885. {$ELSE ~PCRE_STATICLINK}
  886. if not Assigned(pcre_callout_func) then
  887. LoadPCRE;
  888. if not Assigned(pcre_callout_func) then
  889. begin
  890. Result := nil;
  891. if Assigned(LibNotLoadedHandler) then
  892. LibNotLoadedHandler;
  893. end
  894. else
  895. Result := pcre_callout_func^;
  896. {$ENDIF ~PCRE_STATICLINK}
  897. end;
  898. function CallPCRECallout(var callout_block: pcre_callout_block): Integer;
  899. begin
  900. {$IFDEF PCRE_STATICLINK}
  901. Result := pcre_callout(callout_block);
  902. {$ELSE ~PCRE_STATICLINK}
  903. Result := pcre_callout_func^(callout_block);
  904. {$ENDIF ~PCRE_STATICLINK}
  905. end;
  906. {$IFNDEF PCRE_STATICLINK}
  907. procedure InitPCREFuncPtrs(const Value: Pointer);
  908. begin
  909. {$IFDEF PCRE_LINKONREQUEST}
  910. @pcre_compile := Value;
  911. @pcre_compile2 := Value;
  912. @pcre_config := Value;
  913. @pcre_copy_named_substring := Value;
  914. @pcre_copy_substring := Value;
  915. @pcre_dfa_exec := Value;
  916. @pcre_exec := Value;
  917. @pcre_free_substring := Value;
  918. @pcre_free_substring_list := Value;
  919. @pcre_fullinfo := Value;
  920. @pcre_get_named_substring := Value;
  921. @pcre_get_stringnumber := Value;
  922. @pcre_get_stringtable_entries := Value;
  923. @pcre_get_substring := Value;
  924. @pcre_get_substring_list := Value;
  925. @pcre_info := Value;
  926. @pcre_maketables := Value;
  927. @pcre_refcount := Value;
  928. @pcre_study := Value;
  929. @pcre_version := Value;
  930. {$ENDIF PCRE_LINKONREQUEST}
  931. pcre_malloc_func := nil;
  932. pcre_free_func := nil;
  933. pcre_stack_malloc_func := nil;
  934. pcre_stack_free_func := nil;
  935. pcre_callout_func := nil;
  936. end;
  937. {$ENDIF ~PCRE_STATICLINK}
  938. function IsPCRELoaded: Boolean;
  939. begin
  940. {$IFDEF PCRE_STATICLINK}
  941. Result := True;
  942. {$ELSE ~PCRE_STATICLINK}
  943. Result := PCRELib <> INVALID_MODULEHANDLE_VALUE;
  944. {$ENDIF ~PCRE_STATICLINK}
  945. end;
  946. function LoadPCRE: Boolean;
  947. {$IFDEF PCRE_STATICLINK}
  948. begin
  949. Result := True;
  950. end;
  951. {$ELSE ~PCRE_STATICLINK}
  952. function GetSymbol(SymbolName: PAnsiChar): Pointer;
  953. begin
  954. {$IFDEF MSWINDOWS}
  955. Result := GetProcAddress(PCRELib, PChar(SymbolName));
  956. {$ENDIF MSWINDOWS}
  957. {$IFDEF UNIX}
  958. Result := dlsym(PCRELib, PChar(SymbolName));
  959. {$ENDIF UNIX}
  960. end;
  961. begin
  962. Result := PCRELib <> INVALID_MODULEHANDLE_VALUE;
  963. if Result then
  964. Exit;
  965. if PCRELib = INVALID_MODULEHANDLE_VALUE then
  966. {$IFDEF MSWINDOWS}
  967. PCRELib := SafeLoadLibrary(libpcremodulename);
  968. {$ENDIF MSWINDOWS}
  969. {$IFDEF UNIX}
  970. PCRELib := dlopen(PAnsiChar(libpcremodulename), RTLD_NOW);
  971. {$ENDIF UNIX}
  972. Result := PCRELib <> INVALID_MODULEHANDLE_VALUE;
  973. if Result then
  974. begin
  975. {$IFDEF PCRE_LINKONREQUEST}
  976. @pcre_compile := GetSymbol(PCRECompileExportName);
  977. @pcre_compile2 := GetSymbol(PCRECompile2ExportName);
  978. @pcre_config := GetSymbol(PCREConfigExportName);
  979. @pcre_copy_named_substring := GetSymbol(PCRECopyNamedSubstringExportName);
  980. @pcre_copy_substring := GetSymbol(PCRECopySubStringExportName);
  981. @pcre_dfa_exec := GetSymbol(PCREDfaExecExportName);
  982. @pcre_exec := GetSymbol(PCREExecExportName);
  983. @pcre_free_substring := GetSymbol(PCREFreeSubStringExportName);
  984. @pcre_free_substring_list := GetSymbol(PCREFreeSubStringListExportName);
  985. @pcre_fullinfo := GetSymbol(PCREFullInfoExportName);
  986. @pcre_get_named_substring := GetSymbol(PCREGetNamedSubstringExportName);
  987. @pcre_get_stringnumber := GetSymbol(PCREGetStringNumberExportName);
  988. @pcre_get_stringtable_entries := GetSymbol(PCREGetStringTableEntriesExportName);
  989. @pcre_get_substring := GetSymbol(PCREGetSubStringExportName);
  990. @pcre_get_substring_list := GetSymbol(PCREGetSubStringListExportName);
  991. @pcre_info := GetSymbol(PCREInfoExportName);
  992. @pcre_maketables := GetSymbol(PCREMakeTablesExportName);
  993. @pcre_refcount := GetSymbol(PCRERefCountExportName);
  994. @pcre_study := GetSymbol(PCREStudyExportName);
  995. @pcre_version := GetSymbol(PCREVersionExportName);
  996. {$ENDIF PCRE_LINKONREQUEST}
  997. pcre_malloc_func := GetSymbol(PCREMallocExportName);
  998. pcre_free_func := GetSymbol(PCREFreeExportName);
  999. pcre_stack_malloc_func := GetSymbol(PCREStackMallocExportName);
  1000. pcre_stack_free_func := GetSymbol(PCREStackFreeExportName);
  1001. pcre_callout_func := GetSymbol(PCRECalloutExportName);
  1002. end
  1003. else
  1004. InitPCREFuncPtrs(@LibNotLoadedHandler);
  1005. end;
  1006. {$ENDIF ~PCRE_STATICLINK}
  1007. procedure UnloadPCRE;
  1008. begin
  1009. {$IFNDEF PCRE_STATICLINK}
  1010. if PCRELib <> INVALID_MODULEHANDLE_VALUE then
  1011. {$IFDEF MSWINDOWS}
  1012. FreeLibrary(PCRELib);
  1013. {$ENDIF MSWINDOWS}
  1014. {$IFDEF UNIX}
  1015. dlclose(Pointer(PCRELib));
  1016. {$ENDIF UNIX}
  1017. PCRELib := INVALID_MODULEHANDLE_VALUE;
  1018. InitPCREFuncPtrs(@LibNotLoadedHandler);
  1019. {$ENDIF ~PCRE_STATICLINK}
  1020. end;
  1021. {$IFDEF PCRE_STATICLINK}
  1022. procedure pcre_dispose(pattern, hints, chartable: Pointer);
  1023. begin
  1024. if pattern <> nil then pcre_free(pattern);
  1025. if hints <> nil then pcre_free(hints);
  1026. if chartable <> nil then pcre_free(chartable);
  1027. end;
  1028. {$ENDIF PCRE_STATICLINK}
  1029. {$IFDEF PCRE_LINKDLL}
  1030. function pcre_compile; external libpcremodulename name PCRECompileExportName;
  1031. function pcre_compile2; external libpcremodulename name PCRECompile2ExportName;
  1032. function pcre_config; external libpcremodulename name PCREConfigExportName;
  1033. function pcre_copy_named_substring; external libpcremodulename name PCRECopyNamedSubStringExportName;
  1034. function pcre_copy_substring; external libpcremodulename name PCRECopySubStringExportName;
  1035. function pcre_dfa_exec; external libpcremodulename name PCREDfaExecExportName;
  1036. function pcre_exec; external libpcremodulename name PCREExecExportName;
  1037. procedure pcre_free_substring; external libpcremodulename name PCREFreeSubStringExportName;
  1038. procedure pcre_free_substring_list; external libpcremodulename name PCREFreeSubStringListExportName;
  1039. function pcre_fullinfo; external libpcremodulename name PCREFullInfoExportName;
  1040. function pcre_get_named_substring; external libpcremodulename name PCREGetNamedSubStringExportName;
  1041. function pcre_get_stringnumber; external libpcremodulename name PCREGetStringNumberExportName;
  1042. function pcre_get_stringtable_entries; external libpcremodulename name PCREGetStringTableEntriesExportName;
  1043. function pcre_get_substring; external libpcremodulename name PCREGetSubStringExportName;
  1044. function pcre_get_substring_list; external libpcremodulename name PCREGetSubStringListExportName;
  1045. function pcre_info; external libpcremodulename name PCREInfoExportName;
  1046. function pcre_maketables; external libpcremodulename name PCREMakeTablesExportName;
  1047. function pcre_refcount; external libpcremodulename name PCRERefCountExportName;
  1048. function pcre_study; external libpcremodulename name PCREStudyExportName;
  1049. function pcre_version; external libpcremodulename name PCREVersionExportName;
  1050. procedure pcre_dispose; external libpcremodulename name 'pcre_dispose';
  1051. {$ENDIF PCRE_LINKDLL}
  1052. end.