Patch from Aaron Denney, fixing pluralization of singular fractions. Closes: #471762

This commit is contained in:
Joey Hess
2008-03-20 21:47:23 -04:00
parent 1dd7fef7dc
commit 04f8d16357
3 changed files with 39 additions and 17 deletions

7
debian/changelog vendored
View File

@@ -1,3 +1,10 @@
bsdgames (2.17-13) UNRELEASED; urgency=low
* Patch from Aaron Denney, fixing pluralization of singular fractions.
Closes: #471762
-- Joey Hess <joeyh@debian.org> Thu, 20 Mar 2008 21:43:00 -0400
bsdgames (2.17-12) unstable; urgency=low
* Fix a bad cast in hunt that caused it to refuse to run on amd64 and likely

View File

@@ -78,9 +78,9 @@ static const char *const name1[] = {
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 @@ void
convert(line)
char *line;
{
int flen, len, rval;
int flen, len, rval, singular;
char *p, *fraction;
flen = 0;
@@ -174,7 +174,7 @@ badnum: errx(1, "illegal number: %s", line);
--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 @@ badnum: errx(1, "illegal number: %s", line);
(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 @@ badnum: errx(1, "illegal number: %s", line);
}
int
unit(len, p)
unit(len, p, singular)
int len;
const char *p;
int *singular;
{
int off, rval;
@@ -208,7 +209,7 @@ unit(len, p)
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 @@ unit(len, p)
}
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 @@ unit(len, p)
}
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 @@ number(p, len)
}
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

View File

@@ -1,3 +1,3 @@
minus
one.
tenths.
tenth.