From 2e900346a0009c331b890600b7c811101061cc45 Mon Sep 17 00:00:00 2001 From: david parsons Date: Sat, 7 Mar 2020 19:56:22 -0800 Subject: [PATCH] make the published mkd_flag_t opaque and add a new function (mkd_flags()) to generate a flag structure and return it in malloced memory --- flags.c | 11 +++++++++++ main.c | 38 ++++++++++++++++++++------------------ makepage.c | 19 +++++++++++-------- mkdio.h.in | 4 ++-- theme.c | 25 +++++++++++++++++-------- 5 files changed, 61 insertions(+), 36 deletions(-) diff --git a/flags.c b/flags.c index 2bf10d6..6f66bcf 100644 --- a/flags.c +++ b/flags.c @@ -103,3 +103,14 @@ mkd_init_flags(mkd_flag_t *p) { memset(p, 0, sizeof(*p)); } + +mkd_flag_t * +mkd_flags() +{ + mkd_flag_t *p = malloc( sizeof(mkd_flag_t) ); + + if ( p ) + mkd_init_flags(p); + + return p; +} diff --git a/main.c b/main.c index ecdcba9..7617cce 100644 --- a/main.c +++ b/main.c @@ -168,7 +168,6 @@ int main(int argc, char **argv) { int rc; - mkd_flag_t flags; int debug = 0; int toc = 0; int content = 1; @@ -188,16 +187,18 @@ main(int argc, char **argv) MMIOT *doc; struct h_context blob; struct h_opt *opt; + mkd_flag_t *flags = mkd_flags(); + + if ( !flags ) + perror("new_flags"); hoptset(&blob, argc, argv); hopterr(&blob, 1); pgm = basename(argv[0]); - mkd_init_flags(&flags); - if ( q = getenv("MARKDOWN_FLAGS") ) - mkd_set_flag_bitmap(&flags, strtol(q,0,0)); + mkd_set_flag_bitmap(flags, strtol(q,0,0)); while ( opt=gethopt(&blob, opts, NROPTS) ) { if ( opt == HOPTERR ) { @@ -221,10 +222,10 @@ main(int argc, char **argv) exit(0); } else if ( strcmp(q, "??") == 0 ) { - show_flags(1, version, &flags); + show_flags(1, version, flags); exit(0); } - else if ( q=mkd_set_flag_string(&flags, hoptarg(&blob)) ) + else if ( q=mkd_set_flag_string(flags, hoptarg(&blob)) ) complain("unknown option <%s>", q); break; case 'F': q = hoptarg(&blob); @@ -233,11 +234,11 @@ main(int argc, char **argv) exit(0); } else if ( strcmp(q, "??") == 0 ) { - show_flags(0, version, &flags); + show_flags(0, version, flags); exit(0); } else - mkd_set_flag_bitmap(&flags,strtol(q, 0, 0)); + mkd_set_flag_bitmap(flags,strtol(q, 0, 0)); break; case 'G': github_flavoured = 1; break; @@ -250,7 +251,7 @@ main(int argc, char **argv) case 't': text = hoptarg(&blob); use_mkd_line = 1; break; - case 'T': mkd_set_flag_num(&flags, MKD_TOC); + case 'T': mkd_set_flag_num(flags, MKD_TOC); toc = 1; break; case 'C': extra_footnote_prefix = hoptarg(&blob); @@ -267,7 +268,7 @@ main(int argc, char **argv) case 'x': squash = 1; break; case 'X': use_e_codefmt = 1; - mkd_set_flag_num(&flags, MKD_FENCEDCODE); + mkd_set_flag_num(flags, MKD_FENCEDCODE); break; } } @@ -277,7 +278,7 @@ main(int argc, char **argv) printf("%s: discount %s%s", pgm, markdown_version, with_html5 ? " +html5":""); if ( version == 2 ) - mkd_flags_are(stdout, &flags, 0); + mkd_flags_are(stdout, flags, 0); putchar('\n'); exit(0); } @@ -289,11 +290,11 @@ main(int argc, char **argv) mkd_with_html5_tags(); if ( use_mkd_line ) - rc = mkd_generateline( text, strlen(text), stdout, &flags); + rc = mkd_generateline( text, strlen(text), stdout, flags); else { if ( text ) { - doc = github_flavoured ? gfm_string(text, strlen(text), &flags) - : mkd_string(text, strlen(text), &flags) ; + doc = github_flavoured ? gfm_string(text, strlen(text), flags) + : mkd_string(text, strlen(text), flags) ; if ( !doc ) { perror(text); @@ -306,8 +307,8 @@ main(int argc, char **argv) exit(1); } - doc = github_flavoured ? gfm_in(stdin,&flags) - : mkd_in(stdin,&flags); + doc = github_flavoured ? gfm_in(stdin,flags) + : mkd_in(stdin,flags); if ( !doc ) { perror(argc ? argv[0] : "stdin"); exit(1); @@ -331,10 +332,10 @@ main(int argc, char **argv) mkd_ref_prefix(doc, extra_footnote_prefix); if ( debug ) - rc = mkd_dump(doc, stdout, &flags, argc ? basename(argv[0]) : "stdin"); + rc = mkd_dump(doc, stdout, flags, argc ? basename(argv[0]) : "stdin"); else { rc = 1; - if ( mkd_compile(doc, &flags) ) { + if ( mkd_compile(doc, flags) ) { rc = 0; if ( styles ) mkd_generatecss(doc, stdout); @@ -347,6 +348,7 @@ main(int argc, char **argv) mkd_cleanup(doc); } mkd_deallocate_tags(); + free(flags); adump(); exit( (rc == 0) ? 0 : errno ); } diff --git a/makepage.c b/makepage.c index cdf0b51..00d7a4a 100644 --- a/makepage.c +++ b/makepage.c @@ -39,18 +39,19 @@ char **argv; int version = 0; int ret, i; DWORD bits; - mkd_flag_t flags; + mkd_flag_t *flags = mkd_flags(); struct h_opt *opt; struct h_context blob; - mkd_init_flags(&flags); + if ( !flags ) + perror("mkd_flags"); if ( (q = getenv("MARKDOWN_FLAGS")) ) { bits = strtol(q, 0, 0); for ( i=0; i < 8*sizeof(bits); i++) if ( bits & (1<\n", q); break; } @@ -92,7 +93,7 @@ char **argv; if ( version ) { printf("%s: discount %s", pgm, markdown_version); if ( version > 1 ) - mkd_flags_are(stdout, &flags, 0); + mkd_flags_are(stdout, flags, 0); putchar('\n'); exit(0); } @@ -102,14 +103,16 @@ char **argv; exit(1); } - if ( (doc = mkd_in(stdin, &flags)) == 0 ) { + if ( (doc = mkd_in(stdin, flags)) == 0 ) { perror( (argc > 1) ? argv[1] : "stdin" ); exit(1); } - ret = mkd_xhtmlpage(doc, &flags, stdout); + ret = mkd_xhtmlpage(doc, flags, stdout); mkd_cleanup(doc); + free(flags); + return (ret == EOF); } diff --git a/mkdio.h.in b/mkdio.h.in index 0f647c0..5846d15 100644 --- a/mkdio.h.in +++ b/mkdio.h.in @@ -43,13 +43,13 @@ enum { MKD_NOLINKS=0, /* don't do link processing, block tags */ MKD_NR_FLAGS }; /* abstract flag type */ -typedef struct { char bfr[MKD_NR_FLAGS*2]; } mkd_flag_t; +typedef void mkd_flag_t; int mkd_flag_isset(mkd_flag_t*, int); /* check a flag status */ void mkd_flag_set(mkd_flag_t*, int); /* set a flag */ void mkd_flag_clear(mkd_flag_t*, int); /* clear a flag */ -void mkd_init_flags(mkd_flag_t*); /* initialize the flags */ +mkd_flag_t *mkd_flags(); /* create a flag structure */ char *mkd_set_flag_string(mkd_flag_t*, char*); /* set named flags */ void mkd_set_flag_num(mkd_flag_t*, unsigned long);/* set a specific flag */ void mkd_clr_flag_num(mkd_flag_t*, unsigned long);/* clear a specific flag */ diff --git a/theme.c b/theme.c index 3a20e64..9399b3e 100644 --- a/theme.c +++ b/theme.c @@ -450,8 +450,6 @@ static struct _keyword { static void setup_flags(mkd_flag_t *flagp, int where) { - mkd_init_flags(flagp); - #ifdef THEME_DL_MODE switch (THEME_DL_MODE) { case 3: mkd_set_flag_num(flagp, MKD_DLEXTRA); @@ -482,9 +480,12 @@ spin(FILE *template, MMIOT *doc, FILE *output) { int c; int *p; - mkd_flag_t flags; + mkd_flag_t *flags = mkd_flags(); int where = 0x0; int i; + + if ( !flags ) + fail("cannot initialize mkd_flags"); prepare(template); @@ -509,8 +510,8 @@ spin(FILE *template, MMIOT *doc, FILE *output) for (i=0; i < NR(keyword); i++) if ( thesame(p, keyword[i].kw) ) { if ( everywhere || (keyword[i].where & where) ) { - setup_flags(&flags, where); - (*keyword[i].what)(doc,output,&flags,where); + setup_flags(flags, where); + (*keyword[i].what)(doc,output,flags,where); } break; } @@ -538,6 +539,7 @@ spin(FILE *template, MMIOT *doc, FILE *output) putc(c, output); } + free(flags); } /* spin */ @@ -561,11 +563,17 @@ char **argv; char *template = "page.theme"; char *source = "stdin"; FILE *tmplfile; - mkd_flag_t flags; int force = 0; MMIOT *doc; struct stat sourceinfo; char *q; + mkd_flag_t *flags = mkd_flags(); + + if ( !flags ) { + perror("mkd_flags"); + exit(1); + } + struct h_opt *opt; struct h_context blob; @@ -595,7 +603,7 @@ char **argv; show_flags(1,0, 0); exit(0); } - else if ( q = mkd_set_flag_string(&flags, hoptarg(&blob)) ) + else if ( q = mkd_set_flag_string(flags, hoptarg(&blob)) ) fprintf(stderr,"%s: unknown option <%s>", pgm, q); break; case 'o': output_file = hoptarg(&blob); @@ -674,7 +682,7 @@ char **argv; fail("out of memory"); #endif - if ( !mkd_compile(doc, &flags) ) + if ( !mkd_compile(doc, flags) ) fail("couldn't compile input"); if ( tmplfile ) @@ -683,6 +691,7 @@ char **argv; mkd_generatehtml(doc, stdout); mkd_cleanup(doc); + free(flags); exit(0); }