]> git.sur5r.net Git - openldap/blob - clients/fax500/faxtotpc.c
merged with autoconf branch
[openldap] / clients / fax500 / faxtotpc.c
1 /*
2  * Copyright (c) 1993 Regents of the University of Michigan.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms are permitted
6  * provided that this notice is preserved and that due credit is given
7  * to the University of Michigan at Ann Arbor. The name of the University
8  * may not be used to endorse or promote products derived from this
9  * software without specific prior written permission. This software
10  * is provided ``as is'' without express or implied warranty.
11  *
12  *
13  * Routines for parsing the facsimileTelephoneNumber field out of
14  * an X.500 entry and converting it to a "tpc.int" domain name.
15  *
16  * char *faxtotpc(str)
17  * char *str;
18  *
19  * faxtotpc() returns a pointer to a string allocated with malloc(3).
20  */
21
22 #include "portable.h"
23
24 #include <stdio.h>
25 #include <ctype.h>
26
27 #include <sys/types.h>
28 #include <ac/string.h>
29
30 #define TPCDOMAIN       "tpc.int"
31
32 /*
33  * Remove everything from 'str' which is not a digit
34  */
35 void strip_nonnum(str)
36 char *str;
37 {
38         char *p, *q;
39         p = q = str;
40         for (;;) {
41                 if (*p == '\0') {
42                         *q = *p;
43                         return;
44                 }
45
46                 if (isdigit((u_char) *p)) {
47                         *q = *p;
48                         p++;
49                         q++;
50                 } else {
51                         p++;
52                 }
53         }
54 }
55
56
57
58 /* 
59  * Remove anything of the form (blah) where
60  * "blah" contains a non-numeric character.
61  */
62 char *remove_parens(ibuf, obuf)
63 char *ibuf;
64 char *obuf;
65 {
66         char *p = ibuf;
67         char *q = obuf;
68
69         while (*p != '\0') {
70                 char *s;
71                 char *t;
72                 if (*p == '(') {
73                         /* look for a closing paren */
74                         if (( s = strchr(p, ')')) != NULL) {
75                                 /* Check the string between p and s */
76                                 /* for non-numeric characters       */
77                                 t = p + 1;
78                                 while (t < s) {
79                                         if (!isdigit((u_char) *t)) {
80                                                 /* garbage, delete */
81                                                 p = s + 1;
82                                                 t = p;
83                                                 break;
84                                         }
85                                         t++;
86                                 }
87                                 /* when we get here, p points to the first */
88                                 /* thing we want to keep, t to the last.   */
89                                 strncpy(q, p,  t - p);
90                                 q += t - p;
91                                 p = t;
92                         } else {
93                                 /* no closing paren, what to do?  keep it */
94                                 *q = *p;
95                                 p++;
96                                 q++;
97                         }
98                 } else {
99                         /* not a paren - copy out */
100                         *q = *p;
101                         p++;
102                         q++;
103                 }
104         }
105         *q = '\0';      /* terminate output string */
106         return(obuf);
107 }
108
109
110
111
112 /*
113  * Apply local fixups to phone numbers here.  Replace this routine
114  * with code to expand common "abbreviations" for phone numbers.  For
115  * example, on the U-M campus, it's only necessary to dial the last
116  * 5 digits of the telephone number, and hence people here tend to
117  * give only the last 5 digits of their fax numbers.
118  *
119  * Local U-M mods:
120  * If exactly 5 digits were provided, assume it's a campus
121  * phone number and prepend "1313nm" where "mn" are computed
122  * according to the following:
123  * first digit of 
124  * 5-digit "Local" 
125  * phone              mn
126  * -----              --
127  * 3                  76 e.g. "31234" -> "7631234"
128  * 4                  76
129  * 7                  74
130  * 6                  93
131  * 8                  99
132  */
133 char *munge_phone(ibuf, obuf)
134 char *ibuf;
135 char *obuf;
136 {
137 #define UMAREACODE      "1313"
138
139         char prefix[3];
140
141         if (strlen(ibuf) == 7) {
142                 /* Assume local number w/o area code */
143                 sprintf(obuf, "%s%s", UMAREACODE, ibuf);
144                 return(obuf);
145         }
146         if (strlen(ibuf) == 10) {
147                 /* Assume local number with area code */
148                 sprintf(obuf, "%s%s", "1", ibuf);
149                 return(obuf);
150         }
151         if (strlen(ibuf) != 5) {
152                 /* Not 5 digits - leave alone */
153                 strcpy(obuf, ibuf);
154                 return(obuf);
155         }
156
157         switch (ibuf[0]) {
158           case '3'      :
159           case '4'      :       strcpy(prefix, "76");
160                                 break;
161           case '7'      :       strcpy(prefix, "74");
162                                 break;
163           case '6'      :       strcpy(prefix, "93");
164                                 break;
165           case '8'      :       strcpy(prefix, "99");
166                                 break;
167           default       :       /* Unknown, leave alone */
168                                 strcpy(obuf, ibuf);
169                                 return(obuf);
170         }
171         sprintf(obuf, "%s%s%s", UMAREACODE, prefix, ibuf);
172         return(obuf);
173 }
174
175
176
177
178
179
180
181
182 /* 
183  * Convert string to "tpc.int" domain name.
184  */
185 char *faxtotpc(phone, userinfo)
186 char *phone;
187 char *userinfo;
188 {
189         char *p;
190         char *q;
191         char ibuf[255];
192         char obuf[255];
193
194         /* nuke spaces */
195         strcpy(ibuf, phone);
196         for (p = ibuf, q = obuf; *p != '\0'; p++) {
197                 if (*p != ' ') {
198                         *q = *p;
199                         q++;
200                 }
201         }
202         *q = '\0';
203         strcpy(ibuf, obuf);
204
205         remove_parens(ibuf, obuf);
206         strcpy(ibuf, obuf);
207
208         /* Look for "+" - if followed by a number,
209            assume it's an international number and leave
210            it alone.
211         */
212         if ((p = strchr(ibuf, '+')) != NULL) {
213                 if (isdigit((u_char) *(p + 1))) {
214                         /* strip any non-digits */
215                         strip_nonnum(ibuf);
216                 }
217         } else {
218                 strip_nonnum(ibuf);
219
220                 /* Apply local munges */
221                 munge_phone(ibuf, obuf);
222                 strcpy(ibuf, obuf);
223         }
224
225         /* Convert string of form abcd to remote-printer@d.c.b.a.tpc.int */
226         q = obuf;
227         for (p = ibuf + strlen(ibuf) - 1; p >= ibuf; p--) {
228                 *q++ = *p;
229                 *q++ = '.';
230         }
231         *q = '\0';
232         strcpy(ibuf, obuf);
233         strcpy(obuf, "remote-printer");
234
235         /* include userinfo if present */
236         if (userinfo != NULL && strlen(userinfo)) {
237                 strcat(obuf, ".");
238                 strcat(obuf, userinfo);
239         }
240         strcat(obuf, "@");
241         strcat(obuf, ibuf);             /* tack on reversed phone number */
242         strcat(obuf, TPCDOMAIN);        /* tack on domain name */
243         p = strdup(obuf);
244         return(p);
245                                 
246 }