1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
|
#************************************************
# Perl-Compatible Regular Expressions *
#***********************************************
# This is the public header file for the PCRE library, to be #included by
#applications that call the PCRE functions.
#
# Copyright (c) 1997-2010 University of Cambridge
#
#-----------------------------------------------------------------------------
#Redistribution and use in source and binary forms, with or without
#modification, are permitted provided that the following conditions are met:
#
# Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# Neither the name of the University of Cambridge nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
#AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
#IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
#ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
#LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
#CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
#SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
#INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
#CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
#ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
#POSSIBILITY OF SUCH DAMAGE.
#-----------------------------------------------------------------------------
#
when not defined(pcreDll):
when hostOS == "windows":
const pcreDll = "pcre3.dll"
elif hostOS == "macosx":
const pcreDll = "libpcre(.3|).dylib"
else:
const pcreDll = "libpcre.so(.3|)"
# The current PCRE version information.
const
MAJOR* = 8
MINOR* = 10
PRERELEASE* = true
DATE* = "2010-06-25"
# When an application links to a PCRE DLL in Windows, the symbols that are
#imported have to be identified as such. When building PCRE, the appropriate
#export setting is defined in pcre_internal.h, which includes this file. So we
#don't change existing definitions of PCRE_EXP_DECL and PCRECPP_EXP_DECL.
# Have to include stdlib.h in order to ensure that size_t is defined;
#it is needed here for malloc.
# Allow for C++ users
# Options. Some are compile-time only, some are run-time only, and some are
#both, so we keep them all distinct.
const
CASELESS* = 0x00000001
MULTILINE* = 0x00000002
DOTALL* = 0x00000004
EXTENDED* = 0x00000008
ANCHORED* = 0x00000010
DOLLAR_ENDONLY* = 0x00000020
EXTRA* = 0x00000040
NOTBOL* = 0x00000080
NOTEOL* = 0x00000100
UNGREEDY* = 0x00000200
NOTEMPTY* = 0x00000400
UTF8* = 0x00000800
NO_AUTO_CAPTURE* = 0x00001000
NO_UTF8_CHECK* = 0x00002000
AUTO_CALLOUT* = 0x00004000
PARTIAL_SOFT* = 0x00008000
PARTIAL* = 0x00008000 # Backwards compatible synonym
DFA_SHORTEST* = 0x00010000
DFA_RESTART* = 0x00020000
FIRSTLINE* = 0x00040000
DUPNAMES* = 0x00080000
NEWLINE_CR* = 0x00100000
NEWLINE_LF* = 0x00200000
NEWLINE_CRLF* = 0x00300000
NEWLINE_ANY* = 0x00400000
NEWLINE_ANYCRLF* = 0x00500000
BSR_ANYCRLF* = 0x00800000
BSR_UNICODE* = 0x01000000
JAVASCRIPT_COMPAT* = 0x02000000
NO_START_OPTIMIZE* = 0x04000000
NO_START_OPTIMISE* = 0x04000000
PARTIAL_HARD* = 0x08000000
NOTEMPTY_ATSTART* = 0x10000000
UCP* = 0x20000000
# Exec-time and get/set-time error codes
const
ERROR_NOMATCH* = (- 1)
ERROR_NULL* = (- 2)
ERROR_BADOPTION* = (- 3)
ERROR_BADMAGIC* = (- 4)
ERROR_UNKNOWN_OPCODE* = (- 5)
ERROR_UNKNOWN_NODE* = (- 5) # For backward compatibility
ERROR_NOMEMORY* = (- 6)
ERROR_NOSUBSTRING* = (- 7)
ERROR_MATCHLIMIT* = (- 8)
ERROR_CALLOUT* = (- 9) # Never used by PCRE itself
ERROR_BADUTF8* = (- 10)
ERROR_BADUTF8_OFFSET* = (- 11)
ERROR_PARTIAL* = (- 12)
ERROR_BADPARTIAL* = (- 13)
ERROR_INTERNAL* = (- 14)
ERROR_BADCOUNT* = (- 15)
ERROR_DFA_UITEM* = (- 16)
ERROR_DFA_UCOND* = (- 17)
ERROR_DFA_UMLIMIT* = (- 18)
ERROR_DFA_WSSIZE* = (- 19)
ERROR_DFA_RECURSE* = (- 20)
ERROR_RECURSIONLIMIT* = (- 21)
ERROR_NULLWSLIMIT* = (- 22) # No longer actually used
ERROR_BADNEWLINE* = (- 23)
# Request types for pcre_fullinfo()
const
INFO_OPTIONS* = 0
INFO_SIZE* = 1
INFO_CAPTURECOUNT* = 2
INFO_BACKREFMAX* = 3
INFO_FIRSTBYTE* = 4
INFO_FIRSTCHAR* = 4 # For backwards compatibility
INFO_FIRSTTABLE* = 5
INFO_LASTLITERAL* = 6
INFO_NAMEENTRYSIZE* = 7
INFO_NAMECOUNT* = 8
INFO_NAMETABLE* = 9
INFO_STUDYSIZE* = 10
INFO_DEFAULT_TABLES* = 11
INFO_OKPARTIAL* = 12
INFO_JCHANGED* = 13
INFO_HASCRORLF* = 14
INFO_MINLENGTH* = 15
# Request types for pcre_config(). Do not re-arrange, in order to remain
#compatible.
const
CONFIG_UTF8* = 0
CONFIG_NEWLINE* = 1
CONFIG_LINK_SIZE* = 2
CONFIG_POSIX_MALLOC_THRESHOLD* = 3
CONFIG_MATCH_LIMIT* = 4
CONFIG_STACKRECURSE* = 5
CONFIG_UNICODE_PROPERTIES* = 6
CONFIG_MATCH_LIMIT_RECURSION* = 7
CONFIG_BSR* = 8
# Bit flags for the pcre_extra structure. Do not re-arrange or redefine
#these bits, just add new ones on the end, in order to remain compatible.
const
EXTRA_STUDY_DATA* = 0x00000001
EXTRA_MATCH_LIMIT* = 0x00000002
EXTRA_CALLOUT_DATA* = 0x00000004
EXTRA_TABLES* = 0x00000008
EXTRA_MATCH_LIMIT_RECURSION* = 0x00000010
EXTRA_MARK* = 0x00000020
# Types
type
TPcre*{.pure, final.} = object
PPcre* = ptr TPcre
# When PCRE is compiled as a C++ library, the subject pointer type can be
#replaced with a custom type. For conventional use, the public interface is a
#const char *.
# The structure for passing additional data to pcre_exec(). This is defined in
#such as way as to be extensible. Always add new fields at the end, in order to
#remain compatible.
type
Textra*{.pure, final.} = object
flags*: int ## Bits for which fields are set
study_data*: pointer ## Opaque data from pcre_study()
match_limit*: int ## Maximum number of calls to match()
callout_data*: pointer ## Data passed back in callouts
tables*: ptr char ## Pointer to character tables
match_limit_recursion*: int ## Max recursive calls to match()
mark*: ptr ptr char ## For passing back a mark pointer
# The structure for passing out data via the pcre_callout_function. We use a
#structure so that new fields can be added on the end in future versions,
#without changing the API of the function, thereby allowing old clients to work
#without modification.
type
Tcallout_block*{.pure, final.} = object
version*: cint ## Identifies version of block
callout_number*: cint ## Number compiled into pattern
offset_vector*: ptr cint ## The offset vector
subject*: cstring ## The subject being matched
subject_length*: cint ## The length of the subject
start_match*: cint ## Offset to start of this match attempt
current_position*: cint ## Where we currently are in the subject
capture_top*: cint ## Max current capture
capture_last*: cint ## Most recently closed capture
callout_data*: pointer ## Data passed in with the call
pattern_position*: cint ## Offset to next item in the pattern
next_item_length*: cint ## Length of next item in the pattern
# Indirection for store get and free functions. These can be set to
#alternative malloc/free functions if required. Special ones are used in the
#non-recursive case for "frames". There is also an optional callout function
#that is triggered by the (?) regex item. For Virtual Pascal, these definitions
#have to take another form.
# Exported PCRE functions
proc compile*(a2: cstring, a3: cint, a4: ptr cstring, a5: ptr cint,
a6: ptr char): ptr TPcre{.cdecl, importc: "pcre_compile",
dynlib: pcredll.}
proc compile2*(a2: cstring, a3: cint, a4: ptr cint, a5: ptr cstring,
a6: ptr cint, a7: ptr char): ptr TPcre{.cdecl,
importc: "pcre_compile2", dynlib: pcredll.}
proc config*(a2: cint, a3: pointer): cint{.cdecl, importc: "pcre_config",
dynlib: pcredll.}
proc copy_named_substring*(a2: ptr TPcre, a3: cstring, a4: ptr cint, a5: cint,
a6: cstring, a7: cstring, a8: cint): cint{.cdecl,
importc: "pcre_copy_named_substring", dynlib: pcredll.}
proc copy_substring*(a2: cstring, a3: ptr cint, a4: cint, a5: cint,
a6: cstring,
a7: cint): cint{.cdecl, importc: "pcre_copy_substring",
dynlib: pcredll.}
proc dfa_exec*(a2: ptr TPcre, a3: ptr Textra, a4: cstring, a5: cint,
a6: cint, a7: cint, a8: ptr cint, a9: cint, a10: ptr cint,
a11: cint): cint{.cdecl, importc: "pcre_dfa_exec",
dynlib: pcredll.}
proc exec*(a2: ptr TPcre, a3: ptr Textra, a4: cstring, a5: cint, a6: cint,
a7: cint, a8: ptr cint, a9: cint): cint {.
cdecl, importc: "pcre_exec", dynlib: pcredll.}
proc free_substring*(a2: cstring){.cdecl, importc: "pcre_free_substring",
dynlib: pcredll.}
proc free_substring_list*(a2: cstringArray){.cdecl,
importc: "pcre_free_substring_list", dynlib: pcredll.}
proc fullinfo*(a2: ptr TPcre, a3: ptr Textra, a4: cint, a5: pointer): cint{.
cdecl, importc: "pcre_fullinfo", dynlib: pcredll.}
proc get_named_substring*(a2: ptr TPcre, a3: cstring, a4: ptr cint, a5: cint,
a6: cstring, a7: cstringArray): cint{.cdecl,
importc: "pcre_get_named_substring", dynlib: pcredll.}
proc get_stringnumber*(a2: ptr TPcre, a3: cstring): cint{.cdecl,
importc: "pcre_get_stringnumber", dynlib: pcredll.}
proc get_stringtable_entries*(a2: ptr TPcre, a3: cstring, a4: cstringArray,
a5: cstringArray): cint{.cdecl,
importc: "pcre_get_stringtable_entries", dynlib: pcredll.}
proc get_substring*(a2: cstring, a3: ptr cint, a4: cint, a5: cint,
a6: cstringArray): cint{.cdecl,
importc: "pcre_get_substring", dynlib: pcredll.}
proc get_substring_list*(a2: cstring, a3: ptr cint, a4: cint,
a5: ptr cstringArray): cint{.cdecl,
importc: "pcre_get_substring_list", dynlib: pcredll.}
proc info*(a2: ptr TPcre, a3: ptr cint, a4: ptr cint): cint{.cdecl,
importc: "pcre_info", dynlib: pcredll.}
proc maketables*(): ptr char{.cdecl, importc: "pcre_maketables",
dynlib: pcredll.}
proc refcount*(a2: ptr TPcre, a3: cint): cint{.cdecl, importc: "pcre_refcount",
dynlib: pcredll.}
proc study*(a2: ptr TPcre, a3: cint, a4: var cstring): ptr Textra{.cdecl,
importc: "pcre_study", dynlib: pcredll.}
proc version*(): cstring{.cdecl, importc: "pcre_version", dynlib: pcredll.}
var
pcre_free*: proc (p: ptr TPcre) {.cdecl.}
|