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

  1. /* or_util.c: or-name utility routines */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Lib/or/RCS/or_util.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_util.c,v 6.0 1991/12/18 20:23:08 jpo Rel $
  9.  *
  10.  * $Log: or_util.c,v $
  11.  * Revision 6.0  1991/12/18  20:23:08  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. /*
  19. OR Name handling Utilities
  20. */
  21.  
  22. #include "util.h"
  23. #include "or.h"
  24.  
  25. char *or_type2name (type)
  26. int             type;
  27. {
  28.     typestruct  *ptr;
  29.  
  30.     PP_DBG (("or_util.c/or_type2name()"));
  31.  
  32.     for (ptr = typetab88; (ptr -> ty_string) != NULLCP; ptr++)
  33.     if (type == ptr->ty_int)
  34.         return (ptr->ty_string);
  35.  
  36.     PP_LOG(LLOG_EXCEPTIONS,
  37.        ("BOGUS Unknown type '%d'", type));
  38.     return NULLCP;
  39. }
  40.  
  41. int or_name2type (name)
  42. char            *name;
  43. {
  44.     typestruct  *ptr;
  45.  
  46.     PP_DBG (("or_util.c/or_name2type (%s)", name ? name : "null"));
  47.  
  48.     if (!isstr (name))
  49.         return NOTOK;
  50.  
  51.     for (ptr = typetab88; (ptr -> ty_string) != NULLCP; ptr++)
  52.     if (lexequ (name, ptr->ty_string) == 0)
  53.         return (ptr->ty_int);
  54.  
  55.     return NOTOK;
  56. }
  57.  
  58. /*
  59. Strcat + dot quoting
  60. */
  61.  
  62. void dstrcat (s1, s2)
  63. char    *s1;
  64. char    *s2;
  65. {
  66.      register char *p, *q;
  67.  
  68.      p = s1 + strlen (s1);
  69.      for (q = s2; *q != '\0';)
  70.     switch (*q) {
  71.     case '.':
  72.     case '"':
  73.     case '\\':
  74.         /*
  75.         Shouldn't be any backslashes tho...
  76.         */
  77.         *p++ = '\\';
  78.     default:
  79.         *p++ = *q++;
  80.         break;
  81.     }
  82.      *p = '\0';
  83.  
  84.      PP_DBG (("or_util.c/dstrcat(%s, %s)", s1, s2));
  85. }
  86.  
  87. /*
  88. Strcat + dollar quoting
  89. */
  90.  
  91. void qstrcat (s1, s2)
  92. char    *s1;
  93. char    *s2;
  94. {
  95.     register char       *p,
  96.             *q;
  97.  
  98.     PP_DBG (("qstrcat()"));
  99.  
  100.     p = s1 + strlen (s1);
  101.     for (q = s2; *q != '\0';)
  102.     switch (*q) {
  103.     case '/':
  104.     case '=':
  105.         *p++ = '$';
  106.     default:
  107.         *p++ = *q++;
  108.         break;
  109.     }
  110.     *p = '\0';
  111. }
  112.  
  113. int or_gettoken (str, delim, buf)
  114. char    **str;
  115. char    delim;
  116. char    *buf;
  117. {
  118.  
  119.     char        *ind = *str,
  120.         *x;
  121.  
  122.     x = buf;
  123.     if (*ind == '\0')
  124.     return NOTOK;
  125.     for (; (*ind != delim) && (*ind != '\0'); ind++, buf++)
  126.      *buf = *ind;
  127.     if (*ind != '\0')  ind++;
  128.     *str = ind;
  129.     *buf = '\0';
  130.  
  131.     PP_DBG (("or_util.c/or_gettoken (%s)", x));
  132.  
  133.     return OK;
  134. }
  135.  
  136. int or_ddvalid_chk (key, buf)
  137. char    *key;
  138. char    *buf;
  139. {
  140.     int     retval;
  141.  
  142.     switch (retval = cmd_srch (key, ortbl_ddvalid)) {
  143.         case OR_DDVALID_RFC822:
  144.         case OR_DDVALID_X40088:
  145.         case OR_DDVALID_JNT:
  146.         case OR_DDVALID_UUCP:
  147.         case OR_DDVALID_LIST:
  148.         case OR_DDVALID_ROLE:
  149.         case OR_DDVALID_FAX:
  150.         case OR_DDVALID_ATTN:
  151.         (void) strcpy (buf, rcmd_srch (retval, ortbl_ddvalid));
  152.         return OK;
  153.         default:
  154.         return NOTOK;
  155.     }
  156.  
  157.     /*NOTREACHED*/
  158. }
  159.  
  160. int or_str_isps (str)
  161. char *str;
  162. {
  163.     while (*str && or_isps (*str))
  164.         str ++;
  165.     return *str == '\0';
  166. }
  167.  
  168. int or_str_isns (str)
  169. char *str;
  170. {
  171.     int seen_digit = 0;
  172.     while (*str) {
  173.         if (!or_isns(*str))
  174.             return 0;
  175.         if (isdigit (*str))
  176.             seen_digit = 1;
  177.         str ++;
  178.     }
  179.     return seen_digit;
  180. }
  181.  
  182. int or_type2charset84 (type)
  183. int type;
  184. {
  185.     typestruct  *ptr;
  186.  
  187.     PP_DBG (("or_util.c/or_type2charset()"));
  188.  
  189.     for (ptr = typetab; (ptr -> ty_string) != NULLCP; ptr++)
  190.     if (type == ptr->ty_int)
  191.         return (ptr->ty_charset);
  192.  
  193.     return 0;
  194. }
  195.  
  196. int or_type2charset (type)
  197. int type;
  198. {
  199.     typestruct  *ptr;
  200.  
  201.     PP_DBG (("or_util.c/or_type2charset()"));
  202.  
  203.     for (ptr = typetab88; (ptr -> ty_string) != NULLCP; ptr++)
  204.     if (type == ptr->ty_int)
  205.         return (ptr->ty_charset);
  206.  
  207.     return 0;
  208. }
  209.  
  210. int or_checktypes (or, buf)
  211. OR_ptr or;
  212. char *buf;
  213. {
  214.     char    *name;
  215.     for (; or != NULLOR; or = or -> or_next) {
  216.         switch (or -> or_type) {
  217.             case OR_OU1:
  218.             case OR_OU2:
  219.             case OR_OU3:
  220.             case OR_OU4:
  221.             or -> or_type = OR_OU;
  222.             default:
  223.             break;
  224.         }
  225.  
  226.         switch (or -> or_encoding) {
  227.             case OR_ENC_PS:
  228.             if (!or_str_isps (or -> or_value)) {
  229.                 if ((name = or_type2name (or -> or_type)) != NULLCP)
  230.                     (void) sprintf (buf, "Attribute %s=%s is not a Printable String",
  231.                             name,
  232.                             or -> or_value);
  233.                 else
  234.                     (void) sprintf (buf, "Attribute %d=%s is not a Printable String",
  235.                             or -> or_type,
  236.                             or -> or_value);
  237.                 return NOTOK;
  238.             }
  239.             break;
  240.             case OR_ENC_NUM:
  241.             if (!or_str_isns (or -> or_value)) {
  242.                 if ((name = or_type2name (or -> or_type)) != NULLCP)
  243.                     (void) sprintf (buf, "Attribute %s=%s in not a Numeric String",
  244.                             name,
  245.                             or -> or_value);
  246.                 else
  247.                     (void) sprintf (buf, "Attribute %d=%s in not a Numeric String",
  248.                             or -> or_type,
  249.                             or -> or_value);
  250.                 return NOTOK;
  251.             }
  252.             break;
  253.             case OR_ENC_TTX:
  254.             case OR_ENC_TTX_AND_OR_PS:
  255.             case OR_ENC_INT:
  256.             case OR_ENC_PSAP:
  257.             default:
  258.             break;
  259.         }
  260.     }
  261.     return OK;
  262. }
  263.  
  264. /*   */
  265.  
  266. void or_chk_admd (or)
  267. OR_ptr    *or;
  268. {
  269.     OR_ptr    ptr;
  270.     
  271.     if ((ptr = or_find (*or, OR_ADMD, NULLCP)) == NULLOR) {
  272.         if (or_find (*or, OR_C, NULLCP) != NULLOR
  273.             && or_find (*or, OR_PRMD, NULLCP) != NULLOR)
  274.             *or = or_add (*or,
  275.                       or_new (OR_ADMD, " ", " "),
  276.                       TRUE);
  277.     } else if (ptr -> or_value == NULLCP
  278.            || *(ptr -> or_value) == '\0') {
  279.         if (ptr -> or_value)
  280.             free (ptr -> or_value);
  281.         ptr -> or_value = strdup(" ");
  282.     }
  283. }
  284.