--- bsdgames-2.17.orig/number/number.c +++ bsdgames-2.17/number/number.c @@ -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 = 0; } 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