-
Notifications
You must be signed in to change notification settings - Fork 0
/
telno
200 lines (163 loc) · 5.22 KB
/
telno
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
From: genrad!decvax!ihnp4!homebru!ignatz
Subject: Telno: a telephone number permutation program
Newsgroups: mod.sources
Approved: jpn@panda.UUCP
Mod.sources: Volume 3, Issue 65
Submitted by: ihnp4!homebru!ignatz <Dave Ihnat>
This is a little bit of fluff that arose in the course of a night of
imbibing inspriational spirits; I'm sure it's been done before.
Simply enough, it takes a telephone number and provides all possible
permutations of the letters on the dial keycaps. It doesn't attempt to
be nifty and throw out combinations that aren't pronouncable; you've got
a neat array processor of your own that's quite a bit faster at complex
pattern recognition than the poor program. Besides, I was too hazy to
think that hard... The person who asked if this was possible is happy;
that's as far as I'm going to take this thing.
As I say, I only apologize slightly for the code quality; I'm rather
amazed that it worked...
Dave Ihnat
ihnp4!homebru!ignatz
===================== Cut me, hurt me, but do it here ==============
/*
* telno - permute telephone number letters
*
* Author: David M. Ihnat
*
* This is a trivial program to accept a typical United States-type,
* 7-digit telephone number, and provide all possible unique permutations of
* the letters found on the standard dial positions. Although this is
* a quick-and-dirty program, I did try to design it in such a manner
* that different characters and telephone number lengths should be
* easy to do.
*
* I freely grant anyone the right to do anything they wish with this
* thing, as long as it's (as usual) not for profit. I apologize only
* casually for the code, as I was more than 3 sheets to the wind when
* I slapped it out...logic and Jack Daniel's are strange glass-fellows...
*/
#include <stdio.h>
#define VERSION "1.0" /* As if there's going to be a 2.0... */
#define TEL_LEN 7 /* Length of a telephone number in digits */
#define MAX_COMB 2188 /* Maximum number of combinations */
#define NULL_CHAR '@' /* Indicates not to do this character */
/*
* This must equal the length of the entries in telno_def[]. In this
* manner, you can add arbitrary combinations of letters, digits, etc.
* to satisfy different character sets; or, for instance, you may wish
* to allow the actual number in the string, as well. If you *do*
* change SUBSTR_LEN, don't forget to change MAX_COMB.
*/
#define SUBSTR_LEN 3
char *telno_def[10] = {
/* 0 1 2 3 4 5 6 7 8 9 */
"0@@", "1@@", "abc", "def", "ghi", "jkl", "mno", "prs", "tuv", "wxy"
};
/* The payoff; 3 possible/no, plus null string*/
char listary[MAX_COMB][TEL_LEN+1];
list_idx = 0;
extern int errno;
main(argc,argv)
int argc;
char *argv[];
{
register char *telptr;
register short index;
short tel_idx[TEL_LEN];
argc--,argv++; /* Most micros don't support argv[0] */
if(!argc)
{
fprintf(stderr,"Usage: xxx[-]yyyy\n",*argv);
exit(1);
}
telptr = *argv;
/* If there is a dash in the telephone string, cut it out. */
if(telptr[3] == '-')
{
register char *p1,*p2;
for(p1 = &telptr[3], p2 = &telptr[4];*p1 != '\0';)
*p1++ = *p2++;
}
fprintf(stderr,"Processing for %s....",telptr);
/*
* Now to break the telephone number apart into an array of
* indices
*/
for(index=0;index < TEL_LEN;index++)
tel_idx[index] = (*telptr++) - '0';
/* Now build the permuations */
proc_num(tel_idx);
/* Null-terminate the array */
listary[list_idx][0] = '\0';
/* Now sort the array */
sort_num();
/* Finally, print it out. */
fprintf(stderr,"done.\n\n");
dump_num();
}
proc_num(prim_idx)
short prim_idx[];
{
register int index;
short sec_idx[TEL_LEN];
/*
* Permute the given TEL_LEN-digit array for all possible
* combinations of related key-top digits. This could
* be done either iteratively or recursively; to keep
* stack usage down, I've selected an iterative approach.
*
* If you extend or shrink the length of a telepone number,
* change the number of for loops here.
*/
for(sec_idx[0] = 0;sec_idx[0] < SUBSTR_LEN;++sec_idx[0])
for(sec_idx[1] = 0;sec_idx[1] < SUBSTR_LEN;++sec_idx[1])
for(sec_idx[2] = 0;sec_idx[2] < SUBSTR_LEN;++sec_idx[2])
for(sec_idx[3] = 0;sec_idx[3] < SUBSTR_LEN;++sec_idx[3])
for(sec_idx[4] = 0;sec_idx[4] < SUBSTR_LEN;++sec_idx[4])
for(sec_idx[5] = 0;sec_idx[5] < SUBSTR_LEN;++sec_idx[5])
for(sec_idx[6] = 0;sec_idx[6] < SUBSTR_LEN;++sec_idx[6])
{
bld_str(prim_idx,sec_idx);
}
}
bld_str(prim_idx,sec_idx)
short prim_idx[],sec_idx[];
{
register int idx;
register char c;
for(idx=0; idx < TEL_LEN; idx++)
{
c = telno_def[prim_idx[idx]][sec_idx[idx]];
if(c == NULL_CHAR)
return;
listary[list_idx][idx] = c;
}
listary[list_idx][8] = '\0';
list_idx++;
}
sort_num()
{
int strcmp();
/*
* Cheat--use the library sort. If your library doesn't have
* one, well...have fun. It's not too hard...
*/
qsort(listary,(list_idx-1),8,strcmp);
}
dump_num()
{
/*
* Dump the permutations, 10 per line. (Just fits on 80-col
* printout)
*/
register int idx1,idx2;
for(idx1 = 0;*listary[idx1] != '\0';)
{
for(idx2=0;(*listary[idx1] != '\0') && (idx2 < 10); idx1++,idx2++)
{
fputs(listary[idx1],stdout);
fputc(' ',stdout);
}
fputc('\n',stdout);
}
fputc('\n',stdout);
}