|
|
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 r
Length: 5263 (0x148f)
Types: TextFile
Names: »rfc2reprecip.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z«
└─⟦e5a54fb17⟧
└─⟦this⟧ »pp-5.0/Lib/format/rfc2reprecip.c«
/* rfc2reprecip.c - Converts a RFC string into a Rrseq struct */
# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/format/RCS/rfc2reprecip.c,v 5.0 90/09/20 16:05:51 pp Exp Locker: pp $";
# endif
/*
* $Header: /cs/research/pp/hubris/pp-beta/Lib/format/RCS/rfc2reprecip.c,v 5.0 90/09/20 16:05:51 pp Exp Locker: pp $
*
* $Log: rfc2reprecip.c,v $
* Revision 5.0 90/09/20 16:05:51 pp
* rcsforce : 5.0 public release
*
*/
#include "util.h"
#include <isode/cmd_srch.h>
#include "dr.h"
extern CMD_TABLE drtbl_rep[];
extern void encodedinfo_free ();
static char *rfc2lastrace(),
*rfc2report();
#define txt2int(n) atoi(n)
/* --------------------- Begin Routines -------------------------------- */
int rfc2reprecip (rp, ap, str)
Rrinfo *rp;
ADDR *ap;
char *str;
{
char *cp = str,
*bp = str;
PP_DBG (("Lib/pp/rfc2reprecip(%s)", str));
/* -- OR address -- */
if ((cp = index (str, ';')) == NULLCP)
return NOTOK;
else {
*cp++ = '\0';
rp -> rr_recip = ap -> ad_no;
}
/* -- last-trace -- */
if (*cp == ' ')
cp++;
bp = cp;
cp = rfc2lastrace (rp, bp);
if (cp == NULLCP)
return NOTOK;
if (*++cp != ';')
return NOTOK;
else
cp++;
/* -- ext -- */
if (*cp == ' ')
cp++;
bp = cp;
if ((cp = index (bp, ' ')) == NULLCP)
return NOTOK;
else {
*cp++ = '\0';
if (lexequ (bp, "ext") != 0)
return NOTOK;
bp = cp;
if ((cp = index (bp, ' ')) == NULLCP)
return NOTOK;
else {
*cp++ = '\0';
rp->rr_recip = txt2int (bp);
}
}
/* -- flags -- */
bp = cp;
if ((cp = index (bp, ' ')) == NULLCP)
return NOTOK;
else {
*cp++ = '\0';
if (lexequ (bp, "flags") != 0)
return NOTOK;
bp = cp;
if ((cp = index (bp, ' ')) != NULLCP)
*cp++ = '\0';
}
/* -- the rest is optional -- */
if (cp == NULLCP)
return OK;
/* -- intended -- */
bp = cp;
if ((cp = index (bp, ' ')) == NULLCP)
return NOTOK;
else
*cp++ = '\0';
if (lexequ (bp, "intended") == 0) {
bp = cp;
if ((cp = index (bp, ' ')) != NULLCP)
*cp++ = '\0';
if (rp -> rr_originally_intended_recip == NULL) {
rp -> rr_originally_intended_recip =
(FullName *) smalloc (sizeof (FullName));
bzero ((char *)rp -> rr_originally_intended_recip,
sizeof (FullName));
}
rp->rr_originally_intended_recip -> fn_addr = strdup (bp);
if (cp == NULLCP)
return OK;
bp = cp;
if ((cp = index (bp, ' ')) == NULLCP)
return NOTOK;
else
*cp++ = '\0';
}
/* -- info -- */
if (lexequ (bp, "info") == 0) {
bp = cp;
rp->rr_supplementary = strdup (bp);
}
else
return NOTOK;
return OK;
}
/* --------------------- Static Routines ------------------------------- */
static char *rfc2lastrace (rp, str)
Rrinfo *rp;
char *str;
{
EncodedIT *new;
char *cp = str,
*bp = str;
PP_DBG (("Lib/rfc2lastrace (%s)", str));
/* -- drc-report -- */
cp = rfc2report (&rp -> rr_report, str);
if (cp == NULLCP)
return NULLCP;
if (*++cp != ';')
return NULLCP;
else
cp++;
/* -- date-time -- */
if (*cp == ' ')
cp++;
bp = cp;
if ((cp = index (bp, ';')) == NULLCP)
return NULLCP;
else {
*cp++ = '\0';
if (rfc2UTC (bp, &rp->rr_arrival) == NOTOK)
rp -> rr_arrival = utcnow ();
}
/* -- converted (optional) -- */
bp = cp;
if (*bp == ' ')
bp++;
if ((cp = index (bp, '(')) == NULLCP)
return --bp;
else {
*cp = '\0';
if (lexequ (bp, "converted") != 0) {
*cp = '(';
return --bp;
}
else
bp = ++cp;
}
if ((cp = index (bp, ')')) == NULLCP)
return NULLCP;
else
*cp = '\0';
/* -- create a new Encoded struct -- */
new = (EncodedIT *) smalloc (sizeof (*new));
bzero ((char*)new, sizeof (*new));
if (rfc2encinfo (new, bp) == NOTOK) {
encodedinfo_free (new);
return NULLCP;
}
else
rp->rr_converted = new;
return cp;
}
static char *rfc2report (rp, str)
Report *rp;
char *str;
{
char *cp = str,
*bp = str;
int retval;
PP_DBG (("Lib/rfc2report (%s)", str));
if ((cp = index (str, ' ')) == NULLCP)
return NULLCP;
else
*cp++ = '\0';
switch (rp->rep_type = cmd_srch (bp, drtbl_rep)) {
case DR_REP_SUCCESS:
bp = cp;
if ((cp = index (bp, ';')) == NULLCP)
return NULLCP;
else {
*cp++ = '\0';
retval = rfc2UTC (bp, &rp->rep.rep_dinfo.del_time);
if (retval == NOTOK)
return NULLCP;
if (*cp == ' ')
cp++;
bp = cp;
if ((cp = index (bp, ';')) == NULLCP)
return NULLCP;
else {
*cp = '\0';
rp->rep.rep_dinfo.del_type = txt2int (bp);
*cp = ';';
--cp;
}
}
break;
case DR_REP_FAILURE:
/* -- reason code -- */
bp = cp;
if ((cp = index (bp, '(')) == NULLCP)
return NULLCP;
else {
*cp++ = '\0';
rp->rep.rep_ndinfo.nd_rcode = atoi (bp);
}
/* -- diagnostic code -- */
bp = cp;
if ((cp = index (bp, ';')) == NULLCP)
return NULLCP;
else {
bp = ++cp;
/* -- no diagnostic given -- */
if ((cp = index (bp, '(')) == NULLCP)
return --bp;
else
*cp++ = '\0';
bp = cp;
rp->rep.rep_ndinfo.nd_dcode = atoi (bp);
if ((cp = index (bp, ';')) == NULLCP)
return NULLCP;
}
break;
default:
return NULLCP;
}
PP_DBG (("Lib/rfc2report returns ... (%s)", cp));
return cp;
}