- case ('n'):
- unit = SCALE_EN;
- break;
- default:
- return(0);
- }
-
- /* FIXME: do this in the caller. */
- if ((dst->scale = atof(buf)) < 0)
- dst->scale = 0;
- dst->unit = unit;
- return(1);
-}
-
-
-/*
- * Correctly writes the time in nroff form, which differs from standard
- * form in that a space isn't printed in lieu of the extra %e field for
- * single-digit dates.
- */
-void
-time2a(time_t t, char *dst, size_t sz)
-{
- struct tm tm;
- char buf[5];
- char *p;
- size_t nsz;
-
- assert(sz > 1);
- localtime_r(&t, &tm);
-
- p = dst;
- nsz = 0;
-
- dst[0] = '\0';
-
- if (0 == (nsz = strftime(p, sz, "%B ", &tm)))
- return;
-
- p += (int)nsz;
- sz -= nsz;
-
- if (0 == strftime(buf, sizeof(buf), "%e, ", &tm))
- return;
-
- nsz = strlcat(p, buf + (' ' == buf[0] ? 1 : 0), sz);
-
- if (nsz >= sz)
- return;
-
- p += (int)nsz;
- sz -= nsz;
-
- (void)strftime(p, sz, "%Y", &tm);
-}
-
-
-int
-a2roffdeco(enum roffdeco *d, const char **word, size_t *sz)
-{
- int i, j, lim;
- char term, c;
- const char *wp;
- enum roffdeco dd;
-
- *d = DECO_NONE;
- lim = i = 0;
- term = '\0';
- wp = *word;
-
- switch ((c = wp[i++])) {
- case ('('):
- *d = DECO_SPECIAL;
- lim = 2;
- break;
- case ('F'):
- /* FALLTHROUGH */
- case ('f'):
- *d = 'F' == c ? DECO_FFONT : DECO_FONT;
-
- switch (wp[i++]) {
- case ('('):
- lim = 2;
- break;
- case ('['):
- term = ']';
- break;
- case ('3'):
- /* FALLTHROUGH */
- case ('B'):
- *d = DECO_BOLD;
- return(i);
- case ('2'):
- /* FALLTHROUGH */
- case ('I'):
- *d = DECO_ITALIC;
- return(i);
- case ('P'):
- *d = DECO_PREVIOUS;
- return(i);
- case ('1'):
- /* FALLTHROUGH */
- case ('R'):
- *d = DECO_ROMAN;
- return(i);
- default:
- i--;
- lim = 1;
- break;
- }
- break;
- case ('k'):
- /* FALLTHROUGH */
- case ('M'):
- /* FALLTHROUGH */
- case ('m'):
- /* FALLTHROUGH */
- case ('*'):
- if ('*' == c)
- *d = DECO_RESERVED;
-
- switch (wp[i++]) {
- case ('('):
- lim = 2;
- break;
- case ('['):
- term = ']';
- break;
- default:
- i--;
- lim = 1;
- break;
- }
- break;
- case ('h'):
- /* FALLTHROUGH */
- case ('v'):
- /* FALLTHROUGH */
- case ('s'):
- j = 0;
- if ('+' == wp[i] || '-' == wp[i]) {
- i++;
- j = 1;
- }
-
- switch (wp[i++]) {
- case ('('):
- lim = 2;
- break;
- case ('['):
- term = ']';
- break;
- case ('\''):
- term = '\'';
- break;
- case ('0'):
- j = 1;
- /* FALLTHROUGH */
- default:
- i--;
- lim = 1;
- break;
- }
-
- if ('+' == wp[i] || '-' == wp[i]) {
- if (j)
- return(i);
- i++;
- }
-
- /* Handle embedded numerical subexp or escape. */
-
- if ('(' == wp[i]) {
- while (wp[i] && ')' != wp[i])
- if ('\\' == wp[i++]) {
- /* Handle embedded escape. */
- *word = &wp[i];
- i += a2roffdeco(&dd, word, sz);
- }
-
- if (')' == wp[i++])
- break;
-
- *d = DECO_NONE;
- return(i - 1);
- } else if ('\\' == wp[i]) {
- *word = &wp[++i];
- i += a2roffdeco(&dd, word, sz);
- }
-
- break;
- case ('['):
- *d = DECO_SPECIAL;
- term = ']';
- break;
- case ('c'):
- *d = DECO_NOSPACE;
- return(i);
- case ('z'):
- *d = DECO_NONE;
- if ('\\' == wp[i]) {
- *word = &wp[++i];
- return(i + a2roffdeco(&dd, word, sz));
- } else
- lim = 1;