DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T a

⟦d67f11369⟧ TextFile

    Length: 14046 (0x36de)
    Types: TextFile
    Names: »ap_p2s.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« 
        └─⟦e5a54fb17⟧ 
            └─⟦this⟧ »pp-5.0/Lib/addr/ap_p2s.c« 

TextFile

/* ap_p2s.c: convert parts to a string */

# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/addr/RCS/ap_p2s.c,v 5.0 90/09/20 16:03:58 pp Exp Locker: pp $";
# endif

/*
 * $Header: /cs/research/pp/hubris/pp-beta/Lib/addr/RCS/ap_p2s.c,v 5.0 90/09/20 16:03:58 pp Exp Locker: pp $
 *
 * $Log:	ap_p2s.c,v $
 * Revision 5.0  90/09/20  16:03:58  pp
 * rcsforce : 5.0 public release
 * 
 */



/*
Format one address from pointers to constitutents, in a tree
	Returns:    pointer to string if successful or
	NOTOK if error

	Using ap_p2s as output for ap_t2s has the general problem
	of losing comments.   Perhaps ap_t2s should be  separate?
*/



#include "util.h"
#include "chan.h"
#include "ap.h"

static ap_compress_local();

extern int      ap_outtype;

extern void  	ad_val2str ();

/* ---------------------  Begin  Routines  -------------------------------- */

static char	*ap_p2s_aux();

char *ap_p2s(group, name, local, domain, route)
AP_ptr	group,
	name,
	local,
	domain,
	route;
{
	return ap_p2s_aux (group, name, local, domain, route, TRUE);
}

char *ap_p2s_nc(group, name, local, domain, route)
AP_ptr	group,
	name,
	local,
	domain,
	route;
{
	return ap_p2s_aux (group, name, local, domain, route, FALSE);
}


static char *ap_p2s_aux (group, name, local, domain, route, comments)
AP_ptr                  group,          /* -- start of group name -- */
			name,           /* -- start of person name -- */
			local,          /* -- start of local-part -- */
			domain,         /* -- basic domain ref -- */
			route;          /* -- start of 733 forw routing -- */
