1#ifndef CMARK_CHUNK_H
2#define CMARK_CHUNK_H
3
4#include <string.h>
5#include <stdlib.h>
6#include <assert.h>
7#include "cmark.h"
8#include "buffer.h"
9#include "cmark_ctype.h"
10
11#define CMARK_CHUNK_EMPTY \
12 { NULL, 0 }
13
14typedef struct {
15 const unsigned char *data;
16 bufsize_t len;
17} cmark_chunk;
18
19// NOLINTNEXTLINE(clang-diagnostic-unused-function)
20static CMARK_INLINE void cmark_chunk_free(cmark_chunk *c) {
21 c->data = NULL;
22 c->len = 0;
23}
24
25static CMARK_INLINE void cmark_chunk_ltrim(cmark_chunk *c) {
26 while (c->len && cmark_isspace(c->data[0])) {
27 c->data++;
28 c->len--;
29 }
30}
31
32static CMARK_INLINE void cmark_chunk_rtrim(cmark_chunk *c) {
33 while (c->len > 0) {
34 if (!cmark_isspace(c->data[c->len - 1]))
35 break;
36
37 c->len--;
38 }
39}
40
41// NOLINTNEXTLINE(clang-diagnostic-unused-function)
42static CMARK_INLINE void cmark_chunk_trim(cmark_chunk *c) {
43 cmark_chunk_ltrim(c);
44 cmark_chunk_rtrim(c);
45}
46
47// NOLINTNEXTLINE(clang-diagnostic-unused-function)
48static CMARK_INLINE bufsize_t cmark_chunk_strchr(cmark_chunk *ch, int c,
49 bufsize_t offset) {
50 const unsigned char *p =
51 (unsigned char *)memchr(ch->data + offset, c, ch->len - offset);
52 return p ? (bufsize_t)(p - ch->data) : ch->len;
53}
54
55// NOLINTNEXTLINE(clang-diagnostic-unused-function)
56static CMARK_INLINE cmark_chunk cmark_chunk_literal(const char *data) {
57 bufsize_t len = data ? (bufsize_t)strlen(data) : 0;
58 cmark_chunk c = {(unsigned char *)data, len};
59 return c;
60}
61
62// NOLINTNEXTLINE(clang-diagnostic-unused-function)
63static CMARK_INLINE cmark_chunk cmark_chunk_dup(const cmark_chunk *ch,
64 bufsize_t pos, bufsize_t len) {
65 cmark_chunk c = {ch->data + pos, len};
66 return c;
67}
68
69#endif
70