aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/out.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2014-12-23 03:28:01 +0000
committerIngo Schwarze <schwarze@openbsd.org>2014-12-23 03:28:01 +0000
commitd3e6fef4a71622fd3252adf76291635c5f503090 (patch)
tree46fb8ace485c5cc38243c19ccbd1ea143d3a21fb /out.c
parentf9f885c1e8698d5ea3f3db06579ea043741137e3 (diff)
downloadmandoc-d3e6fef4a71622fd3252adf76291635c5f503090.tar.gz
mandoc-d3e6fef4a71622fd3252adf76291635c5f503090.tar.zst
mandoc-d3e6fef4a71622fd3252adf76291635c5f503090.zip
In a2roffsu(), do not parse the number twice.
Gets rid of 25 lines of code and one static buffer. No functional change for numbers shorter than BUFSIZ characters.
Diffstat (limited to 'out.c')
-rw-r--r--out.c57
1 files changed, 13 insertions, 44 deletions
diff --git a/out.c b/out.c
index 7a61b399..105ae600 100644
--- a/out.c
+++ b/out.c
@@ -1,4 +1,4 @@
-/* $Id: out.c,v 1.54 2014/12/04 02:05:42 schwarze Exp $ */
+/* $Id: out.c,v 1.55 2014/12/23 03:28:01 schwarze Exp $ */
/*
* Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2011, 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -20,8 +20,6 @@
#include <sys/types.h>
#include <assert.h>
-#include <ctype.h>
-#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
@@ -39,53 +37,23 @@ static void tblcalc_number(struct rofftbl *, struct roffcol *,
/*
- * Convert a `scaling unit' to a consistent form, or fail. Scaling
- * units are documented in groff.7, mdoc.7, man.7.
+ * 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.
*/
int
a2roffsu(const char *src, struct roffsu *dst, enum roffscale def)
{
- char buf[BUFSIZ], hasd;
- int i;
+ char *endptr;
+ double scale;
enum roffscale unit;
- if ('\0' == *src)
- return(0);
-
- i = hasd = 0;
-
- switch (*src) {
- case '+':
- src++;
- break;
- case '-':
- buf[i++] = *src++;
- break;
- default:
- break;
- }
-
- if ('\0' == *src)
- return(0);
-
- while (i < BUFSIZ) {
- if ( ! isdigit((unsigned char)*src)) {
- if ('.' != *src)
- break;
- else if (hasd)
- break;
- else
- hasd = 1;
- }
- buf[i++] = *src++;
- }
-
- if (BUFSIZ == i || (*src && *(src + 1)))
+ scale = strtod(src, &endptr);
+ if (endptr == src || (endptr[0] != '\0' && endptr[1] != '\0'))
return(0);
- buf[i] = '\0';
-
- switch (*src) {
+ switch (*endptr) {
case 'c':
unit = SCALE_CM;
break;
@@ -126,8 +94,9 @@ a2roffsu(const char *src, struct roffsu *dst, enum roffscale def)
}
/* FIXME: do this in the caller. */
- if ((dst->scale = atof(buf)) < 0.0)
- dst->scale = 0.0;
+ if (scale < 0.0)
+ scale = 0.0;
+ dst->scale = scale;
dst->unit = unit;
return(1);
}