|
|
researchv10 Norman
#include "string.h"
#include "addrformat.h"
#include <stdio.h>
/*
* Convert from `bang' to `%@' format or `source routing' format
* or `mixed rfc976' format.
* Let a!b!c!d be addr with host prepended if not gatewaying:
*
* a!b!c!d -> d%c%[email protected] (format==PERCENT)
* -> @a.domain,@b:d@c (format==SOURCEROUTE)
* -> [email protected] (format==RFC976)
*
* where the .domain is added only if domain!=0 and 'a' has no '.'s
*
* a!b!uucp!c!d -> c!d%[email protected] or @a.domain:c!d@b
*
* Or, if addr has one component only:
*
* a -> [email protected] if host!=0
*/
extern char *
convertaddr(addr, domain, format)
char *addr;
char *domain;
{
static string *buf;
register int i=0;
register char *sp;
int j, d;
char *field[128];
/* parse the '!' format address */
buf = s_reset(buf);
field[i] = addr;
sp = addr;
while (*sp) {
if (*sp == '!') {
*sp = '\0';
if (strcmp(field[i], "uucp") == 0) {
/* the token 'uucp' stops the parsing */
field[i] = ++sp;
break;
}
field[++i] = ++sp;
if(format==RFC976)
break;
} else
++sp;
}
if (buf==NULL)
buf= s_new();
s_restart(buf);
if (i==0) {
s_append(buf, field[0]);
} else {
if (format!=SOURCEROUTE) {
s_append(buf, field[i--]);
while (i>=1) {
s_append(buf, "%");
s_append(buf, field[i--]);
}
addhostdom(buf, field[0], domain);
} else {
/*
* count leading domain fields (non-domains don't count)
*/
d = 0;
if(domain || strchr(field[0], '.'))
d++;
for( ; d<i; d++)
if(strchr(field[d], '.')==0)
break;
/*
* if there are more than 1 leading domain elements,
* put them in as source routing
*/
if(d > 1){
addhostdom(buf, field[0], domain);
for(j=1; j<d-1; j++){
s_append(buf, ",");
s_append(buf, "@");
s_append(buf, field[j]);
}
s_append(buf, ":");
}
/*
* throw in the non-domain elements separated by '!'s
*/
s_append(buf, field[d]);
for(j=d+1; j<=i; j++) {
s_append(buf, "!");
s_append(buf, field[j]);
}
if(d)
addhostdom(buf, field[d-1], domain);
}
}
return s_to_c(s_copy(s_to_c(buf)));
}
addhostdom(buf, host, dom)
string *buf;
char *host;
char *dom;
{
char *cp;
s_append(buf, "@");
s_append(buf, host);
if(dom && !strchr(host, '.')){
cp = strchr(dom, '.');
if(cp!=NULL)
s_append(buf, cp);
}
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.