diff --git a/VERSION b/VERSION index 3336003..88c5fb8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.7 +1.4.0 diff --git a/main.c b/main.c index b5d6b80..af055a2 100644 --- a/main.c +++ b/main.c @@ -102,7 +102,7 @@ main(int argc, char **argv) int flags = 0; int debug = 0; int toc = 0; - int use_mkd_text = 0; + int use_mkd_line = 0; char *text = 0; char *ofile = 0; char *urlbase = 0; @@ -127,7 +127,7 @@ main(int argc, char **argv) case 'f': set(&flags, optarg); break; case 't': text = optarg; - use_mkd_text = 1; + use_mkd_line = 1; break; case 'T': toc = 1; break; @@ -151,8 +151,8 @@ main(int argc, char **argv) argc -= optind; argv += optind; - if ( use_mkd_text ) - rc = mkd_text( text, strlen(text), stdout, flags); + if ( use_mkd_line ) + rc = mkd_generateline( text, strlen(text), stdout, flags); else { if ( text ) { if ( (doc = mkd_string(text, strlen(text), flags)) == 0 ) { diff --git a/mkd2html.c b/mkd2html.c index eaf5362..ae15320 100644 --- a/mkd2html.c +++ b/mkd2html.c @@ -162,7 +162,7 @@ char **argv; if ( h ) { fprintf(output," "); - mkd_text(h, strlen(h), output, 0); + mkd_generateline(h, strlen(h), output, 0); fprintf(output, "\n"); } for ( i=0; i < S(headers); i++ ) diff --git a/mkdio.c b/mkdio.c index 4d88211..e0f54bc 100644 --- a/mkdio.c +++ b/mkdio.c @@ -244,18 +244,55 @@ mkd_string_to_anchor(char *s, int len, void(*outchar)(int,void*), void *out) } -/* public interface for ___mkd_reparse() +/* ___mkd_reparse() a line + */ +static void +mkd_parse_line(char *bfr, int size, MMIOT *f, int flags) +{ + ___mkd_initmmiot(f, 0); + f->flags = flags & USER_FLAGS; + ___mkd_reparse(bfr, size, 0, f); + ___mkd_emblock(f); +} + + +/* ___mkd_reparse() a line, returning it in malloc()ed memory */ int -mkd_text(char *bfr, int size, FILE *output, int flags) +mkd_line(char *bfr, int size, char **res, int flags) +{ + MMIOT f; + int len; + + mkd_parse_line(bfr, size, &f, flags); + + if ( len = S(f.out) ) { + /* kludge alert; we know that T(f.out) is malloced memory, + * so we can just steal it away. This is awful -- there + * should be an opaque method that transparently moves + * the pointer out of the embedded Cstring. + */ + *res = T(f.out); + T(f.out) = 0; + S(f.out) = 0; + } + else { + *res = 0; + len = EOF; + } + ___mkd_freemmiot(&f, 0); + return len; +} + + +/* ___mkd_reparse() a line, writing it to a FILE + */ +int +mkd_generateline(char *bfr, int size, FILE *output, int flags) { MMIOT f; - ___mkd_initmmiot(&f, 0); - f.flags = flags & USER_FLAGS; - - ___mkd_reparse(bfr, size, 0, &f); - ___mkd_emblock(&f); + mkd_parse_line(bfr, size, &f, flags); if ( flags & CDATA_OUTPUT ) mkd_generatexml(T(f.out), S(f.out), output); else diff --git a/mkdio.h b/mkdio.h index 5a18f66..ed2983c 100644 --- a/mkdio.h +++ b/mkdio.h @@ -15,20 +15,15 @@ void mkd_basename(MMIOT*,char*); /* compilation, debugging, cleanup */ int mkd_compile(MMIOT*, int); -int mkd_generatehtml(MMIOT*,FILE*); -int mkd_generatetoc(MMIOT*,FILE*); -int mkd_generatecss(MMIOT*,FILE*); -#define mkd_style mkd_generatecss -int mkd_xhtmlpage(MMIOT*,int,FILE*); int mkd_cleanup(MMIOT*); /* markup functions */ -int mkd_text(char *, int, FILE*, int); int mkd_dump(MMIOT*, FILE*, int, char*); int markdown(MMIOT*, FILE*, int); -void mkd_basename(MMIOT*,char*); +int mkd_line(char *, int, char **, int); void mkd_string_to_anchor(char *, int, int (*)(int,void*), void*); +int mkd_xhtmlpage(MMIOT*,int,FILE*); /* header block access */ @@ -42,6 +37,15 @@ int mkd_document(MMIOT*, char**); int mkd_toc(MMIOT*, char**); int mkd_css(MMIOT*, char **); +/* write-to-file functions + */ +int mkd_generatehtml(MMIOT*,FILE*); +int mkd_generatetoc(MMIOT*,FILE*); +int mkd_generatecss(MMIOT*,FILE*); +#define mkd_style mkd_generatecss +int mkd_generateline(char *, int, FILE*, int); +#define mkd_text mkd_generateline + /* version#. */ extern char markdown_version[]; diff --git a/theme.c b/theme.c index 95f45d1..76cfa56 100644 --- a/theme.c +++ b/theme.c @@ -310,7 +310,7 @@ ftitle(MMIOT *doc, FILE* output, int flags) h = pagename; if ( h ) - mkd_text(h, strlen(h), output, flags); + mkd_generateline(h, strlen(h), output, flags); } @@ -322,7 +322,7 @@ fdate(MMIOT *doc, FILE *output, int flags) char *h = infop ? ctime(&infop->st_mtime) : mkd_doc_date(doc); if ( h ) - mkd_text(h, strlen(h), output, flags|MKD_TAGTEXT); + mkd_generateline(h, strlen(h), output, flags|MKD_TAGTEXT); } @@ -339,7 +339,7 @@ fauthor(MMIOT *doc, FILE *output, int flags) #endif if ( h ) - mkd_text(h, strlen(h), output, flags); + mkd_generateline(h, strlen(h), output, flags); }