version 1.53, 2015/02/28 08:41:59 |
version 1.56, 2015/03/01 13:39:51 |
|
|
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
#include <time.h> |
|
#include <unistd.h> |
#include <unistd.h> |
|
|
#include "extern.h" |
#include "extern.h" |
Line 498 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 497 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
abort(); |
abort(); |
} |
} |
|
|
texivspace(p); |
if (NULL == blk) |
if (NULL != blk) |
return; |
parseto(p, pos, blk); |
|
|
/* |
|
* 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 |
static void |
Line 955 dotitle(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 990 dotitle(struct texi *p, enum texicmd cmd, size_t *pos) |
|
start = end = *pos; |
start = end = *pos; |
while (end < BUFSZ(p) && '\n' != BUF(p)[end]) |
while (end < BUFSZ(p) && '\n' != BUF(p)[end]) |
end++; |
end++; |
|
if (end < BUFSZ(p)) |
|
end++; |
advanceeoln(p, pos, 1); |
advanceeoln(p, pos, 1); |
free(p->subtitle); |
free(p->subtitle); |
p->subtitle = malloc(end - start + 1); |
p->subtitle = malloc(end - start + 1); |
Line 1375 dovalue(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 1412 dovalue(struct texi *p, enum texicmd cmd, size_t *pos) |
|
texiputchar(p, ' '); |
texiputchar(p, ' '); |
p->seenws = 0; |
p->seenws = 0; |
if (NULL != (cp = valueblookup(p, pos))) |
if (NULL != (cp = valueblookup(p, pos))) |
texisplice(p, cp, strlen(cp), pos); |
texisplice(p, cp, strlen(cp), *pos); |
else |
else |
texiputchars(p, "{No value}"); |
texiputchars(p, "{No value}"); |
} else if (TEXICMD_IFCLEAR == cmd) { |
} else if (TEXICMD_IFCLEAR == cmd) { |
Line 1517 dosection(struct texi *p, enum texicmd cmd, size_t *po |
|
Line 1554 dosection(struct texi *p, enum texicmd cmd, size_t *po |
|
int sec; |
int sec; |
|
|
switch (cmd) { |
switch (cmd) { |
|
case (TEXICMD_TOP): |
|
sec = 0; |
|
break; |
case (TEXICMD_APPENDIX): |
case (TEXICMD_APPENDIX): |
case (TEXICMD_CHAPTER): |
case (TEXICMD_CHAPTER): |
case (TEXICMD_TOP): |
|
case (TEXICMD_UNNUMBERED): |
case (TEXICMD_UNNUMBERED): |
sec = sectioner(p, 0); |
sec = sectioner(p, 0); |
break; |
break; |
Line 1538 dosection(struct texi *p, enum texicmd cmd, size_t *po |
|
Line 1577 dosection(struct texi *p, enum texicmd cmd, size_t *po |
|
else if (p->literal) |
else if (p->literal) |
texierr(p, "\"%s\" in a literal scope!?", sects[sec]); |
texierr(p, "\"%s\" in a literal scope!?", sects[sec]); |
|
|
|
if (0 == sec && NULL != p->chapters) { |
|
teximdocclose(p, 0); |
|
teximdocopen(p, pos); |
|
} |
|
|
teximacroopen(p, sects[sec]); |
teximacroopen(p, sects[sec]); |
parseeoln(p, pos); |
parseeoln(p, pos); |
teximacroclose(p); |
teximacroclose(p); |
Line 1545 dosection(struct texi *p, enum texicmd cmd, size_t *po |
|
Line 1589 dosection(struct texi *p, enum texicmd cmd, size_t *po |
|
} |
} |
|
|
static void |
static void |
|
dotop(struct texi *p, enum texicmd cmd, size_t *pos) |
|
{ |
|
|
|
if (--p->ign) |
|
texierr(p, "@top command while ignoring"); |
|
|
|
if (NULL == p->chapters) |
|
teximdocopen(p, pos); |
|
dosection(p, cmd, pos); |
|
} |
|
|
|
static void |
dosp(struct texi *p, enum texicmd cmd, size_t *pos) |
dosp(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
|
|
Line 1557 dosp(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 1613 dosp(struct texi *p, enum texicmd cmd, size_t *pos) |
|
} |
} |
|
|
static void |
static void |
dotop(struct texi *p, enum texicmd cmd, size_t *pos) |
|
{ |
|
const char *cp; |
|
time_t t; |
|
char date[32]; |
|
|
|
if (--p->ign) |
|
texierr(p, "@top command while ignoring"); |
|
|
|
/* |
|
* Here we print our standard mdoc(7) prologue. |
|
* We use the title set with @settitle for the `Nd' description |
|
* and the source document filename (the first one as invoked on |
|
* the command line) for the title. |
|
* The date is set to the current date. |
|
*/ |
|
t = time(NULL); |
|
strftime(date, sizeof(date), "%F", localtime(&t)); |
|
|
|
teximacroopen(p, "Dd"); |
|
texiputchars(p, date); |
|
teximacroclose(p); |
|
teximacroopen(p, "Dt"); |
|
for (cp = p->title; '\0' != *cp; cp++) |
|
texiputchar(p, toupper((unsigned int)*cp)); |
|
texiputchars(p, " 7"); |
|
teximacroclose(p); |
|
teximacro(p, "Os"); |
|
teximacro(p, "Sh NAME"); |
|
teximacroopen(p, "Nm"); |
|
for (cp = p->title; '\0' != *cp; cp++) |
|
texiputchar(p, *cp); |
|
teximacroclose(p); |
|
teximacroopen(p, "Nd"); |
|
if (NULL != p->subtitle) |
|
for (cp = p->subtitle; '\0' != *cp; cp++) |
|
texiputchar(p, *cp); |
|
else |
|
texiputchars(p, "Unknown description"); |
|
teximacroclose(p); |
|
p->seenvs = 1; |
|
dosection(p, cmd, pos); |
|
} |
|
|
|
static void |
|
doitem(struct texi *p, enum texicmd cmd, size_t *pos) |
doitem(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
|
|
Line 1743 doend(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 1754 doend(struct texi *p, enum texicmd cmd, size_t *pos) |
|
while (*pos < BUFSZ(p) && '\n' != BUF(p)[*pos]) |
while (*pos < BUFSZ(p) && '\n' != BUF(p)[*pos]) |
advance(p, pos); |
advance(p, pos); |
|
|
texiwarn(p, "unexpected \"end\": %.*s", (int)(*pos - start), &BUF(p)[start]); |
texiwarn(p, "unexpected \"end\": %.*s", |
|
(int)(*pos - start), &BUF(p)[start]); |
advanceeoln(p, pos, 1); |
advanceeoln(p, pos, 1); |
} |
} |
|
|
Line 1849 main(int argc, char *argv[]) |
|
Line 1861 main(int argc, char *argv[]) |
|
|
|
memset(&texi, 0, sizeof(struct texi)); |
memset(&texi, 0, sizeof(struct texi)); |
texi.ign = 1; |
texi.ign = 1; |
|
texi.outfile = stdout; |
Idir = NULL; |
Idir = NULL; |
|
|
while (-1 != (c = getopt(argc, argv, "I:"))) |
while (-1 != (c = getopt(argc, argv, "C:I:"))) |
switch (c) { |
switch (c) { |
|
case ('C'): |
|
texi.chapters = optarg; |
|
break; |
case ('I'): |
case ('I'): |
Idir = optarg; |
Idir = optarg; |
break; |
break; |
Line 1886 main(int argc, char *argv[]) |
|
Line 1902 main(int argc, char *argv[]) |
|
} |
} |
|
|
texiexit(&texi); |
texiexit(&texi); |
return(EXIT_FAILURE); |
exit(EXIT_SUCCESS); |
usage: |
usage: |
fprintf(stderr, "usage: %s [-Idirs] [file]\n", progname); |
fprintf(stderr, "usage: %s [-Cdir] [-Idirs] [file]\n", progname); |
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
} |
} |