cmark

My personal build of CMark ✏️

Commit
b7f6e3f775705029df262aa313a0cd17ee3073cb
Parent
f8b6f2e02fd21477193f1f2471421f4adf19a790
Author
John MacFarlane <fiddlosopher@gmail.com>
Date

Moved AST details from public header cmark.h to private ast.h.

Diffstat

10 files changed, 200 insertions, 146 deletions

Status File Name N° Changes Insertions Deletions
Modified src/CMakeLists.txt 1 1 0
Added src/ast.h 163 163 0
Modified src/blocks.c 2 2 0
Modified src/cmark.c 1 1 0
Modified src/cmark.h 155 27 128
Modified src/html/html.c 1 1 0
Modified src/inlines.c 2 2 0
Modified src/print.c 1 1 0
Modified src/references.c 1 1 0
Modified src/references.h 19 1 18
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
@@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 2.8)
 set(LIBRARY "libcmark")
 set(HEADERS
   cmark.h
+  ast.h
   buffer.h
   chunk.h
   references.h
diff --git a/src/ast.h b/src/ast.h
@@ -0,0 +1,163 @@
+#ifndef CMARK_AST_H
+#define CMARK_AST_H
+
+#include <stdbool.h>
+#include <stdio.h>
+#include "buffer.h"
+#include "chunk.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CMARK_VERSION "0.1"
+#define CMARK_CODE_INDENT 4
+#define REFMAP_SIZE 16
+#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;
+};
+
+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;
+
+// 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;
+	struct 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;
+};
+
+struct cmark_doc_parser {
+	struct cmark_node_block* head;
+	struct cmark_node_block* current;
+	int line_number;
+	cmark_strbuf *curline;
+};
+
+#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
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/blocks.c b/src/blocks.c
@@ -4,7 +4,9 @@
 #include <stdbool.h>
 #include <ctype.h>
 
+#include "ast.h"
 #include "cmark.h"
+#include "references.h"
 #include "utf8.h"
 #include "scanners.h"
 #include "inlines.h"
diff --git a/src/cmark.c b/src/cmark.c
@@ -6,6 +6,7 @@
 #include "html/houdini.h"
 #include "cmark.h"
 #include "buffer.h"
+#include "ast.h"
 
 unsigned char *cmark_markdown_to_html(unsigned char *text, int len)
 {
diff --git a/src/cmark.h b/src/cmark.h
@@ -5,8 +5,6 @@
 #include <stdio.h>
 #include "buffer.h"
 #include "chunk.h"
-#include "references.h"
-#include "cmark_export.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -14,171 +12,72 @@ extern "C" {
 
 #define CMARK_VERSION "0.1"
 #define CMARK_CODE_INDENT 4
-
 #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;
-
-struct cmark_doc_parser {
-	cmark_node_block* head;
-	cmark_node_block* current;
-	int line_number;
-	cmark_strbuf *curline;
-};
-
 typedef struct cmark_doc_parser cmark_doc_parser;
 
 CMARK_EXPORT
-void cmark_free_blocks(cmark_node_block *e);
+cmark_doc_parser *cmark_new_doc_parser();
 
 CMARK_EXPORT
-void cmark_free_inlines(cmark_node_inl* e);
+void cmark_free_doc_parser(cmark_doc_parser *parser);
 
 CMARK_EXPORT
-cmark_node_inl *cmark_make_link(cmark_node_inl *label, unsigned char *url, unsigned char *title);
+cmark_node_block *cmark_finish(cmark_doc_parser *parser);
 
 CMARK_EXPORT
-cmark_node_inl* cmark_make_autolink(cmark_node_inl* label, cmark_chunk url, int is_email);
+void cmark_process_line(cmark_doc_parser *parser, const unsigned char *buffer, size_t bytes);
 
 CMARK_EXPORT
-cmark_node_inl* cmark_make_inlines(int t, cmark_node_inl* contents);
+cmark_node_block *cmark_finish(cmark_doc_parser *parser);
 
 CMARK_EXPORT
-cmark_node_inl* cmark_make_literal(int t, cmark_chunk s);
+cmark_node_block *cmark_parse_document(const unsigned char *buffer, size_t len);
 
 CMARK_EXPORT
-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)
+cmark_node_block *cmark_parse_file(FILE *f);
 
 CMARK_EXPORT
-cmark_doc_parser *cmark_new_doc_parser();
+void cmark_debug_print(cmark_node_block *root);
 
 CMARK_EXPORT
-void cmark_free_doc_parser(cmark_doc_parser *parser);
+void cmark_render_html(cmark_strbuf *html, cmark_node_block *root);
 
 CMARK_EXPORT
-cmark_node_block *cmark_finish(cmark_doc_parser *parser);
+unsigned char *cmark_markdown_to_html(unsigned char *text, int len);
 
 CMARK_EXPORT
-void cmark_process_line(cmark_doc_parser *parser, const unsigned char *buffer, size_t bytes);
+void cmark_free_blocks(cmark_node_block *e);
 
 CMARK_EXPORT
-cmark_node_block *cmark_finish(cmark_doc_parser *parser);
+void cmark_free_inlines(cmark_node_inl* e);
 
 CMARK_EXPORT
-cmark_node_block *cmark_parse_document(const unsigned char *buffer, size_t len);
+cmark_node_inl *cmark_make_link(cmark_node_inl *label, unsigned char *url, unsigned char *title);
 
 CMARK_EXPORT
-cmark_node_block *cmark_parse_file(FILE *f);
+cmark_node_inl* cmark_make_autolink(cmark_node_inl* label, cmark_chunk url, int is_email);
 
 CMARK_EXPORT
-void cmark_debug_print(cmark_node_block *root);
+cmark_node_inl* cmark_make_inlines(int t, cmark_node_inl* contents);
 
 CMARK_EXPORT
-void cmark_render_html(cmark_strbuf *html, cmark_node_block *root);
+cmark_node_inl* cmark_make_literal(int t, cmark_chunk s);
 
 CMARK_EXPORT
-unsigned char *cmark_markdown_to_html(unsigned char *text, int len);
+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 VERSION                   CMARK_VERSION
diff --git a/src/html/html.c b/src/html/html.c
@@ -5,6 +5,7 @@
 #include <assert.h>
 
 #include "cmark.h"
+#include "ast.h"
 #include "debug.h"
 #include "html/houdini.h"
 
diff --git a/src/inlines.c b/src/inlines.c
@@ -4,6 +4,8 @@
 #include <stdbool.h>
 #include <ctype.h>
 
+#include "ast.h"
+#include "references.h"
 #include "cmark.h"
 #include "html/houdini.h"
 #include "utf8.h"
diff --git a/src/print.c b/src/print.c
@@ -1,6 +1,7 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include "ast.h"
 #include "cmark.h"
 #include "debug.h"
 
diff --git a/src/references.c b/src/references.c
@@ -1,5 +1,6 @@
 #include "cmark.h"
 #include "utf8.h"
+#include "ast.h"
 #include "references.h"
 #include "inlines.h"
 #include "chunk.h"
diff --git a/src/references.h b/src/references.h
@@ -1,25 +1,8 @@
 #ifndef CMARK_REFERENCES_H
 #define CMARK_REFERENCES_H
 
-#define REFMAP_SIZE 16
-
 #include "chunk.h"
-
-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;
+#include "ast.h"
 
 cmark_reference_map *cmark_reference_map_new(void);
 void cmark_reference_map_free(cmark_reference_map *map);