home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Lib / addr / ap_norm.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  8.5 KB  |  400 lines

  1. /* ap_norm.c: normali[zs]e an address */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Lib/addr/RCS/ap_norm.c,v 6.0 1991/12/18 20:21:24 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Lib/addr/RCS/ap_norm.c,v 6.0 1991/12/18 20:21:24 jpo Rel $
  9.  *
  10.  * $Log: ap_norm.c,v $
  11.  * Revision 6.0  1991/12/18  20:21:24  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include "head.h"
  19. #include "chan.h"
  20. #include "ap.h"
  21.  
  22. extern char *loc_dom_site;
  23. extern int ap_lex_percent;
  24.  
  25. static void ap_ptinit ();
  26. /* ---------------------  Begin  Routines  -------------------------------- */
  27.  
  28.  
  29. /*
  30. Normalize a parse tree, to fill-in host references, etc.
  31.     Returns:
  32.         0  if ok
  33.         -1 if error
  34. */
  35.  
  36. int    all_domain_norm = FALSE;
  37.  
  38. ap_norm_all_domains()
  39. {
  40.     all_domain_norm = TRUE;
  41. }
  42.  
  43. ap_norm_first_domain()
  44. {
  45.     all_domain_norm = FALSE;
  46. }
  47.  
  48. AP_ptr ap_normalize (thetree, order_pref)
  49.     AP_ptr          thetree;        /* the parse tree */
  50.     int             order_pref;
  51. {
  52.     struct ap_node  base_node;      /* first node in routing chain */
  53.     AP_ptr          r822_prefptr,
  54.             person_ptr,
  55.             mbx_prefptr,
  56.             dom_prefptr,
  57.             lst_comment_prefptr,
  58.             last_ptr,
  59.             group_ptr,
  60.             ap;
  61.     int        oneNorm = FALSE;
  62.  
  63.     ap_ninit (&base_node);
  64.  
  65.     (void) ap_sqinsert (&base_node, AP_PTR_MORE, thetree);
  66.  
  67.     ap_ptinit (&base_node, &person_ptr, &r822_prefptr, &mbx_prefptr,
  68.            &dom_prefptr, &lst_comment_prefptr, &last_ptr, &group_ptr);
  69.  
  70.     /*
  71.     Remember "list: ;"...
  72.     */
  73.  
  74.     if (mbx_prefptr == NULLAP) {
  75.         PP_DBG (("Lib/addr/ap_normalize/No mailbox found!"));
  76.         return (base_node.ap_next);
  77.     }
  78.  
  79.  
  80.     /*
  81.     Normalize all refs in source route
  82.     */
  83.  
  84.     if (r822_prefptr != NULLAP) {
  85.         ap = r822_prefptr;
  86.         for(;;) {
  87.             switch (ap -> ap_ptrtype) {
  88.             case AP_PTR_NIL:
  89.                 break;
  90.             case AP_PTR_NXT:
  91.                 break;
  92.             case  AP_PTR_MORE:
  93.                 /* -- next is part of this address -- */
  94.                 ap = ap -> ap_next;
  95.  
  96.                 switch (ap -> ap_obtype) {
  97.                 case AP_DOMAIN:
  98.                     (void) ap_dmnormalize (ap, order_pref);
  99.                     if (all_domain_norm == TRUE)
  100.                         continue;
  101.                     oneNorm = TRUE;
  102.                     break;
  103.                 case AP_DOMAIN_LITERAL:
  104.                 case AP_COMMENT:
  105.                     continue;
  106.                 }
  107.             }
  108.             break;
  109.         }
  110.     }
  111.  
  112.  
  113.  
  114.     if (ap_lex_percent != TRUE) {
  115.         /*
  116.           if JNT mail, % is treated as lexically equivalent
  117.           to @, and CSNET style routes ignored.  Might accept
  118.           CSNET routes if someone wants this...
  119.           */
  120.  
  121.         if (dom_prefptr == NULLAP) {
  122.             /* -- no domain, so add default and leave -- */
  123.             PP_DBG (("Lib/addr/ap_normalize/no domain"));
  124.             ap_locnormalize (&base_node, &r822_prefptr,
  125.                      &mbx_prefptr, &dom_prefptr);
  126.         }
  127.     }
  128.  
  129.  
  130.     if ((dom_prefptr != NULLAP) &&
  131.         (oneNorm == FALSE) &&
  132.         (ap_dmnormalize (dom_prefptr -> ap_next, order_pref) == OK)) {
  133.             PP_DBG (("Lib/addr/ap_normali/Local reference"));
  134.             if (ap_lex_percent != TRUE)
  135.                 ap_locnormalize (&base_node, &r822_prefptr,
  136.                          &mbx_prefptr, &dom_prefptr);
  137.     }
  138.  
  139.  
  140.     if (dom_prefptr == NULLAP && r822_prefptr == NULLAP) {
  141.         /* -- no host references anywhere -- */
  142.  
  143.         if (mbx_prefptr == NULLAP ||
  144.             mbx_prefptr -> ap_next -> ap_obtype == AP_GROUP_NAME ||
  145.             mbx_prefptr -> ap_next -> ap_obtype == AP_GROUP_START)
  146.                 return (base_node.ap_next);
  147.  
  148.         (void) ap_append (mbx_prefptr -> ap_next, AP_DOMAIN, loc_dom_site);
  149.  
  150.         PP_DBG (("Lib/addr/ap_normalize/appending %s domain",
  151.             loc_dom_site));
  152.  
  153.         (void) ap_dmnormalize (mbx_prefptr -> ap_next -> ap_next,
  154.                        order_pref);
  155.     }
  156.  
  157.     return (base_node.ap_next);
  158. }
  159.  
  160.  
  161.  
  162. int ap_dmnormalize (ap, order_pref)
  163. AP_ptr          ap;
  164. int             order_pref;
  165. {
  166.     char    official[LINESIZE], *subdom;
  167.     int     retval;
  168.  
  169.  
  170.     if (ap == NULL)
  171.         return NOTOK;
  172.  
  173.     retval = tb_getdomain (ap->ap_obvalue, NULLCP, official, 
  174.                    order_pref, &subdom);
  175.     if (subdom != NULLCP) free(subdom);
  176.  
  177.     if (retval == OK) {
  178.         if (official[0]) {
  179.             free (ap -> ap_obvalue);
  180.             ap -> ap_obvalue = strdup (official);
  181.             PP_DBG (("Lib/addr/ap_dmnormalize/Official = '%s'",
  182.                 official));
  183.         }
  184.     }
  185.     else {
  186.         PP_LOG (LLOG_EXCEPTIONS, 
  187.             ("%s is not a known domain reference",
  188.              ap -> ap_obvalue));
  189.  
  190.         return (OK);
  191.         /*  This is not worth choking on */
  192.         /* SEK */
  193.     }
  194.  
  195.  
  196.     return (retval);
  197.  
  198. }
  199.  
  200.  
  201.  
  202. /* ---------------------  Static  Routines  ------------------------------- */
  203.  
  204.  
  205.  
  206. static void  ap_ptinit (base_prefptr, person_ptr, r822_prefptr, mbx_prefptr,
  207.           dom_prefptr, lst_comment_prefptr, last_ptr, group_ptr)
  208.  
  209.     AP_ptr  base_prefptr,
  210.         *person_ptr,
  211.         *r822_prefptr,
  212.         *mbx_prefptr,
  213.         *dom_prefptr,
  214.         *lst_comment_prefptr,
  215.         *last_ptr,
  216.         *group_ptr;
  217. {
  218.     AP_ptr  ap;
  219.  
  220.  
  221.     *person_ptr             = NULLAP;
  222.     *r822_prefptr           = NULLAP;
  223.     *mbx_prefptr            = NULLAP;
  224.     *dom_prefptr            = NULLAP;
  225.     *lst_comment_prefptr    = NULLAP;
  226.     *last_ptr               = NULLAP;
  227.     *group_ptr              = NULLAP;
  228.  
  229.  
  230.     /*
  231.     Need switch here to catch leading mbox or domain
  232.     */
  233.     if (base_prefptr == NULLAP 
  234.         || base_prefptr -> ap_next == NULLAP)
  235.         return;
  236.     switch (base_prefptr -> ap_next -> ap_obtype) {
  237.     case AP_MAILBOX:
  238.         *mbx_prefptr = base_prefptr;
  239.         break;
  240.     case AP_DOMAIN_LITERAL:
  241.     case AP_DOMAIN:
  242.         *r822_prefptr = base_prefptr;
  243.         break;
  244.     }
  245.  
  246.  
  247.     for (ap = base_prefptr -> ap_next; ap -> ap_obtype != AP_NIL;
  248.          ap = ap -> ap_next) {
  249.  
  250.         *last_ptr = ap;
  251.  
  252.         PP_DBG (("Lib/addr/ap_ptinit/val '%s'", ap -> ap_obvalue));
  253.  
  254.         switch (ap -> ap_obtype) {
  255.         case AP_PERSON_NAME:
  256.             PP_DBG (("Lib/addr/ap_ptinit/person_ptr"));
  257.             *person_ptr = ap;
  258.             break;
  259.         case AP_GROUP_NAME:
  260.             PP_DBG (("Lib/addr/ap_ptinit/group_ptr"));
  261.             *group_ptr = ap;
  262.             break;
  263.         }
  264.  
  265.  
  266.         if (ap -> ap_ptrtype == AP_PTR_NXT)     break;
  267.         if (ap -> ap_ptrtype == AP_PTR_NIL)     break;
  268.         if (ap -> ap_next == NULLAP)            break;
  269.  
  270.  
  271.         switch (ap -> ap_next -> ap_obtype) {
  272.         case AP_COMMENT:
  273.             PP_DBG (("Lib/addr/ap_ptinit/got comment"));
  274.             *lst_comment_prefptr = ap;
  275.             break;
  276.  
  277.         case AP_GENERIC_WORD:
  278.             PP_DBG (("Lib/addr/ap_ptinit/got word"));
  279.             if (*mbx_prefptr != NULLAP)
  280.             break;
  281.  
  282.         case AP_MAILBOX:
  283.             PP_DBG (("Lib/addr/ap_ptinit/got mbox pref"));
  284.             /* -- one before the mbox -- */
  285.             *mbx_prefptr = ap;
  286.             break;
  287.  
  288.         case AP_DOMAIN_LITERAL:
  289.         case AP_DOMAIN:
  290.             if(*r822_prefptr == NULLAP && *mbx_prefptr == NULLAP){
  291.                 PP_DBG (("Lib/addr/ap_ptinit/got r822_prefptr"
  292.                        ));
  293.                 *r822_prefptr = ap;
  294.             }
  295.             else if ((*dom_prefptr == NULLAP) &&
  296.                  (*mbx_prefptr != NULLAP)) {
  297.                     /* -- need mailbox befor domain -- */
  298.                     PP_DBG (("%s%s",
  299.                         "Lib/addr/ap_ptinit/",
  300.                         "got dom_prefptr"));
  301.                     *dom_prefptr = ap;
  302.                  }
  303.  
  304.             break;
  305.         }
  306.     }
  307.  
  308.  
  309.  
  310.     if (*last_ptr == NULLAP)
  311.     PP_DBG (("Lib/addr/ap_ptinit/no last_ptr"));
  312.     else
  313.     PP_DBG (("Lib/addr/ap_ptinit/last_ptr '%s'",
  314.         (*last_ptr) -> ap_obvalue));
  315. }
  316.  
  317.  
  318.  
  319. /* ---------------------  Not JNTMAIL   ----------------------------------- */
  320.  
  321.  
  322. ap_locnormalize (obase_ptr, or822_prefptr, ombx_prefptr, odom_prefptr)
  323. AP_ptr                          obase_ptr,
  324.                 *or822_prefptr,
  325.                 *ombx_prefptr,
  326.                 *odom_prefptr;
  327. {
  328.     /* -- tear local-part apart -- */
  329.  
  330.     struct ap_node          base_node;
  331.     AP_ptr                  cur_ptr;
  332.     AP_ptr                  r822_prefptr,
  333.                 person_ptr,
  334.                 mbx_prefptr,
  335.                 dom_prefptr,
  336.                 lst_comment_prefptr,
  337.                 last_ptr,
  338.                 group_ptr;
  339.  
  340.     PP_DBG (("Lib/addr/ap_locnormalize/parsing '%s'",
  341.             (*ombx_prefptr) -> ap_next -> ap_obvalue));
  342.  
  343.     ap_ninit (&base_node);
  344.  
  345.     (void) ap_sqinsert (&base_node, AP_PTR_MORE,
  346.                 ap_s2t ((*ombx_prefptr) -> ap_next -> ap_obvalue));
  347.  
  348.     ap_ptinit (&base_node, &person_ptr, &r822_prefptr,
  349.            &mbx_prefptr, &dom_prefptr, &lst_comment_prefptr,
  350.            &last_ptr, &group_ptr);
  351.  
  352.  
  353.     if (dom_prefptr != NULLAP) {
  354.         /* -- actually have some stuff -- */
  355.  
  356.         /* -- replace old reference -- */
  357.         free ((*ombx_prefptr) -> ap_next -> ap_obvalue);
  358.  
  359.         (*ombx_prefptr) -> ap_next -> ap_obvalue =
  360.                 strdup (mbx_prefptr -> ap_next -> ap_obvalue);
  361.  
  362.         PP_DBG (("Lib/addr/ap_locnormalize/newlocal '%s'",
  363.                   (*ombx_prefptr) -> ap_next -> ap_obvalue));
  364.  
  365.         if (r822_prefptr != NULLAP || *odom_prefptr != NULLAP)
  366.             if (*or822_prefptr == NULLAP)
  367.                 /* -- initialize route pointer -- */
  368.                 *or822_prefptr = obase_ptr;
  369.  
  370.  
  371.         if (*odom_prefptr == NULLAP)
  372.             *odom_prefptr = mbx_prefptr -> ap_next;
  373.         else
  374.             /* -- get rid of old domain reference -- */
  375.             (void) ap_move (*or822_prefptr, *odom_prefptr);
  376.  
  377.  
  378.         if (r822_prefptr != NULLAP) {
  379.             /* -- put new chain at end of old -- */
  380.             PP_DBG (("%s%s",
  381.                  "Lib/addr/ap_locnormalize/",
  382.                  "adding new routing to end info"));
  383.  
  384.             for (cur_ptr = *or822_prefptr;
  385.                  cur_ptr -> ap_next -> ap_obtype
  386.                     == AP_DOMAIN ||
  387.                  cur_ptr -> ap_next -> ap_obtype
  388.                     == AP_DOMAIN_LITERAL ||
  389.                  cur_ptr -> ap_next -> ap_obtype
  390.                     == AP_COMMENT;
  391.                  cur_ptr = cur_ptr -> ap_next)
  392.                 continue;
  393.  
  394.             (void) ap_sqmove (cur_ptr, r822_prefptr, AP_DOMAIN);
  395.         }
  396.  
  397.         (void) ap_move (*odom_prefptr, dom_prefptr);
  398.     }
  399. }
  400.