home *** CD-ROM | disk | FTP | other *** search
/ back2roots/padua / padua.7z / padua / uucp / duucp-1.17 / AU-117b4-src.lha / src / util / from.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-24  |  2.6 KB  |  175 lines

  1. /*
  2.  *  FROM.C
  3.  *
  4.  *  FROM [user]
  5.  *
  6.  *  Displays From: and Subject fields, attempts to find personal name
  7.  *  in From: field.  If user not specified searches UULIB:Config
  8.  *  for UserName.
  9.  */
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14.  
  15. #include "config.h"
  16. #include "version.h"
  17.  
  18. IDENT (".06");
  19.  
  20. Local void FromUser (char *);
  21. Local char *ExtractPersonalName (char *);
  22.  
  23. int
  24.     _bufsiz = 8192;
  25.  
  26. int
  27. main (int ac, char **av)
  28. {
  29.     char
  30.         haduser = 0;
  31.     int
  32.         i;
  33.  
  34.     for (i = 1; i < ac; ++i) {
  35.         if (av [i] [0] != '-') {
  36.             haduser = 1;
  37.             FromUser (av [i]);
  38.         }
  39.     }
  40.  
  41.     if (haduser == 0) {
  42.         char
  43.             *user;
  44.  
  45.         if (user = GetUserName ()) {
  46.             FromUser (user);
  47.         }
  48.         else {
  49.             printf ("%s, no 'UserName' entry!\n", MakeConfigPath (UULIB, "Config"));
  50.             exit (30);
  51.         }
  52.     }
  53.  
  54.     exit (0);
  55. }
  56.  
  57. void
  58. FromUser (char *user)
  59. {
  60.     static char
  61.         Buf [256],
  62.         FromLine [256],
  63.         SubjLine [256];
  64.     char
  65.         *file = malloc (strlen (user) + 32),
  66.         *fromstr,
  67.         *p;
  68.     FILE
  69.         *fi;
  70.     long
  71.         msgno = 0;
  72.  
  73.     strcpy (file, MakeConfigPath (UUMAIL, user));
  74.     if (fi = fopen (file, "r")) {
  75.         while (fgets (Buf, 256, fi)) {
  76.  
  77.             /*
  78.              *  Start of message
  79.              */
  80.  
  81.             if (strncmp (Buf, "From ", 5))
  82.                 continue;
  83.  
  84.             ++msgno;
  85.  
  86.             /*
  87.              *  Scan headers for From: and Subject:
  88.              *  Headers end with a blank line.
  89.              */
  90.  
  91.             FromLine [0] = 0;
  92.             SubjLine [0] = '\n';
  93.             SubjLine [1] = 0;
  94.  
  95.             while (fgets (Buf, 256, fi) && Buf [0] != '\n') {
  96.                 if (strncmp (Buf, "From:", 5) == 0)
  97.                     strcpy (FromLine, Buf + 5);
  98.                 if (strncmp (Buf, "Subject:", 8) == 0)
  99.                     strcpy (SubjLine, Buf + 8);
  100.             }
  101.  
  102.             fromstr = ExtractPersonalName (FromLine);
  103.  
  104.             /* make sure output will be "pretty" */
  105.             if (p = strchr (fromstr, '\n'))
  106.                 *p = '\0';
  107.             if (p = strchr (SubjLine, '\n'))
  108.                 *p = '\0';
  109.  
  110.             printf ("%-4d %-25.25s  %-45.45s\n",
  111.                 msgno, fromstr, SubjLine);
  112.         }
  113.     }
  114.  
  115.     return;
  116. }
  117.  
  118. /*
  119.  *  Search for (name) or name <addr> or <addr> name
  120.  */
  121.  
  122. char *
  123. ExtractPersonalName (char *str)
  124. {
  125.     char
  126.         *p1,
  127.         *p2,
  128.         sp = 1;
  129.  
  130.     for (p1 = str; *p1; ++p1) {
  131.         if (*p1 == '<') {
  132.             if (sp == 0) {        /*    name before <addr>  */
  133.                 p2 = p1 - 1;
  134.                 p1 = str;
  135.                 break;
  136.             }
  137.  
  138.             /*  name after <addr>    */
  139.             while (*p1 && *p1 != '>')
  140.                 ++p1;
  141.             if (*p1 == '>')
  142.                 ++p1;
  143.             p2 = str + strlen (str) - 1;
  144.             break;
  145.         }
  146.  
  147.         if (*p1 == '(') {
  148.             ++p1;
  149.             for (p2 = p1; *p2 && *p2 != ')'; ++p2);
  150.             if (*p2 == ')')
  151.                 --p2;
  152.             break;
  153.         }
  154.  
  155.         if (*p1 != ' ' && *p1 != '\t')
  156.             sp = 0;
  157.     }
  158.  
  159.     if (*p1 == 0) { /*  could find a personal name! */
  160.         p1 = str;
  161.         p2 = str + strlen (str) - 1;
  162.     }
  163.  
  164.     while (p2 >= p1 && (*p2 == '\n' || *p2 == ' ' || *p2 == '\t'))
  165.         --p2;
  166.     ++p2;
  167.  
  168.     if (p2 < p1)
  169.         p2 = p1;
  170.  
  171.     *p2 = 0;
  172.  
  173.     return p1;
  174. }
  175.