diff options
| -rw-r--r-- | src/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/ast.h | 163 | ||||
| -rw-r--r-- | src/blocks.c | 2 | ||||
| -rw-r--r-- | src/cmark.c | 1 | ||||
| -rw-r--r-- | src/cmark.h | 155 | ||||
| -rw-r--r-- | src/html/html.c | 1 | ||||
| -rw-r--r-- | src/inlines.c | 2 | ||||
| -rw-r--r-- | src/print.c | 1 | ||||
| -rw-r--r-- | src/references.c | 1 | ||||
| -rw-r--r-- | src/references.h | 19 | 
10 files changed, 200 insertions, 146 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1b70584..2413acd 100644 --- 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 new file mode 100644 index 0000000..b4427c0 --- /dev/null +++ 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 index 568af0a..dd6278b 100644 --- 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 index 8f379bf..85e1adb 100644 --- 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 index c8c7e8d..e28e747 100644 --- 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 index 6b5d614..cd02f83 100644 --- 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 index cf07586..677861f 100644 --- 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 index b5ef056..ce387b4 100644 --- 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 index e39b836..cb750c6 100644 --- 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 index cd58614..2972576 100644 --- 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);  | 
