Coverage Report

Created: 2024-02-25 06:38

/src/hoextdown/src/buffer.c
Line
Count
Source (jump to first uncovered line)
1
#include "buffer.h"
2
3
#include <stdio.h>
4
#include <stdlib.h>
5
#include <string.h>
6
#include <assert.h>
7
8
void *
9
hoedown_malloc(size_t size)
10
1.53M
{
11
1.53M
  void *ret = malloc(size);
12
13
1.53M
  if (!ret) {
14
0
    fprintf(stderr, "Allocation failed.\n");
15
0
    abort();
16
0
  }
17
18
1.53M
  return ret;
19
1.53M
}
20
21
void *
22
hoedown_calloc(size_t nmemb, size_t size)
23
1.18M
{
24
1.18M
  void *ret = calloc(nmemb, size);
25
26
1.18M
  if (!ret) {
27
0
    fprintf(stderr, "Allocation failed.\n");
28
0
    abort();
29
0
  }
30
31
1.18M
  return ret;
32
1.18M
}
33
34
void *
35
hoedown_realloc(void *ptr, size_t size)
36
3.45M
{
37
3.45M
  void *ret = realloc(ptr, size);
38
39
3.45M
  if (!ret) {
40
0
    fprintf(stderr, "Allocation failed.\n");
41
0
    abort();
42
0
  }
43
44
3.45M
  return ret;
45
3.45M
}
46
47
void
48
hoedown_buffer_init(
49
  hoedown_buffer *buf,
50
  size_t unit,
51
  hoedown_realloc_callback data_realloc,
52
  hoedown_free_callback data_free,
53
  hoedown_free_callback buffer_free)
