|
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