home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 341b.lha / uucp1_v1.03d / src / MUtil / from.c < prev    next >
C/C++ Source or Header  |  1990-01-28  |  2KB  |  137 lines

  1.  
  2. /*
  3.  *  FROM.C
  4.  *
  5.  *  FROM [user]
  6.  *
  7.  *  Displays From: and Subject fields, attempts to find personal name
  8.  *  in From: field.  If user not specified searches UULIB:Config
  9.  *  for UserName.
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <config.h>
  15. #include "/version.h"
  16.  
  17. IDENT(".00");
  18.  
  19. void FromUser();
  20. char *ExtractPersonalName();
  21.  
  22. void
  23. main(ac, av)
  24. char *av[];
  25. {
  26.     char haduser = 0;
  27.     short i;
  28.  
  29.     for (i = 1; i < ac; ++i) {
  30.     if (av[i][0] != '-') {
  31.         haduser = 1;
  32.         FromUser(av[i]);
  33.     }
  34.     }
  35.     if (haduser == 0) {
  36.     char *user;
  37.     if (user = FindConfig(USERNAME))
  38.         FromUser(user);
  39.     else
  40.         printf("UULIB:Config, no 'UserName' entry!\n");
  41.     }
  42. }
  43.  
  44. void
  45. FromUser(user)
  46. char *user;
  47. {
  48.     static char Buf[256];
  49.     static char FromLine[256];
  50.     static char SubjLine[256];
  51.     char *file = malloc(strlen(user) + 32);
  52.     char *fromstr;
  53.     FILE *fi;
  54.  
  55.     sprintf(file, "UUMAIL:%s", user);
  56.     if (fi = fopen(file, "r")) {
  57.     while (fgets(Buf, 256, fi)) {
  58.  
  59.         /*
  60.          *    Start of message
  61.          */
  62.  
  63.         if (strncmp(Buf, "From ", 5) != 0)
  64.         continue;
  65.  
  66.         /*
  67.          *    Scan headers for From: and Subject:
  68.          *    Headers end with a blank line.
  69.          */
  70.  
  71.         FromLine[0] = 0;
  72.         SubjLine[0] = '\n';
  73.         SubjLine[1] = 0;
  74.  
  75.         while (fgets(Buf, 256, fi) && Buf[0] != '\n') {
  76.         if (strncmp(Buf, "From:", 5) == 0)
  77.             strcpy(FromLine, Buf + 5);
  78.         if (strncmp(Buf, "Subject:", 8) == 0)
  79.             strcpy(SubjLine, Buf + 8);
  80.         }
  81.  
  82.         fromstr = ExtractPersonalName(FromLine);
  83.         printf("%-20s %s", fromstr, SubjLine);
  84.     }
  85.     }
  86. }
  87.  
  88. /*
  89.  *  Search for (name) or name <addr> or <addr> name
  90.  */
  91.  
  92. char *
  93. ExtractPersonalName(str)
  94. char *str;
  95. {
  96.     char *p1, *p2;
  97.     char sp = 1;
  98.  
  99.     for (p1 = str; *p1; ++p1) {
  100.     if (*p1 == '<') {
  101.         if (sp == 0) {      /*  name before <addr>  */
  102.         p2 = p1 - 1;
  103.         p1 = str;
  104.         break;
  105.         }
  106.                 /*  name after <addr>    */
  107.         while (*p1 && *p1 != '>')
  108.         ++p1;
  109.         if (*p1 == '>')
  110.         ++p1;
  111.         p2 = str + strlen(str) - 1;
  112.         break;
  113.     }
  114.     if (*p1 == '(') {
  115.         ++p1;
  116.         for (p2 = p1; *p2 && *p2 != ')'; ++p2);
  117.         if (*p2 == ')')
  118.         --p2;
  119.         break;
  120.     }
  121.     if (*p1 != ' ' && *p1 != 9)
  122.         sp = 0;
  123.     }
  124.     if (*p1 == 0) { /*  could find a personal name! */
  125.     p1 = str;
  126.     p2 = str + strlen(str) - 1;
  127.     }
  128.     while (p2 >= p1 && (*p2 == '\n' || *p2 == ' ' || *p2 == 9))
  129.     --p2;
  130.     ++p2;
  131.     if (p2 < p1)
  132.     p2 = p1;
  133.     *p2 = 0;
  134.     return(p1);
  135. }
  136.  
  137.