Module Name:    src
Committed By:   apb
Date:           Fri Dec 28 17:07:04 UTC 2012

Modified Files:
        src/usr.bin/units: units.c

Log Message:
Allow a number and a unit to be juxtaposed without an intervening space.
Now "litres/100km" works as desired, instead of silently being
treated as "litres/100".


To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.19 src/usr.bin/units/units.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/units/units.c
diff -u src/usr.bin/units/units.c:1.18 src/usr.bin/units/units.c:1.19
--- src/usr.bin/units/units.c:1.18	Tue Mar 20 20:34:59 2012
+++ src/usr.bin/units/units.c	Fri Dec 28 17:07:03 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: units.c,v 1.18 2012/03/20 20:34:59 matt Exp $	*/
+/*	$NetBSD: units.c,v 1.19 2012/12/28 17:07:03 apb Exp $	*/
 
 /*
  * units.c   Copyright (c) 1993 by Adrian Mariano (adr...@cam.cornell.edu)
@@ -321,22 +321,30 @@ addunit(struct unittype * theunit, const
 	do {
 		item = strtok(scratch, " *\t\n/");
 		while (item) {
-			if (strchr("0123456789.", *item)) { /* item is a number */
+			if (strchr("0123456789.", *item)) {
+				/* item starts with a number */
+				char *endptr;
 				double num;
 
 				divider = strchr(item, '|');
 				if (divider) {
 					*divider = 0;
-					num = atof(item);
+					num = strtod(item, &endptr);
 					if (!num) {
 						zeroerror();
 						return 1;
 					}
+					if (endptr != divider) {
+						/* "6foo|2" is an error */
+						warnx("Junk between number "
+						      "and '|'");
+						return 1;
+					}
 					if (doingtop ^ flip)
 						theunit->factor *= num;
 					else
 						theunit->factor /= num;
-					num = atof(divider + 1);
+					num = strtod(divider + 1, &endptr);
 					if (!num) {
 						zeroerror();
 						return 1;
@@ -345,9 +353,14 @@ addunit(struct unittype * theunit, const
 						theunit->factor /= num;
 					else
 						theunit->factor *= num;
+					if (*endptr) {
+						/* "6|2foo" is like "6|2 foo" */
+						item = endptr;
+						continue;
+					}
 				}
 				else {
-					num = atof(item);
+					num = strtod(item, &endptr);
 					if (!num) {
 						zeroerror();
 						return 1;
@@ -356,7 +369,11 @@ addunit(struct unittype * theunit, const
 						theunit->factor *= num;
 					else
 						theunit->factor /= num;
-
+					if (*endptr) {
+						/* "3foo" is like "3 foo" */
+						item = endptr;
+						continue;
+					}
 				}
 			}
 			else {	/* item is not a number */

Reply via email to