=================================================================== RCS file: /cvs/texi2mdoc/main.c,v retrieving revision 1.47 retrieving revision 1.54 diff -u -p -r1.47 -r1.54 --- texi2mdoc/main.c 2015/02/25 15:04:13 1.47 +++ texi2mdoc/main.c 2015/02/28 13:16:44 1.54 @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.47 2015/02/25 15:04:13 kristaps Exp $ */ +/* $Id: main.c,v 1.54 2015/02/28 13:16:44 kristaps Exp $ */ /* * Copyright (c) 2015 Kristaps Dzonsons * @@ -296,8 +296,8 @@ static const struct texitok __texitoks[TEXICMD__MAX] = { dosubsubsection, "subsubsection", 13 }, /* TEXICMD_SUBSUBSECTION */ { doignline, "subtitle", 8 }, /* TEXICMD_SUBTITLE */ { doignline, "summarycontents", 15 }, /* TEXICMD_SUMMARYCONTENTS */ - { doignline, "synindex", 8 }, /* TEXICMD_SYNINDEX */ - { doignline, "syncodeindex", 12 }, /* TEXICMD_SYNCODEINDEX */ + { dodefindex, "synindex", 8 }, /* TEXICMD_SYNINDEX */ + { dodefindex, "syncodeindex", 12 }, /* TEXICMD_SYNCODEINDEX */ { doinline, "t", 1 }, /* TEXICMD_T */ { dotab, "tab", 3 }, /* TEXICMD_TAB */ { dosymbol, "\t", 1 }, /* TEXICMD_TABSYM */ @@ -432,7 +432,8 @@ dodefn(struct texi *p, enum texicmd cmd, size_t *pos) break; } - texiputchars(p, ":\n"); + texiputchar(p, ':'); + texiputchar(p, '\n'); switch (cmd) { case (TEXICMD_DEFMAC): @@ -497,9 +498,45 @@ dodefn(struct texi *p, enum texicmd cmd, size_t *pos) abort(); } - texivspace(p); - if (NULL != blk) - parseto(p, pos, blk); + if (NULL == blk) + return; + + /* + * All "block" definitions have their block bodies indented + * unless they have the "x" form of the command following. + * E.g., + * @deffn some function + * @deffnx another + * An explanation. + * @end deffn + * With this loop, we delay opening the indented block until we + * skipped past conformant macros. + */ + for (;;) { + switch (peekcmd(p, *pos)) { + case (TEXICMD_DEFFNX): + case (TEXICMD_DEFMACX): + case (TEXICMD_DEFTPX): + case (TEXICMD_DEFTYPEFNX): + case (TEXICMD_DEFTYPEFUNX): + case (TEXICMD_DEFTYPEMETHODX): + case (TEXICMD_DEFTYPEVARX): + case (TEXICMD_DEFTYPEVRX): + case (TEXICMD_DEFUNX): + case (TEXICMD_DEFVARX): + case (TEXICMD_DEFVRX): + texivspace(p); + parseeoln(p, pos); + continue; + default: + break; + } + break; + } + teximacro(p, "Bd -filled -offset indent"); + p->seenvs = 1; + parseto(p, pos, blk); + teximacro(p, "Ed"); } static void @@ -613,8 +650,8 @@ doignblock(struct texi *p, enum texicmd cmd, size_t *p * Thus, we keep track of scopes for matching "end" blocks. */ while (stack > 0 && *pos < BUFSZ(p)) { - if (stack > 10) - abort(); + if (stack > 64) + texierr(p, "run-away nested stack?"); endt = memmem(&BUF(p)[*pos], BUFSZ(p) - *pos, end, esz); startt = memmem(&BUF(p)[*pos], BUFSZ(p) - *pos, start, ssz); if (NULL == endt) { @@ -689,13 +726,13 @@ doinline(struct texi *p, enum texicmd cmd, size_t *pos } if (NULL == macro || p->literal || TEXILIST_TABLE == p->list) { - parsebracket(p, pos); + parsebracket(p, pos, 0); return; } teximacroopen(p, macro); p->seenws = 0; - parsebracket(p, pos); + parsebracket(p, pos, 0); texipunctuate(p, pos); teximacroclose(p); } @@ -727,7 +764,7 @@ doverb(struct texi *p, enum texicmd cmd, size_t *pos) break; advance(p, pos); } - if (*pos == BUFSZ(p) - 1) + if (*pos >= BUFSZ(p) - 1) return; texiputbuf(p, start, *pos); @@ -899,7 +936,7 @@ static void dobracket(struct texi *p, enum texicmd cmd, size_t *pos) { - parsebracket(p, pos); + parsebracket(p, pos, 0); } static void @@ -989,7 +1026,7 @@ doaccent(struct texi *p, enum texicmd cmd, size_t *pos if ('{' == BUF(p)[*pos]) { brace = 1; advance(p, pos); - } else if (isalpha(texitoks[cmd].tok[0])) + } else if (isalpha((unsigned char)texitoks[cmd].tok[0])) while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) advance(p, pos); @@ -1311,7 +1348,7 @@ dosymbol(struct texi *p, enum texicmd cmd, size_t *pos } /* Alphabetic commands have braces we ignore. */ - if (isalpha(texitoks[cmd].tok[0])) + if (isalpha((unsigned char)texitoks[cmd].tok[0])) doignbracket(p, cmd, pos); } @@ -1327,35 +1364,8 @@ doquotation(struct texi *p, enum texicmd cmd, size_t * static void domath(struct texi *p, enum texicmd cmd, size_t *pos) { - size_t nest, start; - /* - * Math handling is different from everything else. - * We don't allow any subcomponents, and we ignore the rules in - * terms of @-commands. - * This departs from GNU's rules, but whatever. - */ - while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) - advance(p, pos); - if (*pos == BUFSZ(p) || '{' != BUF(p)[*pos]) - return; - advance(p, pos); - if (p->seenws && p->outcol && 0 == p->literal) - texiputchar(p, ' '); - p->seenws = 0; - for (nest = 1, start = *pos; *pos < BUFSZ(p) && nest > 0; ) { - if ('{' == BUF(p)[*pos]) - nest++; - else if ('}' == BUF(p)[*pos]) - if (0 == --nest) - continue; - advance(p, pos); - } - if (*pos == BUFSZ(p)) - return; - assert('}' == BUF(p)[*pos]); - texiputbuf(p, start, *pos); - advance(p, pos); + parsebracket(p, pos, 1); } static void @@ -1607,7 +1617,7 @@ dotop(struct texi *p, enum texicmd cmd, size_t *pos) teximacroclose(p); teximacroopen(p, "Dt"); for (cp = p->title; '\0' != *cp; cp++) - texiputchar(p, toupper(*cp)); + texiputchar(p, toupper((unsigned int)*cp)); texiputchars(p, " 7"); teximacroclose(p); teximacro(p, "Os"); @@ -1808,7 +1818,7 @@ doignbracket(struct texi *p, enum texicmd cmd, size_t { p->ign++; - parsebracket(p, pos); + parsebracket(p, pos, 0); p->ign--; }