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

  1. /* or_default: add suitable defaults for or structures */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Lib/or/RCS/or_default.c,v 6.0 1991/12/18 20:23:08 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Lib/or/RCS/or_default.c,v 6.0 1991/12/18 20:23:08 jpo Rel $
  9.  *
  10.  * $Log: or_default.c,v $
  11.  * Revision 6.0  1991/12/18  20:23:08  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include "or.h"
  19. #include "util.h"
  20.  
  21. extern void fixup_space();
  22.  
  23. OR_ptr or_default_aux ();
  24.  
  25. int or_form_type(or)
  26. OR_ptr    or;
  27. {
  28.     int        or_components[OR_DD+1];    /* must be big enough ... */
  29.     OR_ptr              defptr;
  30.  
  31.     bzero ((char *)or_components, sizeof or_components);
  32.     for (defptr = or; defptr; defptr = defptr -> or_next) {
  33.         if (defptr -> or_type > OR_DD)
  34.             PP_LOG (LLOG_EXCEPTIONS, ("Unknown OR type %d",
  35.                           defptr -> or_type));
  36.         else
  37.             or_components[defptr -> or_type] ++;
  38.     }
  39.  
  40.     /* check for forms of OR address */
  41.     if (or_components[OR_X121])
  42.         return OR_FORM_TERM;
  43.     if (or_components[OR_ADMD] && or_components[OR_C] &&
  44.     or_components[OR_PD_C] && or_components[OR_POSTCODE])
  45.         return OR_FORM_POST;
  46.     if (or_components[OR_C] && or_components[OR_ADMD] &&
  47.     or_components[OR_UAID])
  48.         return OR_FORM_NUMR;
  49.     if (or_components[OR_C] && or_components[OR_ADMD])
  50.         return OR_FORM_MNEM;
  51.     return OR_FORM_NONE;
  52. }
  53.  
  54.  
  55. OR_ptr or_default (or)
  56. OR_ptr  or;
  57. {
  58.     return or_default_aux(or, loc_ortree);
  59. }
  60.  
  61.  
  62. OR_ptr or_default_aux (or, merge)
  63. OR_ptr    or, merge;
  64. {
  65.     OR_ptr              defptr;
  66.     OR_ptr              new_tree;
  67.     OR_ptr              tptr = NULLOR;
  68.     int            before;
  69.     char        spaceless[BUFSIZ], defspless[BUFSIZ];
  70.  
  71.     PP_DBG (("Lib/or_default()"));
  72.  
  73.     if (or == NULLOR)
  74.         return or_tdup(merge);
  75.  
  76.     new_tree = NULLOR;
  77.     switch (or_form_type(or)) {
  78.     case OR_FORM_TERM:
  79.     case OR_FORM_POST:
  80.     case OR_FORM_NUMR:
  81.     case OR_FORM_MNEM:
  82.         /* recognised form of OrAaddress */
  83.         /* don't merge */
  84.         return or_tdup(or);
  85.     default:
  86.         break;
  87.     }
  88.  
  89.     for (defptr = merge; defptr != NULLOR; defptr = defptr -> or_next) {
  90.     if (or -> or_type <= defptr -> or_type)
  91.         if (or->or_type == OR_OU) {
  92.             fixup_space(or -> or_value, spaceless);
  93.             fixup_space(defptr -> or_value, defspless);
  94.             if (lexequ (spaceless, defspless) == 0)
  95.                 break;
  96.         }
  97.         else
  98.             break;
  99.  
  100.     tptr = or_dup (defptr);
  101.  
  102.     if (tptr -> or_type == OR_OU) 
  103.         before = FALSE; 
  104.     else 
  105.         before = TRUE;
  106.  
  107.     if ((new_tree = or_add (new_tree, tptr, before)) == NULLOR)
  108.         return NULLOR;
  109.     }
  110.  
  111.     /*
  112.     As we know both are ordered, tptr will be at the end of the tree
  113.     */
  114.  
  115.     if (new_tree == NULLOR)
  116.     return (or);
  117.  
  118.     tptr -> or_next = or;
  119.     or -> or_prev = tptr;
  120.  
  121.     return (new_tree);
  122. }
  123.