home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Spezial / SPEZIAL2_97.zip / SPEZIAL2_97.iso / ANWEND / ONLINE / ELM23-2 / ELM23-2.ZIP / filter / summarize.c < prev    next >
C/C++ Source or Header  |  1990-04-28  |  6KB  |  175 lines

  1.  
  2. static char rcsid[] ="@(#)$Id: summarize.c,v 4.1 90/04/28 22:42:02 syd Exp $";
  3.  
  4. /*******************************************************************************
  5.  *  The Elm Mail System  -  $Revision: 4.1 $   $State: Exp $
  6.  *
  7.  *             Copyright (c) 1986, 1987 Dave Taylor
  8.  *             Copyright (c) 1988, 1989, 1990 USENET Community Trust
  9.  *******************************************************************************
  10.  * Bug reports, patches, comments, suggestions should be sent to:
  11.  *
  12.  *    Syd Weinstein - elm@DSI.COM
  13.  *            dsinc!elm
  14.  *
  15.  *******************************************************************************
  16.  * $Log:    summarize.c,v $
  17.  * Revision 4.1  90/04/28  22:42:02  syd
  18.  * checkin of Elm 2.3 as of Release PL0
  19.  *
  20.  *
  21.  ******************************************************************************/
  22.  
  23. /** This routine is called from the filter program (or can be called
  24.     directly with the correct arguments) and summarizes the users filterlog
  25.     file.  To be honest, there are two sorts of summaries that are
  26.     available - either the '.filterlog' file can be output (filter -S)
  27.     or a summary by rule and times acted upon can be output (filter -s).
  28.     Either way, this program will delete the two associated files each
  29.     time ($HOME/.filterlog and $HOME/.filtersum) *if* the -c option is
  30.     used to the program (e.g. clear_logs is set to TRUE).
  31.  
  32. **/
  33.  
  34. #include <stdio.h>
  35.  
  36. #include "defs.h"
  37.  
  38. #include "filter.h"
  39.  
  40. show_summary()
  41. {
  42.     /* Summarize usage of the program... */
  43.  
  44.     FILE   *fd;                /* for output to temp file! */
  45.     char filename[SLEN],            /* name of the temp file    */
  46.          buffer[SLEN];            /* input buffer space       */
  47.     int  erroneous_rules = 0,
  48.          default_rules   = 0,
  49.          messages_filtered = 0,        /* how many have we touched? */
  50.          rule,
  51.          applied[MAXRULES];
  52.  
  53.     sprintf(filename, "%s/%s", home, filtersum);
  54.  
  55.     if ((fd = fopen(filename, "r")) == NULL) {
  56.       if (outfd != NULL)
  57.         fprintf(outfd,"filter (%s): Can't open filtersum file %s!\n",
  58.  
  59.             username, filename);
  60.       if (outfd != NULL) fclose(outfd);
  61.       exit(1);
  62.     }
  63.  
  64.     for (rule=0;rule < MAXRULES; rule++)
  65.       applied[rule] = 0;            /* initialize it all! */
  66.  
  67.     /** Next we need to read it all in, incrementing by which rule
  68.         was used.  The format is simple - each line represents a
  69.         single application of a rule, or '-1' if the default action
  70.         was taken.  Simple stuff, eh?  But oftentimes the best.
  71.     **/
  72.  
  73.     while (fgets(buffer, SLEN, fd) != NULL) {
  74.       if ((rule = atoi(buffer)) > total_rules || rule < -1) {
  75.         if (outfd != NULL)
  76.           fprintf(outfd,
  77.       "filter (%s): Warning - rule #%d is invalid data for short summary!!\n",
  78.                 username, rule);
  79.         erroneous_rules++;
  80.       }
  81.       else if (rule == -1)
  82.         default_rules++;
  83.       else
  84.         applied[rule]++;
  85.       messages_filtered++;
  86.     }
  87.  
  88.     fclose(fd);
  89.  
  90.     /** now let's summarize the data... **/
  91.  
  92.     if (outfd == NULL) return;        /* no reason to go further */
  93.  
  94.     fprintf(outfd,
  95.         "\n\t\t\tA Summary of Filter Activity\n");
  96.     fprintf(outfd,
  97.           "\t\t\t----------------------------\n\n");
  98.  
  99.     fprintf(outfd,"A total of %d message%s %s filtered:\n\n",
  100.         messages_filtered, plural(messages_filtered),
  101.         messages_filtered > 1 ? "were" : "was");
  102.  
  103.     if (erroneous_rules)
  104.       fprintf(outfd,
  105.               "[Warning: %d erroneous rule%s logged and ignored!]\n\n",
  106.            erroneous_rules, erroneous_rules > 1? "s were" : " was");
  107.  
  108.     if (default_rules) {
  109.        fprintf(outfd,
  110.  "The default rule of putting mail into your mailbox\n");
  111.        fprintf(outfd, "\tapplied %d time%s (%d%%)\n\n",
  112.            default_rules, plural(default_rules),
  113.            (default_rules*100+(messages_filtered>>1))/messages_filtered
  114.             );
  115.     }
  116.  
  117.      /** and now for each rule we used... **/
  118.  
  119.      for (rule = 0; rule < total_rules; rule++) {
  120.        if (applied[rule]) {
  121.           fprintf(outfd, "Rule #%d: ", rule+1);
  122.           switch (rules[rule].action) {
  123.           case LEAVE:        fprintf(outfd, "(leave mail in mailbox)");
  124.                     break;
  125.           case DELETE_MSG:  fprintf(outfd, "(delete message)");
  126.                     break;
  127.           case SAVE  :      fprintf(outfd, "(save in \"%s\")",
  128.                         rules[rule].argument2);        break;
  129.           case SAVECC:      fprintf(outfd,
  130.                         "(left in mailbox and saved in \"%s\")",
  131.                         rules[rule].argument2);        break;
  132.           case FORWARD:     fprintf(outfd, "(forwarded to \"%s\")",
  133.                         rules[rule].argument2);        break;
  134.           case EXEC  :      fprintf(outfd, "(given to command \"%s\")",
  135.                         rules[rule].argument2);        break;
  136.          }
  137.          fprintf(outfd, "\n\tapplied %d time%s (%d%%)\n\n",
  138.              applied[rule], plural(applied[rule]),
  139.                 (applied[rule]*100+(messages_filtered>>1))/messages_filtered
  140.             );
  141.       }
  142.     }
  143.  
  144.     if (long_summary) {
  145.  
  146.       /* next, after a ^L, include the actual log file... */
  147.  
  148.       sprintf(filename, "%s/%s", home, filterlog);
  149.  
  150.       if ((fd = fopen(filename, "r")) == NULL) {
  151.         fprintf(outfd,"filter (%s): Can't open filterlog file %s!\n",
  152.               username, filename);
  153.       }
  154.       else {
  155.         fprintf(outfd, "\n\n\n%c\n\nExplicit log of each action;\n\n",
  156.             (char) 12);
  157.         while (fgets(buffer, SLEN, fd) != NULL)
  158.           fprintf(outfd, "%s", buffer);
  159.         fprintf(outfd, "\n-----\n");
  160.         fclose(fd);
  161.       }
  162.     }
  163.  
  164.     /* now remove the log files, please! */
  165.  
  166.     if (clear_logs) {
  167.       sprintf(filename, "%s/%s", home, filterlog);
  168.       unlink(filename);
  169.       sprintf(filename, "%s/%s", home, filtersum);
  170.       unlink(filename);
  171.     }
  172.  
  173.     return;
  174. }
  175.