=================================================================== RCS file: /cvs/docbook2mdoc/macro.c,v retrieving revision 1.10 retrieving revision 1.13 diff -u -p -r1.10 -r1.13 --- docbook2mdoc/macro.c 2019/04/12 08:48:16 1.10 +++ docbook2mdoc/macro.c 2019/04/14 23:59:11 1.13 @@ -1,4 +1,4 @@ -/* $Id: macro.c,v 1.10 2019/04/12 08:48:16 schwarze Exp $ */ +/* $Id: macro.c,v 1.13 2019/04/14 23:59:11 schwarze Exp $ */ /* * Copyright (c) 2019 Ingo Schwarze * @@ -79,11 +79,13 @@ void macro_addarg(struct format *f, const char *arg, int flags) { const char *cp; + int quote_now; assert(f->linestate == LINE_MACRO); /* Quote if requested and necessary. */ + quote_now = 0; if ((flags & (ARG_SINGLE | ARG_QUOTED)) == ARG_SINGLE) { for (cp = arg; *cp != '\0'; cp++) if (isspace((unsigned char)*cp)) @@ -95,6 +97,7 @@ macro_addarg(struct format *f, const char *arg, int fl } putchar('"'); flags = ARG_QUOTED; + quote_now = 1; } } @@ -112,13 +115,16 @@ macro_addarg(struct format *f, const char *arg, int fl /* Escape us if we look like a macro. */ - if ((flags & ARG_QUOTED) == 0 && + if ((flags & (ARG_QUOTED | ARG_UPPER)) == 0 && (cp == arg || isspace((unsigned char)cp[-1])) && isupper((unsigned char)cp[0]) && islower((unsigned char)cp[1]) && (cp[2] == '\0' || cp[2] == ' ' || - (islower((unsigned char)cp[2]) && - (cp[3] == '\0' || cp[3] == ' ')))) + ((cp[3] == '\0' || cp[3] == ' ') && + (strncmp(cp, "Brq", 3) == 0 || + strncmp(cp, "Bro", 3) == 0 || + strncmp(cp, "Brc", 3) == 0 || + strncmp(cp, "Bsx", 3) == 0)))) fputs("\\&", stdout); if (*cp == '"') @@ -130,6 +136,8 @@ macro_addarg(struct format *f, const char *arg, int fl if (*cp == '\\') putchar('e'); } + if (quote_now) + putchar('"'); } void @@ -216,8 +224,6 @@ print_text(struct format *f, const char *word, int fla { switch (f->linestate) { case LINE_NEW: - if (*word == '.' || *word == '\'') - fputs("\\&", stdout); break; case LINE_TEXT: if (flags & ARG_SPACE) @@ -227,6 +233,8 @@ print_text(struct format *f, const char *word, int fla macro_close(f); break; } + if (f->linestate == LINE_NEW && (*word == '.' || *word == '\'')) + fputs("\\&", stdout); while (*word != '\0') { putchar(*word); if (*word++ == '\\')