void-packages/srcpkgs/bsd-games/patches/number.c.diff
2015-02-21 21:13:49 +01:00

156 lines
2.8 KiB
Diff

--- 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