version 1.22, 2014/04/03 16:50:32 |
version 1.29, 2014/07/11 20:45:55 |
Line 181 trylink(const char *buf, size_t *start, size_t end, si |
|
Line 181 trylink(const char *buf, size_t *start, size_t end, si |
|
{ |
{ |
size_t linkstart, realend, linkend, |
size_t linkstart, realend, linkend, |
i, j, textsz, stack; |
i, j, textsz, stack; |
const char *text; |
|
|
|
/* |
/* |
* Scan to the start of the terminus. |
* Scan to the start of the terminus. |
* This function is more or less replicated in the formatcode() |
* This function is more or less replicated in the formatcode() |
* for null or index formatting codes. |
* for null or index formatting codes. |
|
* However, we're slightly different because we might have |
|
* nested escapes we need to ignore. |
*/ |
*/ |
stack = 0; |
stack = 0; |
for (linkstart = realend = *start; realend < end; realend++) { |
for (linkstart = realend = *start; realend < end; realend++) { |
|
if ('<' == buf[realend]) |
|
stack++; |
if ('>' != buf[realend]) |
if ('>' != buf[realend]) |
continue; |
continue; |
else if (dsz == 1) |
else if (stack-- > 0) |
|
continue; |
|
if (dsz == 1) |
break; |
break; |
assert(realend > 0); |
assert(realend > 0); |
if (' ' != buf[realend - 1]) |
if (' ' != buf[realend - 1]) |
Line 212 trylink(const char *buf, size_t *start, size_t end, si |
|
Line 217 trylink(const char *buf, size_t *start, size_t end, si |
|
linkend = dsz > 1 ? realend - 1 : realend; |
linkend = dsz > 1 ? realend - 1 : realend; |
|
|
/* Re-scan to see if we have a title or section. */ |
/* Re-scan to see if we have a title or section. */ |
text = &buf[*start]; |
|
for (textsz = *start; textsz < linkend; textsz++) |
for (textsz = *start; textsz < linkend; textsz++) |
if ('|' == buf[textsz] || '/' == buf[textsz]) |
if ('|' == buf[textsz] || '/' == buf[textsz]) |
break; |
break; |
Line 454 formatcode(struct state *st, const char *buf, size_t * |
|
Line 458 formatcode(struct state *st, const char *buf, size_t * |
|
(*start) += dsz; |
(*start) += dsz; |
break; |
break; |
} |
} |
|
if (*start < end) { |
|
assert('>' == buf[*start]); |
|
(*start)++; |
|
} |
|
if (isspace(last)) |
|
while (*start < end && isspace((int)buf[*start])) |
|
(*start)++; |
return(0); |
return(0); |
} |
} |
|
|
Line 498 formatcode(struct state *st, const char *buf, size_t * |
|
Line 509 formatcode(struct state *st, const char *buf, size_t * |
|
printf("Ar "); |
printf("Ar "); |
break; |
break; |
} |
} |
printf("Sy "); |
if (0 == strncmp(buf + *start, "NULL", 4) && |
|
('=' == buf[*start + 4] || |
|
'>' == buf[*start + 4])) |
|
printf("Dv "); |
|
else |
|
printf("Sy "); |
break; |
break; |
case (FMT_CODE): |
case (FMT_CODE): |
printf("Qo Li "); |
printf("Qo Li "); |
|
|
dofile(const struct args *args, const char *fname, |
dofile(const struct args *args, const char *fname, |
const struct tm *tm, const char *buf, size_t sz) |
const struct tm *tm, const char *buf, size_t sz) |
{ |
{ |
size_t sup, end, i, cur = 0; |
|
struct state st; |
|
const char *section, *date; |
|
char datebuf[64]; |
char datebuf[64]; |
|
struct state st; |
|
const char *fbase, *fext, *section, *date; |
char *title, *cp; |
char *title, *cp; |
|
size_t sup, end, i, cur = 0; |
|
|
if (0 == sz) |
if (0 == sz) |
return; |
return; |
|
|
/* Title is last path component of the filename. */ |
/* |
|
* Parsing the filename is almost always required, |
|
* except when both the title and the section |
|
* are provided on the command line. |
|
*/ |
|
|
if (NULL != args->title) |
if (NULL == args->title || NULL == args->section) { |
title = strdup(args->title); |
fbase = strrchr(fname, '/'); |
else if (NULL != (cp = strrchr(fname, '/'))) |
if (NULL == fbase) |
title = strdup(cp + 1); |
fbase = fname; |
else |
else |
title = strdup(fname); |
fbase++; |
|
fext = strrchr(fbase, '.'); |
|
} else |
|
fext = NULL; |
|
|
|
/* |
|
* The title will be converted to uppercase, |
|
* so it needs to be copied. |
|
*/ |
|
|
|
title = (NULL != args->title) ? strdup(args->title) : |
|
(NULL != fext) ? strndup(fbase, fext - fbase) : |
|
strdup(fbase); |
|
|
if (NULL == title) { |
if (NULL == title) { |
perror(NULL); |
perror(NULL); |
exit(EXIT_FAILURE); |
exit(EXIT_FAILURE); |
Line 1187 dofile(const struct args *args, const char *fname, |
|
Line 1219 dofile(const struct args *args, const char *fname, |
|
|
|
/* Section is 1 unless suffix is "pm". */ |
/* Section is 1 unless suffix is "pm". */ |
|
|
if (NULL == (section = args->section)) { |
section = (NULL != args->section) ? args->section : |
section = "1"; |
(NULL == fext || strcmp(fext + 1, "pm")) ? "1" : |
if (NULL != (cp = strrchr(title, '.'))) { |
PERL_SECTION; |
*cp++ = '\0'; |
|
if (0 == strcmp(cp, "pm")) |
|
section = PERL_SECTION; |
|
} |
|
} |
|
|
|
/* Date. Or the given "tm" if not supplied. */ |
/* Date. Or the given "tm" if not supplied. */ |
|
|
Line 1257 readfile(const struct args *args, const char *fname) |
|
Line 1284 readfile(const struct args *args, const char *fname) |
|
time_t ttm; |
time_t ttm; |
struct stat st; |
struct stat st; |
|
|
assert(NULL != fname); |
|
|
|
fd = 0 != strcmp("-", fname) ? |
fd = 0 != strcmp("-", fname) ? |
open(fname, O_RDONLY, 0) : STDIN_FILENO; |
open(fname, O_RDONLY, 0) : STDIN_FILENO; |
|
|
Line 1364 main(int argc, char *argv[]) |
|
Line 1389 main(int argc, char *argv[]) |
|
|
|
/* Accept only a single input file. */ |
/* Accept only a single input file. */ |
|
|
if (argc > 2) |
if (argc > 1) |
return(EXIT_FAILURE); |
goto usage; |
else if (1 == argc) |
else if (1 == argc) |
fname = *argv; |
fname = *argv; |
|
|
Line 1374 main(int argc, char *argv[]) |
|
Line 1399 main(int argc, char *argv[]) |
|
|
|
usage: |
usage: |
fprintf(stderr, "usage: %s [-d date] " |
fprintf(stderr, "usage: %s [-d date] " |
"[-n title] [-s section]\n", name); |
"[-n title] [-s section] [file]\n", name); |
|
|
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
} |
} |