xref: /original-bsd/games/number/number.c (revision f0fd5f8a)
1 
2 static char sccsid[] = "	number.c	4.1	82/10/24	";
3 
4 int	flag;
5 int max = 21;
6 char	*card[] =
7 {
8 	"hundred",
9 	"thousand",
10 	"million",
11 	"billion",
12 	"trillion",
13 	"quadrillion",
14 	"quintillion",
15 	"sextillion",
16 	"septillion",
17 	"octillion",
18 	"nonillion",
19 	"decillion",
20 	"undecillion",
21 	"duodecillion",
22 	"tredecillion",
23 	"quattuordecillion",
24 	"quindecillion",
25 	"sexdecillion",
26 	"septendecillion",
27 	"octodecillion",
28 	"novemdecillion",
29 	"vigintillion"
30 };
31 char *unit[] = {
32 	"zero",
33 	"one",
34 	"two",
35 	"three",
36 	"four",
37 	"five",
38 	"six",
39 	"seven",
40 	"eight",
41 	"nine"
42 };
43 char *teen[] = {
44 	"ten",
45 	"eleven",
46 	"twelve",
47 	"thirteen",
48 	"fourteen",
49 	"fifteen",
50 	"sixteen",
51 	"seventeen",
52 	"eighteen",
53 	"nineteen"
54 };
55 char *decade[] = {
56 	"zero",
57 	"ten",
58 	"twenty",
59 	"thirty",
60 	"forty",
61 	"fifty",
62 	"sixty",
63 	"seventy",
64 	"eighty",
65 	"ninety"
66 };
67 char	line[100];
68 main()
69 {
70 	register c, i, fraction;
71 	int r;
72 
73 
74 	fraction = 0;
75 	while(c = getchar()) {
76 		if(!digit(c))  {
77 			fraction = (c == '.');
78 			putchar(c);
79 			continue;
80 		}
81 		if(fraction) {
82 			while(digit(c)) {
83 				putchar(' ');
84 				putchar(c);
85 				if(!(c=getchar()))
86 					exit(1);
87 			}
88 			putchar(' ');
89 			goto out;
90 		}
91 
92 		putchar(' ');
93 		i = 0;
94 		line[i++] = '0';
95 		line[i++] = '0';
96 		while(c == '0')
97 			if(!(c=getchar()))
98 				exit(1);
99 		while(digit(c)) {
100 			if(i < 98)
101 				line[i++] = c;
102 			if(!(c=getchar()))
103 				exit(1);
104 		}
105 		line[i] = 0;
106 		r = i/3;
107 		if(r == 0) {
108 			print("zero");
109 			goto out;
110 		}
111 		conv(line+i-3*r, r);
112 
113 out:
114 		fraction = (c == '.');
115 		nline();
116 		printf("...\n");
117 		if(c != '\n')
118 			putchar(c);
119 	}
120 }
121 
122 conv(p, c)
123 char *p;
124 {
125 
126 	if(c > max) {
127 		conv(p, c-max);
128 		print(card[max]);
129 		nline();
130 		p += (c-max)*3;
131 		c = max;
132 	}
133 	while(c > 1) {
134 		c--;
135 		conv(p, 1);
136 		cprint(card[c]);
137 		nline();
138 		p += 3;
139 	}
140 	ones(p[0]);
141 	cprint(card[0]);
142 	tens(p);
143 	ones(p[2]);
144 }
145 
146 ones(d)
147 {
148 	if(d=='0')
149 		return;
150 	print(unit[d-'0']);
151 }
152 
153 tens(p)
154 char *p;
155 {
156 
157 	switch(p[1]) {
158 
159 	case '0':
160 		return;
161 
162 	case '1':
163 		print(teen[p[2]-'0']);
164 		p[2] = '0';
165 		return;
166 	}
167 
168 	print(decade[p[1]-'0']);
169 }
170 
171 
172 digit(c)
173 {
174 
175 	if(c < '0' || c > '9')
176 		return(0);
177 	return(1);
178 }
179 
180 nline()
181 {
182 
183 	if(flag)
184 		printf(".\n");
185 	flag = 0;
186 }
187 
188 cprint(s)
189 {
190 
191 	if(flag)
192 		print(s);
193 }
194 
195 print(s)
196 {
197 
198 	if(flag)
199 		printf(" ");
200 	printf(s);
201 	flag = 1;
202 }
203