version 1.39, 2015/02/23 20:54:53 |
version 1.40, 2015/02/23 22:50:11 |
Line 146 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 146 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ 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 */ |
{ 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 1597 doignline(struct texi *p, enum texicmd cmd, |
|
Line 1599 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 1607 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 1650 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 1663 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); |
} |
} |