157 lines
2.8 KiB
Diff
157 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
|
||
|
|