|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T a
Length: 8764 (0x223c)
Types: TextFile
Names: »ap_norm.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z«
└─⟦e5a54fb17⟧
└─⟦this⟧ »pp-5.0/Lib/addr/ap_norm.c«
/* ap_norm.c: normali[zs]e an address */
# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/addr/RCS/ap_norm.c,v 5.0 90/09/20 16:03:54 pp Exp Locker: pp $";
# endif
/*
* $Header: /cs/research/pp/hubris/pp-beta/Lib/addr/RCS/ap_norm.c,v 5.0 90/09/20 16:03:54 pp Exp Locker: pp $
*
* $Log: ap_norm.c,v $
* Revision 5.0 90/09/20 16:03:54 pp
* rcsforce : 5.0 public release
*
*/
#include "head.h"
#include "chan.h"
#include "ap.h"
extern char *loc_dom_site;
extern int ap_lex_percent;
static void ap_ptinit ();
/* --------------------- Begin Routines -------------------------------- */
/*
Normalize a parse tree, to fill-in host references, etc.
Returns:
0 if ok
-1 if error
*/
int all_domain_norm = FALSE;
ap_norm_all_domains()
{
all_domain_norm = TRUE;
}
ap_norm_first_domain()
{
all_domain_norm = FALSE;
}
AP_ptr ap_normalize (thetree, order_pref)
AP_ptr thetree; /* the parse tree */
int order_pref;
{
struct ap_node base_node; /* first node in routing chain */
AP_ptr r822_prefptr,
person_ptr,
mbx_prefptr,
dom_prefptr,
lst_comment_prefptr,
last_ptr,
group_ptr,
ap;
int oneNorm = FALSE;
ap_ninit (&base_node);
ap_sqinsert (&base_node, AP_PTR_MORE, thetree);
ap_ptinit (&base_node, &person_ptr, &r822_prefptr, &mbx_prefptr,
&dom_prefptr, &lst_comment_prefptr, &last_ptr, &group_ptr);
/*
Remember "list: ;"...
*/
if (mbx_prefptr == NULLAP) {
PP_DBG (("Lib/addr/ap_normalize/No mailbox found!"));
return (base_node.ap_next);
}
/*
Normalize all refs in source route
*/
if (r822_prefptr != NULLAP) {
ap = r822_prefptr;
for(;;) {
switch (ap -> ap_ptrtype) {
case AP_PTR_NIL:
break;
case AP_PTR_NXT:
break;
case AP_PTR_MORE:
/* -- next is part of this address -- */
ap = ap -> ap_next;
switch (ap -> ap_obtype) {
case AP_DOMAIN:
ap_dmnormalize (ap, order_pref);
if (all_domain_norm == TRUE)
continue;
oneNorm = TRUE;
break;
case AP_DOMAIN_LITERAL:
case AP_COMMENT:
continue;
}
}
break;
}
}
if (ap_lex_percent != TRUE) {
/*
if JNT mail, % is treated as lexically equivalent
to @, and CSNET style routes ignored. Might accept
CSNET routes if someone wants this...
*/
if (dom_prefptr == NULLAP) {
/* -- no domain, so add default and leave -- */
PP_DBG (("Lib/addr/ap_normalize/no domain"));
ap_locnormalize (&base_node, &r822_prefptr,
&mbx_prefptr, &dom_prefptr);
}
}
if ((dom_prefptr != NULLAP) &&
(oneNorm == FALSE) &&
(ap_dmnormalize (dom_prefptr -> ap_next, order_pref) == OK)) {
PP_DBG (("Lib/addr/ap_normali/Local reference"));
if (ap_lex_percent != TRUE)
ap_locnormalize (&base_node, &r822_prefptr,
&mbx_prefptr, &dom_prefptr);
}
if (dom_prefptr == NULLAP && r822_prefptr == NULLAP) {
/* -- no host references anywhere -- */
if (mbx_prefptr == NULLAP ||
mbx_prefptr -> ap_next -> ap_obtype == AP_GROUP_NAME ||
mbx_prefptr -> ap_next -> ap_obtype == AP_GROUP_START)
return (base_node.ap_next);
ap_append (mbx_prefptr -> ap_next, AP_DOMAIN, loc_dom_site);
PP_DBG (("Lib/addr/ap_normalize/appending %s domain",
loc_dom_site));
ap_dmnormalize (mbx_prefptr -> ap_next -> ap_next,
order_pref);
}
return (base_node.ap_next);
}
int ap_dmnormalize (ap, order_pref)
AP_ptr ap;
int order_pref;
{
char official[LINESIZE], *subdom;
int retval;
if (ap == NULL)
return NOTOK;
retval = tb_getdomain (ap->ap_obvalue, NULLCP, official,
order_pref, &subdom);
if (subdom != NULLCP) free(subdom);
if (retval == OK) {
if (official[0]) {
free (ap -> ap_obvalue);
ap -> ap_obvalue = strdup (official);
PP_DBG (("Lib/addr/ap_dmnormalize/Official = '%s'",
official));
}
}
else {
PP_LOG (LLOG_EXCEPTIONS,
("Lib/addr/ap_dmnormalize error: No domain ref for %s",
ap -> ap_obvalue));
return (OK);
/* This is not worth choking on */
/* SEK */
}
return (retval);
}
/* --------------------- Static Routines ------------------------------- */
static void ap_ptinit (base_prefptr, person_ptr, r822_prefptr, mbx_prefptr,
dom_prefptr, lst_comment_prefptr, last_ptr, group_ptr)
AP_ptr base_prefptr,
*person_ptr,
*r822_prefptr,
*mbx_prefptr,
*dom_prefptr,
*lst_comment_prefptr,
*last_ptr,
*group_ptr;
{
AP_ptr ap;
*person_ptr = NULLAP;
*r822_prefptr = NULLAP;
*mbx_prefptr = NULLAP;
*dom_prefptr = NULLAP;
*lst_comment_prefptr = NULLAP;
*last_ptr = NULLAP;
*group_ptr = NULLAP;
/*
Need switch here to catch leading mbox or domain
*/
if (base_prefptr == NULLAP
|| base_prefptr -> ap_next == NULLAP)
return;
switch (base_prefptr -> ap_next -> ap_obtype) {
case AP_MAILBOX:
*mbx_prefptr = base_prefptr;
break;
case AP_DOMAIN_LITERAL:
case AP_DOMAIN:
*r822_prefptr = base_prefptr;
break;
}
for (ap = base_prefptr -> ap_next; ap -> ap_obtype != AP_NIL;
ap = ap -> ap_next) {
*last_ptr = ap;
PP_DBG (("Lib/addr/ap_ptinit/val '%s'", ap -> ap_obvalue));
switch (ap -> ap_obtype) {
case AP_PERSON_NAME:
PP_DBG (("Lib/addr/ap_ptinit/person_ptr"));
*person_ptr = ap;
break;
case AP_GROUP_NAME:
PP_DBG (("Lib/addr/ap_ptinit/group_ptr"));
*group_ptr = ap;
break;
}
if (ap -> ap_ptrtype == AP_PTR_NXT) break;
if (ap -> ap_ptrtype == AP_PTR_NIL) break;
if (ap -> ap_next == NULLAP) break;
switch (ap -> ap_next -> ap_obtype) {
case AP_COMMENT:
PP_DBG (("Lib/addr/ap_ptinit/got comment"));
*lst_comment_prefptr = ap;
break;
case AP_GENERIC_WORD:
PP_DBG (("Lib/addr/ap_ptinit/got word"));
if (*mbx_prefptr != NULLAP)
break;
case AP_MAILBOX:
PP_DBG (("Lib/addr/ap_ptinit/got mbox pref"));
/* -- one before the mbox -- */
*mbx_prefptr = ap;
break;
case AP_DOMAIN_LITERAL:
case AP_DOMAIN:
if(*r822_prefptr == NULLAP && *mbx_prefptr == NULLAP){
PP_DBG (("Lib/addr/ap_ptinit/got r822_prefptr"
));
*r822_prefptr = ap;
}
else if ((*dom_prefptr == NULLAP) &&
(*mbx_prefptr != NULLAP)) {
/* -- need mailbox befor domain -- */
PP_DBG (("%s%s",
"Lib/addr/ap_ptinit/",
"got dom_prefptr"));
*dom_prefptr = ap;
}
break;
}
}
if (*last_ptr == NULLAP)
PP_DBG (("Lib/addr/ap_ptinit/no last_ptr"));
else
PP_DBG (("Lib/addr/ap_ptinit/last_ptr '%s'",
(*last_ptr) -> ap_obvalue));
}
/* --------------------- Not JNTMAIL ----------------------------------- */
ap_locnormalize (obase_ptr, or822_prefptr, ombx_prefptr, odom_prefptr)
AP_ptr obase_ptr,
*or822_prefptr,
*ombx_prefptr,
*odom_prefptr;
{
/* -- tear local-part apart -- */
struct ap_node base_node;
AP_ptr cur_ptr;
AP_ptr r822_prefptr,
person_ptr,
mbx_prefptr,
dom_prefptr,
lst_comment_prefptr,
last_ptr,
group_ptr;
char *cptr;
PP_DBG (("Lib/addr/ap_locnormalize/parsing '%s'",
(*ombx_prefptr) -> ap_next -> ap_obvalue));
ap_ninit (&base_node);
ap_sqinsert (&base_node, AP_PTR_MORE,
ap_s2t ((*ombx_prefptr) -> ap_next -> ap_obvalue));
ap_ptinit (&base_node, &person_ptr, &r822_prefptr,
&mbx_prefptr, &dom_prefptr, &lst_comment_prefptr,
&last_ptr, &group_ptr);
if (dom_prefptr != NULLAP) {
/* -- actually have some stuff -- */
/* -- replace old reference -- */
free ((*ombx_prefptr) -> ap_next -> ap_obvalue);
(*ombx_prefptr) -> ap_next -> ap_obvalue =
strdup (mbx_prefptr -> ap_next -> ap_obvalue);
PP_DBG (("Lib/addr/ap_locnormalize/newlocal '%s'",
(*ombx_prefptr) -> ap_next -> ap_obvalue));
if (r822_prefptr != NULLAP || *odom_prefptr != NULLAP)
if (*or822_prefptr == NULLAP)
/* -- initialize route pointer -- */
*or822_prefptr = obase_ptr;
if (*odom_prefptr == NULLAP)
*odom_prefptr = mbx_prefptr -> ap_next;
else
/* -- get rid of old domain reference -- */
ap_move (*or822_prefptr, *odom_prefptr);
if (r822_prefptr != NULLAP) {
/* -- put new chain at end of old -- */
PP_DBG (("%s%s",
"Lib/addr/ap_locnormalize/",
"adding new routing to end info"));
for (cur_ptr = *or822_prefptr;
cur_ptr -> ap_next -> ap_obtype
== AP_DOMAIN ||
cur_ptr -> ap_next -> ap_obtype
== AP_DOMAIN_LITERAL ||
cur_ptr -> ap_next -> ap_obtype
== AP_COMMENT;
cur_ptr = cur_ptr -> ap_next);
ap_sqmove (cur_ptr, r822_prefptr, AP_DOMAIN);
}
ap_move (*odom_prefptr, dom_prefptr);
}
}