int			comments;
{

	AP_ptr          last_ptr;
	char            *route_ptr,     /* -- 822 -> 733 route ptr */
			*flip_ptr, *subdom = NULLCP,
			*dref_ptr,      /* -- ptr to output str -- */
			tmpbuf [LINESIZE],
			buf[LINESIZE];  /* -- buf for tb_getdomain -- */
	int             in_person,
			in_group,
			last,
			after_comment;
	register AP_ptr cur_ptr = NULLAP;
	register char   *s_ptr,         /* -- the str we are building -- */
			*c_ptr;


	PP_DBG (("Lib/adr/ap_p2s()"));

	PP_DBG (("Lib/addr/ap_p2s/AP_PARSE_822 %s",
				ap_outtype & AP_PARSE_822?"on":"off"));

	PP_DBG (((ap_outtype & AP_PARSE_BIG) ?
				"AP_PARSE_BIG on" : "AP_PARSE_LITTLE on"));


	in_person       = FALSE;
	in_group        = FALSE;
	s_ptr           = strdup ("");
	route_ptr       = strdup ("");
	last		= AP_NIL;
	after_comment	= FALSE;

	if (!comments)
		ap_compress_local(group,name,local,domain,route,comments);
		
	if (group != NULLAP) {

		PP_DBG (("Lib/addr/ap_p2s:  group is '%s'",
				group -> ap_obvalue));

		for (cur_ptr = group; cur_ptr != NULLAP;
		     cur_ptr = cur_ptr->ap_next) {

			if (cur_ptr == name || cur_ptr == local ||
			    cur_ptr == domain || cur_ptr == route)
				break;

			/* -- print munged addr -- */

			switch (cur_ptr -> ap_obtype) {
			default:
			case AP_NIL:
				break;

			case AP_COMMENT:
				if (comments == TRUE) {
					/* -- output value as comment -- */
					ap_val2str (tmpbuf,
						    cur_ptr -> ap_obvalue,
						    AP_COMMENT);

					c_ptr = multcat (s_ptr,
							 (s_ptr[0]?" ":""),
							 "(",
							 tmpbuf,
							 ")",
							 NULLCP);
					free (s_ptr);
					if (c_ptr == NULLCP)
						return ((char *)NOTOK);
					s_ptr = c_ptr;
					after_comment = TRUE;
				}
				continue;

			case AP_GROUP_NAME:
				in_group = TRUE;

			case AP_GROUP_START:
				ap_val2str (tmpbuf,
					cur_ptr -> ap_obvalue,
					AP_GROUP_START);
				c_ptr = multcat (s_ptr, 
						 (((s_ptr[0]&&last==AP_GROUP_START) || after_comment == TRUE)?" ":""),
						 tmpbuf, NULLCP);
				free (s_ptr);
				if (c_ptr == NULLCP)
					return ((char *)NOTOK);
				s_ptr = c_ptr;
				last = AP_GROUP_START;
				after_comment = FALSE;
				continue;
			}

			break;
		}


		if (in_group) {
			c_ptr = multcat (s_ptr, ":", NULLCP);
			free (s_ptr);
			if (c_ptr == NULLCP)
				return ((char *)NOTOK);
			s_ptr = c_ptr;
			/* need space after this yuch */
			after_comment = TRUE;
		}
	}



	if (name != NULLAP) {
		PP_DBG (("LIb/addr/ap_p2s:  name is '%s'",
				name -> ap_obvalue));

		for (cur_ptr = name; cur_ptr != NULLAP;
		     cur_ptr = cur_ptr -> ap_next) {
			
			if (cur_ptr == group || cur_ptr == local ||
			    cur_ptr == domain || cur_ptr == route)
				break;

			/* -- print munged addr -- */
			switch (cur_ptr -> ap_obtype) {
			default:
			case AP_NIL:
				break;

			case AP_COMMENT:
				if (comments == TRUE) {
					/* -- output value as comment -- */
					ap_val2str (tmpbuf,
						    cur_ptr -> ap_obvalue,
						    AP_COMMENT);

					c_ptr = multcat (s_ptr,
							 (s_ptr[0]?" " : ""),
							 "(",
							 tmpbuf,
							 ")",
							 NULLCP);
					free (s_ptr);
					if (c_ptr == NULLCP)
						return ((char *)NOTOK);
					s_ptr = c_ptr;
					after_comment = TRUE;
				}
				continue;

			case AP_PERSON_NAME:
				in_person = TRUE;

			case AP_PERSON_START:
				ap_val2str (tmpbuf,
					cur_ptr -> ap_obvalue,
					AP_PERSON_START);
				c_ptr = multcat (s_ptr, 
						 (((s_ptr[0] && last == AP_PERSON_START) || after_comment == TRUE)?" ":""),
						 tmpbuf, NULLCP);
				free (s_ptr);
				if (c_ptr == NULLCP)
					return ((char *)NOTOK);
				s_ptr = c_ptr;
				last = AP_PERSON_START;
				after_comment = FALSE;
				continue;
			}

			break;
		}
	}



	if (in_person) {
		c_ptr = multcat (s_ptr, " <", NULLCP);
		free (s_ptr);
		if (c_ptr == NULLCP)
			return ((char *)NOTOK);
		s_ptr = c_ptr;
		after_comment = FALSE;
	}



	if (route != NULLAP) {
		/* -- routing info exits -- */
		PP_DBG (("Lib/addr/ap_p2s:  route is '%s'",
				route -> ap_obvalue));

		for (last_ptr = cur_ptr = route; ;
		     cur_ptr = cur_ptr -> ap_next) {

			/* -- grot grot !!!!!!! -- */
			if (cur_ptr == NULLAP)
				goto defcase1;

			switch (cur_ptr -> ap_obtype) {
			case AP_PERSON_END:
				continue;

			defcase1:;
				/* yeuch !! */
			default:

			case AP_NIL:
				if ((ap_outtype & AP_PARSE_822) ==
				     AP_PARSE_822) {
					/* -- piece of cake -- */
					c_ptr = multcat (s_ptr, ":", NULLCP);
					free (s_ptr);
					if (c_ptr == NULLCP)
						return ((char *)NOTOK);
					s_ptr = c_ptr;
				}
				break;

			case AP_COMMENT:
				if (comments == TRUE) {
					/* -- output value as comment -- */
					ap_val2str (tmpbuf,
						    cur_ptr -> ap_obvalue,
						    AP_COMMENT);
					after_comment = TRUE;
					c_ptr = multcat (s_ptr,
							 (s_ptr[0]?" ":""),
							 "(",
							 tmpbuf,
							 ")",
							 NULLCP);
					free (s_ptr);
					if (c_ptr == NULLCP)
						return ((char *)NOTOK);
					s_ptr = c_ptr;
				}
				continue;


			case AP_DOMAIN_LITERAL:
			case AP_DOMAIN:
				ap_val2str (tmpbuf,
					cur_ptr -> ap_obvalue,
					cur_ptr -> ap_obtype);
				flip_ptr = NULLCP;
				dref_ptr = tmpbuf;

				/* -- only flip valid domains -- */
				if ((ap_outtype & AP_PARSE_BIG) ==
				     AP_PARSE_BIG &&
				     tb_getdomain (tmpbuf, NULLCP,
						   buf, CH_USA_PREF,
						   &subdom) == OK) {
					/* -- usa ordering preferred -- */
					flip_ptr = ap_dmflip (buf);
					dref_ptr = flip_ptr;
				}
				if (subdom != NULLCP) {	
					free(subdom);subdom=NULLCP;
				}
				if ((ap_outtype & AP_PARSE_822) ==
				     AP_PARSE_822) {
					/* -- piece of cake -- */
					c_ptr = multcat (
						s_ptr,
/*						(((s_ptr[0] && last == AP_DOMAIN) || after_comment == TRUE)?" ":""),*/
						((after_comment == TRUE)?" ":""),
						(cur_ptr!=last_ptr?",@":"@"),
						dref_ptr,
						NULLCP);
					free (s_ptr);
					if (c_ptr == NULLCP)
						return ((char *)NOTOK);
					last = AP_DOMAIN;
					after_comment = FALSE;
					s_ptr = c_ptr;
				}
				else {
					if (route_ptr[0] == '\0')
						c_ptr = multcat (
							"@",
							dref_ptr,
							NULLCP);
					else
						c_ptr = multcat (
							"%",
							dref_ptr,
							route_ptr,
							NULLCP);
					free (route_ptr);
					if (c_ptr == NULLCP)
						return ((char *)NOTOK);
					route_ptr = c_ptr;
				}

				if (flip_ptr != NULLCP)
					free (flip_ptr);
				continue;
			}

			break;
		}
	}


	if (local != NULLAP) {
		PP_DBG (("LIb/addr/ap_p2s:  local is '%s'",
				local -> ap_obvalue));

		for (cur_ptr = local; cur_ptr != NULLAP;
		     cur_ptr = cur_ptr -> ap_next) {

			if (cur_ptr == group || cur_ptr == name ||
			    cur_ptr == domain || cur_ptr == route)
				break;
			/* -- print munged addr -- */
			switch (cur_ptr -> ap_obtype) {
			default:
			case AP_NIL:
				break;

			case AP_COMMENT:
				if (comments == TRUE) {
					/* -- don't skip these -- */
					ap_val2str (tmpbuf,
						    cur_ptr -> ap_obvalue,
						    AP_COMMENT);

					c_ptr = multcat (s_ptr,
							 (s_ptr[0]?" ":""),
							 "(",
							 tmpbuf,
							 ")",
							 NULLCP);
					free (s_ptr);
					if (c_ptr == NULLCP)
						return ((char *)NOTOK);
					s_ptr = c_ptr;
					after_comment = TRUE;
				}
				continue;

			case AP_GENERIC_WORD:
			case AP_MAILBOX:
				/* -- yuk -- */
				ap_val2str (tmpbuf,
					cur_ptr -> ap_obvalue,
					AP_MAILBOX);
				c_ptr = multcat (s_ptr, 
						 (((s_ptr[0]&&last==AP_MAILBOX) || after_comment == TRUE)?" ":""),
						 tmpbuf, NULLCP);
				free (s_ptr);
				if (c_ptr == NULLCP)
					return ((char *)NOTOK);
				s_ptr = c_ptr;
				last = AP_MAILBOX;
				after_comment = FALSE;
				continue;
			}

			break;
		}
	}



	if (domain != NULLAP) {
		PP_DBG (("Lib/addr/ap_p2s:  domain is '%s'",
				domain -> ap_obvalue));

		for (cur_ptr = domain; cur_ptr != NULLAP;
		     cur_ptr = cur_ptr->ap_next) {
			
			if (cur_ptr == group || cur_ptr == name ||
			    cur_ptr == local || cur_ptr == route)
				break;
			switch (cur_ptr->ap_obtype) {
			    default:
			    case AP_NIL:
				break;

			    case AP_COMMENT:
				if (comments == TRUE) {
					ap_val2str(tmpbuf,
						   cur_ptr->ap_obvalue,
						   AP_COMMENT);
					c_ptr = multcat (s_ptr,
							 (s_ptr[0]?" ":""),
							 "(",
							 tmpbuf,
							 ")",
							 NULLCP);
					free (s_ptr);
					if (c_ptr == NULLCP)
						return ((char *)NOTOK);
					s_ptr = c_ptr;
					after_comment = TRUE;
				}
				continue;
				
			    case AP_DOMAIN:
				ap_val2str (tmpbuf, domain -> ap_obvalue, domain -> ap_obtype);
				flip_ptr = NULLCP;
				dref_ptr = tmpbuf;

				/* -- only flip valid domains -- */
				if ((ap_outtype & AP_PARSE_BIG) == AP_PARSE_BIG &&
				    tb_getdomain (tmpbuf, 
						  NULLCP, buf, 
						  CH_USA_PREF,
						  &subdom) == OK) {
					/* -- usa ordering preferred -- */
					flip_ptr = ap_dmflip (buf);
					dref_ptr = flip_ptr;
				}
				if (subdom != NULLCP) {	
					free(subdom);subdom=NULLCP;
				}

				if ((ap_outtype & AP_PARSE_822) == AP_PARSE_822 ||
				    route_ptr[0] == '\0')
					/* -- easy -- */
					c_ptr = multcat (s_ptr,
							 "@",
							 dref_ptr,
							 route_ptr,
							 NULLCP);
				else
					c_ptr = multcat (s_ptr,
							 "%",
							 dref_ptr,
							 route_ptr,
							 NULLCP);

				if (c_ptr == NULLCP)
					return (c_ptr);
				free (s_ptr);
				s_ptr = c_ptr;
				if (flip_ptr != NULLCP)
					free (flip_ptr);	
				after_comment = FALSE;
				continue;
			}
			break;
		}
	}


	free (route_ptr);

	if (in_person) {
		c_ptr = multcat (s_ptr, ">", NULLCP);
		free (s_ptr);
		if (c_ptr == NULLCP)
			return ((char *)NOTOK);
		s_ptr = c_ptr;
		after_comment = FALSE;
		if (cur_ptr != NULL && cur_ptr->ap_obtype == AP_PERSON_END)
			cur_ptr = cur_ptr->ap_next;
	}

	if (cur_ptr != NULL && cur_ptr->ap_obtype == AP_GROUP_END) {
		c_ptr = multcat (s_ptr, ";", NULLCP);
		free (s_ptr);
		if (c_ptr == NULLCP)
			return ((char *)NOTOK);
		s_ptr = c_ptr;
	}

	if (comments == TRUE &&
	    cur_ptr != NULL && cur_ptr->ap_obtype == AP_COMMENT) {
		while (cur_ptr != NULL 
		       && cur_ptr->ap_obtype == AP_COMMENT) {
			/* trailing comments */
			ap_val2str(tmpbuf,
				   cur_ptr->ap_obvalue,
				   AP_COMMENT);
			c_ptr = multcat (s_ptr, 
					 (s_ptr[0]?" ":""),
					 "(",
					 tmpbuf,
					 ")",
					 NULLCP);
			free (s_ptr);
			if (c_ptr == NULLCP)
				return ((char *) NOTOK);
			s_ptr = c_ptr;
			after_comment = TRUE;
			cur_ptr = cur_ptr->ap_next;
		}
	}
				
	return (s_ptr);
}