54
1.50M
{
55
1.50M
  assert(buf);
56
57
1.50M
  buf->data = NULL;
58
1.50M
  buf->size = buf->asize = 0;
59
1.50M
  buf->unit = unit;
60
1.50M
  buf->data_realloc = data_realloc;
61
1.50M
  buf->data_free = data_free;
62
1.50M
  buf->buffer_free = buffer_free;
63
1.50M
}
64
65
void
66
hoedown_buffer_uninit(hoedown_buffer *buf)
67
0
{
68
0
  assert(buf && buf->unit);
69
0
  buf->data_free(buf->data);
70
0
}
71
72
hoedown_buffer *
73
hoedown_buffer_new(size_t unit)
74
1.50M
{
75
1.50M
  hoedown_buffer *ret = hoedown_malloc(sizeof (hoedown_buffer));
76
1.50M
  hoedown_buffer_init(ret, unit, hoedown_realloc, free, free);
77
1.50M
  return ret;
78
1.50M
}
79
80
void
81
hoedown_buffer_free(hoedown_buffer *buf)
82
1.92M
{
83
1.92M
  if (!buf) return;
84
1.50M
  assert(buf && buf->unit);
85
86
1.50M
  buf->data_free(buf->data);
87
88
1.50M
  if (buf->buffer_free)
89
1.50M
    buf->buffer_free(buf);
90
1.50M
}
91
92
void
93
hoedown_buffer_reset(hoedown_buffer *buf)
94
471
{
95
471
  assert(buf && buf->unit);
96
97
471
  buf->data_free(buf->data);
98
471
  buf->data = NULL;
99
471
  buf->size = buf->asize = 0;
100
471
}
101
102
void
103
hoedown_buffer_grow(hoedown_buffer *buf, size_t neosz)
104
4.01M
{
105
4.01M
  size_t neoasz;
106
4.01M
  assert(buf && buf->unit);
107
108
4.01M
  if (buf->asize >= neosz)
109
594k
    return;
110
111
3.42M
  neoasz = buf->asize + buf->unit;
112
68.2M
  while (neoasz < neosz)
113
64.8M
    neoasz += buf->unit;
114
115
3.42M
  buf->data = buf->data_realloc(buf->data, neoasz);
116
3.42M
  buf->asize = neoasz;
117
3.42M
}
118
119
void
120
hoedown_buffer_put(hoedown_buffer *buf, const uint8_t *data, size_t size)
121
83.9M
{
122
83.9M
  assert(buf && buf->unit);
123
124
83.9M
  if (buf->size + size > buf->asize)
125
1.74M
    hoedown_buffer_grow(buf, buf->size + size);
126
127
83.9M
  memcpy(buf->data + buf->size, data, size);
128
83.9M
  buf->size += size;
129
83.9M
}
130
131
void
132
hoedown_buffer_puts(hoedown_buffer *buf, const char *str)
133
39.2M
{
134
39.2M
  hoedown_buffer_put(buf, (const uint8_t *)str, strlen(str));
135
39.2M
}
136
137
void
138
hoedown_buffer_putc(hoedown_buffer *buf, uint8_t c)
139
161M
{
140
161M
  assert(buf && buf->unit);
141
142
161M
  if (buf->size >= buf->asize)
143
1.65M
    hoedown_buffer_grow(buf, buf->size + 1);
144
145
161M
  buf->data[buf->size] = c;
146
161M
  buf->size += 1;
147
161M
}
148
149
int
150
hoedown_buffer_putf(hoedown_buffer *buf, FILE *file)
151
0
{
152
0
  assert(buf && buf->unit);
153
154
0
  while (!(feof(file) || ferror(file))) {
155
0
    hoedown_buffer_grow(buf, buf->size + buf->unit);
156
0
    buf->size += fread(buf->data + buf->size, 1, buf->unit, file);
157
0
  }
158
159
0
  return ferror(file);
160
0
}
161
162
void
163
hoedown_buffer_set(hoedown_buffer *buf, const uint8_t *data, size_t size)
164
0
{
165
0
  assert(buf && buf->unit);
166
167
0
  if (size > buf->asize)
168
0
    hoedown_buffer_grow(buf, size);
169
170
0
  memcpy(buf->data, data, size);
171
0
  buf->size = size;
172
0
}
173
174
void
175
hoedown_buffer_sets(hoedown_buffer *buf, const char *str)
176
0
{
177
0
  hoedown_buffer_set(buf, (const uint8_t *)str, strlen(str));
178
0
}
179
180
int
181
hoedown_buffer_eq(const hoedown_buffer *buf, const uint8_t *data, size_t size)
182
0
{
183
0
  if (buf->size != size) return 0;
184
0
  return memcmp(buf->data, data, size) == 0;
185
0
}
186
187
int
188
hoedown_buffer_eqs(const hoedown_buffer *buf, const char *str)
189
0
{
190
0
  return hoedown_buffer_eq(buf, (const uint8_t *)str, strlen(str));
191
0
}
192
193
int
194
hoedown_buffer_prefix(const hoedown_buffer *buf, const char *prefix)
195
4.34k
{
196
4.34k
  size_t i;
197
198
5.04k
  for (i = 0; i < buf->size; ++i) {
199
5.04k
    if (prefix[i] == 0)
200
76
      return 0;
201
202
4.97k
    if (buf->data[i] != prefix[i])
203
4.26k
      return buf->data[i] - prefix[i];
204
4.97k
  }
205
206
0
  return 0;
207
4.34k
}
208
209
void
210
hoedown_buffer_slurp(hoedown_buffer *buf, size_t size)
211
388
{
212
388
  assert(buf && buf->unit);
213
214
388
  if (size >= buf->size) {
215
0
    buf->size = 0;
216
0
    return;
217
0
  }
218
219
388
  buf->size -= size;
220
388
  memmove(buf->data, buf->data + size, buf->size);
221
388
}
222
223
const char *
224
hoedown_buffer_cstr(hoedown_buffer *buf)
225
0
{
226
0
  assert(buf && buf->unit);
227
228
0
  if (buf->size < buf->asize && buf->data[buf->size] == 0)
229
0
    return (char *)buf->data;
230
231
0
  hoedown_buffer_grow(buf, buf->size + 1);
232
0
  buf->data[buf->size] = 0;
233
234
0
  return (char *)buf->data;
235
0
}
236
237
void
238
hoedown_buffer_printf(hoedown_buffer *buf, const char *fmt, ...)
239
186k
{
240
186k
  va_list ap;
241
186k
  int n;
242
243
186k
  assert(buf && buf->unit);
244
245
186k
  if (buf->size >= buf->asize)
246
904
    hoedown_buffer_grow(buf, buf->size + 1);
247
248
186k
  va_start(ap, fmt);
249
186k
  n = vsnprintf((char *)buf->data + buf->size, buf->asize - buf->size, fmt, ap);
250
186k
  va_end(ap);
251
252
186k
  if (n < 0) {
253
0
#ifndef _MSC_VER
254
0
    return;
255
#else
256
    va_start(ap, fmt);
257
    n = _vscprintf(fmt, ap);
258
    va_end(ap);
259
#endif
260
0
  }
261
262
186k
  if ((size_t)n >= buf->asize - buf->size) {
263
2.32k
    hoedown_buffer_grow(buf, buf->size + n + 1);
264
265
2.32k
    va_start(ap, fmt);
266
2.32k
    n = vsnprintf((char *)buf->data + buf->size, buf->asize - buf->size, fmt, ap);
267
2.32k
    va_end(ap);
268
2.32k
  }
269
270
186k
  if (n < 0)
271
0
    return;
272
273
186k
  buf->size += n;
274
186k
}
275
276
0
void hoedown_buffer_put_utf8(hoedown_buffer *buf, unsigned int c) {
277
0
  unsigned char unichar[4];
278
279
0
  assert(buf && buf->unit);
280
281
0
  if (c < 0x80) {
282
0
    hoedown_buffer_putc(buf, c);
283
0
  }
284
0
  else if (c < 0x800) {
285
0
    unichar[0] = 192 + (c / 64);
286
0
    unichar[1] = 128 + (c % 64);
287
0
    hoedown_buffer_put(buf, unichar, 2);
288
0
  }
289
0
  else if (c - 0xd800u < 0x800) {
290
0
    HOEDOWN_BUFPUTSL(buf, "\xef\xbf\xbd");
291
0
  }
292
0
  else if (c < 0x10000) {
293
0
    unichar[0] = 224 + (c / 4096);
294
0
    unichar[1] = 128 + (c / 64) % 64;
295
0
    unichar[2] = 128 + (c % 64);
296
0
    hoedown_buffer_put(buf, unichar, 3);
297
0
  }
298
0
  else if (c < 0x110000) {
299
0
    unichar[0] = 240 + (c / 262144);
300
0
    unichar[1] = 128 + (c / 4096) % 64;
301
0
    unichar[2] = 128 + (c / 64) % 64;
302
0
    unichar[3] = 128 + (c % 64);
303
0
    hoedown_buffer_put(buf, unichar, 4);
304
0
  }
305
0
  else {
306
0
    HOEDOWN_BUFPUTSL(buf, "\xef\xbf\xbd");
307
0
  }
308
0
}