From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from localhost (fantadrom.bsd.lv [local]); by fantadrom.bsd.lv (OpenSMTPD) with ESMTPA id d7eef7a1; for ; Mon, 22 Dec 2014 22:28:31 -0500 (EST) Date: Mon, 22 Dec 2014 22:28:31 -0500 (EST) Message-Id: <3806633831723784142.enqueue@fantadrom.bsd.lv> X-Mailinglist: mdocml-source Reply-To: source@mdocml.bsd.lv MIME-Version: 1.0 From: schwarze@mdocml.bsd.lv To: source@mdocml.bsd.lv Subject: mdocml: In a2roffsu(), do not parse the number twice. X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 Log Message: ----------- 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. Modified Files: -------------- mdocml: out.c Revision Data ------------- Index: out.c =================================================================== RCS file: /home/cvs/mdocml/mdocml/out.c,v retrieving revision 1.54 retrieving revision 1.55 diff -Lout.c -Lout.c -u -p -r1.54 -r1.55 --- out.c +++ out.c @@ -20,8 +20,6 @@ #include #include -#include -#include #include #include #include @@ -39,53 +37,23 @@ static void tblcalc_number(struct rofftb /* - * 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) + scale = strtod(src, &endptr); + if (endptr == src || (endptr[0] != '\0' && endptr[1] != '\0')) 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))) - 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 } /* 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); } -- To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv