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

  1. /* parsebr.c: */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Uip/rcvalert/RCS/parsesbr.c,v 6.0 1991/12/18 20:39:41 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Uip/rcvalert/RCS/parsesbr.c,v 6.0 1991/12/18 20:39:41 jpo Rel $
  9.  *
  10.  * $Log: parsesbr.c,v $
  11.  * Revision 6.0  1991/12/18  20:39:41  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include <util.h>
  19. #include <ctype.h>
  20. #include "ap.h"
  21. #include "chan.h"
  22.  
  23. #define MAXFIELDS 100
  24.  
  25. struct fields {
  26.     char    *name;
  27.     int    nlen;
  28.     int    len;
  29.     int    start;
  30.     int    finish;
  31.     int    flags;
  32. #define PARSE_FROM    1
  33. #define PARSE_BODY    2
  34. #define PARSE_SIZE    3
  35. #define PARSE_EXTRA    4
  36.     char    *value;
  37. } fields[MAXFIELDS];
  38.  
  39. int    nfields = 0;
  40.  
  41. parse_msg (displayline, from, format, maxlen, msgsize, extra)
  42. char    *displayline;
  43. char     *from;
  44. char    *format;
  45. int    maxlen;
  46. int    msgsize;
  47. char    *extra;
  48. {
  49.     char    buf[BUFSIZ], buf2[BUFSIZ], *cp;
  50.     struct fields *fp;
  51.     int n;
  52.  
  53.     break_fields (format);
  54.  
  55.     while (fgets (buf, sizeof buf, stdin) != NULL) {
  56.         if (buf[0] == '\n')
  57.             break;
  58.         if (lexnequ (buf, "from:", 5) == 0)
  59.             fillin_from (from, buf);
  60.         for (fp = fields; fp < &fields[nfields]; fp++)
  61.             if (lexnequ (buf, fp -> name, fp -> nlen) == 0) {
  62.                 compress (buf + fp -> nlen + 1, buf2);
  63.                 fp -> value = strdup (buf2);
  64.                 break;
  65.             }
  66.     }
  67.  
  68.     buf[0] = NULL;
  69.     n = fread (buf, 1, sizeof buf, stdin);
  70.     buf[n] = NULL;
  71.     for (cp = buf; *cp; cp++) {
  72.         if (*cp == '\n')
  73.             *cp = ' ';
  74.     }
  75.     compress (buf, buf);
  76.     
  77.     for (fp = fields; fp < &fields[nfields]; fp++) {
  78.         if (fp -> value == NULLCP)
  79.             fp -> value = "";
  80.         if (fp -> flags == PARSE_FROM) {
  81.             if ((cp = index (fp -> value, '<'))) {
  82.                 *cp = '\0';
  83.                 compress (fp -> value, fp -> value);
  84.             }
  85.         }
  86.         else if (fp -> flags == PARSE_BODY)
  87.             fp -> value = strdup (buf);
  88.         else if (fp -> flags == PARSE_SIZE) {
  89.             (void) sprintf (buf2, "%d", msgsize);
  90.             fp -> value = strdup (buf2);
  91.         }
  92.         else if (fp -> flags == PARSE_EXTRA)
  93.             fp -> value = extra;
  94.     }
  95.  
  96.     build_string (format, displayline);
  97.     displayline[maxlen] = 0;
  98. }
  99.  
  100. break_fields (str)
  101. char    *str;
  102. {
  103.     char    *cp, *p;
  104.     struct fields *fp;
  105.     char buf[BUFSIZ];
  106.  
  107.     if (str == NULL)
  108.         return;
  109.     for (cp = str; *cp; ) {
  110.         if (*cp++ != '%')
  111.             continue;
  112.         if (*cp == '%') {
  113.             cp ++;
  114.             continue;
  115.         }
  116.         fp = &fields[nfields++];
  117.         if (nfields >= MAXFIELDS)
  118.             nfields --;
  119.         fp -> start = cp - str - 1;
  120.         if (isdigit (*cp)) {
  121.             int n = 0;
  122.             while (isdigit (*cp)) 
  123.                 n = n * 10 + *cp++ - '0';
  124.             fp -> len = n;
  125.         }
  126.  
  127.         for (p = cp; isalpha(*p) || *p == '-'; p++)
  128.             continue;
  129.         if (cp == p) {
  130.             nfields --; 
  131.             continue;
  132.         }
  133.         (void) strncpy (buf, cp, p -cp);
  134.         buf[p - cp] = 0;
  135.         fp -> name = strdup (buf);
  136.         fp -> nlen = strlen (buf);
  137.  
  138.         if(lexequ (buf, "from") == 0)
  139.             fp -> flags = PARSE_FROM;
  140.         else if (lexequ (buf, "body") == 0)
  141.             fp -> flags = PARSE_BODY;
  142.         else if (lexequ (buf, "size") == 0)
  143.             fp -> flags = PARSE_SIZE;
  144.         else if (lexequ (buf, "extra") == 0)
  145.             fp -> flags = PARSE_EXTRA;
  146.         cp = p;
  147.         fp -> finish = cp - str;
  148.     }
  149. }
  150.  
  151. build_string (format, dest)
  152. char    *format;
  153. char    *dest;
  154. {
  155.     char    *cp;
  156.     int    last;
  157.     struct fields *fp;
  158.  
  159.     if (nfields == 0) {
  160.         (void) strcpy (dest, format);
  161.         return;
  162.     }
  163.     cp = dest;
  164.     last = 0;
  165.     for (fp = fields; fp < &fields[nfields]; fp ++) {
  166.         (void) strncpy (cp, format + last, fp -> start - last);
  167.         cp += fp -> start - last;
  168.  
  169.         if (fp -> len) {
  170.             int mlen;
  171.  
  172.             mlen = strlen (fp -> value);
  173.             if (fp -> len < mlen)
  174.                 mlen = fp -> len;
  175.  
  176.             (void) sprintf (cp, "%-*.*s", fp -> len,
  177.                     mlen, fp -> value);
  178.             
  179.             cp += strlen (cp);
  180.         }
  181.         else if (fp -> value) {
  182.             (void) strcpy (cp, fp -> value);
  183.             cp += strlen (fp -> value);
  184.         }
  185.         last = fp -> finish;
  186.     }
  187.     (void) strcpy (cp, format + last);
  188.     *cp = NULL;
  189. }
  190.  
  191. fillin_from (dest, line)
  192. char *dest, *line;
  193. {
  194.     char *dp;
  195.     char *cp = line + 5; /* skip over from: */
  196.     AP_ptr mbox, domain, tree;
  197.  
  198.  
  199.     dest[0] = 0;
  200.  
  201.     if (ap_s2p (cp, &tree, NULLAPP, NULLAPP,
  202.             &mbox, &domain, NULLAPP) == (char *)NOTOK)
  203.         return;
  204. #ifdef UKORDER
  205.     if (ap_dmnormalize (domain, CH_UK_PREF) != OK) {
  206. #else
  207.     if (ap_dmnormalize (domain, CH_USA_PREF) != OK) {
  208. #endif
  209.         ap_sqdelete (tree, NULLAP);
  210.         ap_free (tree);
  211.         return;
  212.     }
  213.  
  214.     dp = ap_p2s_nc (NULLAP, NULLAP, mbox, domain, NULLAP);
  215.     if (dp != (char *)NOTOK && isstr(dp))
  216.         (void) strcpy (dest, dp);
  217.     ap_sqdelete (tree, NULLAP);
  218.     ap_free (tree);
  219.     free (dp);
  220. }
  221.