static ap_compress_local (group, name, local, domain, route, comments)
AP_ptr                  group,          /* -- start of group name -- */
			name,           /* -- start of person name -- */
			local,          /* -- start of local-part -- */
			domain,         /* -- basic domain ref -- */
			route;          /* -- start of 733 forw routing -- */
int			comments;
{
	/* compress local into one AP_ptr */
	AP_ptr	ix, trc;
	register char	*s_ptr,
			*c_ptr;
	char		tmpbuf [LINESIZE];

	if (local == NULLAP)
		return;
	s_ptr = strdup("");
	for (ix = local; ix != NULLAP; ix = ix -> ap_next) {
		if (ix == group || ix == name ||
		    ix == domain || ix == route)
			break;
		switch (ix -> ap_obtype) {
		    default:
		    case AP_NIL:
			break;

		    case AP_COMMENT:
			if (comments == TRUE) {
				ap_val2str (tmpbuf,
					    ix -> ap_obvalue,
					    AP_COMMENT);
				c_ptr = multcat (s_ptr,
						 (s_ptr[0] ? " " : ""),
						 "(",
						 tmpbuf,
						 ")",
						 NULLCP);
				free(s_ptr);
				if (c_ptr == NULLCP)
					return;
				s_ptr = c_ptr;
			}
			continue;
			
		    case AP_GENERIC_WORD:
		    case AP_MAILBOX:
			/* -- yuk -- */
			ap_val2str (tmpbuf,
				    ix -> ap_obvalue,
				    AP_MAILBOX);
			c_ptr = multcat (s_ptr, 
					 ((s_ptr[0])?" ":""),
					 tmpbuf, NULLCP);
			free (s_ptr);
			if (c_ptr == NULLCP)
				return;
			s_ptr = c_ptr;
			continue;
		}
		break;
	}

	if (ix == local -> ap_next) {
		/* no need to compress */
		free(s_ptr);
		return;
	}
	
	for (trc = local; trc -> ap_next && trc -> ap_next != ix; ) {
		switch (trc -> ap_next -> ap_obtype) {
		    case AP_GENERIC_WORD:
		    case AP_MAILBOX:
			ap_delete (trc);
			break;
		    default:
			trc = trc -> ap_next;
			break;
		}
	}

	switch (local -> ap_obtype) {
		case AP_GENERIC_WORD:
		case AP_MAILBOX:
			free(local -> ap_obvalue);
			local -> ap_obvalue = s_ptr;
			break;
		default:
			trc = ap_alloc ();
			trc -> ap_obvalue = s_ptr;
			trc -> ap_obtype = AP_MAILBOX;
			ap_insert (local, AP_PTR_MORE, trc);
			break;
	}
}