aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/out.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2014-12-23 09:31:46 +0000
committerIngo Schwarze <schwarze@openbsd.org>2014-12-23 09:31:46 +0000
commitb746353a05b8aa9d139a3058dfc846eb7c978997 (patch)
tree148663f150cd664bbc197e0cecd0dbb1c442a185 /out.c
parent5d42210e3b9f8220e4026cbeb581e5953e7bd23d (diff)
downloadmandoc-b746353a05b8aa9d139a3058dfc846eb7c978997.tar.gz
mandoc-b746353a05b8aa9d139a3058dfc846eb7c978997.tar.zst
mandoc-b746353a05b8aa9d139a3058dfc846eb7c978997.zip
some scaling unit fixes:
- .sp with an invalid argument is .sp 1v, not .sp 0v - in man(1), trailing garbage doesn't make scaling units invalid
Diffstat (limited to 'out.c')
-rw-r--r--out.c67
1 files changed, 33 insertions, 34 deletions
diff --git a/out.c b/out.c
index 105ae600..f833677e 100644
--- a/out.c
+++ b/out.c
@@ -1,4 +1,4 @@
-/* $Id: out.c,v 1.55 2014/12/23 03:28:01 schwarze Exp $ */
+/* $Id: out.c,v 1.56 2014/12/23 09:31:46 schwarze Exp $ */
/*
* Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2011, 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -40,65 +40,64 @@ static void tblcalc_number(struct rofftbl *, struct roffcol *,
* Parse the *src string and store a scaling unit into *dst.
* If the string doesn't specify the unit, use the default.
* If no default is specified, fail.
- * Return 1 on success and 0 on failure.
+ * Return 2 on complete success, 1 when a conversion was done,
+ * but there was trailing garbage, and 0 on total failure.
*/
int
a2roffsu(const char *src, struct roffsu *dst, enum roffscale def)
{
char *endptr;
- double scale;
- enum roffscale unit;
- scale = strtod(src, &endptr);
- if (endptr == src || (endptr[0] != '\0' && endptr[1] != '\0'))
+ dst->unit = def == SCALE_MAX ? SCALE_BU : def;
+ dst->scale = strtod(src, &endptr);
+ if (endptr == src)
return(0);
- switch (*endptr) {
+ switch (*endptr++) {
case 'c':
- unit = SCALE_CM;
+ dst->unit = SCALE_CM;
break;
case 'i':
- unit = SCALE_IN;
+ dst->unit = SCALE_IN;
+ break;
+ case 'f':
+ dst->unit = SCALE_FS;
+ break;
+ case 'M':
+ dst->unit = SCALE_MM;
+ break;
+ case 'm':
+ dst->unit = SCALE_EM;
+ break;
+ case 'n':
+ dst->unit = SCALE_EN;
break;
case 'P':
- unit = SCALE_PC;
+ dst->unit = SCALE_PC;
break;
case 'p':
- unit = SCALE_PT;
+ dst->unit = SCALE_PT;
break;
- case 'f':
- unit = SCALE_FS;
+ case 'u':
+ dst->unit = SCALE_BU;
break;
case 'v':
- unit = SCALE_VS;
- break;
- case 'm':
- unit = SCALE_EM;
+ dst->unit = SCALE_VS;
break;
case '\0':
+ endptr--;
+ /* FALLTHROUGH */
+ default:
if (SCALE_MAX == def)
return(0);
- unit = def;
+ dst->unit = def;
break;
- case 'u':
- unit = SCALE_BU;
- break;
- case 'M':
- unit = SCALE_MM;
- break;
- case 'n':
- unit = SCALE_EN;
- break;
- default:
- return(0);
}
/* FIXME: do this in the caller. */
- if (scale < 0.0)
- scale = 0.0;
- dst->scale = scale;
- dst->unit = unit;
- return(1);
+ if (dst->scale < 0.0)
+ dst->scale = 0.0;
+ return(*endptr == '\0' ? 2 : 1);
}
/*