guix/gnu/packages/patches/bsd-games-number.c-and-test...

184 lines
3.8 KiB
Diff

Arch's patch, and a fix for the "number" game's test.
--- 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
diff -Naur bsd-games-2.17/tests/number.-0.1 bsd-games-patch/tests/number.-0.1
--- bsd-games-2.17/tests/number.-0.1 1970-01-01 07:00:00.000000000 +0700
+++ bsd-games-patch/tests/number.-0.1 2020-04-17 15:14:27.831098084 +0700
@@ -1,3 +1,3 @@
minus
one.
-tenths.
+tenth.
diff -Naur bsd-games-2.17/tests/number.-0.2 bsd-games-patch/tests/number.-0.2
--- bsd-games-2.17/tests/number.-0.2 1970-01-01 07:00:00.000000000 +0700
+++ bsd-games-patch/tests/number.-0.2 2020-04-17 15:20:48.162336279 +0700
@@ -0,0 +1,3 @@
+minus
+two.
+tenths.
diff -Naur bsd-games-2.17/tests/number.test bsd-games-patch/tests/number.test
--- bsd-games-2.17/tests/number.test 1970-01-01 07:00:00.000000000 +0700
+++ bsd-games-patch/tests/number.test 2020-04-17 15:20:22.774654155 +0700
@@ -36,6 +36,8 @@
testno 1
number/number -- -0.1 >test.out 2>&1 || failtest
compare test.out tests/number.-0.1
+number/number -- -0.2 >test.out 2>&1 || failtest
+compare test.out tests/number.-0.2
rm -f test.out
testno 2