This file is indexed.

/usr/share/doc/libghc-regex-posix-doc/html/src/Text-Regex-Posix-Wrap.html is in libghc-regex-posix-doc 0.95.2-7.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://code.haskell.org/~malcolm/hscolour/ -->
<title>dist-ghc/build/Text/Regex/Posix/Wrap.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# OPTIONS_GHC -optc-DHAVE_REGCOMP=1 #-}</span>
<a name="line-2"></a><span class='hs-comment'>{-# LINE 1 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-3"></a><span class='hs-comment'>{-# OPTIONS_GHC -fno-warn-unused-imports #-}</span>
<a name="line-4"></a><span class='hs-comment'>{-# LINE 2 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-5"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-6"></a><span class='hs-comment'>-- |</span>
<a name="line-7"></a><span class='hs-comment'>-- Module      :  Text.Regex.Posix.Wrap</span>
<a name="line-8"></a><span class='hs-comment'>-- Copyright   :  (c) Chris Kuklewicz 2006,2007,2008 derived from (c) The University of Glasgow 2002</span>
<a name="line-9"></a><span class='hs-comment'>-- License     :  BSD-style (see the file LICENSE)</span>
<a name="line-10"></a><span class='hs-comment'>--</span>
<a name="line-11"></a><span class='hs-comment'>-- Maintainer  :  libraries@haskell.org, textregexlazy@personal.mightyreason.com</span>
<a name="line-12"></a><span class='hs-comment'>-- Stability   :  experimental</span>
<a name="line-13"></a><span class='hs-comment'>-- Portability :  non-portable (regex-base needs MPTC+FD)</span>
<a name="line-14"></a><span class='hs-comment'>--</span>
<a name="line-15"></a><span class='hs-comment'>-- WrapPosix.hsc exports a wrapped version of the ffi imports.  To</span>
<a name="line-16"></a><span class='hs-comment'>-- increase type safety, the flags are newtype'd.  The other important</span>
<a name="line-17"></a><span class='hs-comment'>-- export is a 'Regex' type that is specific to the Posix library</span>
<a name="line-18"></a><span class='hs-comment'>-- backend.  The flags are documented in "Text.Regex.Posix".  The</span>
<a name="line-19"></a><span class='hs-comment'>-- 'defaultCompOpt' is @(compExtended .|. compNewline)@.</span>
<a name="line-20"></a><span class='hs-comment'>--</span>
<a name="line-21"></a><span class='hs-comment'>-- The 'Regex', 'CompOption', and 'ExecOption' types and their 'RegexOptions'</span>
<a name="line-22"></a><span class='hs-comment'>-- instance is declared.  The '=~' and '=~~' convenience functions are</span>
<a name="line-23"></a><span class='hs-comment'>-- defined.</span>
<a name="line-24"></a><span class='hs-comment'>--</span>
<a name="line-25"></a><span class='hs-comment'>-- The exported symbols are the same whether HAVE_REGEX_H is defined, but</span>
<a name="line-26"></a><span class='hs-comment'>-- when it is not defined then @getVersion == Nothing@ and all other</span>
<a name="line-27"></a><span class='hs-comment'>-- exported values will call error or fail.</span>
<a name="line-28"></a><span class='hs-comment'>--</span>
<a name="line-29"></a><span class='hs-comment'>-- This module will fail or error only if allocation fails or a nullPtr</span>
<a name="line-30"></a><span class='hs-comment'>-- is passed in.</span>
<a name="line-31"></a><span class='hs-comment'>--</span>
<a name="line-32"></a><span class='hs-comment'>-- 2009-January : wrapMatchAll and wrapCount now adjust the execution</span>
<a name="line-33"></a><span class='hs-comment'>-- option execNotBOL after the first result to take into account '\n'</span>
<a name="line-34"></a><span class='hs-comment'>-- in the text immediately before the next matches. (version 0.93.3)</span>
<a name="line-35"></a><span class='hs-comment'>--</span>
<a name="line-36"></a><span class='hs-comment'>-- 2009-January : wrapMatchAll and wrapCount have been changed to</span>
<a name="line-37"></a><span class='hs-comment'>-- return all non-overlapping matches, including empty matches even if</span>
<a name="line-38"></a><span class='hs-comment'>-- they coincide with the end of the previous non-empty match.  The</span>
<a name="line-39"></a><span class='hs-comment'>-- change is that the first non-empty match no longer terminates the</span>
<a name="line-40"></a><span class='hs-comment'>-- search.  One can filter the results to obtain the old behavior or</span>
<a name="line-41"></a><span class='hs-comment'>-- to obtain the behavior of "sed", where "sed" eliminates the empty</span>
<a name="line-42"></a><span class='hs-comment'>-- matches which coincide with the end of non-empty matches. (version</span>
<a name="line-43"></a><span class='hs-comment'>-- 0.94.0)</span>
<a name="line-44"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-45"></a>
<a name="line-46"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Regex</span><span class='hs-varop'>.</span><span class='hs-conid'>Posix</span><span class='hs-varop'>.</span><span class='hs-conid'>Wrap</span><span class='hs-layout'>(</span>
<a name="line-47"></a>  <span class='hs-comment'>-- ** High-level API</span>
<a name="line-48"></a>  <span class='hs-conid'>Regex</span><span class='hs-layout'>,</span>
<a name="line-49"></a>  <span class='hs-conid'>RegOffset</span><span class='hs-layout'>,</span>
<a name="line-50"></a>  <span class='hs-conid'>RegOffsetT</span><span class='hs-layout'>,</span>
<a name="line-51"></a>  <span class='hs-layout'>(</span><span class='hs-varop'>=~</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-52"></a>  <span class='hs-layout'>(</span><span class='hs-varop'>=~~</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-53"></a>
<a name="line-54"></a>  <span class='hs-comment'>-- ** Low-level API</span>
<a name="line-55"></a>  <span class='hs-conid'>WrapError</span><span class='hs-layout'>,</span>
<a name="line-56"></a>  <span class='hs-varid'>wrapCompile</span><span class='hs-layout'>,</span>
<a name="line-57"></a>  <span class='hs-varid'>wrapTest</span><span class='hs-layout'>,</span>
<a name="line-58"></a>  <span class='hs-varid'>wrapMatch</span><span class='hs-layout'>,</span>
<a name="line-59"></a>  <span class='hs-varid'>wrapMatchAll</span><span class='hs-layout'>,</span>
<a name="line-60"></a>  <span class='hs-varid'>wrapCount</span><span class='hs-layout'>,</span>
<a name="line-61"></a>
<a name="line-62"></a>  <span class='hs-comment'>-- ** Miscellaneous</span>
<a name="line-63"></a>  <span class='hs-varid'>unusedRegOffset</span><span class='hs-layout'>,</span>
<a name="line-64"></a>
<a name="line-65"></a>  <span class='hs-comment'>-- ** Compilation options</span>
<a name="line-66"></a>  <span class='hs-conid'>CompOption</span><span class='hs-layout'>(</span><span class='hs-conid'>CompOption</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-67"></a>  <span class='hs-varid'>compBlank</span><span class='hs-layout'>,</span>
<a name="line-68"></a>  <span class='hs-varid'>compExtended</span><span class='hs-layout'>,</span>   <span class='hs-comment'>-- use extended regex syntax</span>
<a name="line-69"></a>  <span class='hs-varid'>compIgnoreCase</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- ignore case when matching</span>
<a name="line-70"></a>  <span class='hs-varid'>compNoSub</span><span class='hs-layout'>,</span>      <span class='hs-comment'>-- no substring matching needed</span>
<a name="line-71"></a>  <span class='hs-varid'>compNewline</span><span class='hs-layout'>,</span>    <span class='hs-comment'>-- '.' doesn't match newline</span>
<a name="line-72"></a>
<a name="line-73"></a>  <span class='hs-comment'>-- ** Execution options</span>
<a name="line-74"></a>  <span class='hs-conid'>ExecOption</span><span class='hs-layout'>(</span><span class='hs-conid'>ExecOption</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-75"></a>  <span class='hs-varid'>execBlank</span><span class='hs-layout'>,</span>
<a name="line-76"></a>  <span class='hs-varid'>execNotBOL</span><span class='hs-layout'>,</span>     <span class='hs-comment'>-- not at begining of line</span>
<a name="line-77"></a>  <span class='hs-varid'>execNotEOL</span><span class='hs-layout'>,</span>     <span class='hs-comment'>-- not at end of line</span>
<a name="line-78"></a>
<a name="line-79"></a>  <span class='hs-comment'>-- ** Return codes</span>
<a name="line-80"></a>  <span class='hs-conid'>ReturnCode</span><span class='hs-layout'>(</span><span class='hs-conid'>ReturnCode</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-81"></a>  <span class='hs-varid'>retBadbr</span><span class='hs-layout'>,</span>
<a name="line-82"></a>  <span class='hs-varid'>retBadpat</span><span class='hs-layout'>,</span>
<a name="line-83"></a>  <span class='hs-varid'>retBadrpt</span><span class='hs-layout'>,</span>
<a name="line-84"></a>  <span class='hs-varid'>retEcollate</span><span class='hs-layout'>,</span>
<a name="line-85"></a>  <span class='hs-varid'>retEctype</span><span class='hs-layout'>,</span>
<a name="line-86"></a>  <span class='hs-varid'>retEescape</span><span class='hs-layout'>,</span>
<a name="line-87"></a>  <span class='hs-varid'>retEsubreg</span><span class='hs-layout'>,</span>
<a name="line-88"></a>  <span class='hs-varid'>retEbrack</span><span class='hs-layout'>,</span>
<a name="line-89"></a>  <span class='hs-varid'>retEparen</span><span class='hs-layout'>,</span>
<a name="line-90"></a>  <span class='hs-varid'>retEbrace</span><span class='hs-layout'>,</span>
<a name="line-91"></a>  <span class='hs-varid'>retErange</span><span class='hs-layout'>,</span>
<a name="line-92"></a>  <span class='hs-varid'>retEspace</span>
<a name="line-93"></a>  <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-94"></a>
<a name="line-95"></a>
<a name="line-96"></a><span class='hs-comment'>{-# LINE 93 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-97"></a>
<a name="line-98"></a><span class='hs-comment'>{-# LINE 94 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-99"></a>
<a name="line-100"></a><span class='hs-comment'>{-# LINE 100 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-101"></a>
<a name="line-102"></a>
<a name="line-103"></a><span class='hs-comment'>{-# LINE 102 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-104"></a><span class='hs-comment'>-- string.h is needed for memset</span>
<a name="line-105"></a>
<a name="line-106"></a>
<a name="line-107"></a><span class='hs-comment'>{-# LINE 105 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-108"></a>         
<a name="line-109"></a>
<a name="line-110"></a><span class='hs-comment'>{-# LINE 107 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-111"></a>
<a name="line-112"></a>
<a name="line-113"></a><span class='hs-comment'>{-# LINE 111 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-114"></a>
<a name="line-115"></a>
<a name="line-116"></a><span class='hs-comment'>{-# LINE 113 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-117"></a>
<a name="line-118"></a><span class='hs-comment'>{-# LINE 114 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-119"></a>
<a name="line-120"></a><span class='hs-comment'>{-# LINE 124 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-121"></a>
<a name="line-122"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-layout'>(</span><span class='hs-varid'>liftM</span><span class='hs-layout'>)</span>
<a name="line-123"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Array</span><span class='hs-layout'>(</span><span class='hs-conid'>Array</span><span class='hs-layout'>,</span><span class='hs-varid'>listArray</span><span class='hs-layout'>)</span>
<a name="line-124"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Bits</span><span class='hs-layout'>(</span><span class='hs-conid'>Bits</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-125"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Int</span><span class='hs-layout'>(</span><span class='hs-conid'>Int32</span><span class='hs-layout'>,</span><span class='hs-conid'>Int64</span><span class='hs-layout'>)</span>   <span class='hs-comment'>-- need whatever RegeOffset or #regoff_t type will be</span>
<a name="line-126"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Word</span><span class='hs-layout'>(</span><span class='hs-conid'>Word32</span><span class='hs-layout'>,</span><span class='hs-conid'>Word64</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- need whatever RegeOffset or #regoff_t type will be</span>
<a name="line-127"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Foreign</span><span class='hs-layout'>(</span><span class='hs-conid'>Ptr</span><span class='hs-layout'>,</span> <span class='hs-conid'>FunPtr</span><span class='hs-layout'>,</span> <span class='hs-varid'>nullPtr</span><span class='hs-layout'>,</span> <span class='hs-varid'>newForeignPtr</span><span class='hs-layout'>,</span>
<a name="line-128"></a>               <span class='hs-varid'>addForeignPtrFinalizer</span><span class='hs-layout'>,</span> <span class='hs-conid'>Storable</span><span class='hs-layout'>(</span><span class='hs-varid'>peekByteOff</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>allocaArray</span><span class='hs-layout'>,</span>
<a name="line-129"></a>               <span class='hs-varid'>allocaBytes</span><span class='hs-layout'>,</span> <span class='hs-varid'>withForeignPtr</span><span class='hs-layout'>,</span><span class='hs-conid'>ForeignPtr</span><span class='hs-layout'>,</span><span class='hs-varid'>plusPtr</span><span class='hs-layout'>,</span><span class='hs-varid'>peekElemOff</span><span class='hs-layout'>)</span>
<a name="line-130"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Foreign</span><span class='hs-varop'>.</span><span class='hs-conid'>Marshal</span><span class='hs-varop'>.</span><span class='hs-conid'>Alloc</span><span class='hs-layout'>(</span><span class='hs-varid'>mallocBytes</span><span class='hs-layout'>)</span>
<a name="line-131"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Foreign</span><span class='hs-varop'>.</span><span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-conid'>CChar</span><span class='hs-layout'>)</span>
<a name="line-132"></a>
<a name="line-133"></a><span class='hs-comment'>{-# LINE 136 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-134"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Foreign</span><span class='hs-varop'>.</span><span class='hs-conid'>C</span><span class='hs-layout'>(</span><span class='hs-conid'>CSize</span><span class='hs-layout'>(</span><span class='hs-conid'>CSize</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-conid'>CInt</span><span class='hs-layout'>(</span><span class='hs-conid'>CInt</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-135"></a>
<a name="line-136"></a><span class='hs-comment'>{-# LINE 140 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-137"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Foreign</span><span class='hs-varop'>.</span><span class='hs-conid'>C</span><span class='hs-varop'>.</span><span class='hs-conid'>String</span><span class='hs-layout'>(</span><span class='hs-varid'>peekCAString</span><span class='hs-layout'>,</span> <span class='hs-conid'>CString</span><span class='hs-layout'>)</span>
<a name="line-138"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Regex</span><span class='hs-varop'>.</span><span class='hs-conid'>Base</span><span class='hs-varop'>.</span><span class='hs-conid'>RegexLike</span><span class='hs-layout'>(</span><span class='hs-conid'>RegexOptions</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-conid'>RegexMaker</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-conid'>RegexContext</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-conid'>MatchArray</span><span class='hs-layout'>)</span>
<a name="line-139"></a><span class='hs-comment'>-- deprecated: import qualified System.IO.Error as IOERROR(try)</span>
<a name="line-140"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Exception</span><span class='hs-layout'>(</span><span class='hs-varid'>try</span><span class='hs-layout'>,</span><span class='hs-conid'>IOException</span><span class='hs-layout'>)</span>
<a name="line-141"></a>
<a name="line-142"></a><a name="try"></a><span class='hs-definition'>try</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Either</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Exception</span><span class='hs-varop'>.</span><span class='hs-conid'>IOException</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-143"></a><span class='hs-definition'>try</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Exception</span><span class='hs-varop'>.</span><span class='hs-varid'>try</span>
<a name="line-144"></a>
<a name="line-145"></a><a name="CRegex"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>CRegex</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>()</span>   <span class='hs-comment'>-- dummy regex_t used below to read out nsub value</span>
<a name="line-146"></a>
<a name="line-147"></a><a name="RegOffset"></a><span class='hs-comment'>-- | RegOffset is "typedef int regoff_t" on Linux and ultimately "typedef</span>
<a name="line-148"></a><a name="RegOffset"></a><span class='hs-comment'>-- long long __int64_t" on Max OS X.  So rather than saying</span>
<a name="line-149"></a><a name="RegOffset"></a><span class='hs-comment'>-- 2,147,483,647 is all the length you need, I'll take the larger:</span>
<a name="line-150"></a><a name="RegOffset"></a><span class='hs-comment'>-- 9,223,372,036,854,775,807 should be enough bytes for anyone, no</span>
<a name="line-151"></a><a name="RegOffset"></a><span class='hs-comment'>-- need for Integer. The alternative is to compile to different sizes</span>
<a name="line-152"></a><a name="RegOffset"></a><span class='hs-comment'>-- in a platform dependent manner with "type RegOffset = (#type</span>
<a name="line-153"></a><a name="RegOffset"></a><span class='hs-comment'>-- regoff_t)", which I do not want to do.</span>
<a name="line-154"></a><a name="RegOffset"></a><span class='hs-comment'>--</span>
<a name="line-155"></a><a name="RegOffset"></a><span class='hs-comment'>-- There is also a special value 'unusedRegOffset' :: 'RegOffset' which is</span>
<a name="line-156"></a><a name="RegOffset"></a><span class='hs-comment'>-- (-1) and as a starting index means that the subgroup capture was</span>
<a name="line-157"></a><a name="RegOffset"></a><span class='hs-comment'>-- unused.  Otherwise the RegOffset indicates a character boundary that</span>
<a name="line-158"></a><a name="RegOffset"></a><span class='hs-comment'>-- is before the character at that index offset, with the first</span>
<a name="line-159"></a><a name="RegOffset"></a><span class='hs-comment'>-- character at index offset 0. So starting at 1 and ending at 2 means</span>
<a name="line-160"></a><a name="RegOffset"></a><span class='hs-comment'>-- to take only the second character.</span>
<a name="line-161"></a><a name="RegOffset"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>RegOffset</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Int64</span>
<a name="line-162"></a><a name="RegOffsetT"></a><span class='hs-comment'>--debugging 64-bit ubuntu</span>
<a name="line-163"></a><a name="RegOffsetT"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>RegOffsetT</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int32</span><span class='hs-layout'>)</span>
<a name="line-164"></a><span class='hs-comment'>{-# LINE 167 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-165"></a>
<a name="line-166"></a><span class='hs-comment'>-- | A bitmapped 'CInt' containing options for compilation of regular</span>
<a name="line-167"></a><span class='hs-comment'>-- expressions.  Option values (and their man 3 regcomp names) are</span>
<a name="line-168"></a><span class='hs-comment'>--</span>
<a name="line-169"></a><span class='hs-comment'>--  * 'compBlank' which is a completely zero value for all the flags.</span>
<a name="line-170"></a><span class='hs-comment'>--    This is also the 'blankCompOpt' value.</span>
<a name="line-171"></a><span class='hs-comment'>--</span>
<a name="line-172"></a><span class='hs-comment'>--  * 'compExtended' (REG_EXTENDED) which can be set to use extended instead</span>
<a name="line-173"></a><span class='hs-comment'>--    of basic regular expressions.</span>
<a name="line-174"></a><span class='hs-comment'>--    This is set in the 'defaultCompOpt' value.</span>
<a name="line-175"></a><span class='hs-comment'>--</span>
<a name="line-176"></a><span class='hs-comment'>--  * 'compNewline' (REG_NEWLINE) turns on newline sensitivity: The dot (.)</span>
<a name="line-177"></a><span class='hs-comment'>--    and inverted set @[^ ]@ never match newline, and ^ and $ anchors do</span>
<a name="line-178"></a><span class='hs-comment'>--    match after and before newlines.</span>
<a name="line-179"></a><span class='hs-comment'>--    This is set in the 'defaultCompOpt' value.</span>
<a name="line-180"></a><span class='hs-comment'>--</span>
<a name="line-181"></a><span class='hs-comment'>--  * 'compIgnoreCase' (REG_ICASE) which can be set to match ignoring upper</span>
<a name="line-182"></a><span class='hs-comment'>--    and lower distinctions.</span>
<a name="line-183"></a><span class='hs-comment'>--</span>
<a name="line-184"></a><span class='hs-comment'>--  * 'compNoSub' (REG_NOSUB) which turns off all information from matching</span>
<a name="line-185"></a><span class='hs-comment'>--    except whether a match exists.</span>
<a name="line-186"></a>
<a name="line-187"></a><a name="CompOption"></a><span class='hs-comment'>{-# LINE 189 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-188"></a><a name="CompOption"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>CompOption</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CompOption</span> <span class='hs-conid'>CInt</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span><span class='hs-conid'>Show</span><span class='hs-layout'>,</span><span class='hs-conid'>Num</span><span class='hs-layout'>,</span><span class='hs-conid'>Bits</span><span class='hs-layout'>)</span>
<a name="line-189"></a>
<a name="line-190"></a><span class='hs-comment'>{-# LINE 211 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-191"></a>
<a name="line-192"></a><span class='hs-comment'>-- | A bitmapped 'CInt' containing options for execution of compiled</span>
<a name="line-193"></a><span class='hs-comment'>-- regular expressions.  Option values (and their man 3 regexec names) are</span>
<a name="line-194"></a><span class='hs-comment'>--</span>
<a name="line-195"></a><span class='hs-comment'>--  * 'execBlank' which is a complete zero value for all the flags.  This is</span>
<a name="line-196"></a><span class='hs-comment'>--    the blankExecOpt value.</span>
<a name="line-197"></a><span class='hs-comment'>--</span>
<a name="line-198"></a><span class='hs-comment'>--  * 'execNotBOL' (REG_NOTBOL) can be set to prevent ^ from matching at the</span>
<a name="line-199"></a><span class='hs-comment'>--    start of the input.</span>
<a name="line-200"></a><span class='hs-comment'>--</span>
<a name="line-201"></a><span class='hs-comment'>--  * 'execNotEOL' (REG_NOTEOL) can be set to prevent $ from matching at the</span>
<a name="line-202"></a><span class='hs-comment'>--    end of the input (before the terminating NUL).</span>
<a name="line-203"></a>
<a name="line-204"></a><a name="ExecOption"></a><span class='hs-comment'>{-# LINE 224 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-205"></a><a name="ExecOption"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>ExecOption</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ExecOption</span> <span class='hs-conid'>CInt</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span><span class='hs-conid'>Show</span><span class='hs-layout'>,</span><span class='hs-conid'>Num</span><span class='hs-layout'>,</span><span class='hs-conid'>Bits</span><span class='hs-layout'>)</span>
<a name="line-206"></a>
<a name="line-207"></a><span class='hs-comment'>{-# LINE 246 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-208"></a>
<a name="line-209"></a><a name="ReturnCode"></a><span class='hs-comment'>-- | ReturnCode is an enumerated 'CInt', corresponding to the error codes</span>
<a name="line-210"></a><a name="ReturnCode"></a><span class='hs-comment'>-- from @man 3 regex@:</span>
<a name="line-211"></a><a name="ReturnCode"></a><span class='hs-comment'>--</span>
<a name="line-212"></a><a name="ReturnCode"></a><span class='hs-comment'>-- * 'retBadbr' (@REG_BADBR@) invalid repetition count(s) in @{ }@</span>
<a name="line-213"></a><a name="ReturnCode"></a><span class='hs-comment'>--</span>
<a name="line-214"></a><a name="ReturnCode"></a><span class='hs-comment'>-- * 'retBadpat' (@REG_BADPAT@) invalid regular expression</span>
<a name="line-215"></a><a name="ReturnCode"></a><span class='hs-comment'>--</span>
<a name="line-216"></a><a name="ReturnCode"></a><span class='hs-comment'>-- * 'retBadrpt' (@REG_BADRPT@) @?@, @*@, or @+@ operand invalid</span>
<a name="line-217"></a><a name="ReturnCode"></a><span class='hs-comment'>--</span>
<a name="line-218"></a><a name="ReturnCode"></a><span class='hs-comment'>-- * 'retEcollate' (@REG_ECOLLATE@) invalid collating element</span>
<a name="line-219"></a><a name="ReturnCode"></a><span class='hs-comment'>--</span>
<a name="line-220"></a><a name="ReturnCode"></a><span class='hs-comment'>-- * 'retEctype' (@REG_ECTYPE@) invalid character class</span>
<a name="line-221"></a><a name="ReturnCode"></a><span class='hs-comment'>--</span>
<a name="line-222"></a><a name="ReturnCode"></a><span class='hs-comment'>-- * 'retEescape' (@REG_EESCAPE@) @\\@ applied to unescapable character</span>
<a name="line-223"></a><a name="ReturnCode"></a><span class='hs-comment'>--</span>
<a name="line-224"></a><a name="ReturnCode"></a><span class='hs-comment'>-- * 'retEsubreg' (@REG_ESUBREG@) invalid backreference number</span>
<a name="line-225"></a><a name="ReturnCode"></a><span class='hs-comment'>--</span>
<a name="line-226"></a><a name="ReturnCode"></a><span class='hs-comment'>-- * 'retEbrack' (@REG_EBRACK@) brackets @[ ]@ not balanced</span>
<a name="line-227"></a><a name="ReturnCode"></a><span class='hs-comment'>--</span>
<a name="line-228"></a><a name="ReturnCode"></a><span class='hs-comment'>-- * 'retEparen' (@REG_EPAREN@) parentheses @( )@ not balanced</span>
<a name="line-229"></a><a name="ReturnCode"></a><span class='hs-comment'>--</span>
<a name="line-230"></a><a name="ReturnCode"></a><span class='hs-comment'>-- * 'retEbrace' (@REG_EBRACE@) braces @{ }@ not balanced</span>
<a name="line-231"></a><a name="ReturnCode"></a><span class='hs-comment'>--</span>
<a name="line-232"></a><a name="ReturnCode"></a><span class='hs-comment'>-- * 'retErange' (@REG_ERANGE@) invalid character range in @[ ]@</span>
<a name="line-233"></a><a name="ReturnCode"></a><span class='hs-comment'>--</span>
<a name="line-234"></a><a name="ReturnCode"></a><span class='hs-comment'>-- * 'retEspace' (@REG_ESPACE@) ran out of memory</span>
<a name="line-235"></a><a name="ReturnCode"></a><span class='hs-comment'>--</span>
<a name="line-236"></a><a name="ReturnCode"></a><span class='hs-comment'>-- * 'retNoMatch' (@REG_NOMATCH@) The regexec() function failed to match</span>
<a name="line-237"></a><a name="ReturnCode"></a><span class='hs-comment'>--</span>
<a name="line-238"></a><a name="ReturnCode"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>ReturnCode</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ReturnCode</span> <span class='hs-conid'>CInt</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span><span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-239"></a>
<a name="line-240"></a><a name="Regex"></a><span class='hs-comment'>-- | A compiled regular expression.</span>
<a name="line-241"></a><a name="Regex"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Regex</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Regex</span> <span class='hs-layout'>(</span><span class='hs-conid'>ForeignPtr</span> <span class='hs-conid'>CRegex</span><span class='hs-layout'>)</span> <span class='hs-conid'>CompOption</span> <span class='hs-conid'>ExecOption</span>
<a name="line-242"></a>
<a name="line-243"></a><a name="compBlank"></a><span class='hs-comment'>-- | A completely zero value for all the flags.</span>
<a name="line-244"></a><span class='hs-comment'>-- This is also the 'blankCompOpt' value.</span>
<a name="line-245"></a><span class='hs-definition'>compBlank</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CompOption</span>
<a name="line-246"></a><span class='hs-definition'>compBlank</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CompOption</span> <span class='hs-num'>0</span>
<a name="line-247"></a>
<a name="line-248"></a><a name="execBlank"></a><span class='hs-comment'>-- | A completely zero value for all the flags.</span>
<a name="line-249"></a><span class='hs-comment'>-- This is also the 'blankExecOpt' value.</span>
<a name="line-250"></a><span class='hs-definition'>execBlank</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ExecOption</span>
<a name="line-251"></a><span class='hs-definition'>execBlank</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ExecOption</span> <span class='hs-num'>0</span>
<a name="line-252"></a>
<a name="line-253"></a><a name="unusedRegOffset"></a><span class='hs-definition'>unusedRegOffset</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RegOffset</span>
<a name="line-254"></a><span class='hs-definition'>unusedRegOffset</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-255"></a>
<a name="line-256"></a><a name="WrapError"></a><span class='hs-comment'>-- | The return code will be retOk when it is the Haskell wrapper and</span>
<a name="line-257"></a><a name="WrapError"></a><span class='hs-comment'>-- not the underlying library generating the error message.</span>
<a name="line-258"></a><a name="WrapError"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>WrapError</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>ReturnCode</span><span class='hs-layout'>,</span><span class='hs-conid'>String</span><span class='hs-layout'>)</span>
<a name="line-259"></a>
<a name="line-260"></a><a name="wrapCompile"></a><span class='hs-definition'>wrapCompile</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CompOption</span> <span class='hs-comment'>-- ^ Flags (bitmapped)</span>
<a name="line-261"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExecOption</span> <span class='hs-comment'>-- ^ Flags (bitmapped)</span>
<a name="line-262"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CString</span> <span class='hs-comment'>-- ^ The regular expression to compile (ASCII only, no null bytes)</span>
<a name="line-263"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Either</span> <span class='hs-conid'>WrapError</span> <span class='hs-conid'>Regex</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- ^ Returns: the compiled regular expression</span>
<a name="line-264"></a>
<a name="line-265"></a><a name="wrapTest"></a><span class='hs-definition'>wrapTest</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Regex</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CString</span>
<a name="line-266"></a>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Either</span> <span class='hs-conid'>WrapError</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span>
<a name="line-267"></a>
<a name="line-268"></a><a name="wrapMatch"></a><span class='hs-comment'>-- | wrapMatch returns offsets for the begin and end of each capture.</span>
<a name="line-269"></a><span class='hs-comment'>-- Unused captures have offsets of unusedRegOffset which is (-1)</span>
<a name="line-270"></a><span class='hs-definition'>wrapMatch</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Regex</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CString</span>
<a name="line-271"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Either</span> <span class='hs-conid'>WrapError</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>RegOffset</span><span class='hs-layout'>,</span><span class='hs-conid'>RegOffset</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-272"></a>
<a name="line-273"></a><a name="wrapMatchAll"></a><span class='hs-comment'>-- | wrapMatchAll returns the offset and length of each capture.</span>
<a name="line-274"></a><span class='hs-comment'>-- Unused captures have an offset of unusedRegOffset which is (-1) and</span>
<a name="line-275"></a><span class='hs-comment'>-- length of 0.</span>
<a name="line-276"></a><span class='hs-definition'>wrapMatchAll</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Regex</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CString</span>
<a name="line-277"></a>             <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Either</span> <span class='hs-conid'>WrapError</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>MatchArray</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-278"></a>
<a name="line-279"></a><a name="wrapCount"></a><span class='hs-definition'>wrapCount</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Regex</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CString</span>
<a name="line-280"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Either</span> <span class='hs-conid'>WrapError</span> <span class='hs-conid'>Int</span><span class='hs-layout'>)</span>
<a name="line-281"></a>
<a name="line-282"></a><a name="=~"></a><span class='hs-layout'>(</span><span class='hs-varop'>=~</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>RegexMaker</span> <span class='hs-conid'>Regex</span> <span class='hs-conid'>CompOption</span> <span class='hs-conid'>ExecOption</span> <span class='hs-varid'>source</span><span class='hs-layout'>,</span><span class='hs-conid'>RegexContext</span> <span class='hs-conid'>Regex</span> <span class='hs-varid'>source1</span> <span class='hs-varid'>target</span><span class='hs-layout'>)</span>
<a name="line-283"></a>      <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>source1</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>source</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>target</span>
<a name="line-284"></a><a name="=~~"></a><span class='hs-layout'>(</span><span class='hs-varop'>=~~</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>RegexMaker</span> <span class='hs-conid'>Regex</span> <span class='hs-conid'>CompOption</span> <span class='hs-conid'>ExecOption</span> <span class='hs-varid'>source</span><span class='hs-layout'>,</span><span class='hs-conid'>RegexContext</span> <span class='hs-conid'>Regex</span> <span class='hs-varid'>source1</span> <span class='hs-varid'>target</span><span class='hs-layout'>,</span><span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span>
<a name="line-285"></a>      <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>source1</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>source</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>target</span>
<a name="line-286"></a>
<a name="line-287"></a><a name="instance%20RegexOptions%20Regex%20CompOption%20ExecOption"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>RegexOptions</span> <span class='hs-conid'>Regex</span> <span class='hs-conid'>CompOption</span> <span class='hs-conid'>ExecOption</span> <span class='hs-keyword'>where</span>
<a name="line-288"></a>  <span class='hs-varid'>blankCompOpt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>compBlank</span>
<a name="line-289"></a>  <span class='hs-varid'>blankExecOpt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>execBlank</span>
<a name="line-290"></a>  <span class='hs-varid'>defaultCompOpt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>compExtended</span> <span class='hs-varop'>.|.</span> <span class='hs-varid'>compNewline</span>
<a name="line-291"></a>  <span class='hs-varid'>defaultExecOpt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>execBlank</span>
<a name="line-292"></a>  <span class='hs-varid'>setExecOpts</span> <span class='hs-varid'>e'</span> <span class='hs-layout'>(</span><span class='hs-conid'>Regex</span> <span class='hs-varid'>r</span> <span class='hs-varid'>c</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Regex</span> <span class='hs-varid'>r</span> <span class='hs-varid'>c</span> <span class='hs-varid'>e'</span>
<a name="line-293"></a>  <span class='hs-varid'>getExecOpts</span> <span class='hs-layout'>(</span><span class='hs-conid'>Regex</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>e</span>
<a name="line-294"></a>
<a name="line-295"></a><span class='hs-comment'>-- (=~) ::(RegexMaker Regex CompOption ExecOption source,RegexContext Regex source1 target) =&gt; source1 -&gt; source -&gt; target</span>
<a name="line-296"></a><span class='hs-layout'>(</span><span class='hs-varop'>=~</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>make</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RegexMaker</span> <span class='hs-conid'>Regex</span> <span class='hs-conid'>CompOption</span> <span class='hs-conid'>ExecOption</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Regex</span>
<a name="line-297"></a>               <span class='hs-varid'>make</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>makeRegex</span>
<a name="line-298"></a>           <span class='hs-keyword'>in</span> <span class='hs-varid'>match</span> <span class='hs-layout'>(</span><span class='hs-varid'>make</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span>
<a name="line-299"></a>
<a name="line-300"></a><span class='hs-comment'>-- (=~~) ::(RegexMaker Regex CompOption ExecOption source,RegexContext Regex source1 target,Monad m) =&gt; source1 -&gt; source -&gt; m target</span>
<a name="line-301"></a><span class='hs-layout'>(</span><span class='hs-varop'>=~~</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>make</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RegexMaker</span> <span class='hs-conid'>Regex</span> <span class='hs-conid'>CompOption</span> <span class='hs-conid'>ExecOption</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Regex</span>
<a name="line-302"></a>                <span class='hs-varid'>make</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>makeRegex</span>
<a name="line-303"></a>            <span class='hs-keyword'>in</span> <span class='hs-varid'>matchM</span> <span class='hs-layout'>(</span><span class='hs-varid'>make</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span>
<a name="line-304"></a>
<a name="line-305"></a><a name="CRegMatch"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>CRegMatch</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>()</span> <span class='hs-comment'>-- dummy regmatch_t used below to read out so and eo values</span>
<a name="line-306"></a>
<a name="line-307"></a><span class='hs-comment'>-- -----------------------------------------------------------------------------</span>
<a name="line-308"></a><span class='hs-comment'>-- The POSIX regex C interface</span>
<a name="line-309"></a>
<a name="line-310"></a><span class='hs-comment'>-- string.h</span>
<a name="line-311"></a><span class='hs-keyword'>foreign</span> <span class='hs-keyword'>import</span> <span class='hs-keyword'>ccall</span> <span class='hs-keyword'>unsafe</span> <span class='hs-str'>"memset"</span>
<a name="line-312"></a>  <span class='hs-varid'>c_memset</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ptr</span> <span class='hs-conid'>CRegex</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CInt</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CSize</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ptr</span> <span class='hs-conid'>CRegex</span><span class='hs-layout'>)</span>
<a name="line-313"></a>
<a name="line-314"></a><span class='hs-comment'>-- c-finalizer/myfree.h and c-finalizer/myfree.c</span>
<a name="line-315"></a><span class='hs-keyword'>foreign</span> <span class='hs-keyword'>import</span> <span class='hs-keyword'>ccall</span> <span class='hs-keyword'>unsafe</span> <span class='hs-str'>"&amp;myregfree"</span>
<a name="line-316"></a>  <span class='hs-varid'>c_myregfree</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FunPtr</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ptr</span> <span class='hs-conid'>CRegex</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-317"></a>
<a name="line-318"></a>
<a name="line-319"></a><span class='hs-comment'>{-# LINE 357 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-320"></a>
<a name="line-321"></a><span class='hs-keyword'>foreign</span> <span class='hs-keyword'>import</span> <span class='hs-keyword'>ccall</span> <span class='hs-keyword'>unsafe</span> <span class='hs-str'>"regcomp"</span>
<a name="line-322"></a>  <span class='hs-varid'>c_regcomp</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ptr</span> <span class='hs-conid'>CRegex</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CompOption</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>ReturnCode</span>
<a name="line-323"></a>
<a name="line-324"></a><span class='hs-comment'>{- NOT USED
<a name="line-325"></a>foreign import ccall unsafe "&amp;regfree"
<a name="line-326"></a>  c_regfree :: FunPtr (Ptr CRegex -&gt; IO ())
<a name="line-327"></a>-}</span>
<a name="line-328"></a>
<a name="line-329"></a><span class='hs-keyword'>foreign</span> <span class='hs-keyword'>import</span> <span class='hs-keyword'>ccall</span> <span class='hs-keyword'>unsafe</span> <span class='hs-str'>"regexec"</span>
<a name="line-330"></a>  <span class='hs-varid'>c_regexec</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ptr</span> <span class='hs-conid'>CRegex</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CSize</span>
<a name="line-331"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Ptr</span> <span class='hs-conid'>CRegMatch</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExecOption</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>ReturnCode</span>
<a name="line-332"></a>
<a name="line-333"></a><span class='hs-keyword'>foreign</span> <span class='hs-keyword'>import</span> <span class='hs-keyword'>ccall</span> <span class='hs-keyword'>unsafe</span> <span class='hs-str'>"regerror"</span>
<a name="line-334"></a>  <span class='hs-varid'>c_regerror</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReturnCode</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Ptr</span> <span class='hs-conid'>CRegex</span>
<a name="line-335"></a>             <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CSize</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>CSize</span>
<a name="line-336"></a>
<a name="line-337"></a>
<a name="line-338"></a><span class='hs-comment'>{-# LINE 406 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-339"></a>
<a name="line-340"></a><a name="retOk"></a><span class='hs-definition'>retOk</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReturnCode</span>
<a name="line-341"></a><span class='hs-definition'>retOk</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ReturnCode</span> <span class='hs-num'>0</span>
<a name="line-342"></a>
<a name="line-343"></a><a name="execNotBOL"></a><span class='hs-comment'>-- Flags for regexec</span>
<a name="line-344"></a><span class='hs-definition'>execNotBOL</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ExecOption</span>
<a name="line-345"></a><span class='hs-definition'>execNotBOL</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ExecOption</span> <span class='hs-num'>1</span>
<a name="line-346"></a><a name="execNotEOL"></a><span class='hs-definition'>execNotEOL</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ExecOption</span>
<a name="line-347"></a><span class='hs-definition'>execNotEOL</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ExecOption</span> <span class='hs-num'>2</span>
<a name="line-348"></a>
<a name="line-349"></a><span class='hs-comment'>{-# LINE 414 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-350"></a>
<a name="line-351"></a><a name="compExtended"></a><span class='hs-comment'>-- Flags for regcomp</span>
<a name="line-352"></a><span class='hs-definition'>compExtended</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CompOption</span>
<a name="line-353"></a><span class='hs-definition'>compExtended</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CompOption</span> <span class='hs-num'>1</span>
<a name="line-354"></a><a name="compIgnoreCase"></a><span class='hs-definition'>compIgnoreCase</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CompOption</span>
<a name="line-355"></a><span class='hs-definition'>compIgnoreCase</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CompOption</span> <span class='hs-num'>2</span>
<a name="line-356"></a><a name="compNoSub"></a><span class='hs-definition'>compNoSub</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CompOption</span>
<a name="line-357"></a><span class='hs-definition'>compNoSub</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CompOption</span> <span class='hs-num'>8</span>
<a name="line-358"></a><a name="compNewline"></a><span class='hs-definition'>compNewline</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CompOption</span>
<a name="line-359"></a><span class='hs-definition'>compNewline</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CompOption</span> <span class='hs-num'>4</span>
<a name="line-360"></a>
<a name="line-361"></a><span class='hs-comment'>{-# LINE 421 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-362"></a>
<a name="line-363"></a><a name="retNoMatch"></a><span class='hs-comment'>-- Return values from regexec (REG_NOMATCH, REG_ESPACE,...)</span>
<a name="line-364"></a><span class='hs-comment'>-- Error codes from regcomp (not REG_NOMATCH)</span>
<a name="line-365"></a><span class='hs-comment'>-- Though calling retNoMatch an error is rather missing the point...</span>
<a name="line-366"></a><span class='hs-definition'>retNoMatch</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReturnCode</span>
<a name="line-367"></a><span class='hs-definition'>retNoMatch</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ReturnCode</span> <span class='hs-num'>1</span>
<a name="line-368"></a><a name="retBadbr"></a><span class='hs-definition'>retBadbr</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReturnCode</span>
<a name="line-369"></a><span class='hs-definition'>retBadbr</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ReturnCode</span> <span class='hs-num'>10</span>
<a name="line-370"></a><a name="retBadpat"></a><span class='hs-definition'>retBadpat</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReturnCode</span>
<a name="line-371"></a><span class='hs-definition'>retBadpat</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ReturnCode</span> <span class='hs-num'>2</span>
<a name="line-372"></a><a name="retBadrpt"></a><span class='hs-definition'>retBadrpt</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReturnCode</span>
<a name="line-373"></a><span class='hs-definition'>retBadrpt</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ReturnCode</span> <span class='hs-num'>13</span>
<a name="line-374"></a><a name="retEcollate"></a><span class='hs-definition'>retEcollate</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReturnCode</span>
<a name="line-375"></a><span class='hs-definition'>retEcollate</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ReturnCode</span> <span class='hs-num'>3</span>
<a name="line-376"></a><a name="retEctype"></a><span class='hs-definition'>retEctype</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReturnCode</span>
<a name="line-377"></a><span class='hs-definition'>retEctype</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ReturnCode</span> <span class='hs-num'>4</span>
<a name="line-378"></a><a name="retEescape"></a><span class='hs-definition'>retEescape</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReturnCode</span>
<a name="line-379"></a><span class='hs-definition'>retEescape</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ReturnCode</span> <span class='hs-num'>5</span>
<a name="line-380"></a><a name="retEsubreg"></a><span class='hs-definition'>retEsubreg</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReturnCode</span>
<a name="line-381"></a><span class='hs-definition'>retEsubreg</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ReturnCode</span> <span class='hs-num'>6</span>
<a name="line-382"></a><a name="retEbrack"></a><span class='hs-definition'>retEbrack</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReturnCode</span>
<a name="line-383"></a><span class='hs-definition'>retEbrack</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ReturnCode</span> <span class='hs-num'>7</span>
<a name="line-384"></a><a name="retEparen"></a><span class='hs-definition'>retEparen</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReturnCode</span>
<a name="line-385"></a><span class='hs-definition'>retEparen</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ReturnCode</span> <span class='hs-num'>8</span>
<a name="line-386"></a><a name="retEbrace"></a><span class='hs-definition'>retEbrace</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReturnCode</span>
<a name="line-387"></a><span class='hs-definition'>retEbrace</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ReturnCode</span> <span class='hs-num'>9</span>
<a name="line-388"></a><a name="retErange"></a><span class='hs-definition'>retErange</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReturnCode</span>
<a name="line-389"></a><span class='hs-definition'>retErange</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ReturnCode</span> <span class='hs-num'>11</span>
<a name="line-390"></a><a name="retEspace"></a><span class='hs-definition'>retEspace</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReturnCode</span>
<a name="line-391"></a><span class='hs-definition'>retEspace</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ReturnCode</span> <span class='hs-num'>12</span>
<a name="line-392"></a>
<a name="line-393"></a><span class='hs-comment'>{-# LINE 439 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-394"></a><span class='hs-comment'>----</span>
<a name="line-395"></a><span class='hs-comment'>-- error helpers</span>
<a name="line-396"></a>
<a name="line-397"></a><a name="nullTest"></a><span class='hs-definition'>nullTest</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ptr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Either</span> <span class='hs-conid'>WrapError</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Either</span> <span class='hs-conid'>WrapError</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-398"></a><span class='hs-comment'>{-# INLINE nullTest #-}</span>
<a name="line-399"></a><span class='hs-definition'>nullTest</span> <span class='hs-varid'>ptr</span> <span class='hs-varid'>msg</span> <span class='hs-varid'>io</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-400"></a>  <span class='hs-keyword'>if</span> <span class='hs-varid'>nullPtr</span> <span class='hs-varop'>==</span> <span class='hs-varid'>ptr</span>
<a name="line-401"></a>    <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-layout'>(</span><span class='hs-varid'>retOk</span><span class='hs-layout'>,</span><span class='hs-str'>"Ptr parameter was nullPtr in Text.Regex.TRE.Wrap."</span><span class='hs-varop'>++</span><span class='hs-varid'>msg</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-402"></a>    <span class='hs-keyword'>else</span> <span class='hs-varid'>io</span>
<a name="line-403"></a>
<a name="line-404"></a><a name="isNewline"></a><span class='hs-definition'>isNewline</span><span class='hs-layout'>,</span><span class='hs-varid'>isNull</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ptr</span> <span class='hs-conid'>CChar</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Bool</span>
<a name="line-405"></a><span class='hs-definition'>isNewline</span> <span class='hs-varid'>cstr</span> <span class='hs-varid'>pos</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftM</span> <span class='hs-layout'>(</span><span class='hs-varid'>newline</span> <span class='hs-varop'>==</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>peekElemOff</span> <span class='hs-varid'>cstr</span> <span class='hs-varid'>pos</span><span class='hs-layout'>)</span>
<a name="line-406"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>newline</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>toEnum</span> <span class='hs-num'>10</span>
<a name="line-407"></a><a name="isNull"></a><span class='hs-definition'>isNull</span> <span class='hs-varid'>cstr</span> <span class='hs-varid'>pos</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftM</span> <span class='hs-layout'>(</span><span class='hs-varid'>nullChar</span> <span class='hs-varop'>==</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>peekElemOff</span> <span class='hs-varid'>cstr</span> <span class='hs-varid'>pos</span><span class='hs-layout'>)</span>
<a name="line-408"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>nullChar</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>toEnum</span> <span class='hs-num'>0</span>
<a name="line-409"></a>
<a name="line-410"></a><a name="wrapError"></a><span class='hs-comment'>{-
<a name="line-411"></a>wrapRC :: ReturnCode -&gt; IO (Either WrapError b)
<a name="line-412"></a>{-# INLINE wrapRC #-}
<a name="line-413"></a>wrapRC r = return (Left (r,"Error in Text.Regex.Posix.Wrap: "++show r))
<a name="line-414"></a>-}</span>
<a name="line-415"></a><span class='hs-definition'>wrapError</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReturnCode</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Ptr</span> <span class='hs-conid'>CRegex</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Either</span> <span class='hs-conid'>WrapError</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-416"></a><span class='hs-definition'>wrapError</span> <span class='hs-varid'>errCode</span> <span class='hs-varid'>regex_ptr</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-417"></a>  <span class='hs-comment'>-- Call once to compute the error message buffer size</span>
<a name="line-418"></a>  <span class='hs-varid'>errBufSize</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>c_regerror</span> <span class='hs-varid'>errCode</span> <span class='hs-varid'>regex_ptr</span> <span class='hs-varid'>nullPtr</span> <span class='hs-num'>0</span>
<a name="line-419"></a>  <span class='hs-comment'>-- Allocate a temporary buffer to hold the error message</span>
<a name="line-420"></a>  <span class='hs-varid'>allocaArray</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>errBufSize</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>errBuf</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-421"></a>   <span class='hs-varid'>nullTest</span> <span class='hs-varid'>errBuf</span> <span class='hs-str'>"wrapError errBuf"</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-422"></a>    <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>c_regerror</span> <span class='hs-varid'>errCode</span> <span class='hs-varid'>regex_ptr</span> <span class='hs-varid'>errBuf</span> <span class='hs-varid'>errBufSize</span>
<a name="line-423"></a>    <span class='hs-varid'>msg</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>peekCAString</span> <span class='hs-varid'>errBuf</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>String</span>
<a name="line-424"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-layout'>(</span><span class='hs-varid'>errCode</span><span class='hs-layout'>,</span> <span class='hs-varid'>msg</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-425"></a>
<a name="line-426"></a><span class='hs-comment'>----------</span>
<a name="line-427"></a><span class='hs-definition'>wrapCompile</span> <span class='hs-varid'>flags</span> <span class='hs-varid'>e</span> <span class='hs-varid'>pattern</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-428"></a> <span class='hs-varid'>nullTest</span> <span class='hs-varid'>pattern</span> <span class='hs-str'>"wrapCompile pattern"</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-429"></a>  <span class='hs-varid'>e_regex_ptr</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>try</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mallocBytes</span> <span class='hs-layout'>(</span><span class='hs-num'>64</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- ioError called if nullPtr</span>
<a name="line-430"></a><span class='hs-comment'>{-# LINE 475 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-431"></a>  <span class='hs-keyword'>case</span> <span class='hs-varid'>e_regex_ptr</span> <span class='hs-keyword'>of</span>
<a name="line-432"></a>    <span class='hs-conid'>Left</span> <span class='hs-varid'>ioerror</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-layout'>(</span><span class='hs-varid'>retOk</span><span class='hs-layout'>,</span><span class='hs-str'>"Text.Regex.Posix.Wrap.wrapCompile: IOError from mallocBytes(regex_t) : "</span><span class='hs-varop'>++</span><span class='hs-varid'>show</span> <span class='hs-varid'>ioerror</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-433"></a>    <span class='hs-conid'>Right</span> <span class='hs-varid'>raw_regex_ptr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-434"></a>      <span class='hs-varid'>zero_regex_ptr</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>c_memset</span> <span class='hs-varid'>raw_regex_ptr</span> <span class='hs-num'>0</span> <span class='hs-layout'>(</span><span class='hs-num'>64</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- no calloc, so clear the new area to zero</span>
<a name="line-435"></a><span class='hs-comment'>{-# LINE 479 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-436"></a>      <span class='hs-varid'>regex_fptr</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newForeignPtr</span> <span class='hs-varid'>c_myregfree</span> <span class='hs-varid'>zero_regex_ptr</span> <span class='hs-comment'>-- once pointed-to area is clear it should be safe to add finalizer</span>
<a name="line-437"></a>      <span class='hs-varid'>withForeignPtr</span> <span class='hs-varid'>regex_fptr</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>regex_ptr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>  <span class='hs-comment'>-- withForeignPtr is best hygiene here</span>
<a name="line-438"></a>        <span class='hs-varid'>errCode</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>c_regcomp</span> <span class='hs-varid'>regex_ptr</span> <span class='hs-varid'>pattern</span> <span class='hs-varid'>flags</span>
<a name="line-439"></a>        <span class='hs-keyword'>if</span> <span class='hs-layout'>(</span><span class='hs-varid'>errCode</span> <span class='hs-varop'>==</span> <span class='hs-varid'>retOk</span><span class='hs-layout'>)</span>
<a name="line-440"></a>          <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Right</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Regex</span> <span class='hs-varid'>regex_fptr</span> <span class='hs-varid'>flags</span> <span class='hs-varid'>e</span>
<a name="line-441"></a>          <span class='hs-keyword'>else</span> <span class='hs-varid'>wrapError</span> <span class='hs-varid'>errCode</span> <span class='hs-varid'>regex_ptr</span>
<a name="line-442"></a>
<a name="line-443"></a><span class='hs-comment'>---------</span>
<a name="line-444"></a><span class='hs-definition'>wrapTest</span> <span class='hs-layout'>(</span><span class='hs-conid'>Regex</span> <span class='hs-varid'>regex_fptr</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>flags</span><span class='hs-layout'>)</span> <span class='hs-varid'>cstr</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-445"></a> <span class='hs-varid'>nullTest</span> <span class='hs-varid'>cstr</span> <span class='hs-str'>"wrapTest"</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-446"></a>  <span class='hs-varid'>withForeignPtr</span> <span class='hs-varid'>regex_fptr</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>regex_ptr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-447"></a>    <span class='hs-varid'>r</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>c_regexec</span> <span class='hs-varid'>regex_ptr</span> <span class='hs-varid'>cstr</span> <span class='hs-num'>0</span> <span class='hs-varid'>nullPtr</span> <span class='hs-varid'>flags</span>
<a name="line-448"></a>    <span class='hs-keyword'>if</span> <span class='hs-varid'>r</span> <span class='hs-varop'>==</span> <span class='hs-varid'>retOk</span>
<a name="line-449"></a>      <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-conid'>True</span><span class='hs-layout'>)</span>
<a name="line-450"></a>      <span class='hs-keyword'>else</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>r</span> <span class='hs-varop'>==</span> <span class='hs-varid'>retNoMatch</span>
<a name="line-451"></a>              <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-conid'>False</span><span class='hs-layout'>)</span>
<a name="line-452"></a>              <span class='hs-keyword'>else</span> <span class='hs-varid'>wrapError</span> <span class='hs-varid'>r</span> <span class='hs-varid'>regex_ptr</span>
<a name="line-453"></a>
<a name="line-454"></a><span class='hs-comment'>---------</span>
<a name="line-455"></a><span class='hs-definition'>wrapMatch</span> <span class='hs-varid'>regex</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Regex</span> <span class='hs-varid'>regex_fptr</span> <span class='hs-varid'>compileOptions</span> <span class='hs-varid'>flags</span><span class='hs-layout'>)</span> <span class='hs-varid'>cstr</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-456"></a> <span class='hs-varid'>nullTest</span> <span class='hs-varid'>cstr</span> <span class='hs-str'>"wrapMatch cstr"</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-457"></a>  <span class='hs-keyword'>if</span> <span class='hs-layout'>(</span><span class='hs-num'>0</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>compNoSub</span> <span class='hs-varop'>.&amp;.</span> <span class='hs-varid'>compileOptions</span><span class='hs-layout'>)</span>
<a name="line-458"></a>    <span class='hs-keyword'>then</span> <span class='hs-keyword'>do</span>
<a name="line-459"></a>      <span class='hs-varid'>r</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>wrapTest</span> <span class='hs-varid'>regex</span> <span class='hs-varid'>cstr</span>
<a name="line-460"></a>      <span class='hs-keyword'>case</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>of</span>
<a name="line-461"></a>        <span class='hs-conid'>Right</span> <span class='hs-conid'>True</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- Source of much "wtf?" crap</span>
<a name="line-462"></a>        <span class='hs-conid'>Right</span> <span class='hs-conid'>False</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span>
<a name="line-463"></a>        <span class='hs-conid'>Left</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span>
<a name="line-464"></a>    <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span>
<a name="line-465"></a>      <span class='hs-varid'>withForeignPtr</span> <span class='hs-varid'>regex_fptr</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>regex_ptr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-466"></a>        <span class='hs-varid'>nsub</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>hsc_ptr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>peekByteOff</span> <span class='hs-varid'>hsc_ptr</span> <span class='hs-num'>48</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>regex_ptr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>CSize</span>
<a name="line-467"></a><span class='hs-comment'>{-# LINE 510 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-468"></a>        <span class='hs-keyword'>let</span> <span class='hs-varid'>nsub_int</span><span class='hs-layout'>,</span><span class='hs-varid'>nsub_bytes</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
<a name="line-469"></a>            <span class='hs-varid'>nsub_int</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>nsub</span>
<a name="line-470"></a>            <span class='hs-varid'>nsub_bytes</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>nsub_int</span><span class='hs-layout'>)</span> <span class='hs-varop'>*</span> <span class='hs-layout'>(</span><span class='hs-num'>8</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-471"></a><span class='hs-comment'>{-# LINE 513 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-472"></a>        <span class='hs-comment'>-- add one because index zero covers the whole match</span>
<a name="line-473"></a>        <span class='hs-varid'>allocaBytes</span> <span class='hs-varid'>nsub_bytes</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>p_match</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-474"></a>         <span class='hs-varid'>nullTest</span> <span class='hs-varid'>p_match</span> <span class='hs-str'>"wrapMatch allocaBytes"</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-475"></a>          <span class='hs-varid'>doMatch</span> <span class='hs-varid'>regex_ptr</span> <span class='hs-varid'>cstr</span> <span class='hs-varid'>nsub</span> <span class='hs-varid'>p_match</span> <span class='hs-varid'>flags</span>
<a name="line-476"></a>
<a name="line-477"></a><a name="doMatch"></a><span class='hs-comment'>-- Very very thin wrapper</span>
<a name="line-478"></a><span class='hs-comment'>-- Requires, but does not check, that nsub&gt;=0</span>
<a name="line-479"></a><span class='hs-comment'>-- Cannot return (Right (Just []))</span>
<a name="line-480"></a><span class='hs-definition'>doMatch</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ptr</span> <span class='hs-conid'>CRegex</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CSize</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Ptr</span> <span class='hs-conid'>CRegMatch</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExecOption</span>
<a name="line-481"></a>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Either</span> <span class='hs-conid'>WrapError</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>RegOffset</span><span class='hs-layout'>,</span><span class='hs-conid'>RegOffset</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-482"></a><span class='hs-comment'>{-# INLINE doMatch #-}</span>
<a name="line-483"></a><span class='hs-definition'>doMatch</span> <span class='hs-varid'>regex_ptr</span> <span class='hs-varid'>cstr</span> <span class='hs-varid'>nsub</span> <span class='hs-varid'>p_match</span> <span class='hs-varid'>flags</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-484"></a>  <span class='hs-varid'>r</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>c_regexec</span> <span class='hs-varid'>regex_ptr</span> <span class='hs-varid'>cstr</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>nsub</span><span class='hs-layout'>)</span> <span class='hs-varid'>p_match</span> <span class='hs-varid'>flags</span>
<a name="line-485"></a>  <span class='hs-keyword'>if</span> <span class='hs-varid'>r</span> <span class='hs-varop'>==</span> <span class='hs-varid'>retOk</span>
<a name="line-486"></a>    <span class='hs-keyword'>then</span> <span class='hs-keyword'>do</span>
<a name="line-487"></a>       <span class='hs-varid'>regions</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>getOffsets</span> <span class='hs-varop'>.</span> <span class='hs-varid'>take</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>+</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>nsub</span><span class='hs-layout'>)</span>
<a name="line-488"></a>                  <span class='hs-varop'>.</span> <span class='hs-varid'>iterate</span> <span class='hs-layout'>(</span><span class='hs-varop'>`plusPtr`</span> <span class='hs-layout'>(</span><span class='hs-num'>8</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>p_match</span>
<a name="line-489"></a><span class='hs-comment'>{-# LINE 530 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-490"></a>       <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>regions</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- regions will not be []</span>
<a name="line-491"></a>    <span class='hs-keyword'>else</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>r</span> <span class='hs-varop'>==</span> <span class='hs-varid'>retNoMatch</span>
<a name="line-492"></a>       <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span>
<a name="line-493"></a>       <span class='hs-keyword'>else</span> <span class='hs-varid'>wrapError</span> <span class='hs-varid'>r</span> <span class='hs-varid'>regex_ptr</span>
<a name="line-494"></a>  <span class='hs-keyword'>where</span>
<a name="line-495"></a>    <span class='hs-varid'>getOffsets</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ptr</span> <span class='hs-conid'>CRegMatch</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>RegOffset</span><span class='hs-layout'>,</span><span class='hs-conid'>RegOffset</span><span class='hs-layout'>)</span>
<a name="line-496"></a>    <span class='hs-comment'>{-# INLINE getOffsets #-}</span>
<a name="line-497"></a>    <span class='hs-varid'>getOffsets</span> <span class='hs-varid'>pmatch'</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-498"></a>      <span class='hs-varid'>start</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>hsc_ptr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>peekByteOff</span> <span class='hs-varid'>hsc_ptr</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>pmatch'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int32</span><span class='hs-layout'>)</span>
<a name="line-499"></a><span class='hs-comment'>{-# LINE 539 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-500"></a>      <span class='hs-varid'>end</span>   <span class='hs-keyglyph'>&lt;-</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>hsc_ptr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>peekByteOff</span> <span class='hs-varid'>hsc_ptr</span> <span class='hs-num'>4</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>pmatch'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int32</span><span class='hs-layout'>)</span>
<a name="line-501"></a><span class='hs-comment'>{-# LINE 540 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-502"></a>      <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>start</span><span class='hs-layout'>,</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>end</span><span class='hs-layout'>)</span>
<a name="line-503"></a>
<a name="line-504"></a><span class='hs-definition'>wrapMatchAll</span> <span class='hs-varid'>regex</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Regex</span> <span class='hs-varid'>regex_fptr</span> <span class='hs-varid'>compileOptions</span> <span class='hs-varid'>flags</span><span class='hs-layout'>)</span> <span class='hs-varid'>cstr</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-505"></a> <span class='hs-varid'>nullTest</span> <span class='hs-varid'>cstr</span> <span class='hs-str'>"wrapMatchAll cstr"</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-506"></a>  <span class='hs-keyword'>if</span> <span class='hs-layout'>(</span><span class='hs-num'>0</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>compNoSub</span> <span class='hs-varop'>.&amp;.</span> <span class='hs-varid'>compileOptions</span><span class='hs-layout'>)</span>
<a name="line-507"></a>    <span class='hs-keyword'>then</span> <span class='hs-keyword'>do</span>
<a name="line-508"></a>      <span class='hs-varid'>r</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>wrapTest</span> <span class='hs-varid'>regex</span> <span class='hs-varid'>cstr</span>
<a name="line-509"></a>      <span class='hs-keyword'>case</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>of</span>
<a name="line-510"></a>        <span class='hs-conid'>Right</span> <span class='hs-conid'>True</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>toMA</span> <span class='hs-num'>0</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- Source of much "wtf?" crap</span>
<a name="line-511"></a>        <span class='hs-conid'>Right</span> <span class='hs-conid'>False</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span>
<a name="line-512"></a>        <span class='hs-conid'>Left</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span>
<a name="line-513"></a>    <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span>
<a name="line-514"></a>      <span class='hs-varid'>withForeignPtr</span> <span class='hs-varid'>regex_fptr</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>regex_ptr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-515"></a>        <span class='hs-varid'>nsub</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>hsc_ptr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>peekByteOff</span> <span class='hs-varid'>hsc_ptr</span> <span class='hs-num'>48</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>regex_ptr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>CSize</span>
<a name="line-516"></a><span class='hs-comment'>{-# LINE 554 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-517"></a>        <span class='hs-keyword'>let</span> <span class='hs-varid'>nsub_int</span><span class='hs-layout'>,</span><span class='hs-varid'>nsub_bytes</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
<a name="line-518"></a>            <span class='hs-varid'>nsub_int</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>nsub</span>
<a name="line-519"></a>            <span class='hs-varid'>nsub_bytes</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>nsub_int</span><span class='hs-layout'>)</span> <span class='hs-varop'>*</span> <span class='hs-layout'>(</span><span class='hs-num'>8</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-520"></a><span class='hs-comment'>{-# LINE 557 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-521"></a>        <span class='hs-comment'>-- add one because index zero covers the whole match</span>
<a name="line-522"></a>        <span class='hs-varid'>allocaBytes</span> <span class='hs-varid'>nsub_bytes</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>p_match</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-523"></a>         <span class='hs-varid'>nullTest</span> <span class='hs-varid'>p_match</span> <span class='hs-str'>"wrapMatchAll p_match"</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-524"></a>          <span class='hs-keyword'>let</span> <span class='hs-varid'>flagsBOL</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>complement</span> <span class='hs-varid'>execNotBOL</span><span class='hs-layout'>)</span> <span class='hs-varop'>.&amp;.</span> <span class='hs-varid'>flags</span>
<a name="line-525"></a>              <span class='hs-varid'>flagsMIDDLE</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>execNotBOL</span> <span class='hs-varop'>.|.</span> <span class='hs-varid'>flags</span>
<a name="line-526"></a>              <span class='hs-varid'>atBOL</span> <span class='hs-varid'>pos</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>doMatch</span> <span class='hs-varid'>regex_ptr</span> <span class='hs-layout'>(</span><span class='hs-varid'>plusPtr</span> <span class='hs-varid'>cstr</span> <span class='hs-varid'>pos</span><span class='hs-layout'>)</span> <span class='hs-varid'>nsub</span> <span class='hs-varid'>p_match</span> <span class='hs-varid'>flagsBOL</span>
<a name="line-527"></a>              <span class='hs-varid'>atMIDDLE</span> <span class='hs-varid'>pos</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>doMatch</span> <span class='hs-varid'>regex_ptr</span> <span class='hs-layout'>(</span><span class='hs-varid'>plusPtr</span> <span class='hs-varid'>cstr</span> <span class='hs-varid'>pos</span><span class='hs-layout'>)</span> <span class='hs-varid'>nsub</span> <span class='hs-varid'>p_match</span> <span class='hs-varid'>flagsMIDDLE</span>
<a name="line-528"></a>              <span class='hs-varid'>loop</span> <span class='hs-varid'>acc</span> <span class='hs-varid'>old</span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>acc</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>old</span> <span class='hs-varop'>`seq`</span> <span class='hs-conid'>False</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>undefined</span>
<a name="line-529"></a>                                 <span class='hs-keyglyph'>|</span> <span class='hs-varid'>s</span> <span class='hs-varop'>==</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-530"></a>                <span class='hs-keyword'>let</span> <span class='hs-varid'>pos</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>old</span> <span class='hs-varop'>+</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>e</span> <span class='hs-comment'>-- pos may be 0</span>
<a name="line-531"></a>                <span class='hs-varid'>atEnd</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>isNull</span> <span class='hs-varid'>cstr</span> <span class='hs-varid'>pos</span>
<a name="line-532"></a>                <span class='hs-keyword'>if</span> <span class='hs-varid'>atEnd</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-varid'>acc</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-533"></a>                  <span class='hs-keyword'>else</span> <span class='hs-varid'>loop</span> <span class='hs-varid'>acc</span> <span class='hs-varid'>old</span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-layout'>,</span><span class='hs-varid'>succ</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span>
<a name="line-534"></a>                                 <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-535"></a>                <span class='hs-keyword'>let</span> <span class='hs-varid'>pos</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>old</span> <span class='hs-varop'>+</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>e</span> <span class='hs-comment'>-- pos must be greater than 0 (tricky but true)</span>
<a name="line-536"></a>                <span class='hs-varid'>prev'newline</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>isNewline</span> <span class='hs-varid'>cstr</span> <span class='hs-layout'>(</span><span class='hs-varid'>pred</span> <span class='hs-varid'>pos</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- safe</span>
<a name="line-537"></a>                <span class='hs-varid'>result</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>prev'newline</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>atBOL</span> <span class='hs-varid'>pos</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>atMIDDLE</span> <span class='hs-varid'>pos</span>
<a name="line-538"></a>                <span class='hs-keyword'>case</span> <span class='hs-varid'>result</span> <span class='hs-keyword'>of</span>
<a name="line-539"></a>                  <span class='hs-conid'>Right</span> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-varid'>acc</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-540"></a>                  <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>parts</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-varid'>whole</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>ma</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>toMA</span> <span class='hs-varid'>pos</span> <span class='hs-varid'>parts</span>
<a name="line-541"></a>                                                 <span class='hs-keyword'>in</span> <span class='hs-varid'>loop</span> <span class='hs-layout'>(</span><span class='hs-varid'>acc</span><span class='hs-varop'>.</span><span class='hs-layout'>(</span><span class='hs-varid'>ma</span><span class='hs-conop'>:</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>pos</span> <span class='hs-varid'>whole</span>
<a name="line-542"></a>                  <span class='hs-conid'>Left</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span>
<a name="line-543"></a>                  <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-varid'>acc</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>toMA</span> <span class='hs-varid'>pos</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- should never happen</span>
<a name="line-544"></a>          <span class='hs-varid'>result</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>doMatch</span> <span class='hs-varid'>regex_ptr</span> <span class='hs-varid'>cstr</span> <span class='hs-varid'>nsub</span> <span class='hs-varid'>p_match</span> <span class='hs-varid'>flags</span>
<a name="line-545"></a>          <span class='hs-keyword'>case</span> <span class='hs-varid'>result</span> <span class='hs-keyword'>of</span>
<a name="line-546"></a>            <span class='hs-conid'>Right</span> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span>
<a name="line-547"></a>            <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>parts</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-varid'>whole</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>ma</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>toMA</span> <span class='hs-num'>0</span> <span class='hs-varid'>parts</span>
<a name="line-548"></a>                                            <span class='hs-keyword'>in</span> <span class='hs-varid'>loop</span> <span class='hs-layout'>(</span><span class='hs-varid'>ma</span><span class='hs-conop'>:</span><span class='hs-layout'>)</span> <span class='hs-num'>0</span> <span class='hs-varid'>whole</span>
<a name="line-549"></a>            <span class='hs-conid'>Left</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span>
<a name="line-550"></a>            <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>toMA</span> <span class='hs-num'>0</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- should never happen</span>
<a name="line-551"></a>  <span class='hs-keyword'>where</span>
<a name="line-552"></a>    <span class='hs-varid'>toMA</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>RegOffset</span><span class='hs-layout'>,</span><span class='hs-conid'>RegOffset</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Array</span> <span class='hs-conid'>Int</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int</span><span class='hs-layout'>,</span><span class='hs-conid'>Int</span><span class='hs-layout'>)</span>
<a name="line-553"></a>    <span class='hs-varid'>toMA</span> <span class='hs-varid'>pos</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>listArray</span> <span class='hs-layout'>(</span><span class='hs-num'>0</span><span class='hs-layout'>,</span><span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>pos</span><span class='hs-layout'>,</span><span class='hs-num'>0</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- wtf?</span>
<a name="line-554"></a>    <span class='hs-varid'>toMA</span> <span class='hs-varid'>pos</span> <span class='hs-varid'>parts</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>listArray</span> <span class='hs-layout'>(</span><span class='hs-num'>0</span><span class='hs-layout'>,</span><span class='hs-varid'>pred</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>parts</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-555"></a>      <span class='hs-varop'>.</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>s</span><span class='hs-varop'>&gt;=</span><span class='hs-num'>0</span> <span class='hs-keyword'>then</span> <span class='hs-layout'>(</span><span class='hs-varid'>pos</span><span class='hs-varop'>+</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>s</span><span class='hs-layout'>,</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>e</span><span class='hs-comment'>-</span><span class='hs-varid'>s</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyword'>else</span> <span class='hs-layout'>(</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>,</span><span class='hs-num'>0</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-556"></a>      <span class='hs-varop'>$</span> <span class='hs-varid'>parts</span>
<a name="line-557"></a>
<a name="line-558"></a><span class='hs-comment'>---------</span>
<a name="line-559"></a><span class='hs-definition'>wrapCount</span> <span class='hs-varid'>regex</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Regex</span> <span class='hs-varid'>regex_fptr</span> <span class='hs-varid'>compileOptions</span> <span class='hs-varid'>flags</span><span class='hs-layout'>)</span> <span class='hs-varid'>cstr</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-560"></a> <span class='hs-varid'>nullTest</span> <span class='hs-varid'>cstr</span> <span class='hs-str'>"wrapCount cstr"</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-561"></a>  <span class='hs-keyword'>if</span> <span class='hs-layout'>(</span><span class='hs-num'>0</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>compNoSub</span> <span class='hs-varop'>.&amp;.</span> <span class='hs-varid'>compileOptions</span><span class='hs-layout'>)</span>
<a name="line-562"></a>    <span class='hs-keyword'>then</span> <span class='hs-keyword'>do</span>
<a name="line-563"></a>      <span class='hs-varid'>r</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>wrapTest</span> <span class='hs-varid'>regex</span> <span class='hs-varid'>cstr</span>
<a name="line-564"></a>      <span class='hs-keyword'>case</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>of</span>
<a name="line-565"></a>        <span class='hs-conid'>Right</span> <span class='hs-conid'>True</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-566"></a>        <span class='hs-conid'>Right</span> <span class='hs-conid'>False</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span>
<a name="line-567"></a>        <span class='hs-conid'>Left</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span>
<a name="line-568"></a>    <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span>
<a name="line-569"></a>      <span class='hs-varid'>withForeignPtr</span> <span class='hs-varid'>regex_fptr</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>regex_ptr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-570"></a>        <span class='hs-keyword'>let</span> <span class='hs-varid'>nsub_bytes</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-num'>8</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-571"></a><span class='hs-comment'>{-# LINE 607 "Text/Regex/Posix/Wrap.hsc" #-}</span>
<a name="line-572"></a>        <span class='hs-varid'>allocaBytes</span> <span class='hs-varid'>nsub_bytes</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>p_match</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-573"></a>         <span class='hs-varid'>nullTest</span> <span class='hs-varid'>p_match</span> <span class='hs-str'>"wrapCount p_match"</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-574"></a>          <span class='hs-keyword'>let</span> <span class='hs-varid'>flagsBOL</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>complement</span> <span class='hs-varid'>execNotBOL</span><span class='hs-layout'>)</span> <span class='hs-varop'>.&amp;.</span> <span class='hs-varid'>flags</span>
<a name="line-575"></a>              <span class='hs-varid'>flagsMIDDLE</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>execNotBOL</span> <span class='hs-varop'>.|.</span> <span class='hs-varid'>flags</span>
<a name="line-576"></a>              <span class='hs-varid'>atBOL</span> <span class='hs-varid'>pos</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>doMatch</span> <span class='hs-varid'>regex_ptr</span> <span class='hs-layout'>(</span><span class='hs-varid'>plusPtr</span> <span class='hs-varid'>cstr</span> <span class='hs-varid'>pos</span><span class='hs-layout'>)</span> <span class='hs-num'>0</span> <span class='hs-varid'>p_match</span> <span class='hs-varid'>flagsBOL</span>
<a name="line-577"></a>              <span class='hs-varid'>atMIDDLE</span> <span class='hs-varid'>pos</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>doMatch</span> <span class='hs-varid'>regex_ptr</span> <span class='hs-layout'>(</span><span class='hs-varid'>plusPtr</span> <span class='hs-varid'>cstr</span> <span class='hs-varid'>pos</span><span class='hs-layout'>)</span> <span class='hs-num'>0</span> <span class='hs-varid'>p_match</span> <span class='hs-varid'>flagsMIDDLE</span>
<a name="line-578"></a>              <span class='hs-varid'>loop</span> <span class='hs-varid'>acc</span> <span class='hs-varid'>old</span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>acc</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>old</span> <span class='hs-varop'>`seq`</span> <span class='hs-conid'>False</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>undefined</span>
<a name="line-579"></a>                                 <span class='hs-keyglyph'>|</span> <span class='hs-varid'>s</span> <span class='hs-varop'>==</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-580"></a>                <span class='hs-keyword'>let</span> <span class='hs-varid'>pos</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>old</span> <span class='hs-varop'>+</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>e</span> <span class='hs-comment'>-- 0 &lt;= pos</span>
<a name="line-581"></a>                <span class='hs-varid'>atEnd</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>isNull</span> <span class='hs-varid'>cstr</span> <span class='hs-varid'>pos</span>
<a name="line-582"></a>                <span class='hs-keyword'>if</span> <span class='hs-varid'>atEnd</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-varid'>acc</span><span class='hs-layout'>)</span>
<a name="line-583"></a>                  <span class='hs-keyword'>else</span> <span class='hs-varid'>loop</span> <span class='hs-varid'>acc</span> <span class='hs-varid'>old</span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-layout'>,</span><span class='hs-varid'>succ</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span>
<a name="line-584"></a>                                 <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-585"></a>                <span class='hs-keyword'>let</span> <span class='hs-varid'>pos</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>old</span> <span class='hs-varop'>+</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>e</span> <span class='hs-comment'>-- 0 &lt; pos</span>
<a name="line-586"></a>                <span class='hs-varid'>prev'newline</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>isNewline</span> <span class='hs-varid'>cstr</span> <span class='hs-layout'>(</span><span class='hs-varid'>pred</span> <span class='hs-varid'>pos</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- safe</span>
<a name="line-587"></a>                <span class='hs-varid'>result</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>prev'newline</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>atBOL</span> <span class='hs-varid'>pos</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>atMIDDLE</span> <span class='hs-varid'>pos</span>
<a name="line-588"></a>                <span class='hs-keyword'>case</span> <span class='hs-varid'>result</span> <span class='hs-keyword'>of</span>
<a name="line-589"></a>                  <span class='hs-conid'>Right</span> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-varid'>acc</span><span class='hs-layout'>)</span>
<a name="line-590"></a>                  <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>whole</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>loop</span> <span class='hs-layout'>(</span><span class='hs-varid'>succ</span> <span class='hs-varid'>acc</span><span class='hs-layout'>)</span> <span class='hs-varid'>pos</span> <span class='hs-varid'>whole</span>
<a name="line-591"></a>                  <span class='hs-conid'>Left</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span>
<a name="line-592"></a>                  <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-varid'>acc</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- should never happen</span>
<a name="line-593"></a>          <span class='hs-varid'>result</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>doMatch</span> <span class='hs-varid'>regex_ptr</span> <span class='hs-varid'>cstr</span> <span class='hs-num'>0</span> <span class='hs-varid'>p_match</span> <span class='hs-varid'>flags</span>
<a name="line-594"></a>          <span class='hs-keyword'>case</span> <span class='hs-varid'>result</span> <span class='hs-keyword'>of</span>
<a name="line-595"></a>            <span class='hs-conid'>Right</span> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span>
<a name="line-596"></a>            <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>whole</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>loop</span> <span class='hs-num'>1</span> <span class='hs-num'>0</span> <span class='hs-varid'>whole</span>
<a name="line-597"></a>            <span class='hs-conid'>Left</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Left</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span>
<a name="line-598"></a>            <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- should never happen</span>
<a name="line-599"></a>
<a name="line-600"></a><span class='hs-comment'>{-
<a name="line-601"></a>
<a name="line-602"></a>-- This is the slower 0.66 version of the code (91s instead of 79s on 10^6 bytes)
<a name="line-603"></a>
<a name="line-604"></a>wrapMatchAll regex cstr = do
<a name="line-605"></a>  let regex' = setExecOpts (execNotBOL .|. (getExecOpts regex)) regex
<a name="line-606"></a>      at pos = wrapMatch regex' (plusPtr cstr pos)
<a name="line-607"></a>      loop old (s,e) | s == e = return []
<a name="line-608"></a>                     | otherwise = do
<a name="line-609"></a>        let pos = old + fromIntegral e
<a name="line-610"></a>        result &lt;- at pos
<a name="line-611"></a>        case unwrap result of
<a name="line-612"></a>          Nothing -&gt; return []
<a name="line-613"></a>          Just [] -&gt; return ((toMA pos []):[]) -- wtf?
<a name="line-614"></a>          Just parts@(whole:_) -&gt; do rest &lt;- loop pos whole
<a name="line-615"></a>                                     return ((toMA pos parts) : rest)
<a name="line-616"></a>  result &lt;- wrapMatch regex cstr
<a name="line-617"></a>  case unwrap result of
<a name="line-618"></a>    Nothing -&gt; return []
<a name="line-619"></a>    Just [] -&gt; return ((toMA 0 []):[]) -- wtf?
<a name="line-620"></a>    Just parts@(whole:_) -&gt; do rest &lt;- loop 0 whole
<a name="line-621"></a>                               return ((toMA 0 parts) : rest)
<a name="line-622"></a>---------
<a name="line-623"></a>-- This was also changed to match wrapMatchAll after 0.66
<a name="line-624"></a>wrapCount regex cstr = do
<a name="line-625"></a>  let regex' = setExecOpts (execNotBOL .|. (getExecOpts regex)) regex
<a name="line-626"></a>      at pos = wrapMatch regex' (plusPtr cstr pos)
<a name="line-627"></a>      loop acc old (s,e) | acc `seq` old `seq` False = undefined
<a name="line-628"></a>                         | s == e = return acc
<a name="line-629"></a>                         | otherwise = do
<a name="line-630"></a>        let pos = old + fromIntegral e
<a name="line-631"></a>        result &lt;- at pos
<a name="line-632"></a>        case unwrap result of
<a name="line-633"></a>          Nothing -&gt; return acc
<a name="line-634"></a>          Just [] -&gt; return (succ acc) -- wtf?
<a name="line-635"></a>          Just (whole:_) -&gt; loop (succ acc) pos whole
<a name="line-636"></a>  result &lt;- wrapMatch regex cstr
<a name="line-637"></a>  case unwrap result of
<a name="line-638"></a>    Nothing -&gt; return 0
<a name="line-639"></a>    Just [] -&gt; return 1 -- wtf?
<a name="line-640"></a>    Just (whole:_) -&gt; loop 1 0 whole
<a name="line-641"></a>-}</span>
</pre></body>
</html>