version 1.12, 2014/04/01 11:58:32 |
version 1.13, 2014/04/01 13:05:50 |
Line 239 trylink(const char *buf, size_t *start, size_t end, si |
|
Line 239 trylink(const char *buf, size_t *start, size_t end, si |
|
return(1); |
return(1); |
} |
} |
|
|
|
|
/* |
/* |
|
* Doclifting: if we're a bold "-xx" and we're in the SYNOPSIS section, |
|
* then it's likely that we're a flag. |
|
* Our flag might be followed by an argument, so make sure that we're |
|
* accounting for that, too. |
|
* If we don't have a flag at all, however, then assume we're an "Ar". |
|
*/ |
|
static void |
|
dosynopsisfl(const char *buf, size_t *start, size_t end) |
|
{ |
|
size_t i; |
|
again: |
|
(*start)++; |
|
for (i = *start; i < end; i++) |
|
if (isalnum((int)buf[i])) |
|
continue; |
|
else if ('-' == buf[i]) |
|
continue; |
|
else if ('_' == buf[i]) |
|
continue; |
|
else |
|
break; |
|
|
|
assert(i < end); |
|
|
|
if ( ! (' ' == buf[i] || '>' == buf[i])) { |
|
printf("Ar "); |
|
return; |
|
} |
|
|
|
printf("Fl "); |
|
if (end - *start > 1 && |
|
isupper((int)buf[*start]) && |
|
islower((int)buf[*start + 1]) && |
|
(end - *start == 2 || |
|
' ' == buf[*start + 2])) |
|
printf("\\&"); |
|
printf("%.*s ", (int)(i - *start), &buf[*start]); |
|
*start = i; |
|
|
|
if (' ' == buf[i]) { |
|
while (i < end && ' ' == buf[i]) |
|
i++; |
|
assert(i < end); |
|
if ('-' == buf[i]) { |
|
*start = i; |
|
goto again; |
|
} |
|
printf("Ar "); |
|
*start = i; |
|
} |
|
} |
|
|
|
/* |
* We're at the character in front of a format code, which is structured |
* We're at the character in front of a format code, which is structured |
* like X<...> and can contain nested format codes. |
* like X<...> and can contain nested format codes. |
* This consumes the whole format code, and any nested format codes, til |
* This consumes the whole format code, and any nested format codes, til |
Line 360 formatcode(struct state *st, const char *buf, |
|
Line 414 formatcode(struct state *st, const char *buf, |
|
printf("Em "); |
printf("Em "); |
break; |
break; |
case (FMT_BOLD): |
case (FMT_BOLD): |
/* |
if (SECT_SYNOPSIS == st->sect && |
* Doclifting: if we're a bold "-xx" and we're |
1 == dsz && |
* in the SYNOPSIS section, then it's likely |
'-' == buf[*start]) |
* that we're a flag. |
dosynopsisfl(buf, start, end); |
* Be really strict: only do this when the dash |
else |
* is followed by alnums til the end marker, |
printf("Sy "); |
* which mustn't be a custom. |
|
*/ |
|
if (SECT_SYNOPSIS == st->sect && |
|
end - *start > 1 && |
|
'-' == buf[*start] && |
|
(isalnum((int)buf[*start + 1]) || |
|
'?' == buf[*start + 1])) { |
|
for (i = *start + 1; i < end; i++) |
|
if ( ! isalnum((int)buf[i])) |
|
break; |
|
if (i < end && '>' == buf[i]) { |
|
(*start)++; |
|
printf("Fl "); |
|
break; |
|
} |
|
} |
|
printf("Sy "); |
|
break; |
break; |
case (FMT_CODE): |
case (FMT_CODE): |
printf("Qo Li "); |
printf("Qo Li "); |
Line 755 verbatim(struct state *st, const char *buf, size_t sta |
|
Line 792 verbatim(struct state *st, const char *buf, size_t sta |
|
} |
} |
|
|
/* |
/* |
|
* See dosynopsisop(). |
|
*/ |
|
static int |
|
hasmatch(const char *buf, size_t start, size_t end) |
|
{ |
|
size_t stack; |
|
|
|
for (stack = 0; start < end; start++) |
|
if (buf[start] == '[') |
|
stack++; |
|
else if (buf[start] == ']' && 0 == stack) |
|
return(1); |
|
else if (buf[start] == ']') |
|
stack--; |
|
return(0); |
|
} |
|
|
|
/* |
|
* If we're in the SYNOPSIS section and we've encounter braces in an |
|
* ordinary paragraph, then try to see whether we're an [-option]. |
|
* Do this, if we're an opening bracket, by first seeing if we have a |
|
* matching end via hasmatch(). |
|
* If we're an ending bracket, see if we have a stack already. |
|
*/ |
|
static int |
|
dosynopsisop(const char *buf, int *last, |
|
size_t *start, size_t end, size_t *opstack) |
|
{ |
|
|
|
assert('[' == buf[*start] || ']' == buf[*start]); |
|
|
|
if ('[' == buf[*start] && hasmatch(buf, *start + 1, end)) { |
|
if ('\n' != *last) |
|
putchar('\n'); |
|
puts(".Oo"); |
|
(*opstack)++; |
|
} else if ('[' == buf[*start]) |
|
return(0); |
|
|
|
if (']' == buf[*start] && *opstack > 0) { |
|
if ('\n' != *last) |
|
putchar('\n'); |
|
puts(".Oc"); |
|
(*opstack)--; |
|
} else if (']' == buf[*start]) |
|
return(0); |
|
|
|
(*start)++; |
|
*last = '\n'; |
|
while (' ' == buf[*start]) |
|
(*start)++; |
|
return(1); |
|
} |
|
|
|
/* |
* Ordinary paragraph. |
* Ordinary paragraph. |
* Well, this is really the hardest--POD seems to assume that, for |
* Well, this is really the hardest--POD seems to assume that, for |
* example, a leading space implies a newline, and so on. |
* example, a leading space implies a newline, and so on. |
Line 765 verbatim(struct state *st, const char *buf, size_t sta |
|
Line 857 verbatim(struct state *st, const char *buf, size_t sta |
|
static void |
static void |
ordinary(struct state *st, const char *buf, size_t start, size_t end) |
ordinary(struct state *st, const char *buf, size_t start, size_t end) |
{ |
{ |
size_t i, j; |
size_t i, j, opstack; |
|
|
if ( ! st->parsing || st->paused) |
if ( ! st->parsing || st->paused) |
return; |
return; |
Line 802 ordinary(struct state *st, const char *buf, size_t sta |
|
Line 894 ordinary(struct state *st, const char *buf, size_t sta |
|
|
|
st->haspar = 0; |
st->haspar = 0; |
last = '\n'; |
last = '\n'; |
|
opstack = 0; |
|
|
while (start < end) { |
while (start < end) { |
/* |
/* |
Line 817 ordinary(struct state *st, const char *buf, size_t sta |
|
Line 910 ordinary(struct state *st, const char *buf, size_t sta |
|
printf("\\&"); |
printf("\\&"); |
else if ('\n' == last && '\'' == buf[start]) |
else if ('\n' == last && '\'' == buf[start]) |
printf("\\&"); |
printf("\\&"); |
#if notyet |
|
/* |
/* |
* If we're in the SYNOPSIS, have square |
* If we're in the SYNOPSIS, have square |
* brackets indicate that we're opening and |
* brackets indicate that we're opening and |
* closing an optional context. |
* closing an optional context. |
*/ |
*/ |
if (SECT_SYNOPSIS == st->sect) { |
if (SECT_SYNOPSIS == st->sect && |
if ('[' == buf[start] || |
('[' == buf[start] || |
']' == buf[start]) { |
']' == buf[start]) && |
if (last != '\n') |
dosynopsisop(buf, &last, |
putchar('\n'); |
&start, end, &opstack)) |
if ('[' == buf[start]) |
continue; |
printf(".Oo\n"); |
|
else |
|
printf(".Oc\n"); |
|
start++; |
|
continue; |
|
} |
|
} |
|
#endif |
|
putchar(last = buf[start++]); |
putchar(last = buf[start++]); |
if ('\\' == last) |
if ('\\' == last) |
putchar('e'); |
putchar('e'); |