version 1.37, 2015/02/23 17:24:51 |
version 1.42, 2015/02/24 20:06:32 |
|
|
#if defined(__linux__) || defined(__MINT__) |
#if defined(__linux__) || defined(__MINT__) |
# define _GNU_SOURCE /* memmem */ |
# define _GNU_SOURCE /* memmem */ |
#endif |
#endif |
#include <sys/mman.h> |
|
#include <sys/stat.h> |
|
|
|
#include <assert.h> |
#include <assert.h> |
#include <ctype.h> |
#include <ctype.h> |
#include <fcntl.h> |
|
#include <getopt.h> |
#include <getopt.h> |
#include <libgen.h> |
#include <libgen.h> |
#include <limits.h> |
#include <limits.h> |
|
|
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
#include <time.h> |
#include <time.h> |
#include <unistd.h> |
|
|
|
#include "extern.h" |
#include "extern.h" |
|
|
Line 82 static void doverbinclude(struct texi *, enum texicmd, |
|
Line 77 static void doverbinclude(struct texi *, enum texicmd, |
|
|
|
static const struct texitok __texitoks[TEXICMD__MAX] = { |
static const struct texitok __texitoks[TEXICMD__MAX] = { |
/* TEXICMD__BEGIN */ |
/* TEXICMD__BEGIN */ |
|
{ doignline, "afourpaper", 10 }, /* TEXICMD_A4PAPER */ |
|
{ dosymbol, "AA", 2 }, /* TEXICMD_AA */ |
|
{ dosymbol, "aa", 2 }, /* TEXICMD_AASMALL */ |
{ doignargn, "acronym", 7 }, /* TEXICMD_ACRONYM */ |
{ doignargn, "acronym", 7 }, /* TEXICMD_ACRONYM */ |
{ doaccent, "'", 1 }, /* TEXICMD_ACUTE */ |
{ doaccent, "'", 1 }, /* TEXICMD_ACUTE */ |
{ doignline, "afourpaper", 10 }, /* TEXICMD_A4PAPER */ |
{ dosymbol, "AE", 2 }, /* TEXICMD_AE */ |
|
{ dosymbol, "ae", 2 }, /* TEXICMD_AESMALL */ |
{ doignbracket, "anchor", 6 }, /* TEXICMD_ANCHOR */ |
{ doignbracket, "anchor", 6 }, /* TEXICMD_ANCHOR */ |
{ dosection, "appendix", 8 }, /* TEXICMD_APPENDIX */ |
{ dosection, "appendix", 8 }, /* TEXICMD_APPENDIX */ |
{ dosection, "appendixsec", 11 }, /* TEXICMD_APPENDIXSEC */ |
{ dosection, "appendixsec", 11 }, /* TEXICMD_APPENDIXSEC */ |
Line 142 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 141 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dodefn, "defvrx", 6 }, /* TEXICMD_DEFVRX */ |
{ dodefn, "defvrx", 6 }, /* TEXICMD_DEFVRX */ |
{ doignblock, "detailmenu", 10 }, /* TEXICMD_DETAILMENU */ |
{ doignblock, "detailmenu", 10 }, /* TEXICMD_DETAILMENU */ |
{ doinline, "dfn", 3 }, /* TEXICMD_DFN */ |
{ doinline, "dfn", 3 }, /* TEXICMD_DFN */ |
|
{ dosymbol, "DH", 2 }, /* TEXICMD_DH */ |
|
{ dosymbol, "dh", 2 }, /* TEXICMD_DHSMALL */ |
{ doignline, "dircategory", 11 }, /* TEXICMD_DIRCATEGORY */ |
{ doignline, "dircategory", 11 }, /* TEXICMD_DIRCATEGORY */ |
{ doignblock, "direntry", 8 }, /* TEXICMD_DIRENTRY */ |
{ doignblock, "direntry", 8 }, /* TEXICMD_DIRENTRY */ |
{ dodisplay, "display", 7 }, /* TEXICMD_DISPLAY */ |
{ dodisplay, "display", 7 }, /* TEXICMD_DISPLAY */ |
{ doignbracket, "dmn", 3 }, /* TEXICMD_DMN */ |
{ doignbracket, "dmn", 3 }, /* TEXICMD_DMN */ |
|
{ doignblock, "documentdescription", 19 }, /* TEXICMD_DOCUMENTDESCRIPTION */ |
|
{ doignline, "documentencoding", 16 }, /* TEXICMD_DOCUMENTENCODING */ |
|
{ doaccent, "dotaccent", 9 }, /* TEXICMD_DOTACCENT */ |
|
{ doaccent, "dotless", 7 }, /* TEXICMD_DOTLESS */ |
{ dosymbol, "dots", 4 }, /* TEXICMD_DOTS */ |
{ dosymbol, "dots", 4 }, /* TEXICMD_DOTS */ |
{ dolink, "email", 5 }, /* TEXICMD_EMAIL */ |
{ dolink, "email", 5 }, /* TEXICMD_EMAIL */ |
{ doinline, "emph", 4 }, /* TEXICMD_EMPH */ |
{ doinline, "emph", 4 }, /* TEXICMD_EMPH */ |
Line 156 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 161 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dosymbol, "equiv", 5 }, /* TEXICMD_EQUIV */ |
{ dosymbol, "equiv", 5 }, /* TEXICMD_EQUIV */ |
{ dosymbol, "error", 5 }, /* TEXICMD_ERROR */ |
{ dosymbol, "error", 5 }, /* TEXICMD_ERROR */ |
{ doexample, "example", 7 }, /* TEXICMD_EXAMPLE */ |
{ doexample, "example", 7 }, /* TEXICMD_EXAMPLE */ |
|
{ dosymbol, "exclamdown", 10 }, /* TEXICMD_EXCLAMDOWN */ |
{ doignline, "exdent", 6 }, /* TEXICMD_EXDENT */ |
{ doignline, "exdent", 6 }, /* TEXICMD_EXDENT */ |
{ dosymbol, "expansion", 9 }, /* TEXICMD_EXPANSION */ |
{ dosymbol, "expansion", 9 }, /* TEXICMD_EXPANSION */ |
{ doinline, "file", 4 }, /* TEXICMD_FILE */ |
{ doinline, "file", 4 }, /* TEXICMD_FILE */ |
Line 166 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 172 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dodisplay, "format", 6 }, /* TEXICMD_FORMAT */ |
{ dodisplay, "format", 6 }, /* TEXICMD_FORMAT */ |
{ doaccent, "`", 1 }, /* TEXICMD_GRAVE */ |
{ doaccent, "`", 1 }, /* TEXICMD_GRAVE */ |
{ doblock, "group", 5 }, /* TEXICMD_GROUP */ |
{ doblock, "group", 5 }, /* TEXICMD_GROUP */ |
|
{ doaccent, "H", 1 }, /* TEXICMD_H */ |
{ dosection, "heading", 7 }, /* TEXICMD_HEADING */ |
{ dosection, "heading", 7 }, /* TEXICMD_HEADING */ |
{ doignline, "headings", 8 }, /* TEXICMD_HEADINGS */ |
{ doignline, "headings", 8 }, /* TEXICMD_HEADINGS */ |
{ doitem, "headitem", 8 }, /* TEXICMD_HEADITEM */ |
{ doitem, "headitem", 8 }, /* TEXICMD_HEADITEM */ |
Line 198 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 205 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ doinline, "kbd", 3 }, /* TEXICMD_KBD */ |
{ doinline, "kbd", 3 }, /* TEXICMD_KBD */ |
{ dobracket, "key", 3 }, /* TEXICMD_KEY */ |
{ dobracket, "key", 3 }, /* TEXICMD_KEY */ |
{ doignline, "kindex", 6 }, /* TEXICMD_KINDEX */ |
{ doignline, "kindex", 6 }, /* TEXICMD_KINDEX */ |
|
{ dosymbol, "L", 1 }, /* TEXICMD_L */ |
{ dosymbol, "LaTeX", 5 }, /* TEXICMD_LATEX */ |
{ dosymbol, "LaTeX", 5 }, /* TEXICMD_LATEX */ |
{ dosecoffs, "lowersections", 13 }, /* TEXICMD_LOWERSECTIONS */ |
{ dosecoffs, "lowersections", 13 }, /* TEXICMD_LOWERSECTIONS */ |
|
{ dosymbol, "l", 1 }, /* TEXICMD_LSMALL */ |
{ domacro, "macro", 5 }, /* TEXICMD_MACRO */ |
{ domacro, "macro", 5 }, /* TEXICMD_MACRO */ |
|
{ doaccent, "=", 1 }, /* TEXICMD_MACRON */ |
{ domath, "math", 4 }, /* TEXICMD_MATH */ |
{ domath, "math", 4 }, /* TEXICMD_MATH */ |
{ doignblock, "menu", 4 }, /* TEXICMD_MENU */ |
{ doignblock, "menu", 4 }, /* TEXICMD_MENU */ |
{ dosymbol, "minus", 5 }, /* TEXICMD_MINUS */ |
{ dosymbol, "minus", 5 }, /* TEXICMD_MINUS */ |
Line 209 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 219 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dosymbol, "\n", 1 }, /* TEXICMD_NEWLINE */ |
{ dosymbol, "\n", 1 }, /* TEXICMD_NEWLINE */ |
{ doignline, "node", 4 }, /* TEXICMD_NODE */ |
{ doignline, "node", 4 }, /* TEXICMD_NODE */ |
{ doignline, "noindent", 8 }, /* TEXICMD_NOINDENT */ |
{ doignline, "noindent", 8 }, /* TEXICMD_NOINDENT */ |
|
{ dosymbol, "O", 1 }, /* TEXICMD_O */ |
|
{ dosymbol, "OE", 2 }, /* TEXICMD_OE */ |
|
{ dosymbol, "oe", 2 }, /* TEXICMD_OESMALL */ |
|
{ doaccent, "ogonek", 6 }, /* TEXICMD_OGONEK */ |
{ doinline, "option", 6 }, /* TEXICMD_OPTION */ |
{ doinline, "option", 6 }, /* TEXICMD_OPTION */ |
{ dolink, "pxref", 5 }, /* TEXICMD_PXREF */ |
{ dosymbol, "ordf", 4 }, /* TEXICMD_ORDF */ |
{ dosymbol, "?", 1 }, /* TEXICMD_QUESTIONMARK */ |
{ dosymbol, "ordm", 4 }, /* TEXICMD_ORDM */ |
{ doquotation, "quotation", 9 }, /* TEXICMD_QUOTATION */ |
{ dosymbol, "o", 1 }, /* TEXICMD_OSMALL */ |
{ doignline, "page", 4 }, /* TEXICMD_PAGE */ |
{ doignline, "page", 4 }, /* TEXICMD_PAGE */ |
{ doignline, "paragraphindent", 15 }, /* TEXICMD_PARINDENT */ |
{ doignline, "paragraphindent", 15 }, /* TEXICMD_PARINDENT */ |
{ dosymbol, ".", 1 }, /* TEXICMD_PERIOD */ |
{ dosymbol, ".", 1 }, /* TEXICMD_PERIOD */ |
{ doignline, "pindex", 6 }, /* TEXICMD_PINDEX */ |
{ doignline, "pindex", 6 }, /* TEXICMD_PINDEX */ |
{ doignline, "printindex", 10 }, /* TEXICMD_PRINTINDEX */ |
{ doignline, "printindex", 10 }, /* TEXICMD_PRINTINDEX */ |
|
{ dolink, "pxref", 5 }, /* TEXICMD_PXREF */ |
|
{ dosymbol, "questiondown", 12 }, /* TEXICMD_QUESTIONDOWN */ |
|
{ dosymbol, "?", 1 }, /* TEXICMD_QUESTIONMARK */ |
|
{ doquotation, "quotation", 9 }, /* TEXICMD_QUOTATION */ |
{ doinline, "r", 1 }, /* TEXICMD_R */ |
{ doinline, "r", 1 }, /* TEXICMD_R */ |
{ dosecoffs, "raisesections", 13 }, /* TEXICMD_RAISESECTIONS */ |
{ dosecoffs, "raisesections", 13 }, /* TEXICMD_RAISESECTIONS */ |
{ dobracket, "ref", 3 }, /* TEXICMD_REF */ |
{ dobracket, "ref", 3 }, /* TEXICMD_REF */ |
{ doignline, "refill", 6 }, /* TEXICMD_REFILL */ |
{ doignline, "refill", 6 }, /* TEXICMD_REFILL */ |
{ dosymbol, "result", 6 }, /* TEXICMD_RESULT */ |
{ dosymbol, "result", 6 }, /* TEXICMD_RESULT */ |
|
{ doaccent, "ringaccent", 10 }, /* TEXICMD_RINGACCENT */ |
{ doinline, "samp", 4 }, /* TEXICMD_SAMP */ |
{ doinline, "samp", 4 }, /* TEXICMD_SAMP */ |
{ doinline, "sansserif", 9 }, /* TEXICMD_SANSSERIF */ |
{ doinline, "sansserif", 9 }, /* TEXICMD_SANSSERIF */ |
{ dobracket, "sc", 2 }, /* TEXICMD_SC */ |
{ dobracket, "sc", 2 }, /* TEXICMD_SC */ |
Line 260 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 279 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dotable, "table", 5 }, /* TEXICMD_TABLE */ |
{ dotable, "table", 5 }, /* TEXICMD_TABLE */ |
{ doignblock, "tex", 3 }, /* TEXICMD_TEX */ |
{ doignblock, "tex", 3 }, /* TEXICMD_TEX */ |
{ dosymbol, "TeX", 3 }, /* TEXICMD_TEXSYM */ |
{ dosymbol, "TeX", 3 }, /* TEXICMD_TEXSYM */ |
|
{ dosymbol, "TH", 2 }, /* TEXICMD_TH */ |
|
{ dosymbol, "th", 2 }, /* TEXICMD_THSMALL */ |
{ dosymbol, "tie", 3 }, /* TEXICMD_TIE */ |
{ dosymbol, "tie", 3 }, /* TEXICMD_TIE */ |
|
{ doaccent, "tieaccent", 9 }, /* TEXICMD_TIEACCENT */ |
{ doaccent, "~", 1 }, /* TEXICMD_TILDE */ |
{ doaccent, "~", 1 }, /* TEXICMD_TILDE */ |
{ doignline, "tindex", 6 }, /* TEXICMD_TINDEX */ |
{ doignline, "tindex", 6 }, /* TEXICMD_TINDEX */ |
{ doignline, "title", 5 }, /* TEXICMD_TITLE */ |
{ doignline, "title", 5 }, /* TEXICMD_TITLE */ |
{ dobracket, "titlefont", 9 }, /* TEXICMD_TITLEFONT */ |
{ dobracket, "titlefont", 9 }, /* TEXICMD_TITLEFONT */ |
{ doignblock, "titlepage", 9 }, /* TEXICMD_TITLEPAGE */ |
{ doignblock, "titlepage", 9 }, /* TEXICMD_TITLEPAGE */ |
{ dotop, "top", 3 }, /* TEXICMD_TOP */ |
{ dotop, "top", 3 }, /* TEXICMD_TOP */ |
|
{ doaccent, "u", 1 }, /* TEXICMD_U */ |
|
{ doaccent, "ubaraccent", 10 }, /* TEXICMD_UBARACCENT */ |
|
{ doaccent, "udotaccent", 10 }, /* TEXICMD_UDOTACCENT */ |
{ doaccent, "\"", 1 }, /* TEXICMD_UMLAUT */ |
{ doaccent, "\"", 1 }, /* TEXICMD_UMLAUT */ |
{ dosection, "unnumbered", 10 }, /* TEXICMD_UNNUMBERED */ |
{ dosection, "unnumbered", 10 }, /* TEXICMD_UNNUMBERED */ |
{ dosection, "unnumberedsec", 13 }, /* TEXICMD_UNNUMBEREDSEC */ |
{ dosection, "unnumberedsec", 13 }, /* TEXICMD_UNNUMBEREDSEC */ |
Line 275 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 300 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dolink, "uref", 4 }, /* TEXICMD_UREF */ |
{ dolink, "uref", 4 }, /* TEXICMD_UREF */ |
{ dolink, "url", 3 }, /* TEXICMD_URL */ |
{ dolink, "url", 3 }, /* TEXICMD_URL */ |
{ doignline, "", 0 }, /* TEXICMD_USER_INDEX */ |
{ doignline, "", 0 }, /* TEXICMD_USER_INDEX */ |
|
{ doaccent, "v", 1 }, /* TEXICMD_V */ |
{ dovalue, "value", 5 }, /* TEXICMD_VALUE */ |
{ dovalue, "value", 5 }, /* TEXICMD_VALUE */ |
{ doinline, "var", 3 }, /* TEXICMD_VAR */ |
{ doinline, "var", 3 }, /* TEXICMD_VAR */ |
{ doverb, "verb", 4 }, /* TEXICMD_VERB */ |
{ doverb, "verb", 4 }, /* TEXICMD_VERB */ |
Line 672 doverbatim(struct texi *p, enum texicmd cmd, |
|
Line 698 doverbatim(struct texi *p, enum texicmd cmd, |
|
teximacro(p, "Bd -literal -offset indent"); |
teximacro(p, "Bd -literal -offset indent"); |
assert(endpos <= sz); |
assert(endpos <= sz); |
while (*pos < endpos) { |
while (*pos < endpos) { |
if (buf[*pos] == '\n') |
texiputchar(p, buf[*pos]); |
p->outcol = 0; |
|
else |
|
p->outcol++; |
|
if (*pos > 0 && '.' == buf[*pos]) |
|
if ('\n' == buf[*pos - 1]) |
|
fputs("\\&", stdout); |
|
putchar(buf[*pos]); |
|
if ('\\' == buf[*pos]) |
|
putchar('e'); |
|
advance(p, buf, pos); |
advance(p, buf, pos); |
} |
} |
teximacro(p, "Ed"); |
teximacro(p, "Ed"); |
|
|
doaccent(struct texi *p, enum texicmd cmd, |
doaccent(struct texi *p, enum texicmd cmd, |
const char *buf, size_t sz, size_t *pos) |
const char *buf, size_t sz, size_t *pos) |
{ |
{ |
|
int brace = 0; |
|
|
if (*pos == sz) |
if (*pos == sz) { |
|
texiwarn(p, "truncated: @%s", texitoks[cmd].tok); |
return; |
return; |
if (p->seenws && p->outcol && 0 == p->literal) |
} |
|
|
|
/* Pad us with space, if necessary. */ |
|
if (p->seenws && p->outcol && 0 == p->literal) { |
texiputchar(p, ' '); |
texiputchar(p, ' '); |
p->seenws = 0; |
p->seenws = 0; |
switch (cmd) { |
} |
case (TEXICMD_CEDILLA): |
|
/* Strange rules... */ |
/* |
|
* If we're braced, then that's that. |
|
* Otherwise, in a special Texinfo case: if we're a non |
|
* alphabetic command of one letter, then the next character is |
|
* the critical one. |
|
* Otherwise, space can sit between us and our argument. |
|
*/ |
|
if ('{' == buf[*pos]) { |
|
brace = 1; |
|
advance(p, buf, pos); |
|
} else if (isalpha(texitoks[cmd].tok[0])) |
while (*pos < sz && isws(buf[*pos])) |
while (*pos < sz && isws(buf[*pos])) |
advance(p, buf, pos); |
advance(p, buf, pos); |
if (*pos == sz || '{' != buf[*pos]) |
|
return; |
if (*pos == sz) { |
advance(p, buf, pos); |
texiwarn(p, "truncated: @%s", texitoks[cmd].tok); |
switch (buf[*pos]) { |
return; |
case ('c'): case ('C'): |
} |
texiputchars(p, "\\(,"); |
|
texiputchar(p, buf[*pos]); |
switch (cmd) { |
break; |
|
default: |
|
texiputchar(p, buf[*pos]); |
|
break; |
|
} |
|
advance(p, buf, pos); |
|
break; |
|
case (TEXICMD_ACUTE): |
case (TEXICMD_ACUTE): |
switch (buf[*pos]) { |
switch (buf[*pos]) { |
case ('a'): case ('A'): |
case ('a'): case ('A'): |
Line 922 doaccent(struct texi *p, enum texicmd cmd, |
|
Line 947 doaccent(struct texi *p, enum texicmd cmd, |
|
case ('o'): case ('O'): |
case ('o'): case ('O'): |
case ('u'): case ('U'): |
case ('u'): case ('U'): |
texiputchars(p, "\\(\'"); |
texiputchars(p, "\\(\'"); |
texiputchar(p, buf[*pos]); |
|
break; |
break; |
default: |
default: |
texiputchar(p, buf[*pos]); |
texiwarn(p, "ignoring accent"); |
|
break; |
} |
} |
|
texiputchar(p, buf[*pos]); |
|
advance(p, buf, pos); |
break; |
break; |
|
case (TEXICMD_CEDILLA): |
|
if ('c' == buf[*pos] || 'C' == buf[*pos]) |
|
texiputchars(p, "\\(,"); |
|
else |
|
texiwarn(p, "ignoring accent"); |
|
texiputchar(p, buf[*pos]); |
|
advance(p, buf, pos); |
|
break; |
case (TEXICMD_CIRCUMFLEX): |
case (TEXICMD_CIRCUMFLEX): |
switch (buf[*pos]) { |
switch (buf[*pos]) { |
case ('a'): case ('A'): |
case ('a'): case ('A'): |
Line 936 doaccent(struct texi *p, enum texicmd cmd, |
|
Line 971 doaccent(struct texi *p, enum texicmd cmd, |
|
case ('o'): case ('O'): |
case ('o'): case ('O'): |
case ('u'): case ('U'): |
case ('u'): case ('U'): |
texiputchars(p, "\\(^"); |
texiputchars(p, "\\(^"); |
texiputchar(p, buf[*pos]); |
|
break; |
break; |
default: |
default: |
texiputchar(p, buf[*pos]); |
texiwarn(p, "ignoring accent"); |
break; |
break; |
} |
} |
|
texiputchar(p, buf[*pos]); |
|
advance(p, buf, pos); |
break; |
break; |
|
case (TEXICMD_DOTLESS): |
|
if ('i' == buf[*pos] || 'j' == buf[*pos]) |
|
texiputchars(p, "\\(."); |
|
else |
|
texiwarn(p, "ignoring accent"); |
|
texiputchar(p, buf[*pos]); |
|
advance(p, buf, pos); |
|
break; |
case (TEXICMD_GRAVE): |
case (TEXICMD_GRAVE): |
switch (buf[*pos]) { |
switch (buf[*pos]) { |
case ('a'): case ('A'): |
case ('a'): case ('A'): |
Line 951 doaccent(struct texi *p, enum texicmd cmd, |
|
Line 995 doaccent(struct texi *p, enum texicmd cmd, |
|
case ('o'): case ('O'): |
case ('o'): case ('O'): |
case ('u'): case ('U'): |
case ('u'): case ('U'): |
texiputchars(p, "\\(`"); |
texiputchars(p, "\\(`"); |
texiputchar(p, buf[*pos]); |
|
break; |
break; |
default: |
default: |
texiputchar(p, buf[*pos]); |
texiwarn(p, "ignoring accent"); |
|
break; |
} |
} |
|
texiputchar(p, buf[*pos]); |
|
advance(p, buf, pos); |
break; |
break; |
case (TEXICMD_TILDE): |
case (TEXICMD_TILDE): |
switch (buf[*pos]) { |
switch (buf[*pos]) { |
Line 963 doaccent(struct texi *p, enum texicmd cmd, |
|
Line 1009 doaccent(struct texi *p, enum texicmd cmd, |
|
case ('n'): case ('N'): |
case ('n'): case ('N'): |
case ('o'): case ('O'): |
case ('o'): case ('O'): |
texiputchars(p, "\\(~"); |
texiputchars(p, "\\(~"); |
texiputchar(p, buf[*pos]); |
|
break; |
break; |
default: |
default: |
texiputchar(p, buf[*pos]); |
texiwarn(p, "ignoring accent"); |
break; |
break; |
} |
} |
|
texiputchar(p, buf[*pos]); |
|
advance(p, buf, pos); |
break; |
break; |
case (TEXICMD_UMLAUT): |
case (TEXICMD_UMLAUT): |
switch (buf[*pos]) { |
switch (buf[*pos]) { |
Line 979 doaccent(struct texi *p, enum texicmd cmd, |
|
Line 1026 doaccent(struct texi *p, enum texicmd cmd, |
|
case ('u'): case ('U'): |
case ('u'): case ('U'): |
case ('y'): |
case ('y'): |
texiputchars(p, "\\(:"); |
texiputchars(p, "\\(:"); |
texiputchar(p, buf[*pos]); |
|
break; |
break; |
default: |
default: |
texiputchar(p, buf[*pos]); |
texiwarn(p, "ignoring accent"); |
break; |
break; |
} |
} |
|
texiputchar(p, buf[*pos]); |
|
advance(p, buf, pos); |
break; |
break; |
default: |
default: |
abort(); |
texiputchar(p, buf[*pos]); |
|
advance(p, buf, pos); |
|
break; |
} |
} |
advance(p, buf, pos); |
|
|
if (brace) { |
|
while (*pos < sz && '}' != buf[*pos]) { |
|
texiputchar(p, buf[*pos]); |
|
advance(p, buf, pos); |
|
} |
|
if (*pos < sz) |
|
advance(p, buf, pos); |
|
} |
|
|
|
switch (cmd) { |
|
case (TEXICMD_TIEACCENT): |
|
texiputchar(p, ']'); |
|
break; |
|
case (TEXICMD_DOTACCENT): |
|
texiputchar(p, '*'); |
|
break; |
|
default: |
|
break; |
|
} |
} |
} |
|
|
static void |
static void |
Line 997 dosymbol(struct texi *p, enum texicmd cmd, |
|
Line 1066 dosymbol(struct texi *p, enum texicmd cmd, |
|
const char *buf, size_t sz, size_t *pos) |
const char *buf, size_t sz, size_t *pos) |
{ |
{ |
|
|
|
/* Remember to pad us. */ |
if (p->seenws && p->outcol && 0 == p->literal) { |
if (p->seenws && p->outcol && 0 == p->literal) { |
texiputchar(p, ' '); |
texiputchar(p, ' '); |
p->seenws = 0; |
p->seenws = 0; |
} |
} |
|
|
switch (cmd) { |
switch (cmd) { |
|
case (TEXICMD_AA): |
|
texiputchars(p, "\\(oA"); |
|
break; |
|
case (TEXICMD_AASMALL): |
|
texiputchars(p, "\\(oa"); |
|
break; |
|
case (TEXICMD_AE): |
|
texiputchars(p, "\\(AE"); |
|
break; |
|
case (TEXICMD_AESMALL): |
|
texiputchars(p, "\\(ae"); |
|
break; |
case (TEXICMD_ASTERISK): |
case (TEXICMD_ASTERISK): |
case (TEXICMD_NEWLINE): |
case (TEXICMD_NEWLINE): |
case (TEXICMD_SPACE): |
case (TEXICMD_SPACE): |
Line 1024 dosymbol(struct texi *p, enum texicmd cmd, |
|
Line 1106 dosymbol(struct texi *p, enum texicmd cmd, |
|
case (TEXICMD_COPYRIGHT): |
case (TEXICMD_COPYRIGHT): |
texiputchars(p, "\\(co"); |
texiputchars(p, "\\(co"); |
break; |
break; |
|
case (TEXICMD_DH): |
|
texiputchars(p, "\\(-D"); |
|
break; |
|
case (TEXICMD_DHSMALL): |
|
texiputchars(p, "\\(Sd"); |
|
break; |
case (TEXICMD_DOTS): |
case (TEXICMD_DOTS): |
case (TEXICMD_ENDDOTS): |
case (TEXICMD_ENDDOTS): |
texiputchars(p, "..."); |
texiputchars(p, "..."); |
Line 1034 dosymbol(struct texi *p, enum texicmd cmd, |
|
Line 1122 dosymbol(struct texi *p, enum texicmd cmd, |
|
case (TEXICMD_ERROR): |
case (TEXICMD_ERROR): |
texiputchars(p, "error\\(->"); |
texiputchars(p, "error\\(->"); |
break; |
break; |
|
case (TEXICMD_EXCLAMDOWN): |
|
texiputchars(p, "\\(r!"); |
|
break; |
case (TEXICMD_EXPANSION): |
case (TEXICMD_EXPANSION): |
texiputchars(p, "\\(->"); |
texiputchars(p, "\\(->"); |
break; |
break; |
|
case (TEXICMD_L): |
|
texiputchars(p, "\\(/L"); |
|
break; |
case (TEXICMD_LATEX): |
case (TEXICMD_LATEX): |
texiputchars(p, "LaTeX"); |
texiputchars(p, "LaTeX"); |
break; |
break; |
|
case (TEXICMD_LSMALL): |
|
texiputchars(p, "\\(/l"); |
|
break; |
case (TEXICMD_MINUS): |
case (TEXICMD_MINUS): |
texiputchars(p, "\\-"); |
texiputchars(p, "\\-"); |
break; |
break; |
|
case (TEXICMD_O): |
|
texiputchars(p, "\\(/O"); |
|
break; |
|
case (TEXICMD_OE): |
|
texiputchars(p, "\\(OE"); |
|
break; |
|
case (TEXICMD_OESMALL): |
|
texiputchars(p, "\\(oe"); |
|
break; |
|
case (TEXICMD_ORDF): |
|
texiputchars(p, "a"); |
|
break; |
|
case (TEXICMD_ORDM): |
|
texiputchars(p, "o"); |
|
break; |
|
case (TEXICMD_OSMALL): |
|
texiputchars(p, "\\(/o"); |
|
break; |
case (TEXICMD_PERIOD): |
case (TEXICMD_PERIOD): |
texiputchar(p, '.'); |
texiputchar(p, '.'); |
break; |
break; |
|
case (TEXICMD_QUESTIONDOWN): |
|
texiputchars(p, "\\(r?"); |
|
break; |
case (TEXICMD_QUESTIONMARK): |
case (TEXICMD_QUESTIONMARK): |
texiputchar(p, '?'); |
texiputchar(p, '?'); |
break; |
break; |
Line 1064 dosymbol(struct texi *p, enum texicmd cmd, |
|
Line 1182 dosymbol(struct texi *p, enum texicmd cmd, |
|
case (TEXICMD_SQUIGGLE_RIGHT): |
case (TEXICMD_SQUIGGLE_RIGHT): |
texiputchars(p, "}"); |
texiputchars(p, "}"); |
break; |
break; |
case (TEXICMD_TIE): |
case (TEXICMD_TEXSYM): |
texiputchars(p, "TeX"); |
texiputchars(p, "TeX"); |
break; |
break; |
case (TEXICMD_TEXSYM): |
case (TEXICMD_TH): |
|
texiputchars(p, "\\(TP"); |
|
break; |
|
case (TEXICMD_THSMALL): |
|
texiputchars(p, "\\(Tp"); |
|
break; |
|
case (TEXICMD_TIE): |
texiputchars(p, "\\ "); |
texiputchars(p, "\\ "); |
break; |
break; |
case (TEXICMD_COLON): |
case (TEXICMD_COLON): |
Line 1077 dosymbol(struct texi *p, enum texicmd cmd, |
|
Line 1201 dosymbol(struct texi *p, enum texicmd cmd, |
|
abort(); |
abort(); |
} |
} |
|
|
if (texitoks[cmd].len > 1) |
/* Alphabetic commands have braces we ignore. */ |
|
if (isalpha(texitoks[cmd].tok[0])) |
doignbracket(p, cmd, buf, sz, pos); |
doignbracket(p, cmd, buf, sz, pos); |
} |
} |
|
|
Line 1212 dolink(struct texi *p, enum texicmd cmd, |
|
Line 1337 dolink(struct texi *p, enum texicmd cmd, |
|
break; |
break; |
case (TEXICMD_XREF): |
case (TEXICMD_XREF): |
texiputchars(p, "See Section"); |
texiputchars(p, "See Section"); |
teximacroopen(p, "Qq"); |
teximacroopen(p, "Dq"); |
break; |
break; |
case (TEXICMD_PXREF): |
case (TEXICMD_PXREF): |
texiputchars(p, "see Section"); |
texiputchars(p, "see Section"); |
teximacroopen(p, "Qq"); |
teximacroopen(p, "Dq"); |
break; |
break; |
case (TEXICMD_INFOREF): |
case (TEXICMD_INFOREF): |
texiputchars(p, "See Info file node"); |
texiputchars(p, "See Info file node"); |
teximacroopen(p, "Qq"); |
teximacroopen(p, "Dq"); |
break; |
break; |
default: |
default: |
abort(); |
abort(); |
Line 1398 dotop(struct texi *p, enum texicmd cmd, |
|
Line 1523 dotop(struct texi *p, enum texicmd cmd, |
|
teximacro(p, "Os"); |
teximacro(p, "Os"); |
teximacro(p, "Sh NAME"); |
teximacro(p, "Sh NAME"); |
teximacroopen(p, "Nm"); |
teximacroopen(p, "Nm"); |
texiputchars(p, p->title); |
for (cp = p->title; '\0' != *cp; cp++) |
|
texiputchar(p, *cp); |
teximacroclose(p); |
teximacroclose(p); |
teximacroopen(p, "Nd"); |
teximacroopen(p, "Nd"); |
texiputchars(p, NULL != p->subtitle ? |
if (NULL != p->subtitle) |
p->subtitle : "Unknown description"); |
for (cp = p->subtitle; '\0' != *cp; cp++) |
|
texiputchar(p, *cp); |
|
else |
|
texiputchars(p, "Unknown description"); |
teximacroclose(p); |
teximacroclose(p); |
p->seenvs = 1; |
p->seenvs = 1; |
dosection(p, cmd, buf, sz, pos); |
dosection(p, cmd, buf, sz, pos); |
Line 1597 doignline(struct texi *p, enum texicmd cmd, |
|
Line 1726 doignline(struct texi *p, enum texicmd cmd, |
|
/* |
/* |
* Parse colon-separated directories from "cp" (if not NULL) and returns |
* Parse colon-separated directories from "cp" (if not NULL) and returns |
* the array of pointers. |
* the array of pointers. |
* Prepends "base" to the array. |
* Prepends "base" to the array, if found. |
* This does NOT sanitise the directories! |
* This does NOT sanitise the directories! |
*/ |
*/ |
static char ** |
static char ** |
Line 1605 parsedirs(struct texi *p, const char *base, const char |
|
Line 1734 parsedirs(struct texi *p, const char *base, const char |
|
{ |
{ |
char *tok, *str, *tofree; |
char *tok, *str, *tofree; |
const char *cpp; |
const char *cpp; |
size_t i; |
size_t i = 0; |
char **dirs; |
char **dirs; |
|
|
*sz = NULL != (cpp = cp) ? 2 : 1; |
/* Count up our expected arguments. */ |
if (*sz > 1) |
*sz = NULL != base; |
for ( ; NULL != (cpp = strchr(cpp, ':')); (*sz)++) |
if (NULL != (cpp = cp)) |
|
for ((*sz)++; NULL != (cpp = strchr(cpp, ':')); (*sz)++) |
cpp++; |
cpp++; |
|
|
|
if (0 == *sz) |
|
return(NULL); |
if (NULL == (dirs = calloc(*sz, sizeof(char *)))) |
if (NULL == (dirs = calloc(*sz, sizeof(char *)))) |
texiabort(p, NULL); |
texiabort(p, NULL); |
else if (NULL == (dirs[0] = strdup(base))) |
if (NULL != base && NULL == (dirs[i++] = strdup(base))) |
texiabort(p, NULL); |
texiabort(p, NULL); |
|
|
if (NULL == cp) |
if (NULL == cp) |
return(dirs); |
return(dirs); |
|
|
if (NULL == (tofree = tok = str = strdup(cp))) |
if (NULL == (tofree = tok = str = strdup(cp))) |
texiabort(p, NULL); |
texiabort(p, NULL); |
|
|
for (i = 1; NULL != (tok = strsep(&str, ":")); i++) |
for ( ; NULL != (tok = strsep(&str, ":")); i++) |
if (NULL == (dirs[i] = strdup(tok))) |
if (NULL == (dirs[i] = strdup(tok))) |
texiabort(p, NULL); |
texiabort(p, NULL); |
|
|
Line 1647 main(int argc, char *argv[]) |
|
Line 1777 main(int argc, char *argv[]) |
|
++progname; |
++progname; |
|
|
memset(&texi, 0, sizeof(struct texi)); |
memset(&texi, 0, sizeof(struct texi)); |
|
texi.ign = 1; |
Idir = NULL; |
Idir = NULL; |
|
|
while (-1 != (c = getopt(argc, argv, "I:"))) |
while (-1 != (c = getopt(argc, argv, "I:"))) |
Line 1659 main(int argc, char *argv[]) |
|
Line 1790 main(int argc, char *argv[]) |
|
} |
} |
|
|
argv += optind; |
argv += optind; |
if (0 == (argc -= optind)) |
argc -= optind; |
goto usage; |
|
|
|
if (NULL == (dirpath = strdup(argv[0]))) |
if (argc > 0) { |
texiabort(&texi, NULL); |
if (NULL == (dirpath = strdup(argv[0]))) |
if (NULL == (dir = dirname(dirpath))) |
texiabort(&texi, NULL); |
texiabort(&texi, NULL); |
if (NULL == (dir = dirname(dirpath))) |
|
texiabort(&texi, NULL); |
|
if (NULL != (cp = strrchr(argv[0], '/'))) |
|
texi.title = strdup(cp + 1); |
|
else |
|
texi.title = strdup(argv[0]); |
|
if (NULL == texi.title) |
|
texiabort(&texi, NULL); |
|
else if (NULL != (ccp = strchr(texi.title, '.'))) |
|
*ccp = '\0'; |
|
texi.dirs = parsedirs(&texi, dir, Idir, &texi.dirsz); |
|
free(dirpath); |
|
parsefile(&texi, argv[0], 1); |
|
} else { |
|
texi.title = strdup("Unknown Manual"); |
|
texi.dirs = parsedirs(&texi, NULL, Idir, &texi.dirsz); |
|
parsestdin(&texi); |
|
} |
|
|
if (NULL != (cp = strrchr(argv[0], '/'))) |
|
texi.title = strdup(cp + 1); |
|
else |
|
texi.title = strdup(argv[0]); |
|
|
|
if (NULL == texi.title) |
|
texiabort(&texi, NULL); |
|
else if (NULL != (ccp = strchr(texi.title, '.'))) |
|
*ccp = '\0'; |
|
|
|
texi.ign = 1; |
|
texi.dirs = parsedirs(&texi, dir, Idir, &texi.dirsz); |
|
free(dirpath); |
|
parsefile(&texi, argv[0], 1); |
|
/* We shouldn't get here. */ |
|
texiexit(&texi); |
texiexit(&texi); |
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
usage: |
usage: |
fprintf(stderr, "usage: %s [-Idirs] file\n", progname); |
fprintf(stderr, "usage: %s [-Idirs] [file]\n", progname); |
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
} |
} |