diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2009-10-09 06:54:11 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2009-10-09 06:54:11 +0000 |
commit | 7ecbe69366c1257a57ee2a88b71916360b19bdc1 (patch) | |
tree | 1ec2a72bc9e9c8a6c3a17744949d2263d583f3f3 | |
parent | 3ebfba7c53e0e445e1e477d3bc4e9c99f0307dda (diff) | |
download | mandoc-7ecbe69366c1257a57ee2a88b71916360b19bdc1.tar.gz |
Scaling factor made floating point (as per groff.7) and, e.g., gnu/usr.bin/cvs/man/cvs.1.
-rw-r--r-- | html.c | 8 | ||||
-rw-r--r-- | out.c | 34 | ||||
-rw-r--r-- | out.h | 9 |
3 files changed, 41 insertions, 10 deletions
@@ -599,7 +599,7 @@ buffmt_man(struct html *h, void bufcat_su(struct html *h, const char *p, const struct roffsu *su) { - int v; + double v; char *u; v = su->scale; @@ -639,5 +639,9 @@ bufcat_su(struct html *h, const char *p, const struct roffsu *su) break; } - buffmt(h, "%s: %d%s;", p, v, u); + if (su->pt) + buffmt(h, "%s: %f%s;", p, v, u); + else + /* LINTED */ + buffmt(h, "%s: %d%s;", p, (int)v, u); } @@ -46,17 +46,39 @@ int a2roffsu(const char *src, struct roffsu *dst) { - char buf[BUFSIZ], *p; + char buf[BUFSIZ], hasd; int i; enum roffscale unit; - for (p = buf, i = 0; i < BUFSIZ && isdigit((u_char)*src); i++) - *p++ = *src++; + i = hasd = 0; + + switch (*src) { + case ('+'): + src++; + break; + case ('-'): + buf[i++] = *src++; + break; + default: + break; + } + + while (i < BUFSIZ) { + if ( ! isdigit((u_char)*src)) { + if ('.' != *src) + break; + else if (hasd) + break; + else + hasd = 1; + } + buf[i++] = *src++; + } if (BUFSIZ == i || (*src && *(src + 1))) return(0); - *p = '\0'; + buf[i] = '\0'; switch (*src) { case ('c'): @@ -95,8 +117,10 @@ a2roffsu(const char *src, struct roffsu *dst) return(0); } - if ((dst->scale = atoi(buf)) < 0) + if ((dst->scale = atof(buf)) < 0) dst->scale = 0; dst->unit = unit; + dst->pt = hasd; + return(1); } @@ -35,17 +35,20 @@ enum roffscale { struct roffsu { enum roffscale unit; - int scale; + double scale; + int pt; }; #define SCALE_INVERT(p) \ do { (p)->scale = -(p)->scale; } while (/*CONSTCOND*/0) #define SCALE_VS_INIT(p, v) \ do { (p)->unit = SCALE_VS; \ - (p)->scale = (v); } while (/*CONSTCOND*/0) + (p)->scale = (v); \ + (p)->pt = 0; } while (/*CONSTCOND*/0) #define SCALE_HS_INIT(p, v) \ do { (p)->unit = SCALE_BU; \ - (p)->scale = (v); } while (/*CONSTCOND*/0) + (p)->scale = (v); \ + (p)->pt = 0; } while (/*CONSTCOND*/0) int a2roffsu(const char *, struct roffsu *); |