=================================================================== RCS file: /cvs/texi2mdoc/main.c,v retrieving revision 1.60 retrieving revision 1.63 diff -u -p -r1.60 -r1.63 --- texi2mdoc/main.c 2015/03/05 08:18:56 1.60 +++ texi2mdoc/main.c 2015/03/05 15:18:13 1.63 @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.60 2015/03/05 08:18:56 kristaps Exp $ */ +/* $Id: main.c,v 1.63 2015/03/05 15:18:13 kristaps Exp $ */ /* * Copyright (c) 2015 Kristaps Dzonsons * @@ -42,6 +42,7 @@ static void doaccent(struct texi *, enum texicmd, size static void doblock(struct texi *, enum texicmd, size_t *); static void dobracket(struct texi *, enum texicmd, size_t *); static void dobye(struct texi *, enum texicmd, size_t *); +static void docopying(struct texi *, enum texicmd, size_t *); static void dodefindex(struct texi *, enum texicmd, size_t *); static void dodefn(struct texi *, enum texicmd, size_t *); static void dodisplay(struct texi *, enum texicmd, size_t *); @@ -54,6 +55,7 @@ static void doignbracket(struct texi *, enum texicmd, static void doignline(struct texi *, enum texicmd, size_t *); static void doinline(struct texi *, enum texicmd, size_t *); static void doinclude(struct texi *, enum texicmd, size_t *); +static void doinsertcopying(struct texi *, enum texicmd, size_t *); static void doitem(struct texi *, enum texicmd, size_t *); static void doitemize(struct texi *, enum texicmd, size_t *); static void dolink(struct texi *, enum texicmd, size_t *); @@ -115,7 +117,7 @@ static const struct texitok __texitoks[TEXICMD__MAX] = { doignline, "c", 1 }, /* TEXICMD_COMMENT */ { doignline, "comment", 7 }, /* TEXICMD_COMMENT_LONG */ { doignline, "contents", 8 }, /* TEXICMD_CONTENTS */ - { doignblock, "copying", 7 }, /* TEXICMD_COPYING */ + { docopying, "copying", 7 }, /* TEXICMD_COPYING */ { dosymbol, "copyright", 9 }, /* TEXICMD_COPYRIGHT */ { dodefindex, "defcodeindex", 12 }, /* TEXICMD_DEFCODEINDEX */ { dodefn, "deffn", 5 }, /* TEXICMD_DEFFN */ @@ -214,7 +216,7 @@ static const struct texitok __texitoks[TEXICMD__MAX] = { dodisplay, "indentblock", 11 }, /* TEXICMD_INDENTBLOCK */ { dolink, "indicateurl", 11 }, /* TEXICMD_INDICATEURL */ { dolink, "inforef", 7 }, /* TEXICMD_INFOREF */ - { doignline, "insertcopying", 13 }, /* TEXICMD_INSERTCOPYING */ + { doinsertcopying, "insertcopying", 13 }, /* TEXICMD_INSERTCOPYING */ { doitem, "item", 4 }, /* TEXICMD_ITEM */ { doitemize, "itemize", 7 }, /* TEXICMD_ITEMIZE */ { doitem, "itemx", 5 }, /* TEXICMD_ITEMX */ @@ -542,9 +544,9 @@ dodefn(struct texi *p, enum texicmd cmd, size_t *pos) break; } teximacro(p, "Bd -filled -offset indent"); - p->seenvs = 1; parseto(p, pos, blk); teximacro(p, "Ed"); + p->seenvs = 1; } static void @@ -753,11 +755,15 @@ doinline(struct texi *p, enum texicmd cmd, size_t *pos teximacroopen(p, macro); p->seenws = 0; + if (TEXICMD_CODE == cmd) + p->literal++; if (TEXICMD_SC == cmd) p->uppercase++; parsebracket(p, pos, 0); if (TEXICMD_SC == cmd) p->uppercase--; + if (TEXICMD_CODE == cmd) + p->literal--; texipunctuate(p, pos); teximacroclose(p); } @@ -801,6 +807,53 @@ doverb(struct texi *p, enum texicmd cmd, size_t *pos) } static void +doinsertcopying(struct texi *p, enum texicmd cmd, size_t *pos) +{ + + advanceeoln(p, pos, 0); + if (NULL == p->copying) + return; + texisplice(p, p->copying, p->copyingsz, *pos); +} + +static void +docopying(struct texi *p, enum texicmd cmd, size_t *pos) +{ + const char *end, *term; + size_t endsz, endpos; + + /* We retain our starting (but not ending) newlines. */ + end = "\n@end copying\n"; + endsz = strlen(end); + advanceeoln(p, pos, 0); + if (*pos == BUFSZ(p)) { + texiwarn(p, "unterminated \"%s\"", texitoks[cmd].tok); + return; + } + + term = memmem(&BUF(p)[*pos], BUFSZ(p) - *pos, end, endsz); + if (NULL == term) { + texiwarn(p, "unterminated \"%s\"", texitoks[cmd].tok); + endpos = BUFSZ(p); + } else + endpos = *pos + (size_t)(term - &BUF(p)[*pos]); + + assert(endpos <= BUFSZ(p)); + assert('\n' == BUF(p)[*pos]); + advance(p, pos); + + p->copying = malloc(endpos - *pos + 1); + p->copyingsz = endpos - *pos; + memcpy(p->copying, &BUF(p)[*pos], p->copyingsz); + p->copying[endpos - *pos] = '\0'; + + while (*pos < endpos) + advance(p, pos); + if (*pos < BUFSZ(p)) + advanceto(p, pos, endpos + endsz); +} + +static void doverbatim(struct texi *p, enum texicmd cmd, size_t *pos) { const char *end, *term; @@ -811,13 +864,13 @@ doverbatim(struct texi *p, enum texicmd cmd, size_t *p endsz = strlen(end); advanceeoln(p, pos, 0); if (*pos == BUFSZ(p)) { - texiwarn(p, "unexpected end of file"); + texiwarn(p, "unterminated \"%s\"", texitoks[cmd].tok); return; } term = memmem(&BUF(p)[*pos], BUFSZ(p) - *pos, end, endsz); if (NULL == term) { - texiwarn(p, "unterminated verbatim block"); + texiwarn(p, "unterminated \"%s\"", texitoks[cmd].tok); endpos = BUFSZ(p); } else endpos = *pos + (size_t)(term - &BUF(p)[*pos]); @@ -831,6 +884,7 @@ doverbatim(struct texi *p, enum texicmd cmd, size_t *p advance(p, pos); } teximacro(p, "Ed"); + p->seenvs = 1; if (*pos < BUFSZ(p)) advanceto(p, pos, endpos + endsz); } @@ -980,9 +1034,9 @@ dodisplay(struct texi *p, enum texicmd cmd, size_t *po break; } - p->seenvs = 1; parseto(p, pos, texitoks[cmd].tok); teximacro(p, "Ed"); + p->seenvs = 1; } static void @@ -996,6 +1050,7 @@ doexample(struct texi *p, enum texicmd cmd, size_t *po parseto(p, pos, texitoks[cmd].tok); p->literal--; teximacro(p, "Ed"); + p->seenvs = 1; } static void @@ -1619,7 +1674,6 @@ dosection(struct texi *p, enum texicmd cmd, size_t *po teximacroopen(p, sects[sec]); parseeoln(p, pos); teximacroclose(p); - p->seenvs = 1; } static void @@ -1673,7 +1727,6 @@ doitem(struct texi *p, enum texicmd cmd, size_t *pos) } /* Trick so we don't start with Pp. */ - p->seenvs = 1; parseeoln(p, pos); if (TEXILIST_ITEM == p->list) @@ -1770,9 +1823,9 @@ dotable(struct texi *p, enum texicmd cmd, size_t *pos) p->list = TEXILIST_ITEM; teximacro(p, "Bl -tag -width Ds"); - p->seenvs = 1; parseto(p, pos, texitoks[cmd].tok); teximacro(p, "El"); + p->seenvs = 1; p->list = sv; } @@ -1801,9 +1854,9 @@ doenumerate(struct texi *p, enum texicmd cmd, size_t * p->list = TEXILIST_NOITEM; teximacro(p, "Bl -enum"); - p->seenvs = 1; parseto(p, pos, texitoks[cmd].tok); teximacro(p, "El"); + p->seenvs = 1; p->list = sv; } @@ -1816,9 +1869,9 @@ doitemize(struct texi *p, enum texicmd cmd, size_t *po p->list = TEXILIST_NOITEM; teximacro(p, "Bl -bullet"); - p->seenvs = 1; parseto(p, pos, texitoks[cmd].tok); teximacro(p, "El"); + p->seenvs = 1; p->list = sv; }