cmark

My personal build of CMark ✏️

Commit
549c5dbd45c20fa30f42cd70b734e6447af3f1ba
Parent
9ba42f1a8b93237ea4bfc05f29972c3c3922ebaa
Author
John MacFarlane <jgm@berkeley.edu>
Date

Removed ast modules, moved these defs back to cmark.h.

Diffstat

8 files changed, 324 insertions, 340 deletions

Status File Name N° Changes Insertions Deletions
Modified src/CMakeLists.txt 2 0 2
Deleted src/ast.c 165 0 165
Deleted src/ast.h 170 0 170
Modified src/cmark.c 163 162 1
Modified src/cmark.h 160 159 1
Modified src/inlines.c 1 0 1
Modified src/references.c 1 1 0
Modified src/references.h 2 2 0
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
@@ -2,7 +2,6 @@ cmake_minimum_required(VERSION 2.8)
 set(LIBRARY "cmark-shared")
 set(HEADERS
   cmark.h
-  ast.h
   buffer.h
   chunk.h
   references.h
@@ -16,7 +15,6 @@ set(HEADERS
   )
 set(LIBRARY_SOURCES
   cmark.c
-  ast.c
   blocks.c
   inlines.c
   print.c
diff --git a/src/ast.c b/src/ast.c
@@ -1,165 +0,0 @@
-#include <stdbool.h>
-#include <stdio.h>
-#include "buffer.h"
-#include "ast.h"
-#include "references.h"
-#include "html/houdini.h"
-
-// Free a node_block list and any children.
-void cmark_free_blocks(cmark_node_block *e)
-{
-	cmark_node_block * next;
-	while (e != NULL) {
-		cmark_free_inlines(e->inline_content);
-		strbuf_free(&e->string_content);
-		if (e->tag == CMARK_BLOCK_FENCED_CODE) {
-			strbuf_free(&e->as.code.info);
-		} else if (e->tag == CMARK_BLOCK_DOCUMENT) {
-			reference_map_free(e->as.document.refmap);
-		}
-		if (e->last_child) {
-			// Splice children into list
-			e->last_child->next = e->next;
-			e->next = e->children;
-		}
-		next = e->next;
-		free(e);
-		e = next;
-	}
-}
-
-// Utility function used by free_inlines
-static void splice_into_list(cmark_node_inl* e, node_inl* children) {
-	cmark_node_inl * tmp;
-	if (children) {
-		tmp = children;
-		// Find last child
-		while (tmp->next) {
-			tmp = tmp->next;
-		}
-		// Splice children into list
-		tmp->next = e->next;
-		e->next = children;
-	}
-	return ;
-}
-
-// Free an inline list.  Avoid recursion to prevent stack overflows
-// on deeply nested structures.
-void cmark_free_inlines(cmark_node_inl* e)
-{
-	node_inl * next;
-
-	while (e != NULL) {
-		switch (e->tag){
-		case CMARK_INL_STRING:
-		case CMARK_INL_RAW_HTML:
-		case CMARK_INL_CODE:
-			cmark_chunk_free(&e->content.literal);
-			break;
-		case CMARK_INL_LINEBREAK:
-		case CMARK_INL_SOFTBREAK:
-			break;
-		case CMARK_INL_LINK:
-		case CMARK_INL_IMAGE:
-			free(e->content.linkable.url);
-			free(e->content.linkable.title);
-			splice_into_list(e, e->content.linkable.label);
-			break;
-		case CMARK_INL_EMPH:
-		case CMARK_INL_STRONG:
-		        splice_into_list(e, e->content.inlines);
-			break;
-		default:
-		        fprintf(stderr, "[WARN] (%s:%d) Unknown inline tag %d",
-				__FILE__, __LINE__, e->tag);
-			break;
-		}
-		next = e->next;
-		free(e);
-		e = next;
-	}
-}
-
-inline cmark_node_inl *cmark_make_link(cmark_node_inl *label, unsigned char *url, unsigned char *title)
-{
-	cmark_node_inl* e = calloc(1, sizeof(*e));
-	if(e != NULL) {
-		e->tag = CMARK_INL_LINK;
-		e->content.linkable.label = label;
-		e->content.linkable.url   = url;
-		e->content.linkable.title = title;
-		e->next = NULL;
-	}
-	return e;
-}
-
-unsigned char *clean_autolink(chunk *url, int is_email)
-{
-	strbuf buf = GH_BUF_INIT;
-
-	chunk_trim(url);
-
-	if (url->len == 0)
-		return NULL;
-
-	if (is_email)
-		strbuf_puts(&buf, "mailto:");
-
-	houdini_unescape_html_f(&buf, url->data, url->len);
-	return strbuf_detach(&buf);
-}
-
-cmark_node_inl* cmark_make_autolink(cmark_node_inl* label, chunk url, int is_email)
-{
-	return cmark_make_link(label, clean_autolink(&url, is_email), NULL);
-}
-
-inline cmark_node_inl* cmark_make_inlines(int t, cmark_node_inl* contents)
-{
-	cmark_node_inl * e = calloc(1, sizeof(*e));
-	if(e != NULL) {
-		e->tag = t;
-		e->content.inlines = contents;
-		e->next = NULL;
-	}
-	return e;
-}
-
-// Create an inline with a literal string value.
-inline cmark_node_inl* cmark_make_literal(int t, cmark_chunk s)
-{
-	cmark_node_inl * e = calloc(1, sizeof(*e));
-	if(e != NULL) {
-		e->tag = t;
-		e->content.literal = s;
-		e->next = NULL;
-	}
-	return e;
-}
-
-// Create an inline with no value.
-inline cmark_node_inl* cmark_make_simple(int t)
-{
-	cmark_node_inl* e = calloc(1, sizeof(*e));
-	if(e != NULL) {
-		e->tag = t;
-		e->next = NULL;
-	}
-	return e;
-}
-
-// Append inline list b to the end of inline list a.
-// Return pointer to head of new list.
-inline cmark_node_inl* cmark_append_inlines(cmark_node_inl* a, cmark_node_inl* b)
-{
-	if (a == NULL) {  // NULL acts like an empty list
-		return b;
-	}
-	cmark_node_inl* cur = a;
-	while (cur->next) {
-		cur = cur->next;
-	}
-	cur->next = b;
-	return a;
-}
diff --git a/src/ast.h b/src/ast.h
@@ -1,170 +0,0 @@
-#ifndef _AST_H_
-#define _AST_H_
-
-#include <stdbool.h>
-#include <stdio.h>
-#include "buffer.h"
-#include "chunk.h"
-#include "references.h"
-
-struct cmark_node_inl {
-	enum {
-		CMARK_INL_STRING,
-		CMARK_INL_SOFTBREAK,
-		CMARK_INL_LINEBREAK,
-		CMARK_INL_CODE,
-		CMARK_INL_RAW_HTML,
-		CMARK_INL_EMPH,
-		CMARK_INL_STRONG,
-		CMARK_INL_LINK,
-		CMARK_INL_IMAGE
-	} tag;
-	union {
-		cmark_chunk literal;
-		struct cmark_node_inl *inlines;
-		struct {
-			struct cmark_node_inl *label;
-			unsigned char *url;
-			unsigned char *title;
-		} linkable;
-	} content;
-	struct cmark_node_inl *next;
-};
-
-typedef struct cmark_node_inl cmark_node_inl;
-
-// Types for blocks
-struct cmark_ListData {
-	enum {
-		bullet,
-		ordered
-	}  list_type;
-	int               marker_offset;
-	int               padding;
-	int               start;
-	enum {
-		period,
-		parens
-	} delimiter;
-	unsigned char     bullet_char;
-	bool              tight;
-};
-
-struct cmark_FencedCodeData {
-	int               fence_length;
-	int               fence_offset;
-	unsigned char     fence_char;
-	cmark_strbuf      info;
-};
-
-struct cmark_node_block {
-	enum {
-		CMARK_BLOCK_DOCUMENT,
-		CMARK_BLOCK_BQUOTE,
-		CMARK_BLOCK_LIST,
-		CMARK_BLOCK_LIST_ITEM,
-		CMARK_BLOCK_FENCED_CODE,
-		CMARK_BLOCK_INDENTED_CODE,
-		CMARK_BLOCK_HTML,
-		CMARK_BLOCK_PARAGRAPH,
-		CMARK_BLOCK_ATX_HEADER,
-		CMARK_BLOCK_SETEXT_HEADER,
-		CMARK_BLOCK_HRULE,
-		CMARK_BLOCK_REFERENCE_DEF
-	} tag;
-	int start_line;
-	int start_column;
-	int end_line;
-	bool open;
-	bool last_line_blank;
-	struct cmark_node_block* children;
-	struct cmark_node_block* last_child;
-	struct cmark_node_block* parent;
-	struct cmark_node_block* top;
-	cmark_strbuf string_content;
-	cmark_node_inl* inline_content;
-
-	union  {
-		struct cmark_ListData list;
-		struct cmark_FencedCodeData code;
-		struct {
-			int level;
-		} header;
-		struct {
-			cmark_reference_map *refmap;
-		} document;
-	} as;
-
-	struct cmark_node_block *next;
-	struct cmark_node_block *prev;
-};
-
-typedef struct cmark_node_block cmark_node_block;
-
-void cmark_free_blocks(cmark_node_block *e);
-void cmark_free_inlines(cmark_node_inl* e);
-void cmark_free_simple(cmark_node_inl *e);
-cmark_node_inl* cmark_append_inlines(cmark_node_inl* a, cmark_node_inl* b);
-
-cmark_node_inl *cmark_make_link(cmark_node_inl *label, unsigned char *url, unsigned char *title);
-cmark_node_inl* cmark_make_autolink(cmark_node_inl* label, cmark_chunk url, int is_email);
-
-cmark_node_inl* cmark_make_inlines(int t, cmark_node_inl* contents);
-cmark_node_inl* cmark_make_literal(int t, cmark_chunk s);
-cmark_node_inl* cmark_make_simple(int t);
-
-// Macros for creating various kinds of simple.
-#define cmark_make_str(s) cmark_make_literal(INL_STRING, s)
-#define cmark_make_code(s) cmark_make_literal(INL_CODE, s)
-#define cmark_make_raw_html(s) cmark_make_literal(INL_RAW_HTML, s)
-#define cmark_make_linebreak() cmark_make_simple(INL_LINEBREAK)
-#define cmark_make_softbreak() cmark_make_simple(INL_SOFTBREAK)
-#define cmark_make_emph(contents) cmark_make_inlines(INL_EMPH, contents)
-#define cmark_make_strong(contents) cmark_make_inlines(INL_STRONG, contents)
-
-
-
-#ifndef CMARK_NO_SHORT_NAMES
-  #define node_inl                  cmark_node_inl
-  #define INL_STRING                CMARK_INL_STRING
-  #define INL_SOFTBREAK             CMARK_INL_SOFTBREAK
-  #define INL_LINEBREAK             CMARK_INL_LINEBREAK
-  #define INL_CODE                  CMARK_INL_CODE
-  #define INL_RAW_HTML              CMARK_INL_RAW_HTML
-  #define INL_EMPH                  CMARK_INL_EMPH
-  #define INL_STRONG                CMARK_INL_STRONG
-  #define INL_LINK                  CMARK_INL_LINK
-  #define INL_IMAGE                 CMARK_INL_IMAGE
-  #define ListData                  cmark_ListData
-  #define FencedCodeData            cmark_FencedCodeData
-  #define node_block                cmark_node_block
-  #define BLOCK_DOCUMENT            CMARK_BLOCK_DOCUMENT
-  #define BLOCK_BQUOTE              CMARK_BLOCK_BQUOTE
-  #define BLOCK_LIST                CMARK_BLOCK_LIST
-  #define BLOCK_LIST_ITEM           CMARK_BLOCK_LIST_ITEM
-  #define BLOCK_FENCED_CODE         CMARK_BLOCK_FENCED_CODE
-  #define BLOCK_INDENTED_CODE       CMARK_BLOCK_INDENTED_CODE
-  #define BLOCK_HTML                CMARK_BLOCK_HTML
-  #define BLOCK_PARAGRAPH           CMARK_BLOCK_PARAGRAPH
-  #define BLOCK_ATX_HEADER          CMARK_BLOCK_ATX_HEADER
-  #define BLOCK_SETEXT_HEADER       CMARK_BLOCK_SETEXT_HEADER
-  #define BLOCK_HRULE               CMARK_BLOCK_HRULE
-  #define BLOCK_REFERENCE_DEF       CMARK_BLOCK_REFERENCE_DEF
-  #define free_simple               cmark_free_simple
-  #define free_blocks               cmark_free_blocks
-  #define append_simple             cmark_append_simple
-  #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_simple              cmark_make_simple
-  #define make_simple              cmark_make_simple
-#endif
-
-#endif
diff --git a/src/cmark.c b/src/cmark.c
@@ -1,7 +1,9 @@
 #include <stdlib.h>
 #include <assert.h>
 #include <stdio.h>
-
+#include <stdbool.h>
+#include "references.h"
+#include "html/houdini.h"
 #include "cmark.h"
 #include "buffer.h"
 
@@ -21,3 +23,162 @@ extern unsigned char *cmark_markdown_to_html(unsigned char *text, int len)
 
 	return result;
 }
+
+// Free a node_block list and any children.
+void cmark_free_blocks(cmark_node_block *e)
+{
+	cmark_node_block * next;
+	while (e != NULL) {
+		cmark_free_inlines(e->inline_content);
+		strbuf_free(&e->string_content);
+		if (e->tag == CMARK_BLOCK_FENCED_CODE) {
+			strbuf_free(&e->as.code.info);
+		} else if (e->tag == CMARK_BLOCK_DOCUMENT) {
+			reference_map_free(e->as.document.refmap);
+		}
+		if (e->last_child) {
+			// Splice children into list
+			e->last_child->next = e->next;
+			e->next = e->children;
+		}
+		next = e->next;
+		free(e);
+		e = next;
+	}
+}
+
+// Utility function used by free_inlines
+static void splice_into_list(cmark_node_inl* e, node_inl* children) {
+	cmark_node_inl * tmp;
+	if (children) {
+		tmp = children;
+		// Find last child
+		while (tmp->next) {
+			tmp = tmp->next;
+		}
+		// Splice children into list
+		tmp->next = e->next;
+		e->next = children;
+	}
+	return ;
+}
+
+// Free an inline list.  Avoid recursion to prevent stack overflows
+// on deeply nested structures.
+void cmark_free_inlines(cmark_node_inl* e)
+{
+	node_inl * next;
+
+	while (e != NULL) {
+		switch (e->tag){
+		case CMARK_INL_STRING:
+		case CMARK_INL_RAW_HTML:
+		case CMARK_INL_CODE:
+			cmark_chunk_free(&e->content.literal);
+			break;
+		case CMARK_INL_LINEBREAK:
+		case CMARK_INL_SOFTBREAK:
+			break;
+		case CMARK_INL_LINK:
+		case CMARK_INL_IMAGE:
+			free(e->content.linkable.url);
+			free(e->content.linkable.title);
+			splice_into_list(e, e->content.linkable.label);
+			break;
+		case CMARK_INL_EMPH:
+		case CMARK_INL_STRONG:
+		        splice_into_list(e, e->content.inlines);
+			break;
+		default:
+		        fprintf(stderr, "[WARN] (%s:%d) Unknown inline tag %d",
+				__FILE__, __LINE__, e->tag);
+			break;
+		}
+		next = e->next;
+		free(e);
+		e = next;
+	}
+}
+
+inline cmark_node_inl *cmark_make_link(cmark_node_inl *label, unsigned char *url, unsigned char *title)
+{
+	cmark_node_inl* e = calloc(1, sizeof(*e));
+	if(e != NULL) {
+		e->tag = CMARK_INL_LINK;
+		e->content.linkable.label = label;
+		e->content.linkable.url   = url;
+		e->content.linkable.title = title;
+		e->next = NULL;
+	}
+	return e;
+}
+
+unsigned char *clean_autolink(chunk *url, int is_email)
+{
+	strbuf buf = GH_BUF_INIT;
+
+	chunk_trim(url);
+
+	if (url->len == 0)
+		return NULL;
+
+	if (is_email)
+		strbuf_puts(&buf, "mailto:");
+
+	houdini_unescape_html_f(&buf, url->data, url->len);
+	return strbuf_detach(&buf);
+}
+
+cmark_node_inl* cmark_make_autolink(cmark_node_inl* label, chunk url, int is_email)
+{
+	return cmark_make_link(label, clean_autolink(&url, is_email), NULL);
+}
+
+inline cmark_node_inl* cmark_make_inlines(int t, cmark_node_inl* contents)
+{
+	cmark_node_inl * e = calloc(1, sizeof(*e));
+	if(e != NULL) {
+		e->tag = t;
+		e->content.inlines = contents;
+		e->next = NULL;
+	}
+	return e;
+}
+
+// Create an inline with a literal string value.
+inline cmark_node_inl* cmark_make_literal(int t, cmark_chunk s)
+{
+	cmark_node_inl * e = calloc(1, sizeof(*e));
+	if(e != NULL) {
+		e->tag = t;
+		e->content.literal = s;
+		e->next = NULL;
+	}
+	return e;
+}
+
+// Create an inline with no value.
+inline cmark_node_inl* cmark_make_simple(int t)
+{
+	cmark_node_inl* e = calloc(1, sizeof(*e));
+	if(e != NULL) {
+		e->tag = t;
+		e->next = NULL;
+	}
+	return e;
+}
+
+// Append inline list b to the end of inline list a.
+// Return pointer to head of new list.
+inline cmark_node_inl* cmark_append_inlines(cmark_node_inl* a, cmark_node_inl* b)
+{
+	if (a == NULL) {  // NULL acts like an empty list
+		return b;
+	}
+	cmark_node_inl* cur = a;
+	while (cur->next) {
+		cur = cur->next;
+	}
+	cur->next = b;
+	return a;
+}
diff --git a/src/cmark.h b/src/cmark.h
@@ -4,7 +4,8 @@
 #include <stdbool.h>
 #include <stdio.h>
 #include "buffer.h"
-#include "ast.h"
+#include "chunk.h"
+#include "references.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -15,6 +16,121 @@ extern "C" {
 
 #define CMARK_MAX_LINK_LABEL_LENGTH 1000
 
+struct cmark_node_inl {
+	enum {
+		CMARK_INL_STRING,
+		CMARK_INL_SOFTBREAK,
+		CMARK_INL_LINEBREAK,
+		CMARK_INL_CODE,
+		CMARK_INL_RAW_HTML,
+		CMARK_INL_EMPH,
+		CMARK_INL_STRONG,
+		CMARK_INL_LINK,
+		CMARK_INL_IMAGE
+	} tag;
+	union {
+		cmark_chunk literal;
+		struct cmark_node_inl *inlines;
+		struct {
+			struct cmark_node_inl *label;
+			unsigned char *url;
+			unsigned char *title;
+		} linkable;
+	} content;
+	struct cmark_node_inl *next;
+};
+
+typedef struct cmark_node_inl cmark_node_inl;
+
+// Types for blocks
+struct cmark_ListData {
+	enum {
+		bullet,
+		ordered
+	}  list_type;
+	int               marker_offset;
+	int               padding;
+	int               start;
+	enum {
+		period,
+		parens
+	} delimiter;
+	unsigned char     bullet_char;
+	bool              tight;
+};
+
+struct cmark_FencedCodeData {
+	int               fence_length;
+	int               fence_offset;
+	unsigned char     fence_char;
+	cmark_strbuf      info;
+};
+
+struct cmark_node_block {
+	enum {
+		CMARK_BLOCK_DOCUMENT,
+		CMARK_BLOCK_BQUOTE,
+		CMARK_BLOCK_LIST,
+		CMARK_BLOCK_LIST_ITEM,
+		CMARK_BLOCK_FENCED_CODE,
+		CMARK_BLOCK_INDENTED_CODE,
+		CMARK_BLOCK_HTML,
+		CMARK_BLOCK_PARAGRAPH,
+		CMARK_BLOCK_ATX_HEADER,
+		CMARK_BLOCK_SETEXT_HEADER,
+		CMARK_BLOCK_HRULE,
+		CMARK_BLOCK_REFERENCE_DEF
+	} tag;
+	int start_line;
+	int start_column;
+	int end_line;
+	bool open;
+	bool last_line_blank;
+	struct cmark_node_block* children;
+	struct cmark_node_block* last_child;
+	struct cmark_node_block* parent;
+	struct cmark_node_block* top;
+	cmark_strbuf string_content;
+	cmark_node_inl* inline_content;
+
+	union  {
+		struct cmark_ListData list;
+		struct cmark_FencedCodeData code;
+		struct {
+			int level;
+		} header;
+		struct {
+			cmark_reference_map *refmap;
+		} document;
+	} as;
+
+	struct cmark_node_block *next;
+	struct cmark_node_block *prev;
+};
+
+typedef struct cmark_node_block cmark_node_block;
+
+void cmark_free_blocks(cmark_node_block *e);
+void cmark_free_inlines(cmark_node_inl* e);
+void cmark_free_simple(cmark_node_inl *e);
+cmark_node_inl* cmark_append_inlines(cmark_node_inl* a, cmark_node_inl* b);
+
+cmark_node_inl *cmark_make_link(cmark_node_inl *label, unsigned char *url, unsigned char *title);
+cmark_node_inl* cmark_make_autolink(cmark_node_inl* label, cmark_chunk url, int is_email);
+
+cmark_node_inl* cmark_make_inlines(int t, cmark_node_inl* contents);
+cmark_node_inl* cmark_make_literal(int t, cmark_chunk s);
+cmark_node_inl* cmark_make_simple(int t);
+
+// Macros for creating various kinds of simple.
+#define cmark_make_str(s) cmark_make_literal(INL_STRING, s)
+#define cmark_make_code(s) cmark_make_literal(INL_CODE, s)
+#define cmark_make_raw_html(s) cmark_make_literal(INL_RAW_HTML, s)
+#define cmark_make_linebreak() cmark_make_simple(INL_LINEBREAK)
+#define cmark_make_softbreak() cmark_make_simple(INL_SOFTBREAK)
+#define cmark_make_emph(contents) cmark_make_inlines(INL_EMPH, contents)
+#define cmark_make_strong(contents) cmark_make_inlines(INL_STRONG, contents)
+
 __attribute__((visibility("default")))
 cmark_node_block *cmark_parse_document(const unsigned char *buffer, size_t len);
 
@@ -30,10 +146,52 @@ void cmark_render_html(cmark_strbuf *html, cmark_node_block *root);
 __attribute__((visibility("default")))
 unsigned char *cmark_markdown_to_html(unsigned char *text, int len);
 
+
+
 #ifndef CMARK_NO_SHORT_NAMES
   #define VERSION                   CMARK_VERSION
   #define CODE_INDENT               CMARK_CODE_INDENT
   #define MAX_LINK_LABEL_LENGTH     CMARK_MAX_LINK_LABEL_LENGTH
+  #define node_inl                  cmark_node_inl
+  #define INL_STRING                CMARK_INL_STRING
+  #define INL_SOFTBREAK             CMARK_INL_SOFTBREAK
+  #define INL_LINEBREAK             CMARK_INL_LINEBREAK
+  #define INL_CODE                  CMARK_INL_CODE
+  #define INL_RAW_HTML              CMARK_INL_RAW_HTML
+  #define INL_EMPH                  CMARK_INL_EMPH
+  #define INL_STRONG                CMARK_INL_STRONG
+  #define INL_LINK                  CMARK_INL_LINK
+  #define INL_IMAGE                 CMARK_INL_IMAGE
+  #define ListData                  cmark_ListData
+  #define FencedCodeData            cmark_FencedCodeData
+  #define node_block                cmark_node_block
+  #define BLOCK_DOCUMENT            CMARK_BLOCK_DOCUMENT
+  #define BLOCK_BQUOTE              CMARK_BLOCK_BQUOTE
+  #define BLOCK_LIST                CMARK_BLOCK_LIST
+  #define BLOCK_LIST_ITEM           CMARK_BLOCK_LIST_ITEM
+  #define BLOCK_FENCED_CODE         CMARK_BLOCK_FENCED_CODE
+  #define BLOCK_INDENTED_CODE       CMARK_BLOCK_INDENTED_CODE
+  #define BLOCK_HTML                CMARK_BLOCK_HTML
+  #define BLOCK_PARAGRAPH           CMARK_BLOCK_PARAGRAPH
+  #define BLOCK_ATX_HEADER          CMARK_BLOCK_ATX_HEADER
+  #define BLOCK_SETEXT_HEADER       CMARK_BLOCK_SETEXT_HEADER
+  #define BLOCK_HRULE               CMARK_BLOCK_HRULE
+  #define BLOCK_REFERENCE_DEF       CMARK_BLOCK_REFERENCE_DEF
+  #define free_simple               cmark_free_simple
+  #define free_blocks               cmark_free_blocks
+  #define append_simple             cmark_append_simple
+  #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_simple              cmark_make_simple
+  #define make_simple              cmark_make_simple
 #endif
 
 #ifdef __cplusplus
diff --git a/src/inlines.c b/src/inlines.c
@@ -8,7 +8,6 @@
 #include "html/houdini.h"
 #include "utf8.h"
 #include "scanners.h"
-#include "ast.h"
 #include "inlines.h"
 
 
diff --git a/src/references.c b/src/references.c
@@ -2,6 +2,7 @@
 #include "utf8.h"
 #include "references.h"
 #include "inlines.h"
+#include "chunk.h"
 
 static unsigned int
 refhash(const unsigned char *link_ref)
diff --git a/src/references.h b/src/references.h
@@ -3,6 +3,8 @@
 
 #define REFMAP_SIZE 16
 
+#include "chunk.h"
+
 struct cmark_reference {
 	struct cmark_reference *next;
 	unsigned char *label;