1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
#ifndef CMARK_AST_H
#define CMARK_AST_H
#include <stdio.h>
#include "config.h"
#include "node.h"
#include "buffer.h"
#include "chunk.h"
#include "cmark.h"
#ifdef __cplusplus
extern "C" {
#endif
#define REFMAP_SIZE 16
#define MAX_LINK_LABEL_LENGTH 1000
struct cmark_reference {
struct cmark_reference *next;
unsigned char *label;
unsigned char *url;
unsigned char *title;
unsigned int hash;
};
typedef struct cmark_reference cmark_reference;
struct cmark_reference_map {
cmark_reference *table[REFMAP_SIZE];
};
typedef struct cmark_reference_map cmark_reference_map;
struct cmark_doc_parser {
struct cmark_reference_map *refmap;
struct cmark_node* root;
struct cmark_node* current;
int line_number;
cmark_strbuf *curline;
};
unsigned char *cmark_clean_autolink(chunk *url, int is_email);
static inline cmark_node *cmark_make_link(cmark_node *label, unsigned char *url, unsigned char *title)
{
cmark_node* e = (cmark_node *)calloc(1, sizeof(*e));
if(e != NULL) {
e->type = CMARK_NODE_LINK;
e->as.link.label = label;
e->as.link.url = url;
e->as.link.title = title;
e->next = NULL;
}
return e;
}
static inline cmark_node* cmark_make_autolink(cmark_node* label, cmark_chunk url, int is_email)
{
return cmark_make_link(label, cmark_clean_autolink(&url, is_email), NULL);
}
static inline cmark_node* cmark_make_inlines(cmark_node_type t, cmark_node* contents)
{
cmark_node * e = (cmark_node *)calloc(1, sizeof(*e));
if(e != NULL) {
e->type = t;
e->first_child = contents;
e->next = NULL;
}
return e;
}
// Create an inline with a literal string value.
static inline cmark_node* cmark_make_literal(cmark_node_type t, cmark_chunk s)
{
cmark_node * e = (cmark_node *)calloc(1, sizeof(*e));
if(e != NULL) {
e->type = t;
e->as.literal = s;
e->next = NULL;
}
return e;
}
// Create an inline with no value.
static inline cmark_node* cmark_make_simple(cmark_node_type t)
{
cmark_node* e = (cmark_node *)calloc(1, sizeof(*e));
if(e != NULL) {
e->type = t;
e->next = NULL;
}
return e;
}
// Macros for creating various kinds of simple.
#define cmark_make_str(s) cmark_make_literal(CMARK_NODE_STRING, s)
#define cmark_make_code(s) cmark_make_literal(CMARK_NODE_INLINE_CODE, s)
#define cmark_make_raw_html(s) cmark_make_literal(CMARK_NODE_INLINE_HTML, s)
#define cmark_make_linebreak() cmark_make_simple(CMARK_NODE_LINEBREAK)
#define cmark_make_softbreak() cmark_make_simple(CMARK_NODE_SOFTBREAK)
#define cmark_make_emph(contents) cmark_make_inlines(CMARK_NODE_EMPH, contents)
#define cmark_make_strong(contents) cmark_make_inlines(CMARK_NODE_STRONG, contents)
#ifndef CMARK_NO_SHORT_NAMES
#define make_link cmark_make_link
#define make_autolink cmark_make_autolink
#define make_str cmark_make_str
#define make_code cmark_make_code
#define make_raw_html cmark_make_raw_html
#define make_linebreak cmark_make_linebreak
#define make_softbreak cmark_make_softbreak
#define make_emph cmark_make_emph
#define make_strong cmark_make_strong
#define make_simple cmark_make_simple
#define make_literal cmark_make_literal
#define make_inlines cmark_make_inlines
#endif
#ifdef __cplusplus
}
#endif
#endif
|