|
|
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: 13446 (0x3486)
Types: TextFile
Names: »adr2txt.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z«
└─⟦e5a54fb17⟧
└─⟦this⟧ »pp-5.0/Lib/pp/adr2txt.c«
/* adr2txt.c: converts address structures to text */
# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/pp/RCS/adr2txt.c,v 5.0 90/09/20 16:10:30 pp Exp Locker: pp $";
# endif
/*
* $Header: /cs/research/pp/hubris/pp-beta/Lib/pp/RCS/adr2txt.c,v 5.0 90/09/20 16:10:30 pp Exp Locker: pp $
*
* $Log: adr2txt.c,v $
* Revision 5.0 90/09/20 16:10:30 pp
* rcsforce : 5.0 public release
*
*/
#include "util.h"
#include <isode/cmd_srch.h>
#include "adr.h"
#include "tb_com.h"
#include "tb_a.h"
#define crit2txt(n) rcmd_srch ((n), tbl_crit)
extern void argv2fp();
extern void arg2vstr();
extern void genreset();
extern void repreq2txt();
extern char *qb2hex();
extern char *time2txt();
extern CMD_TABLE
tbl_bool [],
tbl_crit [],
tbl_redir [],
atbl_reg_mail [],
atbl_pd_modes [],
atbl_rdm [],
atbl_ctrl_addrs [/* Env-ctrl-addresses */],
atbl_addr [/* address-lines */],
atbl_status [/* recipient-status */],
atbl_mtarreq [/* mta-report-request */],
atbl_usrreq [/* user-report-request */],
atbl_expconversion [/* explicit-conversion */],
atbl_types [/* address-type */],
atbl_subtypes [/* address-subtype */];
static char *A_extension(), *A_req_del(), *A_modes2txt(), *A_redir2txt();
static char *A_put(),
*A_chanlist2txt(),
*A_outchan2txt(),
*A_outhost2txt(),
*A_no2txt(),
*A_stat2txt(),
*A_adrtype2txt(),
*A_adrsubtype2txt();
static int A_adrln2txt();
char *no2txt3();
int adr2txt (fp, ap, type) /* Env-ctrl-addresses -> Txt */
FILE *fp;
ADDR *ap;
int type;
{
char *argv[200];
char sbuf[8192];
PP_DBG (("Lib/pp/adr2txt (%d)", type));
switch (type) {
case AD_ORIGINATOR:
case AD_RECIPIENT:
argv[0] = rcmd_srch (type, atbl_ctrl_addrs);
A_adrln2txt (sbuf, argv, 1, ap);
(void) argv2fp (fp, argv);
(void) fflush (fp);
return (ferror (fp) ? NOTOK : OK);
}
return (NOTOK);
}
static int A_adrln2txt (sbuf, argv, argc, adr) /* Address Line -> Txt */
char *sbuf;
char **argv;
int argc;
ADDR *adr;
{
extern char *listbpt2txt();
Redirection *rp;
char *cp;
char buf[BUFSIZ],
*lnptr = sbuf;
Extension *ext;
genreset();
PP_DBG (("Lib/pp/A_adrln2txt (%s)", argv[0]));
*lnptr = 0;
lnptr = A_put (lnptr, AD_RECIP_NO, no2txt3 (adr->ad_no, buf),
argv, &argc);
lnptr = A_put (lnptr, AD_STATUS, A_stat2txt (adr->ad_status),
argv, &argc);
lnptr = A_put (lnptr, AD_REFORM_DONE, no2txt3 (adr->ad_rcnt, buf),
argv, &argc);
if (adr -> ad_fmtchan)
lnptr = A_chanlist2txt (lnptr, AD_REFORM_LIST, adr->ad_fmtchan,
argv, &argc);
lnptr = A_outchan2txt (lnptr, AD_OUTCHAN, adr->ad_outchan, argv,
&argc);
lnptr = A_outhost2txt (lnptr, AD_OUTHOST, adr->ad_outchan, argv,
&argc);
lnptr = A_put (lnptr, AD_EXTENSION_ID,
A_no2txt (adr->ad_extension, buf),
argv, &argc);
repreq2txt (adr->ad_resp, adr->ad_mtarreq,
adr->ad_usrreq, argv, &argc);
if (adr -> ad_explicitconversion != AD_EXP_NONE)
lnptr = A_put (lnptr,
AD_EXPLICITCONVERSION,
rcmd_srch (adr->ad_explicitconversion,
atbl_expconversion),
argv, &argc);
lnptr = A_put (lnptr,
AD_ADDTYPE, A_adrtype2txt (adr->ad_type), argv,
&argc);
if (adr -> ad_subtype != AD_NOSUBTYPE)
lnptr = A_put (lnptr,
AD_SUBTYPE, A_adrsubtype2txt (adr->ad_subtype),
argv, &argc);
if (adr->ad_eit)
lnptr = A_put (lnptr, AD_EITS, listbpt2txt (adr->ad_eit, buf),
argv, &argc);
if (adr->ad_content)
lnptr = A_put (lnptr, AD_CONTENT, adr->ad_content,
argv, &argc);
if (adr -> ad_dn)
lnptr = A_put (lnptr, AD_DN, adr -> ad_dn, argv, &argc);
if (adr -> ad_orig_req_alt)
lnptr = A_put (lnptr, AD_ORIG_REQ_ALT, adr -> ad_orig_req_alt,
argv, &argc);
#define docritical(x, n) if (x) \
lnptr = A_put (lnptr, (n), crit2txt ((x)), \
argv, &argc)
docritical (adr -> ad_orig_req_alt_crit, AD_ORIG_REQ_ALT_CRIT);
if (adr -> ad_req_del[0] != AD_RDM_NOTUSED)
lnptr = A_req_del (lnptr, adr -> ad_req_del, argv, &argc);
docritical (adr -> ad_req_del_crit, AD_REQ_DEL_CRIT);
if (adr -> ad_phys_forward)
lnptr = A_put (lnptr, AD_PHYS_FORWARD,
rcmd_srch(TRUE, tbl_bool), argv, &argc);
docritical (adr -> ad_phys_forward_crit, AD_PHYS_FORWARD_CRIT);
if (adr -> ad_phys_fw_ad_req)
lnptr = A_put (lnptr, AD_PHYS_FW_AD,
rcmd_srch (TRUE, tbl_bool), argv, &argc);
docritical (adr -> ad_phys_fw_ad_crit, AD_PHYS_FW_AD_CRIT);
if (adr -> ad_phys_modes)
lnptr = A_modes2txt (lnptr, adr -> ad_phys_modes,
argv, &argc);
docritical (adr -> ad_phys_modes_crit, AD_PHYS_MODES_CRIT);
if (adr -> ad_reg_mail_type)
lnptr = A_put (lnptr, AD_REG_MAIL,
rcmd_srch (adr -> ad_reg_mail_type,
atbl_reg_mail),
argv, &argc);
docritical (adr -> ad_reg_mail_type_crit, AD_REG_MAIL_CRIT);
if (adr -> ad_recip_number_for_advice)
lnptr = A_put (lnptr, AD_RECIP_NUMBER_ADVICE,
adr -> ad_recip_number_for_advice,
argv, &argc);
docritical (adr -> ad_recip_number_for_advice_crit,
AD_RECIP_NUMBER_ADVICE_CRIT);
if (adr -> ad_phys_rendition_attribs)
lnptr = A_put (lnptr, AD_PHYS_RENDITION,
sprintoid (adr -> ad_phys_rendition_attribs),
argv, &argc);
docritical (adr -> ad_phys_rendition_attribs_crit,
AD_PHYS_RENDITION_CRIT);
if (adr -> ad_pd_report_request)
lnptr = A_put (lnptr, AD_PD_REPORT_REQUEST,
rcmd_srch (TRUE, tbl_bool),
argv, &argc);
docritical (adr -> ad_pd_report_request_crit,
AD_PD_REPORT_REQUEST_CRIT);
for (rp = adr -> ad_redirection_history; rp; rp = rp -> rd_next)
lnptr = A_redir2txt (lnptr, rp, argv, &argc);
docritical (adr -> ad_redirection_history_crit,
AD_REDIRECTION_HISTORY_CRIT);
if (adr -> ad_message_token) {
lnptr = A_put (lnptr, AD_MESSAGE_TOKEN,
cp = qb2hex (adr -> ad_message_token),
argv, &argc);
free (cp);
}
docritical (adr -> ad_message_token_crit,
AD_MESSAGE_TOKEN_CRIT);
if (adr -> ad_content_integrity) {
lnptr = A_put (lnptr, AD_CONTENT_INTEGRITY,
cp = qb2hex (adr -> ad_message_token),
argv, &argc);
free (cp);
}
docritical (adr -> ad_content_integrity_crit,
AD_CONTENT_INTEGRITY_CRIT);
if (adr -> ad_proof_delivery)
lnptr = A_put (lnptr, AD_PROOF_DELIVERY,
rcmd_srch (TRUE, tbl_bool),
argv, &argc);
docritical (adr -> ad_proof_delivery_crit, AD_PROOF_DELIVERY_CRIT);
#undef docritical
for (ext = adr -> ad_per_recip_ext_list; ext; ext = ext -> ext_next)
lnptr = A_extension (lnptr, ext, argv, &argc);
lnptr = A_put (lnptr, AD_ORIG, adr->ad_value, argv, &argc);
lnptr = A_put (lnptr, AD_X400, adr->ad_r400adr, argv, &argc);
lnptr = A_put (lnptr, AD_822, adr->ad_r822adr, argv, &argc);
lnptr = A_put (lnptr, AD_END, NULLCP, argv, &argc);
return OK;
}
/* --- *** ---
outchan contains only one value, this is a temporary measure until
next PP version - then replace with A_chanlist2txt.
--- *** --- */
static char *A_outchan2txt (lnptr, type, chanlist, argv, argc)
char *lnptr;
int type;
LIST_RCHAN *chanlist;
char *argv[];
int *argc;
{
LIST_RCHAN *fp;
char buf[LINESIZE];
PP_DBG (("Lib/A_outchan2txt()"));
if (chanlist == NULLIST_RCHAN || chanlist->li_chan == NULLCHAN) {
lnptr = A_put (lnptr, type, NULLCP, argv, argc);
return (lnptr);
}
buf[0] = '\0';
for (fp = chanlist; fp; fp = fp -> li_next)
if (fp -> li_chan)
if (fp -> li_chan -> ch_name) {
(void) strcat (buf, fp -> li_chan -> ch_name);
break;
}
if (buf[0] == '\0')
lnptr = A_put (lnptr, type, NULLCP, argv, argc);
else
lnptr = A_put (lnptr, type, buf, argv, argc);
return (lnptr);
}
static char *A_chanlist2txt (lnptr, type, chanlist, argv, argc)
char *lnptr;
int type;
LIST_RCHAN *chanlist;
char *argv[];
int *argc;
{
LIST_RCHAN *fp;
char buf[LINESIZE];
PP_DBG (("Lib/A_chanlist2txt()"));
if (chanlist == NULLIST_RCHAN || chanlist->li_chan == NULLCHAN) {
lnptr = A_put (lnptr, type, NULLCP, argv, argc);
return (lnptr);
}
buf[0] = '\0';
for (fp = chanlist; fp; fp = fp -> li_next)
if (fp -> li_chan)
if (fp -> li_chan -> ch_name) {
if (buf[0] != '\0')
(void) strcat (buf, ",");
(void) strcat (buf, fp -> li_chan -> ch_name);
}
if (buf[0] == '\0')
lnptr = A_put (lnptr, type, NULLCP, argv, argc);
else
lnptr = A_put (lnptr, type, buf, argv, argc);
return (lnptr);
}
/* --- *** ---
outhost contains only one value, this is a temporary measure until
next PP version - then redo as a list.
--- *** --- */
static char *A_outhost2txt (lnptr, type, hostlist, argv, argc)
char *lnptr;
int type;
LIST_RCHAN *hostlist;
char *argv[];
int *argc;
{
LIST_RCHAN *fp;
char buf[LINESIZE];
PP_DBG (("Lib/A_outhost2txt()"));
if (hostlist == NULLIST_RCHAN || hostlist->li_mta == NULLCP) {
lnptr = A_put (lnptr, type, NULLCP, argv, argc);
return (lnptr);
}
buf[0] = '\0';
for (fp = hostlist; fp; fp = fp -> li_next)
if (fp -> li_mta) {
(void) strcat (buf, fp -> li_mta);
break;
}
if (buf[0] == '\0')
lnptr = A_put (lnptr, type, NULLCP, argv, argc);
else
lnptr = A_put (lnptr, type, buf, argv, argc);
return (lnptr);
}
static char *A_put (lnptr, key, val, argv, argc)
char *lnptr;
int key;
char *val;
char *argv[];
int *argc;
{
char *lnbegin=lnptr;
int n = *argc;
if (key != AD_END)
argv[n++] = "=";
argv[n++] = rcmd_srch (key, atbl_addr);
if (key != AD_END) {
argv[n++] = lnptr;
if (val == NULLCP || *val == '\0')
lnptr = Bf_put (lnptr, EMPTY);
else
lnptr = Bf_put (lnptr, val);
*lnptr++ = '\0';
}
argv[n] = NULLCP;
*argc = n;
PP_DBG (("Lib/pp/A_put (%s)", lnbegin));
return (lnptr);
}
static char *A_no2txt (val, buf) /* Number -> Txt */
int val;
char *buf;
{
(void) sprintf (buf, "%d", val);
return buf;
}
char *no2txt3 (value, buf) /* Number -> Txt (max of 3 chars) */
int value;
char *buf;
{
char *bufstart = buf,
temp[100];
int maxlen=3,
i, j,
diff,
len;
PP_DBG (("Lib/pp/no2txt3 (%d)", value));
(void) sprintf (&temp[0], "%d", value);
len = strlen (&temp[0]);
if (len == maxlen)
for (i=j=0; i<maxlen; buf[i++]=temp[j++]);
else if (len > maxlen)
(void) sprintf (buf, "%s", "999");
else if (len < maxlen) {
diff = maxlen - len;
for (i=0; i < diff; buf[i]='0', i++);
for (i=diff, j=0; i <maxlen; buf[i++]=temp[j++]);
}
buf[maxlen] = '\0';
return (bufstart);
}
static char *A_stat2txt (status)
int status;
{
PP_DBG (("Lib/pp/A_stat2txt (%d)", status));
switch (status) {
case AD_STAT_PEND:
case AD_STAT_DONE:
case AD_STAT_DRREQUIRED:
case AD_STAT_DRWRITTEN:
return (rcmd_srch (status, atbl_status));
}
return (rcmd_srch (AD_STAT_UNKNOWN, atbl_status));
}
static char *A_adrtype2txt (value) /* Address type -> Txt */
int value;
{
char *keywd;
PP_DBG (("Lib/pp/A_adrtype2txt (%d)", value));
if ((keywd = rcmd_srch (value, atbl_types)) == NULLCP)
keywd = rcmd_srch (AD_ANY_TYPE, atbl_types);
return (keywd);
}
static char* A_adrsubtype2txt (value) /* Txt -> Address subtype */
int value;
{
char *keywd;
PP_DBG (("Lib/pp/A_adrsubtype2txt (%d)", value));
keywd = rcmd_srch (value, atbl_subtypes);
return (keywd);
}
static char *A_extension (lnptr, ext, argv, argcp)
char *lnptr;
Extension *ext;
char **argv;
int *argcp;
{
char extbuf[BUFSIZ];
char buf[20];
char *av[5];
av[0] = A_no2txt (ext -> ext_int, buf);
av[1] = ext -> ext_oid ? sprintoid (ext -> ext_oid) : "";
av[2] = qb2hex (ext -> ext_value);
av[3] = rcmd_srch (ext -> ext_criticality, tbl_crit);
av[4] = NULLCP;
arg2vstr (0, sizeof extbuf, extbuf, av);
free (av[2]);
return A_put (lnptr, AD_EXTENSION, extbuf, argv, argcp);
}
static char *A_redir2txt (lnptr, rp, argv, argcp)
char *lnptr;
Redirection *rp;
char *argv[];
int *argcp;
{
char *av[4];
char redbuf[BUFSIZ];
av[0] = rp -> rd_addr ? rp -> rd_addr : "";
av[1] = rp -> rd_dn ? rp -> rd_dn : "";
av[2] = time2txt (rp -> rd_time);
av[3] = rcmd_srch (rp -> rd_reason, tbl_redir);
av[4] = NULLCP;
arg2vstr (0, sizeof redbuf, redbuf, av);
return A_put (lnptr, AD_REDIRECTION_HISTORY, redbuf, argv, argcp);
}
static char *A_modes2txt (lnptr, md, argv, argcp)
char *lnptr;
int md;
char *argv[];
int *argcp;
{
char modebuf[BUFSIZ];
int i, n;
char *av[20];
for (i = 1, n = 0; i <= AD_PM_MAX; i <<= 2) {
if (md & i)
av[n++] = rcmd_srch (i, atbl_pd_modes);
}
av[n] = NULLCP;
arg2vstr (0, sizeof modebuf, modebuf, av);
return A_put (lnptr, AD_PHYS_MODES, modebuf, argv, argcp);
}
static char *A_req_del (lnptr, rdm, argv, argcp)
char *lnptr;
int rdm[];
char *argv[];
int *argcp;
{
char *av[AD_RDM_MAX+1];
char rdmbuf[BUFSIZ];
int n = 0, i;
for (i = 0; i < AD_RDM_MAX; i++) {
if (rdm[i] == AD_RDM_NOTUSED)
break;
av[n++] = rcmd_srch (rdm[i], atbl_rdm);
}
argv[n] = NULLCP;
arg2vstr (0, sizeof rdmbuf, rdmbuf, av);
return A_put (lnptr, AD_REQ_DEL, rdmbuf, argv, argcp);
}