version 1.10, 2015/02/18 15:30:31 |
version 1.11, 2015/02/18 16:35:49 |
|
|
size_t outcol; /* column in output line */ |
size_t outcol; /* column in output line */ |
char **dirs; /* texi directories */ |
char **dirs; /* texi directories */ |
size_t dirsz; /* number of texi directories */ |
size_t dirsz; /* number of texi directories */ |
|
char *title; /* title of document */ |
|
char *subtitle; /* subtitle of document */ |
|
/* |
|
* The following control what we output to the screen. |
|
* The complexity is required to accomodate for mdoc(7). |
|
*/ |
enum texilist list; /* current list (set recursively) */ |
enum texilist list; /* current list (set recursively) */ |
int outmacro; /* if >0, output is in line macro */ |
int outmacro; /* if >0, output is in line macro */ |
int seenws; /* ws has been seen (and ignored) */ |
int seenws; /* ws has been seen (and ignored) */ |
|
int seenvs; /* newline has been Pp'd */ |
int ign; /* if >0, don't print anything */ |
int ign; /* if >0, don't print anything */ |
int literal; /* if >0, literal context */ |
int literal; /* if >0, literal context */ |
char *title; /* title of document */ |
|
char *subtitle; /* subtitle of document */ |
|
}; |
}; |
|
|
/* FIXME: FIND A BETTER WAY. */ |
|
#define ismpunct(_x) \ |
|
('.' == (_x) || \ |
|
',' == (_x) || \ |
|
';' == (_x)) |
|
/* Texi disregards spaces and tabs. */ |
/* Texi disregards spaces and tabs. */ |
#define isws(_x) \ |
#define isws(_x) \ |
(' ' == (_x) || '\t' == (_x)) |
(' ' == (_x) || '\t' == (_x)) |
Line 447 texiputchar(struct texi *p, char c) |
|
Line 447 texiputchar(struct texi *p, char c) |
|
if (p->ign) |
if (p->ign) |
return; |
return; |
putchar(c); |
putchar(c); |
|
p->seenvs = 0; |
if ('\n' == c) { |
if ('\n' == c) { |
p->outcol = 0; |
p->outcol = 0; |
p->seenws = 0; |
p->seenws = 0; |
Line 519 teximacro(struct texi *p, const char *s) |
|
Line 520 teximacro(struct texi *p, const char *s) |
|
texiputchar(p, '\n'); |
texiputchar(p, '\n'); |
} |
} |
|
|
|
static void |
|
texivspace(struct texi *p) |
|
{ |
|
|
|
if (p->seenvs) |
|
return; |
|
teximacro(p, "Pp"); |
|
p->seenvs = 1; |
|
} |
|
|
/* |
/* |
* Advance by a single byte in the input stream. |
* Advance by a single byte in the input stream. |
*/ |
*/ |
Line 535 advance(struct texi *p, const char *buf, size_t *pos) |
|
Line 546 advance(struct texi *p, const char *buf, size_t *pos) |
|
(*pos)++; |
(*pos)++; |
} |
} |
|
|
|
static void |
|
texipunctuate(struct texi *p, const char *buf, size_t sz, size_t *pos) |
|
{ |
|
size_t start, end; |
|
|
|
if (1 != p->outmacro) |
|
return; |
|
|
|
for (start = end = *pos; end < sz; end++) { |
|
switch (buf[end]) { |
|
case (','): |
|
case (')'): |
|
case ('.'): |
|
case ('"'): |
|
case (':'): |
|
case ('!'): |
|
case ('?'): |
|
continue; |
|
default: |
|
break; |
|
} |
|
break; |
|
} |
|
if (end == *pos) |
|
return; |
|
if (end + 1 == sz || ' ' == buf[end] || '\n' == buf[end]) { |
|
for ( ; start < end; start++) { |
|
texiputchar(p, ' '); |
|
texiputchar(p, buf[start]); |
|
advance(p, buf, pos); |
|
} |
|
} |
|
} |
|
|
/* |
/* |
* Advance to the next non-whitespace word in the input stream. |
* Advance to the next non-whitespace word in the input stream. |
* If we're in literal mode, then print all of the whitespace as we're |
* If we're in literal mode, then print all of the whitespace as we're |
Line 562 advancenext(struct texi *p, const char *buf, size_t sz |
|
Line 607 advancenext(struct texi *p, const char *buf, size_t sz |
|
* output a paragraph. |
* output a paragraph. |
* FIXME: this is stupid. |
* FIXME: this is stupid. |
*/ |
*/ |
if (*pos && '\n' == buf[*pos] && |
if (*pos && '\n' == buf[*pos] && '\n' == buf[*pos - 1]) |
'\n' == buf[*pos - 1]) |
texivspace(p); |
teximacro(p, "Pp"); |
|
advance(p, buf, pos); |
advance(p, buf, pos); |
} |
} |
return(*pos); |
return(*pos); |
Line 991 dodeftypevar(struct texi *p, enum texicmd cmd, |
|
Line 1035 dodeftypevar(struct texi *p, enum texicmd cmd, |
|
return; |
return; |
} |
} |
|
|
teximacro(p, "Pp"); |
texivspace(p); |
if (TEXICMD_DEFTYPEVR == cmd) { |
if (TEXICMD_DEFTYPEVR == cmd) { |
parsebracket(p, buf, sz, pos); |
parsebracket(p, buf, sz, pos); |
texiputchars(p, ":\n"); |
texiputchars(p, ":\n"); |
Line 999 dodeftypevar(struct texi *p, enum texicmd cmd, |
|
Line 1043 dodeftypevar(struct texi *p, enum texicmd cmd, |
|
teximacroopen(p, "Vt"); |
teximacroopen(p, "Vt"); |
parseeoln(p, buf, sz, pos); |
parseeoln(p, buf, sz, pos); |
teximacroclose(p); |
teximacroclose(p); |
teximacro(p, "Pp"); |
texivspace(p); |
parseto(p, buf, sz, pos, blk); |
parseto(p, buf, sz, pos, blk); |
} |
} |
|
|
Line 1028 dodeftypefun(struct texi *p, enum texicmd cmd, |
|
Line 1072 dodeftypefun(struct texi *p, enum texicmd cmd, |
|
switch (cmd) { |
switch (cmd) { |
case (TEXICMD_DEFTYPEFN): |
case (TEXICMD_DEFTYPEFN): |
case (TEXICMD_DEFTYPEFUN): |
case (TEXICMD_DEFTYPEFUN): |
teximacro(p, "Pp"); |
texivspace(p); |
break; |
break; |
default: |
default: |
break; |
break; |
Line 1047 dodeftypefun(struct texi *p, enum texicmd cmd, |
|
Line 1091 dodeftypefun(struct texi *p, enum texicmd cmd, |
|
teximacroopen(p, "Li"); |
teximacroopen(p, "Li"); |
parseeoln(p, buf, sz, pos); |
parseeoln(p, buf, sz, pos); |
teximacroclose(p); |
teximacroclose(p); |
teximacro(p, "Pp"); |
texivspace(p); |
if (NULL != blk) |
if (NULL != blk) |
parseto(p, buf, sz, pos, blk); |
parseto(p, buf, sz, pos, blk); |
} |
} |
Line 1078 doinline(struct texi *p, const char *buf, |
|
Line 1122 doinline(struct texi *p, const char *buf, |
|
teximacroopen(p, macro); |
teximacroopen(p, macro); |
p->seenws = 0; |
p->seenws = 0; |
parsebracket(p, buf, sz, pos); |
parsebracket(p, buf, sz, pos); |
if (*pos < sz - 1 && |
texipunctuate(p, buf, sz, pos); |
ismpunct(buf[*pos]) && |
|
ismspace(buf[*pos + 1])) { |
|
texiputchar(p, ' '); |
|
texiputchar(p, buf[*pos]); |
|
advance(p, buf, pos); |
|
} |
|
teximacroclose(p); |
teximacroclose(p); |
} |
} |
|
|
Line 1211 dodisplay(struct texi *p, enum texicmd cmd, |
|
Line 1249 dodisplay(struct texi *p, enum texicmd cmd, |
|
{ |
{ |
|
|
teximacro(p, "Bd -display -offset indent"); |
teximacro(p, "Bd -display -offset indent"); |
|
p->seenvs = 1; |
advanceeoln(p, buf, sz, pos, 1); |
advanceeoln(p, buf, sz, pos, 1); |
parseto(p, buf, sz, pos, "display"); |
parseto(p, buf, sz, pos, "display"); |
teximacro(p, "Ed"); |
teximacro(p, "Ed"); |
Line 1394 dolink(struct texi *p, enum texicmd cmd, |
|
Line 1433 dolink(struct texi *p, enum texicmd cmd, |
|
c = parsearg(p, buf, sz, pos, 1); |
c = parsearg(p, buf, sz, pos, 1); |
p->ign--; |
p->ign--; |
|
|
if (*pos < sz - 1 && |
texipunctuate(p, buf, sz, pos); |
ismpunct(buf[*pos]) && |
|
ismspace(buf[*pos + 1])) { |
|
texiputchar(p, ' '); |
|
texiputchar(p, buf[*pos]); |
|
advance(p, buf, pos); |
|
} |
|
|
|
teximacroclose(p); |
teximacroclose(p); |
} |
} |
|
|
Line 1423 dosubsection(struct texi *p, enum texicmd cmd, |
|
Line 1455 dosubsection(struct texi *p, enum texicmd cmd, |
|
const char *buf, size_t sz, size_t *pos) |
const char *buf, size_t sz, size_t *pos) |
{ |
{ |
|
|
teximacro(p, "Pp"); |
texivspace(p); |
teximacroopen(p, "Em"); |
teximacroopen(p, "Em"); |
parseeoln(p, buf, sz, pos); |
parseeoln(p, buf, sz, pos); |
teximacroclose(p); |
teximacroclose(p); |
teximacro(p, "Pp"); |
texivspace(p); |
} |
} |
|
|
static void |
static void |
Line 1443 dosection(struct texi *p, enum texicmd cmd, |
|
Line 1475 dosection(struct texi *p, enum texicmd cmd, |
|
teximacroopen(p, "Ss"); |
teximacroopen(p, "Ss"); |
parseeoln(p, buf, sz, pos); |
parseeoln(p, buf, sz, pos); |
teximacroclose(p); |
teximacroclose(p); |
|
p->seenvs = 1; |
} |
} |
|
|
static void |
static void |
Line 1450 dosp(struct texi *p, enum texicmd cmd, |
|
Line 1483 dosp(struct texi *p, enum texicmd cmd, |
|
const char *buf, size_t sz, size_t *pos) |
const char *buf, size_t sz, size_t *pos) |
{ |
{ |
|
|
teximacro(p, "Pp"); |
texivspace(p); |
advanceeoln(p, buf, sz, pos, 1); |
advanceeoln(p, buf, sz, pos, 1); |
} |
} |
|
|
Line 1467 dochapter(struct texi *p, enum texicmd cmd, |
|
Line 1500 dochapter(struct texi *p, enum texicmd cmd, |
|
teximacroopen(p, "Sh"); |
teximacroopen(p, "Sh"); |
parseeoln(p, buf, sz, pos); |
parseeoln(p, buf, sz, pos); |
teximacroclose(p); |
teximacroclose(p); |
|
p->seenvs = 1; |
} |
} |
|
|
static void |
static void |
Line 1481 dotop(struct texi *p, enum texicmd cmd, |
|
Line 1515 dotop(struct texi *p, enum texicmd cmd, |
|
strftime(date, sizeof(date), "%F", localtime(&t)); |
strftime(date, sizeof(date), "%F", localtime(&t)); |
|
|
p->ign--; |
p->ign--; |
advanceeoln(p, buf, sz, pos, 1); |
|
teximacroopen(p, "Dd"); |
teximacroopen(p, "Dd"); |
texiputchars(p, date); |
texiputchars(p, date); |
teximacroclose(p); |
teximacroclose(p); |
teximacroopen(p, "Dt"); |
teximacroopen(p, "Dt"); |
for (cp = p->title; '\0' != *cp; cp++) |
for (cp = p->title; '\0' != *cp; cp++) |
texiputchar(p, toupper(*cp)); |
texiputchar(p, toupper(*cp)); |
|
texiputchars(p, " 7"); |
teximacroclose(p); |
teximacroclose(p); |
teximacro(p, "Os"); |
teximacro(p, "Os"); |
teximacro(p, "Sh NAME"); |
teximacro(p, "Sh NAME"); |
Line 1498 dotop(struct texi *p, enum texicmd cmd, |
|
Line 1532 dotop(struct texi *p, enum texicmd cmd, |
|
texiputchars(p, NULL != p->subtitle ? |
texiputchars(p, NULL != p->subtitle ? |
p->subtitle : "Unknown description"); |
p->subtitle : "Unknown description"); |
teximacroclose(p); |
teximacroclose(p); |
|
p->seenvs = 1; |
|
dochapter(p, cmd, buf, sz, pos); |
} |
} |
|
|
static void |
static void |
Line 1518 doitem(struct texi *p, enum texicmd cmd, |
|
Line 1554 doitem(struct texi *p, enum texicmd cmd, |
|
teximacro(p, "It"); |
teximacro(p, "It"); |
break; |
break; |
default: |
default: |
teximacro(p, "Pp"); |
texivspace(p); |
break; |
break; |
} |
} |
|
p->seenvs = 1; |
|
|
parseeoln(p, buf, sz, pos); |
parseeoln(p, buf, sz, pos); |
|
|
Line 1538 dotable(struct texi *p, enum texicmd cmd, |
|
Line 1575 dotable(struct texi *p, enum texicmd cmd, |
|
|
|
p->list = TEXILIST_ITEM; |
p->list = TEXILIST_ITEM; |
teximacro(p, "Bl -tag -width Ds"); |
teximacro(p, "Bl -tag -width Ds"); |
|
p->seenvs = 1; |
parseto(p, buf, sz, pos, "table"); |
parseto(p, buf, sz, pos, "table"); |
teximacro(p, "El"); |
teximacro(p, "El"); |
p->list = sv; |
p->list = sv; |
Line 1551 doenumerate(struct texi *p, enum texicmd cmd, |
|
Line 1589 doenumerate(struct texi *p, enum texicmd cmd, |
|
|
|
p->list = TEXILIST_NOITEM; |
p->list = TEXILIST_NOITEM; |
teximacro(p, "Bl -enum"); |
teximacro(p, "Bl -enum"); |
|
p->seenvs = 1; |
parseto(p, buf, sz, pos, "enumerate"); |
parseto(p, buf, sz, pos, "enumerate"); |
teximacro(p, "El"); |
teximacro(p, "El"); |
p->list = sv; |
p->list = sv; |
Line 1564 doitemize(struct texi *p, enum texicmd cmd, |
|
Line 1603 doitemize(struct texi *p, enum texicmd cmd, |
|
|
|
p->list = TEXILIST_ITEM; |
p->list = TEXILIST_ITEM; |
teximacro(p, "Bl -bullet"); |
teximacro(p, "Bl -bullet"); |
|
p->seenvs = 1; |
parseto(p, buf, sz, pos, "itemize"); |
parseto(p, buf, sz, pos, "itemize"); |
teximacro(p, "El"); |
teximacro(p, "El"); |
p->list = sv; |
p->list = sv; |