Whoops, that patch is broken.  Attached is another.

-- 
Aaron Denney
-><-
--- number.c.orig	2008-03-19 17:16:49.000000000 -0600
+++ number.c	2008-03-19 18:25:07.000000000 -0600
@@ -78,9 +78,9 @@
 
 void	convert(char *);
 int	main(int, char *[]);
-int	number(const char *, int);
-void	pfract(int);
-int	unit(int, const char *);
+int	number(const char *, int, int *);
+void	pfract(int, int);
+int	unit(int, const char *, int *);
 void	usage(void) __attribute__((__noreturn__));
 
 int lflag;
@@ -131,7 +131,7 @@
 convert(line)
 	char *line;
 {
-	int flen, len, rval;
+	int flen, len, rval, singular;
 	char *p, *fraction;
 
 	flen = 0;
@@ -174,7 +174,7 @@
 		--len;
 	}
 
-	rval = len > 0 ? unit(len, line) : 0;
+	rval = len > 0 ? unit(len, line, &singular) : 0;
 	if (fraction != NULL && flen != 0)
 		for (p = fraction; *p != '\0'; ++p)
 			if (*p != '0') {
@@ -182,10 +182,10 @@
 					(void)printf("%sand%s",
 					    lflag ? " " : "",
 					    lflag ? " " : "\n");
-				if (unit(flen, fraction)) {
+				if (unit(flen, fraction, &singular)) {
 					if (lflag)
 						(void)printf(" ");
-					pfract(flen);
+					pfract(flen, singular);
 					rval = 1;
 				}
 				break;
@@ -197,9 +197,10 @@
 }
 
 int
-unit(len, p)
+unit(len, p, singular)
 	int len;
 	const char *p;
+	int *singular;
 {
 	int off, rval;
 
@@ -208,7 +209,7 @@
 		if (len % 3) {
 			off = len % 3;
 			len -= off;
-			if (number(p, off)) {
+			if (number(p, off, singular)) {
 				rval = 1;
 				(void)printf(" %s%s",
 				    name3[len / 3], lflag ? " " : ".\n");
@@ -217,14 +218,16 @@
 		}
 		for (; len > 3; p += 3) {
 			len -= 3;
-			if (number(p, 3)) {
+			if (number(p, 3, singular)) {
 				rval = 1;
 				(void)printf(" %s%s",
 				    name3[len / 3], lflag ? " " : ".\n");
 			}
 		}
 	}
-	if (number(p, len)) {
+	if (number(p, len, singular)) {
+		if (rval)
+			*singular = 0;
 		if (!lflag)
 			(void)printf(".\n");
 		rval = 1;
@@ -233,17 +236,20 @@
 }
 
 int
-number(p, len)
+number(p, len, singular)
 	const char *p;
 	int len;
+	int *singular;
 {
 	int val, rval;
 
 	rval = 0;
+	*singular = 1;
 	switch (len) {
 	case 3:
 		if (*p != '0') {
 			rval = 1;
+			*singular = 0;
 			(void)printf("%s hundred", name1[*p - '0']);
 		}
 		++p;
@@ -262,33 +268,42 @@
 			}
 			rval = 1;
 		}
+		if (val != 1)
+			*singular = 0;
 		break;
 	case 1:
 		if (*p != '0') {
 			rval = 1;
 			(void)printf("%s", name1[*p - '0']);
 		}
+		if (*p == '1')
+			*singular = 1;
 	}
 	return (rval);
 }
 
 void
-pfract(len)
+pfract(len, singular)
 	int len;
+	int singular;
 {
 	static const char *const pref[] = { "", "ten-", "hundred-" };
 
 	switch(len) {
 	case 1:
-		(void)printf("tenths.\n");
+		(void)printf("tenth");
 		break;
 	case 2:
-		(void)printf("hundredths.\n");
+		(void)printf("hundredth");
 		break;
 	default:
-		(void)printf("%s%sths.\n", pref[len % 3], name3[len / 3]);
+		(void)printf("%s%sth", pref[len % 3], name3[len / 3]);
 		break;
 	}
+	if (!singular) {
+		printf("s");
+	}
+	printf(".\n");
 }
 
 void

Reply via email to