home *** CD-ROM | disk | FTP | other *** search
- /*
- * FROM.C
- *
- * FROM [user]
- *
- * Displays From: and Subject fields, attempts to find personal name
- * in From: field. If user not specified searches UULIB:Config
- * for UserName.
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- #include "config.h"
- #include "version.h"
-
- IDENT (".06");
-
- Local void FromUser (char *);
- Local char *ExtractPersonalName (char *);
-
- int
- _bufsiz = 8192;
-
- int
- main (int ac, char **av)
- {
- char
- haduser = 0;
- int
- i;
-
- for (i = 1; i < ac; ++i) {
- if (av [i] [0] != '-') {
- haduser = 1;
- FromUser (av [i]);
- }
- }
-
- if (haduser == 0) {
- char
- *user;
-
- if (user = GetUserName ()) {
- FromUser (user);
- }
- else {
- printf ("%s, no 'UserName' entry!\n", MakeConfigPath (UULIB, "Config"));
- exit (30);
- }
- }
-
- exit (0);
- }
-
- void
- FromUser (char *user)
- {
- static char
- Buf [256],
- FromLine [256],
- SubjLine [256];
- char
- *file = malloc (strlen (user) + 32),
- *fromstr,
- *p;
- FILE
- *fi;
- long
- msgno = 0;
-
- strcpy (file, MakeConfigPath (UUMAIL, user));
- if (fi = fopen (file, "r")) {
- while (fgets (Buf, 256, fi)) {
-
- /*
- * Start of message
- */
-
- if (strncmp (Buf, "From ", 5))
- continue;
-
- ++msgno;
-
- /*
- * Scan headers for From: and Subject:
- * Headers end with a blank line.
- */
-
- FromLine [0] = 0;
- SubjLine [0] = '\n';
- SubjLine [1] = 0;
-
- while (fgets (Buf, 256, fi) && Buf [0] != '\n') {
- if (strncmp (Buf, "From:", 5) == 0)
- strcpy (FromLine, Buf + 5);
- if (strncmp (Buf, "Subject:", 8) == 0)
- strcpy (SubjLine, Buf + 8);
- }
-
- fromstr = ExtractPersonalName (FromLine);
-
- /* make sure output will be "pretty" */
- if (p = strchr (fromstr, '\n'))
- *p = '\0';
- if (p = strchr (SubjLine, '\n'))
- *p = '\0';
-
- printf ("%-4d %-25.25s %-45.45s\n",
- msgno, fromstr, SubjLine);
- }
- }
-
- return;
- }
-
- /*
- * Search for (name) or name <addr> or <addr> name
- */
-
- char *
- ExtractPersonalName (char *str)
- {
- char
- *p1,
- *p2,
- sp = 1;
-
- for (p1 = str; *p1; ++p1) {
- if (*p1 == '<') {
- if (sp == 0) { /* name before <addr> */
- p2 = p1 - 1;
- p1 = str;
- break;
- }
-
- /* name after <addr> */
- while (*p1 && *p1 != '>')
- ++p1;
- if (*p1 == '>')
- ++p1;
- p2 = str + strlen (str) - 1;
- break;
- }
-
- if (*p1 == '(') {
- ++p1;
- for (p2 = p1; *p2 && *p2 != ')'; ++p2);
- if (*p2 == ')')
- --p2;
- break;
- }
-
- if (*p1 != ' ' && *p1 != '\t')
- sp = 0;
- }
-
- if (*p1 == 0) { /* could find a personal name! */
- p1 = str;
- p2 = str + strlen (str) - 1;
- }
-
- while (p2 >= p1 && (*p2 == '\n' || *p2 == ' ' || *p2 == '\t'))
- --p2;
- ++p2;
-
- if (p2 < p1)
- p2 = p1;
-
- *p2 = 0;
-
- return p1;
- }
-