version 1.26, 2015/02/20 15:37:33 |
version 1.27, 2015/02/21 17:00:33 |
Line 44 static void doaccent(struct texi *, enum texicmd, cons |
|
Line 44 static void doaccent(struct texi *, enum texicmd, cons |
|
static void doblock(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doblock(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dobracket(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dobracket(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dobye(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dobye(struct texi *, enum texicmd, const char *, size_t, size_t *); |
|
static void dodefindex(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dodefn(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dodefn(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dodisplay(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dodisplay(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doenumerate(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doenumerate(struct texi *, enum texicmd, const char *, size_t, size_t *); |
Line 107 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 108 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ doignline, "contents", 8 }, /* TEXICMD_CONTENTS */ |
{ doignline, "contents", 8 }, /* TEXICMD_CONTENTS */ |
{ doignblock, "copying", 7 }, /* TEXICMD_COPYING */ |
{ doignblock, "copying", 7 }, /* TEXICMD_COPYING */ |
{ dosymbol, "copyright", 9 }, /* TEXICMD_COPYRIGHT */ |
{ dosymbol, "copyright", 9 }, /* TEXICMD_COPYRIGHT */ |
|
{ dodefindex, "defcodeindex", 12 }, /* TEXICMD_DEFCODEINDEX */ |
{ dodefn, "deffn", 5 }, /* TEXICMD_DEFFN */ |
{ dodefn, "deffn", 5 }, /* TEXICMD_DEFFN */ |
{ dodefn, "deffnx", 6 }, /* TEXICMD_DEFFNX */ |
{ dodefn, "deffnx", 6 }, /* TEXICMD_DEFFNX */ |
|
{ dodefindex, "defindex", 8 }, /* TEXICMD_DEFINDEX */ |
{ dodefn, "defmac", 6 }, /* TEXICMD_DEFMAC */ |
{ dodefn, "defmac", 6 }, /* TEXICMD_DEFMAC */ |
{ dodefn, "defmacx", 7 }, /* TEXICMD_DEFMACX */ |
{ dodefn, "defmacx", 7 }, /* TEXICMD_DEFMACX */ |
{ dodefn, "deftp", 5 }, /* TEXICMD_DEFTP */ |
{ dodefn, "deftp", 5 }, /* TEXICMD_DEFTP */ |
Line 173 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 176 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ doignbracket, "image", 5 }, /* TEXICMD_IMAGE */ |
{ doignbracket, "image", 5 }, /* TEXICMD_IMAGE */ |
{ doinclude, "include", 7 }, /* TEXICMD_INCLUDE */ |
{ doinclude, "include", 7 }, /* TEXICMD_INCLUDE */ |
{ dodisplay, "indentblock", 11 }, /* TEXICMD_INDENTBLOCK */ |
{ dodisplay, "indentblock", 11 }, /* TEXICMD_INDENTBLOCK */ |
|
{ doignline, "", 0 }, /* TEXICMD_INDEX */ |
{ doignline, "insertcopying", 13 }, /* TEXICMD_INSERTCOPYING */ |
{ doignline, "insertcopying", 13 }, /* TEXICMD_INSERTCOPYING */ |
{ doitem, "item", 4 }, /* TEXICMD_ITEM */ |
{ doitem, "item", 4 }, /* TEXICMD_ITEM */ |
{ doitemize, "itemize", 7 }, /* TEXICMD_ITEMIZE */ |
{ doitemize, "itemize", 7 }, /* TEXICMD_ITEMIZE */ |
Line 227 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 231 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dosubsubsection, "subsubsection", 13 }, /* TEXICMD_SUBSUBSECTION */ |
{ dosubsubsection, "subsubsection", 13 }, /* TEXICMD_SUBSUBSECTION */ |
{ doignline, "subtitle", 8 }, /* TEXICMD_SUBTITLE */ |
{ doignline, "subtitle", 8 }, /* TEXICMD_SUBTITLE */ |
{ doignline, "summarycontents", 15 }, /* TEXICMD_SUMMARYCONTENTS */ |
{ doignline, "summarycontents", 15 }, /* TEXICMD_SUMMARYCONTENTS */ |
|
{ doignline, "synindex", 8 }, /* TEXICMD_SYNINDEX */ |
{ doignline, "syncodeindex", 12 }, /* TEXICMD_SYNCODEINDEX */ |
{ doignline, "syncodeindex", 12 }, /* TEXICMD_SYNCODEINDEX */ |
{ doinline, "t", 1 }, /* TEXICMD_T */ |
{ doinline, "t", 1 }, /* TEXICMD_T */ |
{ dotab, "tab", 3 }, /* TEXICMD_TAB */ |
{ dotab, "tab", 3 }, /* TEXICMD_TAB */ |
Line 262 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 267 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
const struct texitok *const texitoks = __texitoks; |
const struct texitok *const texitoks = __texitoks; |
|
|
static void |
static void |
|
dodefindex(struct texi *p, enum texicmd cmd, |
|
const char *buf, size_t sz, size_t *pos) |
|
{ |
|
size_t start, end; |
|
char *cp; |
|
|
|
while (*pos < sz && isws(buf[*pos])) |
|
advance(p, buf, pos); |
|
|
|
start = end = *pos; |
|
while (end < sz && ! ismspace(buf[end])) |
|
end++; |
|
|
|
if (start == end) { |
|
advanceeoln(p, buf, sz, pos, 1); |
|
return; |
|
} else if (NULL == (cp = malloc(end - start + 1))) |
|
texiabort(p, NULL); |
|
|
|
memcpy(cp, &buf[start], end - start); |
|
cp[end - start] = '\0'; |
|
|
|
p->indexs = realloc(p->indexs, |
|
sizeof(char *) * (p->indexsz + 1)); |
|
|
|
if (NULL == p->indexs) |
|
texiabort(p, NULL); |
|
p->indexs[p->indexsz++] = cp; |
|
} |
|
|
|
static void |
dodefn(struct texi *p, enum texicmd cmd, |
dodefn(struct texi *p, enum texicmd cmd, |
const char *buf, size_t sz, size_t *pos) |
const char *buf, size_t sz, size_t *pos) |
{ |
{ |
Line 713 dotitle(struct texi *p, enum texicmd cmd, |
|
Line 749 dotitle(struct texi *p, enum texicmd cmd, |
|
advanceeoln(p, buf, sz, pos, 1); |
advanceeoln(p, buf, sz, pos, 1); |
free(p->subtitle); |
free(p->subtitle); |
p->subtitle = malloc(end - start + 1); |
p->subtitle = malloc(end - start + 1); |
|
if (NULL == p->subtitle) |
|
texiabort(p, NULL); |
memcpy(p->subtitle, &buf[start], end - start); |
memcpy(p->subtitle, &buf[start], end - start); |
p->subtitle[end - start] = '\0'; |
p->subtitle[end - start] = '\0'; |
} |
} |
Line 939 dovalue(struct texi *p, enum texicmd cmd, |
|
Line 977 dovalue(struct texi *p, enum texicmd cmd, |
|
advanceto(p, buf, pos, end); |
advanceto(p, buf, pos, end); |
|
|
key = malloc(end - start + 1); |
key = malloc(end - start + 1); |
if (NULL == key) { |
if (NULL == key) |
perror(NULL); |
texiabort(p, NULL); |
exit(EXIT_FAILURE); |
|
} |
|
memcpy(key, &buf[start], end - start); |
memcpy(key, &buf[start], end - start); |
key[end - start] = '\0'; |
key[end - start] = '\0'; |
|
|
Line 955 dovalue(struct texi *p, enum texicmd cmd, |
|
Line 991 dovalue(struct texi *p, enum texicmd cmd, |
|
advanceeoln(p, buf, sz, pos, 1); |
advanceeoln(p, buf, sz, pos, 1); |
|
|
val = malloc(end - start + 1); |
val = malloc(end - start + 1); |
if (NULL == val) { |
if (NULL == val) |
perror(NULL); |
texiabort(p, NULL); |
exit(EXIT_FAILURE); |
|
} |
|
memcpy(val, &buf[start], end - start); |
memcpy(val, &buf[start], end - start); |
val[end - start] = '\0'; |
val[end - start] = '\0'; |
valueadd(p, key, val); |
valueadd(p, key, val); |
Line 1368 doignline(struct texi *p, enum texicmd cmd, |
|
Line 1402 doignline(struct texi *p, enum texicmd cmd, |
|
* This does NOT sanitise the directories! |
* This does NOT sanitise the directories! |
*/ |
*/ |
static char ** |
static char ** |
parsedirs(const char *base, const char *cp, size_t *sz) |
parsedirs(struct texi *p, const char *base, const char *cp, size_t *sz) |
{ |
{ |
char *tok, *str, *tofree; |
char *tok, *str, *tofree; |
const char *cpp; |
const char *cpp; |
Line 1380 parsedirs(const char *base, const char *cp, size_t *sz |
|
Line 1414 parsedirs(const char *base, const char *cp, size_t *sz |
|
for ( ; NULL != (cpp = strchr(cpp, ':')); (*sz)++) |
for ( ; NULL != (cpp = strchr(cpp, ':')); (*sz)++) |
cpp++; |
cpp++; |
|
|
dirs = calloc(*sz, sizeof(char *)); |
if (NULL == (dirs = calloc(*sz, sizeof(char *)))) |
if (NULL == dirs) { |
texiabort(p, NULL); |
perror(NULL); |
else if (NULL == (dirs[0] = strdup(base))) |
exit(EXIT_FAILURE); |
texiabort(p, NULL); |
} else if (NULL == (dirs[0] = strdup(base))) { |
|
perror(NULL); |
|
exit(EXIT_FAILURE); |
|
} |
|
|
|
if (NULL == cp) |
if (NULL == cp) |
return(dirs); |
return(dirs); |
|
|
if (NULL == (tofree = tok = str = strdup(cp))) { |
if (NULL == (tofree = tok = str = strdup(cp))) |
perror(NULL); |
texiabort(p, NULL); |
exit(EXIT_FAILURE); |
|
} |
|
|
|
for (i = 1; NULL != (tok = strsep(&str, ":")); i++) |
for (i = 1; NULL != (tok = strsep(&str, ":")); i++) |
if (NULL == (dirs[i] = strdup(tok))) { |
if (NULL == (dirs[i] = strdup(tok))) |
perror(NULL); |
texiabort(p, NULL); |
exit(EXIT_FAILURE); |
|
} |
|
|
|
free(tofree); |
free(tofree); |
return(dirs); |
return(dirs); |
Line 1437 main(int argc, char *argv[]) |
|
Line 1463 main(int argc, char *argv[]) |
|
if (0 == (argc -= optind)) |
if (0 == (argc -= optind)) |
goto usage; |
goto usage; |
|
|
if (NULL == (path = strdup(argv[0]))) { |
if (NULL == (path = strdup(argv[0]))) |
perror(NULL); |
texiabort(&texi, NULL); |
exit(EXIT_FAILURE); |
else if (NULL == (dir = dirname(path))) |
} else if (NULL == (dir = dirname(path))) { |
texiabort(&texi, NULL); |
perror(argv[0]); |
|
free(path); |
|
exit(EXIT_FAILURE); |
|
} |
|
free(path); |
free(path); |
|
|
if (NULL != (cp = strrchr(argv[0], '/'))) |
if (NULL != (cp = strrchr(argv[0], '/'))) |
Line 1452 main(int argc, char *argv[]) |
|
Line 1475 main(int argc, char *argv[]) |
|
else |
else |
texi.title = strdup(argv[0]); |
texi.title = strdup(argv[0]); |
|
|
if (NULL == texi.title) { |
if (NULL == texi.title) |
perror(NULL); |
texiabort(&texi, NULL); |
exit(EXIT_FAILURE); |
else if (NULL != (path = strchr(texi.title, '.'))) |
} else if (NULL != (path = strchr(texi.title, '.'))) |
|
*path = '\0'; |
*path = '\0'; |
|
|
texi.ign = 1; |
texi.ign = 1; |
texi.dirs = parsedirs(dir, Idir, &texi.dirsz); |
texi.dirs = parsedirs(&texi, dir, Idir, &texi.dirsz); |
parsefile(&texi, argv[0], 1); |
parsefile(&texi, argv[0], 1); |
/* We shouldn't get here. */ |
/* We shouldn't get here. */ |
texiexit(&texi); |
texiexit(&texi); |