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