home *** CD-ROM | disk | FTP | other *** search
/ back2roots/padua / padua.7z / padua / uucp / auucp+-1.02 / fuucp_plus_src.lzh / util / from.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-11-21  |  2.6 KB  |  142 lines

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