redcarpet 2.0.0b3 → 2.0.0b4

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of redcarpet might be problematic. Click here for more details.

data/ext/redcarpet/html.h CHANGED
@@ -30,7 +30,7 @@ struct html_renderopt {
30
30
  unsigned int flags;
31
31
 
32
32
  /* extra callbacks */
33
- void (*link_attributes)(struct buf *ob, struct buf *url, void *self);
33
+ void (*link_attributes)(struct buf *ob, const struct buf *url, void *self);
34
34
  };
35
35
 
36
36
  typedef enum {
@@ -38,12 +38,11 @@ typedef enum {
38
38
  HTML_SKIP_STYLE = (1 << 1),
39
39
  HTML_SKIP_IMAGES = (1 << 2),
40
40
  HTML_SKIP_LINKS = (1 << 3),
41
- HTML_EXPAND_TABS = (1 << 5),
42
- HTML_SAFELINK = (1 << 7),
43
- HTML_TOC = (1 << 8),
44
- HTML_HARD_WRAP = (1 << 9),
45
- HTML_GITHUB_BLOCKCODE = (1 << 10),
46
- HTML_USE_XHTML = (1 << 11),
41
+ HTML_EXPAND_TABS = (1 << 4),
42
+ HTML_SAFELINK = (1 << 5),
43
+ HTML_TOC = (1 << 6),
44
+ HTML_HARD_WRAP = (1 << 7),
45
+ HTML_USE_XHTML = (1 << 8),
47
46
  } html_render_mode;
48
47
 
49
48
  typedef enum {
@@ -53,10 +52,10 @@ typedef enum {
53
52
  } html_tag;
54
53
 
55
54
  void
56
- sdhtml_escape(struct buf *ob, const char *src, size_t size);
55
+ sdhtml_escape(struct buf *ob, const uint8_t *src, size_t size);
57
56
 
58
57
  int
59
- sdhtml_tag(const char *tag_data, size_t tag_size, const char *tagname);
58
+ sdhtml_tag(const uint8_t *tag_data, size_t tag_size, const char *tagname);
60
59
 
61
60
  extern void
62
61
  sdhtml_renderer(struct sd_callbacks *callbacks, struct html_renderopt *options_ptr, unsigned int render_flags);
@@ -65,7 +64,7 @@ extern void
65
64
  sdhtml_toc_renderer(struct sd_callbacks *callbacks, struct html_renderopt *options_ptr);
66
65
 
67
66
  extern void
68
- sdhtml_smartypants(struct buf *ob, struct buf *text);
67
+ sdhtml_smartypants(struct buf *ob, const uint8_t *text, size_t size);
69
68
 
70
69
  #endif
71
70
 
@@ -0,0 +1,205 @@
1
+ /* C code produced by gperf version 3.0.3 */
2
+ /* Command-line: gperf -N find_block_tag -H hash_block_tag -C -c -E --ignore-case html_block_names.txt */
3
+ /* Computed positions: -k'1-2' */
4
+
5
+ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
6
+ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
7
+ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
8
+ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
9
+ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
10
+ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
11
+ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
12
+ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
13
+ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
14
+ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
15
+ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
16
+ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
17
+ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
18
+ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
19
+ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
20
+ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
21
+ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
22
+ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
23
+ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
24
+ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
25
+ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
26
+ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
27
+ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
28
+ /* The character set is not based on ISO-646. */
29
+ error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
30
+ #endif
31
+
32
+ /* maximum key range = 37, duplicates = 0 */
33
+
34
+ #ifndef GPERF_DOWNCASE
35
+ #define GPERF_DOWNCASE 1
36
+ static unsigned char gperf_downcase[256] =
37
+ {
38
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
39
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
40
+ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
41
+ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
42
+ 60, 61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
43
+ 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
44
+ 122, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
45
+ 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
46
+ 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
47
+ 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
48
+ 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
49
+ 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
50
+ 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194,
51
+ 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
52
+ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
53
+ 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
54
+ 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
55
+ 255
56
+ };
57
+ #endif
58
+
59
+ #ifndef GPERF_CASE_STRNCMP
60
+ #define GPERF_CASE_STRNCMP 1
61
+ static int
62
+ gperf_case_strncmp (s1, s2, n)
63
+ register const char *s1;
64
+ register const char *s2;
65
+ register unsigned int n;
66
+ {
67
+ for (; n > 0;)
68
+ {
69
+ unsigned char c1 = gperf_downcase[(unsigned char)*s1++];
70
+ unsigned char c2 = gperf_downcase[(unsigned char)*s2++];
71
+ if (c1 != 0 && c1 == c2)
72
+ {
73
+ n--;
74
+ continue;
75
+ }
76
+ return (int)c1 - (int)c2;
77
+ }
78
+ return 0;
79
+ }
80
+ #endif
81
+
82
+ #ifdef __GNUC__
83
+ __inline
84
+ #else
85
+ #ifdef __cplusplus
86
+ inline
87
+ #endif
88
+ #endif
89
+ static unsigned int
90
+ hash_block_tag (str, len)
91
+ register const char *str;
92
+ register unsigned int len;
93
+ {
94
+ static const unsigned char asso_values[] =
95
+ {
96
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
97
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
98
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
99
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
100
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
101
+ 8, 30, 25, 20, 15, 10, 38, 38, 38, 38,
102
+ 38, 38, 38, 38, 38, 38, 0, 38, 0, 38,
103
+ 5, 5, 5, 15, 0, 38, 38, 0, 15, 10,
104
+ 0, 38, 38, 15, 0, 5, 38, 38, 38, 38,
105
+ 38, 38, 38, 38, 38, 38, 38, 38, 0, 38,
106
+ 0, 38, 5, 5, 5, 15, 0, 38, 38, 0,
107
+ 15, 10, 0, 38, 38, 15, 0, 5, 38, 38,
108
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
109
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
110
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
111
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
112
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
113
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
114
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
115
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
116
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
117
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
118
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
119
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
120
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
121
+ 38, 38, 38, 38, 38, 38, 38
122
+ };
123
+ register int hval = len;
124
+
125
+ switch (hval)
126
+ {
127
+ default:
128
+ hval += asso_values[(unsigned char)str[1]+1];
129
+ /*FALLTHROUGH*/
130
+ case 1:
131
+ hval += asso_values[(unsigned char)str[0]];
132
+ break;
133
+ }
134
+ return hval;
135
+ }
136
+
137
+ #ifdef __GNUC__
138
+ __inline
139
+ #ifdef __GNUC_STDC_INLINE__
140
+ __attribute__ ((__gnu_inline__))
141
+ #endif
142
+ #endif
143
+ const char *
144
+ find_block_tag (str, len)
145
+ register const char *str;
146
+ register unsigned int len;
147
+ {
148
+ enum
149
+ {
150
+ TOTAL_KEYWORDS = 23,
151
+ MIN_WORD_LENGTH = 1,
152
+ MAX_WORD_LENGTH = 10,
153
+ MIN_HASH_VALUE = 1,
154
+ MAX_HASH_VALUE = 37
155
+ };
156
+
157
+ static const char * const wordlist[] =
158
+ {
159
+ "",
160
+ "p",
161
+ "dl",
162
+ "div",
163
+ "math",
164
+ "table",
165
+ "",
166
+ "ul",
167
+ "del",
168
+ "form",
169
+ "blockquote",
170
+ "figure",
171
+ "ol",
172
+ "fieldset",
173
+ "",
174
+ "h1",
175
+ "",
176
+ "h6",
177
+ "pre",
178
+ "", "",
179
+ "script",
180
+ "h5",
181
+ "noscript",
182
+ "", "",
183
+ "iframe",
184
+ "h4",
185
+ "ins",
186
+ "", "", "",
187
+ "h3",
188
+ "", "", "", "",
189
+ "h2"
190
+ };
191
+
192
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
193
+ {
194
+ register int key = hash_block_tag (str, len);
195
+
196
+ if (key <= MAX_HASH_VALUE && key >= 0)
197
+ {
198
+ register const char *s = wordlist[key];
199
+
200
+ if ((((unsigned char)*str ^ (unsigned char)*s) & ~32) == 0 && !gperf_case_strncmp (str, s, len) && s[len] == '\0')
201
+ return s;
202
+ }
203
+ }
204
+ return 0;
205
+ }
@@ -27,18 +27,19 @@ struct smartypants_data {
27
27
  int in_dquote;
28
28
  };
29
29
 
30
- static size_t smartypants_cb__ltag(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size);
31
- static size_t smartypants_cb__dquote(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size);
32
- static size_t smartypants_cb__amp(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size);
33
- static size_t smartypants_cb__period(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size);
34
- static size_t smartypants_cb__number(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size);
35
- static size_t smartypants_cb__dash(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size);
36
- static size_t smartypants_cb__parens(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size);
37
- static size_t smartypants_cb__squote(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size);
38
- static size_t smartypants_cb__backtick(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size);
30
+ static size_t smartypants_cb__ltag(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
31
+ static size_t smartypants_cb__dquote(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
32
+ static size_t smartypants_cb__amp(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
33
+ static size_t smartypants_cb__period(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
34
+ static size_t smartypants_cb__number(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
35
+ static size_t smartypants_cb__dash(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
36
+ static size_t smartypants_cb__parens(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
37
+ static size_t smartypants_cb__squote(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
38
+ static size_t smartypants_cb__backtick(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
39
+ static size_t smartypants_cb__escape(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
39
40
 
40
41
  static size_t (*smartypants_cb_ptrs[])
41
- (struct buf *, struct smartypants_data *, char, const char *, size_t) =
42
+ (struct buf *, struct smartypants_data *, uint8_t, const uint8_t *, size_t) =
42
43
  {
43
44
  NULL, /* 0 */
44
45
  smartypants_cb__dash, /* 1 */
@@ -50,15 +51,16 @@ static size_t (*smartypants_cb_ptrs[])
50
51
  smartypants_cb__number, /* 7 */
51
52
  smartypants_cb__ltag, /* 8 */
52
53
  smartypants_cb__backtick, /* 9 */
54
+ smartypants_cb__escape, /* 10 */
53
55
  };
54
56
 
55
- static const char smartypants_cb_chars[] = {
57
+ static const uint8_t smartypants_cb_chars[] = {
56
58
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
57
59
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
58
60
  0, 0, 4, 0, 0, 0, 5, 3, 2, 0, 0, 0, 0, 1, 6, 0,
59
61
  0, 7, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0,
60
62
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
61
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
63
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
62
64
  9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
63
65
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
64
66
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -72,13 +74,13 @@ static const char smartypants_cb_chars[] = {
72
74
  };
73
75
 
74
76
  static inline int
75
- word_boundary(char c)
77
+ word_boundary(uint8_t c)
76
78
  {
77
79
  return c == 0 || isspace(c) || ispunct(c);
78
80
  }
79
81
 
80
82
  static int
81
- smartypants_quotes(struct buf *ob, char previous_char, char next_char, char quote, int *is_open)
83
+ smartypants_quotes(struct buf *ob, uint8_t previous_char, uint8_t next_char, uint8_t quote, int *is_open)
82
84
  {
83
85
  char ent[8];
84
86
 
@@ -95,10 +97,10 @@ smartypants_quotes(struct buf *ob, char previous_char, char next_char, char quot
95
97
  }
96
98
 
97
99
  static size_t
98
- smartypants_cb__squote(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size)
100
+ smartypants_cb__squote(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
99
101
  {
100
102
  if (size >= 2) {
101
- char t1 = tolower(text[1]);
103
+ uint8_t t1 = tolower(text[1]);
102
104
 
103
105
  if (t1 == '\'') {
104
106
  if (smartypants_quotes(ob, previous_char, size >= 3 ? text[2] : 0, 'd', &smrt->in_dquote))
@@ -112,7 +114,7 @@ smartypants_cb__squote(struct buf *ob, struct smartypants_data *smrt, char previ
112
114
  }
113
115
 
114
116
  if (size >= 3) {
115
- char t2 = tolower(text[2]);
117
+ uint8_t t2 = tolower(text[2]);
116
118
 
117
119
  if (((t1 == 'r' && t2 == 'e') ||
118
120
  (t1 == 'l' && t2 == 'l') ||
@@ -132,11 +134,11 @@ smartypants_cb__squote(struct buf *ob, struct smartypants_data *smrt, char previ
132
134
  }
133
135
 
134
136
  static size_t
135
- smartypants_cb__parens(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size)
137
+ smartypants_cb__parens(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
136
138
  {
137
139
  if (size >= 3) {
138
- char t1 = tolower(text[1]);
139
- char t2 = tolower(text[2]);
140
+ uint8_t t1 = tolower(text[1]);
141
+ uint8_t t2 = tolower(text[2]);
140
142
 
141
143
  if (t1 == 'c' && t2 == ')') {
142
144
  BUFPUTSL(ob, "&copy;");
@@ -153,13 +155,13 @@ smartypants_cb__parens(struct buf *ob, struct smartypants_data *smrt, char previ
153
155
  return 3;
154
156
  }
155
157
  }
156
-
158
+
157
159
  bufputc(ob, text[0]);
158
160
  return 0;
159
161
  }
160
162
 
161
163
  static size_t
162
- smartypants_cb__dash(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size)
164
+ smartypants_cb__dash(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
163
165
  {
164
166
  if (size >= 3 && text[1] == '-' && text[2] == '-') {
165
167
  BUFPUTSL(ob, "&mdash;");
@@ -176,7 +178,7 @@ smartypants_cb__dash(struct buf *ob, struct smartypants_data *smrt, char previou
176
178
  }
177
179
 
178
180
  static size_t
179
- smartypants_cb__amp(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size)
181
+ smartypants_cb__amp(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
180
182
  {
181
183
  if (size >= 6 && memcmp(text, "&quot;", 6) == 0) {
182
184
  if (smartypants_quotes(ob, previous_char, size >= 7 ? text[6] : 0, 'd', &smrt->in_dquote))
@@ -191,7 +193,7 @@ smartypants_cb__amp(struct buf *ob, struct smartypants_data *smrt, char previous
191
193
  }
192
194
 
193
195
  static size_t
194
- smartypants_cb__period(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size)
196
+ smartypants_cb__period(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
195
197
  {
196
198
  if (size >= 3 && text[1] == '.' && text[2] == '.') {
197
199
  BUFPUTSL(ob, "&hellip;");
@@ -208,7 +210,7 @@ smartypants_cb__period(struct buf *ob, struct smartypants_data *smrt, char previ
208
210
  }
209
211
 
210
212
  static size_t
211
- smartypants_cb__backtick(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size)
213
+ smartypants_cb__backtick(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
212
214
  {
213
215
  if (size >= 2 && text[1] == '`') {
214
216
  if (smartypants_quotes(ob, previous_char, size >= 3 ? text[2] : 0, 'd', &smrt->in_dquote))
@@ -219,7 +221,7 @@ smartypants_cb__backtick(struct buf *ob, struct smartypants_data *smrt, char pre
219
221
  }
220
222
 
221
223
  static size_t
222
- smartypants_cb__number(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size)
224
+ smartypants_cb__number(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
223
225
  {
224
226
  if (word_boundary(previous_char) && size >= 3) {
225
227
  if (text[0] == '1' && text[1] == '/' && text[2] == '2') {
@@ -251,7 +253,7 @@ smartypants_cb__number(struct buf *ob, struct smartypants_data *smrt, char previ
251
253
  }
252
254
 
253
255
  static size_t
254
- smartypants_cb__dquote(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size)
256
+ smartypants_cb__dquote(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
255
257
  {
256
258
  if (!smartypants_quotes(ob, previous_char, size > 0 ? text[1] : 0, 'd', &smrt->in_dquote))
257
259
  BUFPUTSL(ob, "&quot;");
@@ -260,7 +262,7 @@ smartypants_cb__dquote(struct buf *ob, struct smartypants_data *smrt, char previ
260
262
  }
261
263
 
262
264
  static size_t
263
- smartypants_cb__ltag(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size)
265
+ smartypants_cb__ltag(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
264
266
  {
265
267
  static const char *skip_tags[] = {"pre", "code", "kbd", "script"};
266
268
  static const size_t skip_tags_count = 4;
@@ -297,11 +299,33 @@ smartypants_cb__ltag(struct buf *ob, struct smartypants_data *smrt, char previou
297
299
  return i;
298
300
  }
299
301
 
302
+ static size_t
303
+ smartypants_cb__escape(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
304
+ {
305
+ if (size < 2)
306
+ return 0;
307
+
308
+ switch (text[1]) {
309
+ case '\\':
310
+ case '"':
311
+ case '\'':
312
+ case '.':
313
+ case '-':
314
+ case '`':
315
+ bufputc(ob, text[1]);
316
+ return 1;
317
+
318
+ default:
319
+ bufputc(ob, '\\');
320
+ return 0;
321
+ }
322
+ }
323
+
300
324
  #if 0
301
325
  static struct {
302
- char c0;
303
- const char *pattern;
304
- const char *entity;
326
+ uint8_t c0;
327
+ const uint8_t *pattern;
328
+ const uint8_t *entity;
305
329
  int skip;
306
330
  } smartypants_subs[] = {
307
331
  { '\'', "'s>", "&rsquo;", 0 },
@@ -328,7 +352,7 @@ static struct {
328
352
  #endif
329
353
 
330
354
  void
331
- sdhtml_smartypants(struct buf *ob, struct buf *text)
355
+ sdhtml_smartypants(struct buf *ob, const uint8_t *text, size_t size)
332
356
  {
333
357
  size_t i;
334
358
  struct smartypants_data smrt = {0, 0};
@@ -336,22 +360,22 @@ sdhtml_smartypants(struct buf *ob, struct buf *text)
336
360
  if (!text)
337
361
  return;
338
362
 
339
- bufgrow(ob, text->size);
363
+ bufgrow(ob, size);
340
364
 
341
- for (i = 0; i < text->size; ++i) {
365
+ for (i = 0; i < size; ++i) {
342
366
  size_t org;
343
- char action = 0;
367
+ uint8_t action = 0;
344
368
 
345
369
  org = i;
346
- while (i < text->size && (action = smartypants_cb_chars[(unsigned char)text->data[i]]) == 0)
370
+ while (i < size && (action = smartypants_cb_chars[text[i]]) == 0)
347
371
  i++;
348
372
 
349
373
  if (i > org)
350
- bufput(ob, text->data + org, i - org);
374
+ bufput(ob, text + org, i - org);
351
375
 
352
- if (i < text->size) {
376
+ if (i < size) {
353
377
  i += smartypants_cb_ptrs[(int)action]
354
- (ob, &smrt, i ? text->data[i - 1] : 0, text->data + i, text->size - i);
378
+ (ob, &smrt, i ? text[i - 1] : 0, text + i, size - i);
355
379
  }
356
380
  }
357
381
  }