|
|
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: 8854 (0x2296)
Types: TextFile
Names: »ad_parse.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z«
└─⟦e5a54fb17⟧
└─⟦this⟧ »pp-5.0/Lib/parse/ad_parse.c«
/* ad_parse.c: parse and address */
# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/parse/RCS/ad_parse.c,v 5.0 90/09/20 16:09:27 pp Exp Locker: pp $";
# endif
/*
* $Header: /cs/research/pp/hubris/pp-beta/Lib/parse/RCS/ad_parse.c,v 5.0 90/09/20 16:09:27 pp Exp Locker: pp $
*
* $Log: ad_parse.c,v $
* Revision 5.0 90/09/20 16:09:27 pp
* rcsforce : 5.0 public release
*
*/
#include "util.h"
#include <varargs.h>
#include "retcode.h"
#include "adr.h"
#include "ap.h"
#include "or.h"
extern char or_error[];
static int parselose_exception ();
static int rfc822thenx400(), x400thenrfc822(), ad_parse_aux();
#define MAX_LOOP 10
/* --------------------- Begin Routines -------------------------------- */
int ad_fullparse (ad, rp, order_pref)
register ADDR *ad;
RP_Buf *rp;
int order_pref;
{
return ad_parse_aux (ad, rp, order_pref, OK);
}
int ad_parse (ad, rp, order_pref)
register ADDR *ad;
RP_Buf *rp;
int order_pref;
{
return ad_parse_aux (ad, rp, order_pref, NOTOK);
}
static int ad_parse_aux (ad, rp, order_pref, full)
register ADDR *ad;
RP_Buf *rp;
int order_pref;
int full;
{
PP_DBG (("ad_parse ('%s', '%d')", ad->ad_value, ad->ad_type));
or_myinit();
switch (ad -> ad_type) {
case AD_X400_TYPE:
return x400thenrfc822(ad,rp, order_pref, full);
default:
PP_TRACE(("Unknown address type '%d' will try as rfc822",
ad->ad_type));
case AD_822_TYPE:
return rfc822thenx400(ad,rp,order_pref, full);
}
}
/* \f
*/
static int rfc822thenx400(ad, rp, order_pref, full)
register ADDR *ad;
RP_Buf *rp;
int order_pref;
int full;
{
AP_ptr group,
name,
local,
domain,
route;
int retval;
char *first_error = NULLCP, *second_error = NULLCP;
int cont = TRUE, count = 0;
OR_ptr or;
char tmp[BUFSIZ];
ADDR *newadr;
char *first822 = NULLCP;
char *first400 = NULLCP;
PP_DBG (("rfc822thenx400 ('%s', '%d')", ad->ad_value, ad->ad_type));
/* parse 822 */
if (rp_isbad (retval =
rfc822_parse (ad, order_pref, full,
&group, &name,
&local, &domain, &route)))
return parselose_exception(rp, retval, ad->ad_parse_message);
do {
/* validate 822 */
retval = rfc822_validate(group, name, local, domain, route,
ad, order_pref, full, rp);
/* convert 822 to x400 */
or_error[0] = '\0';
if (rp_isbad (rfc822_x400(ad, &or))) {
if (first400 != NULLCP) {
if (ad->ad_r400adr != NULLCP)
free(ad->ad_r400adr);
ad->ad_r400adr = first400;
}
if (first822 != NULLCP) {
if (ad->ad_r822adr != NULLCP)
free(ad->ad_r822adr);
ad->ad_r822adr = first822;
}
return parselose_exception(rp, retval, ad->ad_parse_message);
}
/* 822 is okay */
if (!rp_isbad (retval)) {
if (first822) free(first822);
if (first400) free(first400);
return RP_AOK;
}
if (first_error == NULLCP) {
first_error = ad->ad_parse_message;
ad->ad_parse_message = NULLCP;
}
or_error[0] = '\0';
/* validate x400 */
retval = x400_validate(ad, or, rp);
if (!rp_isbad(retval)) {
ad->ad_type = AD_X400_TYPE;
if (first822) free(first822);
if (first400) free(first400);
return RP_AOK;
}
if (second_error == NULLCP) {
second_error = ad->ad_parse_message;
ad->ad_parse_message = NULLCP;
}
if (first822 == NULLCP)
first822 = strdup(ad->ad_r822adr);
if (first400 == NULLCP)
first400 = strdup(ad->ad_r400adr);
newadr = adr_new(ad->ad_r400adr,
AD_X400_TYPE,
ad->ad_no);
newadr->ad_r400adr = strdup(ad->ad_r400adr);
if (rp_isbad(x400_rfc822 (newadr, or, order_pref, full,
&group, &name, &local,
&domain, &route))
|| newadr->ad_r822adr == NULLCP
|| lexequ(newadr->ad_r822adr, ad->ad_r822adr) == 0
|| lexequ(newadr->ad_r822adr, ad->ad_value) == 0)
cont = FALSE;
else {
count++;
if (ad->ad_r822adr) free(ad->ad_r822adr);
ad->ad_r822adr = strdup(newadr->ad_r822adr);
}
adr_free(newadr);
} while (count < MAX_LOOP && cont == TRUE);
if (first_error) {
if (!second_error || strcmp(first_error, second_error) == 0)
(void) sprintf (tmp, "%s", first_error);
else
(void) sprintf (tmp, "%s (%s)",
first_error, second_error);
} else if (second_error)
(void) sprintf(tmp, "%s", second_error);
else
/* oops no error */
(void) sprintf(tmp, "no error message given ???");
if (first_error) free(first_error);
if (second_error) free(second_error);
if (ad->ad_parse_message) free (ad->ad_parse_message);
ad->ad_parse_message = strdup(tmp);
/* reset back to first parse attempts */
if (first400 != NULLCP) {
if (ad->ad_r400adr != NULLCP)
free(ad->ad_r400adr);
ad->ad_r400adr = first400;
}
if (first822 != NULLCP) {
if (ad->ad_r822adr != NULLCP)
free(ad->ad_r822adr);
ad->ad_r822adr = first822;
}
return parselose_exception(rp, retval, ad->ad_parse_message);
}
/* \f
*/
static int x400thenrfc822(ad, rp, order_pref, full)
register ADDR *ad;
RP_Buf *rp;
int order_pref;
int full;
{
OR_ptr or;
int retval;
char tmp[BUFSIZ];
AP_ptr group,
name,
local,
domain,
route;
char *first_error = NULLCP, *second_error = NULLCP;
int count = 0,
cont = TRUE;
ADDR *newadr;
char *first822 = NULLCP;
char *first400 = NULLCP;
PP_DBG (("x400thenrfc822 ('%s', '%d')", ad->ad_value, ad->ad_type));
/* parse x400 */
or_error[0] = '\0';
if (rp_isbad(retval = x400_parse(ad, &or)))
return parselose_exception(rp, retval, ad->ad_parse_message);
do {
/* validate x400 */
or_error[0] = '\0';
retval = x400_validate(ad, or, rp);
/* convert x400 to rfc */
if (rp_isbad (x400_rfc822(ad, or, order_pref, full,
&group, &name, &local, &domain, &route))) {
/* reset back to first parse attempts */
if (first400 != NULLCP) {
if (ad->ad_r400adr != NULLCP)
free(ad->ad_r400adr);
ad->ad_r400adr = first400;
}
if (first822 != NULLCP) {
if (ad->ad_r822adr != NULLCP)
free(ad->ad_r822adr);
ad->ad_r822adr = first822;
}
/* can't convert */
return parselose_exception(rp, retval, ad->ad_parse_message);
}
/* x400 is okay */
if (!rp_isbad(retval)) {
if (first822) free(first822);
if (first400) free(first400);
return RP_AOK;
}
if (first_error == NULLCP) {
first_error = ad->ad_parse_message;
ad->ad_parse_message = NULLCP;
}
/* validate 822 */
retval = rfc822_validate (group, name, local, domain, route,
ad, order_pref, full, rp);
/* 822 is okay */
if (!rp_isbad(retval)) {
if (first822) free(first822);
if (first400) free(first400);
return RP_AOK;
}
if (second_error == NULLCP) {
second_error = ad->ad_parse_message;
ad->ad_parse_message = NULLCP;
}
if (first822 == NULLCP)
first822 = strdup(ad->ad_r822adr);
if (first400 == NULLCP)
first400 = strdup(ad->ad_r400adr);
newadr = adr_new(ad->ad_r822adr,
AD_822_TYPE,
ad->ad_no);
newadr->ad_r822adr = strdup(ad->ad_r822adr);
or_error[0] = '\0';
if (rp_isbad (rfc822_x400(newadr, &or))
|| newadr->ad_r400adr == NULLCP
|| lexequ(newadr->ad_r400adr, ad->ad_r400adr) == 0
|| lexequ(newadr->ad_r400adr, ad->ad_value) == 0)
cont = FALSE;
else {
count++;
if (ad->ad_r400adr != NULLCP) free(ad->ad_r400adr);
ad->ad_r400adr = strdup(newadr->ad_r400adr);
}
adr_free(newadr);
} while (count < MAX_LOOP && cont == TRUE);
if (strcmp(first_error, second_error) == 0)
(void) sprintf(tmp, "%s", first_error);
else
(void) sprintf(tmp, "%s (%s)",
first_error, second_error);
if (first_error) free(first_error);
if (second_error) free(second_error);
if (ad->ad_parse_message) free (ad->ad_parse_message);
ad->ad_parse_message = strdup(tmp);
/* reset back to first parse attempts */
if (first400 != NULLCP) {
if (ad->ad_r400adr != NULLCP)
free(ad->ad_r400adr);
ad->ad_r400adr = first400;
}
if (first822 != NULLCP) {
if (ad->ad_r822adr != NULLCP)
free(ad->ad_r822adr);
ad->ad_r822adr = first822;
}
return parselose_exception(rp, retval, ad->ad_parse_message);
}
static int parselose_exception (rp, val, str)
RP_Buf *rp;
int val;
char *str;
{
PP_LOG (LLOG_EXCEPTIONS,
("parselose (%s, '%s')", rp_valstr (val), str));
rp -> rp_val = val;
(void) strncpy (rp -> rp_line, str, sizeof (rp -> rp_line) - 1);
return val;
}
#ifdef lint
/* VARARGS3 */
int parselose (rp, val, str)
RP_Buf *rp;
int val;
char *str;
{
return parselose (rp, val, str);
}
#else
int parselose (va_alist)
va_dcl
{
va_list ap;
RP_Buf *rp;
int val;
char buf[BUFSIZ];
va_start (ap);
rp = va_arg (ap, RP_Buf *);
val = va_arg (ap, int);
_asprintf (buf, NULLCP, ap);
PP_LOG (LLOG_TRACE,
("parselose (%s, '%s')", rp_valstr (val), buf));
rp -> rp_val = val;
(void) strncpy (rp -> rp_line, buf, sizeof (rp -> rp_line) - 1);
va_end (ap);
return val;
}
#endif