/donations/source/common/pcre.pas

https://github.com/the-Arioch/jcl · Pascal · 345 lines · 190 code · 31 blank · 124 comment · 3 complexity · 05a189ff77f67f0d1c49930b144ed7d5 MD5 · raw file

  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 JclPRCE.pas. }
  14. { }
  15. { The Initial Developer of the Original Code is documented in the accompanying }
  16. { help file JCL.chm. Portions created by these individuals are Copyright (C) of these individuals. }
  17. { Portions created by University of Cambridge are }
  18. { Copyright (C) 1997-2001 by University of Cambridge. }
  19. { }
  20. {The latest release of PCRE is always available from }
  21. {ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz }
  22. {**************************************************************************************************}
  23. { }
  24. { Header conversion of pcre.h }
  25. { }
  26. { Unit owner: Peter Thornqvist }
  27. { Last modified: April 30, 2004 }
  28. { }
  29. {**************************************************************************************************}
  30. //$Id$
  31. unit pcre;
  32. interface
  33. (*************************************************
  34. * Perl-Compatible Regular Expressions *
  35. *************************************************)
  36. {$WEAKPACKAGEUNIT ON}
  37. // (p3) this is the switch to change between static and dynamic linking.
  38. // It is set to dynamic by default. To disable simply insert a '.' before the '$'
  39. //
  40. // NOTE: if you enable static linking of DLL, this means that the pcre.dll *must*
  41. // be in the users path or an AV will occur at startup
  42. {$DEFINE PCRE_LINKONREQUEST}
  43. (*$HPPEMIT '#include "pcre.h"'*)
  44. const
  45. MAX_PATTERN_LENGTH = $10003;
  46. {$EXTERNALSYM MAX_PATTERN_LENGTH}
  47. MAX_QUANTIFY_REPEAT = $10000;
  48. {$EXTERNALSYM MAX_QUANTIFY_REPEAT}
  49. MAX_CAPTURE_COUNT = $FFFF;
  50. {$EXTERNALSYM MAX_CAPTURE_COUNT}
  51. MAX_NESTING_DEPTH = 200;
  52. {$EXTERNALSYM MAX_NESTING_DEPTH}
  53. (* Options *)
  54. const
  55. PCRE_CASELESS = $0001;
  56. {$EXTERNALSYM PCRE_CASELESS}
  57. PCRE_MULTILINE = $0002;
  58. {$EXTERNALSYM PCRE_MULTILINE}
  59. PCRE_DOTALL = $0004;
  60. {$EXTERNALSYM PCRE_DOTALL}
  61. PCRE_EXTENDED = $0008;
  62. {$EXTERNALSYM PCRE_EXTENDED}
  63. PCRE_ANCHORED = $0010;
  64. {$EXTERNALSYM PCRE_ANCHORED}
  65. PCRE_DOLLAR_ENDONLY = $0020;
  66. {$EXTERNALSYM PCRE_DOLLAR_ENDONLY}
  67. PCRE_EXTRA = $0040;
  68. {$EXTERNALSYM PCRE_EXTRA}
  69. PCRE_NOTBOL = $0080;
  70. {$EXTERNALSYM PCRE_NOTBOL}
  71. PCRE_NOTEOL = $0100;
  72. {$EXTERNALSYM PCRE_NOTEOL}
  73. PCRE_UNGREEDY = $0200;
  74. {$EXTERNALSYM PCRE_UNGREEDY}
  75. PCRE_NOTEMPTY = $0400;
  76. {$EXTERNALSYM PCRE_NOTEMPTY}
  77. PCRE_UTF8 = $0800;
  78. {$EXTERNALSYM PCRE_UTF8}
  79. (* Exec-time and get-time error codes *)
  80. PCRE_ERROR_NOMATCH = -1;
  81. {$EXTERNALSYM PCRE_ERROR_NOMATCH}
  82. PCRE_ERROR_NULL = -2;
  83. {$EXTERNALSYM PCRE_ERROR_NULL}
  84. PCRE_ERROR_BADOPTION = -3;
  85. {$EXTERNALSYM PCRE_ERROR_BADOPTION}
  86. PCRE_ERROR_BADMAGIC = -4;
  87. {$EXTERNALSYM PCRE_ERROR_BADMAGIC}
  88. PCRE_ERROR_UNKNOWN_NODE = -5;
  89. {$EXTERNALSYM PCRE_ERROR_UNKNOWN_NODE}
  90. PCRE_ERROR_NOMEMORY = -6;
  91. {$EXTERNALSYM PCRE_ERROR_NOMEMORY}
  92. PCRE_ERROR_NOSUBSTRING = -7;
  93. {$EXTERNALSYM PCRE_ERROR_NOSUBSTRING}
  94. (* Request types for pcre_fullinfo() *)
  95. PCRE_INFO_OPTIONS = 0;
  96. {$EXTERNALSYM PCRE_INFO_OPTIONS}
  97. PCRE_INFO_SIZE = 1;
  98. {$EXTERNALSYM PCRE_INFO_SIZE}
  99. PCRE_INFO_CAPTURECOUNT = 2;
  100. {$EXTERNALSYM PCRE_INFO_CAPTURECOUNT}
  101. PCRE_INFO_BACKREFMAX = 3;
  102. {$EXTERNALSYM PCRE_INFO_BACKREFMAX}
  103. PCRE_INFO_FIRSTCHAR = 4;
  104. {$EXTERNALSYM PCRE_INFO_FIRSTCHAR}
  105. PCRE_INFO_FIRSTTABLE = 5;
  106. {$EXTERNALSYM PCRE_INFO_FIRSTTABLE}
  107. PCRE_INFO_LASTLITERAL = 6;
  108. {$EXTERNALSYM PCRE_INFO_LASTLITERAL}
  109. (* Types *)
  110. type
  111. PPChar = ^PChar;
  112. PPPChar = ^PPChar;
  113. PInteger = ^integer;
  114. PPointer = ^Pointer;
  115. real_pcre = record
  116. magic_number: longword;
  117. size: integer;
  118. tables: PChar;
  119. options: longword;
  120. top_bracket: word;
  121. top_backref: word;
  122. first_char: PChar;
  123. req_char: PChar;
  124. code: array[0..0] of char;
  125. end;
  126. {$EXTERNALSYM real_pcre}
  127. TPCRE = real_pcre;
  128. PPCRE = ^TPCRE;
  129. real_pcre_extra = record
  130. options: PChar;
  131. start_bits: array[0..31] of char;
  132. end;
  133. {$EXTERNALSYM real_pcre_extra}
  134. TPCREExtra = real_pcre_extra;
  135. PPCREExtra = ^TPCREExtra;
  136. (* Functions *)
  137. {$IFNDEF PCRE_LINKONREQUEST}
  138. function pcre_compile(const pattern: PChar; options: integer;
  139. const errptr: PPChar; erroffset: PInteger; const tableptr: PChar): PPCRE; cdecl;
  140. {$EXTERNALSYM pcre_compile}
  141. function pcre_copy_substring(const subject: PChar; ovector: PInteger; stringcount, stringnumber: integer;
  142. buffer: PChar; buffersize: integer): integer; cdecl;
  143. {$EXTERNALSYM pcre_copy_substring}
  144. function pcre_exec(const code: PPCRE; const extra: PPCREExtra; const subject: PChar;
  145. {$EXTERNALSYM pcre_exec}
  146. length, startoffset, options: integer; ovector: PInteger; ovecsize: integer): integer; cdecl;
  147. function pcre_study(const code: PPCRE; options: integer; const errptr: PPChar): PPCREExtra; cdecl;
  148. {$EXTERNALSYM pcre_study}
  149. function pcre_get_substring(const subject: PChar; ovector: PInteger;
  150. {$EXTERNALSYM pcre_get_substring}
  151. stringcount, stringnumber: integer; const stringptr: PPChar): integer; cdecl;
  152. function pcre_get_substring_list(const subject: PChar; ovector: PInteger;
  153. stringcount: integer; listptr: PPPChar): integer; cdecl;
  154. {$EXTERNALSYM pcre_get_substring_list}
  155. procedure pcre_free_substring(var stringptr: PChar); cdecl;
  156. {$EXTERNALSYM pcre_free_substring}
  157. procedure pcre_free_substring_list(var stringptr: PChar); cdecl;
  158. {$EXTERNALSYM pcre_free_substring_list}
  159. function pcre_maketables: PChar; cdecl;
  160. {$EXTERNALSYM pcre_maketables}
  161. function pcre_fullinfo(const code: PPCRE; const extra: PPCREExtra;
  162. what: integer; where: Pointer): integer; cdecl;
  163. {$EXTERNALSYM pcre_fullinfo}
  164. function pcre_info(const code: PPCRE; optptr, firstcharptr: PInteger): integer; cdecl;
  165. {$EXTERNALSYM pcre_info}
  166. function pcre_version: PChar; cdecl;
  167. {$EXTERNALSYM pcre_version}
  168. // Don't use! These does *not* work!!!
  169. function pcre_malloc(Size: integer): Pointer; cdecl;
  170. {$EXTERNALSYM pcre_malloc}
  171. procedure pcre_free(P: Pointer); cdecl;
  172. {$EXTERNALSYM pcre_free}
  173. {$ELSE}
  174. // dynamic linking
  175. type
  176. pcre_compile_func = function(const pattern: PChar; options: integer;
  177. const errptr: PPChar; erroffset: PInteger; const tableptr: PChar): PPCRE; cdecl;
  178. pcre_copy_substring_func = function(const subject: PChar; ovector: PInteger; stringcount, stringnumber: integer;
  179. buffer: PChar; buffersize: integer): integer; cdecl;
  180. pcre_exec_func = function(const code: PPCRE; const extra: PPCREExtra; const subject: PChar;
  181. length, startoffset, options: integer; ovector: PInteger; ovecsize: integer): integer; cdecl;
  182. pcre_study_func = function(const code: PPCRE; options: integer; const errptr: PPChar): PPCREExtra; cdecl;
  183. pcre_get_substring_func = function(const subject: PChar; ovector: PInteger;
  184. stringcount, stringnumber: integer; const stringptr: PPChar): integer; cdecl;
  185. pcre_get_substring_list_func = function(const subject: PChar; ovector: PInteger;
  186. stringcount: integer; listptr: PPPChar): integer; cdecl;
  187. pcre_free_substring_func = procedure(var stringptr: PChar); cdecl;
  188. pcre_free_substring_list_func = procedure(var stringptr: PChar); cdecl;
  189. pcre_maketables_func = function: PChar; cdecl;
  190. pcre_fullinfo_func = function(const code: PPCRE; const extra: PPCREExtra;
  191. what: integer; where: Pointer): integer; cdecl;
  192. pcre_info_func = function(const code: PPCRE; optptr, firstcharptr: PInteger): integer; cdecl;
  193. pcre_version_func = function: PChar; cdecl;
  194. pcre_malloc_func = function(Size: integer): Pointer; cdecl;
  195. pcre_free_func = procedure(P: Pointer); cdecl;
  196. var
  197. pcre_compile: pcre_compile_func = nil;
  198. {$EXTERNALSYM pcre_compile}
  199. pcre_copy_substring: pcre_copy_substring_func = nil;
  200. {$EXTERNALSYM pcre_copy_substring}
  201. pcre_exec: pcre_exec_func = nil;
  202. {$EXTERNALSYM pcre_exec}
  203. pcre_study: pcre_study_func = nil;
  204. {$EXTERNALSYM pcre_study}
  205. pcre_get_substring: pcre_get_substring_func = nil;
  206. {$EXTERNALSYM pcre_get_substring}
  207. pcre_get_substring_list: pcre_get_substring_list_func = nil;
  208. {$EXTERNALSYM pcre_get_substring_list}
  209. pcre_free_substring: pcre_free_substring_func = nil;
  210. {$EXTERNALSYM pcre_free_substring}
  211. pcre_free_substring_list: pcre_free_substring_list_func = nil;
  212. {$EXTERNALSYM pcre_free_substring_list}
  213. pcre_maketables: pcre_maketables_func = nil;
  214. {$EXTERNALSYM pcre_maketables}
  215. pcre_fullinfo: pcre_fullinfo_func = nil;
  216. {$EXTERNALSYM pcre_fullinfo}
  217. pcre_info: pcre_info_func = nil;
  218. {$EXTERNALSYM pcre_info}
  219. pcre_version: pcre_version_func = nil;
  220. {$EXTERNALSYM pcre_version}
  221. // Don't use! These doesn't work!!!
  222. pcre_malloc: pcre_malloc_func = nil;
  223. {$EXTERNALSYM pcre_malloc}
  224. pcre_free: pcre_free_func = nil;
  225. {$EXTERNALSYM pcre_free}
  226. {$ENDIF}
  227. function IsPCRELoaded: Boolean;
  228. function LoadPCRE: Boolean;
  229. procedure UnloadPCRE;
  230. implementation
  231. uses
  232. Windows;
  233. const
  234. pcreDLL = 'pcre.dll';
  235. {$IFDEF PCRE_LINKONREQUEST}
  236. var
  237. PCRELib: THandle = INVALID_HANDLE_VALUE;
  238. {$ENDIF}
  239. function IsPCRELoaded: Boolean;
  240. begin
  241. {$IFDEF PCRE_LINKONREQUEST}
  242. Result := PCRELib <> INVALID_HANDLE_VALUE;
  243. {$ELSE}
  244. Result := True;
  245. {$ENDIF}
  246. end;
  247. function LoadPCRE: Boolean;
  248. begin
  249. {$IFDEF PCRE_LINKONREQUEST}
  250. if PCRELib = INVALID_HANDLE_VALUE then
  251. PCRELib := LoadLibrary(pcreDLL);
  252. Result := PCRELib <> INVALID_HANDLE_VALUE;
  253. if Result then
  254. begin
  255. @pcre_compile := GetProcAddress(PCRELib, 'pcre_compile');
  256. @pcre_copy_substring := GetProcAddress(PCRELib, 'pcre_copy_substring');
  257. @pcre_exec := GetProcAddress(PCRELib, 'pcre_exec');
  258. @pcre_study := GetProcAddress(PCRELib, 'pcre_study');
  259. @pcre_get_substring := GetProcAddress(PCRELib, 'pcre_get_substring');
  260. @pcre_get_substring_list := GetProcAddress(PCRELib, 'pcre_get_substring_list');
  261. @pcre_free_substring := GetProcAddress(PCRELib, 'pcre_free_substring');
  262. @pcre_free_substring_list := GetProcAddress(PCRELib, 'pcre_free_substring_list');
  263. @pcre_maketables := GetProcAddress(PCRELib, 'pcre_maketables');
  264. @pcre_fullinfo := GetProcAddress(PCRELib, 'pcre_fullinfo');
  265. @pcre_info := GetProcAddress(PCRELib, 'pcre_info');
  266. @pcre_version := GetProcAddress(PCRELib, 'pcre_version');
  267. @pcre_malloc := GetProcAddress(PCRELib, 'pcre_malloc');
  268. @pcre_free := GetProcAddress(PCRELib, 'pcre_free');
  269. end
  270. else
  271. UnloadPCRE;
  272. {$ELSE}
  273. Result := True;
  274. {$ENDIF}
  275. end;
  276. procedure UnloadPCRE;
  277. begin
  278. {$IFDEF PCRE_LINKONREQUEST}
  279. if PCRELib <> INVALID_HANDLE_VALUE then
  280. FreeLibrary(PCRELib);
  281. PCRELib := INVALID_HANDLE_VALUE;
  282. @pcre_compile := nil;
  283. @pcre_copy_substring := nil;
  284. @pcre_exec := nil;
  285. @pcre_study := nil;
  286. @pcre_get_substring := nil;
  287. @pcre_get_substring_list := nil;
  288. @pcre_free_substring := nil;
  289. @pcre_free_substring_list := nil;
  290. @pcre_maketables := nil;
  291. @pcre_fullinfo := nil;
  292. @pcre_info := nil;
  293. @pcre_version := nil;
  294. @pcre_malloc := nil;
  295. @pcre_free := nil;
  296. {$ENDIF}
  297. end;
  298. {$IFNDEF PCRE_LINKONREQUEST}
  299. function pcre_compile; external pcreDLL name 'pcre_compile';
  300. function pcre_copy_substring; external pcreDLL name 'pcre_copy_substring';
  301. function pcre_exec; external pcreDLL name 'pcre_exec';
  302. function pcre_study; external pcreDLL name 'pcre_study';
  303. function pcre_get_substring; external pcreDLL name 'pcre_get_substring';
  304. function pcre_get_substring_list; external pcreDLL name 'pcre_get_substring_list';
  305. procedure pcre_free_substring; external pcreDLL name 'pcre_free_substring';
  306. procedure pcre_free_substring_list; external pcreDLL name 'pcre_free_substring_list';
  307. function pcre_maketables; external pcreDLL name 'pcre_maketables';
  308. function pcre_fullinfo; external pcreDLL name 'pcre_fullinfo';
  309. function pcre_info; external pcreDLL name 'pcre_info';
  310. function pcre_version; external pcreDLL name 'pcre_version';
  311. function pcre_malloc; external pcreDLL name 'pcre_malloc';
  312. procedure pcre_free; external pcreDLL name 'pcre_free';
  313. {$ENDIF}
  314. end.