I have encountered one more issue: % curl -s https://manpages.debian.org/testing/mysql-server-5.6/mysqlbinlog.1.en.gz | ./mandoc -Thtml […] free(): invalid pointer Could you take a look at that, too, please? Thank you, On Sat, May 25, 2019 at 5:22 PM Michael Stapelberg wrote: > Yeah, that commit indeed fixes it. Thank you! > > On Tue, Apr 30, 2019 at 6:08 PM Ingo Schwarze wrote: > >> Hi Michael, >> >> Michael Stapelberg wrote on Sun, Apr 28, 2019 at 03:24:51PM +0200: >> >> > Sorry for the late reply on this, >> >> I appreciate that you are testing mandoc quite regularly. >> It is only natural that not every point in time can be convenient >> for doing such work. >> >> > but I only now got a chance to (try to) >> > update manpages.debian.org to mandoc-1.14.5. >> > >> > Unfortunately, I encounter an assertion failure when running: >> > % curl -s >> > >> https://manpages.debian.org/testing/libpcp3-dev/pmRegisterDerived.3.en.gz >> | >> > mandoc -Thtml >> > mandoc: html.c:809: print_text: Assertion `NULL == h->metaf' failed. >> >> I fear i broke that as a side effect of the changes made for this >> NEWS entry: "roff(7) .ft request: handle the CB, CI, and CR fonts". >> >> The fix is slightly larger than i would like for a regression fix, >> but it can't be helped because it requires splitting the function >> print_metaf() into two parts. >> >> Then again, i like bugfixes that reduce the amount of code, >> and this one shortens the code by about 25 lines... >> >> I believe the commit below fixes the regression. >> Does it work for you, too? >> >> Thanks, >> Ingo >> >> >> Log Message: >> ----------- >> In HTML output, allow switching the desired font for subsequent >> text without printing an opening tag right away, and use that in >> the .ft request handler. While here, garbage collect redundant >> enum htmlfont and reduce code duplication in print_text(). >> Fixing an assertion failure reported by Michael >> in pmRegisterDerived(3) from libpcp3-dev. >> >> Modified Files: >> -------------- >> mandoc: >> html.c >> html.h >> man_html.c >> roff_html.c >> mandoc/regress/roff/ft: >> badargs.out_html >> >> Revision Data >> ------------- >> Index: man_html.c >> =================================================================== >> RCS file: /home/cvs/mandoc/mandoc/man_html.c,v >> retrieving revision 1.173 >> retrieving revision 1.174 >> diff -Lman_html.c -Lman_html.c -u -p -r1.173 -r1.174 >> --- man_html.c >> +++ man_html.c >> @@ -203,9 +203,9 @@ print_man_node(MAN_ARGS) >> * Close out scope of font prior to opening a macro >> * scope. >> */ >> - if (HTMLFONT_NONE != h->metac) { >> + if (h->metac != ESCAPE_FONTROMAN) { >> h->metal = h->metac; >> - h->metac = HTMLFONT_NONE; >> + h->metac = ESCAPE_FONTROMAN; >> } >> >> /* >> Index: html.c >> =================================================================== >> RCS file: /home/cvs/mandoc/mandoc/html.c,v >> retrieving revision 1.254 >> retrieving revision 1.255 >> diff -Lhtml.c -Lhtml.c -u -p -r1.254 -r1.255 >> --- html.c >> +++ html.c >> @@ -120,6 +120,7 @@ static void print_ctag(struct html *, s >> static int print_escape(struct html *, char); >> static int print_encode(struct html *, const char *, const char *, >> int); >> static void print_href(struct html *, const char *, const char *, >> int); >> +static void print_metaf(struct html *); >> >> >> void * >> @@ -222,55 +223,49 @@ print_gen_head(struct html *h) >> print_tagq(h, t); >> } >> >> -void >> -print_metaf(struct html *h, enum mandoc_esc deco) >> +int >> +html_setfont(struct html *h, enum mandoc_esc font) >> { >> - enum htmlfont font; >> - >> - switch (deco) { >> + switch (font) { >> case ESCAPE_FONTPREV: >> font = h->metal; >> break; >> case ESCAPE_FONTITALIC: >> - font = HTMLFONT_ITALIC; >> - break; >> case ESCAPE_FONTBOLD: >> - font = HTMLFONT_BOLD; >> - break; >> case ESCAPE_FONTBI: >> - font = HTMLFONT_BI; >> - break; >> case ESCAPE_FONTCW: >> - font = HTMLFONT_CW; >> + case ESCAPE_FONTROMAN: >> break; >> case ESCAPE_FONT: >> - case ESCAPE_FONTROMAN: >> - font = HTMLFONT_NONE; >> + font = ESCAPE_FONTROMAN; >> break; >> default: >> - return; >> + return 0; >> } >> + h->metal = h->metac; >> + h->metac = font; >> + return 1; >> +} >> >> +static void >> +print_metaf(struct html *h) >> +{ >> if (h->metaf) { >> print_tagq(h, h->metaf); >> h->metaf = NULL; >> } >> - >> - h->metal = h->metac; >> - h->metac = font; >> - >> - switch (font) { >> - case HTMLFONT_ITALIC: >> + switch (h->metac) { >> + case ESCAPE_FONTITALIC: >> h->metaf = print_otag(h, TAG_I, ""); >> break; >> - case HTMLFONT_BOLD: >> + case ESCAPE_FONTBOLD: >> h->metaf = print_otag(h, TAG_B, ""); >> break; >> - case HTMLFONT_BI: >> + case ESCAPE_FONTBI: >> h->metaf = print_otag(h, TAG_B, ""); >> print_otag(h, TAG_I, ""); >> break; >> - case HTMLFONT_CW: >> + case ESCAPE_FONTCW: >> h->metaf = print_otag(h, TAG_SPAN, "c", "Li"); >> break; >> default: >> @@ -479,7 +474,8 @@ print_encode(struct html *h, const char >> case ESCAPE_FONTROMAN: >> if (0 == norecurse) { >> h->flags |= HTML_NOSPACE; >> - print_metaf(h, esc); >> + if (html_setfont(h, esc)) >> + print_metaf(h); >> h->flags &= ~HTML_NOSPACE; >> } >> continue; >> @@ -806,27 +802,9 @@ print_text(struct html *h, const char *w >> print_word(h, " "); >> } >> >> - assert(NULL == h->metaf); >> - switch (h->metac) { >> - case HTMLFONT_ITALIC: >> - h->metaf = print_otag(h, TAG_I, ""); >> - break; >> - case HTMLFONT_BOLD: >> - h->metaf = print_otag(h, TAG_B, ""); >> - break; >> - case HTMLFONT_BI: >> - h->metaf = print_otag(h, TAG_B, ""); >> - print_otag(h, TAG_I, ""); >> - break; >> - case HTMLFONT_CW: >> - h->metaf = print_otag(h, TAG_SPAN, "c", "Li"); >> - break; >> - default: >> - print_indent(h); >> - break; >> - } >> - >> - assert(word); >> + assert(h->metaf == NULL); >> + print_metaf(h); >> + print_indent(h); >> if ( ! print_encode(h, word, NULL, 0)) { >> if ( ! (h->flags & HTML_NONOSPACE)) >> h->flags &= ~HTML_NOSPACE; >> @@ -834,7 +812,7 @@ print_text(struct html *h, const char *w >> } else >> h->flags |= HTML_NOSPACE | HTML_NONEWLINE; >> >> - if (h->metaf) { >> + if (h->metaf != NULL) { >> print_tagq(h, h->metaf); >> h->metaf = NULL; >> } >> Index: roff_html.c >> =================================================================== >> RCS file: /home/cvs/mandoc/mandoc/roff_html.c,v >> retrieving revision 1.19 >> retrieving revision 1.20 >> diff -Lroff_html.c -Lroff_html.c -u -p -r1.19 -r1.20 >> --- roff_html.c >> +++ roff_html.c >> @@ -94,7 +94,7 @@ roff_html_pre_ft(ROFF_HTML_ARGS) >> const char *cp; >> >> cp = n->child->string; >> - print_metaf(h, mandoc_font(cp, (int)strlen(cp))); >> + html_setfont(h, mandoc_font(cp, (int)strlen(cp))); >> } >> >> static void >> Index: html.h >> =================================================================== >> RCS file: /home/cvs/mandoc/mandoc/html.h,v >> retrieving revision 1.102 >> retrieving revision 1.103 >> diff -Lhtml.h -Lhtml.h -u -p -r1.102 -r1.103 >> --- html.h >> +++ html.h >> @@ -69,15 +69,6 @@ enum htmltag { >> TAG_MAX >> }; >> >> -enum htmlfont { >> - HTMLFONT_NONE = 0, >> - HTMLFONT_BOLD, >> - HTMLFONT_ITALIC, >> - HTMLFONT_BI, >> - HTMLFONT_CW, >> - HTMLFONT_MAX >> -}; >> - >> struct tag { >> struct tag *next; >> int refcnt; >> @@ -111,8 +102,8 @@ struct html { >> char *base_includes; /* base for include href */ >> char *style; /* style-sheet URI */ >> struct tag *metaf; /* current open font scope */ >> - enum htmlfont metal; /* last used font */ >> - enum htmlfont metac; /* current font mode */ >> + enum mandoc_esc metal; /* last used font */ >> + enum mandoc_esc metac; /* current font mode */ >> int oflags; /* output options */ >> #define HTML_FRAGMENT (1 << 0) /* don't emit HTML/HEAD/BODY */ >> #define HTML_TOC (1 << 1) /* emit a table of contents */ >> @@ -128,7 +119,6 @@ void roff_html_pre(struct html *, con >> void print_gen_comment(struct html *, struct roff_node *); >> void print_gen_decls(struct html *); >> void print_gen_head(struct html *); >> -void print_metaf(struct html *, enum mandoc_esc); >> struct tag *print_otag(struct html *, enum htmltag, const char *, >> ...); >> void print_tagq(struct html *, const struct tag *); >> void print_stagq(struct html *, const struct tag *); >> @@ -141,3 +131,4 @@ void print_endline(struct html *); >> void html_close_paragraph(struct html *); >> enum roff_tok html_fillmode(struct html *, enum roff_tok); >> char *html_make_id(const struct roff_node *, int); >> +int html_setfont(struct html *, enum mandoc_esc); >> Index: badargs.out_html >> =================================================================== >> RCS file: /home/cvs/mandoc/mandoc/regress/roff/ft/badargs.out_html,v >> retrieving revision 1.2 >> retrieving revision 1.3 >> diff -Lregress/roff/ft/badargs.out_html >> -Lregress/roff/ft/badargs.out_html -u -p -r1.2 -r1.3 >> --- regress/roff/ft/badargs.out_html >> +++ regress/roff/ft/badargs.out_html >> @@ -1,9 +1,8 @@ >> BEGINTEST >>
>> -default font italic bold italic >> - typeqriter >> - roman >> bold >> - italic bold still bold >> - italic back to bold back to >> italic >> +default font italic bold italic >> + typeqriter roman >> bold >> + italic bold still bold italic back to >> bold >> + back to italic >>
>> ENDTEST >> > > > -- > Best regards, > Michael > -- Best regards, Michael