|
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 t
Length: 11807 (0x2e1f) Types: TextFile Names: »txt2adr.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« └─⟦e5a54fb17⟧ └─⟦this⟧ »pp-5.0/Lib/pp/txt2adr.c«
/* tx_a.c: handles address structures see manual page QUEUE (5) */ # ifndef lint static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/pp/RCS/txt2adr.c,v 5.0 90/09/20 16:12:07 pp Exp Locker: pp $"; # endif /* * $Header: /cs/research/pp/hubris/pp-beta/Lib/pp/RCS/txt2adr.c,v 5.0 90/09/20 16:12:07 pp Exp Locker: pp $ * * $Log: txt2adr.c,v $ * Revision 5.0 90/09/20 16:12:07 pp * rcsforce : 5.0 public release * */ #include "util.h" #include <isode/psap.h> #include <isode/cmd_srch.h> #include "adr.h" #include "tb_com.h" #include "tb_a.h" #include "list_bpt.h" #include "list_rchan.h" #define txt2crit(n) cmd_srch ((n), tbl_crit) #define txt2int(n) atoi(n) extern CMD_TABLE tbl_bool [], tbl_crit [], tbl_redir[], atbl_pd_modes [], atbl_reg_mail [], 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 int A_txt2adln (); static int A_txt2address (); extern struct qbuf *hex2qb (); extern Extension *txt2extension (); /* ------------------- Text File -> Memory ------------------------------ */ int txt2adr (base, startlineoffset, argv, argc) /* Txt -> Env-ctrl-addresses */ register ADDR **base; long startlineoffset; char **argv; int argc; { int retval; PP_DBG (("Lib/pp/txt2adr (%s)", argv[0])); if (--argc < 1) return (NOTOK); switch (cmd_srch (argv[0], atbl_ctrl_addrs)) { case AD_ORIGINATOR: case AD_RECIPIENT: retval = A_txt2address (base, startlineoffset, &argv[1], argc); PP_DBG (("Lib/pp/txt2adr (retval=%d)", retval)); return (retval); } PP_LOG (LLOG_EXCEPTIONS, ("Lib/pp/txt2adr Unable to parse '%s'", argv[0])); return (NOTOK); } static int A_txt2address (base, startlineoffset, argv, argc) ADDR **base; long startlineoffset; char **argv; int argc; { ADDR *adr_new(), *adr; int n_args; adr = adr_new (NULLCP, NULL, NULL); for (n_args=0; n_args < argc;) { PP_DBG (("Lib/pp/A_txt2address (%s)", argv[n_args + 1])); if (argv[n_args] == NULLCP) break; if (*argv[n_args] == '=') { if (A_txt2adln (adr, argv[n_args + 1], argv[n_args + 2]) == NOTOK) return (NOTOK); n_args += 3; } else { if (A_txt2adln (adr, argv[n_args], NULLCP) == NOTOK) return NOTOK; n_args ++; } } /* fixed format: rno=999 status=XXXX reform-done=999 */ adr->ad_no_offset = startlineoffset + 10; adr->ad_stat_offset = startlineoffset + 21; adr->ad_rcnt_offset = startlineoffset + 38; adr_add (base, adr); return (OK); } static Redirection *A_txt2redir (); static int A_txt2stat (); static int A_txt2fmtchan (); static int A_txt2adrtype (); static int A_txt2adrsubtype (); static int A_txt2req_del (); static int A_txt2modes (); static int A_txt2adln (adr, keywd, val) /* Txt -> Address Line */ ADDR *adr; char *keywd; char *val; { char *adr_prm[10]; int a_args; PP_DBG (("Lib/pp/A_txt2adln (%s '%s')", keywd, val)); switch (cmd_srch (keywd, atbl_addr)) { case AD_RECIP_NO: adr->ad_no = txt2int (val); return (OK); case AD_STATUS: return (A_txt2stat (&adr->ad_status, val)); case AD_REFORM_DONE: adr->ad_rcnt = txt2int (val); return (OK); case AD_REFORM_LIST: if (lexequ (val, EMPTY) == 0) return (OK); return (A_txt2fmtchan (val, &adr->ad_fmtchan)); case AD_OUTCHAN: if (lexequ (val, EMPTY) == 0) return (OK); if (adr->ad_outchan == NULLIST_RCHAN) adr->ad_outchan = list_rchan_new (NULLCP, val); else list_rchan_schan (adr->ad_outchan, val); return (OK); case AD_OUTHOST: if (lexequ (val, EMPTY) == 0) return (OK); if (adr->ad_outchan == NULLIST_RCHAN) adr->ad_outchan = list_rchan_new (val, NULLCP); else list_rchan_ssite (adr->ad_outchan, val); return (OK); case AD_EXTENSION_ID: adr->ad_extension = txt2int (val); return (OK); case AD_RESPONSIBILITY: adr_prm[0] = "="; adr_prm[1] = keywd; adr_prm[2] = val; adr_prm[3] = NULLCP; a_args = 3; return (txt2repreq (&adr->ad_resp, &adr_prm[0], a_args)); case AD_MTA_REP_REQ: adr_prm[0] = "="; adr_prm[1] = keywd; adr_prm[2] = val; adr_prm[3] = NULLCP; a_args = 3; return (txt2repreq (&adr->ad_mtarreq, &adr_prm[0], a_args)); case AD_USR_REP_REQ: adr_prm[0] = "="; adr_prm[1] = keywd; adr_prm[2] = val; adr_prm[3] = NULLCP; a_args = 3; return (txt2repreq (&adr->ad_usrreq, &adr_prm[0], a_args)); case AD_EXPLICITCONVERSION: if (lexequ (val, EMPTY) == 0) { adr->ad_explicitconversion = NULL; return (OK); } adr->ad_explicitconversion = cmd_srch (val, atbl_expconversion); return (OK); case AD_ADDTYPE: return (A_txt2adrtype (&adr->ad_type, val)); case AD_SUBTYPE: if (lexequ (val, EMPTY) == 0) { adr->ad_subtype = AD_NOSUBTYPE; return (OK); } return (A_txt2adrsubtype (&adr->ad_subtype, val)); case AD_EITS: return txt2listbpt (&adr->ad_eit, val); case AD_CONTENT: adr->ad_content = strdup(val); return OK; case AD_DN: adr ->ad_dn = strdup (val); return OK; case AD_ORIG_REQ_ALT: adr -> ad_orig_req_alt = strdup (val); return OK; case AD_ORIG_REQ_ALT_CRIT: adr -> ad_orig_req_alt_crit = txt2crit(val); return OK; case AD_REQ_DEL: return A_txt2req_del(adr -> ad_req_del, val); case AD_REQ_DEL_CRIT: adr ->ad_req_del_crit = txt2crit (val); return OK; case AD_PHYS_FORWARD: adr -> ad_phys_forward = cmd_srch (val, tbl_bool); return OK; case AD_PHYS_FORWARD_CRIT: adr -> ad_phys_forward_crit = txt2crit (val); return OK; case AD_PHYS_FW_AD: adr -> ad_phys_fw_ad_req = cmd_srch (val, tbl_bool); return OK; case AD_PHYS_FW_AD_CRIT: adr -> ad_phys_fw_ad_crit = txt2crit (val); return OK; case AD_PHYS_MODES: adr -> ad_phys_modes = A_txt2modes (val); return OK; case AD_PHYS_MODES_CRIT: adr -> ad_phys_modes_crit = txt2crit (val); return OK; case AD_REG_MAIL: adr -> ad_reg_mail_type = cmd_srch (val, atbl_reg_mail); return OK; case AD_REG_MAIL_CRIT: adr -> ad_reg_mail_type_crit = txt2crit (val); return OK; case AD_RECIP_NUMBER_ADVICE: adr -> ad_recip_number_for_advice = strdup (val); break; case AD_RECIP_NUMBER_ADVICE_CRIT: adr -> ad_recip_number_for_advice_crit = txt2crit(val); break; case AD_PHYS_RENDITION: adr -> ad_phys_rendition_attribs = oid_cpy (str2oid (val)); return OK; case AD_PHYS_RENDITION_CRIT: adr -> ad_phys_rendition_attribs_crit = txt2crit (val); return OK; case AD_PD_REPORT_REQUEST: adr -> ad_pd_report_request = cmd_srch (val, tbl_bool); return OK; case AD_PD_REPORT_REQUEST_CRIT: adr -> ad_pd_report_request_crit = txt2crit (val); break; case AD_REDIRECTION_HISTORY: { Redirection *rp, **rpp; rp = A_txt2redir (val); for (rpp = &adr -> ad_redirection_history; *rpp; rpp = &(*rpp) -> rd_next) continue; *rpp = rp; } return OK; case AD_REDIRECTION_HISTORY_CRIT: adr -> ad_redirection_history_crit = txt2crit (val); return OK; case AD_MESSAGE_TOKEN: adr -> ad_message_token = hex2qb (val); return OK; case AD_MESSAGE_TOKEN_CRIT: adr -> ad_message_token_crit = txt2crit (val); return OK; case AD_CONTENT_INTEGRITY: adr -> ad_content_integrity = hex2qb(val); return OK; case AD_CONTENT_INTEGRITY_CRIT: adr -> ad_content_integrity_crit = txt2crit (val); return OK; case AD_PROOF_DELIVERY: adr -> ad_proof_delivery = cmd_srch (val, tbl_bool); return OK; case AD_PROOF_DELIVERY_CRIT: adr -> ad_proof_delivery_crit = txt2crit (val); return OK; case AD_EXTENSION: { Extension *ext, **extp, *A_txt2extension (); ext = A_txt2extension (val); for (extp = &adr -> ad_per_recip_ext_list; *extp; extp = &(*extp) -> ext_next) continue; *extp = ext; } return OK; case AD_ORIG: if (lexequ (val, EMPTY) == 0) return (NOTOK); adr->ad_value = strdup(val); return (OK); case AD_X400: if (lexequ (val, EMPTY) == 0) { adr->ad_r400adr = NULLCP; return (OK); } adr->ad_r400adr = strdup (val); return (OK); case AD_822: if (lexequ (val, EMPTY) == 0) { adr->ad_r822adr = NULLCP; return (OK); } adr->ad_r822adr = strdup (val); return (OK); case AD_END: return (OK); } return NOTOK; } static int A_txt2fmtchan (str, fmt_chan) char *str; LIST_RCHAN **fmt_chan; { char *np, *cp = str; int keep_going = TRUE; LIST_RCHAN *new; PP_DBG (("Lib/A_txt2fmtchan (%s)", str)); /* --- *** --- Format used: chan_name1, ... , chan_nameN Note: For ad_fmtchan no site name is specified. This is only specified for ad_outchan. --- *** --- */ while (keep_going) { if ((np = index (cp, ',')) != NULLCP) *np++ = '\0'; else keep_going = FALSE; if ((new = list_rchan_new (NULLCP, cp)) == NULLIST_RCHAN) { list_rchan_free (*fmt_chan); *fmt_chan = NULLIST_RCHAN; return (NOTOK); } list_rchan_add (fmt_chan, new); cp = np; if (cp == NULL || *cp == '\0') break; } return (OK); } static int A_txt2stat (status, keywd) /* Txt -> Recipient_status */ int *status; char *keywd; { PP_DBG (("Lib/pp/A_txt2stat (%s)", keywd)); switch (*status = cmd_srch (keywd, atbl_status)) { case AD_STAT_PEND: case AD_STAT_DONE: case AD_STAT_DRREQUIRED: case AD_STAT_DRWRITTEN: return (OK); } return (NOTOK); } static int A_txt2adrtype (type, keywd) /* Txt -> Address type */ int *type; char *keywd; { PP_DBG (("Lib/pp/A_txt2adrtype (%s)", keywd)); switch (*type = cmd_srch (keywd, atbl_types)) { case AD_X400_TYPE: case AD_822_TYPE: case AD_ANY_TYPE: break; default: *type = AD_ANY_TYPE; } PP_DBG (("Lib/pp/A_txt2adrtype (%s %d)", keywd, *type)); return (OK); } static int A_txt2adrsubtype (type, keywd) /* Txt -> Address subtype */ int *type; char *keywd; { PP_DBG (("Lib/pp/A_txt2adrsubtype (%s)", keywd)); if ((*type = cmd_srch (keywd, atbl_subtypes)) == -1) *type = AD_NOSUBTYPE; return (OK); } static Redirection *A_txt2redir (str) char *str; { char *argv[10]; Redirection *rp; if (sstr2arg (str, 10, argv, ", \t\n") != 4) return NULL; rp = (Redirection *) smalloc (sizeof *rp); rp -> rd_addr = isstr (argv[0])? strdup (argv[0]) : NULLCP; rp -> rd_dn = isstr (argv[1]) ? strdup (argv[1]) : NULLCP; txt2time (argv[2], &rp -> rd_time); rp -> rd_reason = cmd_srch (argv[3], tbl_redir); return rp; } static int A_txt2modes (str) char *str; { char *argv[20]; int argc, i, n; int modes = 0; argc = sstr2arg (str, 20, argv, ", \t\n"); for (i = 0; i < argc; i++) if ((n = cmd_srch (argv[i], atbl_pd_modes)) != -1) modes |= n; return modes; } static int A_txt2req_del (rdm, str) int rdm[]; char *str; { char *argv[10]; int argc; int n, rc = 0, i; argc = sstr2arg (str, 10, argv, ", \t\n"); for (i = 0; i < argc && rc < AD_RDM_MAX; i++) if ((n = cmd_srch(argv[i], atbl_rdm)) != -1) rdm[rc++] = n; return OK; } Extension *A_txt2extension (str) char *str; { Extension *ext; char *argv[10]; if (sstr2arg (str, 10, argv, ", \t\n") != 4) return NULL; ext = (Extension *)smalloc (sizeof *ext); ext -> ext_int = txt2int (argv[0]); ext -> ext_oid = str2oid (argv[1]); ext -> ext_value = hex2qb (argv[2]); ext -> ext_criticality = cmd_srch (argv[3], tbl_crit); return ext; }