Fossil SCM

fossil-scm / src / cmark_amalgamation.c
Blame History Raw 18983 lines
1
#include <stdlib.h>
2
#include <assert.h>
3
#include <stdio.h>
4
#include "cmark_amalgamation.h"
5
6
int cmark_version() { return CMARK_VERSION; }
7
8
/* Generated by re2c 0.16 */
9
bufsize_t _scan_at(bufsize_t (*scanner)(const unsigned char *), cmark_chunk *c,
10
bufsize_t offset) {
11
bufsize_t res;
12
unsigned char *ptr = (unsigned char *)c->data;
13
14
if (ptr == NULL || offset > c->len) {
15
return 0;
16
} else {
17
unsigned char lim = ptr[c->len];
18
19
ptr[c->len] = '\0';
20
res = scanner(ptr + offset);
21
ptr[c->len] = lim;
22
}
23
24
return res;
25
}
26
27
// Try to match a scheme including colon.
28
bufsize_t _scan_scheme(const unsigned char *p) {
29
const unsigned char *marker = NULL;
30
const unsigned char *start = p;
31
32
{
33
unsigned char yych;
34
yych = *p;
35
if (yych <= '@')
36
goto yy2;
37
if (yych <= 'Z')
38
goto yy4;
39
if (yych <= '`')
40
goto yy2;
41
if (yych <= 'z')
42
goto yy4;
43
yy2:
44
++p;
45
yy3 : { return 0; }
46
yy4:
47
yych = *(marker = ++p);
48
if (yych <= '/') {
49
if (yych <= '+') {
50
if (yych <= '*')
51
goto yy3;
52
} else {
53
if (yych <= ',')
54
goto yy3;
55
if (yych >= '/')
56
goto yy3;
57
}
58
} else {
59
if (yych <= 'Z') {
60
if (yych <= '9')
61
goto yy5;
62
if (yych <= '@')
63
goto yy3;
64
} else {
65
if (yych <= '`')
66
goto yy3;
67
if (yych >= '{')
68
goto yy3;
69
}
70
}
71
yy5:
72
yych = *++p;
73
if (yych <= '9') {
74
if (yych <= ',') {
75
if (yych == '+')
76
goto yy7;
77
} else {
78
if (yych != '/')
79
goto yy7;
80
}
81
} else {
82
if (yych <= 'Z') {
83
if (yych <= ':')
84
goto yy8;
85
if (yych >= 'A')
86
goto yy7;
87
} else {
88
if (yych <= '`')
89
goto yy6;
90
if (yych <= 'z')
91
goto yy7;
92
}
93
}
94
yy6:
95
p = marker;
96
goto yy3;
97
yy7:
98
yych = *++p;
99
if (yych <= '9') {
100
if (yych <= ',') {
101
if (yych == '+')
102
goto yy10;
103
goto yy6;
104
} else {
105
if (yych == '/')
106
goto yy6;
107
goto yy10;
108
}
109
} else {
110
if (yych <= 'Z') {
111
if (yych <= ':')
112
goto yy8;
113
if (yych <= '@')
114
goto yy6;
115
goto yy10;
116
} else {
117
if (yych <= '`')
118
goto yy6;
119
if (yych <= 'z')
120
goto yy10;
121
goto yy6;
122
}
123
}
124
yy8:
125
++p;
126
{ return (bufsize_t)(p - start); }
127
yy10:
128
yych = *++p;
129
if (yych <= '9') {
130
if (yych <= ',') {
131
if (yych != '+')
132
goto yy6;
133
} else {
134
if (yych == '/')
135
goto yy6;
136
}
137
} else {
138
if (yych <= 'Z') {
139
if (yych <= ':')
140
goto yy8;
141
if (yych <= '@')
142
goto yy6;
143
} else {
144
if (yych <= '`')
145
goto yy6;
146
if (yych >= '{')
147
goto yy6;
148
}
149
}
150
yych = *++p;
151
if (yych <= '9') {
152
if (yych <= ',') {
153
if (yych != '+')
154
goto yy6;
155
} else {
156
if (yych == '/')
157
goto yy6;
158
}
159
} else {
160
if (yych <= 'Z') {
161
if (yych <= ':')
162
goto yy8;
163
if (yych <= '@')
164
goto yy6;
165
} else {
166
if (yych <= '`')
167
goto yy6;
168
if (yych >= '{')
169
goto yy6;
170
}
171
}
172
yych = *++p;
173
if (yych <= '9') {
174
if (yych <= ',') {
175
if (yych != '+')
176
goto yy6;
177
} else {
178
if (yych == '/')
179
goto yy6;
180
}
181
} else {
182
if (yych <= 'Z') {
183
if (yych <= ':')
184
goto yy8;
185
if (yych <= '@')
186
goto yy6;
187
} else {
188
if (yych <= '`')
189
goto yy6;
190
if (yych >= '{')
191
goto yy6;
192
}
193
}
194
yych = *++p;
195
if (yych <= '9') {
196
if (yych <= ',') {
197
if (yych != '+')
198
goto yy6;
199
} else {
200
if (yych == '/')
201
goto yy6;
202
}
203
} else {
204
if (yych <= 'Z') {
205
if (yych <= ':')
206
goto yy8;
207
if (yych <= '@')
208
goto yy6;
209
} else {
210
if (yych <= '`')
211
goto yy6;
212
if (yych >= '{')
213
goto yy6;
214
}
215
}
216
yych = *++p;
217
if (yych <= '9') {
218
if (yych <= ',') {
219
if (yych != '+')
220
goto yy6;
221
} else {
222
if (yych == '/')
223
goto yy6;
224
}
225
} else {
226
if (yych <= 'Z') {
227
if (yych <= ':')
228
goto yy8;
229
if (yych <= '@')
230
goto yy6;
231
} else {
232
if (yych <= '`')
233
goto yy6;
234
if (yych >= '{')
235
goto yy6;
236
}
237
}
238
yych = *++p;
239
if (yych <= '9') {
240
if (yych <= ',') {
241
if (yych != '+')
242
goto yy6;
243
} else {
244
if (yych == '/')
245
goto yy6;
246
}
247
} else {
248
if (yych <= 'Z') {
249
if (yych <= ':')
250
goto yy8;
251
if (yych <= '@')
252
goto yy6;
253
} else {
254
if (yych <= '`')
255
goto yy6;
256
if (yych >= '{')
257
goto yy6;
258
}
259
}
260
yych = *++p;
261
if (yych <= '9') {
262
if (yych <= ',') {
263
if (yych != '+')
264
goto yy6;
265
} else {
266
if (yych == '/')
267
goto yy6;
268
}
269
} else {
270
if (yych <= 'Z') {
271
if (yych <= ':')
272
goto yy8;
273
if (yych <= '@')
274
goto yy6;
275
} else {
276
if (yych <= '`')
277
goto yy6;
278
if (yych >= '{')
279
goto yy6;
280
}
281
}
282
yych = *++p;
283
if (yych <= '9') {
284
if (yych <= ',') {
285
if (yych != '+')
286
goto yy6;
287
} else {
288
if (yych == '/')
289
goto yy6;
290
}
291
} else {
292
if (yych <= 'Z') {
293
if (yych <= ':')
294
goto yy8;
295
if (yych <= '@')
296
goto yy6;
297
} else {
298
if (yych <= '`')
299
goto yy6;
300
if (yych >= '{')
301
goto yy6;
302
}
303
}
304
yych = *++p;
305
if (yych <= '9') {
306
if (yych <= ',') {
307
if (yych != '+')
308
goto yy6;
309
} else {
310
if (yych == '/')
311
goto yy6;
312
}
313
} else {
314
if (yych <= 'Z') {
315
if (yych <= ':')
316
goto yy8;
317
if (yych <= '@')
318
goto yy6;
319
} else {
320
if (yych <= '`')
321
goto yy6;
322
if (yych >= '{')
323
goto yy6;
324
}
325
}
326
yych = *++p;
327
if (yych <= '9') {
328
if (yych <= ',') {
329
if (yych != '+')
330
goto yy6;
331
} else {
332
if (yych == '/')
333
goto yy6;
334
}
335
} else {
336
if (yych <= 'Z') {
337
if (yych <= ':')
338
goto yy8;
339
if (yych <= '@')
340
goto yy6;
341
} else {
342
if (yych <= '`')
343
goto yy6;
344
if (yych >= '{')
345
goto yy6;
346
}
347
}
348
yych = *++p;
349
if (yych <= '9') {
350
if (yych <= ',') {
351
if (yych != '+')
352
goto yy6;
353
} else {
354
if (yych == '/')
355
goto yy6;
356
}
357
} else {
358
if (yych <= 'Z') {
359
if (yych <= ':')
360
goto yy8;
361
if (yych <= '@')
362
goto yy6;
363
} else {
364
if (yych <= '`')
365
goto yy6;
366
if (yych >= '{')
367
goto yy6;
368
}
369
}
370
yych = *++p;
371
if (yych <= '9') {
372
if (yych <= ',') {
373
if (yych != '+')
374
goto yy6;
375
} else {
376
if (yych == '/')
377
goto yy6;
378
}
379
} else {
380
if (yych <= 'Z') {
381
if (yych <= ':')
382
goto yy8;
383
if (yych <= '@')
384
goto yy6;
385
} else {
386
if (yych <= '`')
387
goto yy6;
388
if (yych >= '{')
389
goto yy6;
390
}
391
}
392
yych = *++p;
393
if (yych <= '9') {
394
if (yych <= ',') {
395
if (yych != '+')
396
goto yy6;
397
} else {
398
if (yych == '/')
399
goto yy6;
400
}
401
} else {
402
if (yych <= 'Z') {
403
if (yych <= ':')
404
goto yy8;
405
if (yych <= '@')
406
goto yy6;
407
} else {
408
if (yych <= '`')
409
goto yy6;
410
if (yych >= '{')
411
goto yy6;
412
}
413
}
414
yych = *++p;
415
if (yych <= '9') {
416
if (yych <= ',') {
417
if (yych != '+')
418
goto yy6;
419
} else {
420
if (yych == '/')
421
goto yy6;
422
}
423
} else {
424
if (yych <= 'Z') {
425
if (yych <= ':')
426
goto yy8;
427
if (yych <= '@')
428
goto yy6;
429
} else {
430
if (yych <= '`')
431
goto yy6;
432
if (yych >= '{')
433
goto yy6;
434
}
435
}
436
yych = *++p;
437
if (yych <= '9') {
438
if (yych <= ',') {
439
if (yych != '+')
440
goto yy6;
441
} else {
442
if (yych == '/')
443
goto yy6;
444
}
445
} else {
446
if (yych <= 'Z') {
447
if (yych <= ':')
448
goto yy8;
449
if (yych <= '@')
450
goto yy6;
451
} else {
452
if (yych <= '`')
453
goto yy6;
454
if (yych >= '{')
455
goto yy6;
456
}
457
}
458
yych = *++p;
459
if (yych <= '9') {
460
if (yych <= ',') {
461
if (yych != '+')
462
goto yy6;
463
} else {
464
if (yych == '/')
465
goto yy6;
466
}
467
} else {
468
if (yych <= 'Z') {
469
if (yych <= ':')
470
goto yy8;
471
if (yych <= '@')
472
goto yy6;
473
} else {
474
if (yych <= '`')
475
goto yy6;
476
if (yych >= '{')
477
goto yy6;
478
}
479
}
480
yych = *++p;
481
if (yych <= '9') {
482
if (yych <= ',') {
483
if (yych != '+')
484
goto yy6;
485
} else {
486
if (yych == '/')
487
goto yy6;
488
}
489
} else {
490
if (yych <= 'Z') {
491
if (yych <= ':')
492
goto yy8;
493
if (yych <= '@')
494
goto yy6;
495
} else {
496
if (yych <= '`')
497
goto yy6;
498
if (yych >= '{')
499
goto yy6;
500
}
501
}
502
yych = *++p;
503
if (yych <= '9') {
504
if (yych <= ',') {
505
if (yych != '+')
506
goto yy6;
507
} else {
508
if (yych == '/')
509
goto yy6;
510
}
511
} else {
512
if (yych <= 'Z') {
513
if (yych <= ':')
514
goto yy8;
515
if (yych <= '@')
516
goto yy6;
517
} else {
518
if (yych <= '`')
519
goto yy6;
520
if (yych >= '{')
521
goto yy6;
522
}
523
}
524
yych = *++p;
525
if (yych <= '9') {
526
if (yych <= ',') {
527
if (yych != '+')
528
goto yy6;
529
} else {
530
if (yych == '/')
531
goto yy6;
532
}
533
} else {
534
if (yych <= 'Z') {
535
if (yych <= ':')
536
goto yy8;
537
if (yych <= '@')
538
goto yy6;
539
} else {
540
if (yych <= '`')
541
goto yy6;
542
if (yych >= '{')
543
goto yy6;
544
}
545
}
546
yych = *++p;
547
if (yych <= '9') {
548
if (yych <= ',') {
549
if (yych != '+')
550
goto yy6;
551
} else {
552
if (yych == '/')
553
goto yy6;
554
}
555
} else {
556
if (yych <= 'Z') {
557
if (yych <= ':')
558
goto yy8;
559
if (yych <= '@')
560
goto yy6;
561
} else {
562
if (yych <= '`')
563
goto yy6;
564
if (yych >= '{')
565
goto yy6;
566
}
567
}
568
yych = *++p;
569
if (yych <= '9') {
570
if (yych <= ',') {
571
if (yych != '+')
572
goto yy6;
573
} else {
574
if (yych == '/')
575
goto yy6;
576
}
577
} else {
578
if (yych <= 'Z') {
579
if (yych <= ':')
580
goto yy8;
581
if (yych <= '@')
582
goto yy6;
583
} else {
584
if (yych <= '`')
585
goto yy6;
586
if (yych >= '{')
587
goto yy6;
588
}
589
}
590
yych = *++p;
591
if (yych <= '9') {
592
if (yych <= ',') {
593
if (yych != '+')
594
goto yy6;
595
} else {
596
if (yych == '/')
597
goto yy6;
598
}
599
} else {
600
if (yych <= 'Z') {
601
if (yych <= ':')
602
goto yy8;
603
if (yych <= '@')
604
goto yy6;
605
} else {
606
if (yych <= '`')
607
goto yy6;
608
if (yych >= '{')
609
goto yy6;
610
}
611
}
612
yych = *++p;
613
if (yych <= '9') {
614
if (yych <= ',') {
615
if (yych != '+')
616
goto yy6;
617
} else {
618
if (yych == '/')
619
goto yy6;
620
}
621
} else {
622
if (yych <= 'Z') {
623
if (yych <= ':')
624
goto yy8;
625
if (yych <= '@')
626
goto yy6;
627
} else {
628
if (yych <= '`')
629
goto yy6;
630
if (yych >= '{')
631
goto yy6;
632
}
633
}
634
yych = *++p;
635
if (yych <= '9') {
636
if (yych <= ',') {
637
if (yych != '+')
638
goto yy6;
639
} else {
640
if (yych == '/')
641
goto yy6;
642
}
643
} else {
644
if (yych <= 'Z') {
645
if (yych <= ':')
646
goto yy8;
647
if (yych <= '@')
648
goto yy6;
649
} else {
650
if (yych <= '`')
651
goto yy6;
652
if (yych >= '{')
653
goto yy6;
654
}
655
}
656
yych = *++p;
657
if (yych <= '9') {
658
if (yych <= ',') {
659
if (yych != '+')
660
goto yy6;
661
} else {
662
if (yych == '/')
663
goto yy6;
664
}
665
} else {
666
if (yych <= 'Z') {
667
if (yych <= ':')
668
goto yy8;
669
if (yych <= '@')
670
goto yy6;
671
} else {
672
if (yych <= '`')
673
goto yy6;
674
if (yych >= '{')
675
goto yy6;
676
}
677
}
678
yych = *++p;
679
if (yych <= '9') {
680
if (yych <= ',') {
681
if (yych != '+')
682
goto yy6;
683
} else {
684
if (yych == '/')
685
goto yy6;
686
}
687
} else {
688
if (yych <= 'Z') {
689
if (yych <= ':')
690
goto yy8;
691
if (yych <= '@')
692
goto yy6;
693
} else {
694
if (yych <= '`')
695
goto yy6;
696
if (yych >= '{')
697
goto yy6;
698
}
699
}
700
yych = *++p;
701
if (yych <= '9') {
702
if (yych <= ',') {
703
if (yych != '+')
704
goto yy6;
705
} else {
706
if (yych == '/')
707
goto yy6;
708
}
709
} else {
710
if (yych <= 'Z') {
711
if (yych <= ':')
712
goto yy8;
713
if (yych <= '@')
714
goto yy6;
715
} else {
716
if (yych <= '`')
717
goto yy6;
718
if (yych >= '{')
719
goto yy6;
720
}
721
}
722
yych = *++p;
723
if (yych <= '9') {
724
if (yych <= ',') {
725
if (yych != '+')
726
goto yy6;
727
} else {
728
if (yych == '/')
729
goto yy6;
730
}
731
} else {
732
if (yych <= 'Z') {
733
if (yych <= ':')
734
goto yy8;
735
if (yych <= '@')
736
goto yy6;
737
} else {
738
if (yych <= '`')
739
goto yy6;
740
if (yych >= '{')
741
goto yy6;
742
}
743
}
744
++p;
745
if ((yych = *p) == ':')
746
goto yy8;
747
goto yy6;
748
}
749
}
750
751
// Try to match URI autolink after first <, returning number of chars matched.
752
bufsize_t _scan_autolink_uri(const unsigned char *p) {
753
const unsigned char *marker = NULL;
754
const unsigned char *start = p;
755
756
{
757
unsigned char yych;
758
static const unsigned char yybm[] = {
759
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
760
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
761
0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128,
762
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
763
128, 128, 128, 128, 0, 128, 0, 128, 128, 128, 128, 128, 128, 128,
764
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
765
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
766
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
767
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
768
128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
769
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
770
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
771
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
772
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
773
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
774
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
775
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
776
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
777
0, 0, 0, 0,
778
};
779
yych = *p;
780
if (yych <= '@')
781
goto yy41;
782
if (yych <= 'Z')
783
goto yy43;
784
if (yych <= '`')
785
goto yy41;
786
if (yych <= 'z')
787
goto yy43;
788
yy41:
789
++p;
790
yy42 : { return 0; }
791
yy43:
792
yych = *(marker = ++p);
793
if (yych <= '/') {
794
if (yych <= '+') {
795
if (yych <= '*')
796
goto yy42;
797
} else {
798
if (yych <= ',')
799
goto yy42;
800
if (yych >= '/')
801
goto yy42;
802
}
803
} else {
804
if (yych <= 'Z') {
805
if (yych <= '9')
806
goto yy44;
807
if (yych <= '@')
808
goto yy42;
809
} else {
810
if (yych <= '`')
811
goto yy42;
812
if (yych >= '{')
813
goto yy42;
814
}
815
}
816
yy44:
817
yych = *++p;
818
if (yych <= '9') {
819
if (yych <= ',') {
820
if (yych == '+')
821
goto yy46;
822
} else {
823
if (yych != '/')
824
goto yy46;
825
}
826
} else {
827
if (yych <= 'Z') {
828
if (yych <= ':')
829
goto yy47;
830
if (yych >= 'A')
831
goto yy46;
832
} else {
833
if (yych <= '`')
834
goto yy45;
835
if (yych <= 'z')
836
goto yy46;
837
}
838
}
839
yy45:
840
p = marker;
841
goto yy42;
842
yy46:
843
yych = *++p;
844
if (yych <= '9') {
845
if (yych <= ',') {
846
if (yych == '+')
847
goto yy49;
848
goto yy45;
849
} else {
850
if (yych == '/')
851
goto yy45;
852
goto yy49;
853
}
854
} else {
855
if (yych <= 'Z') {
856
if (yych <= ':')
857
goto yy47;
858
if (yych <= '@')
859
goto yy45;
860
goto yy49;
861
} else {
862
if (yych <= '`')
863
goto yy45;
864
if (yych <= 'z')
865
goto yy49;
866
goto yy45;
867
}
868
}
869
yy47:
870
++p;
871
yych = *p;
872
if (yybm[0 + yych] & 128) {
873
goto yy47;
874
}
875
if (yych <= 0xEC) {
876
if (yych <= 0xC1) {
877
if (yych <= '<')
878
goto yy45;
879
if (yych <= '>')
880
goto yy50;
881
goto yy45;
882
} else {
883
if (yych <= 0xDF)
884
goto yy52;
885
if (yych <= 0xE0)
886
goto yy53;
887
goto yy54;
888
}
889
} else {
890
if (yych <= 0xF0) {
891
if (yych <= 0xED)
892
goto yy55;
893
if (yych <= 0xEF)
894
goto yy54;
895
goto yy56;
896
} else {
897
if (yych <= 0xF3)
898
goto yy57;
899
if (yych <= 0xF4)
900
goto yy58;
901
goto yy45;
902
}
903
}
904
yy49:
905
yych = *++p;
906
if (yych <= '9') {
907
if (yych <= ',') {
908
if (yych == '+')
909
goto yy59;
910
goto yy45;
911
} else {
912
if (yych == '/')
913
goto yy45;
914
goto yy59;
915
}
916
} else {
917
if (yych <= 'Z') {
918
if (yych <= ':')
919
goto yy47;
920
if (yych <= '@')
921
goto yy45;
922
goto yy59;
923
} else {
924
if (yych <= '`')
925
goto yy45;
926
if (yych <= 'z')
927
goto yy59;
928
goto yy45;
929
}
930
}
931
yy50:
932
++p;
933
{ return (bufsize_t)(p - start); }
934
yy52:
935
++p;
936
yych = *p;
937
if (yych <= 0x7F)
938
goto yy45;
939
if (yych <= 0xBF)
940
goto yy47;
941
goto yy45;
942
yy53:
943
++p;
944
yych = *p;
945
if (yych <= 0x9F)
946
goto yy45;
947
if (yych <= 0xBF)
948
goto yy52;
949
goto yy45;
950
yy54:
951
++p;
952
yych = *p;
953
if (yych <= 0x7F)
954
goto yy45;
955
if (yych <= 0xBF)
956
goto yy52;
957
goto yy45;
958
yy55:
959
++p;
960
yych = *p;
961
if (yych <= 0x7F)
962
goto yy45;
963
if (yych <= 0x9F)
964
goto yy52;
965
goto yy45;
966
yy56:
967
++p;
968
yych = *p;
969
if (yych <= 0x8F)
970
goto yy45;
971
if (yych <= 0xBF)
972
goto yy54;
973
goto yy45;
974
yy57:
975
++p;
976
yych = *p;
977
if (yych <= 0x7F)
978
goto yy45;
979
if (yych <= 0xBF)
980
goto yy54;
981
goto yy45;
982
yy58:
983
++p;
984
yych = *p;
985
if (yych <= 0x7F)
986
goto yy45;
987
if (yych <= 0x8F)
988
goto yy54;
989
goto yy45;
990
yy59:
991
yych = *++p;
992
if (yych <= '9') {
993
if (yych <= ',') {
994
if (yych != '+')
995
goto yy45;
996
} else {
997
if (yych == '/')
998
goto yy45;
999
}
1000
} else {
1001
if (yych <= 'Z') {
1002
if (yych <= ':')
1003
goto yy47;
1004
if (yych <= '@')
1005
goto yy45;
1006
} else {
1007
if (yych <= '`')
1008
goto yy45;
1009
if (yych >= '{')
1010
goto yy45;
1011
}
1012
}
1013
yych = *++p;
1014
if (yych <= '9') {
1015
if (yych <= ',') {
1016
if (yych != '+')
1017
goto yy45;
1018
} else {
1019
if (yych == '/')
1020
goto yy45;
1021
}
1022
} else {
1023
if (yych <= 'Z') {
1024
if (yych <= ':')
1025
goto yy47;
1026
if (yych <= '@')
1027
goto yy45;
1028
} else {
1029
if (yych <= '`')
1030
goto yy45;
1031
if (yych >= '{')
1032
goto yy45;
1033
}
1034
}
1035
yych = *++p;
1036
if (yych <= '9') {
1037
if (yych <= ',') {
1038
if (yych != '+')
1039
goto yy45;
1040
} else {
1041
if (yych == '/')
1042
goto yy45;
1043
}
1044
} else {
1045
if (yych <= 'Z') {
1046
if (yych <= ':')
1047
goto yy47;
1048
if (yych <= '@')
1049
goto yy45;
1050
} else {
1051
if (yych <= '`')
1052
goto yy45;
1053
if (yych >= '{')
1054
goto yy45;
1055
}
1056
}
1057
yych = *++p;
1058
if (yych <= '9') {
1059
if (yych <= ',') {
1060
if (yych != '+')
1061
goto yy45;
1062
} else {
1063
if (yych == '/')
1064
goto yy45;
1065
}
1066
} else {
1067
if (yych <= 'Z') {
1068
if (yych <= ':')
1069
goto yy47;
1070
if (yych <= '@')
1071
goto yy45;
1072
} else {
1073
if (yych <= '`')
1074
goto yy45;
1075
if (yych >= '{')
1076
goto yy45;
1077
}
1078
}
1079
yych = *++p;
1080
if (yych <= '9') {
1081
if (yych <= ',') {
1082
if (yych != '+')
1083
goto yy45;
1084
} else {
1085
if (yych == '/')
1086
goto yy45;
1087
}
1088
} else {
1089
if (yych <= 'Z') {
1090
if (yych <= ':')
1091
goto yy47;
1092
if (yych <= '@')
1093
goto yy45;
1094
} else {
1095
if (yych <= '`')
1096
goto yy45;
1097
if (yych >= '{')
1098
goto yy45;
1099
}
1100
}
1101
yych = *++p;
1102
if (yych <= '9') {
1103
if (yych <= ',') {
1104
if (yych != '+')
1105
goto yy45;
1106
} else {
1107
if (yych == '/')
1108
goto yy45;
1109
}
1110
} else {
1111
if (yych <= 'Z') {
1112
if (yych <= ':')
1113
goto yy47;
1114
if (yych <= '@')
1115
goto yy45;
1116
} else {
1117
if (yych <= '`')
1118
goto yy45;
1119
if (yych >= '{')
1120
goto yy45;
1121
}
1122
}
1123
yych = *++p;
1124
if (yych <= '9') {
1125
if (yych <= ',') {
1126
if (yych != '+')
1127
goto yy45;
1128
} else {
1129
if (yych == '/')
1130
goto yy45;
1131
}
1132
} else {
1133
if (yych <= 'Z') {
1134
if (yych <= ':')
1135
goto yy47;
1136
if (yych <= '@')
1137
goto yy45;
1138
} else {
1139
if (yych <= '`')
1140
goto yy45;
1141
if (yych >= '{')
1142
goto yy45;
1143
}
1144
}
1145
yych = *++p;
1146
if (yych <= '9') {
1147
if (yych <= ',') {
1148
if (yych != '+')
1149
goto yy45;
1150
} else {
1151
if (yych == '/')
1152
goto yy45;
1153
}
1154
} else {
1155
if (yych <= 'Z') {
1156
if (yych <= ':')
1157
goto yy47;
1158
if (yych <= '@')
1159
goto yy45;
1160
} else {
1161
if (yych <= '`')
1162
goto yy45;
1163
if (yych >= '{')
1164
goto yy45;
1165
}
1166
}
1167
yych = *++p;
1168
if (yych <= '9') {
1169
if (yych <= ',') {
1170
if (yych != '+')
1171
goto yy45;
1172
} else {
1173
if (yych == '/')
1174
goto yy45;
1175
}
1176
} else {
1177
if (yych <= 'Z') {
1178
if (yych <= ':')
1179
goto yy47;
1180
if (yych <= '@')
1181
goto yy45;
1182
} else {
1183
if (yych <= '`')
1184
goto yy45;
1185
if (yych >= '{')
1186
goto yy45;
1187
}
1188
}
1189
yych = *++p;
1190
if (yych <= '9') {
1191
if (yych <= ',') {
1192
if (yych != '+')
1193
goto yy45;
1194
} else {
1195
if (yych == '/')
1196
goto yy45;
1197
}
1198
} else {
1199
if (yych <= 'Z') {
1200
if (yych <= ':')
1201
goto yy47;
1202
if (yych <= '@')
1203
goto yy45;
1204
} else {
1205
if (yych <= '`')
1206
goto yy45;
1207
if (yych >= '{')
1208
goto yy45;
1209
}
1210
}
1211
yych = *++p;
1212
if (yych <= '9') {
1213
if (yych <= ',') {
1214
if (yych != '+')
1215
goto yy45;
1216
} else {
1217
if (yych == '/')
1218
goto yy45;
1219
}
1220
} else {
1221
if (yych <= 'Z') {
1222
if (yych <= ':')
1223
goto yy47;
1224
if (yych <= '@')
1225
goto yy45;
1226
} else {
1227
if (yych <= '`')
1228
goto yy45;
1229
if (yych >= '{')
1230
goto yy45;
1231
}
1232
}
1233
yych = *++p;
1234
if (yych <= '9') {
1235
if (yych <= ',') {
1236
if (yych != '+')
1237
goto yy45;
1238
} else {
1239
if (yych == '/')
1240
goto yy45;
1241
}
1242
} else {
1243
if (yych <= 'Z') {
1244
if (yych <= ':')
1245
goto yy47;
1246
if (yych <= '@')
1247
goto yy45;
1248
} else {
1249
if (yych <= '`')
1250
goto yy45;
1251
if (yych >= '{')
1252
goto yy45;
1253
}
1254
}
1255
yych = *++p;
1256
if (yych <= '9') {
1257
if (yych <= ',') {
1258
if (yych != '+')
1259
goto yy45;
1260
} else {
1261
if (yych == '/')
1262
goto yy45;
1263
}
1264
} else {
1265
if (yych <= 'Z') {
1266
if (yych <= ':')
1267
goto yy47;
1268
if (yych <= '@')
1269
goto yy45;
1270
} else {
1271
if (yych <= '`')
1272
goto yy45;
1273
if (yych >= '{')
1274
goto yy45;
1275
}
1276
}
1277
yych = *++p;
1278
if (yych <= '9') {
1279
if (yych <= ',') {
1280
if (yych != '+')
1281
goto yy45;
1282
} else {
1283
if (yych == '/')
1284
goto yy45;
1285
}
1286
} else {
1287
if (yych <= 'Z') {
1288
if (yych <= ':')
1289
goto yy47;
1290
if (yych <= '@')
1291
goto yy45;
1292
} else {
1293
if (yych <= '`')
1294
goto yy45;
1295
if (yych >= '{')
1296
goto yy45;
1297
}
1298
}
1299
yych = *++p;
1300
if (yych <= '9') {
1301
if (yych <= ',') {
1302
if (yych != '+')
1303
goto yy45;
1304
} else {
1305
if (yych == '/')
1306
goto yy45;
1307
}
1308
} else {
1309
if (yych <= 'Z') {
1310
if (yych <= ':')
1311
goto yy47;
1312
if (yych <= '@')
1313
goto yy45;
1314
} else {
1315
if (yych <= '`')
1316
goto yy45;
1317
if (yych >= '{')
1318
goto yy45;
1319
}
1320
}
1321
yych = *++p;
1322
if (yych <= '9') {
1323
if (yych <= ',') {
1324
if (yych != '+')
1325
goto yy45;
1326
} else {
1327
if (yych == '/')
1328
goto yy45;
1329
}
1330
} else {
1331
if (yych <= 'Z') {
1332
if (yych <= ':')
1333
goto yy47;
1334
if (yych <= '@')
1335
goto yy45;
1336
} else {
1337
if (yych <= '`')
1338
goto yy45;
1339
if (yych >= '{')
1340
goto yy45;
1341
}
1342
}
1343
yych = *++p;
1344
if (yych <= '9') {
1345
if (yych <= ',') {
1346
if (yych != '+')
1347
goto yy45;
1348
} else {
1349
if (yych == '/')
1350
goto yy45;
1351
}
1352
} else {
1353
if (yych <= 'Z') {
1354
if (yych <= ':')
1355
goto yy47;
1356
if (yych <= '@')
1357
goto yy45;
1358
} else {
1359
if (yych <= '`')
1360
goto yy45;
1361
if (yych >= '{')
1362
goto yy45;
1363
}
1364
}
1365
yych = *++p;
1366
if (yych <= '9') {
1367
if (yych <= ',') {
1368
if (yych != '+')
1369
goto yy45;
1370
} else {
1371
if (yych == '/')
1372
goto yy45;
1373
}
1374
} else {
1375
if (yych <= 'Z') {
1376
if (yych <= ':')
1377
goto yy47;
1378
if (yych <= '@')
1379
goto yy45;
1380
} else {
1381
if (yych <= '`')
1382
goto yy45;
1383
if (yych >= '{')
1384
goto yy45;
1385
}
1386
}
1387
yych = *++p;
1388
if (yych <= '9') {
1389
if (yych <= ',') {
1390
if (yych != '+')
1391
goto yy45;
1392
} else {
1393
if (yych == '/')
1394
goto yy45;
1395
}
1396
} else {
1397
if (yych <= 'Z') {
1398
if (yych <= ':')
1399
goto yy47;
1400
if (yych <= '@')
1401
goto yy45;
1402
} else {
1403
if (yych <= '`')
1404
goto yy45;
1405
if (yych >= '{')
1406
goto yy45;
1407
}
1408
}
1409
yych = *++p;
1410
if (yych <= '9') {
1411
if (yych <= ',') {
1412
if (yych != '+')
1413
goto yy45;
1414
} else {
1415
if (yych == '/')
1416
goto yy45;
1417
}
1418
} else {
1419
if (yych <= 'Z') {
1420
if (yych <= ':')
1421
goto yy47;
1422
if (yych <= '@')
1423
goto yy45;
1424
} else {
1425
if (yych <= '`')
1426
goto yy45;
1427
if (yych >= '{')
1428
goto yy45;
1429
}
1430
}
1431
yych = *++p;
1432
if (yych <= '9') {
1433
if (yych <= ',') {
1434
if (yych != '+')
1435
goto yy45;
1436
} else {
1437
if (yych == '/')
1438
goto yy45;
1439
}
1440
} else {
1441
if (yych <= 'Z') {
1442
if (yych <= ':')
1443
goto yy47;
1444
if (yych <= '@')
1445
goto yy45;
1446
} else {
1447
if (yych <= '`')
1448
goto yy45;
1449
if (yych >= '{')
1450
goto yy45;
1451
}
1452
}
1453
yych = *++p;
1454
if (yych <= '9') {
1455
if (yych <= ',') {
1456
if (yych != '+')
1457
goto yy45;
1458
} else {
1459
if (yych == '/')
1460
goto yy45;
1461
}
1462
} else {
1463
if (yych <= 'Z') {
1464
if (yych <= ':')
1465
goto yy47;
1466
if (yych <= '@')
1467
goto yy45;
1468
} else {
1469
if (yych <= '`')
1470
goto yy45;
1471
if (yych >= '{')
1472
goto yy45;
1473
}
1474
}
1475
yych = *++p;
1476
if (yych <= '9') {
1477
if (yych <= ',') {
1478
if (yych != '+')
1479
goto yy45;
1480
} else {
1481
if (yych == '/')
1482
goto yy45;
1483
}
1484
} else {
1485
if (yych <= 'Z') {
1486
if (yych <= ':')
1487
goto yy47;
1488
if (yych <= '@')
1489
goto yy45;
1490
} else {
1491
if (yych <= '`')
1492
goto yy45;
1493
if (yych >= '{')
1494
goto yy45;
1495
}
1496
}
1497
yych = *++p;
1498
if (yych <= '9') {
1499
if (yych <= ',') {
1500
if (yych != '+')
1501
goto yy45;
1502
} else {
1503
if (yych == '/')
1504
goto yy45;
1505
}
1506
} else {
1507
if (yych <= 'Z') {
1508
if (yych <= ':')
1509
goto yy47;
1510
if (yych <= '@')
1511
goto yy45;
1512
} else {
1513
if (yych <= '`')
1514
goto yy45;
1515
if (yych >= '{')
1516
goto yy45;
1517
}
1518
}
1519
yych = *++p;
1520
if (yych <= '9') {
1521
if (yych <= ',') {
1522
if (yych != '+')
1523
goto yy45;
1524
} else {
1525
if (yych == '/')
1526
goto yy45;
1527
}
1528
} else {
1529
if (yych <= 'Z') {
1530
if (yych <= ':')
1531
goto yy47;
1532
if (yych <= '@')
1533
goto yy45;
1534
} else {
1535
if (yych <= '`')
1536
goto yy45;
1537
if (yych >= '{')
1538
goto yy45;
1539
}
1540
}
1541
yych = *++p;
1542
if (yych <= '9') {
1543
if (yych <= ',') {
1544
if (yych != '+')
1545
goto yy45;
1546
} else {
1547
if (yych == '/')
1548
goto yy45;
1549
}
1550
} else {
1551
if (yych <= 'Z') {
1552
if (yych <= ':')
1553
goto yy47;
1554
if (yych <= '@')
1555
goto yy45;
1556
} else {
1557
if (yych <= '`')
1558
goto yy45;
1559
if (yych >= '{')
1560
goto yy45;
1561
}
1562
}
1563
yych = *++p;
1564
if (yych <= '9') {
1565
if (yych <= ',') {
1566
if (yych != '+')
1567
goto yy45;
1568
} else {
1569
if (yych == '/')
1570
goto yy45;
1571
}
1572
} else {
1573
if (yych <= 'Z') {
1574
if (yych <= ':')
1575
goto yy47;
1576
if (yych <= '@')
1577
goto yy45;
1578
} else {
1579
if (yych <= '`')
1580
goto yy45;
1581
if (yych >= '{')
1582
goto yy45;
1583
}
1584
}
1585
++p;
1586
if ((yych = *p) == ':')
1587
goto yy47;
1588
goto yy45;
1589
}
1590
}
1591
1592
// Try to match email autolink after first <, returning num of chars matched.
1593
bufsize_t _scan_autolink_email(const unsigned char *p) {
1594
const unsigned char *marker = NULL;
1595
const unsigned char *start = p;
1596
1597
{
1598
unsigned char yych;
1599
static const unsigned char yybm[] = {
1600
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1601
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1602
0, 0, 0, 0, 0, 128, 0, 128, 128, 128, 128, 128, 0, 0,
1603
128, 128, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1604
128, 128, 0, 0, 0, 128, 0, 128, 0, 128, 128, 128, 128, 128,
1605
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1606
128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 128, 128, 128, 128,
1607
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1608
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1609
128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1610
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1611
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1612
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1613
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1614
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1615
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1616
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1617
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1618
0, 0, 0, 0,
1619
};
1620
yych = *p;
1621
if (yych <= '9') {
1622
if (yych <= '\'') {
1623
if (yych == '!')
1624
goto yy91;
1625
if (yych >= '#')
1626
goto yy91;
1627
} else {
1628
if (yych <= ')')
1629
goto yy89;
1630
if (yych != ',')
1631
goto yy91;
1632
}
1633
} else {
1634
if (yych <= '?') {
1635
if (yych == '=')
1636
goto yy91;
1637
if (yych >= '?')
1638
goto yy91;
1639
} else {
1640
if (yych <= 'Z') {
1641
if (yych >= 'A')
1642
goto yy91;
1643
} else {
1644
if (yych <= ']')
1645
goto yy89;
1646
if (yych <= '~')
1647
goto yy91;
1648
}
1649
}
1650
}
1651
yy89:
1652
++p;
1653
yy90 : { return 0; }
1654
yy91:
1655
yych = *(marker = ++p);
1656
if (yych <= ',') {
1657
if (yych <= '"') {
1658
if (yych == '!')
1659
goto yy93;
1660
goto yy90;
1661
} else {
1662
if (yych <= '\'')
1663
goto yy93;
1664
if (yych <= ')')
1665
goto yy90;
1666
if (yych <= '+')
1667
goto yy93;
1668
goto yy90;
1669
}
1670
} else {
1671
if (yych <= '>') {
1672
if (yych <= '9')
1673
goto yy93;
1674
if (yych == '=')
1675
goto yy93;
1676
goto yy90;
1677
} else {
1678
if (yych <= 'Z')
1679
goto yy93;
1680
if (yych <= ']')
1681
goto yy90;
1682
if (yych <= '~')
1683
goto yy93;
1684
goto yy90;
1685
}
1686
}
1687
yy92:
1688
++p;
1689
yych = *p;
1690
yy93:
1691
if (yybm[0 + yych] & 128) {
1692
goto yy92;
1693
}
1694
if (yych <= '>')
1695
goto yy94;
1696
if (yych <= '@')
1697
goto yy95;
1698
yy94:
1699
p = marker;
1700
goto yy90;
1701
yy95:
1702
++p;
1703
yych = *p;
1704
if (yych <= '@') {
1705
if (yych <= '/')
1706
goto yy94;
1707
if (yych >= ':')
1708
goto yy94;
1709
} else {
1710
if (yych <= 'Z')
1711
goto yy96;
1712
if (yych <= '`')
1713
goto yy94;
1714
if (yych >= '{')
1715
goto yy94;
1716
}
1717
yy96:
1718
++p;
1719
yych = *p;
1720
if (yych <= '=') {
1721
if (yych <= '.') {
1722
if (yych <= ',')
1723
goto yy94;
1724
if (yych >= '.')
1725
goto yy95;
1726
} else {
1727
if (yych <= '/')
1728
goto yy94;
1729
if (yych <= '9')
1730
goto yy98;
1731
goto yy94;
1732
}
1733
} else {
1734
if (yych <= 'Z') {
1735
if (yych <= '>')
1736
goto yy99;
1737
if (yych <= '@')
1738
goto yy94;
1739
goto yy98;
1740
} else {
1741
if (yych <= '`')
1742
goto yy94;
1743
if (yych <= 'z')
1744
goto yy98;
1745
goto yy94;
1746
}
1747
}
1748
++p;
1749
yych = *p;
1750
if (yych <= '9') {
1751
if (yych == '-')
1752
goto yy101;
1753
if (yych <= '/')
1754
goto yy94;
1755
goto yy102;
1756
} else {
1757
if (yych <= 'Z') {
1758
if (yych <= '@')
1759
goto yy94;
1760
goto yy102;
1761
} else {
1762
if (yych <= '`')
1763
goto yy94;
1764
if (yych <= 'z')
1765
goto yy102;
1766
goto yy94;
1767
}
1768
}
1769
yy98:
1770
++p;
1771
yych = *p;
1772
if (yych <= '=') {
1773
if (yych <= '.') {
1774
if (yych <= ',')
1775
goto yy94;
1776
if (yych <= '-')
1777
goto yy101;
1778
goto yy95;
1779
} else {
1780
if (yych <= '/')
1781
goto yy94;
1782
if (yych <= '9')
1783
goto yy102;
1784
goto yy94;
1785
}
1786
} else {
1787
if (yych <= 'Z') {
1788
if (yych <= '>')
1789
goto yy99;
1790
if (yych <= '@')
1791
goto yy94;
1792
goto yy102;
1793
} else {
1794
if (yych <= '`')
1795
goto yy94;
1796
if (yych <= 'z')
1797
goto yy102;
1798
goto yy94;
1799
}
1800
}
1801
yy99:
1802
++p;
1803
{ return (bufsize_t)(p - start); }
1804
yy101:
1805
++p;
1806
yych = *p;
1807
if (yych <= '9') {
1808
if (yych == '-')
1809
goto yy103;
1810
if (yych <= '/')
1811
goto yy94;
1812
goto yy104;
1813
} else {
1814
if (yych <= 'Z') {
1815
if (yych <= '@')
1816
goto yy94;
1817
goto yy104;
1818
} else {
1819
if (yych <= '`')
1820
goto yy94;
1821
if (yych <= 'z')
1822
goto yy104;
1823
goto yy94;
1824
}
1825
}
1826
yy102:
1827
++p;
1828
yych = *p;
1829
if (yych <= '=') {
1830
if (yych <= '.') {
1831
if (yych <= ',')
1832
goto yy94;
1833
if (yych >= '.')
1834
goto yy95;
1835
} else {
1836
if (yych <= '/')
1837
goto yy94;
1838
if (yych <= '9')
1839
goto yy104;
1840
goto yy94;
1841
}
1842
} else {
1843
if (yych <= 'Z') {
1844
if (yych <= '>')
1845
goto yy99;
1846
if (yych <= '@')
1847
goto yy94;
1848
goto yy104;
1849
} else {
1850
if (yych <= '`')
1851
goto yy94;
1852
if (yych <= 'z')
1853
goto yy104;
1854
goto yy94;
1855
}
1856
}
1857
yy103:
1858
++p;
1859
yych = *p;
1860
if (yych <= '9') {
1861
if (yych == '-')
1862
goto yy105;
1863
if (yych <= '/')
1864
goto yy94;
1865
goto yy106;
1866
} else {
1867
if (yych <= 'Z') {
1868
if (yych <= '@')
1869
goto yy94;
1870
goto yy106;
1871
} else {
1872
if (yych <= '`')
1873
goto yy94;
1874
if (yych <= 'z')
1875
goto yy106;
1876
goto yy94;
1877
}
1878
}
1879
yy104:
1880
++p;
1881
yych = *p;
1882
if (yych <= '=') {
1883
if (yych <= '.') {
1884
if (yych <= ',')
1885
goto yy94;
1886
if (yych >= '.')
1887
goto yy95;
1888
} else {
1889
if (yych <= '/')
1890
goto yy94;
1891
if (yych <= '9')
1892
goto yy106;
1893
goto yy94;
1894
}
1895
} else {
1896
if (yych <= 'Z') {
1897
if (yych <= '>')
1898
goto yy99;
1899
if (yych <= '@')
1900
goto yy94;
1901
goto yy106;
1902
} else {
1903
if (yych <= '`')
1904
goto yy94;
1905
if (yych <= 'z')
1906
goto yy106;
1907
goto yy94;
1908
}
1909
}
1910
yy105:
1911
++p;
1912
yych = *p;
1913
if (yych <= '9') {
1914
if (yych == '-')
1915
goto yy107;
1916
if (yych <= '/')
1917
goto yy94;
1918
goto yy108;
1919
} else {
1920
if (yych <= 'Z') {
1921
if (yych <= '@')
1922
goto yy94;
1923
goto yy108;
1924
} else {
1925
if (yych <= '`')
1926
goto yy94;
1927
if (yych <= 'z')
1928
goto yy108;
1929
goto yy94;
1930
}
1931
}
1932
yy106:
1933
++p;
1934
yych = *p;
1935
if (yych <= '=') {
1936
if (yych <= '.') {
1937
if (yych <= ',')
1938
goto yy94;
1939
if (yych >= '.')
1940
goto yy95;
1941
} else {
1942
if (yych <= '/')
1943
goto yy94;
1944
if (yych <= '9')
1945
goto yy108;
1946
goto yy94;
1947
}
1948
} else {
1949
if (yych <= 'Z') {
1950
if (yych <= '>')
1951
goto yy99;
1952
if (yych <= '@')
1953
goto yy94;
1954
goto yy108;
1955
} else {
1956
if (yych <= '`')
1957
goto yy94;
1958
if (yych <= 'z')
1959
goto yy108;
1960
goto yy94;
1961
}
1962
}
1963
yy107:
1964
++p;
1965
yych = *p;
1966
if (yych <= '9') {
1967
if (yych == '-')
1968
goto yy109;
1969
if (yych <= '/')
1970
goto yy94;
1971
goto yy110;
1972
} else {
1973
if (yych <= 'Z') {
1974
if (yych <= '@')
1975
goto yy94;
1976
goto yy110;
1977
} else {
1978
if (yych <= '`')
1979
goto yy94;
1980
if (yych <= 'z')
1981
goto yy110;
1982
goto yy94;
1983
}
1984
}
1985
yy108:
1986
++p;
1987
yych = *p;
1988
if (yych <= '=') {
1989
if (yych <= '.') {
1990
if (yych <= ',')
1991
goto yy94;
1992
if (yych >= '.')
1993
goto yy95;
1994
} else {
1995
if (yych <= '/')
1996
goto yy94;
1997
if (yych <= '9')
1998
goto yy110;
1999
goto yy94;
2000
}
2001
} else {
2002
if (yych <= 'Z') {
2003
if (yych <= '>')
2004
goto yy99;
2005
if (yych <= '@')
2006
goto yy94;
2007
goto yy110;
2008
} else {
2009
if (yych <= '`')
2010
goto yy94;
2011
if (yych <= 'z')
2012
goto yy110;
2013
goto yy94;
2014
}
2015
}
2016
yy109:
2017
++p;
2018
yych = *p;
2019
if (yych <= '9') {
2020
if (yych == '-')
2021
goto yy111;
2022
if (yych <= '/')
2023
goto yy94;
2024
goto yy112;
2025
} else {
2026
if (yych <= 'Z') {
2027
if (yych <= '@')
2028
goto yy94;
2029
goto yy112;
2030
} else {
2031
if (yych <= '`')
2032
goto yy94;
2033
if (yych <= 'z')
2034
goto yy112;
2035
goto yy94;
2036
}
2037
}
2038
yy110:
2039
++p;
2040
yych = *p;
2041
if (yych <= '=') {
2042
if (yych <= '.') {
2043
if (yych <= ',')
2044
goto yy94;
2045
if (yych >= '.')
2046
goto yy95;
2047
} else {
2048
if (yych <= '/')
2049
goto yy94;
2050
if (yych <= '9')
2051
goto yy112;
2052
goto yy94;
2053
}
2054
} else {
2055
if (yych <= 'Z') {
2056
if (yych <= '>')
2057
goto yy99;
2058
if (yych <= '@')
2059
goto yy94;
2060
goto yy112;
2061
} else {
2062
if (yych <= '`')
2063
goto yy94;
2064
if (yych <= 'z')
2065
goto yy112;
2066
goto yy94;
2067
}
2068
}
2069
yy111:
2070
++p;
2071
yych = *p;
2072
if (yych <= '9') {
2073
if (yych == '-')
2074
goto yy113;
2075
if (yych <= '/')
2076
goto yy94;
2077
goto yy114;
2078
} else {
2079
if (yych <= 'Z') {
2080
if (yych <= '@')
2081
goto yy94;
2082
goto yy114;
2083
} else {
2084
if (yych <= '`')
2085
goto yy94;
2086
if (yych <= 'z')
2087
goto yy114;
2088
goto yy94;
2089
}
2090
}
2091
yy112:
2092
++p;
2093
yych = *p;
2094
if (yych <= '=') {
2095
if (yych <= '.') {
2096
if (yych <= ',')
2097
goto yy94;
2098
if (yych >= '.')
2099
goto yy95;
2100
} else {
2101
if (yych <= '/')
2102
goto yy94;
2103
if (yych <= '9')
2104
goto yy114;
2105
goto yy94;
2106
}
2107
} else {
2108
if (yych <= 'Z') {
2109
if (yych <= '>')
2110
goto yy99;
2111
if (yych <= '@')
2112
goto yy94;
2113
goto yy114;
2114
} else {
2115
if (yych <= '`')
2116
goto yy94;
2117
if (yych <= 'z')
2118
goto yy114;
2119
goto yy94;
2120
}
2121
}
2122
yy113:
2123
++p;
2124
yych = *p;
2125
if (yych <= '9') {
2126
if (yych == '-')
2127
goto yy115;
2128
if (yych <= '/')
2129
goto yy94;
2130
goto yy116;
2131
} else {
2132
if (yych <= 'Z') {
2133
if (yych <= '@')
2134
goto yy94;
2135
goto yy116;
2136
} else {
2137
if (yych <= '`')
2138
goto yy94;
2139
if (yych <= 'z')
2140
goto yy116;
2141
goto yy94;
2142
}
2143
}
2144
yy114:
2145
++p;
2146
yych = *p;
2147
if (yych <= '=') {
2148
if (yych <= '.') {
2149
if (yych <= ',')
2150
goto yy94;
2151
if (yych >= '.')
2152
goto yy95;
2153
} else {
2154
if (yych <= '/')
2155
goto yy94;
2156
if (yych <= '9')
2157
goto yy116;
2158
goto yy94;
2159
}
2160
} else {
2161
if (yych <= 'Z') {
2162
if (yych <= '>')
2163
goto yy99;
2164
if (yych <= '@')
2165
goto yy94;
2166
goto yy116;
2167
} else {
2168
if (yych <= '`')
2169
goto yy94;
2170
if (yych <= 'z')
2171
goto yy116;
2172
goto yy94;
2173
}
2174
}
2175
yy115:
2176
++p;
2177
yych = *p;
2178
if (yych <= '9') {
2179
if (yych == '-')
2180
goto yy117;
2181
if (yych <= '/')
2182
goto yy94;
2183
goto yy118;
2184
} else {
2185
if (yych <= 'Z') {
2186
if (yych <= '@')
2187
goto yy94;
2188
goto yy118;
2189
} else {
2190
if (yych <= '`')
2191
goto yy94;
2192
if (yych <= 'z')
2193
goto yy118;
2194
goto yy94;
2195
}
2196
}
2197
yy116:
2198
++p;
2199
yych = *p;
2200
if (yych <= '=') {
2201
if (yych <= '.') {
2202
if (yych <= ',')
2203
goto yy94;
2204
if (yych >= '.')
2205
goto yy95;
2206
} else {
2207
if (yych <= '/')
2208
goto yy94;
2209
if (yych <= '9')
2210
goto yy118;
2211
goto yy94;
2212
}
2213
} else {
2214
if (yych <= 'Z') {
2215
if (yych <= '>')
2216
goto yy99;
2217
if (yych <= '@')
2218
goto yy94;
2219
goto yy118;
2220
} else {
2221
if (yych <= '`')
2222
goto yy94;
2223
if (yych <= 'z')
2224
goto yy118;
2225
goto yy94;
2226
}
2227
}
2228
yy117:
2229
++p;
2230
yych = *p;
2231
if (yych <= '9') {
2232
if (yych == '-')
2233
goto yy119;
2234
if (yych <= '/')
2235
goto yy94;
2236
goto yy120;
2237
} else {
2238
if (yych <= 'Z') {
2239
if (yych <= '@')
2240
goto yy94;
2241
goto yy120;
2242
} else {
2243
if (yych <= '`')
2244
goto yy94;
2245
if (yych <= 'z')
2246
goto yy120;
2247
goto yy94;
2248
}
2249
}
2250
yy118:
2251
++p;
2252
yych = *p;
2253
if (yych <= '=') {
2254
if (yych <= '.') {
2255
if (yych <= ',')
2256
goto yy94;
2257
if (yych >= '.')
2258
goto yy95;
2259
} else {
2260
if (yych <= '/')
2261
goto yy94;
2262
if (yych <= '9')
2263
goto yy120;
2264
goto yy94;
2265
}
2266
} else {
2267
if (yych <= 'Z') {
2268
if (yych <= '>')
2269
goto yy99;
2270
if (yych <= '@')
2271
goto yy94;
2272
goto yy120;
2273
} else {
2274
if (yych <= '`')
2275
goto yy94;
2276
if (yych <= 'z')
2277
goto yy120;
2278
goto yy94;
2279
}
2280
}
2281
yy119:
2282
++p;
2283
yych = *p;
2284
if (yych <= '9') {
2285
if (yych == '-')
2286
goto yy121;
2287
if (yych <= '/')
2288
goto yy94;
2289
goto yy122;
2290
} else {
2291
if (yych <= 'Z') {
2292
if (yych <= '@')
2293
goto yy94;
2294
goto yy122;
2295
} else {
2296
if (yych <= '`')
2297
goto yy94;
2298
if (yych <= 'z')
2299
goto yy122;
2300
goto yy94;
2301
}
2302
}
2303
yy120:
2304
++p;
2305
yych = *p;
2306
if (yych <= '=') {
2307
if (yych <= '.') {
2308
if (yych <= ',')
2309
goto yy94;
2310
if (yych >= '.')
2311
goto yy95;
2312
} else {
2313
if (yych <= '/')
2314
goto yy94;
2315
if (yych <= '9')
2316
goto yy122;
2317
goto yy94;
2318
}
2319
} else {
2320
if (yych <= 'Z') {
2321
if (yych <= '>')
2322
goto yy99;
2323
if (yych <= '@')
2324
goto yy94;
2325
goto yy122;
2326
} else {
2327
if (yych <= '`')
2328
goto yy94;
2329
if (yych <= 'z')
2330
goto yy122;
2331
goto yy94;
2332
}
2333
}
2334
yy121:
2335
++p;
2336
yych = *p;
2337
if (yych <= '9') {
2338
if (yych == '-')
2339
goto yy123;
2340
if (yych <= '/')
2341
goto yy94;
2342
goto yy124;
2343
} else {
2344
if (yych <= 'Z') {
2345
if (yych <= '@')
2346
goto yy94;
2347
goto yy124;
2348
} else {
2349
if (yych <= '`')
2350
goto yy94;
2351
if (yych <= 'z')
2352
goto yy124;
2353
goto yy94;
2354
}
2355
}
2356
yy122:
2357
++p;
2358
yych = *p;
2359
if (yych <= '=') {
2360
if (yych <= '.') {
2361
if (yych <= ',')
2362
goto yy94;
2363
if (yych >= '.')
2364
goto yy95;
2365
} else {
2366
if (yych <= '/')
2367
goto yy94;
2368
if (yych <= '9')
2369
goto yy124;
2370
goto yy94;
2371
}
2372
} else {
2373
if (yych <= 'Z') {
2374
if (yych <= '>')
2375
goto yy99;
2376
if (yych <= '@')
2377
goto yy94;
2378
goto yy124;
2379
} else {
2380
if (yych <= '`')
2381
goto yy94;
2382
if (yych <= 'z')
2383
goto yy124;
2384
goto yy94;
2385
}
2386
}
2387
yy123:
2388
++p;
2389
yych = *p;
2390
if (yych <= '9') {
2391
if (yych == '-')
2392
goto yy125;
2393
if (yych <= '/')
2394
goto yy94;
2395
goto yy126;
2396
} else {
2397
if (yych <= 'Z') {
2398
if (yych <= '@')
2399
goto yy94;
2400
goto yy126;
2401
} else {
2402
if (yych <= '`')
2403
goto yy94;
2404
if (yych <= 'z')
2405
goto yy126;
2406
goto yy94;
2407
}
2408
}
2409
yy124:
2410
++p;
2411
yych = *p;
2412
if (yych <= '=') {
2413
if (yych <= '.') {
2414
if (yych <= ',')
2415
goto yy94;
2416
if (yych >= '.')
2417
goto yy95;
2418
} else {
2419
if (yych <= '/')
2420
goto yy94;
2421
if (yych <= '9')
2422
goto yy126;
2423
goto yy94;
2424
}
2425
} else {
2426
if (yych <= 'Z') {
2427
if (yych <= '>')
2428
goto yy99;
2429
if (yych <= '@')
2430
goto yy94;
2431
goto yy126;
2432
} else {
2433
if (yych <= '`')
2434
goto yy94;
2435
if (yych <= 'z')
2436
goto yy126;
2437
goto yy94;
2438
}
2439
}
2440
yy125:
2441
++p;
2442
yych = *p;
2443
if (yych <= '9') {
2444
if (yych == '-')
2445
goto yy127;
2446
if (yych <= '/')
2447
goto yy94;
2448
goto yy128;
2449
} else {
2450
if (yych <= 'Z') {
2451
if (yych <= '@')
2452
goto yy94;
2453
goto yy128;
2454
} else {
2455
if (yych <= '`')
2456
goto yy94;
2457
if (yych <= 'z')
2458
goto yy128;
2459
goto yy94;
2460
}
2461
}
2462
yy126:
2463
++p;
2464
yych = *p;
2465
if (yych <= '=') {
2466
if (yych <= '.') {
2467
if (yych <= ',')
2468
goto yy94;
2469
if (yych >= '.')
2470
goto yy95;
2471
} else {
2472
if (yych <= '/')
2473
goto yy94;
2474
if (yych <= '9')
2475
goto yy128;
2476
goto yy94;
2477
}
2478
} else {
2479
if (yych <= 'Z') {
2480
if (yych <= '>')
2481
goto yy99;
2482
if (yych <= '@')
2483
goto yy94;
2484
goto yy128;
2485
} else {
2486
if (yych <= '`')
2487
goto yy94;
2488
if (yych <= 'z')
2489
goto yy128;
2490
goto yy94;
2491
}
2492
}
2493
yy127:
2494
++p;
2495
yych = *p;
2496
if (yych <= '9') {
2497
if (yych == '-')
2498
goto yy129;
2499
if (yych <= '/')
2500
goto yy94;
2501
goto yy130;
2502
} else {
2503
if (yych <= 'Z') {
2504
if (yych <= '@')
2505
goto yy94;
2506
goto yy130;
2507
} else {
2508
if (yych <= '`')
2509
goto yy94;
2510
if (yych <= 'z')
2511
goto yy130;
2512
goto yy94;
2513
}
2514
}
2515
yy128:
2516
++p;
2517
yych = *p;
2518
if (yych <= '=') {
2519
if (yych <= '.') {
2520
if (yych <= ',')
2521
goto yy94;
2522
if (yych >= '.')
2523
goto yy95;
2524
} else {
2525
if (yych <= '/')
2526
goto yy94;
2527
if (yych <= '9')
2528
goto yy130;
2529
goto yy94;
2530
}
2531
} else {
2532
if (yych <= 'Z') {
2533
if (yych <= '>')
2534
goto yy99;
2535
if (yych <= '@')
2536
goto yy94;
2537
goto yy130;
2538
} else {
2539
if (yych <= '`')
2540
goto yy94;
2541
if (yych <= 'z')
2542
goto yy130;
2543
goto yy94;
2544
}
2545
}
2546
yy129:
2547
++p;
2548
yych = *p;
2549
if (yych <= '9') {
2550
if (yych == '-')
2551
goto yy131;
2552
if (yych <= '/')
2553
goto yy94;
2554
goto yy132;
2555
} else {
2556
if (yych <= 'Z') {
2557
if (yych <= '@')
2558
goto yy94;
2559
goto yy132;
2560
} else {
2561
if (yych <= '`')
2562
goto yy94;
2563
if (yych <= 'z')
2564
goto yy132;
2565
goto yy94;
2566
}
2567
}
2568
yy130:
2569
++p;
2570
yych = *p;
2571
if (yych <= '=') {
2572
if (yych <= '.') {
2573
if (yych <= ',')
2574
goto yy94;
2575
if (yych >= '.')
2576
goto yy95;
2577
} else {
2578
if (yych <= '/')
2579
goto yy94;
2580
if (yych <= '9')
2581
goto yy132;
2582
goto yy94;
2583
}
2584
} else {
2585
if (yych <= 'Z') {
2586
if (yych <= '>')
2587
goto yy99;
2588
if (yych <= '@')
2589
goto yy94;
2590
goto yy132;
2591
} else {
2592
if (yych <= '`')
2593
goto yy94;
2594
if (yych <= 'z')
2595
goto yy132;
2596
goto yy94;
2597
}
2598
}
2599
yy131:
2600
++p;
2601
yych = *p;
2602
if (yych <= '9') {
2603
if (yych == '-')
2604
goto yy133;
2605
if (yych <= '/')
2606
goto yy94;
2607
goto yy134;
2608
} else {
2609
if (yych <= 'Z') {
2610
if (yych <= '@')
2611
goto yy94;
2612
goto yy134;
2613
} else {
2614
if (yych <= '`')
2615
goto yy94;
2616
if (yych <= 'z')
2617
goto yy134;
2618
goto yy94;
2619
}
2620
}
2621
yy132:
2622
++p;
2623
yych = *p;
2624
if (yych <= '=') {
2625
if (yych <= '.') {
2626
if (yych <= ',')
2627
goto yy94;
2628
if (yych >= '.')
2629
goto yy95;
2630
} else {
2631
if (yych <= '/')
2632
goto yy94;
2633
if (yych <= '9')
2634
goto yy134;
2635
goto yy94;
2636
}
2637
} else {
2638
if (yych <= 'Z') {
2639
if (yych <= '>')
2640
goto yy99;
2641
if (yych <= '@')
2642
goto yy94;
2643
goto yy134;
2644
} else {
2645
if (yych <= '`')
2646
goto yy94;
2647
if (yych <= 'z')
2648
goto yy134;
2649
goto yy94;
2650
}
2651
}
2652
yy133:
2653
++p;
2654
yych = *p;
2655
if (yych <= '9') {
2656
if (yych == '-')
2657
goto yy135;
2658
if (yych <= '/')
2659
goto yy94;
2660
goto yy136;
2661
} else {
2662
if (yych <= 'Z') {
2663
if (yych <= '@')
2664
goto yy94;
2665
goto yy136;
2666
} else {
2667
if (yych <= '`')
2668
goto yy94;
2669
if (yych <= 'z')
2670
goto yy136;
2671
goto yy94;
2672
}
2673
}
2674
yy134:
2675
++p;
2676
yych = *p;
2677
if (yych <= '=') {
2678
if (yych <= '.') {
2679
if (yych <= ',')
2680
goto yy94;
2681
if (yych >= '.')
2682
goto yy95;
2683
} else {
2684
if (yych <= '/')
2685
goto yy94;
2686
if (yych <= '9')
2687
goto yy136;
2688
goto yy94;
2689
}
2690
} else {
2691
if (yych <= 'Z') {
2692
if (yych <= '>')
2693
goto yy99;
2694
if (yych <= '@')
2695
goto yy94;
2696
goto yy136;
2697
} else {
2698
if (yych <= '`')
2699
goto yy94;
2700
if (yych <= 'z')
2701
goto yy136;
2702
goto yy94;
2703
}
2704
}
2705
yy135:
2706
++p;
2707
yych = *p;
2708
if (yych <= '9') {
2709
if (yych == '-')
2710
goto yy137;
2711
if (yych <= '/')
2712
goto yy94;
2713
goto yy138;
2714
} else {
2715
if (yych <= 'Z') {
2716
if (yych <= '@')
2717
goto yy94;
2718
goto yy138;
2719
} else {
2720
if (yych <= '`')
2721
goto yy94;
2722
if (yych <= 'z')
2723
goto yy138;
2724
goto yy94;
2725
}
2726
}
2727
yy136:
2728
++p;
2729
yych = *p;
2730
if (yych <= '=') {
2731
if (yych <= '.') {
2732
if (yych <= ',')
2733
goto yy94;
2734
if (yych >= '.')
2735
goto yy95;
2736
} else {
2737
if (yych <= '/')
2738
goto yy94;
2739
if (yych <= '9')
2740
goto yy138;
2741
goto yy94;
2742
}
2743
} else {
2744
if (yych <= 'Z') {
2745
if (yych <= '>')
2746
goto yy99;
2747
if (yych <= '@')
2748
goto yy94;
2749
goto yy138;
2750
} else {
2751
if (yych <= '`')
2752
goto yy94;
2753
if (yych <= 'z')
2754
goto yy138;
2755
goto yy94;
2756
}
2757
}
2758
yy137:
2759
++p;
2760
yych = *p;
2761
if (yych <= '9') {
2762
if (yych == '-')
2763
goto yy139;
2764
if (yych <= '/')
2765
goto yy94;
2766
goto yy140;
2767
} else {
2768
if (yych <= 'Z') {
2769
if (yych <= '@')
2770
goto yy94;
2771
goto yy140;
2772
} else {
2773
if (yych <= '`')
2774
goto yy94;
2775
if (yych <= 'z')
2776
goto yy140;
2777
goto yy94;
2778
}
2779
}
2780
yy138:
2781
++p;
2782
yych = *p;
2783
if (yych <= '=') {
2784
if (yych <= '.') {
2785
if (yych <= ',')
2786
goto yy94;
2787
if (yych >= '.')
2788
goto yy95;
2789
} else {
2790
if (yych <= '/')
2791
goto yy94;
2792
if (yych <= '9')
2793
goto yy140;
2794
goto yy94;
2795
}
2796
} else {
2797
if (yych <= 'Z') {
2798
if (yych <= '>')
2799
goto yy99;
2800
if (yych <= '@')
2801
goto yy94;
2802
goto yy140;
2803
} else {
2804
if (yych <= '`')
2805
goto yy94;
2806
if (yych <= 'z')
2807
goto yy140;
2808
goto yy94;
2809
}
2810
}
2811
yy139:
2812
++p;
2813
yych = *p;
2814
if (yych <= '9') {
2815
if (yych == '-')
2816
goto yy141;
2817
if (yych <= '/')
2818
goto yy94;
2819
goto yy142;
2820
} else {
2821
if (yych <= 'Z') {
2822
if (yych <= '@')
2823
goto yy94;
2824
goto yy142;
2825
} else {
2826
if (yych <= '`')
2827
goto yy94;
2828
if (yych <= 'z')
2829
goto yy142;
2830
goto yy94;
2831
}
2832
}
2833
yy140:
2834
++p;
2835
yych = *p;
2836
if (yych <= '=') {
2837
if (yych <= '.') {
2838
if (yych <= ',')
2839
goto yy94;
2840
if (yych >= '.')
2841
goto yy95;
2842
} else {
2843
if (yych <= '/')
2844
goto yy94;
2845
if (yych <= '9')
2846
goto yy142;
2847
goto yy94;
2848
}
2849
} else {
2850
if (yych <= 'Z') {
2851
if (yych <= '>')
2852
goto yy99;
2853
if (yych <= '@')
2854
goto yy94;
2855
goto yy142;
2856
} else {
2857
if (yych <= '`')
2858
goto yy94;
2859
if (yych <= 'z')
2860
goto yy142;
2861
goto yy94;
2862
}
2863
}
2864
yy141:
2865
++p;
2866
yych = *p;
2867
if (yych <= '9') {
2868
if (yych == '-')
2869
goto yy143;
2870
if (yych <= '/')
2871
goto yy94;
2872
goto yy144;
2873
} else {
2874
if (yych <= 'Z') {
2875
if (yych <= '@')
2876
goto yy94;
2877
goto yy144;
2878
} else {
2879
if (yych <= '`')
2880
goto yy94;
2881
if (yych <= 'z')
2882
goto yy144;
2883
goto yy94;
2884
}
2885
}
2886
yy142:
2887
++p;
2888
yych = *p;
2889
if (yych <= '=') {
2890
if (yych <= '.') {
2891
if (yych <= ',')
2892
goto yy94;
2893
if (yych >= '.')
2894
goto yy95;
2895
} else {
2896
if (yych <= '/')
2897
goto yy94;
2898
if (yych <= '9')
2899
goto yy144;
2900
goto yy94;
2901
}
2902
} else {
2903
if (yych <= 'Z') {
2904
if (yych <= '>')
2905
goto yy99;
2906
if (yych <= '@')
2907
goto yy94;
2908
goto yy144;
2909
} else {
2910
if (yych <= '`')
2911
goto yy94;
2912
if (yych <= 'z')
2913
goto yy144;
2914
goto yy94;
2915
}
2916
}
2917
yy143:
2918
++p;
2919
yych = *p;
2920
if (yych <= '9') {
2921
if (yych == '-')
2922
goto yy145;
2923
if (yych <= '/')
2924
goto yy94;
2925
goto yy146;
2926
} else {
2927
if (yych <= 'Z') {
2928
if (yych <= '@')
2929
goto yy94;
2930
goto yy146;
2931
} else {
2932
if (yych <= '`')
2933
goto yy94;
2934
if (yych <= 'z')
2935
goto yy146;
2936
goto yy94;
2937
}
2938
}
2939
yy144:
2940
++p;
2941
yych = *p;
2942
if (yych <= '=') {
2943
if (yych <= '.') {
2944
if (yych <= ',')
2945
goto yy94;
2946
if (yych >= '.')
2947
goto yy95;
2948
} else {
2949
if (yych <= '/')
2950
goto yy94;
2951
if (yych <= '9')
2952
goto yy146;
2953
goto yy94;
2954
}
2955
} else {
2956
if (yych <= 'Z') {
2957
if (yych <= '>')
2958
goto yy99;
2959
if (yych <= '@')
2960
goto yy94;
2961
goto yy146;
2962
} else {
2963
if (yych <= '`')
2964
goto yy94;
2965
if (yych <= 'z')
2966
goto yy146;
2967
goto yy94;
2968
}
2969
}
2970
yy145:
2971
++p;
2972
yych = *p;
2973
if (yych <= '9') {
2974
if (yych == '-')
2975
goto yy147;
2976
if (yych <= '/')
2977
goto yy94;
2978
goto yy148;
2979
} else {
2980
if (yych <= 'Z') {
2981
if (yych <= '@')
2982
goto yy94;
2983
goto yy148;
2984
} else {
2985
if (yych <= '`')
2986
goto yy94;
2987
if (yych <= 'z')
2988
goto yy148;
2989
goto yy94;
2990
}
2991
}
2992
yy146:
2993
++p;
2994
yych = *p;
2995
if (yych <= '=') {
2996
if (yych <= '.') {
2997
if (yych <= ',')
2998
goto yy94;
2999
if (yych >= '.')
3000
goto yy95;
3001
} else {
3002
if (yych <= '/')
3003
goto yy94;
3004
if (yych <= '9')
3005
goto yy148;
3006
goto yy94;
3007
}
3008
} else {
3009
if (yych <= 'Z') {
3010
if (yych <= '>')
3011
goto yy99;
3012
if (yych <= '@')
3013
goto yy94;
3014
goto yy148;
3015
} else {
3016
if (yych <= '`')
3017
goto yy94;
3018
if (yych <= 'z')
3019
goto yy148;
3020
goto yy94;
3021
}
3022
}
3023
yy147:
3024
++p;
3025
yych = *p;
3026
if (yych <= '9') {
3027
if (yych == '-')
3028
goto yy149;
3029
if (yych <= '/')
3030
goto yy94;
3031
goto yy150;
3032
} else {
3033
if (yych <= 'Z') {
3034
if (yych <= '@')
3035
goto yy94;
3036
goto yy150;
3037
} else {
3038
if (yych <= '`')
3039
goto yy94;
3040
if (yych <= 'z')
3041
goto yy150;
3042
goto yy94;
3043
}
3044
}
3045
yy148:
3046
++p;
3047
yych = *p;
3048
if (yych <= '=') {
3049
if (yych <= '.') {
3050
if (yych <= ',')
3051
goto yy94;
3052
if (yych >= '.')
3053
goto yy95;
3054
} else {
3055
if (yych <= '/')
3056
goto yy94;
3057
if (yych <= '9')
3058
goto yy150;
3059
goto yy94;
3060
}
3061
} else {
3062
if (yych <= 'Z') {
3063
if (yych <= '>')
3064
goto yy99;
3065
if (yych <= '@')
3066
goto yy94;
3067
goto yy150;
3068
} else {
3069
if (yych <= '`')
3070
goto yy94;
3071
if (yych <= 'z')
3072
goto yy150;
3073
goto yy94;
3074
}
3075
}
3076
yy149:
3077
++p;
3078
yych = *p;
3079
if (yych <= '9') {
3080
if (yych == '-')
3081
goto yy151;
3082
if (yych <= '/')
3083
goto yy94;
3084
goto yy152;
3085
} else {
3086
if (yych <= 'Z') {
3087
if (yych <= '@')
3088
goto yy94;
3089
goto yy152;
3090
} else {
3091
if (yych <= '`')
3092
goto yy94;
3093
if (yych <= 'z')
3094
goto yy152;
3095
goto yy94;
3096
}
3097
}
3098
yy150:
3099
++p;
3100
yych = *p;
3101
if (yych <= '=') {
3102
if (yych <= '.') {
3103
if (yych <= ',')
3104
goto yy94;
3105
if (yych >= '.')
3106
goto yy95;
3107
} else {
3108
if (yych <= '/')
3109
goto yy94;
3110
if (yych <= '9')
3111
goto yy152;
3112
goto yy94;
3113
}
3114
} else {
3115
if (yych <= 'Z') {
3116
if (yych <= '>')
3117
goto yy99;
3118
if (yych <= '@')
3119
goto yy94;
3120
goto yy152;
3121
} else {
3122
if (yych <= '`')
3123
goto yy94;
3124
if (yych <= 'z')
3125
goto yy152;
3126
goto yy94;
3127
}
3128
}
3129
yy151:
3130
++p;
3131
yych = *p;
3132
if (yych <= '9') {
3133
if (yych == '-')
3134
goto yy153;
3135
if (yych <= '/')
3136
goto yy94;
3137
goto yy154;
3138
} else {
3139
if (yych <= 'Z') {
3140
if (yych <= '@')
3141
goto yy94;
3142
goto yy154;
3143
} else {
3144
if (yych <= '`')
3145
goto yy94;
3146
if (yych <= 'z')
3147
goto yy154;
3148
goto yy94;
3149
}
3150
}
3151
yy152:
3152
++p;
3153
yych = *p;
3154
if (yych <= '=') {
3155
if (yych <= '.') {
3156
if (yych <= ',')
3157
goto yy94;
3158
if (yych >= '.')
3159
goto yy95;
3160
} else {
3161
if (yych <= '/')
3162
goto yy94;
3163
if (yych <= '9')
3164
goto yy154;
3165
goto yy94;
3166
}
3167
} else {
3168
if (yych <= 'Z') {
3169
if (yych <= '>')
3170
goto yy99;
3171
if (yych <= '@')
3172
goto yy94;
3173
goto yy154;
3174
} else {
3175
if (yych <= '`')
3176
goto yy94;
3177
if (yych <= 'z')
3178
goto yy154;
3179
goto yy94;
3180
}
3181
}
3182
yy153:
3183
++p;
3184
yych = *p;
3185
if (yych <= '9') {
3186
if (yych == '-')
3187
goto yy155;
3188
if (yych <= '/')
3189
goto yy94;
3190
goto yy156;
3191
} else {
3192
if (yych <= 'Z') {
3193
if (yych <= '@')
3194
goto yy94;
3195
goto yy156;
3196
} else {
3197
if (yych <= '`')
3198
goto yy94;
3199
if (yych <= 'z')
3200
goto yy156;
3201
goto yy94;
3202
}
3203
}
3204
yy154:
3205
++p;
3206
yych = *p;
3207
if (yych <= '=') {
3208
if (yych <= '.') {
3209
if (yych <= ',')
3210
goto yy94;
3211
if (yych >= '.')
3212
goto yy95;
3213
} else {
3214
if (yych <= '/')
3215
goto yy94;
3216
if (yych <= '9')
3217
goto yy156;
3218
goto yy94;
3219
}
3220
} else {
3221
if (yych <= 'Z') {
3222
if (yych <= '>')
3223
goto yy99;
3224
if (yych <= '@')
3225
goto yy94;
3226
goto yy156;
3227
} else {
3228
if (yych <= '`')
3229
goto yy94;
3230
if (yych <= 'z')
3231
goto yy156;
3232
goto yy94;
3233
}
3234
}
3235
yy155:
3236
++p;
3237
yych = *p;
3238
if (yych <= '9') {
3239
if (yych == '-')
3240
goto yy157;
3241
if (yych <= '/')
3242
goto yy94;
3243
goto yy158;
3244
} else {
3245
if (yych <= 'Z') {
3246
if (yych <= '@')
3247
goto yy94;
3248
goto yy158;
3249
} else {
3250
if (yych <= '`')
3251
goto yy94;
3252
if (yych <= 'z')
3253
goto yy158;
3254
goto yy94;
3255
}
3256
}
3257
yy156:
3258
++p;
3259
yych = *p;
3260
if (yych <= '=') {
3261
if (yych <= '.') {
3262
if (yych <= ',')
3263
goto yy94;
3264
if (yych >= '.')
3265
goto yy95;
3266
} else {
3267
if (yych <= '/')
3268
goto yy94;
3269
if (yych <= '9')
3270
goto yy158;
3271
goto yy94;
3272
}
3273
} else {
3274
if (yych <= 'Z') {
3275
if (yych <= '>')
3276
goto yy99;
3277
if (yych <= '@')
3278
goto yy94;
3279
goto yy158;
3280
} else {
3281
if (yych <= '`')
3282
goto yy94;
3283
if (yych <= 'z')
3284
goto yy158;
3285
goto yy94;
3286
}
3287
}
3288
yy157:
3289
++p;
3290
yych = *p;
3291
if (yych <= '9') {
3292
if (yych == '-')
3293
goto yy159;
3294
if (yych <= '/')
3295
goto yy94;
3296
goto yy160;
3297
} else {
3298
if (yych <= 'Z') {
3299
if (yych <= '@')
3300
goto yy94;
3301
goto yy160;
3302
} else {
3303
if (yych <= '`')
3304
goto yy94;
3305
if (yych <= 'z')
3306
goto yy160;
3307
goto yy94;
3308
}
3309
}
3310
yy158:
3311
++p;
3312
yych = *p;
3313
if (yych <= '=') {
3314
if (yych <= '.') {
3315
if (yych <= ',')
3316
goto yy94;
3317
if (yych >= '.')
3318
goto yy95;
3319
} else {
3320
if (yych <= '/')
3321
goto yy94;
3322
if (yych <= '9')
3323
goto yy160;
3324
goto yy94;
3325
}
3326
} else {
3327
if (yych <= 'Z') {
3328
if (yych <= '>')
3329
goto yy99;
3330
if (yych <= '@')
3331
goto yy94;
3332
goto yy160;
3333
} else {
3334
if (yych <= '`')
3335
goto yy94;
3336
if (yych <= 'z')
3337
goto yy160;
3338
goto yy94;
3339
}
3340
}
3341
yy159:
3342
++p;
3343
yych = *p;
3344
if (yych <= '9') {
3345
if (yych == '-')
3346
goto yy161;
3347
if (yych <= '/')
3348
goto yy94;
3349
goto yy162;
3350
} else {
3351
if (yych <= 'Z') {
3352
if (yych <= '@')
3353
goto yy94;
3354
goto yy162;
3355
} else {
3356
if (yych <= '`')
3357
goto yy94;
3358
if (yych <= 'z')
3359
goto yy162;
3360
goto yy94;
3361
}
3362
}
3363
yy160:
3364
++p;
3365
yych = *p;
3366
if (yych <= '=') {
3367
if (yych <= '.') {
3368
if (yych <= ',')
3369
goto yy94;
3370
if (yych >= '.')
3371
goto yy95;
3372
} else {
3373
if (yych <= '/')
3374
goto yy94;
3375
if (yych <= '9')
3376
goto yy162;
3377
goto yy94;
3378
}
3379
} else {
3380
if (yych <= 'Z') {
3381
if (yych <= '>')
3382
goto yy99;
3383
if (yych <= '@')
3384
goto yy94;
3385
goto yy162;
3386
} else {
3387
if (yych <= '`')
3388
goto yy94;
3389
if (yych <= 'z')
3390
goto yy162;
3391
goto yy94;
3392
}
3393
}
3394
yy161:
3395
++p;
3396
yych = *p;
3397
if (yych <= '9') {
3398
if (yych == '-')
3399
goto yy163;
3400
if (yych <= '/')
3401
goto yy94;
3402
goto yy164;
3403
} else {
3404
if (yych <= 'Z') {
3405
if (yych <= '@')
3406
goto yy94;
3407
goto yy164;
3408
} else {
3409
if (yych <= '`')
3410
goto yy94;
3411
if (yych <= 'z')
3412
goto yy164;
3413
goto yy94;
3414
}
3415
}
3416
yy162:
3417
++p;
3418
yych = *p;
3419
if (yych <= '=') {
3420
if (yych <= '.') {
3421
if (yych <= ',')
3422
goto yy94;
3423
if (yych >= '.')
3424
goto yy95;
3425
} else {
3426
if (yych <= '/')
3427
goto yy94;
3428
if (yych <= '9')
3429
goto yy164;
3430
goto yy94;
3431
}
3432
} else {
3433
if (yych <= 'Z') {
3434
if (yych <= '>')
3435
goto yy99;
3436
if (yych <= '@')
3437
goto yy94;
3438
goto yy164;
3439
} else {
3440
if (yych <= '`')
3441
goto yy94;
3442
if (yych <= 'z')
3443
goto yy164;
3444
goto yy94;
3445
}
3446
}
3447
yy163:
3448
++p;
3449
yych = *p;
3450
if (yych <= '9') {
3451
if (yych == '-')
3452
goto yy165;
3453
if (yych <= '/')
3454
goto yy94;
3455
goto yy166;
3456
} else {
3457
if (yych <= 'Z') {
3458
if (yych <= '@')
3459
goto yy94;
3460
goto yy166;
3461
} else {
3462
if (yych <= '`')
3463
goto yy94;
3464
if (yych <= 'z')
3465
goto yy166;
3466
goto yy94;
3467
}
3468
}
3469
yy164:
3470
++p;
3471
yych = *p;
3472
if (yych <= '=') {
3473
if (yych <= '.') {
3474
if (yych <= ',')
3475
goto yy94;
3476
if (yych >= '.')
3477
goto yy95;
3478
} else {
3479
if (yych <= '/')
3480
goto yy94;
3481
if (yych <= '9')
3482
goto yy166;
3483
goto yy94;
3484
}
3485
} else {
3486
if (yych <= 'Z') {
3487
if (yych <= '>')
3488
goto yy99;
3489
if (yych <= '@')
3490
goto yy94;
3491
goto yy166;
3492
} else {
3493
if (yych <= '`')
3494
goto yy94;
3495
if (yych <= 'z')
3496
goto yy166;
3497
goto yy94;
3498
}
3499
}
3500
yy165:
3501
++p;
3502
yych = *p;
3503
if (yych <= '9') {
3504
if (yych == '-')
3505
goto yy167;
3506
if (yych <= '/')
3507
goto yy94;
3508
goto yy168;
3509
} else {
3510
if (yych <= 'Z') {
3511
if (yych <= '@')
3512
goto yy94;
3513
goto yy168;
3514
} else {
3515
if (yych <= '`')
3516
goto yy94;
3517
if (yych <= 'z')
3518
goto yy168;
3519
goto yy94;
3520
}
3521
}
3522
yy166:
3523
++p;
3524
yych = *p;
3525
if (yych <= '=') {
3526
if (yych <= '.') {
3527
if (yych <= ',')
3528
goto yy94;
3529
if (yych >= '.')
3530
goto yy95;
3531
} else {
3532
if (yych <= '/')
3533
goto yy94;
3534
if (yych <= '9')
3535
goto yy168;
3536
goto yy94;
3537
}
3538
} else {
3539
if (yych <= 'Z') {
3540
if (yych <= '>')
3541
goto yy99;
3542
if (yych <= '@')
3543
goto yy94;
3544
goto yy168;
3545
} else {
3546
if (yych <= '`')
3547
goto yy94;
3548
if (yych <= 'z')
3549
goto yy168;
3550
goto yy94;
3551
}
3552
}
3553
yy167:
3554
++p;
3555
yych = *p;
3556
if (yych <= '9') {
3557
if (yych == '-')
3558
goto yy169;
3559
if (yych <= '/')
3560
goto yy94;
3561
goto yy170;
3562
} else {
3563
if (yych <= 'Z') {
3564
if (yych <= '@')
3565
goto yy94;
3566
goto yy170;
3567
} else {
3568
if (yych <= '`')
3569
goto yy94;
3570
if (yych <= 'z')
3571
goto yy170;
3572
goto yy94;
3573
}
3574
}
3575
yy168:
3576
++p;
3577
yych = *p;
3578
if (yych <= '=') {
3579
if (yych <= '.') {
3580
if (yych <= ',')
3581
goto yy94;
3582
if (yych >= '.')
3583
goto yy95;
3584
} else {
3585
if (yych <= '/')
3586
goto yy94;
3587
if (yych <= '9')
3588
goto yy170;
3589
goto yy94;
3590
}
3591
} else {
3592
if (yych <= 'Z') {
3593
if (yych <= '>')
3594
goto yy99;
3595
if (yych <= '@')
3596
goto yy94;
3597
goto yy170;
3598
} else {
3599
if (yych <= '`')
3600
goto yy94;
3601
if (yych <= 'z')
3602
goto yy170;
3603
goto yy94;
3604
}
3605
}
3606
yy169:
3607
++p;
3608
yych = *p;
3609
if (yych <= '9') {
3610
if (yych == '-')
3611
goto yy171;
3612
if (yych <= '/')
3613
goto yy94;
3614
goto yy172;
3615
} else {
3616
if (yych <= 'Z') {
3617
if (yych <= '@')
3618
goto yy94;
3619
goto yy172;
3620
} else {
3621
if (yych <= '`')
3622
goto yy94;
3623
if (yych <= 'z')
3624
goto yy172;
3625
goto yy94;
3626
}
3627
}
3628
yy170:
3629
++p;
3630
yych = *p;
3631
if (yych <= '=') {
3632
if (yych <= '.') {
3633
if (yych <= ',')
3634
goto yy94;
3635
if (yych >= '.')
3636
goto yy95;
3637
} else {
3638
if (yych <= '/')
3639
goto yy94;
3640
if (yych <= '9')
3641
goto yy172;
3642
goto yy94;
3643
}
3644
} else {
3645
if (yych <= 'Z') {
3646
if (yych <= '>')
3647
goto yy99;
3648
if (yych <= '@')
3649
goto yy94;
3650
goto yy172;
3651
} else {
3652
if (yych <= '`')
3653
goto yy94;
3654
if (yych <= 'z')
3655
goto yy172;
3656
goto yy94;
3657
}
3658
}
3659
yy171:
3660
++p;
3661
yych = *p;
3662
if (yych <= '9') {
3663
if (yych == '-')
3664
goto yy173;
3665
if (yych <= '/')
3666
goto yy94;
3667
goto yy174;
3668
} else {
3669
if (yych <= 'Z') {
3670
if (yych <= '@')
3671
goto yy94;
3672
goto yy174;
3673
} else {
3674
if (yych <= '`')
3675
goto yy94;
3676
if (yych <= 'z')
3677
goto yy174;
3678
goto yy94;
3679
}
3680
}
3681
yy172:
3682
++p;
3683
yych = *p;
3684
if (yych <= '=') {
3685
if (yych <= '.') {
3686
if (yych <= ',')
3687
goto yy94;
3688
if (yych >= '.')
3689
goto yy95;
3690
} else {
3691
if (yych <= '/')
3692
goto yy94;
3693
if (yych <= '9')
3694
goto yy174;
3695
goto yy94;
3696
}
3697
} else {
3698
if (yych <= 'Z') {
3699
if (yych <= '>')
3700
goto yy99;
3701
if (yych <= '@')
3702
goto yy94;
3703
goto yy174;
3704
} else {
3705
if (yych <= '`')
3706
goto yy94;
3707
if (yych <= 'z')
3708
goto yy174;
3709
goto yy94;
3710
}
3711
}
3712
yy173:
3713
++p;
3714
yych = *p;
3715
if (yych <= '9') {
3716
if (yych == '-')
3717
goto yy175;
3718
if (yych <= '/')
3719
goto yy94;
3720
goto yy176;
3721
} else {
3722
if (yych <= 'Z') {
3723
if (yych <= '@')
3724
goto yy94;
3725
goto yy176;
3726
} else {
3727
if (yych <= '`')
3728
goto yy94;
3729
if (yych <= 'z')
3730
goto yy176;
3731
goto yy94;
3732
}
3733
}
3734
yy174:
3735
++p;
3736
yych = *p;
3737
if (yych <= '=') {
3738
if (yych <= '.') {
3739
if (yych <= ',')
3740
goto yy94;
3741
if (yych >= '.')
3742
goto yy95;
3743
} else {
3744
if (yych <= '/')
3745
goto yy94;
3746
if (yych <= '9')
3747
goto yy176;
3748
goto yy94;
3749
}
3750
} else {
3751
if (yych <= 'Z') {
3752
if (yych <= '>')
3753
goto yy99;
3754
if (yych <= '@')
3755
goto yy94;
3756
goto yy176;
3757
} else {
3758
if (yych <= '`')
3759
goto yy94;
3760
if (yych <= 'z')
3761
goto yy176;
3762
goto yy94;
3763
}
3764
}
3765
yy175:
3766
++p;
3767
yych = *p;
3768
if (yych <= '9') {
3769
if (yych == '-')
3770
goto yy177;
3771
if (yych <= '/')
3772
goto yy94;
3773
goto yy178;
3774
} else {
3775
if (yych <= 'Z') {
3776
if (yych <= '@')
3777
goto yy94;
3778
goto yy178;
3779
} else {
3780
if (yych <= '`')
3781
goto yy94;
3782
if (yych <= 'z')
3783
goto yy178;
3784
goto yy94;
3785
}
3786
}
3787
yy176:
3788
++p;
3789
yych = *p;
3790
if (yych <= '=') {
3791
if (yych <= '.') {
3792
if (yych <= ',')
3793
goto yy94;
3794
if (yych >= '.')
3795
goto yy95;
3796
} else {
3797
if (yych <= '/')
3798
goto yy94;
3799
if (yych <= '9')
3800
goto yy178;
3801
goto yy94;
3802
}
3803
} else {
3804
if (yych <= 'Z') {
3805
if (yych <= '>')
3806
goto yy99;
3807
if (yych <= '@')
3808
goto yy94;
3809
goto yy178;
3810
} else {
3811
if (yych <= '`')
3812
goto yy94;
3813
if (yych <= 'z')
3814
goto yy178;
3815
goto yy94;
3816
}
3817
}
3818
yy177:
3819
++p;
3820
yych = *p;
3821
if (yych <= '9') {
3822
if (yych == '-')
3823
goto yy179;
3824
if (yych <= '/')
3825
goto yy94;
3826
goto yy180;
3827
} else {
3828
if (yych <= 'Z') {
3829
if (yych <= '@')
3830
goto yy94;
3831
goto yy180;
3832
} else {
3833
if (yych <= '`')
3834
goto yy94;
3835
if (yych <= 'z')
3836
goto yy180;
3837
goto yy94;
3838
}
3839
}
3840
yy178:
3841
++p;
3842
yych = *p;
3843
if (yych <= '=') {
3844
if (yych <= '.') {
3845
if (yych <= ',')
3846
goto yy94;
3847
if (yych >= '.')
3848
goto yy95;
3849
} else {
3850
if (yych <= '/')
3851
goto yy94;
3852
if (yych <= '9')
3853
goto yy180;
3854
goto yy94;
3855
}
3856
} else {
3857
if (yych <= 'Z') {
3858
if (yych <= '>')
3859
goto yy99;
3860
if (yych <= '@')
3861
goto yy94;
3862
goto yy180;
3863
} else {
3864
if (yych <= '`')
3865
goto yy94;
3866
if (yych <= 'z')
3867
goto yy180;
3868
goto yy94;
3869
}
3870
}
3871
yy179:
3872
++p;
3873
yych = *p;
3874
if (yych <= '9') {
3875
if (yych == '-')
3876
goto yy181;
3877
if (yych <= '/')
3878
goto yy94;
3879
goto yy182;
3880
} else {
3881
if (yych <= 'Z') {
3882
if (yych <= '@')
3883
goto yy94;
3884
goto yy182;
3885
} else {
3886
if (yych <= '`')
3887
goto yy94;
3888
if (yych <= 'z')
3889
goto yy182;
3890
goto yy94;
3891
}
3892
}
3893
yy180:
3894
++p;
3895
yych = *p;
3896
if (yych <= '=') {
3897
if (yych <= '.') {
3898
if (yych <= ',')
3899
goto yy94;
3900
if (yych >= '.')
3901
goto yy95;
3902
} else {
3903
if (yych <= '/')
3904
goto yy94;
3905
if (yych <= '9')
3906
goto yy182;
3907
goto yy94;
3908
}
3909
} else {
3910
if (yych <= 'Z') {
3911
if (yych <= '>')
3912
goto yy99;
3913
if (yych <= '@')
3914
goto yy94;
3915
goto yy182;
3916
} else {
3917
if (yych <= '`')
3918
goto yy94;
3919
if (yych <= 'z')
3920
goto yy182;
3921
goto yy94;
3922
}
3923
}
3924
yy181:
3925
++p;
3926
yych = *p;
3927
if (yych <= '9') {
3928
if (yych == '-')
3929
goto yy183;
3930
if (yych <= '/')
3931
goto yy94;
3932
goto yy184;
3933
} else {
3934
if (yych <= 'Z') {
3935
if (yych <= '@')
3936
goto yy94;
3937
goto yy184;
3938
} else {
3939
if (yych <= '`')
3940
goto yy94;
3941
if (yych <= 'z')
3942
goto yy184;
3943
goto yy94;
3944
}
3945
}
3946
yy182:
3947
++p;
3948
yych = *p;
3949
if (yych <= '=') {
3950
if (yych <= '.') {
3951
if (yych <= ',')
3952
goto yy94;
3953
if (yych >= '.')
3954
goto yy95;
3955
} else {
3956
if (yych <= '/')
3957
goto yy94;
3958
if (yych <= '9')
3959
goto yy184;
3960
goto yy94;
3961
}
3962
} else {
3963
if (yych <= 'Z') {
3964
if (yych <= '>')
3965
goto yy99;
3966
if (yych <= '@')
3967
goto yy94;
3968
goto yy184;
3969
} else {
3970
if (yych <= '`')
3971
goto yy94;
3972
if (yych <= 'z')
3973
goto yy184;
3974
goto yy94;
3975
}
3976
}
3977
yy183:
3978
++p;
3979
yych = *p;
3980
if (yych <= '9') {
3981
if (yych == '-')
3982
goto yy185;
3983
if (yych <= '/')
3984
goto yy94;
3985
goto yy186;
3986
} else {
3987
if (yych <= 'Z') {
3988
if (yych <= '@')
3989
goto yy94;
3990
goto yy186;
3991
} else {
3992
if (yych <= '`')
3993
goto yy94;
3994
if (yych <= 'z')
3995
goto yy186;
3996
goto yy94;
3997
}
3998
}
3999
yy184:
4000
++p;
4001
yych = *p;
4002
if (yych <= '=') {
4003
if (yych <= '.') {
4004
if (yych <= ',')
4005
goto yy94;
4006
if (yych >= '.')
4007
goto yy95;
4008
} else {
4009
if (yych <= '/')
4010
goto yy94;
4011
if (yych <= '9')
4012
goto yy186;
4013
goto yy94;
4014
}
4015
} else {
4016
if (yych <= 'Z') {
4017
if (yych <= '>')
4018
goto yy99;
4019
if (yych <= '@')
4020
goto yy94;
4021
goto yy186;
4022
} else {
4023
if (yych <= '`')
4024
goto yy94;
4025
if (yych <= 'z')
4026
goto yy186;
4027
goto yy94;
4028
}
4029
}
4030
yy185:
4031
++p;
4032
yych = *p;
4033
if (yych <= '9') {
4034
if (yych == '-')
4035
goto yy187;
4036
if (yych <= '/')
4037
goto yy94;
4038
goto yy188;
4039
} else {
4040
if (yych <= 'Z') {
4041
if (yych <= '@')
4042
goto yy94;
4043
goto yy188;
4044
} else {
4045
if (yych <= '`')
4046
goto yy94;
4047
if (yych <= 'z')
4048
goto yy188;
4049
goto yy94;
4050
}
4051
}
4052
yy186:
4053
++p;
4054
yych = *p;
4055
if (yych <= '=') {
4056
if (yych <= '.') {
4057
if (yych <= ',')
4058
goto yy94;
4059
if (yych >= '.')
4060
goto yy95;
4061
} else {
4062
if (yych <= '/')
4063
goto yy94;
4064
if (yych <= '9')
4065
goto yy188;
4066
goto yy94;
4067
}
4068
} else {
4069
if (yych <= 'Z') {
4070
if (yych <= '>')
4071
goto yy99;
4072
if (yych <= '@')
4073
goto yy94;
4074
goto yy188;
4075
} else {
4076
if (yych <= '`')
4077
goto yy94;
4078
if (yych <= 'z')
4079
goto yy188;
4080
goto yy94;
4081
}
4082
}
4083
yy187:
4084
++p;
4085
yych = *p;
4086
if (yych <= '9') {
4087
if (yych == '-')
4088
goto yy189;
4089
if (yych <= '/')
4090
goto yy94;
4091
goto yy190;
4092
} else {
4093
if (yych <= 'Z') {
4094
if (yych <= '@')
4095
goto yy94;
4096
goto yy190;
4097
} else {
4098
if (yych <= '`')
4099
goto yy94;
4100
if (yych <= 'z')
4101
goto yy190;
4102
goto yy94;
4103
}
4104
}
4105
yy188:
4106
++p;
4107
yych = *p;
4108
if (yych <= '=') {
4109
if (yych <= '.') {
4110
if (yych <= ',')
4111
goto yy94;
4112
if (yych >= '.')
4113
goto yy95;
4114
} else {
4115
if (yych <= '/')
4116
goto yy94;
4117
if (yych <= '9')
4118
goto yy190;
4119
goto yy94;
4120
}
4121
} else {
4122
if (yych <= 'Z') {
4123
if (yych <= '>')
4124
goto yy99;
4125
if (yych <= '@')
4126
goto yy94;
4127
goto yy190;
4128
} else {
4129
if (yych <= '`')
4130
goto yy94;
4131
if (yych <= 'z')
4132
goto yy190;
4133
goto yy94;
4134
}
4135
}
4136
yy189:
4137
++p;
4138
yych = *p;
4139
if (yych <= '9') {
4140
if (yych == '-')
4141
goto yy191;
4142
if (yych <= '/')
4143
goto yy94;
4144
goto yy192;
4145
} else {
4146
if (yych <= 'Z') {
4147
if (yych <= '@')
4148
goto yy94;
4149
goto yy192;
4150
} else {
4151
if (yych <= '`')
4152
goto yy94;
4153
if (yych <= 'z')
4154
goto yy192;
4155
goto yy94;
4156
}
4157
}
4158
yy190:
4159
++p;
4160
yych = *p;
4161
if (yych <= '=') {
4162
if (yych <= '.') {
4163
if (yych <= ',')
4164
goto yy94;
4165
if (yych >= '.')
4166
goto yy95;
4167
} else {
4168
if (yych <= '/')
4169
goto yy94;
4170
if (yych <= '9')
4171
goto yy192;
4172
goto yy94;
4173
}
4174
} else {
4175
if (yych <= 'Z') {
4176
if (yych <= '>')
4177
goto yy99;
4178
if (yych <= '@')
4179
goto yy94;
4180
goto yy192;
4181
} else {
4182
if (yych <= '`')
4183
goto yy94;
4184
if (yych <= 'z')
4185
goto yy192;
4186
goto yy94;
4187
}
4188
}
4189
yy191:
4190
++p;
4191
yych = *p;
4192
if (yych <= '9') {
4193
if (yych == '-')
4194
goto yy193;
4195
if (yych <= '/')
4196
goto yy94;
4197
goto yy194;
4198
} else {
4199
if (yych <= 'Z') {
4200
if (yych <= '@')
4201
goto yy94;
4202
goto yy194;
4203
} else {
4204
if (yych <= '`')
4205
goto yy94;
4206
if (yych <= 'z')
4207
goto yy194;
4208
goto yy94;
4209
}
4210
}
4211
yy192:
4212
++p;
4213
yych = *p;
4214
if (yych <= '=') {
4215
if (yych <= '.') {
4216
if (yych <= ',')
4217
goto yy94;
4218
if (yych >= '.')
4219
goto yy95;
4220
} else {
4221
if (yych <= '/')
4222
goto yy94;
4223
if (yych <= '9')
4224
goto yy194;
4225
goto yy94;
4226
}
4227
} else {
4228
if (yych <= 'Z') {
4229
if (yych <= '>')
4230
goto yy99;
4231
if (yych <= '@')
4232
goto yy94;
4233
goto yy194;
4234
} else {
4235
if (yych <= '`')
4236
goto yy94;
4237
if (yych <= 'z')
4238
goto yy194;
4239
goto yy94;
4240
}
4241
}
4242
yy193:
4243
++p;
4244
yych = *p;
4245
if (yych <= '9') {
4246
if (yych == '-')
4247
goto yy195;
4248
if (yych <= '/')
4249
goto yy94;
4250
goto yy196;
4251
} else {
4252
if (yych <= 'Z') {
4253
if (yych <= '@')
4254
goto yy94;
4255
goto yy196;
4256
} else {
4257
if (yych <= '`')
4258
goto yy94;
4259
if (yych <= 'z')
4260
goto yy196;
4261
goto yy94;
4262
}
4263
}
4264
yy194:
4265
++p;
4266
yych = *p;
4267
if (yych <= '=') {
4268
if (yych <= '.') {
4269
if (yych <= ',')
4270
goto yy94;
4271
if (yych >= '.')
4272
goto yy95;
4273
} else {
4274
if (yych <= '/')
4275
goto yy94;
4276
if (yych <= '9')
4277
goto yy196;
4278
goto yy94;
4279
}
4280
} else {
4281
if (yych <= 'Z') {
4282
if (yych <= '>')
4283
goto yy99;
4284
if (yych <= '@')
4285
goto yy94;
4286
goto yy196;
4287
} else {
4288
if (yych <= '`')
4289
goto yy94;
4290
if (yych <= 'z')
4291
goto yy196;
4292
goto yy94;
4293
}
4294
}
4295
yy195:
4296
++p;
4297
yych = *p;
4298
if (yych <= '9') {
4299
if (yych == '-')
4300
goto yy197;
4301
if (yych <= '/')
4302
goto yy94;
4303
goto yy198;
4304
} else {
4305
if (yych <= 'Z') {
4306
if (yych <= '@')
4307
goto yy94;
4308
goto yy198;
4309
} else {
4310
if (yych <= '`')
4311
goto yy94;
4312
if (yych <= 'z')
4313
goto yy198;
4314
goto yy94;
4315
}
4316
}
4317
yy196:
4318
++p;
4319
yych = *p;
4320
if (yych <= '=') {
4321
if (yych <= '.') {
4322
if (yych <= ',')
4323
goto yy94;
4324
if (yych >= '.')
4325
goto yy95;
4326
} else {
4327
if (yych <= '/')
4328
goto yy94;
4329
if (yych <= '9')
4330
goto yy198;
4331
goto yy94;
4332
}
4333
} else {
4334
if (yych <= 'Z') {
4335
if (yych <= '>')
4336
goto yy99;
4337
if (yych <= '@')
4338
goto yy94;
4339
goto yy198;
4340
} else {
4341
if (yych <= '`')
4342
goto yy94;
4343
if (yych <= 'z')
4344
goto yy198;
4345
goto yy94;
4346
}
4347
}
4348
yy197:
4349
++p;
4350
yych = *p;
4351
if (yych <= '9') {
4352
if (yych == '-')
4353
goto yy199;
4354
if (yych <= '/')
4355
goto yy94;
4356
goto yy200;
4357
} else {
4358
if (yych <= 'Z') {
4359
if (yych <= '@')
4360
goto yy94;
4361
goto yy200;
4362
} else {
4363
if (yych <= '`')
4364
goto yy94;
4365
if (yych <= 'z')
4366
goto yy200;
4367
goto yy94;
4368
}
4369
}
4370
yy198:
4371
++p;
4372
yych = *p;
4373
if (yych <= '=') {
4374
if (yych <= '.') {
4375
if (yych <= ',')
4376
goto yy94;
4377
if (yych >= '.')
4378
goto yy95;
4379
} else {
4380
if (yych <= '/')
4381
goto yy94;
4382
if (yych <= '9')
4383
goto yy200;
4384
goto yy94;
4385
}
4386
} else {
4387
if (yych <= 'Z') {
4388
if (yych <= '>')
4389
goto yy99;
4390
if (yych <= '@')
4391
goto yy94;
4392
goto yy200;
4393
} else {
4394
if (yych <= '`')
4395
goto yy94;
4396
if (yych <= 'z')
4397
goto yy200;
4398
goto yy94;
4399
}
4400
}
4401
yy199:
4402
++p;
4403
yych = *p;
4404
if (yych <= '9') {
4405
if (yych == '-')
4406
goto yy201;
4407
if (yych <= '/')
4408
goto yy94;
4409
goto yy202;
4410
} else {
4411
if (yych <= 'Z') {
4412
if (yych <= '@')
4413
goto yy94;
4414
goto yy202;
4415
} else {
4416
if (yych <= '`')
4417
goto yy94;
4418
if (yych <= 'z')
4419
goto yy202;
4420
goto yy94;
4421
}
4422
}
4423
yy200:
4424
++p;
4425
yych = *p;
4426
if (yych <= '=') {
4427
if (yych <= '.') {
4428
if (yych <= ',')
4429
goto yy94;
4430
if (yych >= '.')
4431
goto yy95;
4432
} else {
4433
if (yych <= '/')
4434
goto yy94;
4435
if (yych <= '9')
4436
goto yy202;
4437
goto yy94;
4438
}
4439
} else {
4440
if (yych <= 'Z') {
4441
if (yych <= '>')
4442
goto yy99;
4443
if (yych <= '@')
4444
goto yy94;
4445
goto yy202;
4446
} else {
4447
if (yych <= '`')
4448
goto yy94;
4449
if (yych <= 'z')
4450
goto yy202;
4451
goto yy94;
4452
}
4453
}
4454
yy201:
4455
++p;
4456
yych = *p;
4457
if (yych <= '9') {
4458
if (yych == '-')
4459
goto yy203;
4460
if (yych <= '/')
4461
goto yy94;
4462
goto yy204;
4463
} else {
4464
if (yych <= 'Z') {
4465
if (yych <= '@')
4466
goto yy94;
4467
goto yy204;
4468
} else {
4469
if (yych <= '`')
4470
goto yy94;
4471
if (yych <= 'z')
4472
goto yy204;
4473
goto yy94;
4474
}
4475
}
4476
yy202:
4477
++p;
4478
yych = *p;
4479
if (yych <= '=') {
4480
if (yych <= '.') {
4481
if (yych <= ',')
4482
goto yy94;
4483
if (yych >= '.')
4484
goto yy95;
4485
} else {
4486
if (yych <= '/')
4487
goto yy94;
4488
if (yych <= '9')
4489
goto yy204;
4490
goto yy94;
4491
}
4492
} else {
4493
if (yych <= 'Z') {
4494
if (yych <= '>')
4495
goto yy99;
4496
if (yych <= '@')
4497
goto yy94;
4498
goto yy204;
4499
} else {
4500
if (yych <= '`')
4501
goto yy94;
4502
if (yych <= 'z')
4503
goto yy204;
4504
goto yy94;
4505
}
4506
}
4507
yy203:
4508
++p;
4509
yych = *p;
4510
if (yych <= '9') {
4511
if (yych == '-')
4512
goto yy205;
4513
if (yych <= '/')
4514
goto yy94;
4515
goto yy206;
4516
} else {
4517
if (yych <= 'Z') {
4518
if (yych <= '@')
4519
goto yy94;
4520
goto yy206;
4521
} else {
4522
if (yych <= '`')
4523
goto yy94;
4524
if (yych <= 'z')
4525
goto yy206;
4526
goto yy94;
4527
}
4528
}
4529
yy204:
4530
++p;
4531
yych = *p;
4532
if (yych <= '=') {
4533
if (yych <= '.') {
4534
if (yych <= ',')
4535
goto yy94;
4536
if (yych >= '.')
4537
goto yy95;
4538
} else {
4539
if (yych <= '/')
4540
goto yy94;
4541
if (yych <= '9')
4542
goto yy206;
4543
goto yy94;
4544
}
4545
} else {
4546
if (yych <= 'Z') {
4547
if (yych <= '>')
4548
goto yy99;
4549
if (yych <= '@')
4550
goto yy94;
4551
goto yy206;
4552
} else {
4553
if (yych <= '`')
4554
goto yy94;
4555
if (yych <= 'z')
4556
goto yy206;
4557
goto yy94;
4558
}
4559
}
4560
yy205:
4561
++p;
4562
yych = *p;
4563
if (yych <= '9') {
4564
if (yych == '-')
4565
goto yy207;
4566
if (yych <= '/')
4567
goto yy94;
4568
goto yy208;
4569
} else {
4570
if (yych <= 'Z') {
4571
if (yych <= '@')
4572
goto yy94;
4573
goto yy208;
4574
} else {
4575
if (yych <= '`')
4576
goto yy94;
4577
if (yych <= 'z')
4578
goto yy208;
4579
goto yy94;
4580
}
4581
}
4582
yy206:
4583
++p;
4584
yych = *p;
4585
if (yych <= '=') {
4586
if (yych <= '.') {
4587
if (yych <= ',')
4588
goto yy94;
4589
if (yych >= '.')
4590
goto yy95;
4591
} else {
4592
if (yych <= '/')
4593
goto yy94;
4594
if (yych <= '9')
4595
goto yy208;
4596
goto yy94;
4597
}
4598
} else {
4599
if (yych <= 'Z') {
4600
if (yych <= '>')
4601
goto yy99;
4602
if (yych <= '@')
4603
goto yy94;
4604
goto yy208;
4605
} else {
4606
if (yych <= '`')
4607
goto yy94;
4608
if (yych <= 'z')
4609
goto yy208;
4610
goto yy94;
4611
}
4612
}
4613
yy207:
4614
++p;
4615
yych = *p;
4616
if (yych <= '9') {
4617
if (yych == '-')
4618
goto yy209;
4619
if (yych <= '/')
4620
goto yy94;
4621
goto yy210;
4622
} else {
4623
if (yych <= 'Z') {
4624
if (yych <= '@')
4625
goto yy94;
4626
goto yy210;
4627
} else {
4628
if (yych <= '`')
4629
goto yy94;
4630
if (yych <= 'z')
4631
goto yy210;
4632
goto yy94;
4633
}
4634
}
4635
yy208:
4636
++p;
4637
yych = *p;
4638
if (yych <= '=') {
4639
if (yych <= '.') {
4640
if (yych <= ',')
4641
goto yy94;
4642
if (yych >= '.')
4643
goto yy95;
4644
} else {
4645
if (yych <= '/')
4646
goto yy94;
4647
if (yych <= '9')
4648
goto yy210;
4649
goto yy94;
4650
}
4651
} else {
4652
if (yych <= 'Z') {
4653
if (yych <= '>')
4654
goto yy99;
4655
if (yych <= '@')
4656
goto yy94;
4657
goto yy210;
4658
} else {
4659
if (yych <= '`')
4660
goto yy94;
4661
if (yych <= 'z')
4662
goto yy210;
4663
goto yy94;
4664
}
4665
}
4666
yy209:
4667
++p;
4668
yych = *p;
4669
if (yych <= '9') {
4670
if (yych == '-')
4671
goto yy211;
4672
if (yych <= '/')
4673
goto yy94;
4674
goto yy212;
4675
} else {
4676
if (yych <= 'Z') {
4677
if (yych <= '@')
4678
goto yy94;
4679
goto yy212;
4680
} else {
4681
if (yych <= '`')
4682
goto yy94;
4683
if (yych <= 'z')
4684
goto yy212;
4685
goto yy94;
4686
}
4687
}
4688
yy210:
4689
++p;
4690
yych = *p;
4691
if (yych <= '=') {
4692
if (yych <= '.') {
4693
if (yych <= ',')
4694
goto yy94;
4695
if (yych >= '.')
4696
goto yy95;
4697
} else {
4698
if (yych <= '/')
4699
goto yy94;
4700
if (yych <= '9')
4701
goto yy212;
4702
goto yy94;
4703
}
4704
} else {
4705
if (yych <= 'Z') {
4706
if (yych <= '>')
4707
goto yy99;
4708
if (yych <= '@')
4709
goto yy94;
4710
goto yy212;
4711
} else {
4712
if (yych <= '`')
4713
goto yy94;
4714
if (yych <= 'z')
4715
goto yy212;
4716
goto yy94;
4717
}
4718
}
4719
yy211:
4720
++p;
4721
yych = *p;
4722
if (yych <= '9') {
4723
if (yych == '-')
4724
goto yy213;
4725
if (yych <= '/')
4726
goto yy94;
4727
goto yy214;
4728
} else {
4729
if (yych <= 'Z') {
4730
if (yych <= '@')
4731
goto yy94;
4732
goto yy214;
4733
} else {
4734
if (yych <= '`')
4735
goto yy94;
4736
if (yych <= 'z')
4737
goto yy214;
4738
goto yy94;
4739
}
4740
}
4741
yy212:
4742
++p;
4743
yych = *p;
4744
if (yych <= '=') {
4745
if (yych <= '.') {
4746
if (yych <= ',')
4747
goto yy94;
4748
if (yych >= '.')
4749
goto yy95;
4750
} else {
4751
if (yych <= '/')
4752
goto yy94;
4753
if (yych <= '9')
4754
goto yy214;
4755
goto yy94;
4756
}
4757
} else {
4758
if (yych <= 'Z') {
4759
if (yych <= '>')
4760
goto yy99;
4761
if (yych <= '@')
4762
goto yy94;
4763
goto yy214;
4764
} else {
4765
if (yych <= '`')
4766
goto yy94;
4767
if (yych <= 'z')
4768
goto yy214;
4769
goto yy94;
4770
}
4771
}
4772
yy213:
4773
++p;
4774
yych = *p;
4775
if (yych <= '9') {
4776
if (yych == '-')
4777
goto yy215;
4778
if (yych <= '/')
4779
goto yy94;
4780
goto yy216;
4781
} else {
4782
if (yych <= 'Z') {
4783
if (yych <= '@')
4784
goto yy94;
4785
goto yy216;
4786
} else {
4787
if (yych <= '`')
4788
goto yy94;
4789
if (yych <= 'z')
4790
goto yy216;
4791
goto yy94;
4792
}
4793
}
4794
yy214:
4795
++p;
4796
yych = *p;
4797
if (yych <= '=') {
4798
if (yych <= '.') {
4799
if (yych <= ',')
4800
goto yy94;
4801
if (yych >= '.')
4802
goto yy95;
4803
} else {
4804
if (yych <= '/')
4805
goto yy94;
4806
if (yych <= '9')
4807
goto yy216;
4808
goto yy94;
4809
}
4810
} else {
4811
if (yych <= 'Z') {
4812
if (yych <= '>')
4813
goto yy99;
4814
if (yych <= '@')
4815
goto yy94;
4816
goto yy216;
4817
} else {
4818
if (yych <= '`')
4819
goto yy94;
4820
if (yych <= 'z')
4821
goto yy216;
4822
goto yy94;
4823
}
4824
}
4825
yy215:
4826
++p;
4827
yych = *p;
4828
if (yych <= '9') {
4829
if (yych == '-')
4830
goto yy217;
4831
if (yych <= '/')
4832
goto yy94;
4833
goto yy218;
4834
} else {
4835
if (yych <= 'Z') {
4836
if (yych <= '@')
4837
goto yy94;
4838
goto yy218;
4839
} else {
4840
if (yych <= '`')
4841
goto yy94;
4842
if (yych <= 'z')
4843
goto yy218;
4844
goto yy94;
4845
}
4846
}
4847
yy216:
4848
++p;
4849
yych = *p;
4850
if (yych <= '=') {
4851
if (yych <= '.') {
4852
if (yych <= ',')
4853
goto yy94;
4854
if (yych >= '.')
4855
goto yy95;
4856
} else {
4857
if (yych <= '/')
4858
goto yy94;
4859
if (yych <= '9')
4860
goto yy218;
4861
goto yy94;
4862
}
4863
} else {
4864
if (yych <= 'Z') {
4865
if (yych <= '>')
4866
goto yy99;
4867
if (yych <= '@')
4868
goto yy94;
4869
goto yy218;
4870
} else {
4871
if (yych <= '`')
4872
goto yy94;
4873
if (yych <= 'z')
4874
goto yy218;
4875
goto yy94;
4876
}
4877
}
4878
yy217:
4879
++p;
4880
yych = *p;
4881
if (yych <= '9') {
4882
if (yych == '-')
4883
goto yy219;
4884
if (yych <= '/')
4885
goto yy94;
4886
goto yy220;
4887
} else {
4888
if (yych <= 'Z') {
4889
if (yych <= '@')
4890
goto yy94;
4891
goto yy220;
4892
} else {
4893
if (yych <= '`')
4894
goto yy94;
4895
if (yych <= 'z')
4896
goto yy220;
4897
goto yy94;
4898
}
4899
}
4900
yy218:
4901
++p;
4902
yych = *p;
4903
if (yych <= '=') {
4904
if (yych <= '.') {
4905
if (yych <= ',')
4906
goto yy94;
4907
if (yych >= '.')
4908
goto yy95;
4909
} else {
4910
if (yych <= '/')
4911
goto yy94;
4912
if (yych <= '9')
4913
goto yy220;
4914
goto yy94;
4915
}
4916
} else {
4917
if (yych <= 'Z') {
4918
if (yych <= '>')
4919
goto yy99;
4920
if (yych <= '@')
4921
goto yy94;
4922
goto yy220;
4923
} else {
4924
if (yych <= '`')
4925
goto yy94;
4926
if (yych <= 'z')
4927
goto yy220;
4928
goto yy94;
4929
}
4930
}
4931
yy219:
4932
++p;
4933
yych = *p;
4934
if (yych <= '@') {
4935
if (yych <= '/')
4936
goto yy94;
4937
if (yych <= '9')
4938
goto yy221;
4939
goto yy94;
4940
} else {
4941
if (yych <= 'Z')
4942
goto yy221;
4943
if (yych <= '`')
4944
goto yy94;
4945
if (yych <= 'z')
4946
goto yy221;
4947
goto yy94;
4948
}
4949
yy220:
4950
++p;
4951
yych = *p;
4952
if (yych <= '=') {
4953
if (yych <= '.') {
4954
if (yych <= '-')
4955
goto yy94;
4956
goto yy95;
4957
} else {
4958
if (yych <= '/')
4959
goto yy94;
4960
if (yych >= ':')
4961
goto yy94;
4962
}
4963
} else {
4964
if (yych <= 'Z') {
4965
if (yych <= '>')
4966
goto yy99;
4967
if (yych <= '@')
4968
goto yy94;
4969
} else {
4970
if (yych <= '`')
4971
goto yy94;
4972
if (yych >= '{')
4973
goto yy94;
4974
}
4975
}
4976
yy221:
4977
++p;
4978
yych = *p;
4979
if (yych == '.')
4980
goto yy95;
4981
if (yych == '>')
4982
goto yy99;
4983
goto yy94;
4984
}
4985
}
4986
4987
// Try to match an HTML tag after first <, returning num of chars matched.
4988
bufsize_t _scan_html_tag(const unsigned char *p) {
4989
const unsigned char *marker = NULL;
4990
const unsigned char *start = p;
4991
4992
{
4993
unsigned char yych;
4994
static const unsigned char yybm[] = {
4995
/* table 1 .. 8: 0 */
4996
0, 250, 250, 250, 250, 250, 250, 250, 250, 235, 235, 235, 235, 235, 250,
4997
250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250,
4998
250, 250, 250, 235, 250, 202, 250, 250, 250, 250, 170, 250, 250, 250,
4999
250, 250, 246, 254, 250, 254, 254, 254, 254, 254, 254, 254, 254, 254,
5000
254, 254, 250, 234, 234, 232, 250, 250, 254, 254, 254, 254, 254, 254,
5001
254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254,
5002
254, 254, 254, 254, 254, 254, 250, 250, 122, 250, 254, 234, 254, 254,
5003
254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254,
5004
254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 250, 250, 250, 250,
5005
250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5006
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5007
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5008
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5009
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5010
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5011
/* table 9 .. 11: 256 */
5012
0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
5013
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
5014
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
5015
128, 128, 192, 128, 128, 192, 192, 192, 192, 192, 192, 192, 192, 192,
5016
192, 128, 128, 128, 128, 128, 0, 128, 224, 224, 224, 224, 224, 224, 224,
5017
224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224,
5018
224, 224, 224, 224, 224, 128, 128, 128, 128, 128, 128, 192, 192, 192,
5019
192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
5020
192, 192, 192, 192, 192, 192, 192, 192, 192, 128, 128, 128, 128, 128, 0,
5021
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5022
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5023
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5024
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5025
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5026
0, 0, 0, 0, 0, 0, 0,
5027
};
5028
yych = *p;
5029
if (yych <= '>') {
5030
if (yych <= '!') {
5031
if (yych >= '!')
5032
goto yy226;
5033
} else {
5034
if (yych == '/')
5035
goto yy227;
5036
}
5037
} else {
5038
if (yych <= 'Z') {
5039
if (yych <= '?')
5040
goto yy228;
5041
if (yych >= 'A')
5042
goto yy229;
5043
} else {
5044
if (yych <= '`')
5045
goto yy224;
5046
if (yych <= 'z')
5047
goto yy229;
5048
}
5049
}
5050
yy224:
5051
++p;
5052
yy225 : { return 0; }
5053
yy226:
5054
yych = *(marker = ++p);
5055
if (yybm[256 + yych] & 32) {
5056
goto yy232;
5057
}
5058
if (yych == '-')
5059
goto yy230;
5060
if (yych <= '@')
5061
goto yy225;
5062
if (yych <= '[')
5063
goto yy234;
5064
goto yy225;
5065
yy227:
5066
yych = *(marker = ++p);
5067
if (yych <= '@')
5068
goto yy225;
5069
if (yych <= 'Z')
5070
goto yy235;
5071
if (yych <= '`')
5072
goto yy225;
5073
if (yych <= 'z')
5074
goto yy235;
5075
goto yy225;
5076
yy228:
5077
yych = *(marker = ++p);
5078
if (yych <= 0x00)
5079
goto yy225;
5080
if (yych <= 0x7F)
5081
goto yy238;
5082
if (yych <= 0xC1)
5083
goto yy225;
5084
if (yych <= 0xF4)
5085
goto yy238;
5086
goto yy225;
5087
yy229:
5088
yych = *(marker = ++p);
5089
if (yybm[0 + yych] & 1) {
5090
goto yy247;
5091
}
5092
if (yych <= '=') {
5093
if (yych <= '.') {
5094
if (yych == '-')
5095
goto yy249;
5096
goto yy225;
5097
} else {
5098
if (yych <= '/')
5099
goto yy251;
5100
if (yych <= '9')
5101
goto yy249;
5102
goto yy225;
5103
}
5104
} else {
5105
if (yych <= 'Z') {
5106
if (yych <= '>')
5107
goto yy252;
5108
if (yych <= '@')
5109
goto yy225;
5110
goto yy249;
5111
} else {
5112
if (yych <= '`')
5113
goto yy225;
5114
if (yych <= 'z')
5115
goto yy249;
5116
goto yy225;
5117
}
5118
}
5119
yy230:
5120
yych = *++p;
5121
if (yych == '-')
5122
goto yy254;
5123
yy231:
5124
p = marker;
5125
goto yy225;
5126
yy232:
5127
++p;
5128
yych = *p;
5129
if (yybm[256 + yych] & 32) {
5130
goto yy232;
5131
}
5132
if (yych <= 0x08)
5133
goto yy231;
5134
if (yych <= '\r')
5135
goto yy255;
5136
if (yych == ' ')
5137
goto yy255;
5138
goto yy231;
5139
yy234:
5140
yych = *++p;
5141
if (yych == 'C')
5142
goto yy257;
5143
if (yych == 'c')
5144
goto yy257;
5145
goto yy231;
5146
yy235:
5147
++p;
5148
yych = *p;
5149
if (yybm[256 + yych] & 64) {
5150
goto yy235;
5151
}
5152
if (yych <= 0x1F) {
5153
if (yych <= 0x08)
5154
goto yy231;
5155
if (yych <= '\r')
5156
goto yy258;
5157
goto yy231;
5158
} else {
5159
if (yych <= ' ')
5160
goto yy258;
5161
if (yych == '>')
5162
goto yy252;
5163
goto yy231;
5164
}
5165
yy237:
5166
++p;
5167
yych = *p;
5168
yy238:
5169
if (yybm[256 + yych] & 128) {
5170
goto yy237;
5171
}
5172
if (yych <= 0xEC) {
5173
if (yych <= 0xC1) {
5174
if (yych <= 0x00)
5175
goto yy231;
5176
if (yych >= '@')
5177
goto yy231;
5178
} else {
5179
if (yych <= 0xDF)
5180
goto yy240;
5181
if (yych <= 0xE0)
5182
goto yy241;
5183
goto yy242;
5184
}
5185
} else {
5186
if (yych <= 0xF0) {
5187
if (yych <= 0xED)
5188
goto yy243;
5189
if (yych <= 0xEF)
5190
goto yy242;
5191
goto yy244;
5192
} else {
5193
if (yych <= 0xF3)
5194
goto yy245;
5195
if (yych <= 0xF4)
5196
goto yy246;
5197
goto yy231;
5198
}
5199
}
5200
++p;
5201
yych = *p;
5202
if (yych <= 0xE0) {
5203
if (yych <= '>') {
5204
if (yych <= 0x00)
5205
goto yy231;
5206
if (yych <= '=')
5207
goto yy237;
5208
goto yy252;
5209
} else {
5210
if (yych <= 0x7F)
5211
goto yy237;
5212
if (yych <= 0xC1)
5213
goto yy231;
5214
if (yych >= 0xE0)
5215
goto yy241;
5216
}
5217
} else {
5218
if (yych <= 0xEF) {
5219
if (yych == 0xED)
5220
goto yy243;
5221
goto yy242;
5222
} else {
5223
if (yych <= 0xF0)
5224
goto yy244;
5225
if (yych <= 0xF3)
5226
goto yy245;
5227
if (yych <= 0xF4)
5228
goto yy246;
5229
goto yy231;
5230
}
5231
}
5232
yy240:
5233
++p;
5234
yych = *p;
5235
if (yych <= 0x7F)
5236
goto yy231;
5237
if (yych <= 0xBF)
5238
goto yy237;
5239
goto yy231;
5240
yy241:
5241
++p;
5242
yych = *p;
5243
if (yych <= 0x9F)
5244
goto yy231;
5245
if (yych <= 0xBF)
5246
goto yy240;
5247
goto yy231;
5248
yy242:
5249
++p;
5250
yych = *p;
5251
if (yych <= 0x7F)
5252
goto yy231;
5253
if (yych <= 0xBF)
5254
goto yy240;
5255
goto yy231;
5256
yy243:
5257
++p;
5258
yych = *p;
5259
if (yych <= 0x7F)
5260
goto yy231;
5261
if (yych <= 0x9F)
5262
goto yy240;
5263
goto yy231;
5264
yy244:
5265
++p;
5266
yych = *p;
5267
if (yych <= 0x8F)
5268
goto yy231;
5269
if (yych <= 0xBF)
5270
goto yy242;
5271
goto yy231;
5272
yy245:
5273
++p;
5274
yych = *p;
5275
if (yych <= 0x7F)
5276
goto yy231;
5277
if (yych <= 0xBF)
5278
goto yy242;
5279
goto yy231;
5280
yy246:
5281
++p;
5282
yych = *p;
5283
if (yych <= 0x7F)
5284
goto yy231;
5285
if (yych <= 0x8F)
5286
goto yy242;
5287
goto yy231;
5288
yy247:
5289
++p;
5290
yych = *p;
5291
if (yybm[0 + yych] & 1) {
5292
goto yy247;
5293
}
5294
if (yych <= '>') {
5295
if (yych <= '9') {
5296
if (yych == '/')
5297
goto yy251;
5298
goto yy231;
5299
} else {
5300
if (yych <= ':')
5301
goto yy260;
5302
if (yych <= '=')
5303
goto yy231;
5304
goto yy252;
5305
}
5306
} else {
5307
if (yych <= '^') {
5308
if (yych <= '@')
5309
goto yy231;
5310
if (yych <= 'Z')
5311
goto yy260;
5312
goto yy231;
5313
} else {
5314
if (yych == '`')
5315
goto yy231;
5316
if (yych <= 'z')
5317
goto yy260;
5318
goto yy231;
5319
}
5320
}
5321
yy249:
5322
++p;
5323
yych = *p;
5324
if (yybm[0 + yych] & 1) {
5325
goto yy247;
5326
}
5327
if (yych <= '=') {
5328
if (yych <= '.') {
5329
if (yych == '-')
5330
goto yy249;
5331
goto yy231;
5332
} else {
5333
if (yych <= '/')
5334
goto yy251;
5335
if (yych <= '9')
5336
goto yy249;
5337
goto yy231;
5338
}
5339
} else {
5340
if (yych <= 'Z') {
5341
if (yych <= '>')
5342
goto yy252;
5343
if (yych <= '@')
5344
goto yy231;
5345
goto yy249;
5346
} else {
5347
if (yych <= '`')
5348
goto yy231;
5349
if (yych <= 'z')
5350
goto yy249;
5351
goto yy231;
5352
}
5353
}
5354
yy251:
5355
yych = *++p;
5356
if (yych != '>')
5357
goto yy231;
5358
yy252:
5359
++p;
5360
{ return (bufsize_t)(p - start); }
5361
yy254:
5362
yych = *++p;
5363
if (yych == '-')
5364
goto yy264;
5365
if (yych == '>')
5366
goto yy231;
5367
goto yy263;
5368
yy255:
5369
++p;
5370
yych = *p;
5371
if (yybm[0 + yych] & 2) {
5372
goto yy255;
5373
}
5374
if (yych <= 0xEC) {
5375
if (yych <= 0xC1) {
5376
if (yych <= 0x00)
5377
goto yy231;
5378
if (yych <= '>')
5379
goto yy252;
5380
goto yy231;
5381
} else {
5382
if (yych <= 0xDF)
5383
goto yy272;
5384
if (yych <= 0xE0)
5385
goto yy273;
5386
goto yy274;
5387
}
5388
} else {
5389
if (yych <= 0xF0) {
5390
if (yych <= 0xED)
5391
goto yy275;
5392
if (yych <= 0xEF)
5393
goto yy274;
5394
goto yy276;
5395
} else {
5396
if (yych <= 0xF3)
5397
goto yy277;
5398
if (yych <= 0xF4)
5399
goto yy278;
5400
goto yy231;
5401
}
5402
}
5403
yy257:
5404
yych = *++p;
5405
if (yych == 'D')
5406
goto yy279;
5407
if (yych == 'd')
5408
goto yy279;
5409
goto yy231;
5410
yy258:
5411
++p;
5412
yych = *p;
5413
if (yych <= 0x1F) {
5414
if (yych <= 0x08)
5415
goto yy231;
5416
if (yych <= '\r')
5417
goto yy258;
5418
goto yy231;
5419
} else {
5420
if (yych <= ' ')
5421
goto yy258;
5422
if (yych == '>')
5423
goto yy252;
5424
goto yy231;
5425
}
5426
yy260:
5427
++p;
5428
yych = *p;
5429
if (yybm[0 + yych] & 4) {
5430
goto yy260;
5431
}
5432
if (yych <= ',') {
5433
if (yych <= '\r') {
5434
if (yych <= 0x08)
5435
goto yy231;
5436
goto yy280;
5437
} else {
5438
if (yych == ' ')
5439
goto yy280;
5440
goto yy231;
5441
}
5442
} else {
5443
if (yych <= '<') {
5444
if (yych <= '/')
5445
goto yy251;
5446
goto yy231;
5447
} else {
5448
if (yych <= '=')
5449
goto yy282;
5450
if (yych <= '>')
5451
goto yy252;
5452
goto yy231;
5453
}
5454
}
5455
yy262:
5456
++p;
5457
yych = *p;
5458
yy263:
5459
if (yybm[0 + yych] & 8) {
5460
goto yy262;
5461
}
5462
if (yych <= 0xEC) {
5463
if (yych <= 0xC1) {
5464
if (yych <= 0x00)
5465
goto yy231;
5466
if (yych <= '-')
5467
goto yy283;
5468
goto yy231;
5469
} else {
5470
if (yych <= 0xDF)
5471
goto yy265;
5472
if (yych <= 0xE0)
5473
goto yy266;
5474
goto yy267;
5475
}
5476
} else {
5477
if (yych <= 0xF0) {
5478
if (yych <= 0xED)
5479
goto yy268;
5480
if (yych <= 0xEF)
5481
goto yy267;
5482
goto yy269;
5483
} else {
5484
if (yych <= 0xF3)
5485
goto yy270;
5486
if (yych <= 0xF4)
5487
goto yy271;
5488
goto yy231;
5489
}
5490
}
5491
yy264:
5492
yych = *++p;
5493
if (yych == '-')
5494
goto yy251;
5495
if (yych == '>')
5496
goto yy231;
5497
goto yy263;
5498
yy265:
5499
++p;
5500
yych = *p;
5501
if (yych <= 0x7F)
5502
goto yy231;
5503
if (yych <= 0xBF)
5504
goto yy262;
5505
goto yy231;
5506
yy266:
5507
++p;
5508
yych = *p;
5509
if (yych <= 0x9F)
5510
goto yy231;
5511
if (yych <= 0xBF)
5512
goto yy265;
5513
goto yy231;
5514
yy267:
5515
++p;
5516
yych = *p;
5517
if (yych <= 0x7F)
5518
goto yy231;
5519
if (yych <= 0xBF)
5520
goto yy265;
5521
goto yy231;
5522
yy268:
5523
++p;
5524
yych = *p;
5525
if (yych <= 0x7F)
5526
goto yy231;
5527
if (yych <= 0x9F)
5528
goto yy265;
5529
goto yy231;
5530
yy269:
5531
++p;
5532
yych = *p;
5533
if (yych <= 0x8F)
5534
goto yy231;
5535
if (yych <= 0xBF)
5536
goto yy267;
5537
goto yy231;
5538
yy270:
5539
++p;
5540
yych = *p;
5541
if (yych <= 0x7F)
5542
goto yy231;
5543
if (yych <= 0xBF)
5544
goto yy267;
5545
goto yy231;
5546
yy271:
5547
++p;
5548
yych = *p;
5549
if (yych <= 0x7F)
5550
goto yy231;
5551
if (yych <= 0x8F)
5552
goto yy267;
5553
goto yy231;
5554
yy272:
5555
++p;
5556
yych = *p;
5557
if (yych <= 0x7F)
5558
goto yy231;
5559
if (yych <= 0xBF)
5560
goto yy255;
5561
goto yy231;
5562
yy273:
5563
++p;
5564
yych = *p;
5565
if (yych <= 0x9F)
5566
goto yy231;
5567
if (yych <= 0xBF)
5568
goto yy272;
5569
goto yy231;
5570
yy274:
5571
++p;
5572
yych = *p;
5573
if (yych <= 0x7F)
5574
goto yy231;
5575
if (yych <= 0xBF)
5576
goto yy272;
5577
goto yy231;
5578
yy275:
5579
++p;
5580
yych = *p;
5581
if (yych <= 0x7F)
5582
goto yy231;
5583
if (yych <= 0x9F)
5584
goto yy272;
5585
goto yy231;
5586
yy276:
5587
++p;
5588
yych = *p;
5589
if (yych <= 0x8F)
5590
goto yy231;
5591
if (yych <= 0xBF)
5592
goto yy274;
5593
goto yy231;
5594
yy277:
5595
++p;
5596
yych = *p;
5597
if (yych <= 0x7F)
5598
goto yy231;
5599
if (yych <= 0xBF)
5600
goto yy274;
5601
goto yy231;
5602
yy278:
5603
++p;
5604
yych = *p;
5605
if (yych <= 0x7F)
5606
goto yy231;
5607
if (yych <= 0x8F)
5608
goto yy274;
5609
goto yy231;
5610
yy279:
5611
yych = *++p;
5612
if (yych == 'A')
5613
goto yy284;
5614
if (yych == 'a')
5615
goto yy284;
5616
goto yy231;
5617
yy280:
5618
++p;
5619
yych = *p;
5620
if (yych <= '<') {
5621
if (yych <= ' ') {
5622
if (yych <= 0x08)
5623
goto yy231;
5624
if (yych <= '\r')
5625
goto yy280;
5626
if (yych <= 0x1F)
5627
goto yy231;
5628
goto yy280;
5629
} else {
5630
if (yych <= '/') {
5631
if (yych <= '.')
5632
goto yy231;
5633
goto yy251;
5634
} else {
5635
if (yych == ':')
5636
goto yy260;
5637
goto yy231;
5638
}
5639
}
5640
} else {
5641
if (yych <= 'Z') {
5642
if (yych <= '=')
5643
goto yy282;
5644
if (yych <= '>')
5645
goto yy252;
5646
if (yych <= '@')
5647
goto yy231;
5648
goto yy260;
5649
} else {
5650
if (yych <= '_') {
5651
if (yych <= '^')
5652
goto yy231;
5653
goto yy260;
5654
} else {
5655
if (yych <= '`')
5656
goto yy231;
5657
if (yych <= 'z')
5658
goto yy260;
5659
goto yy231;
5660
}
5661
}
5662
}
5663
yy282:
5664
++p;
5665
yych = *p;
5666
if (yybm[0 + yych] & 16) {
5667
goto yy285;
5668
}
5669
if (yych <= 0xE0) {
5670
if (yych <= '"') {
5671
if (yych <= 0x00)
5672
goto yy231;
5673
if (yych <= ' ')
5674
goto yy287;
5675
goto yy288;
5676
} else {
5677
if (yych <= '\'')
5678
goto yy290;
5679
if (yych <= 0xC1)
5680
goto yy231;
5681
if (yych <= 0xDF)
5682
goto yy292;
5683
goto yy293;
5684
}
5685
} else {
5686
if (yych <= 0xEF) {
5687
if (yych == 0xED)
5688
goto yy295;
5689
goto yy294;
5690
} else {
5691
if (yych <= 0xF0)
5692
goto yy296;
5693
if (yych <= 0xF3)
5694
goto yy297;
5695
if (yych <= 0xF4)
5696
goto yy298;
5697
goto yy231;
5698
}
5699
}
5700
yy283:
5701
++p;
5702
yych = *p;
5703
if (yybm[0 + yych] & 8) {
5704
goto yy262;
5705
}
5706
if (yych <= 0xEC) {
5707
if (yych <= 0xC1) {
5708
if (yych <= 0x00)
5709
goto yy231;
5710
if (yych <= '-')
5711
goto yy251;
5712
goto yy231;
5713
} else {
5714
if (yych <= 0xDF)
5715
goto yy265;
5716
if (yych <= 0xE0)
5717
goto yy266;
5718
goto yy267;
5719
}
5720
} else {
5721
if (yych <= 0xF0) {
5722
if (yych <= 0xED)
5723
goto yy268;
5724
if (yych <= 0xEF)
5725
goto yy267;
5726
goto yy269;
5727
} else {
5728
if (yych <= 0xF3)
5729
goto yy270;
5730
if (yych <= 0xF4)
5731
goto yy271;
5732
goto yy231;
5733
}
5734
}
5735
yy284:
5736
yych = *++p;
5737
if (yych == 'T')
5738
goto yy299;
5739
if (yych == 't')
5740
goto yy299;
5741
goto yy231;
5742
yy285:
5743
++p;
5744
yych = *p;
5745
if (yybm[0 + yych] & 16) {
5746
goto yy285;
5747
}
5748
if (yych <= 0xE0) {
5749
if (yych <= '=') {
5750
if (yych <= 0x00)
5751
goto yy231;
5752
if (yych <= ' ')
5753
goto yy300;
5754
goto yy231;
5755
} else {
5756
if (yych <= '>')
5757
goto yy252;
5758
if (yych <= 0xC1)
5759
goto yy231;
5760
if (yych <= 0xDF)
5761
goto yy292;
5762
goto yy293;
5763
}
5764
} else {
5765
if (yych <= 0xEF) {
5766
if (yych == 0xED)
5767
goto yy295;
5768
goto yy294;
5769
} else {
5770
if (yych <= 0xF0)
5771
goto yy296;
5772
if (yych <= 0xF3)
5773
goto yy297;
5774
if (yych <= 0xF4)
5775
goto yy298;
5776
goto yy231;
5777
}
5778
}
5779
yy287:
5780
++p;
5781
yych = *p;
5782
if (yybm[0 + yych] & 16) {
5783
goto yy285;
5784
}
5785
if (yych <= 0xDF) {
5786
if (yych <= '\'') {
5787
if (yych <= 0x00)
5788
goto yy231;
5789
if (yych <= ' ')
5790
goto yy302;
5791
if (yych >= '#')
5792
goto yy290;
5793
} else {
5794
if (yych == '>')
5795
goto yy252;
5796
if (yych <= 0xC1)
5797
goto yy231;
5798
goto yy292;
5799
}
5800
} else {
5801
if (yych <= 0xEF) {
5802
if (yych <= 0xE0)
5803
goto yy293;
5804
if (yych == 0xED)
5805
goto yy295;
5806
goto yy294;
5807
} else {
5808
if (yych <= 0xF0)
5809
goto yy296;
5810
if (yych <= 0xF3)
5811
goto yy297;
5812
if (yych <= 0xF4)
5813
goto yy298;
5814
goto yy231;
5815
}
5816
}
5817
yy288:
5818
++p;
5819
yych = *p;
5820
if (yybm[0 + yych] & 32) {
5821
goto yy288;
5822
}
5823
if (yych <= 0xEC) {
5824
if (yych <= 0xC1) {
5825
if (yych <= 0x00)
5826
goto yy231;
5827
if (yych <= '"')
5828
goto yy304;
5829
goto yy231;
5830
} else {
5831
if (yych <= 0xDF)
5832
goto yy305;
5833
if (yych <= 0xE0)
5834
goto yy306;
5835
goto yy307;
5836
}
5837
} else {
5838
if (yych <= 0xF0) {
5839
if (yych <= 0xED)
5840
goto yy308;
5841
if (yych <= 0xEF)
5842
goto yy307;
5843
goto yy309;
5844
} else {
5845
if (yych <= 0xF3)
5846
goto yy310;
5847
if (yych <= 0xF4)
5848
goto yy311;
5849
goto yy231;
5850
}
5851
}
5852
yy290:
5853
++p;
5854
yych = *p;
5855
if (yybm[0 + yych] & 64) {
5856
goto yy290;
5857
}
5858
if (yych <= 0xEC) {
5859
if (yych <= 0xC1) {
5860
if (yych <= 0x00)
5861
goto yy231;
5862
if (yych <= '\'')
5863
goto yy304;
5864
goto yy231;
5865
} else {
5866
if (yych <= 0xDF)
5867
goto yy312;
5868
if (yych <= 0xE0)
5869
goto yy313;
5870
goto yy314;
5871
}
5872
} else {
5873
if (yych <= 0xF0) {
5874
if (yych <= 0xED)
5875
goto yy315;
5876
if (yych <= 0xEF)
5877
goto yy314;
5878
goto yy316;
5879
} else {
5880
if (yych <= 0xF3)
5881
goto yy317;
5882
if (yych <= 0xF4)
5883
goto yy318;
5884
goto yy231;
5885
}
5886
}
5887
yy292:
5888
++p;
5889
yych = *p;
5890
if (yych <= 0x7F)
5891
goto yy231;
5892
if (yych <= 0xBF)
5893
goto yy285;
5894
goto yy231;
5895
yy293:
5896
++p;
5897
yych = *p;
5898
if (yych <= 0x9F)
5899
goto yy231;
5900
if (yych <= 0xBF)
5901
goto yy292;
5902
goto yy231;
5903
yy294:
5904
++p;
5905
yych = *p;
5906
if (yych <= 0x7F)
5907
goto yy231;
5908
if (yych <= 0xBF)
5909
goto yy292;
5910
goto yy231;
5911
yy295:
5912
++p;
5913
yych = *p;
5914
if (yych <= 0x7F)
5915
goto yy231;
5916
if (yych <= 0x9F)
5917
goto yy292;
5918
goto yy231;
5919
yy296:
5920
++p;
5921
yych = *p;
5922
if (yych <= 0x8F)
5923
goto yy231;
5924
if (yych <= 0xBF)
5925
goto yy294;
5926
goto yy231;
5927
yy297:
5928
++p;
5929
yych = *p;
5930
if (yych <= 0x7F)
5931
goto yy231;
5932
if (yych <= 0xBF)
5933
goto yy294;
5934
goto yy231;
5935
yy298:
5936
++p;
5937
yych = *p;
5938
if (yych <= 0x7F)
5939
goto yy231;
5940
if (yych <= 0x8F)
5941
goto yy294;
5942
goto yy231;
5943
yy299:
5944
yych = *++p;
5945
if (yych == 'A')
5946
goto yy319;
5947
if (yych == 'a')
5948
goto yy319;
5949
goto yy231;
5950
yy300:
5951
++p;
5952
yych = *p;
5953
if (yych <= '@') {
5954
if (yych <= '"') {
5955
if (yych <= '\r') {
5956
if (yych <= 0x00)
5957
goto yy231;
5958
if (yych <= 0x08)
5959
goto yy285;
5960
goto yy300;
5961
} else {
5962
if (yych == ' ')
5963
goto yy300;
5964
if (yych <= '!')
5965
goto yy285;
5966
goto yy231;
5967
}
5968
} else {
5969
if (yych <= ':') {
5970
if (yych == '\'')
5971
goto yy231;
5972
if (yych <= '9')
5973
goto yy285;
5974
goto yy320;
5975
} else {
5976
if (yych <= ';')
5977
goto yy285;
5978
if (yych <= '=')
5979
goto yy231;
5980
if (yych <= '>')
5981
goto yy252;
5982
goto yy285;
5983
}
5984
}
5985
} else {
5986
if (yych <= 0xDF) {
5987
if (yych <= '`') {
5988
if (yych <= 'Z')
5989
goto yy320;
5990
if (yych <= '^')
5991
goto yy285;
5992
if (yych <= '_')
5993
goto yy320;
5994
goto yy231;
5995
} else {
5996
if (yych <= 'z')
5997
goto yy320;
5998
if (yych <= 0x7F)
5999
goto yy285;
6000
if (yych <= 0xC1)
6001
goto yy231;
6002
goto yy292;
6003
}
6004
} else {
6005
if (yych <= 0xEF) {
6006
if (yych <= 0xE0)
6007
goto yy293;
6008
if (yych == 0xED)
6009
goto yy295;
6010
goto yy294;
6011
} else {
6012
if (yych <= 0xF0)
6013
goto yy296;
6014
if (yych <= 0xF3)
6015
goto yy297;
6016
if (yych <= 0xF4)
6017
goto yy298;
6018
goto yy231;
6019
}
6020
}
6021
}
6022
yy302:
6023
++p;
6024
yych = *p;
6025
if (yych <= '@') {
6026
if (yych <= '"') {
6027
if (yych <= '\r') {
6028
if (yych <= 0x00)
6029
goto yy231;
6030
if (yych <= 0x08)
6031
goto yy285;
6032
goto yy302;
6033
} else {
6034
if (yych == ' ')
6035
goto yy302;
6036
if (yych <= '!')
6037
goto yy285;
6038
goto yy288;
6039
}
6040
} else {
6041
if (yych <= ':') {
6042
if (yych == '\'')
6043
goto yy290;
6044
if (yych <= '9')
6045
goto yy285;
6046
goto yy320;
6047
} else {
6048
if (yych <= ';')
6049
goto yy285;
6050
if (yych <= '=')
6051
goto yy231;
6052
if (yych <= '>')
6053
goto yy252;
6054
goto yy285;
6055
}
6056
}
6057
} else {
6058
if (yych <= 0xDF) {
6059
if (yych <= '`') {
6060
if (yych <= 'Z')
6061
goto yy320;
6062
if (yych <= '^')
6063
goto yy285;
6064
if (yych <= '_')
6065
goto yy320;
6066
goto yy231;
6067
} else {
6068
if (yych <= 'z')
6069
goto yy320;
6070
if (yych <= 0x7F)
6071
goto yy285;
6072
if (yych <= 0xC1)
6073
goto yy231;
6074
goto yy292;
6075
}
6076
} else {
6077
if (yych <= 0xEF) {
6078
if (yych <= 0xE0)
6079
goto yy293;
6080
if (yych == 0xED)
6081
goto yy295;
6082
goto yy294;
6083
} else {
6084
if (yych <= 0xF0)
6085
goto yy296;
6086
if (yych <= 0xF3)
6087
goto yy297;
6088
if (yych <= 0xF4)
6089
goto yy298;
6090
goto yy231;
6091
}
6092
}
6093
}
6094
yy304:
6095
++p;
6096
yych = *p;
6097
if (yybm[0 + yych] & 1) {
6098
goto yy247;
6099
}
6100
if (yych == '/')
6101
goto yy251;
6102
if (yych == '>')
6103
goto yy252;
6104
goto yy231;
6105
yy305:
6106
++p;
6107
yych = *p;
6108
if (yych <= 0x7F)
6109
goto yy231;
6110
if (yych <= 0xBF)
6111
goto yy288;
6112
goto yy231;
6113
yy306:
6114
++p;
6115
yych = *p;
6116
if (yych <= 0x9F)
6117
goto yy231;
6118
if (yych <= 0xBF)
6119
goto yy305;
6120
goto yy231;
6121
yy307:
6122
++p;
6123
yych = *p;
6124
if (yych <= 0x7F)
6125
goto yy231;
6126
if (yych <= 0xBF)
6127
goto yy305;
6128
goto yy231;
6129
yy308:
6130
++p;
6131
yych = *p;
6132
if (yych <= 0x7F)
6133
goto yy231;
6134
if (yych <= 0x9F)
6135
goto yy305;
6136
goto yy231;
6137
yy309:
6138
++p;
6139
yych = *p;
6140
if (yych <= 0x8F)
6141
goto yy231;
6142
if (yych <= 0xBF)
6143
goto yy307;
6144
goto yy231;
6145
yy310:
6146
++p;
6147
yych = *p;
6148
if (yych <= 0x7F)
6149
goto yy231;
6150
if (yych <= 0xBF)
6151
goto yy307;
6152
goto yy231;
6153
yy311:
6154
++p;
6155
yych = *p;
6156
if (yych <= 0x7F)
6157
goto yy231;
6158
if (yych <= 0x8F)
6159
goto yy307;
6160
goto yy231;
6161
yy312:
6162
++p;
6163
yych = *p;
6164
if (yych <= 0x7F)
6165
goto yy231;
6166
if (yych <= 0xBF)
6167
goto yy290;
6168
goto yy231;
6169
yy313:
6170
++p;
6171
yych = *p;
6172
if (yych <= 0x9F)
6173
goto yy231;
6174
if (yych <= 0xBF)
6175
goto yy312;
6176
goto yy231;
6177
yy314:
6178
++p;
6179
yych = *p;
6180
if (yych <= 0x7F)
6181
goto yy231;
6182
if (yych <= 0xBF)
6183
goto yy312;
6184
goto yy231;
6185
yy315:
6186
++p;
6187
yych = *p;
6188
if (yych <= 0x7F)
6189
goto yy231;
6190
if (yych <= 0x9F)
6191
goto yy312;
6192
goto yy231;
6193
yy316:
6194
++p;
6195
yych = *p;
6196
if (yych <= 0x8F)
6197
goto yy231;
6198
if (yych <= 0xBF)
6199
goto yy314;
6200
goto yy231;
6201
yy317:
6202
++p;
6203
yych = *p;
6204
if (yych <= 0x7F)
6205
goto yy231;
6206
if (yych <= 0xBF)
6207
goto yy314;
6208
goto yy231;
6209
yy318:
6210
++p;
6211
yych = *p;
6212
if (yych <= 0x7F)
6213
goto yy231;
6214
if (yych <= 0x8F)
6215
goto yy314;
6216
goto yy231;
6217
yy319:
6218
yych = *++p;
6219
if (yych == '[')
6220
goto yy322;
6221
goto yy231;
6222
yy320:
6223
++p;
6224
yych = *p;
6225
if (yych <= '>') {
6226
if (yych <= '&') {
6227
if (yych <= 0x1F) {
6228
if (yych <= 0x00)
6229
goto yy231;
6230
if (yych <= 0x08)
6231
goto yy285;
6232
if (yych <= '\r')
6233
goto yy324;
6234
goto yy285;
6235
} else {
6236
if (yych <= ' ')
6237
goto yy324;
6238
if (yych == '"')
6239
goto yy231;
6240
goto yy285;
6241
}
6242
} else {
6243
if (yych <= '/') {
6244
if (yych <= '\'')
6245
goto yy231;
6246
if (yych <= ',')
6247
goto yy285;
6248
if (yych <= '.')
6249
goto yy320;
6250
goto yy285;
6251
} else {
6252
if (yych <= ';') {
6253
if (yych <= ':')
6254
goto yy320;
6255
goto yy285;
6256
} else {
6257
if (yych <= '<')
6258
goto yy231;
6259
if (yych <= '=')
6260
goto yy282;
6261
goto yy252;
6262
}
6263
}
6264
}
6265
} else {
6266
if (yych <= 0xC1) {
6267
if (yych <= '_') {
6268
if (yych <= '@')
6269
goto yy285;
6270
if (yych <= 'Z')
6271
goto yy320;
6272
if (yych <= '^')
6273
goto yy285;
6274
goto yy320;
6275
} else {
6276
if (yych <= '`')
6277
goto yy231;
6278
if (yych <= 'z')
6279
goto yy320;
6280
if (yych <= 0x7F)
6281
goto yy285;
6282
goto yy231;
6283
}
6284
} else {
6285
if (yych <= 0xED) {
6286
if (yych <= 0xDF)
6287
goto yy292;
6288
if (yych <= 0xE0)
6289
goto yy293;
6290
if (yych <= 0xEC)
6291
goto yy294;
6292
goto yy295;
6293
} else {
6294
if (yych <= 0xF0) {
6295
if (yych <= 0xEF)
6296
goto yy294;
6297
goto yy296;
6298
} else {
6299
if (yych <= 0xF3)
6300
goto yy297;
6301
if (yych <= 0xF4)
6302
goto yy298;
6303
goto yy231;
6304
}
6305
}
6306
}
6307
}
6308
yy322:
6309
++p;
6310
yych = *p;
6311
if (yybm[0 + yych] & 128) {
6312
goto yy322;
6313
}
6314
if (yych <= 0xEC) {
6315
if (yych <= 0xC1) {
6316
if (yych <= 0x00)
6317
goto yy231;
6318
if (yych <= ']')
6319
goto yy326;
6320
goto yy231;
6321
} else {
6322
if (yych <= 0xDF)
6323
goto yy327;
6324
if (yych <= 0xE0)
6325
goto yy328;
6326
goto yy329;
6327
}
6328
} else {
6329
if (yych <= 0xF0) {
6330
if (yych <= 0xED)
6331
goto yy330;
6332
if (yych <= 0xEF)
6333
goto yy329;
6334
goto yy331;
6335
} else {
6336
if (yych <= 0xF3)
6337
goto yy332;
6338
if (yych <= 0xF4)
6339
goto yy333;
6340
goto yy231;
6341
}
6342
}
6343
yy324:
6344
++p;
6345
yych = *p;
6346
if (yych <= '@') {
6347
if (yych <= '&') {
6348
if (yych <= 0x1F) {
6349
if (yych <= 0x00)
6350
goto yy231;
6351
if (yych <= 0x08)
6352
goto yy285;
6353
if (yych <= '\r')
6354
goto yy324;
6355
goto yy285;
6356
} else {
6357
if (yych <= ' ')
6358
goto yy324;
6359
if (yych == '"')
6360
goto yy231;
6361
goto yy285;
6362
}
6363
} else {
6364
if (yych <= ';') {
6365
if (yych <= '\'')
6366
goto yy231;
6367
if (yych == ':')
6368
goto yy320;
6369
goto yy285;
6370
} else {
6371
if (yych <= '<')
6372
goto yy231;
6373
if (yych <= '=')
6374
goto yy282;
6375
if (yych <= '>')
6376
goto yy252;
6377
goto yy285;
6378
}
6379
}
6380
} else {
6381
if (yych <= 0xDF) {
6382
if (yych <= '`') {
6383
if (yych <= 'Z')
6384
goto yy320;
6385
if (yych <= '^')
6386
goto yy285;
6387
if (yych <= '_')
6388
goto yy320;
6389
goto yy231;
6390
} else {
6391
if (yych <= 'z')
6392
goto yy320;
6393
if (yych <= 0x7F)
6394
goto yy285;
6395
if (yych <= 0xC1)
6396
goto yy231;
6397
goto yy292;
6398
}
6399
} else {
6400
if (yych <= 0xEF) {
6401
if (yych <= 0xE0)
6402
goto yy293;
6403
if (yych == 0xED)
6404
goto yy295;
6405
goto yy294;
6406
} else {
6407
if (yych <= 0xF0)
6408
goto yy296;
6409
if (yych <= 0xF3)
6410
goto yy297;
6411
if (yych <= 0xF4)
6412
goto yy298;
6413
goto yy231;
6414
}
6415
}
6416
}
6417
yy326:
6418
++p;
6419
yych = *p;
6420
if (yybm[0 + yych] & 128) {
6421
goto yy322;
6422
}
6423
if (yych <= 0xEC) {
6424
if (yych <= 0xC1) {
6425
if (yych <= 0x00)
6426
goto yy231;
6427
if (yych <= ']')
6428
goto yy334;
6429
goto yy231;
6430
} else {
6431
if (yych <= 0xDF)
6432
goto yy327;
6433
if (yych <= 0xE0)
6434
goto yy328;
6435
goto yy329;
6436
}
6437
} else {
6438
if (yych <= 0xF0) {
6439
if (yych <= 0xED)
6440
goto yy330;
6441
if (yych <= 0xEF)
6442
goto yy329;
6443
goto yy331;
6444
} else {
6445
if (yych <= 0xF3)
6446
goto yy332;
6447
if (yych <= 0xF4)
6448
goto yy333;
6449
goto yy231;
6450
}
6451
}
6452
yy327:
6453
++p;
6454
yych = *p;
6455
if (yych <= 0x7F)
6456
goto yy231;
6457
if (yych <= 0xBF)
6458
goto yy322;
6459
goto yy231;
6460
yy328:
6461
++p;
6462
yych = *p;
6463
if (yych <= 0x9F)
6464
goto yy231;
6465
if (yych <= 0xBF)
6466
goto yy327;
6467
goto yy231;
6468
yy329:
6469
++p;
6470
yych = *p;
6471
if (yych <= 0x7F)
6472
goto yy231;
6473
if (yych <= 0xBF)
6474
goto yy327;
6475
goto yy231;
6476
yy330:
6477
++p;
6478
yych = *p;
6479
if (yych <= 0x7F)
6480
goto yy231;
6481
if (yych <= 0x9F)
6482
goto yy327;
6483
goto yy231;
6484
yy331:
6485
++p;
6486
yych = *p;
6487
if (yych <= 0x8F)
6488
goto yy231;
6489
if (yych <= 0xBF)
6490
goto yy329;
6491
goto yy231;
6492
yy332:
6493
++p;
6494
yych = *p;
6495
if (yych <= 0x7F)
6496
goto yy231;
6497
if (yych <= 0xBF)
6498
goto yy329;
6499
goto yy231;
6500
yy333:
6501
++p;
6502
yych = *p;
6503
if (yych <= 0x7F)
6504
goto yy231;
6505
if (yych <= 0x8F)
6506
goto yy329;
6507
goto yy231;
6508
yy334:
6509
++p;
6510
yych = *p;
6511
if (yych <= 0xE0) {
6512
if (yych <= '>') {
6513
if (yych <= 0x00)
6514
goto yy231;
6515
if (yych <= '=')
6516
goto yy322;
6517
goto yy252;
6518
} else {
6519
if (yych <= 0x7F)
6520
goto yy322;
6521
if (yych <= 0xC1)
6522
goto yy231;
6523
if (yych <= 0xDF)
6524
goto yy327;
6525
goto yy328;
6526
}
6527
} else {
6528
if (yych <= 0xEF) {
6529
if (yych == 0xED)
6530
goto yy330;
6531
goto yy329;
6532
} else {
6533
if (yych <= 0xF0)
6534
goto yy331;
6535
if (yych <= 0xF3)
6536
goto yy332;
6537
if (yych <= 0xF4)
6538
goto yy333;
6539
goto yy231;
6540
}
6541
}
6542
}
6543
}
6544
6545
// Try to match an HTML block tag start line, returning
6546
// an integer code for the type of block (1-6, matching the spec).
6547
// #7 is handled by a separate function, below.
6548
bufsize_t _scan_html_block_start(const unsigned char *p) {
6549
const unsigned char *marker = NULL;
6550
6551
{
6552
unsigned char yych;
6553
yych = *p;
6554
if (yych == '<')
6555
goto yy339;
6556
++p;
6557
yy338 : { return 0; }
6558
yy339:
6559
yych = *(marker = ++p);
6560
switch (yych) {
6561
case '!':
6562
goto yy340;
6563
case '/':
6564
goto yy342;
6565
case '?':
6566
goto yy343;
6567
case 'A':
6568
case 'a':
6569
goto yy345;
6570
case 'B':
6571
case 'b':
6572
goto yy346;
6573
case 'C':
6574
case 'c':
6575
goto yy347;
6576
case 'D':
6577
case 'd':
6578
goto yy348;
6579
case 'F':
6580
case 'f':
6581
goto yy349;
6582
case 'H':
6583
case 'h':
6584
goto yy350;
6585
case 'I':
6586
case 'i':
6587
goto yy351;
6588
case 'L':
6589
case 'l':
6590
goto yy352;
6591
case 'M':
6592
case 'm':
6593
goto yy353;
6594
case 'N':
6595
case 'n':
6596
goto yy354;
6597
case 'O':
6598
case 'o':
6599
goto yy355;
6600
case 'P':
6601
case 'p':
6602
goto yy356;
6603
case 'S':
6604
case 's':
6605
goto yy357;
6606
case 'T':
6607
case 't':
6608
goto yy358;
6609
case 'U':
6610
case 'u':
6611
goto yy359;
6612
default:
6613
goto yy338;
6614
}
6615
yy340:
6616
yych = *++p;
6617
if (yych <= '@') {
6618
if (yych == '-')
6619
goto yy360;
6620
} else {
6621
if (yych <= 'Z')
6622
goto yy361;
6623
if (yych <= '[')
6624
goto yy363;
6625
}
6626
yy341:
6627
p = marker;
6628
goto yy338;
6629
yy342:
6630
yych = *++p;
6631
switch (yych) {
6632
case 'A':
6633
case 'a':
6634
goto yy345;
6635
case 'B':
6636
case 'b':
6637
goto yy346;
6638
case 'C':
6639
case 'c':
6640
goto yy347;
6641
case 'D':
6642
case 'd':
6643
goto yy348;
6644
case 'F':
6645
case 'f':
6646
goto yy349;
6647
case 'H':
6648
case 'h':
6649
goto yy350;
6650
case 'I':
6651
case 'i':
6652
goto yy351;
6653
case 'L':
6654
case 'l':
6655
goto yy352;
6656
case 'M':
6657
case 'm':
6658
goto yy353;
6659
case 'N':
6660
case 'n':
6661
goto yy354;
6662
case 'O':
6663
case 'o':
6664
goto yy355;
6665
case 'P':
6666
case 'p':
6667
goto yy364;
6668
case 'S':
6669
case 's':
6670
goto yy365;
6671
case 'T':
6672
case 't':
6673
goto yy358;
6674
case 'U':
6675
case 'u':
6676
goto yy359;
6677
default:
6678
goto yy341;
6679
}
6680
yy343:
6681
++p;
6682
{ return 3; }
6683
yy345:
6684
yych = *++p;
6685
if (yych <= 'S') {
6686
if (yych <= 'D') {
6687
if (yych <= 'C')
6688
goto yy341;
6689
goto yy366;
6690
} else {
6691
if (yych <= 'Q')
6692
goto yy341;
6693
if (yych <= 'R')
6694
goto yy367;
6695
goto yy368;
6696
}
6697
} else {
6698
if (yych <= 'q') {
6699
if (yych == 'd')
6700
goto yy366;
6701
goto yy341;
6702
} else {
6703
if (yych <= 'r')
6704
goto yy367;
6705
if (yych <= 's')
6706
goto yy368;
6707
goto yy341;
6708
}
6709
}
6710
yy346:
6711
yych = *++p;
6712
if (yych <= 'O') {
6713
if (yych <= 'K') {
6714
if (yych == 'A')
6715
goto yy369;
6716
goto yy341;
6717
} else {
6718
if (yych <= 'L')
6719
goto yy370;
6720
if (yych <= 'N')
6721
goto yy341;
6722
goto yy371;
6723
}
6724
} else {
6725
if (yych <= 'k') {
6726
if (yych == 'a')
6727
goto yy369;
6728
goto yy341;
6729
} else {
6730
if (yych <= 'l')
6731
goto yy370;
6732
if (yych == 'o')
6733
goto yy371;
6734
goto yy341;
6735
}
6736
}
6737
yy347:
6738
yych = *++p;
6739
if (yych <= 'O') {
6740
if (yych <= 'D') {
6741
if (yych == 'A')
6742
goto yy372;
6743
goto yy341;
6744
} else {
6745
if (yych <= 'E')
6746
goto yy373;
6747
if (yych <= 'N')
6748
goto yy341;
6749
goto yy374;
6750
}
6751
} else {
6752
if (yych <= 'd') {
6753
if (yych == 'a')
6754
goto yy372;
6755
goto yy341;
6756
} else {
6757
if (yych <= 'e')
6758
goto yy373;
6759
if (yych == 'o')
6760
goto yy374;
6761
goto yy341;
6762
}
6763
}
6764
yy348:
6765
yych = *++p;
6766
switch (yych) {
6767
case 'D':
6768
case 'L':
6769
case 'T':
6770
case 'd':
6771
case 'l':
6772
case 't':
6773
goto yy375;
6774
case 'E':
6775
case 'e':
6776
goto yy376;
6777
case 'I':
6778
case 'i':
6779
goto yy377;
6780
default:
6781
goto yy341;
6782
}
6783
yy349:
6784
yych = *++p;
6785
if (yych <= 'R') {
6786
if (yych <= 'N') {
6787
if (yych == 'I')
6788
goto yy378;
6789
goto yy341;
6790
} else {
6791
if (yych <= 'O')
6792
goto yy379;
6793
if (yych <= 'Q')
6794
goto yy341;
6795
goto yy380;
6796
}
6797
} else {
6798
if (yych <= 'n') {
6799
if (yych == 'i')
6800
goto yy378;
6801
goto yy341;
6802
} else {
6803
if (yych <= 'o')
6804
goto yy379;
6805
if (yych == 'r')
6806
goto yy380;
6807
goto yy341;
6808
}
6809
}
6810
yy350:
6811
yych = *++p;
6812
if (yych <= 'S') {
6813
if (yych <= 'D') {
6814
if (yych <= '0')
6815
goto yy341;
6816
if (yych <= '6')
6817
goto yy375;
6818
goto yy341;
6819
} else {
6820
if (yych <= 'E')
6821
goto yy381;
6822
if (yych == 'R')
6823
goto yy375;
6824
goto yy341;
6825
}
6826
} else {
6827
if (yych <= 'q') {
6828
if (yych <= 'T')
6829
goto yy382;
6830
if (yych == 'e')
6831
goto yy381;
6832
goto yy341;
6833
} else {
6834
if (yych <= 'r')
6835
goto yy375;
6836
if (yych == 't')
6837
goto yy382;
6838
goto yy341;
6839
}
6840
}
6841
yy351:
6842
yych = *++p;
6843
if (yych == 'F')
6844
goto yy383;
6845
if (yych == 'f')
6846
goto yy383;
6847
goto yy341;
6848
yy352:
6849
yych = *++p;
6850
if (yych <= 'I') {
6851
if (yych == 'E')
6852
goto yy384;
6853
if (yych <= 'H')
6854
goto yy341;
6855
goto yy385;
6856
} else {
6857
if (yych <= 'e') {
6858
if (yych <= 'd')
6859
goto yy341;
6860
goto yy384;
6861
} else {
6862
if (yych == 'i')
6863
goto yy385;
6864
goto yy341;
6865
}
6866
}
6867
yy353:
6868
yych = *++p;
6869
if (yych <= 'E') {
6870
if (yych == 'A')
6871
goto yy386;
6872
if (yych <= 'D')
6873
goto yy341;
6874
goto yy387;
6875
} else {
6876
if (yych <= 'a') {
6877
if (yych <= '`')
6878
goto yy341;
6879
goto yy386;
6880
} else {
6881
if (yych == 'e')
6882
goto yy387;
6883
goto yy341;
6884
}
6885
}
6886
yy354:
6887
yych = *++p;
6888
if (yych <= 'O') {
6889
if (yych == 'A')
6890
goto yy388;
6891
if (yych <= 'N')
6892
goto yy341;
6893
goto yy389;
6894
} else {
6895
if (yych <= 'a') {
6896
if (yych <= '`')
6897
goto yy341;
6898
goto yy388;
6899
} else {
6900
if (yych == 'o')
6901
goto yy389;
6902
goto yy341;
6903
}
6904
}
6905
yy355:
6906
yych = *++p;
6907
if (yych <= 'P') {
6908
if (yych == 'L')
6909
goto yy375;
6910
if (yych <= 'O')
6911
goto yy341;
6912
goto yy390;
6913
} else {
6914
if (yych <= 'l') {
6915
if (yych <= 'k')
6916
goto yy341;
6917
goto yy375;
6918
} else {
6919
if (yych == 'p')
6920
goto yy390;
6921
goto yy341;
6922
}
6923
}
6924
yy356:
6925
yych = *++p;
6926
if (yych <= '>') {
6927
if (yych <= ' ') {
6928
if (yych <= 0x08)
6929
goto yy341;
6930
if (yych <= '\r')
6931
goto yy391;
6932
if (yych <= 0x1F)
6933
goto yy341;
6934
goto yy391;
6935
} else {
6936
if (yych == '/')
6937
goto yy393;
6938
if (yych <= '=')
6939
goto yy341;
6940
goto yy391;
6941
}
6942
} else {
6943
if (yych <= 'R') {
6944
if (yych == 'A')
6945
goto yy394;
6946
if (yych <= 'Q')
6947
goto yy341;
6948
goto yy395;
6949
} else {
6950
if (yych <= 'a') {
6951
if (yych <= '`')
6952
goto yy341;
6953
goto yy394;
6954
} else {
6955
if (yych == 'r')
6956
goto yy395;
6957
goto yy341;
6958
}
6959
}
6960
}
6961
yy357:
6962
yych = *++p;
6963
switch (yych) {
6964
case 'C':
6965
case 'c':
6966
goto yy396;
6967
case 'E':
6968
case 'e':
6969
goto yy397;
6970
case 'O':
6971
case 'o':
6972
goto yy398;
6973
case 'T':
6974
case 't':
6975
goto yy399;
6976
case 'U':
6977
case 'u':
6978
goto yy400;
6979
default:
6980
goto yy341;
6981
}
6982
yy358:
6983
yych = *++p;
6984
switch (yych) {
6985
case 'A':
6986
case 'a':
6987
goto yy401;
6988
case 'B':
6989
case 'b':
6990
goto yy402;
6991
case 'D':
6992
case 'd':
6993
goto yy375;
6994
case 'F':
6995
case 'f':
6996
goto yy403;
6997
case 'H':
6998
case 'h':
6999
goto yy404;
7000
case 'I':
7001
case 'i':
7002
goto yy405;
7003
case 'R':
7004
case 'r':
7005
goto yy406;
7006
default:
7007
goto yy341;
7008
}
7009
yy359:
7010
yych = *++p;
7011
if (yych == 'L')
7012
goto yy375;
7013
if (yych == 'l')
7014
goto yy375;
7015
goto yy341;
7016
yy360:
7017
yych = *++p;
7018
if (yych == '-')
7019
goto yy407;
7020
goto yy341;
7021
yy361:
7022
++p;
7023
{ return 4; }
7024
yy363:
7025
yych = *++p;
7026
if (yych == 'C')
7027
goto yy409;
7028
if (yych == 'c')
7029
goto yy409;
7030
goto yy341;
7031
yy364:
7032
yych = *++p;
7033
if (yych <= '/') {
7034
if (yych <= 0x1F) {
7035
if (yych <= 0x08)
7036
goto yy341;
7037
if (yych <= '\r')
7038
goto yy391;
7039
goto yy341;
7040
} else {
7041
if (yych <= ' ')
7042
goto yy391;
7043
if (yych <= '.')
7044
goto yy341;
7045
goto yy393;
7046
}
7047
} else {
7048
if (yych <= '@') {
7049
if (yych == '>')
7050
goto yy391;
7051
goto yy341;
7052
} else {
7053
if (yych <= 'A')
7054
goto yy394;
7055
if (yych == 'a')
7056
goto yy394;
7057
goto yy341;
7058
}
7059
}
7060
yy365:
7061
yych = *++p;
7062
if (yych <= 'U') {
7063
if (yych <= 'N') {
7064
if (yych == 'E')
7065
goto yy397;
7066
goto yy341;
7067
} else {
7068
if (yych <= 'O')
7069
goto yy398;
7070
if (yych <= 'T')
7071
goto yy341;
7072
goto yy400;
7073
}
7074
} else {
7075
if (yych <= 'n') {
7076
if (yych == 'e')
7077
goto yy397;
7078
goto yy341;
7079
} else {
7080
if (yych <= 'o')
7081
goto yy398;
7082
if (yych == 'u')
7083
goto yy400;
7084
goto yy341;
7085
}
7086
}
7087
yy366:
7088
yych = *++p;
7089
if (yych == 'D')
7090
goto yy410;
7091
if (yych == 'd')
7092
goto yy410;
7093
goto yy341;
7094
yy367:
7095
yych = *++p;
7096
if (yych == 'T')
7097
goto yy411;
7098
if (yych == 't')
7099
goto yy411;
7100
goto yy341;
7101
yy368:
7102
yych = *++p;
7103
if (yych == 'I')
7104
goto yy412;
7105
if (yych == 'i')
7106
goto yy412;
7107
goto yy341;
7108
yy369:
7109
yych = *++p;
7110
if (yych == 'S')
7111
goto yy413;
7112
if (yych == 's')
7113
goto yy413;
7114
goto yy341;
7115
yy370:
7116
yych = *++p;
7117
if (yych == 'O')
7118
goto yy414;
7119
if (yych == 'o')
7120
goto yy414;
7121
goto yy341;
7122
yy371:
7123
yych = *++p;
7124
if (yych == 'D')
7125
goto yy415;
7126
if (yych == 'd')
7127
goto yy415;
7128
goto yy341;
7129
yy372:
7130
yych = *++p;
7131
if (yych == 'P')
7132
goto yy416;
7133
if (yych == 'p')
7134
goto yy416;
7135
goto yy341;
7136
yy373:
7137
yych = *++p;
7138
if (yych == 'N')
7139
goto yy417;
7140
if (yych == 'n')
7141
goto yy417;
7142
goto yy341;
7143
yy374:
7144
yych = *++p;
7145
if (yych == 'L')
7146
goto yy418;
7147
if (yych == 'l')
7148
goto yy418;
7149
goto yy341;
7150
yy375:
7151
yych = *++p;
7152
if (yych <= ' ') {
7153
if (yych <= 0x08)
7154
goto yy341;
7155
if (yych <= '\r')
7156
goto yy391;
7157
if (yych <= 0x1F)
7158
goto yy341;
7159
goto yy391;
7160
} else {
7161
if (yych <= '/') {
7162
if (yych <= '.')
7163
goto yy341;
7164
goto yy393;
7165
} else {
7166
if (yych == '>')
7167
goto yy391;
7168
goto yy341;
7169
}
7170
}
7171
yy376:
7172
yych = *++p;
7173
if (yych == 'T')
7174
goto yy419;
7175
if (yych == 't')
7176
goto yy419;
7177
goto yy341;
7178
yy377:
7179
yych = *++p;
7180
if (yych <= 'V') {
7181
if (yych <= 'Q') {
7182
if (yych == 'A')
7183
goto yy420;
7184
goto yy341;
7185
} else {
7186
if (yych <= 'R')
7187
goto yy375;
7188
if (yych <= 'U')
7189
goto yy341;
7190
goto yy375;
7191
}
7192
} else {
7193
if (yych <= 'q') {
7194
if (yych == 'a')
7195
goto yy420;
7196
goto yy341;
7197
} else {
7198
if (yych <= 'r')
7199
goto yy375;
7200
if (yych == 'v')
7201
goto yy375;
7202
goto yy341;
7203
}
7204
}
7205
yy378:
7206
yych = *++p;
7207
if (yych <= 'G') {
7208
if (yych == 'E')
7209
goto yy421;
7210
if (yych <= 'F')
7211
goto yy341;
7212
goto yy422;
7213
} else {
7214
if (yych <= 'e') {
7215
if (yych <= 'd')
7216
goto yy341;
7217
goto yy421;
7218
} else {
7219
if (yych == 'g')
7220
goto yy422;
7221
goto yy341;
7222
}
7223
}
7224
yy379:
7225
yych = *++p;
7226
if (yych <= 'R') {
7227
if (yych == 'O')
7228
goto yy417;
7229
if (yych <= 'Q')
7230
goto yy341;
7231
goto yy423;
7232
} else {
7233
if (yych <= 'o') {
7234
if (yych <= 'n')
7235
goto yy341;
7236
goto yy417;
7237
} else {
7238
if (yych == 'r')
7239
goto yy423;
7240
goto yy341;
7241
}
7242
}
7243
yy380:
7244
yych = *++p;
7245
if (yych == 'A')
7246
goto yy424;
7247
if (yych == 'a')
7248
goto yy424;
7249
goto yy341;
7250
yy381:
7251
yych = *++p;
7252
if (yych == 'A')
7253
goto yy425;
7254
if (yych == 'a')
7255
goto yy425;
7256
goto yy341;
7257
yy382:
7258
yych = *++p;
7259
if (yych == 'M')
7260
goto yy359;
7261
if (yych == 'm')
7262
goto yy359;
7263
goto yy341;
7264
yy383:
7265
yych = *++p;
7266
if (yych == 'R')
7267
goto yy426;
7268
if (yych == 'r')
7269
goto yy426;
7270
goto yy341;
7271
yy384:
7272
yych = *++p;
7273
if (yych == 'G')
7274
goto yy427;
7275
if (yych == 'g')
7276
goto yy427;
7277
goto yy341;
7278
yy385:
7279
yych = *++p;
7280
if (yych <= '/') {
7281
if (yych <= 0x1F) {
7282
if (yych <= 0x08)
7283
goto yy341;
7284
if (yych <= '\r')
7285
goto yy391;
7286
goto yy341;
7287
} else {
7288
if (yych <= ' ')
7289
goto yy391;
7290
if (yych <= '.')
7291
goto yy341;
7292
goto yy393;
7293
}
7294
} else {
7295
if (yych <= 'M') {
7296
if (yych == '>')
7297
goto yy391;
7298
goto yy341;
7299
} else {
7300
if (yych <= 'N')
7301
goto yy428;
7302
if (yych == 'n')
7303
goto yy428;
7304
goto yy341;
7305
}
7306
}
7307
yy386:
7308
yych = *++p;
7309
if (yych == 'I')
7310
goto yy429;
7311
if (yych == 'i')
7312
goto yy429;
7313
goto yy341;
7314
yy387:
7315
yych = *++p;
7316
if (yych <= 'T') {
7317
if (yych == 'N')
7318
goto yy430;
7319
if (yych <= 'S')
7320
goto yy341;
7321
goto yy431;
7322
} else {
7323
if (yych <= 'n') {
7324
if (yych <= 'm')
7325
goto yy341;
7326
goto yy430;
7327
} else {
7328
if (yych == 't')
7329
goto yy431;
7330
goto yy341;
7331
}
7332
}
7333
yy388:
7334
yych = *++p;
7335
if (yych == 'V')
7336
goto yy375;
7337
if (yych == 'v')
7338
goto yy375;
7339
goto yy341;
7340
yy389:
7341
yych = *++p;
7342
if (yych == 'F')
7343
goto yy432;
7344
if (yych == 'f')
7345
goto yy432;
7346
goto yy341;
7347
yy390:
7348
yych = *++p;
7349
if (yych == 'T')
7350
goto yy433;
7351
if (yych == 't')
7352
goto yy433;
7353
goto yy341;
7354
yy391:
7355
++p;
7356
{ return 6; }
7357
yy393:
7358
yych = *++p;
7359
if (yych == '>')
7360
goto yy391;
7361
goto yy341;
7362
yy394:
7363
yych = *++p;
7364
if (yych == 'R')
7365
goto yy434;
7366
if (yych == 'r')
7367
goto yy434;
7368
goto yy341;
7369
yy395:
7370
yych = *++p;
7371
if (yych == 'E')
7372
goto yy435;
7373
if (yych == 'e')
7374
goto yy435;
7375
goto yy341;
7376
yy396:
7377
yych = *++p;
7378
if (yych == 'R')
7379
goto yy436;
7380
if (yych == 'r')
7381
goto yy436;
7382
goto yy341;
7383
yy397:
7384
yych = *++p;
7385
if (yych == 'C')
7386
goto yy416;
7387
if (yych == 'c')
7388
goto yy416;
7389
goto yy341;
7390
yy398:
7391
yych = *++p;
7392
if (yych == 'U')
7393
goto yy437;
7394
if (yych == 'u')
7395
goto yy437;
7396
goto yy341;
7397
yy399:
7398
yych = *++p;
7399
if (yych == 'Y')
7400
goto yy438;
7401
if (yych == 'y')
7402
goto yy438;
7403
goto yy341;
7404
yy400:
7405
yych = *++p;
7406
if (yych == 'M')
7407
goto yy439;
7408
if (yych == 'm')
7409
goto yy439;
7410
goto yy341;
7411
yy401:
7412
yych = *++p;
7413
if (yych == 'B')
7414
goto yy440;
7415
if (yych == 'b')
7416
goto yy440;
7417
goto yy341;
7418
yy402:
7419
yych = *++p;
7420
if (yych == 'O')
7421
goto yy371;
7422
if (yych == 'o')
7423
goto yy371;
7424
goto yy341;
7425
yy403:
7426
yych = *++p;
7427
if (yych == 'O')
7428
goto yy441;
7429
if (yych == 'o')
7430
goto yy441;
7431
goto yy341;
7432
yy404:
7433
yych = *++p;
7434
if (yych <= '/') {
7435
if (yych <= 0x1F) {
7436
if (yych <= 0x08)
7437
goto yy341;
7438
if (yych <= '\r')
7439
goto yy391;
7440
goto yy341;
7441
} else {
7442
if (yych <= ' ')
7443
goto yy391;
7444
if (yych <= '.')
7445
goto yy341;
7446
goto yy393;
7447
}
7448
} else {
7449
if (yych <= 'D') {
7450
if (yych == '>')
7451
goto yy391;
7452
goto yy341;
7453
} else {
7454
if (yych <= 'E')
7455
goto yy442;
7456
if (yych == 'e')
7457
goto yy442;
7458
goto yy341;
7459
}
7460
}
7461
yy405:
7462
yych = *++p;
7463
if (yych == 'T')
7464
goto yy440;
7465
if (yych == 't')
7466
goto yy440;
7467
goto yy341;
7468
yy406:
7469
yych = *++p;
7470
if (yych <= '/') {
7471
if (yych <= 0x1F) {
7472
if (yych <= 0x08)
7473
goto yy341;
7474
if (yych <= '\r')
7475
goto yy391;
7476
goto yy341;
7477
} else {
7478
if (yych <= ' ')
7479
goto yy391;
7480
if (yych <= '.')
7481
goto yy341;
7482
goto yy393;
7483
}
7484
} else {
7485
if (yych <= '@') {
7486
if (yych == '>')
7487
goto yy391;
7488
goto yy341;
7489
} else {
7490
if (yych <= 'A')
7491
goto yy443;
7492
if (yych == 'a')
7493
goto yy443;
7494
goto yy341;
7495
}
7496
}
7497
yy407:
7498
++p;
7499
{ return 2; }
7500
yy409:
7501
yych = *++p;
7502
if (yych == 'D')
7503
goto yy444;
7504
if (yych == 'd')
7505
goto yy444;
7506
goto yy341;
7507
yy410:
7508
yych = *++p;
7509
if (yych == 'R')
7510
goto yy445;
7511
if (yych == 'r')
7512
goto yy445;
7513
goto yy341;
7514
yy411:
7515
yych = *++p;
7516
if (yych == 'I')
7517
goto yy446;
7518
if (yych == 'i')
7519
goto yy446;
7520
goto yy341;
7521
yy412:
7522
yych = *++p;
7523
if (yych == 'D')
7524
goto yy447;
7525
if (yych == 'd')
7526
goto yy447;
7527
goto yy341;
7528
yy413:
7529
yych = *++p;
7530
if (yych == 'E')
7531
goto yy448;
7532
if (yych == 'e')
7533
goto yy448;
7534
goto yy341;
7535
yy414:
7536
yych = *++p;
7537
if (yych == 'C')
7538
goto yy449;
7539
if (yych == 'c')
7540
goto yy449;
7541
goto yy341;
7542
yy415:
7543
yych = *++p;
7544
if (yych == 'Y')
7545
goto yy375;
7546
if (yych == 'y')
7547
goto yy375;
7548
goto yy341;
7549
yy416:
7550
yych = *++p;
7551
if (yych == 'T')
7552
goto yy450;
7553
if (yych == 't')
7554
goto yy450;
7555
goto yy341;
7556
yy417:
7557
yych = *++p;
7558
if (yych == 'T')
7559
goto yy451;
7560
if (yych == 't')
7561
goto yy451;
7562
goto yy341;
7563
yy418:
7564
yych = *++p;
7565
if (yych <= '/') {
7566
if (yych <= 0x1F) {
7567
if (yych <= 0x08)
7568
goto yy341;
7569
if (yych <= '\r')
7570
goto yy391;
7571
goto yy341;
7572
} else {
7573
if (yych <= ' ')
7574
goto yy391;
7575
if (yych <= '.')
7576
goto yy341;
7577
goto yy393;
7578
}
7579
} else {
7580
if (yych <= 'F') {
7581
if (yych == '>')
7582
goto yy391;
7583
goto yy341;
7584
} else {
7585
if (yych <= 'G')
7586
goto yy452;
7587
if (yych == 'g')
7588
goto yy452;
7589
goto yy341;
7590
}
7591
}
7592
yy419:
7593
yych = *++p;
7594
if (yych == 'A')
7595
goto yy453;
7596
if (yych == 'a')
7597
goto yy453;
7598
goto yy341;
7599
yy420:
7600
yych = *++p;
7601
if (yych == 'L')
7602
goto yy454;
7603
if (yych == 'l')
7604
goto yy454;
7605
goto yy341;
7606
yy421:
7607
yych = *++p;
7608
if (yych == 'L')
7609
goto yy455;
7610
if (yych == 'l')
7611
goto yy455;
7612
goto yy341;
7613
yy422:
7614
yych = *++p;
7615
if (yych <= 'U') {
7616
if (yych == 'C')
7617
goto yy456;
7618
if (yych <= 'T')
7619
goto yy341;
7620
goto yy457;
7621
} else {
7622
if (yych <= 'c') {
7623
if (yych <= 'b')
7624
goto yy341;
7625
goto yy456;
7626
} else {
7627
if (yych == 'u')
7628
goto yy457;
7629
goto yy341;
7630
}
7631
}
7632
yy423:
7633
yych = *++p;
7634
if (yych == 'M')
7635
goto yy375;
7636
if (yych == 'm')
7637
goto yy375;
7638
goto yy341;
7639
yy424:
7640
yych = *++p;
7641
if (yych == 'M')
7642
goto yy458;
7643
if (yych == 'm')
7644
goto yy458;
7645
goto yy341;
7646
yy425:
7647
yych = *++p;
7648
if (yych == 'D')
7649
goto yy459;
7650
if (yych == 'd')
7651
goto yy459;
7652
goto yy341;
7653
yy426:
7654
yych = *++p;
7655
if (yych == 'A')
7656
goto yy460;
7657
if (yych == 'a')
7658
goto yy460;
7659
goto yy341;
7660
yy427:
7661
yych = *++p;
7662
if (yych == 'E')
7663
goto yy461;
7664
if (yych == 'e')
7665
goto yy461;
7666
goto yy341;
7667
yy428:
7668
yych = *++p;
7669
if (yych == 'K')
7670
goto yy375;
7671
if (yych == 'k')
7672
goto yy375;
7673
goto yy341;
7674
yy429:
7675
yych = *++p;
7676
if (yych == 'N')
7677
goto yy375;
7678
if (yych == 'n')
7679
goto yy375;
7680
goto yy341;
7681
yy430:
7682
yych = *++p;
7683
if (yych == 'U')
7684
goto yy462;
7685
if (yych == 'u')
7686
goto yy462;
7687
goto yy341;
7688
yy431:
7689
yych = *++p;
7690
if (yych == 'A')
7691
goto yy375;
7692
if (yych == 'a')
7693
goto yy375;
7694
goto yy341;
7695
yy432:
7696
yych = *++p;
7697
if (yych == 'R')
7698
goto yy463;
7699
if (yych == 'r')
7700
goto yy463;
7701
goto yy341;
7702
yy433:
7703
yych = *++p;
7704
if (yych <= 'I') {
7705
if (yych == 'G')
7706
goto yy452;
7707
if (yych <= 'H')
7708
goto yy341;
7709
goto yy464;
7710
} else {
7711
if (yych <= 'g') {
7712
if (yych <= 'f')
7713
goto yy341;
7714
goto yy452;
7715
} else {
7716
if (yych == 'i')
7717
goto yy464;
7718
goto yy341;
7719
}
7720
}
7721
yy434:
7722
yych = *++p;
7723
if (yych == 'A')
7724
goto yy423;
7725
if (yych == 'a')
7726
goto yy423;
7727
goto yy341;
7728
yy435:
7729
yych = *++p;
7730
if (yych <= 0x1F) {
7731
if (yych <= 0x08)
7732
goto yy341;
7733
if (yych <= '\r')
7734
goto yy465;
7735
goto yy341;
7736
} else {
7737
if (yych <= ' ')
7738
goto yy465;
7739
if (yych == '>')
7740
goto yy465;
7741
goto yy341;
7742
}
7743
yy436:
7744
yych = *++p;
7745
if (yych == 'I')
7746
goto yy467;
7747
if (yych == 'i')
7748
goto yy467;
7749
goto yy341;
7750
yy437:
7751
yych = *++p;
7752
if (yych == 'R')
7753
goto yy468;
7754
if (yych == 'r')
7755
goto yy468;
7756
goto yy341;
7757
yy438:
7758
yych = *++p;
7759
if (yych == 'L')
7760
goto yy395;
7761
if (yych == 'l')
7762
goto yy395;
7763
goto yy341;
7764
yy439:
7765
yych = *++p;
7766
if (yych == 'M')
7767
goto yy469;
7768
if (yych == 'm')
7769
goto yy469;
7770
goto yy341;
7771
yy440:
7772
yych = *++p;
7773
if (yych == 'L')
7774
goto yy447;
7775
if (yych == 'l')
7776
goto yy447;
7777
goto yy341;
7778
yy441:
7779
yych = *++p;
7780
if (yych == 'O')
7781
goto yy470;
7782
if (yych == 'o')
7783
goto yy470;
7784
goto yy341;
7785
yy442:
7786
yych = *++p;
7787
if (yych == 'A')
7788
goto yy471;
7789
if (yych == 'a')
7790
goto yy471;
7791
goto yy341;
7792
yy443:
7793
yych = *++p;
7794
if (yych == 'C')
7795
goto yy428;
7796
if (yych == 'c')
7797
goto yy428;
7798
goto yy341;
7799
yy444:
7800
yych = *++p;
7801
if (yych == 'A')
7802
goto yy472;
7803
if (yych == 'a')
7804
goto yy472;
7805
goto yy341;
7806
yy445:
7807
yych = *++p;
7808
if (yych == 'E')
7809
goto yy473;
7810
if (yych == 'e')
7811
goto yy473;
7812
goto yy341;
7813
yy446:
7814
yych = *++p;
7815
if (yych == 'C')
7816
goto yy440;
7817
if (yych == 'c')
7818
goto yy440;
7819
goto yy341;
7820
yy447:
7821
yych = *++p;
7822
if (yych == 'E')
7823
goto yy375;
7824
if (yych == 'e')
7825
goto yy375;
7826
goto yy341;
7827
yy448:
7828
yych = *++p;
7829
if (yych <= '/') {
7830
if (yych <= 0x1F) {
7831
if (yych <= 0x08)
7832
goto yy341;
7833
if (yych <= '\r')
7834
goto yy391;
7835
goto yy341;
7836
} else {
7837
if (yych <= ' ')
7838
goto yy391;
7839
if (yych <= '.')
7840
goto yy341;
7841
goto yy393;
7842
}
7843
} else {
7844
if (yych <= 'E') {
7845
if (yych == '>')
7846
goto yy391;
7847
goto yy341;
7848
} else {
7849
if (yych <= 'F')
7850
goto yy474;
7851
if (yych == 'f')
7852
goto yy474;
7853
goto yy341;
7854
}
7855
}
7856
yy449:
7857
yych = *++p;
7858
if (yych == 'K')
7859
goto yy475;
7860
if (yych == 'k')
7861
goto yy475;
7862
goto yy341;
7863
yy450:
7864
yych = *++p;
7865
if (yych == 'I')
7866
goto yy464;
7867
if (yych == 'i')
7868
goto yy464;
7869
goto yy341;
7870
yy451:
7871
yych = *++p;
7872
if (yych == 'E')
7873
goto yy476;
7874
if (yych == 'e')
7875
goto yy476;
7876
goto yy341;
7877
yy452:
7878
yych = *++p;
7879
if (yych == 'R')
7880
goto yy477;
7881
if (yych == 'r')
7882
goto yy477;
7883
goto yy341;
7884
yy453:
7885
yych = *++p;
7886
if (yych == 'I')
7887
goto yy478;
7888
if (yych == 'i')
7889
goto yy478;
7890
goto yy341;
7891
yy454:
7892
yych = *++p;
7893
if (yych == 'O')
7894
goto yy479;
7895
if (yych == 'o')
7896
goto yy479;
7897
goto yy341;
7898
yy455:
7899
yych = *++p;
7900
if (yych == 'D')
7901
goto yy480;
7902
if (yych == 'd')
7903
goto yy480;
7904
goto yy341;
7905
yy456:
7906
yych = *++p;
7907
if (yych == 'A')
7908
goto yy372;
7909
if (yych == 'a')
7910
goto yy372;
7911
goto yy341;
7912
yy457:
7913
yych = *++p;
7914
if (yych == 'R')
7915
goto yy447;
7916
if (yych == 'r')
7917
goto yy447;
7918
goto yy341;
7919
yy458:
7920
yych = *++p;
7921
if (yych == 'E')
7922
goto yy481;
7923
if (yych == 'e')
7924
goto yy481;
7925
goto yy341;
7926
yy459:
7927
yych = *++p;
7928
if (yych <= '/') {
7929
if (yych <= 0x1F) {
7930
if (yych <= 0x08)
7931
goto yy341;
7932
if (yych <= '\r')
7933
goto yy391;
7934
goto yy341;
7935
} else {
7936
if (yych <= ' ')
7937
goto yy391;
7938
if (yych <= '.')
7939
goto yy341;
7940
goto yy393;
7941
}
7942
} else {
7943
if (yych <= 'D') {
7944
if (yych == '>')
7945
goto yy391;
7946
goto yy341;
7947
} else {
7948
if (yych <= 'E')
7949
goto yy476;
7950
if (yych == 'e')
7951
goto yy476;
7952
goto yy341;
7953
}
7954
}
7955
yy460:
7956
yych = *++p;
7957
if (yych == 'M')
7958
goto yy447;
7959
if (yych == 'm')
7960
goto yy447;
7961
goto yy341;
7962
yy461:
7963
yych = *++p;
7964
if (yych == 'N')
7965
goto yy471;
7966
if (yych == 'n')
7967
goto yy471;
7968
goto yy341;
7969
yy462:
7970
yych = *++p;
7971
if (yych <= '/') {
7972
if (yych <= 0x1F) {
7973
if (yych <= 0x08)
7974
goto yy341;
7975
if (yych <= '\r')
7976
goto yy391;
7977
goto yy341;
7978
} else {
7979
if (yych <= ' ')
7980
goto yy391;
7981
if (yych <= '.')
7982
goto yy341;
7983
goto yy393;
7984
}
7985
} else {
7986
if (yych <= 'H') {
7987
if (yych == '>')
7988
goto yy391;
7989
goto yy341;
7990
} else {
7991
if (yych <= 'I')
7992
goto yy482;
7993
if (yych == 'i')
7994
goto yy482;
7995
goto yy341;
7996
}
7997
}
7998
yy463:
7999
yych = *++p;
8000
if (yych == 'A')
8001
goto yy483;
8002
if (yych == 'a')
8003
goto yy483;
8004
goto yy341;
8005
yy464:
8006
yych = *++p;
8007
if (yych == 'O')
8008
goto yy429;
8009
if (yych == 'o')
8010
goto yy429;
8011
goto yy341;
8012
yy465:
8013
++p;
8014
{ return 1; }
8015
yy467:
8016
yych = *++p;
8017
if (yych == 'P')
8018
goto yy484;
8019
if (yych == 'p')
8020
goto yy484;
8021
goto yy341;
8022
yy468:
8023
yych = *++p;
8024
if (yych == 'C')
8025
goto yy447;
8026
if (yych == 'c')
8027
goto yy447;
8028
goto yy341;
8029
yy469:
8030
yych = *++p;
8031
if (yych == 'A')
8032
goto yy485;
8033
if (yych == 'a')
8034
goto yy485;
8035
goto yy341;
8036
yy470:
8037
yych = *++p;
8038
if (yych == 'T')
8039
goto yy375;
8040
if (yych == 't')
8041
goto yy375;
8042
goto yy341;
8043
yy471:
8044
yych = *++p;
8045
if (yych == 'D')
8046
goto yy375;
8047
if (yych == 'd')
8048
goto yy375;
8049
goto yy341;
8050
yy472:
8051
yych = *++p;
8052
if (yych == 'T')
8053
goto yy486;
8054
if (yych == 't')
8055
goto yy486;
8056
goto yy341;
8057
yy473:
8058
yych = *++p;
8059
if (yych == 'S')
8060
goto yy487;
8061
if (yych == 's')
8062
goto yy487;
8063
goto yy341;
8064
yy474:
8065
yych = *++p;
8066
if (yych == 'O')
8067
goto yy488;
8068
if (yych == 'o')
8069
goto yy488;
8070
goto yy341;
8071
yy475:
8072
yych = *++p;
8073
if (yych == 'Q')
8074
goto yy489;
8075
if (yych == 'q')
8076
goto yy489;
8077
goto yy341;
8078
yy476:
8079
yych = *++p;
8080
if (yych == 'R')
8081
goto yy375;
8082
if (yych == 'r')
8083
goto yy375;
8084
goto yy341;
8085
yy477:
8086
yych = *++p;
8087
if (yych == 'O')
8088
goto yy490;
8089
if (yych == 'o')
8090
goto yy490;
8091
goto yy341;
8092
yy478:
8093
yych = *++p;
8094
if (yych == 'L')
8095
goto yy487;
8096
if (yych == 'l')
8097
goto yy487;
8098
goto yy341;
8099
yy479:
8100
yych = *++p;
8101
if (yych == 'G')
8102
goto yy375;
8103
if (yych == 'g')
8104
goto yy375;
8105
goto yy341;
8106
yy480:
8107
yych = *++p;
8108
if (yych == 'S')
8109
goto yy491;
8110
if (yych == 's')
8111
goto yy491;
8112
goto yy341;
8113
yy481:
8114
yych = *++p;
8115
if (yych <= '/') {
8116
if (yych <= 0x1F) {
8117
if (yych <= 0x08)
8118
goto yy341;
8119
if (yych <= '\r')
8120
goto yy391;
8121
goto yy341;
8122
} else {
8123
if (yych <= ' ')
8124
goto yy391;
8125
if (yych <= '.')
8126
goto yy341;
8127
goto yy393;
8128
}
8129
} else {
8130
if (yych <= 'R') {
8131
if (yych == '>')
8132
goto yy391;
8133
goto yy341;
8134
} else {
8135
if (yych <= 'S')
8136
goto yy491;
8137
if (yych == 's')
8138
goto yy491;
8139
goto yy341;
8140
}
8141
}
8142
yy482:
8143
yych = *++p;
8144
if (yych == 'T')
8145
goto yy492;
8146
if (yych == 't')
8147
goto yy492;
8148
goto yy341;
8149
yy483:
8150
yych = *++p;
8151
if (yych == 'M')
8152
goto yy493;
8153
if (yych == 'm')
8154
goto yy493;
8155
goto yy341;
8156
yy484:
8157
yych = *++p;
8158
if (yych == 'T')
8159
goto yy435;
8160
if (yych == 't')
8161
goto yy435;
8162
goto yy341;
8163
yy485:
8164
yych = *++p;
8165
if (yych == 'R')
8166
goto yy415;
8167
if (yych == 'r')
8168
goto yy415;
8169
goto yy341;
8170
yy486:
8171
yych = *++p;
8172
if (yych == 'A')
8173
goto yy494;
8174
if (yych == 'a')
8175
goto yy494;
8176
goto yy341;
8177
yy487:
8178
yych = *++p;
8179
if (yych == 'S')
8180
goto yy375;
8181
if (yych == 's')
8182
goto yy375;
8183
goto yy341;
8184
yy488:
8185
yych = *++p;
8186
if (yych == 'N')
8187
goto yy470;
8188
if (yych == 'n')
8189
goto yy470;
8190
goto yy341;
8191
yy489:
8192
yych = *++p;
8193
if (yych == 'U')
8194
goto yy495;
8195
if (yych == 'u')
8196
goto yy495;
8197
goto yy341;
8198
yy490:
8199
yych = *++p;
8200
if (yych == 'U')
8201
goto yy496;
8202
if (yych == 'u')
8203
goto yy496;
8204
goto yy341;
8205
yy491:
8206
yych = *++p;
8207
if (yych == 'E')
8208
goto yy470;
8209
if (yych == 'e')
8210
goto yy470;
8211
goto yy341;
8212
yy492:
8213
yych = *++p;
8214
if (yych == 'E')
8215
goto yy423;
8216
if (yych == 'e')
8217
goto yy423;
8218
goto yy341;
8219
yy493:
8220
yych = *++p;
8221
if (yych == 'E')
8222
goto yy487;
8223
if (yych == 'e')
8224
goto yy487;
8225
goto yy341;
8226
yy494:
8227
yych = *++p;
8228
if (yych == '[')
8229
goto yy497;
8230
goto yy341;
8231
yy495:
8232
yych = *++p;
8233
if (yych == 'O')
8234
goto yy499;
8235
if (yych == 'o')
8236
goto yy499;
8237
goto yy341;
8238
yy496:
8239
yych = *++p;
8240
if (yych == 'P')
8241
goto yy375;
8242
if (yych == 'p')
8243
goto yy375;
8244
goto yy341;
8245
yy497:
8246
++p;
8247
{ return 5; }
8248
yy499:
8249
++p;
8250
if ((yych = *p) == 'T')
8251
goto yy447;
8252
if (yych == 't')
8253
goto yy447;
8254
goto yy341;
8255
}
8256
}
8257
8258
// Try to match an HTML block tag start line of type 7, returning
8259
// 7 if successful, 0 if not.
8260
bufsize_t _scan_html_block_start_7(const unsigned char *p) {
8261
const unsigned char *marker = NULL;
8262
8263
{
8264
unsigned char yych;
8265
unsigned int yyaccept = 0;
8266
static const unsigned char yybm[] = {
8267
0, 224, 224, 224, 224, 224, 224, 224, 224, 198, 210, 194, 198, 194,
8268
224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224,
8269
224, 224, 224, 224, 198, 224, 128, 224, 224, 224, 224, 64, 224, 224,
8270
224, 224, 224, 233, 232, 224, 233, 233, 233, 233, 233, 233, 233, 233,
8271
233, 233, 232, 224, 192, 192, 192, 224, 224, 233, 233, 233, 233, 233,
8272
233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
8273
233, 233, 233, 233, 233, 233, 233, 224, 224, 224, 224, 232, 192, 233,
8274
233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233,
8275
233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 224, 224, 224,
8276
224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8277
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8278
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8279
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8280
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8281
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8282
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8283
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8284
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8285
0, 0, 0, 0,
8286
};
8287
yych = *p;
8288
if (yych == '<')
8289
goto yy504;
8290
++p;
8291
yy503 : { return 0; }
8292
yy504:
8293
yyaccept = 0;
8294
yych = *(marker = ++p);
8295
if (yych <= '@') {
8296
if (yych != '/')
8297
goto yy503;
8298
} else {
8299
if (yych <= 'Z')
8300
goto yy507;
8301
if (yych <= '`')
8302
goto yy503;
8303
if (yych <= 'z')
8304
goto yy507;
8305
goto yy503;
8306
}
8307
yych = *++p;
8308
if (yych <= '@')
8309
goto yy506;
8310
if (yych <= 'Z')
8311
goto yy509;
8312
if (yych <= '`')
8313
goto yy506;
8314
if (yych <= 'z')
8315
goto yy509;
8316
yy506:
8317
p = marker;
8318
if (yyaccept == 0) {
8319
goto yy503;
8320
} else {
8321
goto yy522;
8322
}
8323
yy507:
8324
++p;
8325
yych = *p;
8326
if (yybm[0 + yych] & 2) {
8327
goto yy511;
8328
}
8329
if (yych <= '=') {
8330
if (yych <= '.') {
8331
if (yych == '-')
8332
goto yy507;
8333
goto yy506;
8334
} else {
8335
if (yych <= '/')
8336
goto yy513;
8337
if (yych <= '9')
8338
goto yy507;
8339
goto yy506;
8340
}
8341
} else {
8342
if (yych <= 'Z') {
8343
if (yych <= '>')
8344
goto yy514;
8345
if (yych <= '@')
8346
goto yy506;
8347
goto yy507;
8348
} else {
8349
if (yych <= '`')
8350
goto yy506;
8351
if (yych <= 'z')
8352
goto yy507;
8353
goto yy506;
8354
}
8355
}
8356
yy509:
8357
++p;
8358
yych = *p;
8359
if (yych <= '/') {
8360
if (yych <= 0x1F) {
8361
if (yych <= 0x08)
8362
goto yy506;
8363
if (yych <= '\r')
8364
goto yy516;
8365
goto yy506;
8366
} else {
8367
if (yych <= ' ')
8368
goto yy516;
8369
if (yych == '-')
8370
goto yy509;
8371
goto yy506;
8372
}
8373
} else {
8374
if (yych <= '@') {
8375
if (yych <= '9')
8376
goto yy509;
8377
if (yych == '>')
8378
goto yy514;
8379
goto yy506;
8380
} else {
8381
if (yych <= 'Z')
8382
goto yy509;
8383
if (yych <= '`')
8384
goto yy506;
8385
if (yych <= 'z')
8386
goto yy509;
8387
goto yy506;
8388
}
8389
}
8390
yy511:
8391
++p;
8392
yych = *p;
8393
if (yybm[0 + yych] & 2) {
8394
goto yy511;
8395
}
8396
if (yych <= '>') {
8397
if (yych <= '9') {
8398
if (yych != '/')
8399
goto yy506;
8400
} else {
8401
if (yych <= ':')
8402
goto yy518;
8403
if (yych <= '=')
8404
goto yy506;
8405
goto yy514;
8406
}
8407
} else {
8408
if (yych <= '^') {
8409
if (yych <= '@')
8410
goto yy506;
8411
if (yych <= 'Z')
8412
goto yy518;
8413
goto yy506;
8414
} else {
8415
if (yych == '`')
8416
goto yy506;
8417
if (yych <= 'z')
8418
goto yy518;
8419
goto yy506;
8420
}
8421
}
8422
yy513:
8423
yych = *++p;
8424
if (yych != '>')
8425
goto yy506;
8426
yy514:
8427
++p;
8428
yych = *p;
8429
if (yybm[0 + yych] & 4) {
8430
goto yy514;
8431
}
8432
if (yych <= 0x08)
8433
goto yy506;
8434
if (yych <= '\n')
8435
goto yy520;
8436
if (yych <= '\v')
8437
goto yy506;
8438
if (yych <= '\r')
8439
goto yy523;
8440
goto yy506;
8441
yy516:
8442
++p;
8443
yych = *p;
8444
if (yych <= 0x1F) {
8445
if (yych <= 0x08)
8446
goto yy506;
8447
if (yych <= '\r')
8448
goto yy516;
8449
goto yy506;
8450
} else {
8451
if (yych <= ' ')
8452
goto yy516;
8453
if (yych == '>')
8454
goto yy514;
8455
goto yy506;
8456
}
8457
yy518:
8458
++p;
8459
yych = *p;
8460
if (yybm[0 + yych] & 8) {
8461
goto yy518;
8462
}
8463
if (yych <= ',') {
8464
if (yych <= '\r') {
8465
if (yych <= 0x08)
8466
goto yy506;
8467
goto yy524;
8468
} else {
8469
if (yych == ' ')
8470
goto yy524;
8471
goto yy506;
8472
}
8473
} else {
8474
if (yych <= '<') {
8475
if (yych <= '/')
8476
goto yy513;
8477
goto yy506;
8478
} else {
8479
if (yych <= '=')
8480
goto yy526;
8481
if (yych <= '>')
8482
goto yy514;
8483
goto yy506;
8484
}
8485
}
8486
yy520:
8487
yyaccept = 1;
8488
marker = ++p;
8489
yych = *p;
8490
if (yybm[0 + yych] & 4) {
8491
goto yy514;
8492
}
8493
if (yych <= 0x08)
8494
goto yy522;
8495
if (yych <= '\n')
8496
goto yy520;
8497
if (yych <= '\v')
8498
goto yy522;
8499
if (yych <= '\r')
8500
goto yy523;
8501
yy522 : { return 7; }
8502
yy523:
8503
yych = *++p;
8504
goto yy522;
8505
yy524:
8506
++p;
8507
yych = *p;
8508
if (yych <= '<') {
8509
if (yych <= ' ') {
8510
if (yych <= 0x08)
8511
goto yy506;
8512
if (yych <= '\r')
8513
goto yy524;
8514
if (yych <= 0x1F)
8515
goto yy506;
8516
goto yy524;
8517
} else {
8518
if (yych <= '/') {
8519
if (yych <= '.')
8520
goto yy506;
8521
goto yy513;
8522
} else {
8523
if (yych == ':')
8524
goto yy518;
8525
goto yy506;
8526
}
8527
}
8528
} else {
8529
if (yych <= 'Z') {
8530
if (yych <= '=')
8531
goto yy526;
8532
if (yych <= '>')
8533
goto yy514;
8534
if (yych <= '@')
8535
goto yy506;
8536
goto yy518;
8537
} else {
8538
if (yych <= '_') {
8539
if (yych <= '^')
8540
goto yy506;
8541
goto yy518;
8542
} else {
8543
if (yych <= '`')
8544
goto yy506;
8545
if (yych <= 'z')
8546
goto yy518;
8547
goto yy506;
8548
}
8549
}
8550
}
8551
yy526:
8552
++p;
8553
yych = *p;
8554
if (yybm[0 + yych] & 32) {
8555
goto yy527;
8556
}
8557
if (yych <= 0xE0) {
8558
if (yych <= '"') {
8559
if (yych <= 0x00)
8560
goto yy506;
8561
if (yych <= ' ')
8562
goto yy529;
8563
goto yy530;
8564
} else {
8565
if (yych <= '\'')
8566
goto yy532;
8567
if (yych <= 0xC1)
8568
goto yy506;
8569
if (yych <= 0xDF)
8570
goto yy534;
8571
goto yy535;
8572
}
8573
} else {
8574
if (yych <= 0xEF) {
8575
if (yych == 0xED)
8576
goto yy537;
8577
goto yy536;
8578
} else {
8579
if (yych <= 0xF0)
8580
goto yy538;
8581
if (yych <= 0xF3)
8582
goto yy539;
8583
if (yych <= 0xF4)
8584
goto yy540;
8585
goto yy506;
8586
}
8587
}
8588
yy527:
8589
++p;
8590
yych = *p;
8591
if (yybm[0 + yych] & 32) {
8592
goto yy527;
8593
}
8594
if (yych <= 0xE0) {
8595
if (yych <= '=') {
8596
if (yych <= 0x00)
8597
goto yy506;
8598
if (yych <= ' ')
8599
goto yy541;
8600
goto yy506;
8601
} else {
8602
if (yych <= '>')
8603
goto yy514;
8604
if (yych <= 0xC1)
8605
goto yy506;
8606
if (yych <= 0xDF)
8607
goto yy534;
8608
goto yy535;
8609
}
8610
} else {
8611
if (yych <= 0xEF) {
8612
if (yych == 0xED)
8613
goto yy537;
8614
goto yy536;
8615
} else {
8616
if (yych <= 0xF0)
8617
goto yy538;
8618
if (yych <= 0xF3)
8619
goto yy539;
8620
if (yych <= 0xF4)
8621
goto yy540;
8622
goto yy506;
8623
}
8624
}
8625
yy529:
8626
++p;
8627
yych = *p;
8628
if (yybm[0 + yych] & 32) {
8629
goto yy527;
8630
}
8631
if (yych <= 0xDF) {
8632
if (yych <= '\'') {
8633
if (yych <= 0x00)
8634
goto yy506;
8635
if (yych <= ' ')
8636
goto yy543;
8637
if (yych >= '#')
8638
goto yy532;
8639
} else {
8640
if (yych == '>')
8641
goto yy514;
8642
if (yych <= 0xC1)
8643
goto yy506;
8644
goto yy534;
8645
}
8646
} else {
8647
if (yych <= 0xEF) {
8648
if (yych <= 0xE0)
8649
goto yy535;
8650
if (yych == 0xED)
8651
goto yy537;
8652
goto yy536;
8653
} else {
8654
if (yych <= 0xF0)
8655
goto yy538;
8656
if (yych <= 0xF3)
8657
goto yy539;
8658
if (yych <= 0xF4)
8659
goto yy540;
8660
goto yy506;
8661
}
8662
}
8663
yy530:
8664
++p;
8665
yych = *p;
8666
if (yybm[0 + yych] & 64) {
8667
goto yy530;
8668
}
8669
if (yych <= 0xEC) {
8670
if (yych <= 0xC1) {
8671
if (yych <= 0x00)
8672
goto yy506;
8673
if (yych <= '"')
8674
goto yy545;
8675
goto yy506;
8676
} else {
8677
if (yych <= 0xDF)
8678
goto yy546;
8679
if (yych <= 0xE0)
8680
goto yy547;
8681
goto yy548;
8682
}
8683
} else {
8684
if (yych <= 0xF0) {
8685
if (yych <= 0xED)
8686
goto yy549;
8687
if (yych <= 0xEF)
8688
goto yy548;
8689
goto yy550;
8690
} else {
8691
if (yych <= 0xF3)
8692
goto yy551;
8693
if (yych <= 0xF4)
8694
goto yy552;
8695
goto yy506;
8696
}
8697
}
8698
yy532:
8699
++p;
8700
yych = *p;
8701
if (yybm[0 + yych] & 128) {
8702
goto yy532;
8703
}
8704
if (yych <= 0xEC) {
8705
if (yych <= 0xC1) {
8706
if (yych <= 0x00)
8707
goto yy506;
8708
if (yych <= '\'')
8709
goto yy545;
8710
goto yy506;
8711
} else {
8712
if (yych <= 0xDF)
8713
goto yy553;
8714
if (yych <= 0xE0)
8715
goto yy554;
8716
goto yy555;
8717
}
8718
} else {
8719
if (yych <= 0xF0) {
8720
if (yych <= 0xED)
8721
goto yy556;
8722
if (yych <= 0xEF)
8723
goto yy555;
8724
goto yy557;
8725
} else {
8726
if (yych <= 0xF3)
8727
goto yy558;
8728
if (yych <= 0xF4)
8729
goto yy559;
8730
goto yy506;
8731
}
8732
}
8733
yy534:
8734
++p;
8735
yych = *p;
8736
if (yych <= 0x7F)
8737
goto yy506;
8738
if (yych <= 0xBF)
8739
goto yy527;
8740
goto yy506;
8741
yy535:
8742
++p;
8743
yych = *p;
8744
if (yych <= 0x9F)
8745
goto yy506;
8746
if (yych <= 0xBF)
8747
goto yy534;
8748
goto yy506;
8749
yy536:
8750
++p;
8751
yych = *p;
8752
if (yych <= 0x7F)
8753
goto yy506;
8754
if (yych <= 0xBF)
8755
goto yy534;
8756
goto yy506;
8757
yy537:
8758
++p;
8759
yych = *p;
8760
if (yych <= 0x7F)
8761
goto yy506;
8762
if (yych <= 0x9F)
8763
goto yy534;
8764
goto yy506;
8765
yy538:
8766
++p;
8767
yych = *p;
8768
if (yych <= 0x8F)
8769
goto yy506;
8770
if (yych <= 0xBF)
8771
goto yy536;
8772
goto yy506;
8773
yy539:
8774
++p;
8775
yych = *p;
8776
if (yych <= 0x7F)
8777
goto yy506;
8778
if (yych <= 0xBF)
8779
goto yy536;
8780
goto yy506;
8781
yy540:
8782
++p;
8783
yych = *p;
8784
if (yych <= 0x7F)
8785
goto yy506;
8786
if (yych <= 0x8F)
8787
goto yy536;
8788
goto yy506;
8789
yy541:
8790
++p;
8791
yych = *p;
8792
if (yych <= '@') {
8793
if (yych <= '"') {
8794
if (yych <= '\r') {
8795
if (yych <= 0x00)
8796
goto yy506;
8797
if (yych <= 0x08)
8798
goto yy527;
8799
goto yy541;
8800
} else {
8801
if (yych == ' ')
8802
goto yy541;
8803
if (yych <= '!')
8804
goto yy527;
8805
goto yy506;
8806
}
8807
} else {
8808
if (yych <= ':') {
8809
if (yych == '\'')
8810
goto yy506;
8811
if (yych <= '9')
8812
goto yy527;
8813
goto yy560;
8814
} else {
8815
if (yych <= ';')
8816
goto yy527;
8817
if (yych <= '=')
8818
goto yy506;
8819
if (yych <= '>')
8820
goto yy514;
8821
goto yy527;
8822
}
8823
}
8824
} else {
8825
if (yych <= 0xDF) {
8826
if (yych <= '`') {
8827
if (yych <= 'Z')
8828
goto yy560;
8829
if (yych <= '^')
8830
goto yy527;
8831
if (yych <= '_')
8832
goto yy560;
8833
goto yy506;
8834
} else {
8835
if (yych <= 'z')
8836
goto yy560;
8837
if (yych <= 0x7F)
8838
goto yy527;
8839
if (yych <= 0xC1)
8840
goto yy506;
8841
goto yy534;
8842
}
8843
} else {
8844
if (yych <= 0xEF) {
8845
if (yych <= 0xE0)
8846
goto yy535;
8847
if (yych == 0xED)
8848
goto yy537;
8849
goto yy536;
8850
} else {
8851
if (yych <= 0xF0)
8852
goto yy538;
8853
if (yych <= 0xF3)
8854
goto yy539;
8855
if (yych <= 0xF4)
8856
goto yy540;
8857
goto yy506;
8858
}
8859
}
8860
}
8861
yy543:
8862
++p;
8863
yych = *p;
8864
if (yych <= '@') {
8865
if (yych <= '"') {
8866
if (yych <= '\r') {
8867
if (yych <= 0x00)
8868
goto yy506;
8869
if (yych <= 0x08)
8870
goto yy527;
8871
goto yy543;
8872
} else {
8873
if (yych == ' ')
8874
goto yy543;
8875
if (yych <= '!')
8876
goto yy527;
8877
goto yy530;
8878
}
8879
} else {
8880
if (yych <= ':') {
8881
if (yych == '\'')
8882
goto yy532;
8883
if (yych <= '9')
8884
goto yy527;
8885
goto yy560;
8886
} else {
8887
if (yych <= ';')
8888
goto yy527;
8889
if (yych <= '=')
8890
goto yy506;
8891
if (yych <= '>')
8892
goto yy514;
8893
goto yy527;
8894
}
8895
}
8896
} else {
8897
if (yych <= 0xDF) {
8898
if (yych <= '`') {
8899
if (yych <= 'Z')
8900
goto yy560;
8901
if (yych <= '^')
8902
goto yy527;
8903
if (yych <= '_')
8904
goto yy560;
8905
goto yy506;
8906
} else {
8907
if (yych <= 'z')
8908
goto yy560;
8909
if (yych <= 0x7F)
8910
goto yy527;
8911
if (yych <= 0xC1)
8912
goto yy506;
8913
goto yy534;
8914
}
8915
} else {
8916
if (yych <= 0xEF) {
8917
if (yych <= 0xE0)
8918
goto yy535;
8919
if (yych == 0xED)
8920
goto yy537;
8921
goto yy536;
8922
} else {
8923
if (yych <= 0xF0)
8924
goto yy538;
8925
if (yych <= 0xF3)
8926
goto yy539;
8927
if (yych <= 0xF4)
8928
goto yy540;
8929
goto yy506;
8930
}
8931
}
8932
}
8933
yy545:
8934
++p;
8935
yych = *p;
8936
if (yybm[0 + yych] & 2) {
8937
goto yy511;
8938
}
8939
if (yych == '/')
8940
goto yy513;
8941
if (yych == '>')
8942
goto yy514;
8943
goto yy506;
8944
yy546:
8945
++p;
8946
yych = *p;
8947
if (yych <= 0x7F)
8948
goto yy506;
8949
if (yych <= 0xBF)
8950
goto yy530;
8951
goto yy506;
8952
yy547:
8953
++p;
8954
yych = *p;
8955
if (yych <= 0x9F)
8956
goto yy506;
8957
if (yych <= 0xBF)
8958
goto yy546;
8959
goto yy506;
8960
yy548:
8961
++p;
8962
yych = *p;
8963
if (yych <= 0x7F)
8964
goto yy506;
8965
if (yych <= 0xBF)
8966
goto yy546;
8967
goto yy506;
8968
yy549:
8969
++p;
8970
yych = *p;
8971
if (yych <= 0x7F)
8972
goto yy506;
8973
if (yych <= 0x9F)
8974
goto yy546;
8975
goto yy506;
8976
yy550:
8977
++p;
8978
yych = *p;
8979
if (yych <= 0x8F)
8980
goto yy506;
8981
if (yych <= 0xBF)
8982
goto yy548;
8983
goto yy506;
8984
yy551:
8985
++p;
8986
yych = *p;
8987
if (yych <= 0x7F)
8988
goto yy506;
8989
if (yych <= 0xBF)
8990
goto yy548;
8991
goto yy506;
8992
yy552:
8993
++p;
8994
yych = *p;
8995
if (yych <= 0x7F)
8996
goto yy506;
8997
if (yych <= 0x8F)
8998
goto yy548;
8999
goto yy506;
9000
yy553:
9001
++p;
9002
yych = *p;
9003
if (yych <= 0x7F)
9004
goto yy506;
9005
if (yych <= 0xBF)
9006
goto yy532;
9007
goto yy506;
9008
yy554:
9009
++p;
9010
yych = *p;
9011
if (yych <= 0x9F)
9012
goto yy506;
9013
if (yych <= 0xBF)
9014
goto yy553;
9015
goto yy506;
9016
yy555:
9017
++p;
9018
yych = *p;
9019
if (yych <= 0x7F)
9020
goto yy506;
9021
if (yych <= 0xBF)
9022
goto yy553;
9023
goto yy506;
9024
yy556:
9025
++p;
9026
yych = *p;
9027
if (yych <= 0x7F)
9028
goto yy506;
9029
if (yych <= 0x9F)
9030
goto yy553;
9031
goto yy506;
9032
yy557:
9033
++p;
9034
yych = *p;
9035
if (yych <= 0x8F)
9036
goto yy506;
9037
if (yych <= 0xBF)
9038
goto yy555;
9039
goto yy506;
9040
yy558:
9041
++p;
9042
yych = *p;
9043
if (yych <= 0x7F)
9044
goto yy506;
9045
if (yych <= 0xBF)
9046
goto yy555;
9047
goto yy506;
9048
yy559:
9049
++p;
9050
yych = *p;
9051
if (yych <= 0x7F)
9052
goto yy506;
9053
if (yych <= 0x8F)
9054
goto yy555;
9055
goto yy506;
9056
yy560:
9057
++p;
9058
yych = *p;
9059
if (yych <= '>') {
9060
if (yych <= '&') {
9061
if (yych <= 0x1F) {
9062
if (yych <= 0x00)
9063
goto yy506;
9064
if (yych <= 0x08)
9065
goto yy527;
9066
if (yych >= 0x0E)
9067
goto yy527;
9068
} else {
9069
if (yych <= ' ')
9070
goto yy562;
9071
if (yych == '"')
9072
goto yy506;
9073
goto yy527;
9074
}
9075
} else {
9076
if (yych <= '/') {
9077
if (yych <= '\'')
9078
goto yy506;
9079
if (yych <= ',')
9080
goto yy527;
9081
if (yych <= '.')
9082
goto yy560;
9083
goto yy527;
9084
} else {
9085
if (yych <= ';') {
9086
if (yych <= ':')
9087
goto yy560;
9088
goto yy527;
9089
} else {
9090
if (yych <= '<')
9091
goto yy506;
9092
if (yych <= '=')
9093
goto yy526;
9094
goto yy514;
9095
}
9096
}
9097
}
9098
} else {
9099
if (yych <= 0xC1) {
9100
if (yych <= '_') {
9101
if (yych <= '@')
9102
goto yy527;
9103
if (yych <= 'Z')
9104
goto yy560;
9105
if (yych <= '^')
9106
goto yy527;
9107
goto yy560;
9108
} else {
9109
if (yych <= '`')
9110
goto yy506;
9111
if (yych <= 'z')
9112
goto yy560;
9113
if (yych <= 0x7F)
9114
goto yy527;
9115
goto yy506;
9116
}
9117
} else {
9118
if (yych <= 0xED) {
9119
if (yych <= 0xDF)
9120
goto yy534;
9121
if (yych <= 0xE0)
9122
goto yy535;
9123
if (yych <= 0xEC)
9124
goto yy536;
9125
goto yy537;
9126
} else {
9127
if (yych <= 0xF0) {
9128
if (yych <= 0xEF)
9129
goto yy536;
9130
goto yy538;
9131
} else {
9132
if (yych <= 0xF3)
9133
goto yy539;
9134
if (yych <= 0xF4)
9135
goto yy540;
9136
goto yy506;
9137
}
9138
}
9139
}
9140
}
9141
yy562:
9142
++p;
9143
yych = *p;
9144
if (yych <= '@') {
9145
if (yych <= '&') {
9146
if (yych <= 0x1F) {
9147
if (yych <= 0x00)
9148
goto yy506;
9149
if (yych <= 0x08)
9150
goto yy527;
9151
if (yych <= '\r')
9152
goto yy562;
9153
goto yy527;
9154
} else {
9155
if (yych <= ' ')
9156
goto yy562;
9157
if (yych == '"')
9158
goto yy506;
9159
goto yy527;
9160
}
9161
} else {
9162
if (yych <= ';') {
9163
if (yych <= '\'')
9164
goto yy506;
9165
if (yych == ':')
9166
goto yy560;
9167
goto yy527;
9168
} else {
9169
if (yych <= '<')
9170
goto yy506;
9171
if (yych <= '=')
9172
goto yy526;
9173
if (yych <= '>')
9174
goto yy514;
9175
goto yy527;
9176
}
9177
}
9178
} else {
9179
if (yych <= 0xDF) {
9180
if (yych <= '`') {
9181
if (yych <= 'Z')
9182
goto yy560;
9183
if (yych <= '^')
9184
goto yy527;
9185
if (yych <= '_')
9186
goto yy560;
9187
goto yy506;
9188
} else {
9189
if (yych <= 'z')
9190
goto yy560;
9191
if (yych <= 0x7F)
9192
goto yy527;
9193
if (yych <= 0xC1)
9194
goto yy506;
9195
goto yy534;
9196
}
9197
} else {
9198
if (yych <= 0xEF) {
9199
if (yych <= 0xE0)
9200
goto yy535;
9201
if (yych == 0xED)
9202
goto yy537;
9203
goto yy536;
9204
} else {
9205
if (yych <= 0xF0)
9206
goto yy538;
9207
if (yych <= 0xF3)
9208
goto yy539;
9209
if (yych <= 0xF4)
9210
goto yy540;
9211
goto yy506;
9212
}
9213
}
9214
}
9215
}
9216
}
9217
9218
// Try to match an HTML block end line of type 1
9219
bufsize_t _scan_html_block_end_1(const unsigned char *p) {
9220
const unsigned char *marker = NULL;
9221
const unsigned char *start = p;
9222
9223
{
9224
unsigned char yych;
9225
unsigned int yyaccept = 0;
9226
static const unsigned char yybm[] = {
9227
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 64, 64, 64, 64, 64, 64, 64,
9228
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
9229
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
9230
64, 64, 64, 64, 64, 64, 128, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
9231
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
9232
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
9233
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
9234
64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
9235
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
9236
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
9237
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
9238
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
9239
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
9240
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
9241
0, 0, 0, 0,
9242
};
9243
yych = *p;
9244
if (yych <= 0xDF) {
9245
if (yych <= ';') {
9246
if (yych == '\n')
9247
goto yy568;
9248
} else {
9249
if (yych <= '<')
9250
goto yy569;
9251
if (yych <= 0x7F)
9252
goto yy566;
9253
if (yych <= 0xC1)
9254
goto yy568;
9255
goto yy570;
9256
}
9257
} else {
9258
if (yych <= 0xEF) {
9259
if (yych <= 0xE0)
9260
goto yy571;
9261
if (yych == 0xED)
9262
goto yy573;
9263
goto yy572;
9264
} else {
9265
if (yych <= 0xF0)
9266
goto yy574;
9267
if (yych <= 0xF3)
9268
goto yy575;
9269
if (yych <= 0xF4)
9270
goto yy576;
9271
goto yy568;
9272
}
9273
}
9274
yy566:
9275
yyaccept = 0;
9276
yych = *(marker = ++p);
9277
if (yych <= 0x7F) {
9278
if (yych != '\n')
9279
goto yy578;
9280
} else {
9281
if (yych <= 0xC1)
9282
goto yy567;
9283
if (yych <= 0xF4)
9284
goto yy578;
9285
}
9286
yy567 : { return 0; }
9287
yy568:
9288
yych = *++p;
9289
goto yy567;
9290
yy569:
9291
yyaccept = 0;
9292
yych = *(marker = ++p);
9293
if (yych <= '/') {
9294
if (yych == '\n')
9295
goto yy567;
9296
if (yych <= '.')
9297
goto yy578;
9298
goto yy589;
9299
} else {
9300
if (yych <= 0x7F)
9301
goto yy578;
9302
if (yych <= 0xC1)
9303
goto yy567;
9304
if (yych <= 0xF4)
9305
goto yy578;
9306
goto yy567;
9307
}
9308
yy570:
9309
yyaccept = 0;
9310
yych = *(marker = ++p);
9311
if (yych <= 0x7F)
9312
goto yy567;
9313
if (yych <= 0xBF)
9314
goto yy577;
9315
goto yy567;
9316
yy571:
9317
yyaccept = 0;
9318
yych = *(marker = ++p);
9319
if (yych <= 0x9F)
9320
goto yy567;
9321
if (yych <= 0xBF)
9322
goto yy582;
9323
goto yy567;
9324
yy572:
9325
yyaccept = 0;
9326
yych = *(marker = ++p);
9327
if (yych <= 0x7F)
9328
goto yy567;
9329
if (yych <= 0xBF)
9330
goto yy582;
9331
goto yy567;
9332
yy573:
9333
yyaccept = 0;
9334
yych = *(marker = ++p);
9335
if (yych <= 0x7F)
9336
goto yy567;
9337
if (yych <= 0x9F)
9338
goto yy582;
9339
goto yy567;
9340
yy574:
9341
yyaccept = 0;
9342
yych = *(marker = ++p);
9343
if (yych <= 0x8F)
9344
goto yy567;
9345
if (yych <= 0xBF)
9346
goto yy584;
9347
goto yy567;
9348
yy575:
9349
yyaccept = 0;
9350
yych = *(marker = ++p);
9351
if (yych <= 0x7F)
9352
goto yy567;
9353
if (yych <= 0xBF)
9354
goto yy584;
9355
goto yy567;
9356
yy576:
9357
yyaccept = 0;
9358
yych = *(marker = ++p);
9359
if (yych <= 0x7F)
9360
goto yy567;
9361
if (yych <= 0x8F)
9362
goto yy584;
9363
goto yy567;
9364
yy577:
9365
++p;
9366
yych = *p;
9367
yy578:
9368
if (yybm[0 + yych] & 64) {
9369
goto yy577;
9370
}
9371
if (yych <= 0xEC) {
9372
if (yych <= 0xC1) {
9373
if (yych <= '\n')
9374
goto yy579;
9375
if (yych <= '<')
9376
goto yy580;
9377
} else {
9378
if (yych <= 0xDF)
9379
goto yy582;
9380
if (yych <= 0xE0)
9381
goto yy583;
9382
goto yy584;
9383
}
9384
} else {
9385
if (yych <= 0xF0) {
9386
if (yych <= 0xED)
9387
goto yy585;
9388
if (yych <= 0xEF)
9389
goto yy584;
9390
goto yy586;
9391
} else {
9392
if (yych <= 0xF3)
9393
goto yy587;
9394
if (yych <= 0xF4)
9395
goto yy588;
9396
}
9397
}
9398
yy579:
9399
p = marker;
9400
if (yyaccept == 0) {
9401
goto yy567;
9402
} else {
9403
goto yy599;
9404
}
9405
yy580:
9406
++p;
9407
yych = *p;
9408
if (yybm[0 + yych] & 128) {
9409
goto yy580;
9410
}
9411
if (yych <= 0xDF) {
9412
if (yych <= '.') {
9413
if (yych == '\n')
9414
goto yy579;
9415
goto yy577;
9416
} else {
9417
if (yych <= '/')
9418
goto yy589;
9419
if (yych <= 0x7F)
9420
goto yy577;
9421
if (yych <= 0xC1)
9422
goto yy579;
9423
}
9424
} else {
9425
if (yych <= 0xEF) {
9426
if (yych <= 0xE0)
9427
goto yy583;
9428
if (yych == 0xED)
9429
goto yy585;
9430
goto yy584;
9431
} else {
9432
if (yych <= 0xF0)
9433
goto yy586;
9434
if (yych <= 0xF3)
9435
goto yy587;
9436
if (yych <= 0xF4)
9437
goto yy588;
9438
goto yy579;
9439
}
9440
}
9441
yy582:
9442
++p;
9443
yych = *p;
9444
if (yych <= 0x7F)
9445
goto yy579;
9446
if (yych <= 0xBF)
9447
goto yy577;
9448
goto yy579;
9449
yy583:
9450
++p;
9451
yych = *p;
9452
if (yych <= 0x9F)
9453
goto yy579;
9454
if (yych <= 0xBF)
9455
goto yy582;
9456
goto yy579;
9457
yy584:
9458
++p;
9459
yych = *p;
9460
if (yych <= 0x7F)
9461
goto yy579;
9462
if (yych <= 0xBF)
9463
goto yy582;
9464
goto yy579;
9465
yy585:
9466
++p;
9467
yych = *p;
9468
if (yych <= 0x7F)
9469
goto yy579;
9470
if (yych <= 0x9F)
9471
goto yy582;
9472
goto yy579;
9473
yy586:
9474
++p;
9475
yych = *p;
9476
if (yych <= 0x8F)
9477
goto yy579;
9478
if (yych <= 0xBF)
9479
goto yy584;
9480
goto yy579;
9481
yy587:
9482
++p;
9483
yych = *p;
9484
if (yych <= 0x7F)
9485
goto yy579;
9486
if (yych <= 0xBF)
9487
goto yy584;
9488
goto yy579;
9489
yy588:
9490
++p;
9491
yych = *p;
9492
if (yych <= 0x7F)
9493
goto yy579;
9494
if (yych <= 0x8F)
9495
goto yy584;
9496
goto yy579;
9497
yy589:
9498
++p;
9499
yych = *p;
9500
if (yybm[0 + yych] & 128) {
9501
goto yy580;
9502
}
9503
if (yych <= 's') {
9504
if (yych <= 'R') {
9505
if (yych <= '\n') {
9506
if (yych <= '\t')
9507
goto yy577;
9508
goto yy579;
9509
} else {
9510
if (yych != 'P')
9511
goto yy577;
9512
}
9513
} else {
9514
if (yych <= 'o') {
9515
if (yych <= 'S')
9516
goto yy591;
9517
goto yy577;
9518
} else {
9519
if (yych <= 'p')
9520
goto yy590;
9521
if (yych <= 'r')
9522
goto yy577;
9523
goto yy591;
9524
}
9525
}
9526
} else {
9527
if (yych <= 0xEC) {
9528
if (yych <= 0xC1) {
9529
if (yych <= 0x7F)
9530
goto yy577;
9531
goto yy579;
9532
} else {
9533
if (yych <= 0xDF)
9534
goto yy582;
9535
if (yych <= 0xE0)
9536
goto yy583;
9537
goto yy584;
9538
}
9539
} else {
9540
if (yych <= 0xF0) {
9541
if (yych <= 0xED)
9542
goto yy585;
9543
if (yych <= 0xEF)
9544
goto yy584;
9545
goto yy586;
9546
} else {
9547
if (yych <= 0xF3)
9548
goto yy587;
9549
if (yych <= 0xF4)
9550
goto yy588;
9551
goto yy579;
9552
}
9553
}
9554
}
9555
yy590:
9556
++p;
9557
yych = *p;
9558
if (yybm[0 + yych] & 128) {
9559
goto yy580;
9560
}
9561
if (yych <= 0xC1) {
9562
if (yych <= 'R') {
9563
if (yych == '\n')
9564
goto yy579;
9565
if (yych <= 'Q')
9566
goto yy577;
9567
goto yy592;
9568
} else {
9569
if (yych == 'r')
9570
goto yy592;
9571
if (yych <= 0x7F)
9572
goto yy577;
9573
goto yy579;
9574
}
9575
} else {
9576
if (yych <= 0xED) {
9577
if (yych <= 0xDF)
9578
goto yy582;
9579
if (yych <= 0xE0)
9580
goto yy583;
9581
if (yych <= 0xEC)
9582
goto yy584;
9583
goto yy585;
9584
} else {
9585
if (yych <= 0xF0) {
9586
if (yych <= 0xEF)
9587
goto yy584;
9588
goto yy586;
9589
} else {
9590
if (yych <= 0xF3)
9591
goto yy587;
9592
if (yych <= 0xF4)
9593
goto yy588;
9594
goto yy579;
9595
}
9596
}
9597
}
9598
yy591:
9599
++p;
9600
yych = *p;
9601
if (yybm[0 + yych] & 128) {
9602
goto yy580;
9603
}
9604
if (yych <= 't') {
9605
if (yych <= 'S') {
9606
if (yych <= '\n') {
9607
if (yych <= '\t')
9608
goto yy577;
9609
goto yy579;
9610
} else {
9611
if (yych == 'C')
9612
goto yy593;
9613
goto yy577;
9614
}
9615
} else {
9616
if (yych <= 'b') {
9617
if (yych <= 'T')
9618
goto yy594;
9619
goto yy577;
9620
} else {
9621
if (yych <= 'c')
9622
goto yy593;
9623
if (yych <= 's')
9624
goto yy577;
9625
goto yy594;
9626
}
9627
}
9628
} else {
9629
if (yych <= 0xEC) {
9630
if (yych <= 0xC1) {
9631
if (yych <= 0x7F)
9632
goto yy577;
9633
goto yy579;
9634
} else {
9635
if (yych <= 0xDF)
9636
goto yy582;
9637
if (yych <= 0xE0)
9638
goto yy583;
9639
goto yy584;
9640
}
9641
} else {
9642
if (yych <= 0xF0) {
9643
if (yych <= 0xED)
9644
goto yy585;
9645
if (yych <= 0xEF)
9646
goto yy584;
9647
goto yy586;
9648
} else {
9649
if (yych <= 0xF3)
9650
goto yy587;
9651
if (yych <= 0xF4)
9652
goto yy588;
9653
goto yy579;
9654
}
9655
}
9656
}
9657
yy592:
9658
++p;
9659
yych = *p;
9660
if (yybm[0 + yych] & 128) {
9661
goto yy580;
9662
}
9663
if (yych <= 0xC1) {
9664
if (yych <= 'E') {
9665
if (yych == '\n')
9666
goto yy579;
9667
if (yych <= 'D')
9668
goto yy577;
9669
goto yy595;
9670
} else {
9671
if (yych == 'e')
9672
goto yy595;
9673
if (yych <= 0x7F)
9674
goto yy577;
9675
goto yy579;
9676
}
9677
} else {
9678
if (yych <= 0xED) {
9679
if (yych <= 0xDF)
9680
goto yy582;
9681
if (yych <= 0xE0)
9682
goto yy583;
9683
if (yych <= 0xEC)
9684
goto yy584;
9685
goto yy585;
9686
} else {
9687
if (yych <= 0xF0) {
9688
if (yych <= 0xEF)
9689
goto yy584;
9690
goto yy586;
9691
} else {
9692
if (yych <= 0xF3)
9693
goto yy587;
9694
if (yych <= 0xF4)
9695
goto yy588;
9696
goto yy579;
9697
}
9698
}
9699
}
9700
yy593:
9701
++p;
9702
yych = *p;
9703
if (yybm[0 + yych] & 128) {
9704
goto yy580;
9705
}
9706
if (yych <= 0xC1) {
9707
if (yych <= 'R') {
9708
if (yych == '\n')
9709
goto yy579;
9710
if (yych <= 'Q')
9711
goto yy577;
9712
goto yy596;
9713
} else {
9714
if (yych == 'r')
9715
goto yy596;
9716
if (yych <= 0x7F)
9717
goto yy577;
9718
goto yy579;
9719
}
9720
} else {
9721
if (yych <= 0xED) {
9722
if (yych <= 0xDF)
9723
goto yy582;
9724
if (yych <= 0xE0)
9725
goto yy583;
9726
if (yych <= 0xEC)
9727
goto yy584;
9728
goto yy585;
9729
} else {
9730
if (yych <= 0xF0) {
9731
if (yych <= 0xEF)
9732
goto yy584;
9733
goto yy586;
9734
} else {
9735
if (yych <= 0xF3)
9736
goto yy587;
9737
if (yych <= 0xF4)
9738
goto yy588;
9739
goto yy579;
9740
}
9741
}
9742
}
9743
yy594:
9744
++p;
9745
yych = *p;
9746
if (yybm[0 + yych] & 128) {
9747
goto yy580;
9748
}
9749
if (yych <= 0xC1) {
9750
if (yych <= 'Y') {
9751
if (yych == '\n')
9752
goto yy579;
9753
if (yych <= 'X')
9754
goto yy577;
9755
goto yy597;
9756
} else {
9757
if (yych == 'y')
9758
goto yy597;
9759
if (yych <= 0x7F)
9760
goto yy577;
9761
goto yy579;
9762
}
9763
} else {
9764
if (yych <= 0xED) {
9765
if (yych <= 0xDF)
9766
goto yy582;
9767
if (yych <= 0xE0)
9768
goto yy583;
9769
if (yych <= 0xEC)
9770
goto yy584;
9771
goto yy585;
9772
} else {
9773
if (yych <= 0xF0) {
9774
if (yych <= 0xEF)
9775
goto yy584;
9776
goto yy586;
9777
} else {
9778
if (yych <= 0xF3)
9779
goto yy587;
9780
if (yych <= 0xF4)
9781
goto yy588;
9782
goto yy579;
9783
}
9784
}
9785
}
9786
yy595:
9787
++p;
9788
yych = *p;
9789
if (yybm[0 + yych] & 128) {
9790
goto yy580;
9791
}
9792
if (yych <= 0xDF) {
9793
if (yych <= '=') {
9794
if (yych == '\n')
9795
goto yy579;
9796
goto yy577;
9797
} else {
9798
if (yych <= '>')
9799
goto yy598;
9800
if (yych <= 0x7F)
9801
goto yy577;
9802
if (yych <= 0xC1)
9803
goto yy579;
9804
goto yy582;
9805
}
9806
} else {
9807
if (yych <= 0xEF) {
9808
if (yych <= 0xE0)
9809
goto yy583;
9810
if (yych == 0xED)
9811
goto yy585;
9812
goto yy584;
9813
} else {
9814
if (yych <= 0xF0)
9815
goto yy586;
9816
if (yych <= 0xF3)
9817
goto yy587;
9818
if (yych <= 0xF4)
9819
goto yy588;
9820
goto yy579;
9821
}
9822
}
9823
yy596:
9824
++p;
9825
yych = *p;
9826
if (yybm[0 + yych] & 128) {
9827
goto yy580;
9828
}
9829
if (yych <= 0xC1) {
9830
if (yych <= 'I') {
9831
if (yych == '\n')
9832
goto yy579;
9833
if (yych <= 'H')
9834
goto yy577;
9835
goto yy600;
9836
} else {
9837
if (yych == 'i')
9838
goto yy600;
9839
if (yych <= 0x7F)
9840
goto yy577;
9841
goto yy579;
9842
}
9843
} else {
9844
if (yych <= 0xED) {
9845
if (yych <= 0xDF)
9846
goto yy582;
9847
if (yych <= 0xE0)
9848
goto yy583;
9849
if (yych <= 0xEC)
9850
goto yy584;
9851
goto yy585;
9852
} else {
9853
if (yych <= 0xF0) {
9854
if (yych <= 0xEF)
9855
goto yy584;
9856
goto yy586;
9857
} else {
9858
if (yych <= 0xF3)
9859
goto yy587;
9860
if (yych <= 0xF4)
9861
goto yy588;
9862
goto yy579;
9863
}
9864
}
9865
}
9866
yy597:
9867
++p;
9868
yych = *p;
9869
if (yybm[0 + yych] & 128) {
9870
goto yy580;
9871
}
9872
if (yych <= 0xC1) {
9873
if (yych <= 'L') {
9874
if (yych == '\n')
9875
goto yy579;
9876
if (yych <= 'K')
9877
goto yy577;
9878
goto yy592;
9879
} else {
9880
if (yych == 'l')
9881
goto yy592;
9882
if (yych <= 0x7F)
9883
goto yy577;
9884
goto yy579;
9885
}
9886
} else {
9887
if (yych <= 0xED) {
9888
if (yych <= 0xDF)
9889
goto yy582;
9890
if (yych <= 0xE0)
9891
goto yy583;
9892
if (yych <= 0xEC)
9893
goto yy584;
9894
goto yy585;
9895
} else {
9896
if (yych <= 0xF0) {
9897
if (yych <= 0xEF)
9898
goto yy584;
9899
goto yy586;
9900
} else {
9901
if (yych <= 0xF3)
9902
goto yy587;
9903
if (yych <= 0xF4)
9904
goto yy588;
9905
goto yy579;
9906
}
9907
}
9908
}
9909
yy598:
9910
yyaccept = 1;
9911
marker = ++p;
9912
yych = *p;
9913
if (yybm[0 + yych] & 64) {
9914
goto yy577;
9915
}
9916
if (yych <= 0xEC) {
9917
if (yych <= 0xC1) {
9918
if (yych <= '\n')
9919
goto yy599;
9920
if (yych <= '<')
9921
goto yy580;
9922
} else {
9923
if (yych <= 0xDF)
9924
goto yy582;
9925
if (yych <= 0xE0)
9926
goto yy583;
9927
goto yy584;
9928
}
9929
} else {
9930
if (yych <= 0xF0) {
9931
if (yych <= 0xED)
9932
goto yy585;
9933
if (yych <= 0xEF)
9934
goto yy584;
9935
goto yy586;
9936
} else {
9937
if (yych <= 0xF3)
9938
goto yy587;
9939
if (yych <= 0xF4)
9940
goto yy588;
9941
}
9942
}
9943
yy599 : { return (bufsize_t)(p - start); }
9944
yy600:
9945
++p;
9946
yych = *p;
9947
if (yybm[0 + yych] & 128) {
9948
goto yy580;
9949
}
9950
if (yych <= 0xC1) {
9951
if (yych <= 'P') {
9952
if (yych == '\n')
9953
goto yy579;
9954
if (yych <= 'O')
9955
goto yy577;
9956
} else {
9957
if (yych == 'p')
9958
goto yy601;
9959
if (yych <= 0x7F)
9960
goto yy577;
9961
goto yy579;
9962
}
9963
} else {
9964
if (yych <= 0xED) {
9965
if (yych <= 0xDF)
9966
goto yy582;
9967
if (yych <= 0xE0)
9968
goto yy583;
9969
if (yych <= 0xEC)
9970
goto yy584;
9971
goto yy585;
9972
} else {
9973
if (yych <= 0xF0) {
9974
if (yych <= 0xEF)
9975
goto yy584;
9976
goto yy586;
9977
} else {
9978
if (yych <= 0xF3)
9979
goto yy587;
9980
if (yych <= 0xF4)
9981
goto yy588;
9982
goto yy579;
9983
}
9984
}
9985
}
9986
yy601:
9987
++p;
9988
yych = *p;
9989
if (yybm[0 + yych] & 128) {
9990
goto yy580;
9991
}
9992
if (yych <= 0xC1) {
9993
if (yych <= 'T') {
9994
if (yych == '\n')
9995
goto yy579;
9996
if (yych <= 'S')
9997
goto yy577;
9998
goto yy595;
9999
} else {
10000
if (yych == 't')
10001
goto yy595;
10002
if (yych <= 0x7F)
10003
goto yy577;
10004
goto yy579;
10005
}
10006
} else {
10007
if (yych <= 0xED) {
10008
if (yych <= 0xDF)
10009
goto yy582;
10010
if (yych <= 0xE0)
10011
goto yy583;
10012
if (yych <= 0xEC)
10013
goto yy584;
10014
goto yy585;
10015
} else {
10016
if (yych <= 0xF0) {
10017
if (yych <= 0xEF)
10018
goto yy584;
10019
goto yy586;
10020
} else {
10021
if (yych <= 0xF3)
10022
goto yy587;
10023
if (yych <= 0xF4)
10024
goto yy588;
10025
goto yy579;
10026
}
10027
}
10028
}
10029
}
10030
}
10031
10032
// Try to match an HTML block end line of type 2
10033
bufsize_t _scan_html_block_end_2(const unsigned char *p) {
10034
const unsigned char *marker = NULL;
10035
const unsigned char *start = p;
10036
10037
{
10038
unsigned char yych;
10039
unsigned int yyaccept = 0;
10040
static const unsigned char yybm[] = {
10041
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 64, 64, 64, 64, 64, 64, 64,
10042
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
10043
64, 64, 64, 64, 64, 64, 64, 64, 64, 128, 64, 64, 64, 64, 64, 64, 64, 64,
10044
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
10045
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
10046
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
10047
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
10048
64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10049
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10050
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10051
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10052
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10053
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10054
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10055
0, 0, 0, 0,
10056
};
10057
yych = *p;
10058
if (yych <= 0xDF) {
10059
if (yych <= ',') {
10060
if (yych == '\n')
10061
goto yy606;
10062
} else {
10063
if (yych <= '-')
10064
goto yy607;
10065
if (yych <= 0x7F)
10066
goto yy604;
10067
if (yych <= 0xC1)
10068
goto yy606;
10069
goto yy608;
10070
}
10071
} else {
10072
if (yych <= 0xEF) {
10073
if (yych <= 0xE0)
10074
goto yy609;
10075
if (yych == 0xED)
10076
goto yy611;
10077
goto yy610;
10078
} else {
10079
if (yych <= 0xF0)
10080
goto yy612;
10081
if (yych <= 0xF3)
10082
goto yy613;
10083
if (yych <= 0xF4)
10084
goto yy614;
10085
goto yy606;
10086
}
10087
}
10088
yy604:
10089
yyaccept = 0;
10090
yych = *(marker = ++p);
10091
if (yych <= 0x7F) {
10092
if (yych != '\n')
10093
goto yy616;
10094
} else {
10095
if (yych <= 0xC1)
10096
goto yy605;
10097
if (yych <= 0xF4)
10098
goto yy616;
10099
}
10100
yy605 : { return 0; }
10101
yy606:
10102
yych = *++p;
10103
goto yy605;
10104
yy607:
10105
yyaccept = 0;
10106
yych = *(marker = ++p);
10107
if (yybm[0 + yych] & 128) {
10108
goto yy626;
10109
}
10110
if (yych <= 0x7F) {
10111
if (yych == '\n')
10112
goto yy605;
10113
goto yy616;
10114
} else {
10115
if (yych <= 0xC1)
10116
goto yy605;
10117
if (yych <= 0xF4)
10118
goto yy616;
10119
goto yy605;
10120
}
10121
yy608:
10122
yyaccept = 0;
10123
yych = *(marker = ++p);
10124
if (yych <= 0x7F)
10125
goto yy605;
10126
if (yych <= 0xBF)
10127
goto yy615;
10128
goto yy605;
10129
yy609:
10130
yyaccept = 0;
10131
yych = *(marker = ++p);
10132
if (yych <= 0x9F)
10133
goto yy605;
10134
if (yych <= 0xBF)
10135
goto yy619;
10136
goto yy605;
10137
yy610:
10138
yyaccept = 0;
10139
yych = *(marker = ++p);
10140
if (yych <= 0x7F)
10141
goto yy605;
10142
if (yych <= 0xBF)
10143
goto yy619;
10144
goto yy605;
10145
yy611:
10146
yyaccept = 0;
10147
yych = *(marker = ++p);
10148
if (yych <= 0x7F)
10149
goto yy605;
10150
if (yych <= 0x9F)
10151
goto yy619;
10152
goto yy605;
10153
yy612:
10154
yyaccept = 0;
10155
yych = *(marker = ++p);
10156
if (yych <= 0x8F)
10157
goto yy605;
10158
if (yych <= 0xBF)
10159
goto yy621;
10160
goto yy605;
10161
yy613:
10162
yyaccept = 0;
10163
yych = *(marker = ++p);
10164
if (yych <= 0x7F)
10165
goto yy605;
10166
if (yych <= 0xBF)
10167
goto yy621;
10168
goto yy605;
10169
yy614:
10170
yyaccept = 0;
10171
yych = *(marker = ++p);
10172
if (yych <= 0x7F)
10173
goto yy605;
10174
if (yych <= 0x8F)
10175
goto yy621;
10176
goto yy605;
10177
yy615:
10178
++p;
10179
yych = *p;
10180
yy616:
10181
if (yybm[0 + yych] & 64) {
10182
goto yy615;
10183
}
10184
if (yych <= 0xEC) {
10185
if (yych <= 0xC1) {
10186
if (yych <= '\n')
10187
goto yy617;
10188
if (yych <= '-')
10189
goto yy618;
10190
} else {
10191
if (yych <= 0xDF)
10192
goto yy619;
10193
if (yych <= 0xE0)
10194
goto yy620;
10195
goto yy621;
10196
}
10197
} else {
10198
if (yych <= 0xF0) {
10199
if (yych <= 0xED)
10200
goto yy622;
10201
if (yych <= 0xEF)
10202
goto yy621;
10203
goto yy623;
10204
} else {
10205
if (yych <= 0xF3)
10206
goto yy624;
10207
if (yych <= 0xF4)
10208
goto yy625;
10209
}
10210
}
10211
yy617:
10212
p = marker;
10213
if (yyaccept == 0) {
10214
goto yy605;
10215
} else {
10216
goto yy629;
10217
}
10218
yy618:
10219
++p;
10220
yych = *p;
10221
if (yybm[0 + yych] & 64) {
10222
goto yy615;
10223
}
10224
if (yych <= 0xEC) {
10225
if (yych <= 0xC1) {
10226
if (yych <= '\n')
10227
goto yy617;
10228
if (yych <= '-')
10229
goto yy626;
10230
goto yy617;
10231
} else {
10232
if (yych <= 0xDF)
10233
goto yy619;
10234
if (yych <= 0xE0)
10235
goto yy620;
10236
goto yy621;
10237
}
10238
} else {
10239
if (yych <= 0xF0) {
10240
if (yych <= 0xED)
10241
goto yy622;
10242
if (yych <= 0xEF)
10243
goto yy621;
10244
goto yy623;
10245
} else {
10246
if (yych <= 0xF3)
10247
goto yy624;
10248
if (yych <= 0xF4)
10249
goto yy625;
10250
goto yy617;
10251
}
10252
}
10253
yy619:
10254
++p;
10255
yych = *p;
10256
if (yych <= 0x7F)
10257
goto yy617;
10258
if (yych <= 0xBF)
10259
goto yy615;
10260
goto yy617;
10261
yy620:
10262
++p;
10263
yych = *p;
10264
if (yych <= 0x9F)
10265
goto yy617;
10266
if (yych <= 0xBF)
10267
goto yy619;
10268
goto yy617;
10269
yy621:
10270
++p;
10271
yych = *p;
10272
if (yych <= 0x7F)
10273
goto yy617;
10274
if (yych <= 0xBF)
10275
goto yy619;
10276
goto yy617;
10277
yy622:
10278
++p;
10279
yych = *p;
10280
if (yych <= 0x7F)
10281
goto yy617;
10282
if (yych <= 0x9F)
10283
goto yy619;
10284
goto yy617;
10285
yy623:
10286
++p;
10287
yych = *p;
10288
if (yych <= 0x8F)
10289
goto yy617;
10290
if (yych <= 0xBF)
10291
goto yy621;
10292
goto yy617;
10293
yy624:
10294
++p;
10295
yych = *p;
10296
if (yych <= 0x7F)
10297
goto yy617;
10298
if (yych <= 0xBF)
10299
goto yy621;
10300
goto yy617;
10301
yy625:
10302
++p;
10303
yych = *p;
10304
if (yych <= 0x7F)
10305
goto yy617;
10306
if (yych <= 0x8F)
10307
goto yy621;
10308
goto yy617;
10309
yy626:
10310
++p;
10311
yych = *p;
10312
if (yybm[0 + yych] & 128) {
10313
goto yy626;
10314
}
10315
if (yych <= 0xDF) {
10316
if (yych <= '=') {
10317
if (yych == '\n')
10318
goto yy617;
10319
goto yy615;
10320
} else {
10321
if (yych <= '>')
10322
goto yy628;
10323
if (yych <= 0x7F)
10324
goto yy615;
10325
if (yych <= 0xC1)
10326
goto yy617;
10327
goto yy619;
10328
}
10329
} else {
10330
if (yych <= 0xEF) {
10331
if (yych <= 0xE0)
10332
goto yy620;
10333
if (yych == 0xED)
10334
goto yy622;
10335
goto yy621;
10336
} else {
10337
if (yych <= 0xF0)
10338
goto yy623;
10339
if (yych <= 0xF3)
10340
goto yy624;
10341
if (yych <= 0xF4)
10342
goto yy625;
10343
goto yy617;
10344
}
10345
}
10346
yy628:
10347
yyaccept = 1;
10348
marker = ++p;
10349
yych = *p;
10350
if (yybm[0 + yych] & 64) {
10351
goto yy615;
10352
}
10353
if (yych <= 0xEC) {
10354
if (yych <= 0xC1) {
10355
if (yych <= '\n')
10356
goto yy629;
10357
if (yych <= '-')
10358
goto yy618;
10359
} else {
10360
if (yych <= 0xDF)
10361
goto yy619;
10362
if (yych <= 0xE0)
10363
goto yy620;
10364
goto yy621;
10365
}
10366
} else {
10367
if (yych <= 0xF0) {
10368
if (yych <= 0xED)
10369
goto yy622;
10370
if (yych <= 0xEF)
10371
goto yy621;
10372
goto yy623;
10373
} else {
10374
if (yych <= 0xF3)
10375
goto yy624;
10376
if (yych <= 0xF4)
10377
goto yy625;
10378
}
10379
}
10380
yy629 : { return (bufsize_t)(p - start); }
10381
}
10382
}
10383
10384
// Try to match an HTML block end line of type 3
10385
bufsize_t _scan_html_block_end_3(const unsigned char *p) {
10386
const unsigned char *marker = NULL;
10387
const unsigned char *start = p;
10388
10389
{
10390
unsigned char yych;
10391
unsigned int yyaccept = 0;
10392
static const unsigned char yybm[] = {
10393
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 64, 64, 64, 64, 64, 64, 64,
10394
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
10395
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
10396
64, 64, 64, 64, 64, 64, 64, 64, 64, 128, 64, 64, 64, 64, 64, 64, 64, 64,
10397
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
10398
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
10399
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
10400
64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10401
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10402
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10403
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10404
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10405
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10406
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10407
0, 0, 0, 0,
10408
};
10409
yych = *p;
10410
if (yych <= 0xDF) {
10411
if (yych <= '>') {
10412
if (yych == '\n')
10413
goto yy634;
10414
} else {
10415
if (yych <= '?')
10416
goto yy635;
10417
if (yych <= 0x7F)
10418
goto yy632;
10419
if (yych <= 0xC1)
10420
goto yy634;
10421
goto yy636;
10422
}
10423
} else {
10424
if (yych <= 0xEF) {
10425
if (yych <= 0xE0)
10426
goto yy637;
10427
if (yych == 0xED)
10428
goto yy639;
10429
goto yy638;
10430
} else {
10431
if (yych <= 0xF0)
10432
goto yy640;
10433
if (yych <= 0xF3)
10434
goto yy641;
10435
if (yych <= 0xF4)
10436
goto yy642;
10437
goto yy634;
10438
}
10439
}
10440
yy632:
10441
yyaccept = 0;
10442
yych = *(marker = ++p);
10443
if (yych <= 0x7F) {
10444
if (yych != '\n')
10445
goto yy644;
10446
} else {
10447
if (yych <= 0xC1)
10448
goto yy633;
10449
if (yych <= 0xF4)
10450
goto yy644;
10451
}
10452
yy633 : { return 0; }
10453
yy634:
10454
yych = *++p;
10455
goto yy633;
10456
yy635:
10457
yyaccept = 0;
10458
yych = *(marker = ++p);
10459
if (yych <= '>') {
10460
if (yych == '\n')
10461
goto yy633;
10462
if (yych <= '=')
10463
goto yy644;
10464
goto yy655;
10465
} else {
10466
if (yych <= 0x7F)
10467
goto yy644;
10468
if (yych <= 0xC1)
10469
goto yy633;
10470
if (yych <= 0xF4)
10471
goto yy644;
10472
goto yy633;
10473
}
10474
yy636:
10475
yyaccept = 0;
10476
yych = *(marker = ++p);
10477
if (yych <= 0x7F)
10478
goto yy633;
10479
if (yych <= 0xBF)
10480
goto yy643;
10481
goto yy633;
10482
yy637:
10483
yyaccept = 0;
10484
yych = *(marker = ++p);
10485
if (yych <= 0x9F)
10486
goto yy633;
10487
if (yych <= 0xBF)
10488
goto yy648;
10489
goto yy633;
10490
yy638:
10491
yyaccept = 0;
10492
yych = *(marker = ++p);
10493
if (yych <= 0x7F)
10494
goto yy633;
10495
if (yych <= 0xBF)
10496
goto yy648;
10497
goto yy633;
10498
yy639:
10499
yyaccept = 0;
10500
yych = *(marker = ++p);
10501
if (yych <= 0x7F)
10502
goto yy633;
10503
if (yych <= 0x9F)
10504
goto yy648;
10505
goto yy633;
10506
yy640:
10507
yyaccept = 0;
10508
yych = *(marker = ++p);
10509
if (yych <= 0x8F)
10510
goto yy633;
10511
if (yych <= 0xBF)
10512
goto yy650;
10513
goto yy633;
10514
yy641:
10515
yyaccept = 0;
10516
yych = *(marker = ++p);
10517
if (yych <= 0x7F)
10518
goto yy633;
10519
if (yych <= 0xBF)
10520
goto yy650;
10521
goto yy633;
10522
yy642:
10523
yyaccept = 0;
10524
yych = *(marker = ++p);
10525
if (yych <= 0x7F)
10526
goto yy633;
10527
if (yych <= 0x8F)
10528
goto yy650;
10529
goto yy633;
10530
yy643:
10531
++p;
10532
yych = *p;
10533
yy644:
10534
if (yybm[0 + yych] & 64) {
10535
goto yy643;
10536
}
10537
if (yych <= 0xEC) {
10538
if (yych <= 0xC1) {
10539
if (yych <= '\n')
10540
goto yy645;
10541
if (yych <= '?')
10542
goto yy646;
10543
} else {
10544
if (yych <= 0xDF)
10545
goto yy648;
10546
if (yych <= 0xE0)
10547
goto yy649;
10548
goto yy650;
10549
}
10550
} else {
10551
if (yych <= 0xF0) {
10552
if (yych <= 0xED)
10553
goto yy651;
10554
if (yych <= 0xEF)
10555
goto yy650;
10556
goto yy652;
10557
} else {
10558
if (yych <= 0xF3)
10559
goto yy653;
10560
if (yych <= 0xF4)
10561
goto yy654;
10562
}
10563
}
10564
yy645:
10565
p = marker;
10566
if (yyaccept == 0) {
10567
goto yy633;
10568
} else {
10569
goto yy656;
10570
}
10571
yy646:
10572
++p;
10573
yych = *p;
10574
if (yybm[0 + yych] & 128) {
10575
goto yy646;
10576
}
10577
if (yych <= 0xDF) {
10578
if (yych <= '=') {
10579
if (yych == '\n')
10580
goto yy645;
10581
goto yy643;
10582
} else {
10583
if (yych <= '>')
10584
goto yy655;
10585
if (yych <= 0x7F)
10586
goto yy643;
10587
if (yych <= 0xC1)
10588
goto yy645;
10589
}
10590
} else {
10591
if (yych <= 0xEF) {
10592
if (yych <= 0xE0)
10593
goto yy649;
10594
if (yych == 0xED)
10595
goto yy651;
10596
goto yy650;
10597
} else {
10598
if (yych <= 0xF0)
10599
goto yy652;
10600
if (yych <= 0xF3)
10601
goto yy653;
10602
if (yych <= 0xF4)
10603
goto yy654;
10604
goto yy645;
10605
}
10606
}
10607
yy648:
10608
++p;
10609
yych = *p;
10610
if (yych <= 0x7F)
10611
goto yy645;
10612
if (yych <= 0xBF)
10613
goto yy643;
10614
goto yy645;
10615
yy649:
10616
++p;
10617
yych = *p;
10618
if (yych <= 0x9F)
10619
goto yy645;
10620
if (yych <= 0xBF)
10621
goto yy648;
10622
goto yy645;
10623
yy650:
10624
++p;
10625
yych = *p;
10626
if (yych <= 0x7F)
10627
goto yy645;
10628
if (yych <= 0xBF)
10629
goto yy648;
10630
goto yy645;
10631
yy651:
10632
++p;
10633
yych = *p;
10634
if (yych <= 0x7F)
10635
goto yy645;
10636
if (yych <= 0x9F)
10637
goto yy648;
10638
goto yy645;
10639
yy652:
10640
++p;
10641
yych = *p;
10642
if (yych <= 0x8F)
10643
goto yy645;
10644
if (yych <= 0xBF)
10645
goto yy650;
10646
goto yy645;
10647
yy653:
10648
++p;
10649
yych = *p;
10650
if (yych <= 0x7F)
10651
goto yy645;
10652
if (yych <= 0xBF)
10653
goto yy650;
10654
goto yy645;
10655
yy654:
10656
++p;
10657
yych = *p;
10658
if (yych <= 0x7F)
10659
goto yy645;
10660
if (yych <= 0x8F)
10661
goto yy650;
10662
goto yy645;
10663
yy655:
10664
yyaccept = 1;
10665
marker = ++p;
10666
yych = *p;
10667
if (yybm[0 + yych] & 64) {
10668
goto yy643;
10669
}
10670
if (yych <= 0xEC) {
10671
if (yych <= 0xC1) {
10672
if (yych <= '\n')
10673
goto yy656;
10674
if (yych <= '?')
10675
goto yy646;
10676
} else {
10677
if (yych <= 0xDF)
10678
goto yy648;
10679
if (yych <= 0xE0)
10680
goto yy649;
10681
goto yy650;
10682
}
10683
} else {
10684
if (yych <= 0xF0) {
10685
if (yych <= 0xED)
10686
goto yy651;
10687
if (yych <= 0xEF)
10688
goto yy650;
10689
goto yy652;
10690
} else {
10691
if (yych <= 0xF3)
10692
goto yy653;
10693
if (yych <= 0xF4)
10694
goto yy654;
10695
}
10696
}
10697
yy656 : { return (bufsize_t)(p - start); }
10698
}
10699
}
10700
10701
// Try to match an HTML block end line of type 4
10702
bufsize_t _scan_html_block_end_4(const unsigned char *p) {
10703
const unsigned char *marker = NULL;
10704
const unsigned char *start = p;
10705
10706
{
10707
unsigned char yych;
10708
unsigned int yyaccept = 0;
10709
static const unsigned char yybm[] = {
10710
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 128, 128, 128,
10711
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
10712
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
10713
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
10714
128, 128, 128, 128, 128, 128, 64, 128, 128, 128, 128, 128, 128, 128,
10715
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
10716
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
10717
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
10718
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
10719
128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10720
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10721
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10722
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10723
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10724
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10725
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10726
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10727
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10728
0, 0, 0, 0,
10729
};
10730
yych = *p;
10731
if (yybm[0 + yych] & 64) {
10732
goto yy662;
10733
}
10734
if (yych <= 0xE0) {
10735
if (yych <= 0x7F) {
10736
if (yych == '\n')
10737
goto yy661;
10738
} else {
10739
if (yych <= 0xC1)
10740
goto yy661;
10741
if (yych <= 0xDF)
10742
goto yy665;
10743
goto yy666;
10744
}
10745
} else {
10746
if (yych <= 0xEF) {
10747
if (yych == 0xED)
10748
goto yy668;
10749
goto yy667;
10750
} else {
10751
if (yych <= 0xF0)
10752
goto yy669;
10753
if (yych <= 0xF3)
10754
goto yy670;
10755
if (yych <= 0xF4)
10756
goto yy671;
10757
goto yy661;
10758
}
10759
}
10760
yyaccept = 0;
10761
yych = *(marker = ++p);
10762
if (yych <= 0x7F) {
10763
if (yych != '\n')
10764
goto yy673;
10765
} else {
10766
if (yych <= 0xC1)
10767
goto yy660;
10768
if (yych <= 0xF4)
10769
goto yy673;
10770
}
10771
yy660 : { return 0; }
10772
yy661:
10773
yych = *++p;
10774
goto yy660;
10775
yy662:
10776
yyaccept = 1;
10777
marker = ++p;
10778
yych = *p;
10779
if (yybm[0 + yych] & 128) {
10780
goto yy672;
10781
}
10782
if (yych <= 0xEC) {
10783
if (yych <= 0xC1) {
10784
if (yych <= '\n')
10785
goto yy664;
10786
if (yych <= '>')
10787
goto yy662;
10788
} else {
10789
if (yych <= 0xDF)
10790
goto yy675;
10791
if (yych <= 0xE0)
10792
goto yy676;
10793
goto yy677;
10794
}
10795
} else {
10796
if (yych <= 0xF0) {
10797
if (yych <= 0xED)
10798
goto yy678;
10799
if (yych <= 0xEF)
10800
goto yy677;
10801
goto yy679;
10802
} else {
10803
if (yych <= 0xF3)
10804
goto yy680;
10805
if (yych <= 0xF4)
10806
goto yy681;
10807
}
10808
}
10809
yy664 : { return (bufsize_t)(p - start); }
10810
yy665:
10811
yyaccept = 0;
10812
yych = *(marker = ++p);
10813
if (yych <= 0x7F)
10814
goto yy660;
10815
if (yych <= 0xBF)
10816
goto yy672;
10817
goto yy660;
10818
yy666:
10819
yyaccept = 0;
10820
yych = *(marker = ++p);
10821
if (yych <= 0x9F)
10822
goto yy660;
10823
if (yych <= 0xBF)
10824
goto yy675;
10825
goto yy660;
10826
yy667:
10827
yyaccept = 0;
10828
yych = *(marker = ++p);
10829
if (yych <= 0x7F)
10830
goto yy660;
10831
if (yych <= 0xBF)
10832
goto yy675;
10833
goto yy660;
10834
yy668:
10835
yyaccept = 0;
10836
yych = *(marker = ++p);
10837
if (yych <= 0x7F)
10838
goto yy660;
10839
if (yych <= 0x9F)
10840
goto yy675;
10841
goto yy660;
10842
yy669:
10843
yyaccept = 0;
10844
yych = *(marker = ++p);
10845
if (yych <= 0x8F)
10846
goto yy660;
10847
if (yych <= 0xBF)
10848
goto yy677;
10849
goto yy660;
10850
yy670:
10851
yyaccept = 0;
10852
yych = *(marker = ++p);
10853
if (yych <= 0x7F)
10854
goto yy660;
10855
if (yych <= 0xBF)
10856
goto yy677;
10857
goto yy660;
10858
yy671:
10859
yyaccept = 0;
10860
yych = *(marker = ++p);
10861
if (yych <= 0x7F)
10862
goto yy660;
10863
if (yych <= 0x8F)
10864
goto yy677;
10865
goto yy660;
10866
yy672:
10867
++p;
10868
yych = *p;
10869
yy673:
10870
if (yybm[0 + yych] & 128) {
10871
goto yy672;
10872
}
10873
if (yych <= 0xEC) {
10874
if (yych <= 0xC1) {
10875
if (yych <= '\n')
10876
goto yy674;
10877
if (yych <= '>')
10878
goto yy662;
10879
} else {
10880
if (yych <= 0xDF)
10881
goto yy675;
10882
if (yych <= 0xE0)
10883
goto yy676;
10884
goto yy677;
10885
}
10886
} else {
10887
if (yych <= 0xF0) {
10888
if (yych <= 0xED)
10889
goto yy678;
10890
if (yych <= 0xEF)
10891
goto yy677;
10892
goto yy679;
10893
} else {
10894
if (yych <= 0xF3)
10895
goto yy680;
10896
if (yych <= 0xF4)
10897
goto yy681;
10898
}
10899
}
10900
yy674:
10901
p = marker;
10902
if (yyaccept == 0) {
10903
goto yy660;
10904
} else {
10905
goto yy664;
10906
}
10907
yy675:
10908
++p;
10909
yych = *p;
10910
if (yych <= 0x7F)
10911
goto yy674;
10912
if (yych <= 0xBF)
10913
goto yy672;
10914
goto yy674;
10915
yy676:
10916
++p;
10917
yych = *p;
10918
if (yych <= 0x9F)
10919
goto yy674;
10920
if (yych <= 0xBF)
10921
goto yy675;
10922
goto yy674;
10923
yy677:
10924
++p;
10925
yych = *p;
10926
if (yych <= 0x7F)
10927
goto yy674;
10928
if (yych <= 0xBF)
10929
goto yy675;
10930
goto yy674;
10931
yy678:
10932
++p;
10933
yych = *p;
10934
if (yych <= 0x7F)
10935
goto yy674;
10936
if (yych <= 0x9F)
10937
goto yy675;
10938
goto yy674;
10939
yy679:
10940
++p;
10941
yych = *p;
10942
if (yych <= 0x8F)
10943
goto yy674;
10944
if (yych <= 0xBF)
10945
goto yy677;
10946
goto yy674;
10947
yy680:
10948
++p;
10949
yych = *p;
10950
if (yych <= 0x7F)
10951
goto yy674;
10952
if (yych <= 0xBF)
10953
goto yy677;
10954
goto yy674;
10955
yy681:
10956
++p;
10957
yych = *p;
10958
if (yych <= 0x7F)
10959
goto yy674;
10960
if (yych <= 0x8F)
10961
goto yy677;
10962
goto yy674;
10963
}
10964
}
10965
10966
// Try to match an HTML block end line of type 5
10967
bufsize_t _scan_html_block_end_5(const unsigned char *p) {
10968
const unsigned char *marker = NULL;
10969
const unsigned char *start = p;
10970
10971
{
10972
unsigned char yych;
10973
unsigned int yyaccept = 0;
10974
static const unsigned char yybm[] = {
10975
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 64, 64, 64, 64, 64, 64, 64,
10976
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
10977
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
10978
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
10979
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
10980
64, 64, 64, 128, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
10981
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
10982
64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10983
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10984
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10985
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10986
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10987
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10988
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10989
0, 0, 0, 0,
10990
};
10991
yych = *p;
10992
if (yych <= 0xDF) {
10993
if (yych <= '\\') {
10994
if (yych == '\n')
10995
goto yy686;
10996
} else {
10997
if (yych <= ']')
10998
goto yy687;
10999
if (yych <= 0x7F)
11000
goto yy684;
11001
if (yych <= 0xC1)
11002
goto yy686;
11003
goto yy688;
11004
}
11005
} else {
11006
if (yych <= 0xEF) {
11007
if (yych <= 0xE0)
11008
goto yy689;
11009
if (yych == 0xED)
11010
goto yy691;
11011
goto yy690;
11012
} else {
11013
if (yych <= 0xF0)
11014
goto yy692;
11015
if (yych <= 0xF3)
11016
goto yy693;
11017
if (yych <= 0xF4)
11018
goto yy694;
11019
goto yy686;
11020
}
11021
}
11022
yy684:
11023
yyaccept = 0;
11024
yych = *(marker = ++p);
11025
if (yych <= 0x7F) {
11026
if (yych != '\n')
11027
goto yy696;
11028
} else {
11029
if (yych <= 0xC1)
11030
goto yy685;
11031
if (yych <= 0xF4)
11032
goto yy696;
11033
}
11034
yy685 : { return 0; }
11035
yy686:
11036
yych = *++p;
11037
goto yy685;
11038
yy687:
11039
yyaccept = 0;
11040
yych = *(marker = ++p);
11041
if (yybm[0 + yych] & 128) {
11042
goto yy706;
11043
}
11044
if (yych <= 0x7F) {
11045
if (yych == '\n')
11046
goto yy685;
11047
goto yy696;
11048
} else {
11049
if (yych <= 0xC1)
11050
goto yy685;
11051
if (yych <= 0xF4)
11052
goto yy696;
11053
goto yy685;
11054
}
11055
yy688:
11056
yyaccept = 0;
11057
yych = *(marker = ++p);
11058
if (yych <= 0x7F)
11059
goto yy685;
11060
if (yych <= 0xBF)
11061
goto yy695;
11062
goto yy685;
11063
yy689:
11064
yyaccept = 0;
11065
yych = *(marker = ++p);
11066
if (yych <= 0x9F)
11067
goto yy685;
11068
if (yych <= 0xBF)
11069
goto yy699;
11070
goto yy685;
11071
yy690:
11072
yyaccept = 0;
11073
yych = *(marker = ++p);
11074
if (yych <= 0x7F)
11075
goto yy685;
11076
if (yych <= 0xBF)
11077
goto yy699;
11078
goto yy685;
11079
yy691:
11080
yyaccept = 0;
11081
yych = *(marker = ++p);
11082
if (yych <= 0x7F)
11083
goto yy685;
11084
if (yych <= 0x9F)
11085
goto yy699;
11086
goto yy685;
11087
yy692:
11088
yyaccept = 0;
11089
yych = *(marker = ++p);
11090
if (yych <= 0x8F)
11091
goto yy685;
11092
if (yych <= 0xBF)
11093
goto yy701;
11094
goto yy685;
11095
yy693:
11096
yyaccept = 0;
11097
yych = *(marker = ++p);
11098
if (yych <= 0x7F)
11099
goto yy685;
11100
if (yych <= 0xBF)
11101
goto yy701;
11102
goto yy685;
11103
yy694:
11104
yyaccept = 0;
11105
yych = *(marker = ++p);
11106
if (yych <= 0x7F)
11107
goto yy685;
11108
if (yych <= 0x8F)
11109
goto yy701;
11110
goto yy685;
11111
yy695:
11112
++p;
11113
yych = *p;
11114
yy696:
11115
if (yybm[0 + yych] & 64) {
11116
goto yy695;
11117
}
11118
if (yych <= 0xEC) {
11119
if (yych <= 0xC1) {
11120
if (yych <= '\n')
11121
goto yy697;
11122
if (yych <= ']')
11123
goto yy698;
11124
} else {
11125
if (yych <= 0xDF)
11126
goto yy699;
11127
if (yych <= 0xE0)
11128
goto yy700;
11129
goto yy701;
11130
}
11131
} else {
11132
if (yych <= 0xF0) {
11133
if (yych <= 0xED)
11134
goto yy702;
11135
if (yych <= 0xEF)
11136
goto yy701;
11137
goto yy703;
11138
} else {
11139
if (yych <= 0xF3)
11140
goto yy704;
11141
if (yych <= 0xF4)
11142
goto yy705;
11143
}
11144
}
11145
yy697:
11146
p = marker;
11147
if (yyaccept == 0) {
11148
goto yy685;
11149
} else {
11150
goto yy709;
11151
}
11152
yy698:
11153
++p;
11154
yych = *p;
11155
if (yybm[0 + yych] & 64) {
11156
goto yy695;
11157
}
11158
if (yych <= 0xEC) {
11159
if (yych <= 0xC1) {
11160
if (yych <= '\n')
11161
goto yy697;
11162
if (yych <= ']')
11163
goto yy706;
11164
goto yy697;
11165
} else {
11166
if (yych <= 0xDF)
11167
goto yy699;
11168
if (yych <= 0xE0)
11169
goto yy700;
11170
goto yy701;
11171
}
11172
} else {
11173
if (yych <= 0xF0) {
11174
if (yych <= 0xED)
11175
goto yy702;
11176
if (yych <= 0xEF)
11177
goto yy701;
11178
goto yy703;
11179
} else {
11180
if (yych <= 0xF3)
11181
goto yy704;
11182
if (yych <= 0xF4)
11183
goto yy705;
11184
goto yy697;
11185
}
11186
}
11187
yy699:
11188
++p;
11189
yych = *p;
11190
if (yych <= 0x7F)
11191
goto yy697;
11192
if (yych <= 0xBF)
11193
goto yy695;
11194
goto yy697;
11195
yy700:
11196
++p;
11197
yych = *p;
11198
if (yych <= 0x9F)
11199
goto yy697;
11200
if (yych <= 0xBF)
11201
goto yy699;
11202
goto yy697;
11203
yy701:
11204
++p;
11205
yych = *p;
11206
if (yych <= 0x7F)
11207
goto yy697;
11208
if (yych <= 0xBF)
11209
goto yy699;
11210
goto yy697;
11211
yy702:
11212
++p;
11213
yych = *p;
11214
if (yych <= 0x7F)
11215
goto yy697;
11216
if (yych <= 0x9F)
11217
goto yy699;
11218
goto yy697;
11219
yy703:
11220
++p;
11221
yych = *p;
11222
if (yych <= 0x8F)
11223
goto yy697;
11224
if (yych <= 0xBF)
11225
goto yy701;
11226
goto yy697;
11227
yy704:
11228
++p;
11229
yych = *p;
11230
if (yych <= 0x7F)
11231
goto yy697;
11232
if (yych <= 0xBF)
11233
goto yy701;
11234
goto yy697;
11235
yy705:
11236
++p;
11237
yych = *p;
11238
if (yych <= 0x7F)
11239
goto yy697;
11240
if (yych <= 0x8F)
11241
goto yy701;
11242
goto yy697;
11243
yy706:
11244
++p;
11245
yych = *p;
11246
if (yybm[0 + yych] & 128) {
11247
goto yy706;
11248
}
11249
if (yych <= 0xDF) {
11250
if (yych <= '=') {
11251
if (yych == '\n')
11252
goto yy697;
11253
goto yy695;
11254
} else {
11255
if (yych <= '>')
11256
goto yy708;
11257
if (yych <= 0x7F)
11258
goto yy695;
11259
if (yych <= 0xC1)
11260
goto yy697;
11261
goto yy699;
11262
}
11263
} else {
11264
if (yych <= 0xEF) {
11265
if (yych <= 0xE0)
11266
goto yy700;
11267
if (yych == 0xED)
11268
goto yy702;
11269
goto yy701;
11270
} else {
11271
if (yych <= 0xF0)
11272
goto yy703;
11273
if (yych <= 0xF3)
11274
goto yy704;
11275
if (yych <= 0xF4)
11276
goto yy705;
11277
goto yy697;
11278
}
11279
}
11280
yy708:
11281
yyaccept = 1;
11282
marker = ++p;
11283
yych = *p;
11284
if (yybm[0 + yych] & 64) {
11285
goto yy695;
11286
}
11287
if (yych <= 0xEC) {
11288
if (yych <= 0xC1) {
11289
if (yych <= '\n')
11290
goto yy709;
11291
if (yych <= ']')
11292
goto yy698;
11293
} else {
11294
if (yych <= 0xDF)
11295
goto yy699;
11296
if (yych <= 0xE0)
11297
goto yy700;
11298
goto yy701;
11299
}
11300
} else {
11301
if (yych <= 0xF0) {
11302
if (yych <= 0xED)
11303
goto yy702;
11304
if (yych <= 0xEF)
11305
goto yy701;
11306
goto yy703;
11307
} else {
11308
if (yych <= 0xF3)
11309
goto yy704;
11310
if (yych <= 0xF4)
11311
goto yy705;
11312
}
11313
}
11314
yy709 : { return (bufsize_t)(p - start); }
11315
}
11316
}
11317
11318
// Try to match a link title (in single quotes, in double quotes, or
11319
// in parentheses), returning number of chars matched. Allow one
11320
// level of internal nesting (quotes within quotes).
11321
bufsize_t _scan_link_title(const unsigned char *p) {
11322
const unsigned char *marker = NULL;
11323
const unsigned char *start = p;
11324
11325
{
11326
unsigned char yych;
11327
unsigned int yyaccept = 0;
11328
static const unsigned char yybm[] = {
11329
0, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
11330
208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
11331
208, 208, 208, 208, 208, 208, 192, 208, 208, 208, 208, 144, 208, 80,
11332
208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
11333
208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
11334
208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
11335
208, 208, 208, 208, 208, 208, 208, 208, 32, 208, 208, 208, 208, 208,
11336
208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
11337
208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
11338
208, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11339
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11340
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11341
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11342
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11343
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11344
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11345
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11346
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11347
0, 0, 0, 0,
11348
};
11349
yych = *p;
11350
if (yych <= '&') {
11351
if (yych == '"')
11352
goto yy714;
11353
} else {
11354
if (yych <= '\'')
11355
goto yy715;
11356
if (yych <= '(')
11357
goto yy716;
11358
}
11359
++p;
11360
yy713 : { return 0; }
11361
yy714:
11362
yyaccept = 0;
11363
yych = *(marker = ++p);
11364
if (yych <= 0x00)
11365
goto yy713;
11366
if (yych <= 0x7F)
11367
goto yy718;
11368
if (yych <= 0xC1)
11369
goto yy713;
11370
if (yych <= 0xF4)
11371
goto yy718;
11372
goto yy713;
11373
yy715:
11374
yyaccept = 0;
11375
yych = *(marker = ++p);
11376
if (yych <= 0x00)
11377
goto yy713;
11378
if (yych <= 0x7F)
11379
goto yy732;
11380
if (yych <= 0xC1)
11381
goto yy713;
11382
if (yych <= 0xF4)
11383
goto yy732;
11384
goto yy713;
11385
yy716:
11386
yyaccept = 0;
11387
yych = *(marker = ++p);
11388
if (yych <= 0x00)
11389
goto yy713;
11390
if (yych <= 0x7F)
11391
goto yy745;
11392
if (yych <= 0xC1)
11393
goto yy713;
11394
if (yych <= 0xF4)
11395
goto yy745;
11396
goto yy713;
11397
yy717:
11398
++p;
11399
yych = *p;
11400
yy718:
11401
if (yybm[0 + yych] & 16) {
11402
goto yy717;
11403
}
11404
if (yych <= 0xE0) {
11405
if (yych <= '\\') {
11406
if (yych <= 0x00)
11407
goto yy719;
11408
if (yych <= '"')
11409
goto yy720;
11410
goto yy722;
11411
} else {
11412
if (yych <= 0xC1)
11413
goto yy719;
11414
if (yych <= 0xDF)
11415
goto yy724;
11416
goto yy725;
11417
}
11418
} else {
11419
if (yych <= 0xEF) {
11420
if (yych == 0xED)
11421
goto yy727;
11422
goto yy726;
11423
} else {
11424
if (yych <= 0xF0)
11425
goto yy728;
11426
if (yych <= 0xF3)
11427
goto yy729;
11428
if (yych <= 0xF4)
11429
goto yy730;
11430
}
11431
}
11432
yy719:
11433
p = marker;
11434
if (yyaccept <= 1) {
11435
if (yyaccept == 0) {
11436
goto yy713;
11437
} else {
11438
goto yy721;
11439
}
11440
} else {
11441
if (yyaccept == 2) {
11442
goto yy734;
11443
} else {
11444
goto yy747;
11445
}
11446
}
11447
yy720:
11448
++p;
11449
yy721 : { return (bufsize_t)(p - start); }
11450
yy722:
11451
++p;
11452
yych = *p;
11453
if (yybm[0 + yych] & 16) {
11454
goto yy717;
11455
}
11456
if (yych <= 0xE0) {
11457
if (yych <= '\\') {
11458
if (yych <= 0x00)
11459
goto yy719;
11460
if (yych <= '"')
11461
goto yy757;
11462
goto yy722;
11463
} else {
11464
if (yych <= 0xC1)
11465
goto yy719;
11466
if (yych >= 0xE0)
11467
goto yy725;
11468
}
11469
} else {
11470
if (yych <= 0xEF) {
11471
if (yych == 0xED)
11472
goto yy727;
11473
goto yy726;
11474
} else {
11475
if (yych <= 0xF0)
11476
goto yy728;
11477
if (yych <= 0xF3)
11478
goto yy729;
11479
if (yych <= 0xF4)
11480
goto yy730;
11481
goto yy719;
11482
}
11483
}
11484
yy724:
11485
++p;
11486
yych = *p;
11487
if (yych <= 0x7F)
11488
goto yy719;
11489
if (yych <= 0xBF)
11490
goto yy717;
11491
goto yy719;
11492
yy725:
11493
++p;
11494
yych = *p;
11495
if (yych <= 0x9F)
11496
goto yy719;
11497
if (yych <= 0xBF)
11498
goto yy724;
11499
goto yy719;
11500
yy726:
11501
++p;
11502
yych = *p;
11503
if (yych <= 0x7F)
11504
goto yy719;
11505
if (yych <= 0xBF)
11506
goto yy724;
11507
goto yy719;
11508
yy727:
11509
++p;
11510
yych = *p;
11511
if (yych <= 0x7F)
11512
goto yy719;
11513
if (yych <= 0x9F)
11514
goto yy724;
11515
goto yy719;
11516
yy728:
11517
++p;
11518
yych = *p;
11519
if (yych <= 0x8F)
11520
goto yy719;
11521
if (yych <= 0xBF)
11522
goto yy726;
11523
goto yy719;
11524
yy729:
11525
++p;
11526
yych = *p;
11527
if (yych <= 0x7F)
11528
goto yy719;
11529
if (yych <= 0xBF)
11530
goto yy726;
11531
goto yy719;
11532
yy730:
11533
++p;
11534
yych = *p;
11535
if (yych <= 0x7F)
11536
goto yy719;
11537
if (yych <= 0x8F)
11538
goto yy726;
11539
goto yy719;
11540
yy731:
11541
++p;
11542
yych = *p;
11543
yy732:
11544
if (yybm[0 + yych] & 64) {
11545
goto yy731;
11546
}
11547
if (yych <= 0xE0) {
11548
if (yych <= '\\') {
11549
if (yych <= 0x00)
11550
goto yy719;
11551
if (yych >= '(')
11552
goto yy735;
11553
} else {
11554
if (yych <= 0xC1)
11555
goto yy719;
11556
if (yych <= 0xDF)
11557
goto yy737;
11558
goto yy738;
11559
}
11560
} else {
11561
if (yych <= 0xEF) {
11562
if (yych == 0xED)
11563
goto yy740;
11564
goto yy739;
11565
} else {
11566
if (yych <= 0xF0)
11567
goto yy741;
11568
if (yych <= 0xF3)
11569
goto yy742;
11570
if (yych <= 0xF4)
11571
goto yy743;
11572
goto yy719;
11573
}
11574
}
11575
yy733:
11576
++p;
11577
yy734 : { return (bufsize_t)(p - start); }
11578
yy735:
11579
++p;
11580
yych = *p;
11581
if (yybm[0 + yych] & 64) {
11582
goto yy731;
11583
}
11584
if (yych <= 0xE0) {
11585
if (yych <= '\\') {
11586
if (yych <= 0x00)
11587
goto yy719;
11588
if (yych <= '\'')
11589
goto yy758;
11590
goto yy735;
11591
} else {
11592
if (yych <= 0xC1)
11593
goto yy719;
11594
if (yych >= 0xE0)
11595
goto yy738;
11596
}
11597
} else {
11598
if (yych <= 0xEF) {
11599
if (yych == 0xED)
11600
goto yy740;
11601
goto yy739;
11602
} else {
11603
if (yych <= 0xF0)
11604
goto yy741;
11605
if (yych <= 0xF3)
11606
goto yy742;
11607
if (yych <= 0xF4)
11608
goto yy743;
11609
goto yy719;
11610
}
11611
}
11612
yy737:
11613
++p;
11614
yych = *p;
11615
if (yych <= 0x7F)
11616
goto yy719;
11617
if (yych <= 0xBF)
11618
goto yy731;
11619
goto yy719;
11620
yy738:
11621
++p;
11622
yych = *p;
11623
if (yych <= 0x9F)
11624
goto yy719;
11625
if (yych <= 0xBF)
11626
goto yy737;
11627
goto yy719;
11628
yy739:
11629
++p;
11630
yych = *p;
11631
if (yych <= 0x7F)
11632
goto yy719;
11633
if (yych <= 0xBF)
11634
goto yy737;
11635
goto yy719;
11636
yy740:
11637
++p;
11638
yych = *p;
11639
if (yych <= 0x7F)
11640
goto yy719;
11641
if (yych <= 0x9F)
11642
goto yy737;
11643
goto yy719;
11644
yy741:
11645
++p;
11646
yych = *p;
11647
if (yych <= 0x8F)
11648
goto yy719;
11649
if (yych <= 0xBF)
11650
goto yy739;
11651
goto yy719;
11652
yy742:
11653
++p;
11654
yych = *p;
11655
if (yych <= 0x7F)
11656
goto yy719;
11657
if (yych <= 0xBF)
11658
goto yy739;
11659
goto yy719;
11660
yy743:
11661
++p;
11662
yych = *p;
11663
if (yych <= 0x7F)
11664
goto yy719;
11665
if (yych <= 0x8F)
11666
goto yy739;
11667
goto yy719;
11668
yy744:
11669
++p;
11670
yych = *p;
11671
yy745:
11672
if (yybm[0 + yych] & 128) {
11673
goto yy744;
11674
}
11675
if (yych <= 0xE0) {
11676
if (yych <= '\\') {
11677
if (yych <= 0x00)
11678
goto yy719;
11679
if (yych >= '*')
11680
goto yy748;
11681
} else {
11682
if (yych <= 0xC1)
11683
goto yy719;
11684
if (yych <= 0xDF)
11685
goto yy750;
11686
goto yy751;
11687
}
11688
} else {
11689
if (yych <= 0xEF) {
11690
if (yych == 0xED)
11691
goto yy753;
11692
goto yy752;
11693
} else {
11694
if (yych <= 0xF0)
11695
goto yy754;
11696
if (yych <= 0xF3)
11697
goto yy755;
11698
if (yych <= 0xF4)
11699
goto yy756;
11700
goto yy719;
11701
}
11702
}
11703
yy746:
11704
++p;
11705
yy747 : { return (bufsize_t)(p - start); }
11706
yy748:
11707
++p;
11708
yych = *p;
11709
if (yybm[0 + yych] & 128) {
11710
goto yy744;
11711
}
11712
if (yych <= 0xE0) {
11713
if (yych <= '\\') {
11714
if (yych <= 0x00)
11715
goto yy719;
11716
if (yych <= ')')
11717
goto yy759;
11718
goto yy748;
11719
} else {
11720
if (yych <= 0xC1)
11721
goto yy719;
11722
if (yych >= 0xE0)
11723
goto yy751;
11724
}
11725
} else {
11726
if (yych <= 0xEF) {
11727
if (yych == 0xED)
11728
goto yy753;
11729
goto yy752;
11730
} else {
11731
if (yych <= 0xF0)
11732
goto yy754;
11733
if (yych <= 0xF3)
11734
goto yy755;
11735
if (yych <= 0xF4)
11736
goto yy756;
11737
goto yy719;
11738
}
11739
}
11740
yy750:
11741
++p;
11742
yych = *p;
11743
if (yych <= 0x7F)
11744
goto yy719;
11745
if (yych <= 0xBF)
11746
goto yy744;
11747
goto yy719;
11748
yy751:
11749
++p;
11750
yych = *p;
11751
if (yych <= 0x9F)
11752
goto yy719;
11753
if (yych <= 0xBF)
11754
goto yy750;
11755
goto yy719;
11756
yy752:
11757
++p;
11758
yych = *p;
11759
if (yych <= 0x7F)
11760
goto yy719;
11761
if (yych <= 0xBF)
11762
goto yy750;
11763
goto yy719;
11764
yy753:
11765
++p;
11766
yych = *p;
11767
if (yych <= 0x7F)
11768
goto yy719;
11769
if (yych <= 0x9F)
11770
goto yy750;
11771
goto yy719;
11772
yy754:
11773
++p;
11774
yych = *p;
11775
if (yych <= 0x8F)
11776
goto yy719;
11777
if (yych <= 0xBF)
11778
goto yy752;
11779
goto yy719;
11780
yy755:
11781
++p;
11782
yych = *p;
11783
if (yych <= 0x7F)
11784
goto yy719;
11785
if (yych <= 0xBF)
11786
goto yy752;
11787
goto yy719;
11788
yy756:
11789
++p;
11790
yych = *p;
11791
if (yych <= 0x7F)
11792
goto yy719;
11793
if (yych <= 0x8F)
11794
goto yy752;
11795
goto yy719;
11796
yy757:
11797
yyaccept = 1;
11798
marker = ++p;
11799
yych = *p;
11800
if (yybm[0 + yych] & 16) {
11801
goto yy717;
11802
}
11803
if (yych <= 0xE0) {
11804
if (yych <= '\\') {
11805
if (yych <= 0x00)
11806
goto yy721;
11807
if (yych <= '"')
11808
goto yy720;
11809
goto yy722;
11810
} else {
11811
if (yych <= 0xC1)
11812
goto yy721;
11813
if (yych <= 0xDF)
11814
goto yy724;
11815
goto yy725;
11816
}
11817
} else {
11818
if (yych <= 0xEF) {
11819
if (yych == 0xED)
11820
goto yy727;
11821
goto yy726;
11822
} else {
11823
if (yych <= 0xF0)
11824
goto yy728;
11825
if (yych <= 0xF3)
11826
goto yy729;
11827
if (yych <= 0xF4)
11828
goto yy730;
11829
goto yy721;
11830
}
11831
}
11832
yy758:
11833
yyaccept = 2;
11834
marker = ++p;
11835
yych = *p;
11836
if (yybm[0 + yych] & 64) {
11837
goto yy731;
11838
}
11839
if (yych <= 0xE0) {
11840
if (yych <= '\\') {
11841
if (yych <= 0x00)
11842
goto yy734;
11843
if (yych <= '\'')
11844
goto yy733;
11845
goto yy735;
11846
} else {
11847
if (yych <= 0xC1)
11848
goto yy734;
11849
if (yych <= 0xDF)
11850
goto yy737;
11851
goto yy738;
11852
}
11853
} else {
11854
if (yych <= 0xEF) {
11855
if (yych == 0xED)
11856
goto yy740;
11857
goto yy739;
11858
} else {
11859
if (yych <= 0xF0)
11860
goto yy741;
11861
if (yych <= 0xF3)
11862
goto yy742;
11863
if (yych <= 0xF4)
11864
goto yy743;
11865
goto yy734;
11866
}
11867
}
11868
yy759:
11869
yyaccept = 3;
11870
marker = ++p;
11871
yych = *p;
11872
if (yybm[0 + yych] & 128) {
11873
goto yy744;
11874
}
11875
if (yych <= 0xE0) {
11876
if (yych <= '\\') {
11877
if (yych <= 0x00)
11878
goto yy747;
11879
if (yych <= ')')
11880
goto yy746;
11881
goto yy748;
11882
} else {
11883
if (yych <= 0xC1)
11884
goto yy747;
11885
if (yych <= 0xDF)
11886
goto yy750;
11887
goto yy751;
11888
}
11889
} else {
11890
if (yych <= 0xEF) {
11891
if (yych == 0xED)
11892
goto yy753;
11893
goto yy752;
11894
} else {
11895
if (yych <= 0xF0)
11896
goto yy754;
11897
if (yych <= 0xF3)
11898
goto yy755;
11899
if (yych <= 0xF4)
11900
goto yy756;
11901
goto yy747;
11902
}
11903
}
11904
}
11905
}
11906
11907
// Match space characters, including newlines.
11908
bufsize_t _scan_spacechars(const unsigned char *p) {
11909
const unsigned char *start = p;
11910
11911
{
11912
unsigned char yych;
11913
static const unsigned char yybm[] = {
11914
0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0,
11915
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0,
11916
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11917
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11918
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11919
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11920
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11921
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11922
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11923
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11924
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11925
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11926
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11927
};
11928
yych = *p;
11929
if (yybm[0 + yych] & 128) {
11930
goto yy764;
11931
}
11932
++p;
11933
{ return 0; }
11934
yy764:
11935
++p;
11936
yych = *p;
11937
if (yybm[0 + yych] & 128) {
11938
goto yy764;
11939
}
11940
{ return (bufsize_t)(p - start); }
11941
}
11942
}
11943
11944
// Match ATX heading start.
11945
bufsize_t _scan_atx_heading_start(const unsigned char *p) {
11946
const unsigned char *marker = NULL;
11947
const unsigned char *start = p;
11948
11949
{
11950
unsigned char yych;
11951
static const unsigned char yybm[] = {
11952
0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11953
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11954
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11955
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11956
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11957
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11958
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11959
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11960
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11961
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11962
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11963
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11964
};
11965
yych = *p;
11966
if (yych == '#')
11967
goto yy771;
11968
++p;
11969
yy770 : { return 0; }
11970
yy771:
11971
yych = *(marker = ++p);
11972
if (yybm[0 + yych] & 128) {
11973
goto yy772;
11974
}
11975
if (yych <= '\f') {
11976
if (yych <= 0x08)
11977
goto yy770;
11978
if (yych <= '\n')
11979
goto yy775;
11980
goto yy770;
11981
} else {
11982
if (yych <= '\r')
11983
goto yy775;
11984
if (yych == '#')
11985
goto yy776;
11986
goto yy770;
11987
}
11988
yy772:
11989
++p;
11990
yych = *p;
11991
if (yybm[0 + yych] & 128) {
11992
goto yy772;
11993
}
11994
yy774 : { return (bufsize_t)(p - start); }
11995
yy775:
11996
yych = *++p;
11997
goto yy774;
11998
yy776:
11999
yych = *++p;
12000
if (yybm[0 + yych] & 128) {
12001
goto yy772;
12002
}
12003
if (yych <= '\f') {
12004
if (yych <= 0x08)
12005
goto yy777;
12006
if (yych <= '\n')
12007
goto yy775;
12008
} else {
12009
if (yych <= '\r')
12010
goto yy775;
12011
if (yych == '#')
12012
goto yy778;
12013
}
12014
yy777:
12015
p = marker;
12016
goto yy770;
12017
yy778:
12018
yych = *++p;
12019
if (yybm[0 + yych] & 128) {
12020
goto yy772;
12021
}
12022
if (yych <= '\f') {
12023
if (yych <= 0x08)
12024
goto yy777;
12025
if (yych <= '\n')
12026
goto yy775;
12027
goto yy777;
12028
} else {
12029
if (yych <= '\r')
12030
goto yy775;
12031
if (yych != '#')
12032
goto yy777;
12033
}
12034
yych = *++p;
12035
if (yybm[0 + yych] & 128) {
12036
goto yy772;
12037
}
12038
if (yych <= '\f') {
12039
if (yych <= 0x08)
12040
goto yy777;
12041
if (yych <= '\n')
12042
goto yy775;
12043
goto yy777;
12044
} else {
12045
if (yych <= '\r')
12046
goto yy775;
12047
if (yych != '#')
12048
goto yy777;
12049
}
12050
yych = *++p;
12051
if (yybm[0 + yych] & 128) {
12052
goto yy772;
12053
}
12054
if (yych <= '\f') {
12055
if (yych <= 0x08)
12056
goto yy777;
12057
if (yych <= '\n')
12058
goto yy775;
12059
goto yy777;
12060
} else {
12061
if (yych <= '\r')
12062
goto yy775;
12063
if (yych != '#')
12064
goto yy777;
12065
}
12066
++p;
12067
if (yybm[0 + (yych = *p)] & 128) {
12068
goto yy772;
12069
}
12070
if (yych <= 0x08)
12071
goto yy777;
12072
if (yych <= '\n')
12073
goto yy775;
12074
if (yych == '\r')
12075
goto yy775;
12076
goto yy777;
12077
}
12078
}
12079
12080
// Match setext heading line. Return 1 for level-1 heading,
12081
// 2 for level-2, 0 for no match.
12082
bufsize_t _scan_setext_heading_line(const unsigned char *p) {
12083
const unsigned char *marker = NULL;
12084
12085
{
12086
unsigned char yych;
12087
static const unsigned char yybm[] = {
12088
0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12089
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12090
0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0,
12091
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12092
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12093
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12094
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12095
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12096
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12097
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12098
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12099
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12100
};
12101
yych = *p;
12102
if (yych == '-')
12103
goto yy786;
12104
if (yych == '=')
12105
goto yy787;
12106
++p;
12107
yy785 : { return 0; }
12108
yy786:
12109
yych = *(marker = ++p);
12110
if (yybm[0 + yych] & 64) {
12111
goto yy793;
12112
}
12113
if (yych <= '\f') {
12114
if (yych <= 0x08)
12115
goto yy785;
12116
if (yych <= '\n')
12117
goto yy789;
12118
goto yy785;
12119
} else {
12120
if (yych <= '\r')
12121
goto yy789;
12122
if (yych == ' ')
12123
goto yy789;
12124
goto yy785;
12125
}
12126
yy787:
12127
yych = *(marker = ++p);
12128
if (yybm[0 + yych] & 128) {
12129
goto yy799;
12130
}
12131
if (yych <= '\f') {
12132
if (yych <= 0x08)
12133
goto yy785;
12134
if (yych <= '\n')
12135
goto yy796;
12136
goto yy785;
12137
} else {
12138
if (yych <= '\r')
12139
goto yy796;
12140
if (yych == ' ')
12141
goto yy796;
12142
goto yy785;
12143
}
12144
yy788:
12145
++p;
12146
yych = *p;
12147
yy789:
12148
if (yybm[0 + yych] & 32) {
12149
goto yy788;
12150
}
12151
if (yych <= 0x08)
12152
goto yy790;
12153
if (yych <= '\n')
12154
goto yy791;
12155
if (yych == '\r')
12156
goto yy791;
12157
yy790:
12158
p = marker;
12159
goto yy785;
12160
yy791:
12161
++p;
12162
{ return 2; }
12163
yy793:
12164
++p;
12165
yych = *p;
12166
if (yybm[0 + yych] & 32) {
12167
goto yy788;
12168
}
12169
if (yych <= '\f') {
12170
if (yych <= 0x08)
12171
goto yy790;
12172
if (yych <= '\n')
12173
goto yy791;
12174
goto yy790;
12175
} else {
12176
if (yych <= '\r')
12177
goto yy791;
12178
if (yych == '-')
12179
goto yy793;
12180
goto yy790;
12181
}
12182
yy795:
12183
++p;
12184
yych = *p;
12185
yy796:
12186
if (yych <= '\f') {
12187
if (yych <= 0x08)
12188
goto yy790;
12189
if (yych <= '\t')
12190
goto yy795;
12191
if (yych >= '\v')
12192
goto yy790;
12193
} else {
12194
if (yych <= '\r')
12195
goto yy797;
12196
if (yych == ' ')
12197
goto yy795;
12198
goto yy790;
12199
}
12200
yy797:
12201
++p;
12202
{ return 1; }
12203
yy799:
12204
++p;
12205
yych = *p;
12206
if (yybm[0 + yych] & 128) {
12207
goto yy799;
12208
}
12209
if (yych <= '\f') {
12210
if (yych <= 0x08)
12211
goto yy790;
12212
if (yych <= '\t')
12213
goto yy795;
12214
if (yych <= '\n')
12215
goto yy797;
12216
goto yy790;
12217
} else {
12218
if (yych <= '\r')
12219
goto yy797;
12220
if (yych == ' ')
12221
goto yy795;
12222
goto yy790;
12223
}
12224
}
12225
}
12226
12227
// Scan a thematic break line: "...three or more hyphens, asterisks,
12228
// or underscores on a line by themselves. If you wish, you may use
12229
// spaces between the hyphens or asterisks."
12230
bufsize_t _scan_thematic_break(const unsigned char *p) {
12231
const unsigned char *marker = NULL;
12232
const unsigned char *start = p;
12233
12234
{
12235
unsigned char yych;
12236
static const unsigned char yybm[] = {
12237
0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12238
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0,
12239
0, 0, 32, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12240
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12241
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0,
12242
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12243
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12244
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12245
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12246
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12247
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12248
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12249
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12250
};
12251
yych = *p;
12252
if (yych <= ',') {
12253
if (yych == '*')
12254
goto yy805;
12255
} else {
12256
if (yych <= '-')
12257
goto yy806;
12258
if (yych == '_')
12259
goto yy807;
12260
}
12261
++p;
12262
yy804 : { return 0; }
12263
yy805:
12264
yych = *(marker = ++p);
12265
if (yybm[0 + yych] & 16) {
12266
goto yy808;
12267
}
12268
if (yych == '*')
12269
goto yy811;
12270
goto yy804;
12271
yy806:
12272
yych = *(marker = ++p);
12273
if (yych <= 0x1F) {
12274
if (yych == '\t')
12275
goto yy813;
12276
goto yy804;
12277
} else {
12278
if (yych <= ' ')
12279
goto yy813;
12280
if (yych == '-')
12281
goto yy815;
12282
goto yy804;
12283
}
12284
yy807:
12285
yych = *(marker = ++p);
12286
if (yych <= 0x1F) {
12287
if (yych == '\t')
12288
goto yy817;
12289
goto yy804;
12290
} else {
12291
if (yych <= ' ')
12292
goto yy817;
12293
if (yych == '_')
12294
goto yy819;
12295
goto yy804;
12296
}
12297
yy808:
12298
++p;
12299
yych = *p;
12300
if (yybm[0 + yych] & 16) {
12301
goto yy808;
12302
}
12303
if (yych == '*')
12304
goto yy811;
12305
yy810:
12306
p = marker;
12307
goto yy804;
12308
yy811:
12309
++p;
12310
yych = *p;
12311
if (yych <= 0x1F) {
12312
if (yych == '\t')
12313
goto yy811;
12314
goto yy810;
12315
} else {
12316
if (yych <= ' ')
12317
goto yy811;
12318
if (yych == '*')
12319
goto yy821;
12320
goto yy810;
12321
}
12322
yy813:
12323
++p;
12324
yych = *p;
12325
if (yych <= 0x1F) {
12326
if (yych == '\t')
12327
goto yy813;
12328
goto yy810;
12329
} else {
12330
if (yych <= ' ')
12331
goto yy813;
12332
if (yych != '-')
12333
goto yy810;
12334
}
12335
yy815:
12336
++p;
12337
yych = *p;
12338
if (yych <= 0x1F) {
12339
if (yych == '\t')
12340
goto yy815;
12341
goto yy810;
12342
} else {
12343
if (yych <= ' ')
12344
goto yy815;
12345
if (yych == '-')
12346
goto yy823;
12347
goto yy810;
12348
}
12349
yy817:
12350
++p;
12351
yych = *p;
12352
if (yych <= 0x1F) {
12353
if (yych == '\t')
12354
goto yy817;
12355
goto yy810;
12356
} else {
12357
if (yych <= ' ')
12358
goto yy817;
12359
if (yych != '_')
12360
goto yy810;
12361
}
12362
yy819:
12363
++p;
12364
yych = *p;
12365
if (yych <= 0x1F) {
12366
if (yych == '\t')
12367
goto yy819;
12368
goto yy810;
12369
} else {
12370
if (yych <= ' ')
12371
goto yy819;
12372
if (yych == '_')
12373
goto yy825;
12374
goto yy810;
12375
}
12376
yy821:
12377
++p;
12378
yych = *p;
12379
if (yybm[0 + yych] & 32) {
12380
goto yy821;
12381
}
12382
if (yych <= 0x08)
12383
goto yy810;
12384
if (yych <= '\n')
12385
goto yy827;
12386
if (yych == '\r')
12387
goto yy827;
12388
goto yy810;
12389
yy823:
12390
++p;
12391
yych = *p;
12392
if (yybm[0 + yych] & 64) {
12393
goto yy823;
12394
}
12395
if (yych <= 0x08)
12396
goto yy810;
12397
if (yych <= '\n')
12398
goto yy829;
12399
if (yych == '\r')
12400
goto yy829;
12401
goto yy810;
12402
yy825:
12403
++p;
12404
yych = *p;
12405
if (yybm[0 + yych] & 128) {
12406
goto yy825;
12407
}
12408
if (yych <= 0x08)
12409
goto yy810;
12410
if (yych <= '\n')
12411
goto yy831;
12412
if (yych == '\r')
12413
goto yy831;
12414
goto yy810;
12415
yy827:
12416
++p;
12417
{ return (bufsize_t)(p - start); }
12418
yy829:
12419
++p;
12420
{ return (bufsize_t)(p - start); }
12421
yy831:
12422
++p;
12423
{ return (bufsize_t)(p - start); }
12424
}
12425
}
12426
12427
// Scan an opening code fence.
12428
bufsize_t _scan_open_code_fence(const unsigned char *p) {
12429
const unsigned char *marker = NULL;
12430
const unsigned char *start = p;
12431
12432
{
12433
unsigned char yych;
12434
static const unsigned char yybm[] = {
12435
0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, 192, 192, 0,
12436
192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
12437
192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
12438
192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
12439
192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
12440
192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
12441
192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 144, 192,
12442
192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
12443
192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
12444
96, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12445
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12446
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12447
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12448
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12449
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12450
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12451
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12452
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12453
0, 0, 0, 0,
12454
};
12455
yych = *p;
12456
if (yych == '`')
12457
goto yy837;
12458
if (yych == '~')
12459
goto yy838;
12460
++p;
12461
yy836 : { return 0; }
12462
yy837:
12463
yych = *(marker = ++p);
12464
if (yych == '`')
12465
goto yy839;
12466
goto yy836;
12467
yy838:
12468
yych = *(marker = ++p);
12469
if (yych == '~')
12470
goto yy841;
12471
goto yy836;
12472
yy839:
12473
yych = *++p;
12474
if (yybm[0 + yych] & 16) {
12475
goto yy842;
12476
}
12477
yy840:
12478
p = marker;
12479
goto yy836;
12480
yy841:
12481
yych = *++p;
12482
if (yybm[0 + yych] & 32) {
12483
goto yy844;
12484
}
12485
goto yy840;
12486
yy842:
12487
++p;
12488
yych = *p;
12489
marker = p;
12490
if (yybm[0 + yych] & 64) {
12491
goto yy846;
12492
}
12493
if (yych <= 0xE0) {
12494
if (yych <= '`') {
12495
if (yych <= 0x00)
12496
goto yy840;
12497
if (yych <= '\r')
12498
goto yy848;
12499
goto yy842;
12500
} else {
12501
if (yych <= 0xC1)
12502
goto yy840;
12503
if (yych <= 0xDF)
12504
goto yy850;
12505
goto yy851;
12506
}
12507
} else {
12508
if (yych <= 0xEF) {
12509
if (yych == 0xED)
12510
goto yy853;
12511
goto yy852;
12512
} else {
12513
if (yych <= 0xF0)
12514
goto yy854;
12515
if (yych <= 0xF3)
12516
goto yy855;
12517
if (yych <= 0xF4)
12518
goto yy856;
12519
goto yy840;
12520
}
12521
}
12522
yy844:
12523
++p;
12524
yych = *p;
12525
marker = p;
12526
if (yybm[0 + yych] & 128) {
12527
goto yy857;
12528
}
12529
if (yych <= 0xE0) {
12530
if (yych <= '~') {
12531
if (yych <= 0x00)
12532
goto yy840;
12533
if (yych <= '\r')
12534
goto yy859;
12535
goto yy844;
12536
} else {
12537
if (yych <= 0xC1)
12538
goto yy840;
12539
if (yych <= 0xDF)
12540
goto yy861;
12541
goto yy862;
12542
}
12543
} else {
12544
if (yych <= 0xEF) {
12545
if (yych == 0xED)
12546
goto yy864;
12547
goto yy863;
12548
} else {
12549
if (yych <= 0xF0)
12550
goto yy865;
12551
if (yych <= 0xF3)
12552
goto yy866;
12553
if (yych <= 0xF4)
12554
goto yy867;
12555
goto yy840;
12556
}
12557
}
12558
yy846:
12559
++p;
12560
yych = *p;
12561
if (yybm[0 + yych] & 64) {
12562
goto yy846;
12563
}
12564
if (yych <= 0xEC) {
12565
if (yych <= 0xC1) {
12566
if (yych <= 0x00)
12567
goto yy840;
12568
if (yych >= 0x0E)
12569
goto yy840;
12570
} else {
12571
if (yych <= 0xDF)
12572
goto yy850;
12573
if (yych <= 0xE0)
12574
goto yy851;
12575
goto yy852;
12576
}
12577
} else {
12578
if (yych <= 0xF0) {
12579
if (yych <= 0xED)
12580
goto yy853;
12581
if (yych <= 0xEF)
12582
goto yy852;
12583
goto yy854;
12584
} else {
12585
if (yych <= 0xF3)
12586
goto yy855;
12587
if (yych <= 0xF4)
12588
goto yy856;
12589
goto yy840;
12590
}
12591
}
12592
yy848:
12593
++p;
12594
p = marker;
12595
{ return (bufsize_t)(p - start); }
12596
yy850:
12597
++p;
12598
yych = *p;
12599
if (yych <= 0x7F)
12600
goto yy840;
12601
if (yych <= 0xBF)
12602
goto yy846;
12603
goto yy840;
12604
yy851:
12605
++p;
12606
yych = *p;
12607
if (yych <= 0x9F)
12608
goto yy840;
12609
if (yych <= 0xBF)
12610
goto yy850;
12611
goto yy840;
12612
yy852:
12613
++p;
12614
yych = *p;
12615
if (yych <= 0x7F)
12616
goto yy840;
12617
if (yych <= 0xBF)
12618
goto yy850;
12619
goto yy840;
12620
yy853:
12621
++p;
12622
yych = *p;
12623
if (yych <= 0x7F)
12624
goto yy840;
12625
if (yych <= 0x9F)
12626
goto yy850;
12627
goto yy840;
12628
yy854:
12629
++p;
12630
yych = *p;
12631
if (yych <= 0x8F)
12632
goto yy840;
12633
if (yych <= 0xBF)
12634
goto yy852;
12635
goto yy840;
12636
yy855:
12637
++p;
12638
yych = *p;
12639
if (yych <= 0x7F)
12640
goto yy840;
12641
if (yych <= 0xBF)
12642
goto yy852;
12643
goto yy840;
12644
yy856:
12645
++p;
12646
yych = *p;
12647
if (yych <= 0x7F)
12648
goto yy840;
12649
if (yych <= 0x8F)
12650
goto yy852;
12651
goto yy840;
12652
yy857:
12653
++p;
12654
yych = *p;
12655
if (yybm[0 + yych] & 128) {
12656
goto yy857;
12657
}
12658
if (yych <= 0xEC) {
12659
if (yych <= 0xC1) {
12660
if (yych <= 0x00)
12661
goto yy840;
12662
if (yych >= 0x0E)
12663
goto yy840;
12664
} else {
12665
if (yych <= 0xDF)
12666
goto yy861;
12667
if (yych <= 0xE0)
12668
goto yy862;
12669
goto yy863;
12670
}
12671
} else {
12672
if (yych <= 0xF0) {
12673
if (yych <= 0xED)
12674
goto yy864;
12675
if (yych <= 0xEF)
12676
goto yy863;
12677
goto yy865;
12678
} else {
12679
if (yych <= 0xF3)
12680
goto yy866;
12681
if (yych <= 0xF4)
12682
goto yy867;
12683
goto yy840;
12684
}
12685
}
12686
yy859:
12687
++p;
12688
p = marker;
12689
{ return (bufsize_t)(p - start); }
12690
yy861:
12691
++p;
12692
yych = *p;
12693
if (yych <= 0x7F)
12694
goto yy840;
12695
if (yych <= 0xBF)
12696
goto yy857;
12697
goto yy840;
12698
yy862:
12699
++p;
12700
yych = *p;
12701
if (yych <= 0x9F)
12702
goto yy840;
12703
if (yych <= 0xBF)
12704
goto yy861;
12705
goto yy840;
12706
yy863:
12707
++p;
12708
yych = *p;
12709
if (yych <= 0x7F)
12710
goto yy840;
12711
if (yych <= 0xBF)
12712
goto yy861;
12713
goto yy840;
12714
yy864:
12715
++p;
12716
yych = *p;
12717
if (yych <= 0x7F)
12718
goto yy840;
12719
if (yych <= 0x9F)
12720
goto yy861;
12721
goto yy840;
12722
yy865:
12723
++p;
12724
yych = *p;
12725
if (yych <= 0x8F)
12726
goto yy840;
12727
if (yych <= 0xBF)
12728
goto yy863;
12729
goto yy840;
12730
yy866:
12731
++p;
12732
yych = *p;
12733
if (yych <= 0x7F)
12734
goto yy840;
12735
if (yych <= 0xBF)
12736
goto yy863;
12737
goto yy840;
12738
yy867:
12739
++p;
12740
yych = *p;
12741
if (yych <= 0x7F)
12742
goto yy840;
12743
if (yych <= 0x8F)
12744
goto yy863;
12745
goto yy840;
12746
}
12747
}
12748
12749
// Scan a closing code fence with length at least len.
12750
bufsize_t _scan_close_code_fence(const unsigned char *p) {
12751
const unsigned char *marker = NULL;
12752
const unsigned char *start = p;
12753
12754
{
12755
unsigned char yych;
12756
static const unsigned char yybm[] = {
12757
0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12758
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12759
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12760
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12761
0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12762
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0,
12763
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12764
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12765
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12766
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12767
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12768
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12769
};
12770
yych = *p;
12771
if (yych == '`')
12772
goto yy872;
12773
if (yych == '~')
12774
goto yy873;
12775
++p;
12776
yy871 : { return 0; }
12777
yy872:
12778
yych = *(marker = ++p);
12779
if (yych == '`')
12780
goto yy874;
12781
goto yy871;
12782
yy873:
12783
yych = *(marker = ++p);
12784
if (yych == '~')
12785
goto yy876;
12786
goto yy871;
12787
yy874:
12788
yych = *++p;
12789
if (yybm[0 + yych] & 32) {
12790
goto yy877;
12791
}
12792
yy875:
12793
p = marker;
12794
goto yy871;
12795
yy876:
12796
yych = *++p;
12797
if (yybm[0 + yych] & 64) {
12798
goto yy879;
12799
}
12800
goto yy875;
12801
yy877:
12802
++p;
12803
yych = *p;
12804
marker = p;
12805
if (yybm[0 + yych] & 128) {
12806
goto yy881;
12807
}
12808
if (yych <= '\f') {
12809
if (yych <= 0x08)
12810
goto yy875;
12811
if (yych <= '\n')
12812
goto yy883;
12813
goto yy875;
12814
} else {
12815
if (yych <= '\r')
12816
goto yy883;
12817
if (yych == '`')
12818
goto yy877;
12819
goto yy875;
12820
}
12821
yy879:
12822
++p;
12823
yych = *p;
12824
marker = p;
12825
if (yybm[0 + yych] & 64) {
12826
goto yy879;
12827
}
12828
if (yych <= '\f') {
12829
if (yych <= 0x08)
12830
goto yy875;
12831
if (yych <= '\t')
12832
goto yy885;
12833
if (yych <= '\n')
12834
goto yy887;
12835
goto yy875;
12836
} else {
12837
if (yych <= '\r')
12838
goto yy887;
12839
if (yych == ' ')
12840
goto yy885;
12841
goto yy875;
12842
}
12843
yy881:
12844
++p;
12845
yych = *p;
12846
if (yybm[0 + yych] & 128) {
12847
goto yy881;
12848
}
12849
if (yych <= 0x08)
12850
goto yy875;
12851
if (yych <= '\n')
12852
goto yy883;
12853
if (yych != '\r')
12854
goto yy875;
12855
yy883:
12856
++p;
12857
p = marker;
12858
{ return (bufsize_t)(p - start); }
12859
yy885:
12860
++p;
12861
yych = *p;
12862
if (yych <= '\f') {
12863
if (yych <= 0x08)
12864
goto yy875;
12865
if (yych <= '\t')
12866
goto yy885;
12867
if (yych >= '\v')
12868
goto yy875;
12869
} else {
12870
if (yych <= '\r')
12871
goto yy887;
12872
if (yych == ' ')
12873
goto yy885;
12874
goto yy875;
12875
}
12876
yy887:
12877
++p;
12878
p = marker;
12879
{ return (bufsize_t)(p - start); }
12880
}
12881
}
12882
12883
// Scans an entity.
12884
// Returns number of chars matched.
12885
bufsize_t _scan_entity(const unsigned char *p) {
12886
const unsigned char *marker = NULL;
12887
const unsigned char *start = p;
12888
12889
{
12890
unsigned char yych;
12891
yych = *p;
12892
if (yych == '&')
12893
goto yy893;
12894
++p;
12895
yy892 : { return 0; }
12896
yy893:
12897
yych = *(marker = ++p);
12898
if (yych <= '@') {
12899
if (yych != '#')
12900
goto yy892;
12901
} else {
12902
if (yych <= 'Z')
12903
goto yy896;
12904
if (yych <= '`')
12905
goto yy892;
12906
if (yych <= 'z')
12907
goto yy896;
12908
goto yy892;
12909
}
12910
yych = *++p;
12911
if (yych <= 'W') {
12912
if (yych <= '/')
12913
goto yy895;
12914
if (yych <= '9')
12915
goto yy897;
12916
} else {
12917
if (yych <= 'X')
12918
goto yy898;
12919
if (yych == 'x')
12920
goto yy898;
12921
}
12922
yy895:
12923
p = marker;
12924
goto yy892;
12925
yy896:
12926
yych = *++p;
12927
if (yych <= '@') {
12928
if (yych <= '/')
12929
goto yy895;
12930
if (yych <= '9')
12931
goto yy899;
12932
goto yy895;
12933
} else {
12934
if (yych <= 'Z')
12935
goto yy899;
12936
if (yych <= '`')
12937
goto yy895;
12938
if (yych <= 'z')
12939
goto yy899;
12940
goto yy895;
12941
}
12942
yy897:
12943
yych = *++p;
12944
if (yych <= '/')
12945
goto yy895;
12946
if (yych <= '9')
12947
goto yy900;
12948
if (yych == ';')
12949
goto yy901;
12950
goto yy895;
12951
yy898:
12952
yych = *++p;
12953
if (yych <= '@') {
12954
if (yych <= '/')
12955
goto yy895;
12956
if (yych <= '9')
12957
goto yy903;
12958
goto yy895;
12959
} else {
12960
if (yych <= 'F')
12961
goto yy903;
12962
if (yych <= '`')
12963
goto yy895;
12964
if (yych <= 'f')
12965
goto yy903;
12966
goto yy895;
12967
}
12968
yy899:
12969
yych = *++p;
12970
if (yych <= ';') {
12971
if (yych <= '/')
12972
goto yy895;
12973
if (yych <= '9')
12974
goto yy904;
12975
if (yych <= ':')
12976
goto yy895;
12977
goto yy901;
12978
} else {
12979
if (yych <= 'Z') {
12980
if (yych <= '@')
12981
goto yy895;
12982
goto yy904;
12983
} else {
12984
if (yych <= '`')
12985
goto yy895;
12986
if (yych <= 'z')
12987
goto yy904;
12988
goto yy895;
12989
}
12990
}
12991
yy900:
12992
yych = *++p;
12993
if (yych <= '/')
12994
goto yy895;
12995
if (yych <= '9')
12996
goto yy905;
12997
if (yych != ';')
12998
goto yy895;
12999
yy901:
13000
++p;
13001
{ return (bufsize_t)(p - start); }
13002
yy903:
13003
yych = *++p;
13004
if (yych <= ';') {
13005
if (yych <= '/')
13006
goto yy895;
13007
if (yych <= '9')
13008
goto yy906;
13009
if (yych <= ':')
13010
goto yy895;
13011
goto yy901;
13012
} else {
13013
if (yych <= 'F') {
13014
if (yych <= '@')
13015
goto yy895;
13016
goto yy906;
13017
} else {
13018
if (yych <= '`')
13019
goto yy895;
13020
if (yych <= 'f')
13021
goto yy906;
13022
goto yy895;
13023
}
13024
}
13025
yy904:
13026
yych = *++p;
13027
if (yych <= ';') {
13028
if (yych <= '/')
13029
goto yy895;
13030
if (yych <= '9')
13031
goto yy907;
13032
if (yych <= ':')
13033
goto yy895;
13034
goto yy901;
13035
} else {
13036
if (yych <= 'Z') {
13037
if (yych <= '@')
13038
goto yy895;
13039
goto yy907;
13040
} else {
13041
if (yych <= '`')
13042
goto yy895;
13043
if (yych <= 'z')
13044
goto yy907;
13045
goto yy895;
13046
}
13047
}
13048
yy905:
13049
yych = *++p;
13050
if (yych <= '/')
13051
goto yy895;
13052
if (yych <= '9')
13053
goto yy908;
13054
if (yych == ';')
13055
goto yy901;
13056
goto yy895;
13057
yy906:
13058
yych = *++p;
13059
if (yych <= ';') {
13060
if (yych <= '/')
13061
goto yy895;
13062
if (yych <= '9')
13063
goto yy909;
13064
if (yych <= ':')
13065
goto yy895;
13066
goto yy901;
13067
} else {
13068
if (yych <= 'F') {
13069
if (yych <= '@')
13070
goto yy895;
13071
goto yy909;
13072
} else {
13073
if (yych <= '`')
13074
goto yy895;
13075
if (yych <= 'f')
13076
goto yy909;
13077
goto yy895;
13078
}
13079
}
13080
yy907:
13081
yych = *++p;
13082
if (yych <= ';') {
13083
if (yych <= '/')
13084
goto yy895;
13085
if (yych <= '9')
13086
goto yy910;
13087
if (yych <= ':')
13088
goto yy895;
13089
goto yy901;
13090
} else {
13091
if (yych <= 'Z') {
13092
if (yych <= '@')
13093
goto yy895;
13094
goto yy910;
13095
} else {
13096
if (yych <= '`')
13097
goto yy895;
13098
if (yych <= 'z')
13099
goto yy910;
13100
goto yy895;
13101
}
13102
}
13103
yy908:
13104
yych = *++p;
13105
if (yych <= '/')
13106
goto yy895;
13107
if (yych <= '9')
13108
goto yy911;
13109
if (yych == ';')
13110
goto yy901;
13111
goto yy895;
13112
yy909:
13113
yych = *++p;
13114
if (yych <= ';') {
13115
if (yych <= '/')
13116
goto yy895;
13117
if (yych <= '9')
13118
goto yy912;
13119
if (yych <= ':')
13120
goto yy895;
13121
goto yy901;
13122
} else {
13123
if (yych <= 'F') {
13124
if (yych <= '@')
13125
goto yy895;
13126
goto yy912;
13127
} else {
13128
if (yych <= '`')
13129
goto yy895;
13130
if (yych <= 'f')
13131
goto yy912;
13132
goto yy895;
13133
}
13134
}
13135
yy910:
13136
yych = *++p;
13137
if (yych <= ';') {
13138
if (yych <= '/')
13139
goto yy895;
13140
if (yych <= '9')
13141
goto yy913;
13142
if (yych <= ':')
13143
goto yy895;
13144
goto yy901;
13145
} else {
13146
if (yych <= 'Z') {
13147
if (yych <= '@')
13148
goto yy895;
13149
goto yy913;
13150
} else {
13151
if (yych <= '`')
13152
goto yy895;
13153
if (yych <= 'z')
13154
goto yy913;
13155
goto yy895;
13156
}
13157
}
13158
yy911:
13159
yych = *++p;
13160
if (yych <= '/')
13161
goto yy895;
13162
if (yych <= '9')
13163
goto yy914;
13164
if (yych == ';')
13165
goto yy901;
13166
goto yy895;
13167
yy912:
13168
yych = *++p;
13169
if (yych <= ';') {
13170
if (yych <= '/')
13171
goto yy895;
13172
if (yych <= '9')
13173
goto yy915;
13174
if (yych <= ':')
13175
goto yy895;
13176
goto yy901;
13177
} else {
13178
if (yych <= 'F') {
13179
if (yych <= '@')
13180
goto yy895;
13181
goto yy915;
13182
} else {
13183
if (yych <= '`')
13184
goto yy895;
13185
if (yych <= 'f')
13186
goto yy915;
13187
goto yy895;
13188
}
13189
}
13190
yy913:
13191
yych = *++p;
13192
if (yych <= ';') {
13193
if (yych <= '/')
13194
goto yy895;
13195
if (yych <= '9')
13196
goto yy916;
13197
if (yych <= ':')
13198
goto yy895;
13199
goto yy901;
13200
} else {
13201
if (yych <= 'Z') {
13202
if (yych <= '@')
13203
goto yy895;
13204
goto yy916;
13205
} else {
13206
if (yych <= '`')
13207
goto yy895;
13208
if (yych <= 'z')
13209
goto yy916;
13210
goto yy895;
13211
}
13212
}
13213
yy914:
13214
yych = *++p;
13215
if (yych <= '/')
13216
goto yy895;
13217
if (yych <= '9')
13218
goto yy917;
13219
if (yych == ';')
13220
goto yy901;
13221
goto yy895;
13222
yy915:
13223
yych = *++p;
13224
if (yych <= ';') {
13225
if (yych <= '/')
13226
goto yy895;
13227
if (yych <= '9')
13228
goto yy918;
13229
if (yych <= ':')
13230
goto yy895;
13231
goto yy901;
13232
} else {
13233
if (yych <= 'F') {
13234
if (yych <= '@')
13235
goto yy895;
13236
goto yy918;
13237
} else {
13238
if (yych <= '`')
13239
goto yy895;
13240
if (yych <= 'f')
13241
goto yy918;
13242
goto yy895;
13243
}
13244
}
13245
yy916:
13246
yych = *++p;
13247
if (yych <= ';') {
13248
if (yych <= '/')
13249
goto yy895;
13250
if (yych <= '9')
13251
goto yy919;
13252
if (yych <= ':')
13253
goto yy895;
13254
goto yy901;
13255
} else {
13256
if (yych <= 'Z') {
13257
if (yych <= '@')
13258
goto yy895;
13259
goto yy919;
13260
} else {
13261
if (yych <= '`')
13262
goto yy895;
13263
if (yych <= 'z')
13264
goto yy919;
13265
goto yy895;
13266
}
13267
}
13268
yy917:
13269
yych = *++p;
13270
if (yych <= '/')
13271
goto yy895;
13272
if (yych <= '9')
13273
goto yy920;
13274
if (yych == ';')
13275
goto yy901;
13276
goto yy895;
13277
yy918:
13278
yych = *++p;
13279
if (yych <= ';') {
13280
if (yych <= '/')
13281
goto yy895;
13282
if (yych <= '9')
13283
goto yy921;
13284
if (yych <= ':')
13285
goto yy895;
13286
goto yy901;
13287
} else {
13288
if (yych <= 'F') {
13289
if (yych <= '@')
13290
goto yy895;
13291
goto yy921;
13292
} else {
13293
if (yych <= '`')
13294
goto yy895;
13295
if (yych <= 'f')
13296
goto yy921;
13297
goto yy895;
13298
}
13299
}
13300
yy919:
13301
yych = *++p;
13302
if (yych <= ';') {
13303
if (yych <= '/')
13304
goto yy895;
13305
if (yych <= '9')
13306
goto yy922;
13307
if (yych <= ':')
13308
goto yy895;
13309
goto yy901;
13310
} else {
13311
if (yych <= 'Z') {
13312
if (yych <= '@')
13313
goto yy895;
13314
goto yy922;
13315
} else {
13316
if (yych <= '`')
13317
goto yy895;
13318
if (yych <= 'z')
13319
goto yy922;
13320
goto yy895;
13321
}
13322
}
13323
yy920:
13324
yych = *++p;
13325
if (yych == ';')
13326
goto yy901;
13327
goto yy895;
13328
yy921:
13329
yych = *++p;
13330
if (yych <= ';') {
13331
if (yych <= '/')
13332
goto yy895;
13333
if (yych <= '9')
13334
goto yy920;
13335
if (yych <= ':')
13336
goto yy895;
13337
goto yy901;
13338
} else {
13339
if (yych <= 'F') {
13340
if (yych <= '@')
13341
goto yy895;
13342
goto yy920;
13343
} else {
13344
if (yych <= '`')
13345
goto yy895;
13346
if (yych <= 'f')
13347
goto yy920;
13348
goto yy895;
13349
}
13350
}
13351
yy922:
13352
yych = *++p;
13353
if (yych <= ';') {
13354
if (yych <= '/')
13355
goto yy895;
13356
if (yych <= '9')
13357
goto yy923;
13358
if (yych <= ':')
13359
goto yy895;
13360
goto yy901;
13361
} else {
13362
if (yych <= 'Z') {
13363
if (yych <= '@')
13364
goto yy895;
13365
} else {
13366
if (yych <= '`')
13367
goto yy895;
13368
if (yych >= '{')
13369
goto yy895;
13370
}
13371
}
13372
yy923:
13373
yych = *++p;
13374
if (yych <= ';') {
13375
if (yych <= '/')
13376
goto yy895;
13377
if (yych <= '9')
13378
goto yy924;
13379
if (yych <= ':')
13380
goto yy895;
13381
goto yy901;
13382
} else {
13383
if (yych <= 'Z') {
13384
if (yych <= '@')
13385
goto yy895;
13386
} else {
13387
if (yych <= '`')
13388
goto yy895;
13389
if (yych >= '{')
13390
goto yy895;
13391
}
13392
}
13393
yy924:
13394
yych = *++p;
13395
if (yych <= ';') {
13396
if (yych <= '/')
13397
goto yy895;
13398
if (yych <= '9')
13399
goto yy925;
13400
if (yych <= ':')
13401
goto yy895;
13402
goto yy901;
13403
} else {
13404
if (yych <= 'Z') {
13405
if (yych <= '@')
13406
goto yy895;
13407
} else {
13408
if (yych <= '`')
13409
goto yy895;
13410
if (yych >= '{')
13411
goto yy895;
13412
}
13413
}
13414
yy925:
13415
yych = *++p;
13416
if (yych <= ';') {
13417
if (yych <= '/')
13418
goto yy895;
13419
if (yych <= '9')
13420
goto yy926;
13421
if (yych <= ':')
13422
goto yy895;
13423
goto yy901;
13424
} else {
13425
if (yych <= 'Z') {
13426
if (yych <= '@')
13427
goto yy895;
13428
} else {
13429
if (yych <= '`')
13430
goto yy895;
13431
if (yych >= '{')
13432
goto yy895;
13433
}
13434
}
13435
yy926:
13436
yych = *++p;
13437
if (yych <= ';') {
13438
if (yych <= '/')
13439
goto yy895;
13440
if (yych <= '9')
13441
goto yy927;
13442
if (yych <= ':')
13443
goto yy895;
13444
goto yy901;
13445
} else {
13446
if (yych <= 'Z') {
13447
if (yych <= '@')
13448
goto yy895;
13449
} else {
13450
if (yych <= '`')
13451
goto yy895;
13452
if (yych >= '{')
13453
goto yy895;
13454
}
13455
}
13456
yy927:
13457
yych = *++p;
13458
if (yych <= ';') {
13459
if (yych <= '/')
13460
goto yy895;
13461
if (yych <= '9')
13462
goto yy928;
13463
if (yych <= ':')
13464
goto yy895;
13465
goto yy901;
13466
} else {
13467
if (yych <= 'Z') {
13468
if (yych <= '@')
13469
goto yy895;
13470
} else {
13471
if (yych <= '`')
13472
goto yy895;
13473
if (yych >= '{')
13474
goto yy895;
13475
}
13476
}
13477
yy928:
13478
yych = *++p;
13479
if (yych <= ';') {
13480
if (yych <= '/')
13481
goto yy895;
13482
if (yych <= '9')
13483
goto yy929;
13484
if (yych <= ':')
13485
goto yy895;
13486
goto yy901;
13487
} else {
13488
if (yych <= 'Z') {
13489
if (yych <= '@')
13490
goto yy895;
13491
} else {
13492
if (yych <= '`')
13493
goto yy895;
13494
if (yych >= '{')
13495
goto yy895;
13496
}
13497
}
13498
yy929:
13499
yych = *++p;
13500
if (yych <= ';') {
13501
if (yych <= '/')
13502
goto yy895;
13503
if (yych <= '9')
13504
goto yy930;
13505
if (yych <= ':')
13506
goto yy895;
13507
goto yy901;
13508
} else {
13509
if (yych <= 'Z') {
13510
if (yych <= '@')
13511
goto yy895;
13512
} else {
13513
if (yych <= '`')
13514
goto yy895;
13515
if (yych >= '{')
13516
goto yy895;
13517
}
13518
}
13519
yy930:
13520
yych = *++p;
13521
if (yych <= ';') {
13522
if (yych <= '/')
13523
goto yy895;
13524
if (yych <= '9')
13525
goto yy931;
13526
if (yych <= ':')
13527
goto yy895;
13528
goto yy901;
13529
} else {
13530
if (yych <= 'Z') {
13531
if (yych <= '@')
13532
goto yy895;
13533
} else {
13534
if (yych <= '`')
13535
goto yy895;
13536
if (yych >= '{')
13537
goto yy895;
13538
}
13539
}
13540
yy931:
13541
yych = *++p;
13542
if (yych <= ';') {
13543
if (yych <= '/')
13544
goto yy895;
13545
if (yych <= '9')
13546
goto yy932;
13547
if (yych <= ':')
13548
goto yy895;
13549
goto yy901;
13550
} else {
13551
if (yych <= 'Z') {
13552
if (yych <= '@')
13553
goto yy895;
13554
} else {
13555
if (yych <= '`')
13556
goto yy895;
13557
if (yych >= '{')
13558
goto yy895;
13559
}
13560
}
13561
yy932:
13562
yych = *++p;
13563
if (yych <= ';') {
13564
if (yych <= '/')
13565
goto yy895;
13566
if (yych <= '9')
13567
goto yy933;
13568
if (yych <= ':')
13569
goto yy895;
13570
goto yy901;
13571
} else {
13572
if (yych <= 'Z') {
13573
if (yych <= '@')
13574
goto yy895;
13575
} else {
13576
if (yych <= '`')
13577
goto yy895;
13578
if (yych >= '{')
13579
goto yy895;
13580
}
13581
}
13582
yy933:
13583
yych = *++p;
13584
if (yych <= ';') {
13585
if (yych <= '/')
13586
goto yy895;
13587
if (yych <= '9')
13588
goto yy934;
13589
if (yych <= ':')
13590
goto yy895;
13591
goto yy901;
13592
} else {
13593
if (yych <= 'Z') {
13594
if (yych <= '@')
13595
goto yy895;
13596
} else {
13597
if (yych <= '`')
13598
goto yy895;
13599
if (yych >= '{')
13600
goto yy895;
13601
}
13602
}
13603
yy934:
13604
yych = *++p;
13605
if (yych <= ';') {
13606
if (yych <= '/')
13607
goto yy895;
13608
if (yych <= '9')
13609
goto yy935;
13610
if (yych <= ':')
13611
goto yy895;
13612
goto yy901;
13613
} else {
13614
if (yych <= 'Z') {
13615
if (yych <= '@')
13616
goto yy895;
13617
} else {
13618
if (yych <= '`')
13619
goto yy895;
13620
if (yych >= '{')
13621
goto yy895;
13622
}
13623
}
13624
yy935:
13625
yych = *++p;
13626
if (yych <= ';') {
13627
if (yych <= '/')
13628
goto yy895;
13629
if (yych <= '9')
13630
goto yy936;
13631
if (yych <= ':')
13632
goto yy895;
13633
goto yy901;
13634
} else {
13635
if (yych <= 'Z') {
13636
if (yych <= '@')
13637
goto yy895;
13638
} else {
13639
if (yych <= '`')
13640
goto yy895;
13641
if (yych >= '{')
13642
goto yy895;
13643
}
13644
}
13645
yy936:
13646
yych = *++p;
13647
if (yych <= ';') {
13648
if (yych <= '/')
13649
goto yy895;
13650
if (yych <= '9')
13651
goto yy937;
13652
if (yych <= ':')
13653
goto yy895;
13654
goto yy901;
13655
} else {
13656
if (yych <= 'Z') {
13657
if (yych <= '@')
13658
goto yy895;
13659
} else {
13660
if (yych <= '`')
13661
goto yy895;
13662
if (yych >= '{')
13663
goto yy895;
13664
}
13665
}
13666
yy937:
13667
yych = *++p;
13668
if (yych <= ';') {
13669
if (yych <= '/')
13670
goto yy895;
13671
if (yych <= '9')
13672
goto yy938;
13673
if (yych <= ':')
13674
goto yy895;
13675
goto yy901;
13676
} else {
13677
if (yych <= 'Z') {
13678
if (yych <= '@')
13679
goto yy895;
13680
} else {
13681
if (yych <= '`')
13682
goto yy895;
13683
if (yych >= '{')
13684
goto yy895;
13685
}
13686
}
13687
yy938:
13688
yych = *++p;
13689
if (yych <= ';') {
13690
if (yych <= '/')
13691
goto yy895;
13692
if (yych <= '9')
13693
goto yy939;
13694
if (yych <= ':')
13695
goto yy895;
13696
goto yy901;
13697
} else {
13698
if (yych <= 'Z') {
13699
if (yych <= '@')
13700
goto yy895;
13701
} else {
13702
if (yych <= '`')
13703
goto yy895;
13704
if (yych >= '{')
13705
goto yy895;
13706
}
13707
}
13708
yy939:
13709
yych = *++p;
13710
if (yych <= ';') {
13711
if (yych <= '/')
13712
goto yy895;
13713
if (yych <= '9')
13714
goto yy940;
13715
if (yych <= ':')
13716
goto yy895;
13717
goto yy901;
13718
} else {
13719
if (yych <= 'Z') {
13720
if (yych <= '@')
13721
goto yy895;
13722
} else {
13723
if (yych <= '`')
13724
goto yy895;
13725
if (yych >= '{')
13726
goto yy895;
13727
}
13728
}
13729
yy940:
13730
yych = *++p;
13731
if (yych <= ';') {
13732
if (yych <= '/')
13733
goto yy895;
13734
if (yych <= '9')
13735
goto yy941;
13736
if (yych <= ':')
13737
goto yy895;
13738
goto yy901;
13739
} else {
13740
if (yych <= 'Z') {
13741
if (yych <= '@')
13742
goto yy895;
13743
} else {
13744
if (yych <= '`')
13745
goto yy895;
13746
if (yych >= '{')
13747
goto yy895;
13748
}
13749
}
13750
yy941:
13751
yych = *++p;
13752
if (yych <= ';') {
13753
if (yych <= '/')
13754
goto yy895;
13755
if (yych <= '9')
13756
goto yy942;
13757
if (yych <= ':')
13758
goto yy895;
13759
goto yy901;
13760
} else {
13761
if (yych <= 'Z') {
13762
if (yych <= '@')
13763
goto yy895;
13764
} else {
13765
if (yych <= '`')
13766
goto yy895;
13767
if (yych >= '{')
13768
goto yy895;
13769
}
13770
}
13771
yy942:
13772
yych = *++p;
13773
if (yych <= ';') {
13774
if (yych <= '/')
13775
goto yy895;
13776
if (yych <= '9')
13777
goto yy943;
13778
if (yych <= ':')
13779
goto yy895;
13780
goto yy901;
13781
} else {
13782
if (yych <= 'Z') {
13783
if (yych <= '@')
13784
goto yy895;
13785
} else {
13786
if (yych <= '`')
13787
goto yy895;
13788
if (yych >= '{')
13789
goto yy895;
13790
}
13791
}
13792
yy943:
13793
yych = *++p;
13794
if (yych <= ';') {
13795
if (yych <= '/')
13796
goto yy895;
13797
if (yych <= '9')
13798
goto yy944;
13799
if (yych <= ':')
13800
goto yy895;
13801
goto yy901;
13802
} else {
13803
if (yych <= 'Z') {
13804
if (yych <= '@')
13805
goto yy895;
13806
} else {
13807
if (yych <= '`')
13808
goto yy895;
13809
if (yych >= '{')
13810
goto yy895;
13811
}
13812
}
13813
yy944:
13814
++p;
13815
if ((yych = *p) <= ';') {
13816
if (yych <= '/')
13817
goto yy895;
13818
if (yych <= '9')
13819
goto yy920;
13820
if (yych <= ':')
13821
goto yy895;
13822
goto yy901;
13823
} else {
13824
if (yych <= 'Z') {
13825
if (yych <= '@')
13826
goto yy895;
13827
goto yy920;
13828
} else {
13829
if (yych <= '`')
13830
goto yy895;
13831
if (yych <= 'z')
13832
goto yy920;
13833
goto yy895;
13834
}
13835
}
13836
}
13837
}
13838
13839
// Returns positive value if a URL begins in a way that is potentially
13840
// dangerous, with javascript:, vbscript:, file:, or data:, otherwise 0.
13841
bufsize_t _scan_dangerous_url(const unsigned char *p) {
13842
const unsigned char *marker = NULL;
13843
const unsigned char *start = p;
13844
13845
{
13846
unsigned char yych;
13847
unsigned int yyaccept = 0;
13848
yych = *p;
13849
if (yych <= 'V') {
13850
if (yych <= 'F') {
13851
if (yych == 'D')
13852
goto yy949;
13853
if (yych >= 'F')
13854
goto yy950;
13855
} else {
13856
if (yych == 'J')
13857
goto yy951;
13858
if (yych >= 'V')
13859
goto yy952;
13860
}
13861
} else {
13862
if (yych <= 'f') {
13863
if (yych == 'd')
13864
goto yy949;
13865
if (yych >= 'f')
13866
goto yy950;
13867
} else {
13868
if (yych <= 'j') {
13869
if (yych >= 'j')
13870
goto yy951;
13871
} else {
13872
if (yych == 'v')
13873
goto yy952;
13874
}
13875
}
13876
}
13877
++p;
13878
yy948 : { return 0; }
13879
yy949:
13880
yyaccept = 0;
13881
yych = *(marker = ++p);
13882
if (yych == 'A')
13883
goto yy953;
13884
if (yych == 'a')
13885
goto yy953;
13886
goto yy948;
13887
yy950:
13888
yyaccept = 0;
13889
yych = *(marker = ++p);
13890
if (yych == 'I')
13891
goto yy955;
13892
if (yych == 'i')
13893
goto yy955;
13894
goto yy948;
13895
yy951:
13896
yyaccept = 0;
13897
yych = *(marker = ++p);
13898
if (yych == 'A')
13899
goto yy956;
13900
if (yych == 'a')
13901
goto yy956;
13902
goto yy948;
13903
yy952:
13904
yyaccept = 0;
13905
yych = *(marker = ++p);
13906
if (yych == 'B')
13907
goto yy957;
13908
if (yych == 'b')
13909
goto yy957;
13910
goto yy948;
13911
yy953:
13912
yych = *++p;
13913
if (yych == 'T')
13914
goto yy958;
13915
if (yych == 't')
13916
goto yy958;
13917
yy954:
13918
p = marker;
13919
if (yyaccept == 0) {
13920
goto yy948;
13921
} else {
13922
goto yy966;
13923
}
13924
yy955:
13925
yych = *++p;
13926
if (yych == 'L')
13927
goto yy959;
13928
if (yych == 'l')
13929
goto yy959;
13930
goto yy954;
13931
yy956:
13932
yych = *++p;
13933
if (yych == 'V')
13934
goto yy960;
13935
if (yych == 'v')
13936
goto yy960;
13937
goto yy954;
13938
yy957:
13939
yych = *++p;
13940
if (yych == 'S')
13941
goto yy961;
13942
if (yych == 's')
13943
goto yy961;
13944
goto yy954;
13945
yy958:
13946
yych = *++p;
13947
if (yych == 'A')
13948
goto yy962;
13949
if (yych == 'a')
13950
goto yy962;
13951
goto yy954;
13952
yy959:
13953
yych = *++p;
13954
if (yych == 'E')
13955
goto yy963;
13956
if (yych == 'e')
13957
goto yy963;
13958
goto yy954;
13959
yy960:
13960
yych = *++p;
13961
if (yych == 'A')
13962
goto yy957;
13963
if (yych == 'a')
13964
goto yy957;
13965
goto yy954;
13966
yy961:
13967
yych = *++p;
13968
if (yych == 'C')
13969
goto yy964;
13970
if (yych == 'c')
13971
goto yy964;
13972
goto yy954;
13973
yy962:
13974
yych = *++p;
13975
if (yych == ':')
13976
goto yy965;
13977
goto yy954;
13978
yy963:
13979
yych = *++p;
13980
if (yych == ':')
13981
goto yy967;
13982
goto yy954;
13983
yy964:
13984
yych = *++p;
13985
if (yych == 'R')
13986
goto yy968;
13987
if (yych == 'r')
13988
goto yy968;
13989
goto yy954;
13990
yy965:
13991
yyaccept = 1;
13992
yych = *(marker = ++p);
13993
if (yych == 'I')
13994
goto yy969;
13995
if (yych == 'i')
13996
goto yy969;
13997
yy966 : { return (bufsize_t)(p - start); }
13998
yy967:
13999
yych = *++p;
14000
goto yy966;
14001
yy968:
14002
yych = *++p;
14003
if (yych == 'I')
14004
goto yy970;
14005
if (yych == 'i')
14006
goto yy970;
14007
goto yy954;
14008
yy969:
14009
yych = *++p;
14010
if (yych == 'M')
14011
goto yy971;
14012
if (yych == 'm')
14013
goto yy971;
14014
goto yy954;
14015
yy970:
14016
yych = *++p;
14017
if (yych == 'P')
14018
goto yy972;
14019
if (yych == 'p')
14020
goto yy972;
14021
goto yy954;
14022
yy971:
14023
yych = *++p;
14024
if (yych == 'A')
14025
goto yy973;
14026
if (yych == 'a')
14027
goto yy973;
14028
goto yy954;
14029
yy972:
14030
yych = *++p;
14031
if (yych == 'T')
14032
goto yy963;
14033
if (yych == 't')
14034
goto yy963;
14035
goto yy954;
14036
yy973:
14037
yych = *++p;
14038
if (yych == 'G')
14039
goto yy974;
14040
if (yych != 'g')
14041
goto yy954;
14042
yy974:
14043
yych = *++p;
14044
if (yych == 'E')
14045
goto yy975;
14046
if (yych != 'e')
14047
goto yy954;
14048
yy975:
14049
yych = *++p;
14050
if (yych != '/')
14051
goto yy954;
14052
yych = *++p;
14053
if (yych <= 'W') {
14054
if (yych <= 'J') {
14055
if (yych == 'G')
14056
goto yy977;
14057
if (yych <= 'I')
14058
goto yy954;
14059
goto yy978;
14060
} else {
14061
if (yych == 'P')
14062
goto yy979;
14063
if (yych <= 'V')
14064
goto yy954;
14065
goto yy980;
14066
}
14067
} else {
14068
if (yych <= 'j') {
14069
if (yych == 'g')
14070
goto yy977;
14071
if (yych <= 'i')
14072
goto yy954;
14073
goto yy978;
14074
} else {
14075
if (yych <= 'p') {
14076
if (yych <= 'o')
14077
goto yy954;
14078
goto yy979;
14079
} else {
14080
if (yych == 'w')
14081
goto yy980;
14082
goto yy954;
14083
}
14084
}
14085
}
14086
yy977:
14087
yych = *++p;
14088
if (yych == 'I')
14089
goto yy981;
14090
if (yych == 'i')
14091
goto yy981;
14092
goto yy954;
14093
yy978:
14094
yych = *++p;
14095
if (yych == 'P')
14096
goto yy982;
14097
if (yych == 'p')
14098
goto yy982;
14099
goto yy954;
14100
yy979:
14101
yych = *++p;
14102
if (yych == 'N')
14103
goto yy983;
14104
if (yych == 'n')
14105
goto yy983;
14106
goto yy954;
14107
yy980:
14108
yych = *++p;
14109
if (yych == 'E')
14110
goto yy984;
14111
if (yych == 'e')
14112
goto yy984;
14113
goto yy954;
14114
yy981:
14115
yych = *++p;
14116
if (yych == 'F')
14117
goto yy985;
14118
if (yych == 'f')
14119
goto yy985;
14120
goto yy954;
14121
yy982:
14122
yych = *++p;
14123
if (yych == 'E')
14124
goto yy983;
14125
if (yych != 'e')
14126
goto yy954;
14127
yy983:
14128
yych = *++p;
14129
if (yych == 'G')
14130
goto yy985;
14131
if (yych == 'g')
14132
goto yy985;
14133
goto yy954;
14134
yy984:
14135
yych = *++p;
14136
if (yych == 'B')
14137
goto yy987;
14138
if (yych == 'b')
14139
goto yy987;
14140
goto yy954;
14141
yy985:
14142
++p;
14143
{ return 0; }
14144
yy987:
14145
++p;
14146
if ((yych = *p) == 'P')
14147
goto yy985;
14148
if (yych == 'p')
14149
goto yy985;
14150
goto yy954;
14151
}
14152
}
14153
14154
14155
static const char *EMDASH = "\xE2\x80\x94";
14156
static const char *ENDASH = "\xE2\x80\x93";
14157
static const char *ELLIPSES = "\xE2\x80\xA6";
14158
static const char *LEFTDOUBLEQUOTE = "\xE2\x80\x9C";
14159
static const char *RIGHTDOUBLEQUOTE = "\xE2\x80\x9D";
14160
static const char *LEFTSINGLEQUOTE = "\xE2\x80\x98";
14161
static const char *RIGHTSINGLEQUOTE = "\xE2\x80\x99";
14162
14163
// Macros for creating various kinds of simple.
14164
#define make_str(mem, s) make_literal(mem, CMARK_NODE_TEXT, s)
14165
#define make_code(mem, s) make_literal(mem, CMARK_NODE_CODE, s)
14166
#define make_raw_html(mem, s) make_literal(mem, CMARK_NODE_HTML_INLINE, s)
14167
#define make_linebreak(mem) make_simple(mem, CMARK_NODE_LINEBREAK)
14168
#define make_softbreak(mem) make_simple(mem, CMARK_NODE_SOFTBREAK)
14169
#define make_emph(mem) make_simple(mem, CMARK_NODE_EMPH)
14170
#define make_strong(mem) make_simple(mem, CMARK_NODE_STRONG)
14171
14172
#define MAXBACKTICKS 1000
14173
14174
typedef struct delimiter {
14175
struct delimiter *previous;
14176
struct delimiter *next;
14177
cmark_node *inl_text;
14178
bufsize_t length;
14179
unsigned char delim_char;
14180
bool can_open;
14181
bool can_close;
14182
} delimiter;
14183
14184
typedef struct bracket {
14185
struct bracket *previous;
14186
struct delimiter *previous_delimiter;
14187
cmark_node *inl_text;
14188
bufsize_t position;
14189
bool image;
14190
bool active;
14191
bool bracket_after;
14192
} bracket;
14193
14194
typedef struct {
14195
cmark_mem *mem;
14196
cmark_chunk input;
14197
bufsize_t pos;
14198
cmark_reference_map *refmap;
14199
delimiter *last_delim;
14200
bracket *last_bracket;
14201
bufsize_t backticks[MAXBACKTICKS + 1];
14202
bool scanned_for_backticks;
14203
} subject;
14204
14205
static CMARK_INLINE bool S_is_line_end_char(char c) {
14206
return (c == '\n' || c == '\r');
14207
}
14208
14209
static delimiter *S_insert_emph(subject *subj, delimiter *opener,
14210
delimiter *closer);
14211
14212
static int parse_inline(subject *subj, cmark_node *parent, int options);
14213
14214
static void subject_from_buf(cmark_mem *mem, subject *e, cmark_strbuf *buffer,
14215
cmark_reference_map *refmap);
14216
static bufsize_t subject_find_special_char(subject *subj, int options);
14217
14218
// Create an inline with a literal string value.
14219
static CMARK_INLINE cmark_node *make_literal(cmark_mem *mem, cmark_node_type t,
14220
cmark_chunk s) {
14221
cmark_node *e = (cmark_node *)mem->calloc(1, sizeof(*e));
14222
cmark_strbuf_init(mem, &e->content, 0);
14223
e->type = t;
14224
e->as.literal = s;
14225
return e;
14226
}
14227
14228
// Create an inline with no value.
14229
static CMARK_INLINE cmark_node *make_simple(cmark_mem *mem, cmark_node_type t) {
14230
cmark_node *e = (cmark_node *)mem->calloc(1, sizeof(*e));
14231
cmark_strbuf_init(mem, &e->content, 0);
14232
e->type = t;
14233
return e;
14234
}
14235
14236
// Like make_str, but parses entities.
14237
static cmark_node *make_str_with_entities(cmark_mem *mem,
14238
cmark_chunk *content) {
14239
cmark_strbuf unescaped = CMARK_BUF_INIT(mem);
14240
14241
if (houdini_unescape_html(&unescaped, content->data, content->len)) {
14242
return make_str(mem, cmark_chunk_buf_detach(&unescaped));
14243
} else {
14244
return make_str(mem, *content);
14245
}
14246
}
14247
14248
// Duplicate a chunk by creating a copy of the buffer not by reusing the
14249
// buffer like cmark_chunk_dup does.
14250
static cmark_chunk chunk_clone(cmark_mem *mem, cmark_chunk *src) {
14251
cmark_chunk c;
14252
bufsize_t len = src->len;
14253
14254
c.len = len;
14255
c.data = (unsigned char *)mem->calloc(len + 1, 1);
14256
c.alloc = 1;
14257
memcpy(c.data, src->data, len);
14258
c.data[len] = '\0';
14259
14260
return c;
14261
}
14262
14263
static cmark_chunk cmark_clean_autolink(cmark_mem *mem, cmark_chunk *url,
14264
int is_email) {
14265
cmark_strbuf buf = CMARK_BUF_INIT(mem);
14266
14267
cmark_chunk_trim(url);
14268
14269
if (url->len == 0) {
14270
cmark_chunk result = CMARK_CHUNK_EMPTY;
14271
return result;
14272
}
14273
14274
if (is_email)
14275
cmark_strbuf_puts(&buf, "mailto:");
14276
14277
houdini_unescape_html_f(&buf, url->data, url->len);
14278
return cmark_chunk_buf_detach(&buf);
14279
}
14280
14281
static CMARK_INLINE cmark_node *make_autolink(cmark_mem *mem, cmark_chunk url,
14282
int is_email) {
14283
cmark_node *link = make_simple(mem, CMARK_NODE_LINK);
14284
link->as.link.url = cmark_clean_autolink(mem, &url, is_email);
14285
link->as.link.title = cmark_chunk_literal("");
14286
cmark_node_append_child(link, make_str_with_entities(mem, &url));
14287
return link;
14288
}
14289
14290
static void subject_from_buf(cmark_mem *mem, subject *e, cmark_strbuf *buffer,
14291
cmark_reference_map *refmap) {
14292
int i;
14293
e->mem = mem;
14294
e->input.data = buffer->ptr;
14295
e->input.len = buffer->size;
14296
e->input.alloc = 0;
14297
e->pos = 0;
14298
e->refmap = refmap;
14299
e->last_delim = NULL;
14300
e->last_bracket = NULL;
14301
for (i = 0; i <= MAXBACKTICKS; i++) {
14302
e->backticks[i] = 0;
14303
}
14304
e->scanned_for_backticks = false;
14305
}
14306
14307
static CMARK_INLINE int isbacktick(int c) { return (c == '`'); }
14308
14309
static CMARK_INLINE unsigned char peek_char(subject *subj) {
14310
// NULL bytes should have been stripped out by now. If they're
14311
// present, it's a programming error:
14312
assert(!(subj->pos < subj->input.len && subj->input.data[subj->pos] == 0));
14313
return (subj->pos < subj->input.len) ? subj->input.data[subj->pos] : 0;
14314
}
14315
14316
static CMARK_INLINE unsigned char peek_at(subject *subj, bufsize_t pos) {
14317
return subj->input.data[pos];
14318
}
14319
14320
// Return true if there are more characters in the subject.
14321
static CMARK_INLINE int is_eof(subject *subj) {
14322
return (subj->pos >= subj->input.len);
14323
}
14324
14325
// Advance the subject. Doesn't check for eof.
14326
#define advance(subj) (subj)->pos += 1
14327
14328
static CMARK_INLINE bool skip_spaces(subject *subj) {
14329
bool skipped = false;
14330
while (peek_char(subj) == ' ' || peek_char(subj) == '\t') {
14331
advance(subj);
14332
skipped = true;
14333
}
14334
return skipped;
14335
}
14336
14337
static CMARK_INLINE bool skip_line_end(subject *subj) {
14338
bool seen_line_end_char = false;
14339
if (peek_char(subj) == '\r') {
14340
advance(subj);
14341
seen_line_end_char = true;
14342
}
14343
if (peek_char(subj) == '\n') {
14344
advance(subj);
14345
seen_line_end_char = true;
14346
}
14347
return seen_line_end_char || is_eof(subj);
14348
}
14349
14350
// Take characters while a predicate holds, and return a string.
14351
static CMARK_INLINE cmark_chunk take_while(subject *subj, int (*f)(int)) {
14352
unsigned char c;
14353
bufsize_t startpos = subj->pos;
14354
bufsize_t len = 0;
14355
14356
while ((c = peek_char(subj)) && (*f)(c)) {
14357
advance(subj);
14358
len++;
14359
}
14360
14361
return cmark_chunk_dup(&subj->input, startpos, len);
14362
}
14363
14364
// Try to process a backtick code span that began with a
14365
// span of ticks of length openticklength length (already
14366
// parsed). Return 0 if you don't find matching closing
14367
// backticks, otherwise return the position in the subject
14368
// after the closing backticks.
14369
static bufsize_t scan_to_closing_backticks(subject *subj,
14370
bufsize_t openticklength) {
14371
14372
bool found = false;
14373
if (openticklength > MAXBACKTICKS) {
14374
// we limit backtick string length because of the array subj->backticks:
14375
return 0;
14376
}
14377
if (subj->scanned_for_backticks &&
14378
subj->backticks[openticklength] <= subj->pos) {
14379
// return if we already know there's no closer
14380
return 0;
14381
}
14382
while (!found) {
14383
// read non backticks
14384
unsigned char c;
14385
while ((c = peek_char(subj)) && c != '`') {
14386
advance(subj);
14387
}
14388
if (is_eof(subj)) {
14389
break;
14390
}
14391
bufsize_t numticks = 0;
14392
while (peek_char(subj) == '`') {
14393
advance(subj);
14394
numticks++;
14395
}
14396
// store position of ender
14397
if (numticks <= MAXBACKTICKS) {
14398
subj->backticks[numticks] = subj->pos - numticks;
14399
}
14400
if (numticks == openticklength) {
14401
return (subj->pos);
14402
}
14403
}
14404
// got through whole input without finding closer
14405
subj->scanned_for_backticks = true;
14406
return 0;
14407
}
14408
14409
// Parse backtick code section or raw backticks, return an inline.
14410
// Assumes that the subject has a backtick at the current position.
14411
static cmark_node *handle_backticks(subject *subj) {
14412
cmark_chunk openticks = take_while(subj, isbacktick);
14413
bufsize_t startpos = subj->pos;
14414
bufsize_t endpos = scan_to_closing_backticks(subj, openticks.len);
14415
14416
if (endpos == 0) { // not found
14417
subj->pos = startpos; // rewind
14418
return make_str(subj->mem, openticks);
14419
} else {
14420
cmark_strbuf buf = CMARK_BUF_INIT(subj->mem);
14421
14422
cmark_strbuf_set(&buf, subj->input.data + startpos,
14423
endpos - startpos - openticks.len);
14424
cmark_strbuf_trim(&buf);
14425
cmark_strbuf_normalize_whitespace(&buf);
14426
14427
return make_code(subj->mem, cmark_chunk_buf_detach(&buf));
14428
}
14429
}
14430
14431
// Scan ***, **, or * and return number scanned, or 0.
14432
// Advances position.
14433
static int scan_delims(subject *subj, unsigned char c, bool *can_open,
14434
bool *can_close) {
14435
int numdelims = 0;
14436
bufsize_t before_char_pos;
14437
int32_t after_char = 0;
14438
int32_t before_char = 0;
14439
int len;
14440
bool left_flanking, right_flanking;
14441
14442
if (subj->pos == 0) {
14443
before_char = 10;
14444
} else {
14445
before_char_pos = subj->pos - 1;
14446
// walk back to the beginning of the UTF_8 sequence:
14447
while (peek_at(subj, before_char_pos) >> 6 == 2 && before_char_pos > 0) {
14448
before_char_pos -= 1;
14449
}
14450
len = cmark_utf8proc_iterate(subj->input.data + before_char_pos,
14451
subj->pos - before_char_pos, &before_char);
14452
if (len == -1) {
14453
before_char = 10;
14454
}
14455
}
14456
14457
if (c == '\'' || c == '"') {
14458
numdelims++;
14459
advance(subj); // limit to 1 delim for quotes
14460
} else {
14461
while (peek_char(subj) == c) {
14462
numdelims++;
14463
advance(subj);
14464
}
14465
}
14466
14467
len = cmark_utf8proc_iterate(subj->input.data + subj->pos,
14468
subj->input.len - subj->pos, &after_char);
14469
if (len == -1) {
14470
after_char = 10;
14471
}
14472
left_flanking = numdelims > 0 && !cmark_utf8proc_is_space(after_char) &&
14473
!(cmark_utf8proc_is_punctuation(after_char) &&
14474
!cmark_utf8proc_is_space(before_char) &&
14475
!cmark_utf8proc_is_punctuation(before_char));
14476
right_flanking = numdelims > 0 && !cmark_utf8proc_is_space(before_char) &&
14477
!(cmark_utf8proc_is_punctuation(before_char) &&
14478
!cmark_utf8proc_is_space(after_char) &&
14479
!cmark_utf8proc_is_punctuation(after_char));
14480
if (c == '_') {
14481
*can_open = left_flanking &&
14482
(!right_flanking || cmark_utf8proc_is_punctuation(before_char));
14483
*can_close = right_flanking &&
14484
(!left_flanking || cmark_utf8proc_is_punctuation(after_char));
14485
} else if (c == '\'' || c == '"') {
14486
*can_open = left_flanking && !right_flanking;
14487
*can_close = right_flanking;
14488
} else {
14489
*can_open = left_flanking;
14490
*can_close = right_flanking;
14491
}
14492
return numdelims;
14493
}
14494
14495
/*
14496
static void print_delimiters(subject *subj)
14497
{
14498
delimiter *delim;
14499
delim = subj->last_delim;
14500
while (delim != NULL) {
14501
printf("Item at stack pos %p: %d %d %d next(%p) prev(%p)\n",
14502
(void*)delim, delim->delim_char,
14503
delim->can_open, delim->can_close,
14504
(void*)delim->next, (void*)delim->previous);
14505
delim = delim->previous;
14506
}
14507
}
14508
*/
14509
14510
static void remove_delimiter(subject *subj, delimiter *delim) {
14511
if (delim == NULL)
14512
return;
14513
if (delim->next == NULL) {
14514
// end of list:
14515
assert(delim == subj->last_delim);
14516
subj->last_delim = delim->previous;
14517
} else {
14518
delim->next->previous = delim->previous;
14519
}
14520
if (delim->previous != NULL) {
14521
delim->previous->next = delim->next;
14522
}
14523
subj->mem->free(delim);
14524
}
14525
14526
static void pop_bracket(subject *subj) {
14527
bracket *b;
14528
if (subj->last_bracket == NULL)
14529
return;
14530
b = subj->last_bracket;
14531
subj->last_bracket = subj->last_bracket->previous;
14532
subj->mem->free(b);
14533
}
14534
14535
static void push_delimiter(subject *subj, unsigned char c, bool can_open,
14536
bool can_close, cmark_node *inl_text) {
14537
delimiter *delim = (delimiter *)subj->mem->calloc(1, sizeof(delimiter));
14538
delim->delim_char = c;
14539
delim->can_open = can_open;
14540
delim->can_close = can_close;
14541
delim->inl_text = inl_text;
14542
delim->length = inl_text->as.literal.len;
14543
delim->previous = subj->last_delim;
14544
delim->next = NULL;
14545
if (delim->previous != NULL) {
14546
delim->previous->next = delim;
14547
}
14548
subj->last_delim = delim;
14549
}
14550
14551
static void push_bracket(subject *subj, bool image, cmark_node *inl_text) {
14552
bracket *b = (bracket *)subj->mem->calloc(1, sizeof(bracket));
14553
if (subj->last_bracket != NULL) {
14554
subj->last_bracket->bracket_after = true;
14555
}
14556
b->image = image;
14557
b->active = true;
14558
b->inl_text = inl_text;
14559
b->previous = subj->last_bracket;
14560
b->previous_delimiter = subj->last_delim;
14561
b->position = subj->pos;
14562
b->bracket_after = false;
14563
subj->last_bracket = b;
14564
}
14565
14566
// Assumes the subject has a c at the current position.
14567
static cmark_node *handle_delim(subject *subj, unsigned char c, bool smart) {
14568
bufsize_t numdelims;
14569
cmark_node *inl_text;
14570
bool can_open, can_close;
14571
cmark_chunk contents;
14572
14573
numdelims = scan_delims(subj, c, &can_open, &can_close);
14574
14575
if (c == '\'' && smart) {
14576
contents = cmark_chunk_literal(RIGHTSINGLEQUOTE);
14577
} else if (c == '"' && smart) {
14578
contents =
14579
cmark_chunk_literal(can_close ? RIGHTDOUBLEQUOTE : LEFTDOUBLEQUOTE);
14580
} else {
14581
contents = cmark_chunk_dup(&subj->input, subj->pos - numdelims, numdelims);
14582
}
14583
14584
inl_text = make_str(subj->mem, contents);
14585
14586
if ((can_open || can_close) && (!(c == '\'' || c == '"') || smart)) {
14587
push_delimiter(subj, c, can_open, can_close, inl_text);
14588
}
14589
14590
return inl_text;
14591
}
14592
14593
// Assumes we have a hyphen at the current position.
14594
static cmark_node *handle_hyphen(subject *subj, bool smart) {
14595
int startpos = subj->pos;
14596
14597
advance(subj);
14598
14599
if (!smart || peek_char(subj) != '-') {
14600
return make_str(subj->mem, cmark_chunk_literal("-"));
14601
}
14602
14603
while (smart && peek_char(subj) == '-') {
14604
advance(subj);
14605
}
14606
14607
int numhyphens = subj->pos - startpos;
14608
int en_count = 0;
14609
int em_count = 0;
14610
int i;
14611
cmark_strbuf buf = CMARK_BUF_INIT(subj->mem);
14612
14613
if (numhyphens % 3 == 0) { // if divisible by 3, use all em dashes
14614
em_count = numhyphens / 3;
14615
} else if (numhyphens % 2 == 0) { // if divisible by 2, use all en dashes
14616
en_count = numhyphens / 2;
14617
} else if (numhyphens % 3 == 2) { // use one en dash at end
14618
en_count = 1;
14619
em_count = (numhyphens - 2) / 3;
14620
} else { // use two en dashes at the end
14621
en_count = 2;
14622
em_count = (numhyphens - 4) / 3;
14623
}
14624
14625
for (i = em_count; i > 0; i--) {
14626
cmark_strbuf_puts(&buf, EMDASH);
14627
}
14628
14629
for (i = en_count; i > 0; i--) {
14630
cmark_strbuf_puts(&buf, ENDASH);
14631
}
14632
14633
return make_str(subj->mem, cmark_chunk_buf_detach(&buf));
14634
}
14635
14636
// Assumes we have a period at the current position.
14637
static cmark_node *handle_period(subject *subj, bool smart) {
14638
advance(subj);
14639
if (smart && peek_char(subj) == '.') {
14640
advance(subj);
14641
if (peek_char(subj) == '.') {
14642
advance(subj);
14643
return make_str(subj->mem, cmark_chunk_literal(ELLIPSES));
14644
} else {
14645
return make_str(subj->mem, cmark_chunk_literal(".."));
14646
}
14647
} else {
14648
return make_str(subj->mem, cmark_chunk_literal("."));
14649
}
14650
}
14651
14652
static void process_emphasis(subject *subj, delimiter *stack_bottom) {
14653
delimiter *closer = subj->last_delim;
14654
delimiter *opener;
14655
delimiter *old_closer;
14656
bool opener_found;
14657
int openers_bottom_index;
14658
delimiter *openers_bottom[6] = {stack_bottom, stack_bottom, stack_bottom,
14659
stack_bottom, stack_bottom, stack_bottom};
14660
14661
// move back to first relevant delim.
14662
while (closer != NULL && closer->previous != stack_bottom) {
14663
closer = closer->previous;
14664
}
14665
14666
// now move forward, looking for closers, and handling each
14667
while (closer != NULL) {
14668
if (closer->can_close) {
14669
switch (closer->delim_char) {
14670
case '"':
14671
openers_bottom_index = 0;
14672
break;
14673
case '\'':
14674
openers_bottom_index = 1;
14675
break;
14676
case '_':
14677
openers_bottom_index = 2;
14678
break;
14679
case '*':
14680
openers_bottom_index = 3 + (closer->length % 3);
14681
break;
14682
default:
14683
assert(false);
14684
}
14685
14686
// Now look backwards for first matching opener:
14687
opener = closer->previous;
14688
opener_found = false;
14689
while (opener != NULL && opener != openers_bottom[openers_bottom_index]) {
14690
if (opener->can_open && opener->delim_char == closer->delim_char) {
14691
// interior closer of size 2 can't match opener of size 1
14692
// or of size 1 can't match 2
14693
if (!(closer->can_open || opener->can_close) ||
14694
((opener->length + closer->length) % 3) != 0) {
14695
opener_found = true;
14696
break;
14697
}
14698
}
14699
opener = opener->previous;
14700
}
14701
old_closer = closer;
14702
if (closer->delim_char == '*' || closer->delim_char == '_') {
14703
if (opener_found) {
14704
closer = S_insert_emph(subj, opener, closer);
14705
} else {
14706
closer = closer->next;
14707
}
14708
} else if (closer->delim_char == '\'') {
14709
cmark_chunk_free(subj->mem, &closer->inl_text->as.literal);
14710
closer->inl_text->as.literal = cmark_chunk_literal(RIGHTSINGLEQUOTE);
14711
if (opener_found) {
14712
cmark_chunk_free(subj->mem, &opener->inl_text->as.literal);
14713
opener->inl_text->as.literal = cmark_chunk_literal(LEFTSINGLEQUOTE);
14714
}
14715
closer = closer->next;
14716
} else if (closer->delim_char == '"') {
14717
cmark_chunk_free(subj->mem, &closer->inl_text->as.literal);
14718
closer->inl_text->as.literal = cmark_chunk_literal(RIGHTDOUBLEQUOTE);
14719
if (opener_found) {
14720
cmark_chunk_free(subj->mem, &opener->inl_text->as.literal);
14721
opener->inl_text->as.literal = cmark_chunk_literal(LEFTDOUBLEQUOTE);
14722
}
14723
closer = closer->next;
14724
}
14725
if (!opener_found) {
14726
// set lower bound for future searches for openers
14727
openers_bottom[openers_bottom_index] = old_closer->previous;
14728
if (!old_closer->can_open) {
14729
// we can remove a closer that can't be an
14730
// opener, once we've seen there's no
14731
// matching opener:
14732
remove_delimiter(subj, old_closer);
14733
}
14734
}
14735
} else {
14736
closer = closer->next;
14737
}
14738
}
14739
// free all delimiters in list until stack_bottom:
14740
while (subj->last_delim != NULL && subj->last_delim != stack_bottom) {
14741
remove_delimiter(subj, subj->last_delim);
14742
}
14743
}
14744
14745
static delimiter *S_insert_emph(subject *subj, delimiter *opener,
14746
delimiter *closer) {
14747
delimiter *delim, *tmp_delim;
14748
bufsize_t use_delims;
14749
cmark_node *opener_inl = opener->inl_text;
14750
cmark_node *closer_inl = closer->inl_text;
14751
bufsize_t opener_num_chars = opener_inl->as.literal.len;
14752
bufsize_t closer_num_chars = closer_inl->as.literal.len;
14753
cmark_node *tmp, *tmpnext, *emph;
14754
14755
// calculate the actual number of characters used from this closer
14756
use_delims = (closer_num_chars >= 2 && opener_num_chars >=2) ? 2 : 1;
14757
14758
// remove used characters from associated inlines.
14759
opener_num_chars -= use_delims;
14760
closer_num_chars -= use_delims;
14761
opener_inl->as.literal.len = opener_num_chars;
14762
closer_inl->as.literal.len = closer_num_chars;
14763
14764
// free delimiters between opener and closer
14765
delim = closer->previous;
14766
while (delim != NULL && delim != opener) {
14767
tmp_delim = delim->previous;
14768
remove_delimiter(subj, delim);
14769
delim = tmp_delim;
14770
}
14771
14772
// create new emph or strong, and splice it in to our inlines
14773
// between the opener and closer
14774
emph = use_delims == 1 ? make_emph(subj->mem) : make_strong(subj->mem);
14775
14776
tmp = opener_inl->next;
14777
while (tmp && tmp != closer_inl) {
14778
tmpnext = tmp->next;
14779
cmark_node_append_child(emph, tmp);
14780
tmp = tmpnext;
14781
}
14782
cmark_node_insert_after(opener_inl, emph);
14783
14784
// if opener has 0 characters, remove it and its associated inline
14785
if (opener_num_chars == 0) {
14786
cmark_node_free(opener_inl);
14787
remove_delimiter(subj, opener);
14788
}
14789
14790
// if closer has 0 characters, remove it and its associated inline
14791
if (closer_num_chars == 0) {
14792
// remove empty closer inline
14793
cmark_node_free(closer_inl);
14794
// remove closer from list
14795
tmp_delim = closer->next;
14796
remove_delimiter(subj, closer);
14797
closer = tmp_delim;
14798
}
14799
14800
return closer;
14801
}
14802
14803
// Parse backslash-escape or just a backslash, returning an inline.
14804
static cmark_node *handle_backslash(subject *subj) {
14805
advance(subj);
14806
unsigned char nextchar = peek_char(subj);
14807
if (cmark_ispunct(
14808
nextchar)) { // only ascii symbols and newline can be escaped
14809
advance(subj);
14810
return make_str(subj->mem, cmark_chunk_dup(&subj->input, subj->pos - 1, 1));
14811
} else if (!is_eof(subj) && skip_line_end(subj)) {
14812
return make_linebreak(subj->mem);
14813
} else {
14814
return make_str(subj->mem, cmark_chunk_literal("\\"));
14815
}
14816
}
14817
14818
// Parse an entity or a regular "&" string.
14819
// Assumes the subject has an '&' character at the current position.
14820
static cmark_node *handle_entity(subject *subj) {
14821
cmark_strbuf ent = CMARK_BUF_INIT(subj->mem);
14822
bufsize_t len;
14823
14824
advance(subj);
14825
14826
len = houdini_unescape_ent(&ent, subj->input.data + subj->pos,
14827
subj->input.len - subj->pos);
14828
14829
if (len == 0)
14830
return make_str(subj->mem, cmark_chunk_literal("&"));
14831
14832
subj->pos += len;
14833
return make_str(subj->mem, cmark_chunk_buf_detach(&ent));
14834
}
14835
14836
// Clean a URL: remove surrounding whitespace and surrounding <>,
14837
// and remove \ that escape punctuation.
14838
cmark_chunk cmark_clean_url(cmark_mem *mem, cmark_chunk *url) {
14839
cmark_strbuf buf = CMARK_BUF_INIT(mem);
14840
14841
cmark_chunk_trim(url);
14842
14843
if (url->len == 0) {
14844
cmark_chunk result = CMARK_CHUNK_EMPTY;
14845
return result;
14846
}
14847
14848
if (url->data[0] == '<' && url->data[url->len - 1] == '>') {
14849
houdini_unescape_html_f(&buf, url->data + 1, url->len - 2);
14850
} else {
14851
houdini_unescape_html_f(&buf, url->data, url->len);
14852
}
14853
14854
cmark_strbuf_unescape(&buf);
14855
return cmark_chunk_buf_detach(&buf);
14856
}
14857
14858
cmark_chunk cmark_clean_title(cmark_mem *mem, cmark_chunk *title) {
14859
cmark_strbuf buf = CMARK_BUF_INIT(mem);
14860
unsigned char first, last;
14861
14862
if (title->len == 0) {
14863
cmark_chunk result = CMARK_CHUNK_EMPTY;
14864
return result;
14865
}
14866
14867
first = title->data[0];
14868
last = title->data[title->len - 1];
14869
14870
// remove surrounding quotes if any:
14871
if ((first == '\'' && last == '\'') || (first == '(' && last == ')') ||
14872
(first == '"' && last == '"')) {
14873
houdini_unescape_html_f(&buf, title->data + 1, title->len - 2);
14874
} else {
14875
houdini_unescape_html_f(&buf, title->data, title->len);
14876
}
14877
14878
cmark_strbuf_unescape(&buf);
14879
return cmark_chunk_buf_detach(&buf);
14880
}
14881
14882
// Parse an autolink or HTML tag.
14883
// Assumes the subject has a '<' character at the current position.
14884
static cmark_node *handle_pointy_brace(subject *subj) {
14885
bufsize_t matchlen = 0;
14886
cmark_chunk contents;
14887
14888
advance(subj); // advance past first <
14889
14890
// first try to match a URL autolink
14891
matchlen = scan_autolink_uri(&subj->input, subj->pos);
14892
if (matchlen > 0) {
14893
contents = cmark_chunk_dup(&subj->input, subj->pos, matchlen - 1);
14894
subj->pos += matchlen;
14895
14896
return make_autolink(subj->mem, contents, 0);
14897
}
14898
14899
// next try to match an email autolink
14900
matchlen = scan_autolink_email(&subj->input, subj->pos);
14901
if (matchlen > 0) {
14902
contents = cmark_chunk_dup(&subj->input, subj->pos, matchlen - 1);
14903
subj->pos += matchlen;
14904
14905
return make_autolink(subj->mem, contents, 1);
14906
}
14907
14908
// finally, try to match an html tag
14909
matchlen = scan_html_tag(&subj->input, subj->pos);
14910
if (matchlen > 0) {
14911
contents = cmark_chunk_dup(&subj->input, subj->pos - 1, matchlen + 1);
14912
subj->pos += matchlen;
14913
return make_raw_html(subj->mem, contents);
14914
}
14915
14916
// if nothing matches, just return the opening <:
14917
return make_str(subj->mem, cmark_chunk_literal("<"));
14918
}
14919
14920
// Parse a link label. Returns 1 if successful.
14921
// Note: unescaped brackets are not allowed in labels.
14922
// The label begins with `[` and ends with the first `]` character
14923
// encountered. Backticks in labels do not start code spans.
14924
static int link_label(subject *subj, cmark_chunk *raw_label) {
14925
bufsize_t startpos = subj->pos;
14926
int length = 0;
14927
unsigned char c;
14928
14929
// advance past [
14930
if (peek_char(subj) == '[') {
14931
advance(subj);
14932
} else {
14933
return 0;
14934
}
14935
14936
while ((c = peek_char(subj)) && c != '[' && c != ']') {
14937
if (c == '\\') {
14938
advance(subj);
14939
length++;
14940
if (cmark_ispunct(peek_char(subj))) {
14941
advance(subj);
14942
length++;
14943
}
14944
} else {
14945
advance(subj);
14946
length++;
14947
}
14948
if (length > MAX_LINK_LABEL_LENGTH) {
14949
goto noMatch;
14950
}
14951
}
14952
14953
if (c == ']') { // match found
14954
*raw_label =
14955
cmark_chunk_dup(&subj->input, startpos + 1, subj->pos - (startpos + 1));
14956
cmark_chunk_trim(raw_label);
14957
advance(subj); // advance past ]
14958
return 1;
14959
}
14960
14961
noMatch:
14962
subj->pos = startpos; // rewind
14963
return 0;
14964
}
14965
static bufsize_t manual_scan_link_url(cmark_chunk *input, bufsize_t offset) {
14966
bufsize_t i = offset;
14967
size_t nb_p = 0;
14968
14969
if (i < input->len && input->data[i] == '<') {
14970
++i;
14971
while (i < input->len) {
14972
if (input->data[i] == '>') {
14973
++i;
14974
break;
14975
} else if (input->data[i] == '\\')
14976
i += 2;
14977
else if (cmark_isspace(input->data[i]))
14978
return -1;
14979
else
14980
++i;
14981
}
14982
} else {
14983
while (i < input->len) {
14984
if (input->data[i] == '\\')
14985
i += 2;
14986
else if (input->data[i] == '(') {
14987
++nb_p;
14988
++i;
14989
} else if (input->data[i] == ')') {
14990
if (nb_p == 0)
14991
break;
14992
--nb_p;
14993
++i;
14994
} else if (cmark_isspace(input->data[i]))
14995
break;
14996
else
14997
++i;
14998
}
14999
}
15000
15001
if (i >= input->len)
15002
return -1;
15003
return i - offset;
15004
}
15005
// Return a link, an image, or a literal close bracket.
15006
static cmark_node *handle_close_bracket(subject *subj) {
15007
bufsize_t initial_pos, after_link_text_pos;
15008
bufsize_t starturl, endurl, starttitle, endtitle, endall;
15009
bufsize_t n;
15010
bufsize_t sps;
15011
cmark_reference *ref = NULL;
15012
cmark_chunk url_chunk, title_chunk;
15013
cmark_chunk url, title;
15014
bracket *opener;
15015
cmark_node *inl;
15016
cmark_chunk raw_label;
15017
int found_label;
15018
cmark_node *tmp, *tmpnext;
15019
bool is_image;
15020
15021
advance(subj); // advance past ]
15022
initial_pos = subj->pos;
15023
15024
// get last [ or ![
15025
opener = subj->last_bracket;
15026
15027
if (opener == NULL) {
15028
return make_str(subj->mem, cmark_chunk_literal("]"));
15029
}
15030
15031
if (!opener->active) {
15032
// take delimiter off stack
15033
pop_bracket(subj);
15034
return make_str(subj->mem, cmark_chunk_literal("]"));
15035
}
15036
15037
// If we got here, we matched a potential link/image text.
15038
// Now we check to see if it's a link/image.
15039
is_image = opener->image;
15040
15041
after_link_text_pos = subj->pos;
15042
15043
// First, look for an inline link.
15044
if (peek_char(subj) == '(' &&
15045
((sps = scan_spacechars(&subj->input, subj->pos + 1)) > -1) &&
15046
((n = manual_scan_link_url(&subj->input, subj->pos + 1 + sps)) > -1)) {
15047
15048
// try to parse an explicit link:
15049
starturl = subj->pos + 1 + sps; // after (
15050
endurl = starturl + n;
15051
starttitle = endurl + scan_spacechars(&subj->input, endurl);
15052
15053
// ensure there are spaces btw url and title
15054
endtitle = (starttitle == endurl)
15055
? starttitle
15056
: starttitle + scan_link_title(&subj->input, starttitle);
15057
15058
endall = endtitle + scan_spacechars(&subj->input, endtitle);
15059
15060
if (peek_at(subj, endall) == ')') {
15061
subj->pos = endall + 1;
15062
15063
url_chunk = cmark_chunk_dup(&subj->input, starturl, endurl - starturl);
15064
title_chunk =
15065
cmark_chunk_dup(&subj->input, starttitle, endtitle - starttitle);
15066
url = cmark_clean_url(subj->mem, &url_chunk);
15067
title = cmark_clean_title(subj->mem, &title_chunk);
15068
cmark_chunk_free(subj->mem, &url_chunk);
15069
cmark_chunk_free(subj->mem, &title_chunk);
15070
goto match;
15071
15072
} else {
15073
// it could still be a shortcut reference link
15074
subj->pos = after_link_text_pos;
15075
}
15076
}
15077
15078
// Next, look for a following [link label] that matches in refmap.
15079
// skip spaces
15080
raw_label = cmark_chunk_literal("");
15081
found_label = link_label(subj, &raw_label);
15082
if (!found_label) {
15083
// If we have a shortcut reference link, back up
15084
// to before the spacse we skipped.
15085
subj->pos = initial_pos;
15086
}
15087
15088
if ((!found_label || raw_label.len == 0) && !opener->bracket_after) {
15089
cmark_chunk_free(subj->mem, &raw_label);
15090
raw_label = cmark_chunk_dup(&subj->input, opener->position,
15091
initial_pos - opener->position - 1);
15092
found_label = true;
15093
}
15094
15095
if (found_label) {
15096
ref = cmark_reference_lookup(subj->refmap, &raw_label);
15097
cmark_chunk_free(subj->mem, &raw_label);
15098
}
15099
15100
if (ref != NULL) { // found
15101
url = chunk_clone(subj->mem, &ref->url);
15102
title = chunk_clone(subj->mem, &ref->title);
15103
goto match;
15104
} else {
15105
goto noMatch;
15106
}
15107
15108
noMatch:
15109
// If we fall through to here, it means we didn't match a link:
15110
pop_bracket(subj); // remove this opener from delimiter list
15111
subj->pos = initial_pos;
15112
return make_str(subj->mem, cmark_chunk_literal("]"));
15113
15114
match:
15115
inl = make_simple(subj->mem, is_image ? CMARK_NODE_IMAGE : CMARK_NODE_LINK);
15116
inl->as.link.url = url;
15117
inl->as.link.title = title;
15118
cmark_node_insert_before(opener->inl_text, inl);
15119
// Add link text:
15120
tmp = opener->inl_text->next;
15121
while (tmp) {
15122
tmpnext = tmp->next;
15123
cmark_node_append_child(inl, tmp);
15124
tmp = tmpnext;
15125
}
15126
15127
// Free the bracket [:
15128
cmark_node_free(opener->inl_text);
15129
15130
process_emphasis(subj, opener->previous_delimiter);
15131
pop_bracket(subj);
15132
15133
// Now, if we have a link, we also want to deactivate earlier link
15134
// delimiters. (This code can be removed if we decide to allow links
15135
// inside links.)
15136
if (!is_image) {
15137
opener = subj->last_bracket;
15138
while (opener != NULL) {
15139
if (!opener->image) {
15140
if (!opener->active) {
15141
break;
15142
} else {
15143
opener->active = false;
15144
}
15145
}
15146
opener = opener->previous;
15147
}
15148
}
15149
15150
return NULL;
15151
}
15152
15153
// Parse a hard or soft linebreak, returning an inline.
15154
// Assumes the subject has a cr or newline at the current position.
15155
static cmark_node *handle_newline(subject *subj) {
15156
bufsize_t nlpos = subj->pos;
15157
// skip over cr, crlf, or lf:
15158
if (peek_at(subj, subj->pos) == '\r') {
15159
advance(subj);
15160
}
15161
if (peek_at(subj, subj->pos) == '\n') {
15162
advance(subj);
15163
}
15164
// skip spaces at beginning of line
15165
skip_spaces(subj);
15166
if (nlpos > 1 && peek_at(subj, nlpos - 1) == ' ' &&
15167
peek_at(subj, nlpos - 2) == ' ') {
15168
return make_linebreak(subj->mem);
15169
} else {
15170
return make_softbreak(subj->mem);
15171
}
15172
}
15173
15174
static bufsize_t subject_find_special_char(subject *subj, int options) {
15175
// "\r\n\\`&_*[]<!"
15176
static const int8_t SPECIAL_CHARS[256] = {
15177
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15178
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,
15179
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15180
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1,
15181
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15182
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15183
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15184
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15185
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15186
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15187
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
15188
15189
// " ' . -
15190
static const char SMART_PUNCT_CHARS[] = {
15191
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15192
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0,
15193
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15194
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15195
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15196
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15197
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15198
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15199
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15200
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15201
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15202
};
15203
15204
bufsize_t n = subj->pos + 1;
15205
15206
while (n < subj->input.len) {
15207
if (SPECIAL_CHARS[subj->input.data[n]])
15208
return n;
15209
if (options & CMARK_OPT_SMART && SMART_PUNCT_CHARS[subj->input.data[n]])
15210
return n;
15211
n++;
15212
}
15213
15214
return subj->input.len;
15215
}
15216
15217
// Parse an inline, advancing subject, and add it as a child of parent.
15218
// Return 0 if no inline can be parsed, 1 otherwise.
15219
static int parse_inline(subject *subj, cmark_node *parent, int options) {
15220
cmark_node *new_inl = NULL;
15221
cmark_chunk contents;
15222
unsigned char c;
15223
bufsize_t endpos;
15224
c = peek_char(subj);
15225
if (c == 0) {
15226
return 0;
15227
}
15228
switch (c) {
15229
case '\r':
15230
case '\n':
15231
new_inl = handle_newline(subj);
15232
break;
15233
case '`':
15234
new_inl = handle_backticks(subj);
15235
break;
15236
case '\\':
15237
new_inl = handle_backslash(subj);
15238
break;
15239
case '&':
15240
new_inl = handle_entity(subj);
15241
break;
15242
case '<':
15243
new_inl = handle_pointy_brace(subj);
15244
break;
15245
case '*':
15246
case '_':
15247
case '\'':
15248
case '"':
15249
new_inl = handle_delim(subj, c, (options & CMARK_OPT_SMART) != 0);
15250
break;
15251
case '-':
15252
new_inl = handle_hyphen(subj, (options & CMARK_OPT_SMART) != 0);
15253
break;
15254
case '.':
15255
new_inl = handle_period(subj, (options & CMARK_OPT_SMART) != 0);
15256
break;
15257
case '[':
15258
advance(subj);
15259
new_inl = make_str(subj->mem, cmark_chunk_literal("["));
15260
push_bracket(subj, false, new_inl);
15261
break;
15262
case ']':
15263
new_inl = handle_close_bracket(subj);
15264
break;
15265
case '!':
15266
advance(subj);
15267
if (peek_char(subj) == '[') {
15268
advance(subj);
15269
new_inl = make_str(subj->mem, cmark_chunk_literal("!["));
15270
push_bracket(subj, true, new_inl);
15271
} else {
15272
new_inl = make_str(subj->mem, cmark_chunk_literal("!"));
15273
}
15274
break;
15275
default:
15276
endpos = subject_find_special_char(subj, options);
15277
contents = cmark_chunk_dup(&subj->input, subj->pos, endpos - subj->pos);
15278
subj->pos = endpos;
15279
15280
// if we're at a newline, strip trailing spaces.
15281
if (S_is_line_end_char(peek_char(subj))) {
15282
cmark_chunk_rtrim(&contents);
15283
}
15284
15285
new_inl = make_str(subj->mem, contents);
15286
}
15287
if (new_inl != NULL) {
15288
cmark_node_append_child(parent, new_inl);
15289
}
15290
15291
return 1;
15292
}
15293
15294
// Parse inlines from parent's string_content, adding as children of parent.
15295
extern void cmark_parse_inlines(cmark_mem *mem, cmark_node *parent,
15296
cmark_reference_map *refmap, int options) {
15297
subject subj;
15298
subject_from_buf(mem, &subj, &parent->content, refmap);
15299
cmark_chunk_rtrim(&subj.input);
15300
15301
while (!is_eof(&subj) && parse_inline(&subj, parent, options))
15302
;
15303
15304
process_emphasis(&subj, NULL);
15305
// free bracket and delim stack
15306
while (subj.last_delim) {
15307
pop_bracket(&subj);
15308
}
15309
while (subj.last_bracket) {
15310
pop_bracket(&subj);
15311
}
15312
}
15313
15314
// Parse zero or more space characters, including at most one newline.
15315
static void spnl(subject *subj) {
15316
skip_spaces(subj);
15317
if (skip_line_end(subj)) {
15318
skip_spaces(subj);
15319
}
15320
}
15321
15322
// Parse reference. Assumes string begins with '[' character.
15323
// Modify refmap if a reference is encountered.
15324
// Return 0 if no reference found, otherwise position of subject
15325
// after reference is parsed.
15326
bufsize_t cmark_parse_reference_inline(cmark_mem *mem, cmark_strbuf *input,
15327
cmark_reference_map *refmap) {
15328
subject subj;
15329
15330
cmark_chunk lab;
15331
cmark_chunk url;
15332
cmark_chunk title;
15333
15334
bufsize_t matchlen = 0;
15335
bufsize_t beforetitle;
15336
15337
subject_from_buf(mem, &subj, input, NULL);
15338
15339
// parse label:
15340
if (!link_label(&subj, &lab) || lab.len == 0)
15341
return 0;
15342
15343
// colon:
15344
if (peek_char(&subj) == ':') {
15345
advance(&subj);
15346
} else {
15347
return 0;
15348
}
15349
15350
// parse link url:
15351
spnl(&subj);
15352
matchlen = manual_scan_link_url(&subj.input, subj.pos);
15353
if (matchlen > 0) {
15354
url = cmark_chunk_dup(&subj.input, subj.pos, matchlen);
15355
subj.pos += matchlen;
15356
} else {
15357
return 0;
15358
}
15359
15360
// parse optional link_title
15361
beforetitle = subj.pos;
15362
spnl(&subj);
15363
matchlen = scan_link_title(&subj.input, subj.pos);
15364
if (matchlen) {
15365
title = cmark_chunk_dup(&subj.input, subj.pos, matchlen);
15366
subj.pos += matchlen;
15367
} else {
15368
subj.pos = beforetitle;
15369
title = cmark_chunk_literal("");
15370
}
15371
15372
// parse final spaces and newline:
15373
skip_spaces(&subj);
15374
if (!skip_line_end(&subj)) {
15375
if (matchlen) { // try rewinding before title
15376
subj.pos = beforetitle;
15377
skip_spaces(&subj);
15378
if (!skip_line_end(&subj)) {
15379
return 0;
15380
}
15381
} else {
15382
return 0;
15383
}
15384
}
15385
// insert reference into refmap
15386
cmark_reference_create(refmap, &lab, &url, &title);
15387
return subj.pos;
15388
}
15389
15390
15391
static const int8_t utf8proc_utf8class[256] = {
15392
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
15393
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
15394
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
15395
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
15396
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
15397
1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15398
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15399
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15400
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
15401
2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
15402
4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0};
15403
15404
static void encode_unknown(cmark_strbuf *buf) {
15405
static const uint8_t repl[] = {239, 191, 189};
15406
cmark_strbuf_put(buf, repl, 3);
15407
}
15408
15409
static int utf8proc_charlen(const uint8_t *str, bufsize_t str_len) {
15410
int length, i;
15411
15412
if (!str_len)
15413
return 0;
15414
15415
length = utf8proc_utf8class[str[0]];
15416
15417
if (!length)
15418
return -1;
15419
15420
if (str_len >= 0 && (bufsize_t)length > str_len)
15421
return -str_len;
15422
15423
for (i = 1; i < length; i++) {
15424
if ((str[i] & 0xC0) != 0x80)
15425
return -i;
15426
}
15427
15428
return length;
15429
}
15430
15431
// Validate a single UTF-8 character according to RFC 3629.
15432
static int utf8proc_valid(const uint8_t *str, bufsize_t str_len) {
15433
int length = utf8proc_utf8class[str[0]];
15434
15435
if (!length)
15436
return -1;
15437
15438
if ((bufsize_t)length > str_len)
15439
return -str_len;
15440
15441
switch (length) {
15442
case 2:
15443
if ((str[1] & 0xC0) != 0x80)
15444
return -1;
15445
if (str[0] < 0xC2) {
15446
// Overlong
15447
return -length;
15448
}
15449
break;
15450
15451
case 3:
15452
if ((str[1] & 0xC0) != 0x80)
15453
return -1;
15454
if ((str[2] & 0xC0) != 0x80)
15455
return -2;
15456
if (str[0] == 0xE0) {
15457
if (str[1] < 0xA0) {
15458
// Overlong
15459
return -length;
15460
}
15461
} else if (str[0] == 0xED) {
15462
if (str[1] >= 0xA0) {
15463
// Surrogate
15464
return -length;
15465
}
15466
}
15467
break;
15468
15469
case 4:
15470
if ((str[1] & 0xC0) != 0x80)
15471
return -1;
15472
if ((str[2] & 0xC0) != 0x80)
15473
return -2;
15474
if ((str[3] & 0xC0) != 0x80)
15475
return -3;
15476
if (str[0] == 0xF0) {
15477
if (str[1] < 0x90) {
15478
// Overlong
15479
return -length;
15480
}
15481
} else if (str[0] >= 0xF4) {
15482
if (str[0] > 0xF4 || str[1] >= 0x90) {
15483
// Above 0x10FFFF
15484
return -length;
15485
}
15486
}
15487
break;
15488
}
15489
15490
return length;
15491
}
15492
15493
void cmark_utf8proc_check(cmark_strbuf *ob, const uint8_t *line,
15494
bufsize_t size) {
15495
bufsize_t i = 0;
15496
15497
while (i < size) {
15498
bufsize_t org = i;
15499
int charlen = 0;
15500
15501
while (i < size) {
15502
if (line[i] < 0x80 && line[i] != 0) {
15503
i++;
15504
} else if (line[i] >= 0x80) {
15505
charlen = utf8proc_valid(line + i, size - i);
15506
if (charlen < 0) {
15507
charlen = -charlen;
15508
break;
15509
}
15510
i += charlen;
15511
} else if (line[i] == 0) {
15512
// ASCII NUL is technically valid but rejected
15513
// for security reasons.
15514
charlen = 1;
15515
break;
15516
}
15517
}
15518
15519
if (i > org) {
15520
cmark_strbuf_put(ob, line + org, i - org);
15521
}
15522
15523
if (i >= size) {
15524
break;
15525
} else {
15526
// Invalid UTF-8
15527
encode_unknown(ob);
15528
i += charlen;
15529
}
15530
}
15531
}
15532
15533
int cmark_utf8proc_iterate(const uint8_t *str, bufsize_t str_len,
15534
int32_t *dst) {
15535
int length;
15536
int32_t uc = -1;
15537
15538
*dst = -1;
15539
length = utf8proc_charlen(str, str_len);
15540
if (length < 0)
15541
return -1;
15542
15543
switch (length) {
15544
case 1:
15545
uc = str[0];
15546
break;
15547
case 2:
15548
uc = ((str[0] & 0x1F) << 6) + (str[1] & 0x3F);
15549
if (uc < 0x80)
15550
uc = -1;
15551
break;
15552
case 3:
15553
uc = ((str[0] & 0x0F) << 12) + ((str[1] & 0x3F) << 6) + (str[2] & 0x3F);
15554
if (uc < 0x800 || (uc >= 0xD800 && uc < 0xE000))
15555
uc = -1;
15556
break;
15557
case 4:
15558
uc = ((str[0] & 0x07) << 18) + ((str[1] & 0x3F) << 12) +
15559
((str[2] & 0x3F) << 6) + (str[3] & 0x3F);
15560
if (uc < 0x10000 || uc >= 0x110000)
15561
uc = -1;
15562
break;
15563
}
15564
15565
if (uc < 0)
15566
return -1;
15567
15568
*dst = uc;
15569
return length;
15570
}
15571
15572
void cmark_utf8proc_encode_char(int32_t uc, cmark_strbuf *buf) {
15573
uint8_t dst[4];
15574
bufsize_t len = 0;
15575
15576
assert(uc >= 0);
15577
15578
if (uc < 0x80) {
15579
dst[0] = (uint8_t)(uc);
15580
len = 1;
15581
} else if (uc < 0x800) {
15582
dst[0] = (uint8_t)(0xC0 + (uc >> 6));
15583
dst[1] = 0x80 + (uc & 0x3F);
15584
len = 2;
15585
} else if (uc == 0xFFFF) {
15586
dst[0] = 0xFF;
15587
len = 1;
15588
} else if (uc == 0xFFFE) {
15589
dst[0] = 0xFE;
15590
len = 1;
15591
} else if (uc < 0x10000) {
15592
dst[0] = (uint8_t)(0xE0 + (uc >> 12));
15593
dst[1] = 0x80 + ((uc >> 6) & 0x3F);
15594
dst[2] = 0x80 + (uc & 0x3F);
15595
len = 3;
15596
} else if (uc < 0x110000) {
15597
dst[0] = (uint8_t)(0xF0 + (uc >> 18));
15598
dst[1] = 0x80 + ((uc >> 12) & 0x3F);
15599
dst[2] = 0x80 + ((uc >> 6) & 0x3F);
15600
dst[3] = 0x80 + (uc & 0x3F);
15601
len = 4;
15602
} else {
15603
encode_unknown(buf);
15604
return;
15605
}
15606
15607
cmark_strbuf_put(buf, dst, len);
15608
}
15609
15610
void cmark_utf8proc_case_fold(cmark_strbuf *dest, const uint8_t *str,
15611
bufsize_t len) {
15612
int32_t c;
15613
15614
#define bufpush(x) cmark_utf8proc_encode_char(x, dest)
15615
15616
while (len > 0) {
15617
bufsize_t char_len = cmark_utf8proc_iterate(str, len, &c);
15618
15619
if (char_len >= 0) {
15620
#include "case_fold_switch.inc"
15621
} else {
15622
encode_unknown(dest);
15623
char_len = -char_len;
15624
}
15625
15626
str += char_len;
15627
len -= char_len;
15628
}
15629
}
15630
15631
// matches anything in the Zs class, plus LF, CR, TAB, FF.
15632
int cmark_utf8proc_is_space(int32_t uc) {
15633
return (uc == 9 || uc == 10 || uc == 12 || uc == 13 || uc == 32 ||
15634
uc == 160 || uc == 5760 || (uc >= 8192 && uc <= 8202) || uc == 8239 ||
15635
uc == 8287 || uc == 12288);
15636
}
15637
15638
// matches anything in the P[cdefios] classes.
15639
int cmark_utf8proc_is_punctuation(int32_t uc) {
15640
return (
15641
(uc < 128 && cmark_ispunct((char)uc)) || uc == 161 || uc == 167 ||
15642
uc == 171 || uc == 182 || uc == 183 || uc == 187 || uc == 191 ||
15643
uc == 894 || uc == 903 || (uc >= 1370 && uc <= 1375) || uc == 1417 ||
15644
uc == 1418 || uc == 1470 || uc == 1472 || uc == 1475 || uc == 1478 ||
15645
uc == 1523 || uc == 1524 || uc == 1545 || uc == 1546 || uc == 1548 ||
15646
uc == 1549 || uc == 1563 || uc == 1566 || uc == 1567 ||
15647
(uc >= 1642 && uc <= 1645) || uc == 1748 || (uc >= 1792 && uc <= 1805) ||
15648
(uc >= 2039 && uc <= 2041) || (uc >= 2096 && uc <= 2110) || uc == 2142 ||
15649
uc == 2404 || uc == 2405 || uc == 2416 || uc == 2800 || uc == 3572 ||
15650
uc == 3663 || uc == 3674 || uc == 3675 || (uc >= 3844 && uc <= 3858) ||
15651
uc == 3860 || (uc >= 3898 && uc <= 3901) || uc == 3973 ||
15652
(uc >= 4048 && uc <= 4052) || uc == 4057 || uc == 4058 ||
15653
(uc >= 4170 && uc <= 4175) || uc == 4347 || (uc >= 4960 && uc <= 4968) ||
15654
uc == 5120 || uc == 5741 || uc == 5742 || uc == 5787 || uc == 5788 ||
15655
(uc >= 5867 && uc <= 5869) || uc == 5941 || uc == 5942 ||
15656
(uc >= 6100 && uc <= 6102) || (uc >= 6104 && uc <= 6106) ||
15657
(uc >= 6144 && uc <= 6154) || uc == 6468 || uc == 6469 || uc == 6686 ||
15658
uc == 6687 || (uc >= 6816 && uc <= 6822) || (uc >= 6824 && uc <= 6829) ||
15659
(uc >= 7002 && uc <= 7008) || (uc >= 7164 && uc <= 7167) ||
15660
(uc >= 7227 && uc <= 7231) || uc == 7294 || uc == 7295 ||
15661
(uc >= 7360 && uc <= 7367) || uc == 7379 || (uc >= 8208 && uc <= 8231) ||
15662
(uc >= 8240 && uc <= 8259) || (uc >= 8261 && uc <= 8273) ||
15663
(uc >= 8275 && uc <= 8286) || uc == 8317 || uc == 8318 || uc == 8333 ||
15664
uc == 8334 || (uc >= 8968 && uc <= 8971) || uc == 9001 || uc == 9002 ||
15665
(uc >= 10088 && uc <= 10101) || uc == 10181 || uc == 10182 ||
15666
(uc >= 10214 && uc <= 10223) || (uc >= 10627 && uc <= 10648) ||
15667
(uc >= 10712 && uc <= 10715) || uc == 10748 || uc == 10749 ||
15668
(uc >= 11513 && uc <= 11516) || uc == 11518 || uc == 11519 ||
15669
uc == 11632 || (uc >= 11776 && uc <= 11822) ||
15670
(uc >= 11824 && uc <= 11842) || (uc >= 12289 && uc <= 12291) ||
15671
(uc >= 12296 && uc <= 12305) || (uc >= 12308 && uc <= 12319) ||
15672
uc == 12336 || uc == 12349 || uc == 12448 || uc == 12539 || uc == 42238 ||
15673
uc == 42239 || (uc >= 42509 && uc <= 42511) || uc == 42611 ||
15674
uc == 42622 || (uc >= 42738 && uc <= 42743) ||
15675
(uc >= 43124 && uc <= 43127) || uc == 43214 || uc == 43215 ||
15676
(uc >= 43256 && uc <= 43258) || uc == 43310 || uc == 43311 ||
15677
uc == 43359 || (uc >= 43457 && uc <= 43469) || uc == 43486 ||
15678
uc == 43487 || (uc >= 43612 && uc <= 43615) || uc == 43742 ||
15679
uc == 43743 || uc == 43760 || uc == 43761 || uc == 44011 || uc == 64830 ||
15680
uc == 64831 || (uc >= 65040 && uc <= 65049) ||
15681
(uc >= 65072 && uc <= 65106) || (uc >= 65108 && uc <= 65121) ||
15682
uc == 65123 || uc == 65128 || uc == 65130 || uc == 65131 ||
15683
(uc >= 65281 && uc <= 65283) || (uc >= 65285 && uc <= 65290) ||
15684
(uc >= 65292 && uc <= 65295) || uc == 65306 || uc == 65307 ||
15685
uc == 65311 || uc == 65312 || (uc >= 65339 && uc <= 65341) ||
15686
uc == 65343 || uc == 65371 || uc == 65373 ||
15687
(uc >= 65375 && uc <= 65381) || (uc >= 65792 && uc <= 65794) ||
15688
uc == 66463 || uc == 66512 || uc == 66927 || uc == 67671 || uc == 67871 ||
15689
uc == 67903 || (uc >= 68176 && uc <= 68184) || uc == 68223 ||
15690
(uc >= 68336 && uc <= 68342) || (uc >= 68409 && uc <= 68415) ||
15691
(uc >= 68505 && uc <= 68508) || (uc >= 69703 && uc <= 69709) ||
15692
uc == 69819 || uc == 69820 || (uc >= 69822 && uc <= 69825) ||
15693
(uc >= 69952 && uc <= 69955) || uc == 70004 || uc == 70005 ||
15694
(uc >= 70085 && uc <= 70088) || uc == 70093 ||
15695
(uc >= 70200 && uc <= 70205) || uc == 70854 ||
15696
(uc >= 71105 && uc <= 71113) || (uc >= 71233 && uc <= 71235) ||
15697
(uc >= 74864 && uc <= 74868) || uc == 92782 || uc == 92783 ||
15698
uc == 92917 || (uc >= 92983 && uc <= 92987) || uc == 92996 ||
15699
uc == 113823);
15700
}
15701
15702
static unsigned int refhash(const unsigned char *link_ref) {
15703
unsigned int hash = 0;
15704
15705
while (*link_ref)
15706
hash = (*link_ref++) + (hash << 6) + (hash << 16) - hash;
15707
15708
return hash;
15709
}
15710
15711
static void reference_free(cmark_reference_map *map, cmark_reference *ref) {
15712
cmark_mem *mem = map->mem;
15713
if (ref != NULL) {
15714
mem->free(ref->label);
15715
cmark_chunk_free(mem, &ref->url);
15716
cmark_chunk_free(mem, &ref->title);
15717
mem->free(ref);
15718
}
15719
}
15720
15721
// normalize reference: collapse internal whitespace to single space,
15722
// remove leading/trailing whitespace, case fold
15723
// Return NULL if the reference name is actually empty (i.e. composed
15724
// solely from whitespace)
15725
static unsigned char *normalize_reference(cmark_mem *mem, cmark_chunk *ref) {
15726
cmark_strbuf normalized = CMARK_BUF_INIT(mem);
15727
unsigned char *result;
15728
15729
if (ref == NULL)
15730
return NULL;
15731
15732
if (ref->len == 0)
15733
return NULL;
15734
15735
cmark_utf8proc_case_fold(&normalized, ref->data, ref->len);
15736
cmark_strbuf_trim(&normalized);
15737
cmark_strbuf_normalize_whitespace(&normalized);
15738
15739
result = cmark_strbuf_detach(&normalized);
15740
assert(result);
15741
15742
if (result[0] == '\0') {
15743
mem->free(result);
15744
return NULL;
15745
}
15746
15747
return result;
15748
}
15749
15750
static void add_reference(cmark_reference_map *map, cmark_reference *ref) {
15751
cmark_reference *t = ref->next = map->table[ref->hash % REFMAP_SIZE];
15752
15753
while (t) {
15754
if (t->hash == ref->hash && !strcmp((char *)t->label, (char *)ref->label)) {
15755
reference_free(map, ref);
15756
return;
15757
}
15758
15759
t = t->next;
15760
}
15761
15762
map->table[ref->hash % REFMAP_SIZE] = ref;
15763
}
15764
15765
void cmark_reference_create(cmark_reference_map *map, cmark_chunk *label,
15766
cmark_chunk *url, cmark_chunk *title) {
15767
cmark_reference *ref;
15768
unsigned char *reflabel = normalize_reference(map->mem, label);
15769
15770
/* empty reference name, or composed from only whitespace */
15771
if (reflabel == NULL)
15772
return;
15773
15774
ref = (cmark_reference *)map->mem->calloc(1, sizeof(*ref));
15775
ref->label = reflabel;
15776
ref->hash = refhash(ref->label);
15777
ref->url = cmark_clean_url(map->mem, url);
15778
ref->title = cmark_clean_title(map->mem, title);
15779
ref->next = NULL;
15780
15781
add_reference(map, ref);
15782
}
15783
15784
// Returns reference if refmap contains a reference with matching
15785
// label, otherwise NULL.
15786
cmark_reference *cmark_reference_lookup(cmark_reference_map *map,
15787
cmark_chunk *label) {
15788
cmark_reference *ref = NULL;
15789
unsigned char *norm;
15790
unsigned int hash;
15791
15792
if (label->len < 1 || label->len > MAX_LINK_LABEL_LENGTH)
15793
return NULL;
15794
15795
if (map == NULL)
15796
return NULL;
15797
15798
norm = normalize_reference(map->mem, label);
15799
if (norm == NULL)
15800
return NULL;
15801
15802
hash = refhash(norm);
15803
ref = map->table[hash % REFMAP_SIZE];
15804
15805
while (ref) {
15806
if (ref->hash == hash && !strcmp((char *)ref->label, (char *)norm))
15807
break;
15808
ref = ref->next;
15809
}
15810
15811
map->mem->free(norm);
15812
return ref;
15813
}
15814
15815
void cmark_reference_map_free(cmark_reference_map *map) {
15816
unsigned int i;
15817
15818
if (map == NULL)
15819
return;
15820
15821
for (i = 0; i < REFMAP_SIZE; ++i) {
15822
cmark_reference *ref = map->table[i];
15823
cmark_reference *next;
15824
15825
while (ref) {
15826
next = ref->next;
15827
reference_free(map, ref);
15828
ref = next;
15829
}
15830
}
15831
15832
map->mem->free(map);
15833
}
15834
15835
cmark_reference_map *cmark_reference_map_new(cmark_mem *mem) {
15836
cmark_reference_map *map =
15837
(cmark_reference_map *)mem->calloc(1, sizeof(cmark_reference_map));
15838
map->mem = mem;
15839
return map;
15840
}
15841
15842
15843
15844
/**
15845
* Block parsing implementation.
15846
*
15847
* For a high-level overview of the block parsing process,
15848
* see http://spec.commonmark.org/0.24/#phase-1-block-structure
15849
*/
15850
15851
15852
#define CODE_INDENT 4
15853
#define TAB_STOP 4
15854
15855
#ifndef MIN
15856
#define MIN(x, y) ((x < y) ? x : y)
15857
#endif
15858
15859
#define peek_at(i, n) (i)->data[n]
15860
15861
static bool S_last_line_blank(const cmark_node *node) {
15862
return (node->flags & CMARK_NODE__LAST_LINE_BLANK) != 0;
15863
}
15864
15865
static CMARK_INLINE cmark_node_type S_type(const cmark_node *node) {
15866
return (cmark_node_type)node->type;
15867
}
15868
15869
static void S_set_last_line_blank(cmark_node *node, bool is_blank) {
15870
if (is_blank)
15871
node->flags |= CMARK_NODE__LAST_LINE_BLANK;
15872
else
15873
node->flags &= ~CMARK_NODE__LAST_LINE_BLANK;
15874
}
15875
15876
static CMARK_INLINE bool S_is_space_or_tab(char c) {
15877
return (c == ' ' || c == '\t');
15878
}
15879
15880
static void S_parser_feed(cmark_parser *parser, const unsigned char *buffer,
15881
size_t len, bool eof);
15882
15883
static void S_process_line(cmark_parser *parser, const unsigned char *buffer,
15884
bufsize_t bytes);
15885
15886
static cmark_node *make_block(cmark_mem *mem, cmark_node_type tag,
15887
int start_line, int start_column) {
15888
cmark_node *e;
15889
15890
e = (cmark_node *)mem->calloc(1, sizeof(*e));
15891
cmark_strbuf_init(mem, &e->content, 32);
15892
e->type = (uint16_t)tag;
15893
e->flags = CMARK_NODE__OPEN;
15894
e->start_line = start_line;
15895
e->start_column = start_column;
15896
e->end_line = start_line;
15897
15898
return e;
15899
}
15900
15901
// Create a root document node.
15902
static cmark_node *make_document(cmark_mem *mem) {
15903
cmark_node *e = make_block(mem, CMARK_NODE_DOCUMENT, 1, 1);
15904
return e;
15905
}
15906
15907
cmark_parser *cmark_parser_new_with_mem(int options, cmark_mem *mem) {
15908
cmark_parser *parser = (cmark_parser *)mem->calloc(1, sizeof(cmark_parser));
15909
parser->mem = mem;
15910
15911
cmark_node *document = make_document(mem);
15912
15913
cmark_strbuf_init(mem, &parser->curline, 256);
15914
cmark_strbuf_init(mem, &parser->linebuf, 0);
15915
15916
parser->refmap = cmark_reference_map_new(mem);
15917
parser->root = document;
15918
parser->current = document;
15919
parser->line_number = 0;
15920
parser->offset = 0;
15921
parser->column = 0;
15922
parser->first_nonspace = 0;
15923
parser->first_nonspace_column = 0;
15924
parser->indent = 0;
15925
parser->blank = false;
15926
parser->partially_consumed_tab = false;
15927
parser->last_line_length = 0;
15928
parser->options = options;
15929
parser->last_buffer_ended_with_cr = false;
15930
15931
return parser;
15932
}
15933
15934
cmark_parser *cmark_parser_new(int options) {
15935
extern cmark_mem DEFAULT_MEM_ALLOCATOR;
15936
return cmark_parser_new_with_mem(options, &DEFAULT_MEM_ALLOCATOR);
15937
}
15938
15939
void cmark_parser_free(cmark_parser *parser) {
15940
cmark_mem *mem = parser->mem;
15941
cmark_strbuf_free(&parser->curline);
15942
cmark_strbuf_free(&parser->linebuf);
15943
cmark_reference_map_free(parser->refmap);
15944
mem->free(parser);
15945
}
15946
15947
static cmark_node *finalize(cmark_parser *parser, cmark_node *b);
15948
15949
// Returns true if line has only space characters, else false.
15950
static bool is_blank(cmark_strbuf *s, bufsize_t offset) {
15951
while (offset < s->size) {
15952
switch (s->ptr[offset]) {
15953
case '\r':
15954
case '\n':
15955
return true;
15956
case ' ':
15957
offset++;
15958
break;
15959
case '\t':
15960
offset++;
15961
break;
15962
default:
15963
return false;
15964
}
15965
}
15966
15967
return true;
15968
}
15969
15970
static CMARK_INLINE bool can_contain(cmark_node_type parent_type,
15971
cmark_node_type child_type) {
15972
return (parent_type == CMARK_NODE_DOCUMENT ||
15973
parent_type == CMARK_NODE_BLOCK_QUOTE ||
15974
parent_type == CMARK_NODE_ITEM ||
15975
(parent_type == CMARK_NODE_LIST && child_type == CMARK_NODE_ITEM));
15976
}
15977
15978
static CMARK_INLINE bool accepts_lines(cmark_node_type block_type) {
15979
return (block_type == CMARK_NODE_PARAGRAPH ||
15980
block_type == CMARK_NODE_HEADING ||
15981
block_type == CMARK_NODE_CODE_BLOCK);
15982
}
15983
15984
static CMARK_INLINE bool contains_inlines(cmark_node_type block_type) {
15985
return (block_type == CMARK_NODE_PARAGRAPH ||
15986
block_type == CMARK_NODE_HEADING);
15987
}
15988
15989
static void add_line(cmark_node *node, cmark_chunk *ch, cmark_parser *parser) {
15990
int chars_to_tab;
15991
int i;
15992
assert(node->flags & CMARK_NODE__OPEN);
15993
if (parser->partially_consumed_tab) {
15994
parser->offset += 1; // skip over tab
15995
// add space characters:
15996
chars_to_tab = TAB_STOP - (parser->column % TAB_STOP);
15997
for (i = 0; i < chars_to_tab; i++) {
15998
cmark_strbuf_putc(&node->content, ' ');
15999
}
16000
}
16001
cmark_strbuf_put(&node->content, ch->data + parser->offset,
16002
ch->len - parser->offset);
16003
}
16004
16005
static void remove_trailing_blank_lines(cmark_strbuf *ln) {
16006
bufsize_t i;
16007
unsigned char c;
16008
16009
for (i = ln->size - 1; i >= 0; --i) {
16010
c = ln->ptr[i];
16011
16012
if (c != ' ' && c != '\t' && !S_is_line_end_char(c))
16013
break;
16014
}
16015
16016
if (i < 0) {
16017
cmark_strbuf_clear(ln);
16018
return;
16019
}
16020
16021
for (; i < ln->size; ++i) {
16022
c = ln->ptr[i];
16023
16024
if (!S_is_line_end_char(c))
16025
continue;
16026
16027
cmark_strbuf_truncate(ln, i);
16028
break;
16029
}
16030
}
16031
16032
// Check to see if a node ends with a blank line, descending
16033
// if needed into lists and sublists.
16034
static bool ends_with_blank_line(cmark_node *node) {
16035
cmark_node *cur = node;
16036
while (cur != NULL) {
16037
if (S_last_line_blank(cur)) {
16038
return true;
16039
}
16040
if (S_type(cur) == CMARK_NODE_LIST || S_type(cur) == CMARK_NODE_ITEM) {
16041
cur = cur->last_child;
16042
} else {
16043
cur = NULL;
16044
}
16045
}
16046
return false;
16047
}
16048
16049
static cmark_node *finalize(cmark_parser *parser, cmark_node *b) {
16050
bufsize_t pos;
16051
cmark_node *item;
16052
cmark_node *subitem;
16053
cmark_node *parent;
16054
16055
parent = b->parent;
16056
assert(b->flags &
16057
CMARK_NODE__OPEN); // shouldn't call finalize on closed blocks
16058
b->flags &= ~CMARK_NODE__OPEN;
16059
16060
if (parser->curline.size == 0) {
16061
// end of input - line number has not been incremented
16062
b->end_line = parser->line_number;
16063
b->end_column = parser->last_line_length;
16064
} else if (S_type(b) == CMARK_NODE_DOCUMENT ||
16065
(S_type(b) == CMARK_NODE_CODE_BLOCK && b->as.code.fenced) ||
16066
(S_type(b) == CMARK_NODE_HEADING && b->as.heading.setext)) {
16067
b->end_line = parser->line_number;
16068
b->end_column = parser->curline.size;
16069
if (b->end_column && parser->curline.ptr[b->end_column - 1] == '\n')
16070
b->end_column -= 1;
16071
if (b->end_column && parser->curline.ptr[b->end_column - 1] == '\r')
16072
b->end_column -= 1;
16073
} else {
16074
b->end_line = parser->line_number - 1;
16075
b->end_column = parser->last_line_length;
16076
}
16077
16078
cmark_strbuf *node_content = &b->content;
16079
16080
switch (S_type(b)) {
16081
case CMARK_NODE_PARAGRAPH:
16082
while (cmark_strbuf_at(node_content, 0) == '[' &&
16083
(pos = cmark_parse_reference_inline(parser->mem, node_content,
16084
parser->refmap))) {
16085
16086
cmark_strbuf_drop(node_content, pos);
16087
}
16088
if (is_blank(node_content, 0)) {
16089
// remove blank node (former reference def)
16090
cmark_node_free(b);
16091
}
16092
break;
16093
16094
case CMARK_NODE_CODE_BLOCK:
16095
if (!b->as.code.fenced) { // indented code
16096
remove_trailing_blank_lines(node_content);
16097
cmark_strbuf_putc(node_content, '\n');
16098
} else {
16099
// first line of contents becomes info
16100
for (pos = 0; pos < node_content->size; ++pos) {
16101
if (S_is_line_end_char(node_content->ptr[pos]))
16102
break;
16103
}
16104
assert(pos < node_content->size);
16105
16106
cmark_strbuf tmp = CMARK_BUF_INIT(parser->mem);
16107
houdini_unescape_html_f(&tmp, node_content->ptr, pos);
16108
cmark_strbuf_trim(&tmp);
16109
cmark_strbuf_unescape(&tmp);
16110
b->as.code.info = cmark_chunk_buf_detach(&tmp);
16111
16112
if (node_content->ptr[pos] == '\r')
16113
pos += 1;
16114
if (node_content->ptr[pos] == '\n')
16115
pos += 1;
16116
cmark_strbuf_drop(node_content, pos);
16117
}
16118
b->as.code.literal = cmark_chunk_buf_detach(node_content);
16119
break;
16120
16121
case CMARK_NODE_HTML_BLOCK:
16122
b->as.literal = cmark_chunk_buf_detach(node_content);
16123
break;
16124
16125
case CMARK_NODE_LIST: // determine tight/loose status
16126
b->as.list.tight = true; // tight by default
16127
item = b->first_child;
16128
16129
while (item) {
16130
// check for non-final non-empty list item ending with blank line:
16131
if (S_last_line_blank(item) && item->next) {
16132
b->as.list.tight = false;
16133
break;
16134
}
16135
// recurse into children of list item, to see if there are
16136
// spaces between them:
16137
subitem = item->first_child;
16138
while (subitem) {
16139
if (ends_with_blank_line(subitem) && (item->next || subitem->next)) {
16140
b->as.list.tight = false;
16141
break;
16142
}
16143
subitem = subitem->next;
16144
}
16145
if (!(b->as.list.tight)) {
16146
break;
16147
}
16148
item = item->next;
16149
}
16150
16151
break;
16152
16153
default:
16154
break;
16155
}
16156
16157
return parent;
16158
}
16159
16160
// Add a node as child of another. Return pointer to child.
16161
static cmark_node *add_child(cmark_parser *parser, cmark_node *parent,
16162
cmark_node_type block_type, int start_column) {
16163
assert(parent);
16164
16165
// if 'parent' isn't the kind of node that can accept this child,
16166
// then back up til we hit a node that can.
16167
while (!can_contain(S_type(parent), block_type)) {
16168
parent = finalize(parser, parent);
16169
}
16170
16171
cmark_node *child =
16172
make_block(parser->mem, block_type, parser->line_number, start_column);
16173
child->parent = parent;
16174
16175
if (parent->last_child) {
16176
parent->last_child->next = child;
16177
child->prev = parent->last_child;
16178
} else {
16179
parent->first_child = child;
16180
child->prev = NULL;
16181
}
16182
parent->last_child = child;
16183
return child;
16184
}
16185
16186
// Walk through node and all children, recursively, parsing
16187
// string content into inline content where appropriate.
16188
static void process_inlines(cmark_mem *mem, cmark_node *root,
16189
cmark_reference_map *refmap, int options) {
16190
cmark_iter *iter = cmark_iter_new(root);
16191
cmark_node *cur;
16192
cmark_event_type ev_type;
16193
16194
while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
16195
cur = cmark_iter_get_node(iter);
16196
if (ev_type == CMARK_EVENT_ENTER) {
16197
if (contains_inlines(S_type(cur))) {
16198
cmark_parse_inlines(mem, cur, refmap, options);
16199
}
16200
}
16201
}
16202
16203
cmark_iter_free(iter);
16204
}
16205
16206
// Attempts to parse a list item marker (bullet or enumerated).
16207
// On success, returns length of the marker, and populates
16208
// data with the details. On failure, returns 0.
16209
static bufsize_t parse_list_marker(cmark_mem *mem, cmark_chunk *input,
16210
bufsize_t pos, bool interrupts_paragraph,
16211
cmark_list **dataptr) {
16212
unsigned char c;
16213
bufsize_t startpos;
16214
cmark_list *data;
16215
bufsize_t i;
16216
16217
startpos = pos;
16218
c = peek_at(input, pos);
16219
16220
if (c == '*' || c == '-' || c == '+') {
16221
pos++;
16222
if (!cmark_isspace(peek_at(input, pos))) {
16223
return 0;
16224
}
16225
16226
if (interrupts_paragraph) {
16227
i = pos;
16228
// require non-blank content after list marker:
16229
while (S_is_space_or_tab(peek_at(input, i))) {
16230
i++;
16231
}
16232
if (peek_at(input, i) == '\n') {
16233
return 0;
16234
}
16235
}
16236
16237
data = (cmark_list *)mem->calloc(1, sizeof(*data));
16238
data->marker_offset = 0; // will be adjusted later
16239
data->list_type = CMARK_BULLET_LIST;
16240
data->bullet_char = c;
16241
data->start = 1;
16242
data->delimiter = CMARK_PERIOD_DELIM;
16243
data->tight = false;
16244
} else if (cmark_isdigit(c)) {
16245
int start = 0;
16246
int digits = 0;
16247
16248
do {
16249
start = (10 * start) + (peek_at(input, pos) - '0');
16250
pos++;
16251
digits++;
16252
// We limit to 9 digits to avoid overflow,
16253
// assuming max int is 2^31 - 1
16254
// This also seems to be the limit for 'start' in some browsers.
16255
} while (digits < 9 && cmark_isdigit(peek_at(input, pos)));
16256
16257
if (interrupts_paragraph && start != 1) {
16258
return 0;
16259
}
16260
c = peek_at(input, pos);
16261
if (c == '.' || c == ')') {
16262
pos++;
16263
if (!cmark_isspace(peek_at(input, pos))) {
16264
return 0;
16265
}
16266
if (interrupts_paragraph) {
16267
// require non-blank content after list marker:
16268
i = pos;
16269
while (S_is_space_or_tab(peek_at(input, i))) {
16270
i++;
16271
}
16272
if (S_is_line_end_char(peek_at(input, i))) {
16273
return 0;
16274
}
16275
}
16276
16277
data = (cmark_list *)mem->calloc(1, sizeof(*data));
16278
data->marker_offset = 0; // will be adjusted later
16279
data->list_type = CMARK_ORDERED_LIST;
16280
data->bullet_char = 0;
16281
data->start = start;
16282
data->delimiter = (c == '.' ? CMARK_PERIOD_DELIM : CMARK_PAREN_DELIM);
16283
data->tight = false;
16284
} else {
16285
return 0;
16286
}
16287
} else {
16288
return 0;
16289
}
16290
16291
*dataptr = data;
16292
return (pos - startpos);
16293
}
16294
16295
// Return 1 if list item belongs in list, else 0.
16296
static int lists_match(cmark_list *list_data, cmark_list *item_data) {
16297
return (list_data->list_type == item_data->list_type &&
16298
list_data->delimiter == item_data->delimiter &&
16299
// list_data->marker_offset == item_data.marker_offset &&
16300
list_data->bullet_char == item_data->bullet_char);
16301
}
16302
16303
static cmark_node *finalize_document(cmark_parser *parser) {
16304
while (parser->current != parser->root) {
16305
parser->current = finalize(parser, parser->current);
16306
}
16307
16308
finalize(parser, parser->root);
16309
process_inlines(parser->mem, parser->root, parser->refmap, parser->options);
16310
16311
return parser->root;
16312
}
16313
16314
cmark_node *cmark_parse_file(FILE *f, int options) {
16315
unsigned char buffer[4096];
16316
cmark_parser *parser = cmark_parser_new(options);
16317
size_t bytes;
16318
cmark_node *document;
16319
16320
while ((bytes = fread(buffer, 1, sizeof(buffer), f)) > 0) {
16321
bool eof = bytes < sizeof(buffer);
16322
S_parser_feed(parser, buffer, bytes, eof);
16323
if (eof) {
16324
break;
16325
}
16326
}
16327
16328
document = cmark_parser_finish(parser);
16329
cmark_parser_free(parser);
16330
return document;
16331
}
16332
16333
cmark_node *cmark_parse_document(const char *buffer, size_t len, int options) {
16334
cmark_parser *parser = cmark_parser_new(options);
16335
cmark_node *document;
16336
16337
S_parser_feed(parser, (const unsigned char *)buffer, len, true);
16338
16339
document = cmark_parser_finish(parser);
16340
cmark_parser_free(parser);
16341
return document;
16342
}
16343
16344
void cmark_parser_feed(cmark_parser *parser, const char *buffer, size_t len) {
16345
S_parser_feed(parser, (const unsigned char *)buffer, len, false);
16346
}
16347
16348
static void S_parser_feed(cmark_parser *parser, const unsigned char *buffer,
16349
size_t len, bool eof) {
16350
const unsigned char *end = buffer + len;
16351
static const uint8_t repl[] = {239, 191, 189};
16352
16353
if (parser->last_buffer_ended_with_cr && *buffer == '\n') {
16354
// skip NL if last buffer ended with CR ; see #117
16355
buffer++;
16356
}
16357
parser->last_buffer_ended_with_cr = false;
16358
while (buffer < end) {
16359
const unsigned char *eol;
16360
bufsize_t chunk_len;
16361
bool process = false;
16362
for (eol = buffer; eol < end; ++eol) {
16363
if (S_is_line_end_char(*eol)) {
16364
process = true;
16365
break;
16366
}
16367
if (*eol == '\0' && eol < end) {
16368
break;
16369
}
16370
}
16371
if (eol >= end && eof) {
16372
process = true;
16373
}
16374
16375
chunk_len = (eol - buffer);
16376
if (process) {
16377
if (parser->linebuf.size > 0) {
16378
cmark_strbuf_put(&parser->linebuf, buffer, chunk_len);
16379
S_process_line(parser, parser->linebuf.ptr, parser->linebuf.size);
16380
cmark_strbuf_clear(&parser->linebuf);
16381
} else {
16382
S_process_line(parser, buffer, chunk_len);
16383
}
16384
} else {
16385
if (eol < end && *eol == '\0') {
16386
// omit NULL byte
16387
cmark_strbuf_put(&parser->linebuf, buffer, chunk_len);
16388
// add replacement character
16389
cmark_strbuf_put(&parser->linebuf, repl, 3);
16390
} else {
16391
cmark_strbuf_put(&parser->linebuf, buffer, chunk_len);
16392
}
16393
}
16394
16395
buffer += chunk_len;
16396
if (buffer < end) {
16397
if (*buffer == '\0') {
16398
// skip over NULL
16399
buffer++;
16400
} else {
16401
// skip over line ending characters
16402
if (*buffer == '\r') {
16403
buffer++;
16404
if (buffer == end)
16405
parser->last_buffer_ended_with_cr = true;
16406
}
16407
if (buffer < end && *buffer == '\n')
16408
buffer++;
16409
}
16410
}
16411
}
16412
}
16413
16414
static void chop_trailing_hashtags(cmark_chunk *ch) {
16415
bufsize_t n, orig_n;
16416
16417
cmark_chunk_rtrim(ch);
16418
orig_n = n = ch->len - 1;
16419
16420
// if string ends in space followed by #s, remove these:
16421
while (n >= 0 && peek_at(ch, n) == '#')
16422
n--;
16423
16424
// Check for a space before the final #s:
16425
if (n != orig_n && n >= 0 && S_is_space_or_tab(peek_at(ch, n))) {
16426
ch->len = n;
16427
cmark_chunk_rtrim(ch);
16428
}
16429
}
16430
16431
// Find first nonspace character from current offset, setting
16432
// parser->first_nonspace, parser->first_nonspace_column,
16433
// parser->indent, and parser->blank. Does not advance parser->offset.
16434
static void S_find_first_nonspace(cmark_parser *parser, cmark_chunk *input) {
16435
char c;
16436
int chars_to_tab = TAB_STOP - (parser->column % TAB_STOP);
16437
16438
parser->first_nonspace = parser->offset;
16439
parser->first_nonspace_column = parser->column;
16440
while ((c = peek_at(input, parser->first_nonspace))) {
16441
if (c == ' ') {
16442
parser->first_nonspace += 1;
16443
parser->first_nonspace_column += 1;
16444
chars_to_tab = chars_to_tab - 1;
16445
if (chars_to_tab == 0) {
16446
chars_to_tab = TAB_STOP;
16447
}
16448
} else if (c == '\t') {
16449
parser->first_nonspace += 1;
16450
parser->first_nonspace_column += chars_to_tab;
16451
chars_to_tab = TAB_STOP;
16452
} else {
16453
break;
16454
}
16455
}
16456
16457
parser->indent = parser->first_nonspace_column - parser->column;
16458
parser->blank = S_is_line_end_char(peek_at(input, parser->first_nonspace));
16459
}
16460
16461
// Advance parser->offset and parser->column. parser->offset is the
16462
// byte position in input; parser->column is a virtual column number
16463
// that takes into account tabs. (Multibyte characters are not taken
16464
// into account, because the Markdown line prefixes we are interested in
16465
// analyzing are entirely ASCII.) The count parameter indicates
16466
// how far to advance the offset. If columns is true, then count
16467
// indicates a number of columns; otherwise, a number of bytes.
16468
// If advancing a certain number of columns partially consumes
16469
// a tab character, parser->partially_consumed_tab is set to true.
16470
static void S_advance_offset(cmark_parser *parser, cmark_chunk *input,
16471
bufsize_t count, bool columns) {
16472
char c;
16473
int chars_to_tab;
16474
int chars_to_advance;
16475
while (count > 0 && (c = peek_at(input, parser->offset))) {
16476
if (c == '\t') {
16477
chars_to_tab = TAB_STOP - (parser->column % TAB_STOP);
16478
if (columns) {
16479
parser->partially_consumed_tab = chars_to_tab > count;
16480
chars_to_advance = MIN(count, chars_to_tab);
16481
parser->column += chars_to_advance;
16482
parser->offset += (parser->partially_consumed_tab ? 0 : 1);
16483
count -= chars_to_advance;
16484
} else {
16485
parser->partially_consumed_tab = false;
16486
parser->column += chars_to_tab;
16487
parser->offset += 1;
16488
count -= 1;
16489
}
16490
} else {
16491
parser->partially_consumed_tab = false;
16492
parser->offset += 1;
16493
parser->column += 1; // assume ascii; block starts are ascii
16494
count -= 1;
16495
}
16496
}
16497
}
16498
16499
static bool S_last_child_is_open(cmark_node *container) {
16500
return container->last_child &&
16501
(container->last_child->flags & CMARK_NODE__OPEN);
16502
}
16503
16504
static bool parse_block_quote_prefix(cmark_parser *parser, cmark_chunk *input) {
16505
bool res = false;
16506
bufsize_t matched = 0;
16507
16508
matched =
16509
parser->indent <= 3 && peek_at(input, parser->first_nonspace) == '>';
16510
if (matched) {
16511
16512
S_advance_offset(parser, input, parser->indent + 1, true);
16513
16514
if (S_is_space_or_tab(peek_at(input, parser->offset))) {
16515
S_advance_offset(parser, input, 1, true);
16516
}
16517
16518
res = true;
16519
}
16520
return res;
16521
}
16522
16523
static bool parse_node_item_prefix(cmark_parser *parser, cmark_chunk *input,
16524
cmark_node *container) {
16525
bool res = false;
16526
16527
if (parser->indent >=
16528
container->as.list.marker_offset + container->as.list.padding) {
16529
S_advance_offset(parser, input, container->as.list.marker_offset +
16530
container->as.list.padding,
16531
true);
16532
res = true;
16533
} else if (parser->blank && container->first_child != NULL) {
16534
// if container->first_child is NULL, then the opening line
16535
// of the list item was blank after the list marker; in this
16536
// case, we are done with the list item.
16537
S_advance_offset(parser, input, parser->first_nonspace - parser->offset,
16538
false);
16539
res = true;
16540
}
16541
return res;
16542
}
16543
16544
static bool parse_code_block_prefix(cmark_parser *parser, cmark_chunk *input,
16545
cmark_node *container,
16546
bool *should_continue) {
16547
bool res = false;
16548
16549
if (!container->as.code.fenced) { // indented
16550
if (parser->indent >= CODE_INDENT) {
16551
S_advance_offset(parser, input, CODE_INDENT, true);
16552
res = true;
16553
} else if (parser->blank) {
16554
S_advance_offset(parser, input, parser->first_nonspace - parser->offset,
16555
false);
16556
res = true;
16557
}
16558
} else { // fenced
16559
bufsize_t matched = 0;
16560
16561
if (parser->indent <= 3 && (peek_at(input, parser->first_nonspace) ==
16562
container->as.code.fence_char)) {
16563
matched = scan_close_code_fence(input, parser->first_nonspace);
16564
}
16565
16566
if (matched >= container->as.code.fence_length) {
16567
// closing fence - and since we're at
16568
// the end of a line, we can stop processing it:
16569
*should_continue = false;
16570
S_advance_offset(parser, input, matched, false);
16571
parser->current = finalize(parser, container);
16572
} else {
16573
// skip opt. spaces of fence parser->offset
16574
int i = container->as.code.fence_offset;
16575
16576
while (i > 0 && S_is_space_or_tab(peek_at(input, parser->offset))) {
16577
S_advance_offset(parser, input, 1, true);
16578
i--;
16579
}
16580
res = true;
16581
}
16582
}
16583
16584
return res;
16585
}
16586
16587
static bool parse_html_block_prefix(cmark_parser *parser,
16588
cmark_node *container) {
16589
bool res = false;
16590
int html_block_type = container->as.html_block_type;
16591
16592
assert(html_block_type >= 1 && html_block_type <= 7);
16593
switch (html_block_type) {
16594
case 1:
16595
case 2:
16596
case 3:
16597
case 4:
16598
case 5:
16599
// these types of blocks can accept blanks
16600
res = true;
16601
break;
16602
case 6:
16603
case 7:
16604
res = !parser->blank;
16605
break;
16606
}
16607
16608
return res;
16609
}
16610
16611
/**
16612
* For each containing node, try to parse the associated line start.
16613
*
16614
* Will not close unmatched blocks, as we may have a lazy continuation
16615
* line -> http://spec.commonmark.org/0.24/#lazy-continuation-line
16616
*
16617
* Returns: The last matching node, or NULL
16618
*/
16619
static cmark_node *check_open_blocks(cmark_parser *parser, cmark_chunk *input,
16620
bool *all_matched) {
16621
bool should_continue = true;
16622
*all_matched = false;
16623
cmark_node *container = parser->root;
16624
cmark_node_type cont_type;
16625
16626
while (S_last_child_is_open(container)) {
16627
container = container->last_child;
16628
cont_type = S_type(container);
16629
16630
S_find_first_nonspace(parser, input);
16631
16632
switch (cont_type) {
16633
case CMARK_NODE_BLOCK_QUOTE:
16634
if (!parse_block_quote_prefix(parser, input))
16635
goto done;
16636
break;
16637
case CMARK_NODE_ITEM:
16638
if (!parse_node_item_prefix(parser, input, container))
16639
goto done;
16640
break;
16641
case CMARK_NODE_CODE_BLOCK:
16642
if (!parse_code_block_prefix(parser, input, container, &should_continue))
16643
goto done;
16644
break;
16645
case CMARK_NODE_HEADING:
16646
// a heading can never contain more than one line
16647
goto done;
16648
case CMARK_NODE_HTML_BLOCK:
16649
if (!parse_html_block_prefix(parser, container))
16650
goto done;
16651
break;
16652
case CMARK_NODE_PARAGRAPH:
16653
if (parser->blank)
16654
goto done;
16655
break;
16656
default:
16657
break;
16658
}
16659
}
16660
16661
*all_matched = true;
16662
16663
done:
16664
if (!*all_matched) {
16665
container = container->parent; // back up to last matching node
16666
}
16667
16668
if (!should_continue) {
16669
container = NULL;
16670
}
16671
16672
return container;
16673
}
16674
16675
static void open_new_blocks(cmark_parser *parser, cmark_node **container,
16676
cmark_chunk *input, bool all_matched) {
16677
bool indented;
16678
cmark_list *data = NULL;
16679
bool maybe_lazy = S_type(parser->current) == CMARK_NODE_PARAGRAPH;
16680
cmark_node_type cont_type = S_type(*container);
16681
bufsize_t matched = 0;
16682
int lev = 0;
16683
bool save_partially_consumed_tab;
16684
int save_offset;
16685
int save_column;
16686
16687
while (cont_type != CMARK_NODE_CODE_BLOCK &&
16688
cont_type != CMARK_NODE_HTML_BLOCK) {
16689
16690
S_find_first_nonspace(parser, input);
16691
indented = parser->indent >= CODE_INDENT;
16692
16693
if (!indented && peek_at(input, parser->first_nonspace) == '>') {
16694
16695
bufsize_t blockquote_startpos = parser->first_nonspace;
16696
16697
S_advance_offset(parser, input,
16698
parser->first_nonspace + 1 - parser->offset, false);
16699
// optional following character
16700
if (S_is_space_or_tab(peek_at(input, parser->offset))) {
16701
S_advance_offset(parser, input, 1, true);
16702
}
16703
*container = add_child(parser, *container, CMARK_NODE_BLOCK_QUOTE,
16704
blockquote_startpos + 1);
16705
16706
} else if (!indented && (matched = scan_atx_heading_start(
16707
input, parser->first_nonspace))) {
16708
bufsize_t hashpos;
16709
int level = 0;
16710
bufsize_t heading_startpos = parser->first_nonspace;
16711
16712
S_advance_offset(parser, input,
16713
parser->first_nonspace + matched - parser->offset,
16714
false);
16715
*container = add_child(parser, *container, CMARK_NODE_HEADING,
16716
heading_startpos + 1);
16717
16718
hashpos = cmark_chunk_strchr(input, '#', parser->first_nonspace);
16719
16720
while (peek_at(input, hashpos) == '#') {
16721
level++;
16722
hashpos++;
16723
}
16724
16725
(*container)->as.heading.level = level;
16726
(*container)->as.heading.setext = false;
16727
16728
} else if (!indented && (matched = scan_open_code_fence(
16729
input, parser->first_nonspace))) {
16730
*container = add_child(parser, *container, CMARK_NODE_CODE_BLOCK,
16731
parser->first_nonspace + 1);
16732
(*container)->as.code.fenced = true;
16733
(*container)->as.code.fence_char = peek_at(input, parser->first_nonspace);
16734
(*container)->as.code.fence_length = (matched > 255) ? 255 : matched;
16735
(*container)->as.code.fence_offset =
16736
(int8_t)(parser->first_nonspace - parser->offset);
16737
(*container)->as.code.info = cmark_chunk_literal("");
16738
S_advance_offset(parser, input,
16739
parser->first_nonspace + matched - parser->offset,
16740
false);
16741
16742
} else if (!indented && ((matched = scan_html_block_start(
16743
input, parser->first_nonspace)) ||
16744
(cont_type != CMARK_NODE_PARAGRAPH &&
16745
(matched = scan_html_block_start_7(
16746
input, parser->first_nonspace))))) {
16747
*container = add_child(parser, *container, CMARK_NODE_HTML_BLOCK,
16748
parser->first_nonspace + 1);
16749
(*container)->as.html_block_type = matched;
16750
// note, we don't adjust parser->offset because the tag is part of the
16751
// text
16752
} else if (!indented && cont_type == CMARK_NODE_PARAGRAPH &&
16753
(lev =
16754
scan_setext_heading_line(input, parser->first_nonspace))) {
16755
(*container)->type = (uint16_t)CMARK_NODE_HEADING;
16756
(*container)->as.heading.level = lev;
16757
(*container)->as.heading.setext = true;
16758
S_advance_offset(parser, input, input->len - 1 - parser->offset, false);
16759
} else if (!indented &&
16760
!(cont_type == CMARK_NODE_PARAGRAPH && !all_matched) &&
16761
(matched = scan_thematic_break(input, parser->first_nonspace))) {
16762
// it's only now that we know the line is not part of a setext heading:
16763
*container = add_child(parser, *container, CMARK_NODE_THEMATIC_BREAK,
16764
parser->first_nonspace + 1);
16765
S_advance_offset(parser, input, input->len - 1 - parser->offset, false);
16766
} else if ((!indented || cont_type == CMARK_NODE_LIST) &&
16767
(matched = parse_list_marker(
16768
parser->mem, input, parser->first_nonspace,
16769
(*container)->type == CMARK_NODE_PARAGRAPH, &data))) {
16770
16771
// Note that we can have new list items starting with >= 4
16772
// spaces indent, as long as the list container is still open.
16773
int i = 0;
16774
16775
// compute padding:
16776
S_advance_offset(parser, input,
16777
parser->first_nonspace + matched - parser->offset,
16778
false);
16779
16780
save_partially_consumed_tab = parser->partially_consumed_tab;
16781
save_offset = parser->offset;
16782
save_column = parser->column;
16783
16784
while (parser->column - save_column <= 5 &&
16785
S_is_space_or_tab(peek_at(input, parser->offset))) {
16786
S_advance_offset(parser, input, 1, true);
16787
}
16788
16789
i = parser->column - save_column;
16790
if (i >= 5 || i < 1 ||
16791
// only spaces after list marker:
16792
S_is_line_end_char(peek_at(input, parser->offset))) {
16793
data->padding = matched + 1;
16794
parser->offset = save_offset;
16795
parser->column = save_column;
16796
parser->partially_consumed_tab = save_partially_consumed_tab;
16797
if (i > 0) {
16798
S_advance_offset(parser, input, 1, true);
16799
}
16800
} else {
16801
data->padding = matched + i;
16802
}
16803
16804
// check container; if it's a list, see if this list item
16805
// can continue the list; otherwise, create a list container.
16806
16807
data->marker_offset = parser->indent;
16808
16809
if (cont_type != CMARK_NODE_LIST ||
16810
!lists_match(&((*container)->as.list), data)) {
16811
*container = add_child(parser, *container, CMARK_NODE_LIST,
16812
parser->first_nonspace + 1);
16813
16814
memcpy(&((*container)->as.list), data, sizeof(*data));
16815
}
16816
16817
// add the list item
16818
*container = add_child(parser, *container, CMARK_NODE_ITEM,
16819
parser->first_nonspace + 1);
16820
/* TODO: static */
16821
memcpy(&((*container)->as.list), data, sizeof(*data));
16822
parser->mem->free(data);
16823
} else if (indented && !maybe_lazy && !parser->blank) {
16824
S_advance_offset(parser, input, CODE_INDENT, true);
16825
*container = add_child(parser, *container, CMARK_NODE_CODE_BLOCK,
16826
parser->offset + 1);
16827
(*container)->as.code.fenced = false;
16828
(*container)->as.code.fence_char = 0;
16829
(*container)->as.code.fence_length = 0;
16830
(*container)->as.code.fence_offset = 0;
16831
(*container)->as.code.info = cmark_chunk_literal("");
16832
16833
} else {
16834
break;
16835
}
16836
16837
if (accepts_lines(S_type(*container))) {
16838
// if it's a line container, it can't contain other containers
16839
break;
16840
}
16841
16842
cont_type = S_type(*container);
16843
maybe_lazy = false;
16844
}
16845
}
16846
16847
static void add_text_to_container(cmark_parser *parser, cmark_node *container,
16848
cmark_node *last_matched_container,
16849
cmark_chunk *input) {
16850
cmark_node *tmp;
16851
// what remains at parser->offset is a text line. add the text to the
16852
// appropriate container.
16853
16854
S_find_first_nonspace(parser, input);
16855
16856
if (parser->blank && container->last_child)
16857
S_set_last_line_blank(container->last_child, true);
16858
16859
// block quote lines are never blank as they start with >
16860
// and we don't count blanks in fenced code for purposes of tight/loose
16861
// lists or breaking out of lists. we also don't set last_line_blank
16862
// on an empty list item.
16863
const cmark_node_type ctype = S_type(container);
16864
const bool last_line_blank =
16865
(parser->blank && ctype != CMARK_NODE_BLOCK_QUOTE &&
16866
ctype != CMARK_NODE_HEADING && ctype != CMARK_NODE_THEMATIC_BREAK &&
16867
!(ctype == CMARK_NODE_CODE_BLOCK && container->as.code.fenced) &&
16868
!(ctype == CMARK_NODE_ITEM && container->first_child == NULL &&
16869
container->start_line == parser->line_number));
16870
16871
S_set_last_line_blank(container, last_line_blank);
16872
16873
tmp = container;
16874
while (tmp->parent) {
16875
S_set_last_line_blank(tmp->parent, false);
16876
tmp = tmp->parent;
16877
}
16878
16879
// If the last line processed belonged to a paragraph node,
16880
// and we didn't match all of the line prefixes for the open containers,
16881
// and we didn't start any new containers,
16882
// and the line isn't blank,
16883
// then treat this as a "lazy continuation line" and add it to
16884
// the open paragraph.
16885
if (parser->current != last_matched_container &&
16886
container == last_matched_container && !parser->blank &&
16887
S_type(parser->current) == CMARK_NODE_PARAGRAPH) {
16888
add_line(parser->current, input, parser);
16889
} else { // not a lazy continuation
16890
// Finalize any blocks that were not matched and set cur to container:
16891
while (parser->current != last_matched_container) {
16892
parser->current = finalize(parser, parser->current);
16893
assert(parser->current != NULL);
16894
}
16895
16896
if (S_type(container) == CMARK_NODE_CODE_BLOCK) {
16897
add_line(container, input, parser);
16898
} else if (S_type(container) == CMARK_NODE_HTML_BLOCK) {
16899
add_line(container, input, parser);
16900
16901
int matches_end_condition;
16902
switch (container->as.html_block_type) {
16903
case 1:
16904
// </script>, </style>, </pre>
16905
matches_end_condition =
16906
scan_html_block_end_1(input, parser->first_nonspace);
16907
break;
16908
case 2:
16909
// -->
16910
matches_end_condition =
16911
scan_html_block_end_2(input, parser->first_nonspace);
16912
break;
16913
case 3:
16914
// ?>
16915
matches_end_condition =
16916
scan_html_block_end_3(input, parser->first_nonspace);
16917
break;
16918
case 4:
16919
// >
16920
matches_end_condition =
16921
scan_html_block_end_4(input, parser->first_nonspace);
16922
break;
16923
case 5:
16924
// ]]>
16925
matches_end_condition =
16926
scan_html_block_end_5(input, parser->first_nonspace);
16927
break;
16928
default:
16929
matches_end_condition = 0;
16930
break;
16931
}
16932
16933
if (matches_end_condition) {
16934
container = finalize(parser, container);
16935
assert(parser->current != NULL);
16936
}
16937
} else if (parser->blank) {
16938
// ??? do nothing
16939
} else if (accepts_lines(S_type(container))) {
16940
if (S_type(container) == CMARK_NODE_HEADING &&
16941
container->as.heading.setext == false) {
16942
chop_trailing_hashtags(input);
16943
}
16944
S_advance_offset(parser, input, parser->first_nonspace - parser->offset,
16945
false);
16946
add_line(container, input, parser);
16947
} else {
16948
// create paragraph container for line
16949
container = add_child(parser, container, CMARK_NODE_PARAGRAPH,
16950
parser->first_nonspace + 1);
16951
S_advance_offset(parser, input, parser->first_nonspace - parser->offset,
16952
false);
16953
add_line(container, input, parser);
16954
}
16955
16956
parser->current = container;
16957
}
16958
}
16959
16960
/* See http://spec.commonmark.org/0.24/#phase-1-block-structure */
16961
static void S_process_line(cmark_parser *parser, const unsigned char *buffer,
16962
bufsize_t bytes) {
16963
cmark_node *last_matched_container;
16964
bool all_matched = true;
16965
cmark_node *container;
16966
cmark_chunk input;
16967
16968
if (parser->options & CMARK_OPT_VALIDATE_UTF8)
16969
cmark_utf8proc_check(&parser->curline, buffer, bytes);
16970
else
16971
cmark_strbuf_put(&parser->curline, buffer, bytes);
16972
16973
// ensure line ends with a newline:
16974
if (bytes == 0 || !S_is_line_end_char(parser->curline.ptr[bytes - 1]))
16975
cmark_strbuf_putc(&parser->curline, '\n');
16976
16977
parser->offset = 0;
16978
parser->column = 0;
16979
parser->blank = false;
16980
parser->partially_consumed_tab = false;
16981
16982
input.data = parser->curline.ptr;
16983
input.len = parser->curline.size;
16984
input.alloc = 0;
16985
16986
parser->line_number++;
16987
16988
last_matched_container = check_open_blocks(parser, &input, &all_matched);
16989
16990
if (!last_matched_container)
16991
goto finished;
16992
16993
container = last_matched_container;
16994
16995
open_new_blocks(parser, &container, &input, all_matched);
16996
16997
add_text_to_container(parser, container, last_matched_container, &input);
16998
16999
finished:
17000
parser->last_line_length = input.len;
17001
if (parser->last_line_length &&
17002
input.data[parser->last_line_length - 1] == '\n')
17003
parser->last_line_length -= 1;
17004
if (parser->last_line_length &&
17005
input.data[parser->last_line_length - 1] == '\r')
17006
parser->last_line_length -= 1;
17007
17008
cmark_strbuf_clear(&parser->curline);
17009
}
17010
17011
cmark_node *cmark_parser_finish(cmark_parser *parser) {
17012
if (parser->linebuf.size) {
17013
S_process_line(parser, parser->linebuf.ptr, parser->linebuf.size);
17014
cmark_strbuf_clear(&parser->linebuf);
17015
}
17016
17017
finalize_document(parser);
17018
17019
if (parser->options & CMARK_OPT_NORMALIZE) {
17020
cmark_consolidate_text_nodes(parser->root);
17021
}
17022
17023
cmark_strbuf_free(&parser->curline);
17024
17025
#if CMARK_DEBUG_NODES
17026
if (cmark_node_check(parser->root, stderr)) {
17027
abort();
17028
}
17029
#endif
17030
return parser->root;
17031
}
17032
17033
17034
17035
const char *cmark_version_string() { return CMARK_VERSION_STRING; }
17036
17037
static void *xcalloc(size_t nmem, size_t size) {
17038
void *ptr = calloc(nmem, size);
17039
if (!ptr)
17040
abort();
17041
return ptr;
17042
}
17043
17044
static void *xrealloc(void *ptr, size_t size) {
17045
void *new_ptr = realloc(ptr, size);
17046
if (!new_ptr)
17047
abort();
17048
return new_ptr;
17049
}
17050
17051
cmark_mem DEFAULT_MEM_ALLOCATOR = {xcalloc, xrealloc, free};
17052
17053
char *cmark_markdown_to_html(const char *text, size_t len, int options) {
17054
cmark_node *doc;
17055
char *result;
17056
17057
doc = cmark_parse_document(text, len, options);
17058
17059
result = cmark_render_html(doc, options);
17060
cmark_node_free(doc);
17061
17062
return result;
17063
}
17064
17065
17066
17067
/** 1 = space, 2 = punct, 3 = digit, 4 = alpha, 0 = other
17068
*/
17069
static const uint8_t cmark_ctype_class[256] = {
17070
/* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
17071
/* 0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0,
17072
/* 1 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
17073
/* 2 */ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
17074
/* 3 */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2,
17075
/* 4 */ 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
17076
/* 5 */ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2,
17077
/* 6 */ 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
17078
/* 7 */ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 0,
17079
/* 8 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
17080
/* 9 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
17081
/* a */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
17082
/* b */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
17083
/* c */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
17084
/* d */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
17085
/* e */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
17086
/* f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
17087
17088
/**
17089
* Returns 1 if c is a "whitespace" character as defined by the spec.
17090
*/
17091
int cmark_isspace(char c) { return cmark_ctype_class[(uint8_t)c] == 1; }
17092
17093
/**
17094
* Returns 1 if c is an ascii punctuation character.
17095
*/
17096
int cmark_ispunct(char c) { return cmark_ctype_class[(uint8_t)c] == 2; }
17097
17098
int cmark_isalnum(char c) {
17099
uint8_t result;
17100
result = cmark_ctype_class[(uint8_t)c];
17101
return (result == 3 || result == 4);
17102
}
17103
17104
int cmark_isdigit(char c) { return cmark_ctype_class[(uint8_t)c] == 3; }
17105
17106
int cmark_isalpha(char c) { return cmark_ctype_class[(uint8_t)c] == 4; }
17107
17108
17109
17110
#include <stdarg.h>
17111
#include <string.h>
17112
#include <assert.h>
17113
#include <string.h>
17114
#include <stdio.h>
17115
#include <stdlib.h>
17116
#include <stdint.h>
17117
#include <limits.h>
17118
17119
17120
/* Used as default value for cmark_strbuf->ptr so that people can always
17121
* assume ptr is non-NULL and zero terminated even for new cmark_strbufs.
17122
*/
17123
unsigned char cmark_strbuf__initbuf[1];
17124
17125
#ifndef MIN
17126
#define MIN(x, y) ((x < y) ? x : y)
17127
#endif
17128
17129
void cmark_strbuf_init(cmark_mem *mem, cmark_strbuf *buf,
17130
bufsize_t initial_size) {
17131
buf->mem = mem;
17132
buf->asize = 0;
17133
buf->size = 0;
17134
buf->ptr = cmark_strbuf__initbuf;
17135
17136
if (initial_size > 0)
17137
cmark_strbuf_grow(buf, initial_size);
17138
}
17139
17140
static CMARK_INLINE void S_strbuf_grow_by(cmark_strbuf *buf, bufsize_t add) {
17141
cmark_strbuf_grow(buf, buf->size + add);
17142
}
17143
17144
void cmark_strbuf_grow(cmark_strbuf *buf, bufsize_t target_size) {
17145
assert(target_size > 0);
17146
17147
if (target_size < buf->asize)
17148
return;
17149
17150
if (target_size > (bufsize_t)(INT32_MAX / 2))
17151
abort();
17152
17153
/* Oversize the buffer by 50% to guarantee amortized linear time
17154
* complexity on append operations. */
17155
bufsize_t new_size = target_size + target_size / 2;
17156
new_size += 1;
17157
new_size = (new_size + 7) & ~7;
17158
17159
buf->ptr = (unsigned char *)buf->mem->realloc(buf->asize ? buf->ptr : NULL,
17160
new_size);
17161
buf->asize = new_size;
17162
}
17163
17164
bufsize_t cmark_strbuf_len(const cmark_strbuf *buf) { return buf->size; }
17165
17166
void cmark_strbuf_free(cmark_strbuf *buf) {
17167
if (!buf)
17168
return;
17169
17170
if (buf->ptr != cmark_strbuf__initbuf)
17171
buf->mem->free(buf->ptr);
17172
17173
cmark_strbuf_init(buf->mem, buf, 0);
17174
}
17175
17176
void cmark_strbuf_clear(cmark_strbuf *buf) {
17177
buf->size = 0;
17178
17179
if (buf->asize > 0)
17180
buf->ptr[0] = '\0';
17181
}
17182
17183
void cmark_strbuf_set(cmark_strbuf *buf, const unsigned char *data,
17184
bufsize_t len) {
17185
if (len <= 0 || data == NULL) {
17186
cmark_strbuf_clear(buf);
17187
} else {
17188
if (data != buf->ptr) {
17189
if (len >= buf->asize)
17190
cmark_strbuf_grow(buf, len);
17191
memmove(buf->ptr, data, len);
17192
}
17193
buf->size = len;
17194
buf->ptr[buf->size] = '\0';
17195
}
17196
}
17197
17198
void cmark_strbuf_sets(cmark_strbuf *buf, const char *string) {
17199
cmark_strbuf_set(buf, (const unsigned char *)string,
17200
string ? strlen(string) : 0);
17201
}
17202
17203
void cmark_strbuf_putc(cmark_strbuf *buf, int c) {
17204
S_strbuf_grow_by(buf, 1);
17205
buf->ptr[buf->size++] = (unsigned char)(c & 0xFF);
17206
buf->ptr[buf->size] = '\0';
17207
}
17208
17209
void cmark_strbuf_put(cmark_strbuf *buf, const unsigned char *data,
17210
bufsize_t len) {
17211
if (len <= 0)
17212
return;
17213
17214
S_strbuf_grow_by(buf, len);
17215
memmove(buf->ptr + buf->size, data, len);
17216
buf->size += len;
17217
buf->ptr[buf->size] = '\0';
17218
}
17219
17220
void cmark_strbuf_puts(cmark_strbuf *buf, const char *string) {
17221
cmark_strbuf_put(buf, (const unsigned char *)string, strlen(string));
17222
}
17223
17224
void cmark_strbuf_copy_cstr(char *data, bufsize_t datasize,
17225
const cmark_strbuf *buf) {
17226
bufsize_t copylen;
17227
17228
assert(buf);
17229
if (!data || datasize <= 0)
17230
return;
17231
17232
data[0] = '\0';
17233
17234
if (buf->size == 0 || buf->asize <= 0)
17235
return;
17236
17237
copylen = buf->size;
17238
if (copylen > datasize - 1)
17239
copylen = datasize - 1;
17240
memmove(data, buf->ptr, copylen);
17241
data[copylen] = '\0';
17242
}
17243
17244
void cmark_strbuf_swap(cmark_strbuf *buf_a, cmark_strbuf *buf_b) {
17245
cmark_strbuf t = *buf_a;
17246
*buf_a = *buf_b;
17247
*buf_b = t;
17248
}
17249
17250
unsigned char *cmark_strbuf_detach(cmark_strbuf *buf) {
17251
unsigned char *data = buf->ptr;
17252
17253
if (buf->asize == 0) {
17254
/* return an empty string */
17255
return (unsigned char *)buf->mem->calloc(1, 1);
17256
}
17257
17258
cmark_strbuf_init(buf->mem, buf, 0);
17259
return data;
17260
}
17261
17262
int cmark_strbuf_cmp(const cmark_strbuf *a, const cmark_strbuf *b) {
17263
int result = memcmp(a->ptr, b->ptr, MIN(a->size, b->size));
17264
return (result != 0) ? result
17265
: (a->size < b->size) ? -1 : (a->size > b->size) ? 1 : 0;
17266
}
17267
17268
bufsize_t cmark_strbuf_strchr(const cmark_strbuf *buf, int c, bufsize_t pos) {
17269
if (pos >= buf->size)
17270
return -1;
17271
if (pos < 0)
17272
pos = 0;
17273
17274
const unsigned char *p =
17275
(unsigned char *)memchr(buf->ptr + pos, c, buf->size - pos);
17276
if (!p)
17277
return -1;
17278
17279
return (bufsize_t)(p - (const unsigned char *)buf->ptr);
17280
}
17281
17282
bufsize_t cmark_strbuf_strrchr(const cmark_strbuf *buf, int c, bufsize_t pos) {
17283
if (pos < 0 || buf->size == 0)
17284
return -1;
17285
if (pos >= buf->size)
17286
pos = buf->size - 1;
17287
17288
bufsize_t i;
17289
for (i = pos; i >= 0; i--) {
17290
if (buf->ptr[i] == (unsigned char)c)
17291
return i;
17292
}
17293
17294
return -1;
17295
}
17296
17297
void cmark_strbuf_truncate(cmark_strbuf *buf, bufsize_t len) {
17298
if (len < 0)
17299
len = 0;
17300
17301
if (len < buf->size) {
17302
buf->size = len;
17303
buf->ptr[buf->size] = '\0';
17304
}
17305
}
17306
17307
void cmark_strbuf_drop(cmark_strbuf *buf, bufsize_t n) {
17308
if (n > 0) {
17309
if (n > buf->size)
17310
n = buf->size;
17311
buf->size = buf->size - n;
17312
if (buf->size)
17313
memmove(buf->ptr, buf->ptr + n, buf->size);
17314
17315
buf->ptr[buf->size] = '\0';
17316
}
17317
}
17318
17319
void cmark_strbuf_rtrim(cmark_strbuf *buf) {
17320
if (!buf->size)
17321
return;
17322
17323
while (buf->size > 0) {
17324
if (!cmark_isspace(buf->ptr[buf->size - 1]))
17325
break;
17326
17327
buf->size--;
17328
}
17329
17330
buf->ptr[buf->size] = '\0';
17331
}
17332
17333
void cmark_strbuf_trim(cmark_strbuf *buf) {
17334
bufsize_t i = 0;
17335
17336
if (!buf->size)
17337
return;
17338
17339
while (i < buf->size && cmark_isspace(buf->ptr[i]))
17340
i++;
17341
17342
cmark_strbuf_drop(buf, i);
17343
17344
cmark_strbuf_rtrim(buf);
17345
}
17346
17347
// Destructively modify string, collapsing consecutive
17348
// space and newline characters into a single space.
17349
void cmark_strbuf_normalize_whitespace(cmark_strbuf *s) {
17350
bool last_char_was_space = false;
17351
bufsize_t r, w;
17352
17353
for (r = 0, w = 0; r < s->size; ++r) {
17354
if (cmark_isspace(s->ptr[r])) {
17355
if (!last_char_was_space) {
17356
s->ptr[w++] = ' ';
17357
last_char_was_space = true;
17358
}
17359
} else {
17360
s->ptr[w++] = s->ptr[r];
17361
last_char_was_space = false;
17362
}
17363
}
17364
17365
cmark_strbuf_truncate(s, w);
17366
}
17367
17368
// Destructively unescape a string: remove backslashes before punctuation chars.
17369
extern void cmark_strbuf_unescape(cmark_strbuf *buf) {
17370
bufsize_t r, w;
17371
17372
for (r = 0, w = 0; r < buf->size; ++r) {
17373
if (buf->ptr[r] == '\\' && cmark_ispunct(buf->ptr[r + 1]))
17374
r++;
17375
17376
buf->ptr[w++] = buf->ptr[r];
17377
}
17378
17379
cmark_strbuf_truncate(buf, w);
17380
}
17381
17382
17383
static void S_node_unlink(cmark_node *node);
17384
17385
#define NODE_MEM(node) cmark_node_mem(node)
17386
17387
static CMARK_INLINE bool S_is_block(cmark_node *node) {
17388
if (node == NULL) {
17389
return false;
17390
}
17391
return node->type >= CMARK_NODE_FIRST_BLOCK &&
17392
node->type <= CMARK_NODE_LAST_BLOCK;
17393
}
17394
17395
static CMARK_INLINE bool S_is_inline(cmark_node *node) {
17396
if (node == NULL) {
17397
return false;
17398
}
17399
return node->type >= CMARK_NODE_FIRST_INLINE &&
17400
node->type <= CMARK_NODE_LAST_INLINE;
17401
}
17402
17403
static bool S_can_contain(cmark_node *node, cmark_node *child) {
17404
cmark_node *cur;
17405
17406
if (node == NULL || child == NULL) {
17407
return false;
17408
}
17409
17410
// Verify that child is not an ancestor of node or equal to node.
17411
cur = node;
17412
do {
17413
if (cur == child) {
17414
return false;
17415
}
17416
cur = cur->parent;
17417
} while (cur != NULL);
17418
17419
if (child->type == CMARK_NODE_DOCUMENT) {
17420
return false;
17421
}
17422
17423
switch (node->type) {
17424
case CMARK_NODE_DOCUMENT:
17425
case CMARK_NODE_BLOCK_QUOTE:
17426
case CMARK_NODE_ITEM:
17427
return S_is_block(child) && child->type != CMARK_NODE_ITEM;
17428
17429
case CMARK_NODE_LIST:
17430
return child->type == CMARK_NODE_ITEM;
17431
17432
case CMARK_NODE_CUSTOM_BLOCK:
17433
return true;
17434
17435
case CMARK_NODE_PARAGRAPH:
17436
case CMARK_NODE_HEADING:
17437
case CMARK_NODE_EMPH:
17438
case CMARK_NODE_STRONG:
17439
case CMARK_NODE_LINK:
17440
case CMARK_NODE_IMAGE:
17441
case CMARK_NODE_CUSTOM_INLINE:
17442
return S_is_inline(child);
17443
17444
default:
17445
break;
17446
}
17447
17448
return false;
17449
}
17450
17451
cmark_node *cmark_node_new_with_mem(cmark_node_type type, cmark_mem *mem) {
17452
cmark_node *node = (cmark_node *)mem->calloc(1, sizeof(*node));
17453
cmark_strbuf_init(mem, &node->content, 0);
17454
node->type = (uint16_t)type;
17455
17456
switch (node->type) {
17457
case CMARK_NODE_HEADING:
17458
node->as.heading.level = 1;
17459
break;
17460
17461
case CMARK_NODE_LIST: {
17462
cmark_list *list = &node->as.list;
17463
list->list_type = CMARK_BULLET_LIST;
17464
list->start = 1;
17465
list->tight = false;
17466
break;
17467
}
17468
17469
default:
17470
break;
17471
}
17472
17473
return node;
17474
}
17475
17476
cmark_node *cmark_node_new(cmark_node_type type) {
17477
extern cmark_mem DEFAULT_MEM_ALLOCATOR;
17478
return cmark_node_new_with_mem(type, &DEFAULT_MEM_ALLOCATOR);
17479
}
17480
17481
// Free a cmark_node list and any children.
17482
static void S_free_nodes(cmark_node *e) {
17483
cmark_node *next;
17484
while (e != NULL) {
17485
cmark_strbuf_free(&e->content);
17486
switch (e->type) {
17487
case CMARK_NODE_CODE_BLOCK:
17488
cmark_chunk_free(NODE_MEM(e), &e->as.code.info);
17489
cmark_chunk_free(NODE_MEM(e), &e->as.code.literal);
17490
break;
17491
case CMARK_NODE_TEXT:
17492
case CMARK_NODE_HTML_INLINE:
17493
case CMARK_NODE_CODE:
17494
case CMARK_NODE_HTML_BLOCK:
17495
cmark_chunk_free(NODE_MEM(e), &e->as.literal);
17496
break;
17497
case CMARK_NODE_LINK:
17498
case CMARK_NODE_IMAGE:
17499
cmark_chunk_free(NODE_MEM(e), &e->as.link.url);
17500
cmark_chunk_free(NODE_MEM(e), &e->as.link.title);
17501
break;
17502
case CMARK_NODE_CUSTOM_BLOCK:
17503
case CMARK_NODE_CUSTOM_INLINE:
17504
cmark_chunk_free(NODE_MEM(e), &e->as.custom.on_enter);
17505
cmark_chunk_free(NODE_MEM(e), &e->as.custom.on_exit);
17506
break;
17507
default:
17508
break;
17509
}
17510
if (e->last_child) {
17511
// Splice children into list
17512
e->last_child->next = e->next;
17513
e->next = e->first_child;
17514
}
17515
next = e->next;
17516
NODE_MEM(e)->free(e);
17517
e = next;
17518
}
17519
}
17520
17521
void cmark_node_free(cmark_node *node) {
17522
S_node_unlink(node);
17523
node->next = NULL;
17524
S_free_nodes(node);
17525
}
17526
17527
cmark_node_type cmark_node_get_type(cmark_node *node) {
17528
if (node == NULL) {
17529
return CMARK_NODE_NONE;
17530
} else {
17531
return (cmark_node_type)node->type;
17532
}
17533
}
17534
17535
const char *cmark_node_get_type_string(cmark_node *node) {
17536
if (node == NULL) {
17537
return "NONE";
17538
}
17539
17540
switch (node->type) {
17541
case CMARK_NODE_NONE:
17542
return "none";
17543
case CMARK_NODE_DOCUMENT:
17544
return "document";
17545
case CMARK_NODE_BLOCK_QUOTE:
17546
return "block_quote";
17547
case CMARK_NODE_LIST:
17548
return "list";
17549
case CMARK_NODE_ITEM:
17550
return "item";
17551
case CMARK_NODE_CODE_BLOCK:
17552
return "code_block";
17553
case CMARK_NODE_HTML_BLOCK:
17554
return "html_block";
17555
case CMARK_NODE_CUSTOM_BLOCK:
17556
return "custom_block";
17557
case CMARK_NODE_PARAGRAPH:
17558
return "paragraph";
17559
case CMARK_NODE_HEADING:
17560
return "heading";
17561
case CMARK_NODE_THEMATIC_BREAK:
17562
return "thematic_break";
17563
case CMARK_NODE_TEXT:
17564
return "text";
17565
case CMARK_NODE_SOFTBREAK:
17566
return "softbreak";
17567
case CMARK_NODE_LINEBREAK:
17568
return "linebreak";
17569
case CMARK_NODE_CODE:
17570
return "code";
17571
case CMARK_NODE_HTML_INLINE:
17572
return "html_inline";
17573
case CMARK_NODE_CUSTOM_INLINE:
17574
return "custom_inline";
17575
case CMARK_NODE_EMPH:
17576
return "emph";
17577
case CMARK_NODE_STRONG:
17578
return "strong";
17579
case CMARK_NODE_LINK:
17580
return "link";
17581
case CMARK_NODE_IMAGE:
17582
return "image";
17583
}
17584
17585
return "<unknown>";
17586
}
17587
17588
cmark_node *cmark_node_next(cmark_node *node) {
17589
if (node == NULL) {
17590
return NULL;
17591
} else {
17592
return node->next;
17593
}
17594
}
17595
17596
cmark_node *cmark_node_previous(cmark_node *node) {
17597
if (node == NULL) {
17598
return NULL;
17599
} else {
17600
return node->prev;
17601
}
17602
}
17603
17604
cmark_node *cmark_node_parent(cmark_node *node) {
17605
if (node == NULL) {
17606
return NULL;
17607
} else {
17608
return node->parent;
17609
}
17610
}
17611
17612
cmark_node *cmark_node_first_child(cmark_node *node) {
17613
if (node == NULL) {
17614
return NULL;
17615
} else {
17616
return node->first_child;
17617
}
17618
}
17619
17620
cmark_node *cmark_node_last_child(cmark_node *node) {
17621
if (node == NULL) {
17622
return NULL;
17623
} else {
17624
return node->last_child;
17625
}
17626
}
17627
17628
void *cmark_node_get_user_data(cmark_node *node) {
17629
if (node == NULL) {
17630
return NULL;
17631
} else {
17632
return node->user_data;
17633
}
17634
}
17635
17636
int cmark_node_set_user_data(cmark_node *node, void *user_data) {
17637
if (node == NULL) {
17638
return 0;
17639
}
17640
node->user_data = user_data;
17641
return 1;
17642
}
17643
17644
const char *cmark_node_get_literal(cmark_node *node) {
17645
if (node == NULL) {
17646
return NULL;
17647
}
17648
17649
switch (node->type) {
17650
case CMARK_NODE_HTML_BLOCK:
17651
case CMARK_NODE_TEXT:
17652
case CMARK_NODE_HTML_INLINE:
17653
case CMARK_NODE_CODE:
17654
return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.literal);
17655
17656
case CMARK_NODE_CODE_BLOCK:
17657
return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.code.literal);
17658
17659
default:
17660
break;
17661
}
17662
17663
return NULL;
17664
}
17665
17666
int cmark_node_set_literal(cmark_node *node, const char *content) {
17667
if (node == NULL) {
17668
return 0;
17669
}
17670
17671
switch (node->type) {
17672
case CMARK_NODE_HTML_BLOCK:
17673
case CMARK_NODE_TEXT:
17674
case CMARK_NODE_HTML_INLINE:
17675
case CMARK_NODE_CODE:
17676
cmark_chunk_set_cstr(NODE_MEM(node), &node->as.literal, content);
17677
return 1;
17678
17679
case CMARK_NODE_CODE_BLOCK:
17680
cmark_chunk_set_cstr(NODE_MEM(node), &node->as.code.literal, content);
17681
return 1;
17682
17683
default:
17684
break;
17685
}
17686
17687
return 0;
17688
}
17689
17690
int cmark_node_get_heading_level(cmark_node *node) {
17691
if (node == NULL) {
17692
return 0;
17693
}
17694
17695
switch (node->type) {
17696
case CMARK_NODE_HEADING:
17697
return node->as.heading.level;
17698
17699
default:
17700
break;
17701
}
17702
17703
return 0;
17704
}
17705
17706
int cmark_node_set_heading_level(cmark_node *node, int level) {
17707
if (node == NULL || level < 1 || level > 6) {
17708
return 0;
17709
}
17710
17711
switch (node->type) {
17712
case CMARK_NODE_HEADING:
17713
node->as.heading.level = level;
17714
return 1;
17715
17716
default:
17717
break;
17718
}
17719
17720
return 0;
17721
}
17722
17723
cmark_list_type cmark_node_get_list_type(cmark_node *node) {
17724
if (node == NULL) {
17725
return CMARK_NO_LIST;
17726
}
17727
17728
if (node->type == CMARK_NODE_LIST) {
17729
return node->as.list.list_type;
17730
} else {
17731
return CMARK_NO_LIST;
17732
}
17733
}
17734
17735
int cmark_node_set_list_type(cmark_node *node, cmark_list_type type) {
17736
if (!(type == CMARK_BULLET_LIST || type == CMARK_ORDERED_LIST)) {
17737
return 0;
17738
}
17739
17740
if (node == NULL) {
17741
return 0;
17742
}
17743
17744
if (node->type == CMARK_NODE_LIST) {
17745
node->as.list.list_type = type;
17746
return 1;
17747
} else {
17748
return 0;
17749
}
17750
}
17751
17752
cmark_delim_type cmark_node_get_list_delim(cmark_node *node) {
17753
if (node == NULL) {
17754
return CMARK_NO_DELIM;
17755
}
17756
17757
if (node->type == CMARK_NODE_LIST) {
17758
return node->as.list.delimiter;
17759
} else {
17760
return CMARK_NO_DELIM;
17761
}
17762
}
17763
17764
int cmark_node_set_list_delim(cmark_node *node, cmark_delim_type delim) {
17765
if (!(delim == CMARK_PERIOD_DELIM || delim == CMARK_PAREN_DELIM)) {
17766
return 0;
17767
}
17768
17769
if (node == NULL) {
17770
return 0;
17771
}
17772
17773
if (node->type == CMARK_NODE_LIST) {
17774
node->as.list.delimiter = delim;
17775
return 1;
17776
} else {
17777
return 0;
17778
}
17779
}
17780
17781
int cmark_node_get_list_start(cmark_node *node) {
17782
if (node == NULL) {
17783
return 0;
17784
}
17785
17786
if (node->type == CMARK_NODE_LIST) {
17787
return node->as.list.start;
17788
} else {
17789
return 0;
17790
}
17791
}
17792
17793
int cmark_node_set_list_start(cmark_node *node, int start) {
17794
if (node == NULL || start < 0) {
17795
return 0;
17796
}
17797
17798
if (node->type == CMARK_NODE_LIST) {
17799
node->as.list.start = start;
17800
return 1;
17801
} else {
17802
return 0;
17803
}
17804
}
17805
17806
int cmark_node_get_list_tight(cmark_node *node) {
17807
if (node == NULL) {
17808
return 0;
17809
}
17810
17811
if (node->type == CMARK_NODE_LIST) {
17812
return node->as.list.tight;
17813
} else {
17814
return 0;
17815
}
17816
}
17817
17818
int cmark_node_set_list_tight(cmark_node *node, int tight) {
17819
if (node == NULL) {
17820
return 0;
17821
}
17822
17823
if (node->type == CMARK_NODE_LIST) {
17824
node->as.list.tight = tight == 1;
17825
return 1;
17826
} else {
17827
return 0;
17828
}
17829
}
17830
17831
const char *cmark_node_get_fence_info(cmark_node *node) {
17832
if (node == NULL) {
17833
return NULL;
17834
}
17835
17836
if (node->type == CMARK_NODE_CODE_BLOCK) {
17837
return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.code.info);
17838
} else {
17839
return NULL;
17840
}
17841
}
17842
17843
int cmark_node_set_fence_info(cmark_node *node, const char *info) {
17844
if (node == NULL) {
17845
return 0;
17846
}
17847
17848
if (node->type == CMARK_NODE_CODE_BLOCK) {
17849
cmark_chunk_set_cstr(NODE_MEM(node), &node->as.code.info, info);
17850
return 1;
17851
} else {
17852
return 0;
17853
}
17854
}
17855
17856
const char *cmark_node_get_url(cmark_node *node) {
17857
if (node == NULL) {
17858
return NULL;
17859
}
17860
17861
switch (node->type) {
17862
case CMARK_NODE_LINK:
17863
case CMARK_NODE_IMAGE:
17864
return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.link.url);
17865
default:
17866
break;
17867
}
17868
17869
return NULL;
17870
}
17871
17872
int cmark_node_set_url(cmark_node *node, const char *url) {
17873
if (node == NULL) {
17874
return 0;
17875
}
17876
17877
switch (node->type) {
17878
case CMARK_NODE_LINK:
17879
case CMARK_NODE_IMAGE:
17880
cmark_chunk_set_cstr(NODE_MEM(node), &node->as.link.url, url);
17881
return 1;
17882
default:
17883
break;
17884
}
17885
17886
return 0;
17887
}
17888
17889
const char *cmark_node_get_title(cmark_node *node) {
17890
if (node == NULL) {
17891
return NULL;
17892
}
17893
17894
switch (node->type) {
17895
case CMARK_NODE_LINK:
17896
case CMARK_NODE_IMAGE:
17897
return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.link.title);
17898
default:
17899
break;
17900
}
17901
17902
return NULL;
17903
}
17904
17905
int cmark_node_set_title(cmark_node *node, const char *title) {
17906
if (node == NULL) {
17907
return 0;
17908
}
17909
17910
switch (node->type) {
17911
case CMARK_NODE_LINK:
17912
case CMARK_NODE_IMAGE:
17913
cmark_chunk_set_cstr(NODE_MEM(node), &node->as.link.title, title);
17914
return 1;
17915
default:
17916
break;
17917
}
17918
17919
return 0;
17920
}
17921
17922
const char *cmark_node_get_on_enter(cmark_node *node) {
17923
if (node == NULL) {
17924
return NULL;
17925
}
17926
17927
switch (node->type) {
17928
case CMARK_NODE_CUSTOM_INLINE:
17929
case CMARK_NODE_CUSTOM_BLOCK:
17930
return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.custom.on_enter);
17931
default:
17932
break;
17933
}
17934
17935
return NULL;
17936
}
17937
17938
int cmark_node_set_on_enter(cmark_node *node, const char *on_enter) {
17939
if (node == NULL) {
17940
return 0;
17941
}
17942
17943
switch (node->type) {
17944
case CMARK_NODE_CUSTOM_INLINE:
17945
case CMARK_NODE_CUSTOM_BLOCK:
17946
cmark_chunk_set_cstr(NODE_MEM(node), &node->as.custom.on_enter, on_enter);
17947
return 1;
17948
default:
17949
break;
17950
}
17951
17952
return 0;
17953
}
17954
17955
const char *cmark_node_get_on_exit(cmark_node *node) {
17956
if (node == NULL) {
17957
return NULL;
17958
}
17959
17960
switch (node->type) {
17961
case CMARK_NODE_CUSTOM_INLINE:
17962
case CMARK_NODE_CUSTOM_BLOCK:
17963
return cmark_chunk_to_cstr(NODE_MEM(node), &node->as.custom.on_exit);
17964
default:
17965
break;
17966
}
17967
17968
return NULL;
17969
}
17970
17971
int cmark_node_set_on_exit(cmark_node *node, const char *on_exit) {
17972
if (node == NULL) {
17973
return 0;
17974
}
17975
17976
switch (node->type) {
17977
case CMARK_NODE_CUSTOM_INLINE:
17978
case CMARK_NODE_CUSTOM_BLOCK:
17979
cmark_chunk_set_cstr(NODE_MEM(node), &node->as.custom.on_exit, on_exit);
17980
return 1;
17981
default:
17982
break;
17983
}
17984
17985
return 0;
17986
}
17987
17988
int cmark_node_get_start_line(cmark_node *node) {
17989
if (node == NULL) {
17990
return 0;
17991
}
17992
return node->start_line;
17993
}
17994
17995
int cmark_node_get_start_column(cmark_node *node) {
17996
if (node == NULL) {
17997
return 0;
17998
}
17999
return node->start_column;
18000
}
18001
18002
int cmark_node_get_end_line(cmark_node *node) {
18003
if (node == NULL) {
18004
return 0;
18005
}
18006
return node->end_line;
18007
}
18008
18009
int cmark_node_get_end_column(cmark_node *node) {
18010
if (node == NULL) {
18011
return 0;
18012
}
18013
return node->end_column;
18014
}
18015
18016
// Unlink a node without adjusting its next, prev, and parent pointers.
18017
static void S_node_unlink(cmark_node *node) {
18018
if (node == NULL) {
18019
return;
18020
}
18021
18022
if (node->prev) {
18023
node->prev->next = node->next;
18024
}
18025
if (node->next) {
18026
node->next->prev = node->prev;
18027
}
18028
18029
// Adjust first_child and last_child of parent.
18030
cmark_node *parent = node->parent;
18031
if (parent) {
18032
if (parent->first_child == node) {
18033
parent->first_child = node->next;
18034
}
18035
if (parent->last_child == node) {
18036
parent->last_child = node->prev;
18037
}
18038
}
18039
}
18040
18041
void cmark_node_unlink(cmark_node *node) {
18042
S_node_unlink(node);
18043
18044
node->next = NULL;
18045
node->prev = NULL;
18046
node->parent = NULL;
18047
}
18048
18049
int cmark_node_insert_before(cmark_node *node, cmark_node *sibling) {
18050
if (node == NULL || sibling == NULL) {
18051
return 0;
18052
}
18053
18054
if (!node->parent || !S_can_contain(node->parent, sibling)) {
18055
return 0;
18056
}
18057
18058
S_node_unlink(sibling);
18059
18060
cmark_node *old_prev = node->prev;
18061
18062
// Insert 'sibling' between 'old_prev' and 'node'.
18063
if (old_prev) {
18064
old_prev->next = sibling;
18065
}
18066
sibling->prev = old_prev;
18067
sibling->next = node;
18068
node->prev = sibling;
18069
18070
// Set new parent.
18071
cmark_node *parent = node->parent;
18072
sibling->parent = parent;
18073
18074
// Adjust first_child of parent if inserted as first child.
18075
if (parent && !old_prev) {
18076
parent->first_child = sibling;
18077
}
18078
18079
return 1;
18080
}
18081
18082
int cmark_node_insert_after(cmark_node *node, cmark_node *sibling) {
18083
if (node == NULL || sibling == NULL) {
18084
return 0;
18085
}
18086
18087
if (!node->parent || !S_can_contain(node->parent, sibling)) {
18088
return 0;
18089
}
18090
18091
S_node_unlink(sibling);
18092
18093
cmark_node *old_next = node->next;
18094
18095
// Insert 'sibling' between 'node' and 'old_next'.
18096
if (old_next) {
18097
old_next->prev = sibling;
18098
}
18099
sibling->next = old_next;
18100
sibling->prev = node;
18101
node->next = sibling;
18102
18103
// Set new parent.
18104
cmark_node *parent = node->parent;
18105
sibling->parent = parent;
18106
18107
// Adjust last_child of parent if inserted as last child.
18108
if (parent && !old_next) {
18109
parent->last_child = sibling;
18110
}
18111
18112
return 1;
18113
}
18114
18115
int cmark_node_replace(cmark_node *oldnode, cmark_node *newnode) {
18116
if (!cmark_node_insert_before(oldnode, newnode)) {
18117
return 0;
18118
}
18119
cmark_node_unlink(oldnode);
18120
return 1;
18121
}
18122
18123
int cmark_node_prepend_child(cmark_node *node, cmark_node *child) {
18124
if (!S_can_contain(node, child)) {
18125
return 0;
18126
}
18127
18128
S_node_unlink(child);
18129
18130
cmark_node *old_first_child = node->first_child;
18131
18132
child->next = old_first_child;
18133
child->prev = NULL;
18134
child->parent = node;
18135
node->first_child = child;
18136
18137
if (old_first_child) {
18138
old_first_child->prev = child;
18139
} else {
18140
// Also set last_child if node previously had no children.
18141
node->last_child = child;
18142
}
18143
18144
return 1;
18145
}
18146
18147
int cmark_node_append_child(cmark_node *node, cmark_node *child) {
18148
if (!S_can_contain(node, child)) {
18149
return 0;
18150
}
18151
18152
S_node_unlink(child);
18153
18154
cmark_node *old_last_child = node->last_child;
18155
18156
child->next = NULL;
18157
child->prev = old_last_child;
18158
child->parent = node;
18159
node->last_child = child;
18160
18161
if (old_last_child) {
18162
old_last_child->next = child;
18163
} else {
18164
// Also set first_child if node previously had no children.
18165
node->first_child = child;
18166
}
18167
18168
return 1;
18169
}
18170
18171
static void S_print_error(FILE *out, cmark_node *node, const char *elem) {
18172
if (out == NULL) {
18173
return;
18174
}
18175
fprintf(out, "Invalid '%s' in node type %s at %d:%d\n", elem,
18176
cmark_node_get_type_string(node), node->start_line,
18177
node->start_column);
18178
}
18179
18180
int cmark_node_check(cmark_node *node, FILE *out) {
18181
cmark_node *cur;
18182
int errors = 0;
18183
18184
if (!node) {
18185
return 0;
18186
}
18187
18188
cur = node;
18189
for (;;) {
18190
if (cur->first_child) {
18191
if (cur->first_child->prev != NULL) {
18192
S_print_error(out, cur->first_child, "prev");
18193
cur->first_child->prev = NULL;
18194
++errors;
18195
}
18196
if (cur->first_child->parent != cur) {
18197
S_print_error(out, cur->first_child, "parent");
18198
cur->first_child->parent = cur;
18199
++errors;
18200
}
18201
cur = cur->first_child;
18202
continue;
18203
}
18204
18205
next_sibling:
18206
if (cur == node) {
18207
break;
18208
}
18209
if (cur->next) {
18210
if (cur->next->prev != cur) {
18211
S_print_error(out, cur->next, "prev");
18212
cur->next->prev = cur;
18213
++errors;
18214
}
18215
if (cur->next->parent != cur->parent) {
18216
S_print_error(out, cur->next, "parent");
18217
cur->next->parent = cur->parent;
18218
++errors;
18219
}
18220
cur = cur->next;
18221
continue;
18222
}
18223
18224
if (cur->parent->last_child != cur) {
18225
S_print_error(out, cur->parent, "last_child");
18226
cur->parent->last_child = cur;
18227
++errors;
18228
}
18229
cur = cur->parent;
18230
goto next_sibling;
18231
}
18232
18233
return errors;
18234
}
18235
18236
18237
#include "entities.inc"
18238
18239
/* Binary tree lookup code for entities added by JGM */
18240
18241
static const unsigned char *S_lookup(int i, int low, int hi,
18242
const unsigned char *s, int len) {
18243
int j;
18244
int cmp =
18245
strncmp((const char *)s, (const char *)cmark_entities[i].entity, len);
18246
if (cmp == 0 && cmark_entities[i].entity[len] == 0) {
18247
return (const unsigned char *)cmark_entities[i].bytes;
18248
} else if (cmp <= 0 && i > low) {
18249
j = i - ((i - low) / 2);
18250
if (j == i)
18251
j -= 1;
18252
return S_lookup(j, low, i - 1, s, len);
18253
} else if (cmp > 0 && i < hi) {
18254
j = i + ((hi - i) / 2);
18255
if (j == i)
18256
j += 1;
18257
return S_lookup(j, i + 1, hi, s, len);
18258
} else {
18259
return NULL;
18260
}
18261
}
18262
18263
static const unsigned char *S_lookup_entity(const unsigned char *s, int len) {
18264
return S_lookup(CMARK_NUM_ENTITIES / 2, 0, CMARK_NUM_ENTITIES - 1, s, len);
18265
}
18266
18267
bufsize_t houdini_unescape_ent(cmark_strbuf *ob, const uint8_t *src,
18268
bufsize_t size) {
18269
bufsize_t i = 0;
18270
18271
if (size >= 3 && src[0] == '#') {
18272
int codepoint = 0;
18273
int num_digits = 0;
18274
18275
if (_isdigit(src[1])) {
18276
for (i = 1; i < size && _isdigit(src[i]); ++i) {
18277
codepoint = (codepoint * 10) + (src[i] - '0');
18278
18279
if (codepoint >= 0x110000) {
18280
// Keep counting digits but
18281
// avoid integer overflow.
18282
codepoint = 0x110000;
18283
}
18284
}
18285
18286
num_digits = i - 1;
18287
}
18288
18289
else if (src[1] == 'x' || src[1] == 'X') {
18290
for (i = 2; i < size && _isxdigit(src[i]); ++i) {
18291
codepoint = (codepoint * 16) + ((src[i] | 32) % 39 - 9);
18292
18293
if (codepoint >= 0x110000) {
18294
// Keep counting digits but
18295
// avoid integer overflow.
18296
codepoint = 0x110000;
18297
}
18298
}
18299
18300
num_digits = i - 2;
18301
}
18302
18303
if (num_digits >= 1 && num_digits <= 8 && i < size && src[i] == ';') {
18304
if (codepoint == 0 || (codepoint >= 0xD800 && codepoint < 0xE000) ||
18305
codepoint >= 0x110000) {
18306
codepoint = 0xFFFD;
18307
}
18308
cmark_utf8proc_encode_char(codepoint, ob);
18309
return i + 1;
18310
}
18311
}
18312
18313
else {
18314
if (size > CMARK_ENTITY_MAX_LENGTH)
18315
size = CMARK_ENTITY_MAX_LENGTH;
18316
18317
for (i = CMARK_ENTITY_MIN_LENGTH; i < size; ++i) {
18318
if (src[i] == ' ')
18319
break;
18320
18321
if (src[i] == ';') {
18322
const unsigned char *entity = S_lookup_entity(src, i);
18323
18324
if (entity != NULL) {
18325
cmark_strbuf_puts(ob, (const char *)entity);
18326
return i + 1;
18327
}
18328
18329
break;
18330
}
18331
}
18332
}
18333
18334
return 0;
18335
}
18336
18337
int houdini_unescape_html(cmark_strbuf *ob, const uint8_t *src,
18338
bufsize_t size) {
18339
bufsize_t i = 0, org, ent;
18340
18341
while (i < size) {
18342
org = i;
18343
while (i < size && src[i] != '&')
18344
i++;
18345
18346
if (likely(i > org)) {
18347
if (unlikely(org == 0)) {
18348
if (i >= size)
18349
return 0;
18350
18351
cmark_strbuf_grow(ob, HOUDINI_UNESCAPED_SIZE(size));
18352
}
18353
18354
cmark_strbuf_put(ob, src + org, i - org);
18355
}
18356
18357
/* escaping */
18358
if (i >= size)
18359
break;
18360
18361
i++;
18362
18363
ent = houdini_unescape_ent(ob, src + i, size - i);
18364
i += ent;
18365
18366
/* not really an entity */
18367
if (ent == 0)
18368
cmark_strbuf_putc(ob, '&');
18369
}
18370
18371
return 1;
18372
}
18373
18374
void houdini_unescape_html_f(cmark_strbuf *ob, const uint8_t *src,
18375
bufsize_t size) {
18376
if (!houdini_unescape_html(ob, src, size))
18377
cmark_strbuf_put(ob, src, size);
18378
}
18379
18380
18381
static const int S_leaf_mask =
18382
(1 << CMARK_NODE_HTML_BLOCK) | (1 << CMARK_NODE_THEMATIC_BREAK) |
18383
(1 << CMARK_NODE_CODE_BLOCK) | (1 << CMARK_NODE_TEXT) |
18384
(1 << CMARK_NODE_SOFTBREAK) | (1 << CMARK_NODE_LINEBREAK) |
18385
(1 << CMARK_NODE_CODE) | (1 << CMARK_NODE_HTML_INLINE);
18386
18387
cmark_iter *cmark_iter_new(cmark_node *root) {
18388
if (root == NULL) {
18389
return NULL;
18390
}
18391
cmark_mem *mem = root->content.mem;
18392
cmark_iter *iter = (cmark_iter *)mem->calloc(1, sizeof(cmark_iter));
18393
iter->mem = mem;
18394
iter->root = root;
18395
iter->cur.ev_type = CMARK_EVENT_NONE;
18396
iter->cur.node = NULL;
18397
iter->next.ev_type = CMARK_EVENT_ENTER;
18398
iter->next.node = root;
18399
return iter;
18400
}
18401
18402
void cmark_iter_free(cmark_iter *iter) { iter->mem->free(iter); }
18403
18404
static bool S_is_leaf(cmark_node *node) {
18405
return ((1 << node->type) & S_leaf_mask) != 0;
18406
}
18407
18408
cmark_event_type cmark_iter_next(cmark_iter *iter) {
18409
cmark_event_type ev_type = iter->next.ev_type;
18410
cmark_node *node = iter->next.node;
18411
18412
iter->cur.ev_type = ev_type;
18413
iter->cur.node = node;
18414
18415
if (ev_type == CMARK_EVENT_DONE) {
18416
return ev_type;
18417
}
18418
18419
/* roll forward to next item, setting both fields */
18420
if (ev_type == CMARK_EVENT_ENTER && !S_is_leaf(node)) {
18421
if (node->first_child == NULL) {
18422
/* stay on this node but exit */
18423
iter->next.ev_type = CMARK_EVENT_EXIT;
18424
} else {
18425
iter->next.ev_type = CMARK_EVENT_ENTER;
18426
iter->next.node = node->first_child;
18427
}
18428
} else if (node == iter->root) {
18429
/* don't move past root */
18430
iter->next.ev_type = CMARK_EVENT_DONE;
18431
iter->next.node = NULL;
18432
} else if (node->next) {
18433
iter->next.ev_type = CMARK_EVENT_ENTER;
18434
iter->next.node = node->next;
18435
} else if (node->parent) {
18436
iter->next.ev_type = CMARK_EVENT_EXIT;
18437
iter->next.node = node->parent;
18438
} else {
18439
assert(false);
18440
iter->next.ev_type = CMARK_EVENT_DONE;
18441
iter->next.node = NULL;
18442
}
18443
18444
return ev_type;
18445
}
18446
18447
void cmark_iter_reset(cmark_iter *iter, cmark_node *current,
18448
cmark_event_type event_type) {
18449
iter->next.ev_type = event_type;
18450
iter->next.node = current;
18451
cmark_iter_next(iter);
18452
}
18453
18454
cmark_node *cmark_iter_get_node(cmark_iter *iter) { return iter->cur.node; }
18455
18456
cmark_event_type cmark_iter_get_event_type(cmark_iter *iter) {
18457
return iter->cur.ev_type;
18458
}
18459
18460
cmark_node *cmark_iter_get_root(cmark_iter *iter) { return iter->root; }
18461
18462
void cmark_consolidate_text_nodes(cmark_node *root) {
18463
if (root == NULL) {
18464
return;
18465
}
18466
cmark_iter *iter = cmark_iter_new(root);
18467
cmark_strbuf buf = CMARK_BUF_INIT(iter->mem);
18468
cmark_event_type ev_type;
18469
cmark_node *cur, *tmp, *next;
18470
18471
while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
18472
cur = cmark_iter_get_node(iter);
18473
if (ev_type == CMARK_EVENT_ENTER && cur->type == CMARK_NODE_TEXT &&
18474
cur->next && cur->next->type == CMARK_NODE_TEXT) {
18475
cmark_strbuf_clear(&buf);
18476
cmark_strbuf_put(&buf, cur->as.literal.data, cur->as.literal.len);
18477
tmp = cur->next;
18478
while (tmp && tmp->type == CMARK_NODE_TEXT) {
18479
cmark_iter_next(iter); // advance pointer
18480
cmark_strbuf_put(&buf, tmp->as.literal.data, tmp->as.literal.len);
18481
next = tmp->next;
18482
cmark_node_free(tmp);
18483
tmp = next;
18484
}
18485
cmark_chunk_free(iter->mem, &cur->as.literal);
18486
cur->as.literal = cmark_chunk_buf_detach(&buf);
18487
}
18488
}
18489
18490
cmark_strbuf_free(&buf);
18491
cmark_iter_free(iter);
18492
}
18493
18494
18495
#define BUFFER_SIZE 100
18496
18497
// Functions to convert cmark_nodes to HTML strings.
18498
18499
static void escape_html(cmark_strbuf *dest, const unsigned char *source,
18500
bufsize_t length) {
18501
houdini_escape_html0(dest, source, length, 0);
18502
}
18503
18504
static CMARK_INLINE void cr(cmark_strbuf *html) {
18505
if (html->size && html->ptr[html->size - 1] != '\n')
18506
cmark_strbuf_putc(html, '\n');
18507
}
18508
18509
struct render_state {
18510
cmark_strbuf *html;
18511
cmark_node *plain;
18512
};
18513
18514
static void S_render_sourcepos(cmark_node *node, cmark_strbuf *html,
18515
int options) {
18516
char buffer[BUFFER_SIZE];
18517
if (CMARK_OPT_SOURCEPOS & options) {
18518
snprintf(buffer, BUFFER_SIZE, " data-sourcepos=\"%d:%d-%d:%d\"",
18519
cmark_node_get_start_line(node), cmark_node_get_start_column(node),
18520
cmark_node_get_end_line(node), cmark_node_get_end_column(node));
18521
cmark_strbuf_puts(html, buffer);
18522
}
18523
}
18524
18525
static int S_render_node(cmark_node *node, cmark_event_type ev_type,
18526
struct render_state *state, int options) {
18527
cmark_node *parent;
18528
cmark_node *grandparent;
18529
cmark_strbuf *html = state->html;
18530
char start_heading[] = "<h0";
18531
char end_heading[] = "</h0";
18532
bool tight;
18533
char buffer[BUFFER_SIZE];
18534
18535
bool entering = (ev_type == CMARK_EVENT_ENTER);
18536
18537
if (state->plain == node) { // back at original node
18538
state->plain = NULL;
18539
}
18540
18541
if (state->plain != NULL) {
18542
switch (node->type) {
18543
case CMARK_NODE_TEXT:
18544
case CMARK_NODE_CODE:
18545
case CMARK_NODE_HTML_INLINE:
18546
escape_html(html, node->as.literal.data, node->as.literal.len);
18547
break;
18548
18549
case CMARK_NODE_LINEBREAK:
18550
case CMARK_NODE_SOFTBREAK:
18551
cmark_strbuf_putc(html, ' ');
18552
break;
18553
18554
default:
18555
break;
18556
}
18557
return 1;
18558
}
18559
18560
switch (node->type) {
18561
case CMARK_NODE_DOCUMENT:
18562
break;
18563
18564
case CMARK_NODE_BLOCK_QUOTE:
18565
if (entering) {
18566
cr(html);
18567
cmark_strbuf_puts(html, "<blockquote");
18568
S_render_sourcepos(node, html, options);
18569
cmark_strbuf_puts(html, ">\n");
18570
} else {
18571
cr(html);
18572
cmark_strbuf_puts(html, "</blockquote>\n");
18573
}
18574
break;
18575
18576
case CMARK_NODE_LIST: {
18577
cmark_list_type list_type = node->as.list.list_type;
18578
int start = node->as.list.start;
18579
18580
if (entering) {
18581
cr(html);
18582
if (list_type == CMARK_BULLET_LIST) {
18583
cmark_strbuf_puts(html, "<ul");
18584
S_render_sourcepos(node, html, options);
18585
cmark_strbuf_puts(html, ">\n");
18586
} else if (start == 1) {
18587
cmark_strbuf_puts(html, "<ol");
18588
S_render_sourcepos(node, html, options);
18589
cmark_strbuf_puts(html, ">\n");
18590
} else {
18591
snprintf(buffer, BUFFER_SIZE, "<ol start=\"%d\"", start);
18592
cmark_strbuf_puts(html, buffer);
18593
S_render_sourcepos(node, html, options);
18594
cmark_strbuf_puts(html, ">\n");
18595
}
18596
} else {
18597
cmark_strbuf_puts(html,
18598
list_type == CMARK_BULLET_LIST ? "</ul>\n" : "</ol>\n");
18599
}
18600
break;
18601
}
18602
18603
case CMARK_NODE_ITEM:
18604
if (entering) {
18605
cr(html);
18606
cmark_strbuf_puts(html, "<li");
18607
S_render_sourcepos(node, html, options);
18608
cmark_strbuf_putc(html, '>');
18609
} else {
18610
cmark_strbuf_puts(html, "</li>\n");
18611
}
18612
break;
18613
18614
case CMARK_NODE_HEADING:
18615
if (entering) {
18616
cr(html);
18617
start_heading[2] = (char)('0' + node->as.heading.level);
18618
cmark_strbuf_puts(html, start_heading);
18619
S_render_sourcepos(node, html, options);
18620
cmark_strbuf_putc(html, '>');
18621
} else {
18622
end_heading[3] = (char)('0' + node->as.heading.level);
18623
cmark_strbuf_puts(html, end_heading);
18624
cmark_strbuf_puts(html, ">\n");
18625
}
18626
break;
18627
18628
case CMARK_NODE_CODE_BLOCK:
18629
cr(html);
18630
18631
if (node->as.code.info.len == 0) {
18632
cmark_strbuf_puts(html, "<pre");
18633
S_render_sourcepos(node, html, options);
18634
cmark_strbuf_puts(html, "><code>");
18635
} else {
18636
bufsize_t first_tag = 0;
18637
while (first_tag < node->as.code.info.len &&
18638
!cmark_isspace(node->as.code.info.data[first_tag])) {
18639
first_tag += 1;
18640
}
18641
18642
cmark_strbuf_puts(html, "<pre");
18643
S_render_sourcepos(node, html, options);
18644
cmark_strbuf_puts(html, "><code class=\"language-");
18645
escape_html(html, node->as.code.info.data, first_tag);
18646
cmark_strbuf_puts(html, "\">");
18647
}
18648
18649
escape_html(html, node->as.code.literal.data, node->as.code.literal.len);
18650
cmark_strbuf_puts(html, "</code></pre>\n");
18651
break;
18652
18653
case CMARK_NODE_HTML_BLOCK:
18654
cr(html);
18655
if (options & CMARK_OPT_SAFE) {
18656
cmark_strbuf_puts(html, "<!-- raw HTML omitted -->");
18657
} else {
18658
cmark_strbuf_put(html, node->as.literal.data, node->as.literal.len);
18659
}
18660
cr(html);
18661
break;
18662
18663
case CMARK_NODE_CUSTOM_BLOCK:
18664
cr(html);
18665
if (entering) {
18666
cmark_strbuf_put(html, node->as.custom.on_enter.data,
18667
node->as.custom.on_enter.len);
18668
} else {
18669
cmark_strbuf_put(html, node->as.custom.on_exit.data,
18670
node->as.custom.on_exit.len);
18671
}
18672
cr(html);
18673
break;
18674
18675
case CMARK_NODE_THEMATIC_BREAK:
18676
cr(html);
18677
cmark_strbuf_puts(html, "<hr");
18678
S_render_sourcepos(node, html, options);
18679
cmark_strbuf_puts(html, " />\n");
18680
break;
18681
18682
case CMARK_NODE_PARAGRAPH:
18683
parent = cmark_node_parent(node);
18684
grandparent = cmark_node_parent(parent);
18685
if (grandparent != NULL && grandparent->type == CMARK_NODE_LIST) {
18686
tight = grandparent->as.list.tight;
18687
} else {
18688
tight = false;
18689
}
18690
if (!tight) {
18691
if (entering) {
18692
cr(html);
18693
cmark_strbuf_puts(html, "<p");
18694
S_render_sourcepos(node, html, options);
18695
cmark_strbuf_putc(html, '>');
18696
} else {
18697
cmark_strbuf_puts(html, "</p>\n");
18698
}
18699
}
18700
break;
18701
18702
case CMARK_NODE_TEXT:
18703
escape_html(html, node->as.literal.data, node->as.literal.len);
18704
break;
18705
18706
case CMARK_NODE_LINEBREAK:
18707
cmark_strbuf_puts(html, "<br />\n");
18708
break;
18709
18710
case CMARK_NODE_SOFTBREAK:
18711
if (options & CMARK_OPT_HARDBREAKS) {
18712
cmark_strbuf_puts(html, "<br />\n");
18713
} else if (options & CMARK_OPT_NOBREAKS) {
18714
cmark_strbuf_putc(html, ' ');
18715
} else {
18716
cmark_strbuf_putc(html, '\n');
18717
}
18718
break;
18719
18720
case CMARK_NODE_CODE:
18721
cmark_strbuf_puts(html, "<code>");
18722
escape_html(html, node->as.literal.data, node->as.literal.len);
18723
cmark_strbuf_puts(html, "</code>");
18724
break;
18725
18726
case CMARK_NODE_HTML_INLINE:
18727
if (options & CMARK_OPT_SAFE) {
18728
cmark_strbuf_puts(html, "<!-- raw HTML omitted -->");
18729
} else {
18730
cmark_strbuf_put(html, node->as.literal.data, node->as.literal.len);
18731
}
18732
break;
18733
18734
case CMARK_NODE_CUSTOM_INLINE:
18735
if (entering) {
18736
cmark_strbuf_put(html, node->as.custom.on_enter.data,
18737
node->as.custom.on_enter.len);
18738
} else {
18739
cmark_strbuf_put(html, node->as.custom.on_exit.data,
18740
node->as.custom.on_exit.len);
18741
}
18742
break;
18743
18744
case CMARK_NODE_STRONG:
18745
if (entering) {
18746
cmark_strbuf_puts(html, "<strong>");
18747
} else {
18748
cmark_strbuf_puts(html, "</strong>");
18749
}
18750
break;
18751
18752
case CMARK_NODE_EMPH:
18753
if (entering) {
18754
cmark_strbuf_puts(html, "<em>");
18755
} else {
18756
cmark_strbuf_puts(html, "</em>");
18757
}
18758
break;
18759
18760
case CMARK_NODE_LINK:
18761
if (entering) {
18762
cmark_strbuf_puts(html, "<a href=\"");
18763
if (!((options & CMARK_OPT_SAFE) &&
18764
scan_dangerous_url(&node->as.link.url, 0))) {
18765
houdini_escape_href(html, node->as.link.url.data,
18766
node->as.link.url.len);
18767
}
18768
if (node->as.link.title.len) {
18769
cmark_strbuf_puts(html, "\" title=\"");
18770
escape_html(html, node->as.link.title.data, node->as.link.title.len);
18771
}
18772
cmark_strbuf_puts(html, "\">");
18773
} else {
18774
cmark_strbuf_puts(html, "</a>");
18775
}
18776
break;
18777
18778
case CMARK_NODE_IMAGE:
18779
if (entering) {
18780
cmark_strbuf_puts(html, "<img src=\"");
18781
if (!((options & CMARK_OPT_SAFE) &&
18782
scan_dangerous_url(&node->as.link.url, 0))) {
18783
houdini_escape_href(html, node->as.link.url.data,
18784
node->as.link.url.len);
18785
}
18786
cmark_strbuf_puts(html, "\" alt=\"");
18787
state->plain = node;
18788
} else {
18789
if (node->as.link.title.len) {
18790
cmark_strbuf_puts(html, "\" title=\"");
18791
escape_html(html, node->as.link.title.data, node->as.link.title.len);
18792
}
18793
18794
cmark_strbuf_puts(html, "\" />");
18795
}
18796
break;
18797
18798
default:
18799
assert(false);
18800
break;
18801
}
18802
18803
// cmark_strbuf_putc(html, 'x');
18804
return 1;
18805
}
18806
18807
char *cmark_render_html(cmark_node *root, int options) {
18808
char *result;
18809
cmark_strbuf html = CMARK_BUF_INIT(cmark_node_mem(root));
18810
cmark_event_type ev_type;
18811
cmark_node *cur;
18812
struct render_state state = {&html, NULL};
18813
cmark_iter *iter = cmark_iter_new(root);
18814
18815
while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
18816
cur = cmark_iter_get_node(iter);
18817
S_render_node(cur, ev_type, &state, options);
18818
}
18819
result = (char *)cmark_strbuf_detach(&html);
18820
18821
cmark_iter_free(iter);
18822
return result;
18823
}
18824
18825
18826
18827
/**
18828
* According to the OWASP rules:
18829
*
18830
* & --> &amp;
18831
* < --> &lt;
18832
* > --> &gt;
18833
* " --> &quot;
18834
* ' --> &#x27; &apos; is not recommended
18835
* / --> &#x2F; forward slash is included as it helps end an HTML entity
18836
*
18837
*/
18838
static const char HTML_ESCAPE_TABLE[] = {
18839
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18840
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 4,
18841
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18842
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18843
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18844
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18845
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18846
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18847
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18848
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18849
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18850
};
18851
18852
static const char *HTML_ESCAPES[] = {"", "&quot;", "&amp;", "&#39;",
18853
"&#47;", "&lt;", "&gt;"};
18854
18855
int houdini_escape_html0(cmark_strbuf *ob, const uint8_t *src, bufsize_t size,
18856
int secure) {
18857
bufsize_t i = 0, org, esc = 0;
18858
18859
while (i < size) {
18860
org = i;
18861
while (i < size && (esc = HTML_ESCAPE_TABLE[src[i]]) == 0)
18862
i++;
18863
18864
if (i > org)
18865
cmark_strbuf_put(ob, src + org, i - org);
18866
18867
/* escaping */
18868
if (unlikely(i >= size))
18869
break;
18870
18871
/* The forward slash is only escaped in secure mode */
18872
if ((src[i] == '/' || src[i] == '\'') && !secure) {
18873
cmark_strbuf_putc(ob, src[i]);
18874
} else {
18875
cmark_strbuf_puts(ob, HTML_ESCAPES[esc]);
18876
}
18877
18878
i++;
18879
}
18880
18881
return 1;
18882
}
18883
18884
int houdini_escape_html(cmark_strbuf *ob, const uint8_t *src, bufsize_t size) {
18885
return houdini_escape_html0(ob, src, size, 1);
18886
}
18887
18888
18889
/*
18890
* The following characters will not be escaped:
18891
*
18892
* -_.+!*'(),%#@?=;:/,+&$ alphanum
18893
*
18894
* Note that this character set is the addition of:
18895
*
18896
* - The characters which are safe to be in an URL
18897
* - The characters which are *not* safe to be in
18898
* an URL because they are RESERVED characters.
18899
*
18900
* We asume (lazily) that any RESERVED char that
18901
* appears inside an URL is actually meant to
18902
* have its native function (i.e. as an URL
18903
* component/separator) and hence needs no escaping.
18904
*
18905
* There are two exceptions: the chacters & (amp)
18906
* and ' (single quote) do not appear in the table.
18907
* They are meant to appear in the URL as components,
18908
* yet they require special HTML-entity escaping
18909
* to generate valid HTML markup.
18910
*
18911
* All other characters will be escaped to %XX.
18912
*
18913
*/
18914
static const char HREF_SAFE[] = {
18915
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18916
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
18917
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
18918
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1,
18919
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
18920
1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18921
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18922
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18923
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18924
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18925
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18926
};
18927
18928
int houdini_escape_href(cmark_strbuf *ob, const uint8_t *src, bufsize_t size) {
18929
static const uint8_t hex_chars[] = "0123456789ABCDEF";
18930
bufsize_t i = 0, org;
18931
uint8_t hex_str[3];
18932
18933
hex_str[0] = '%';
18934
18935
while (i < size) {
18936
org = i;
18937
while (i < size && HREF_SAFE[src[i]] != 0)
18938
i++;
18939
18940
if (likely(i > org))
18941
cmark_strbuf_put(ob, src + org, i - org);
18942
18943
/* escaping */
18944
if (i >= size)
18945
break;
18946
18947
switch (src[i]) {
18948
/* amp appears all the time in URLs, but needs
18949
* HTML-entity escaping to be inside an href */
18950
case '&':
18951
cmark_strbuf_puts(ob, "&amp;");
18952
break;
18953
18954
/* the single quote is a valid URL character
18955
* according to the standard; it needs HTML
18956
* entity escaping too */
18957
case '\'':
18958
cmark_strbuf_puts(ob, "&#x27;");
18959
break;
18960
18961
/* the space can be escaped to %20 or a plus
18962
* sign. we're going with the generic escape
18963
* for now. the plus thing is more commonly seen
18964
* when building GET strings */
18965
#if 0
18966
case ' ':
18967
cmark_strbuf_putc(ob, '+');
18968
break;
18969
#endif
18970
18971
/* every other character goes with a %XX escaping */
18972
default:
18973
hex_str[1] = hex_chars[(src[i] >> 4) & 0xF];
18974
hex_str[2] = hex_chars[src[i] & 0xF];
18975
cmark_strbuf_put(ob, hex_str, 3);
18976
}
18977
18978
i++;
18979
}
18980
18981
return 1;
18982
}
18983

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button