home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / bbs / readmsg / readmsg.cc < prev    next >
C/C++ Source or Header  |  1993-03-24  |  4KB  |  174 lines

  1. #include <iostream.h>
  2. #include <stddef.h>
  3. #include <stdlib.h>
  4. #include <xstring.h>
  5. #include <ctype.h>
  6.  
  7. #define BUFSIZE 32768L
  8.  
  9. #define MSG_Private    1
  10. #define MSG_Crash    2
  11. #define MSG_Recvd    4
  12. #define MSG_Sent    8
  13. #define MSG_File    16
  14. #define MSG_Fwd        32
  15. #define MSG_Unknown    64
  16. #define MSG_K_S        128
  17. #define MSG_Local    256
  18. #define MSG_Hold    512
  19. #define MSG_Del        32768
  20.  
  21. typedef struct {
  22.     char    from[36],            /* User who created msg              */
  23.            to[36],                /* User who may read msg               */
  24.             topic[72],            /* Topic of msg                     */
  25.             time[20];            /* Date/Time string of message        */
  26.     int    create,                /* Date when MSGS was received        */
  27.             Mstart;                /* Start offset of message            */
  28.     short
  29.             up,                    /* NC                                */
  30.             parent,                /* Parent # of this msg              */
  31.             flags,                /* Attribute bits                      */
  32.             mailer[8],            /* needed for the mailer             */
  33.             size,                /* # bytes in message                */
  34.             reads,                /* Number of times read              */
  35.             cost,                /* Cost of message*100               */
  36.             Ozone,Onet,            /* Net on which msg was created       */
  37.             Onode,                /* Node on which msg was created    */
  38.             Opoint,
  39.             Dzone,Dnet,            /* Destination net for msg           */
  40.             Dnode,                /* Destination node for msg           */
  41.             Dpoint;
  42.     } MSGHEADER;
  43.  
  44. short    upperCase=0;
  45. char    upTransTable[256];
  46.  
  47. void set_Regex(Regex* &r, char *str)
  48. {
  49.     if(r) delete r;
  50.     if(!upperCase)
  51.             r = new Regex(str, 1);
  52.     else    r = new Regex(str, 1, 40, upTransTable);
  53.  
  54. }
  55.  
  56. int main(int argc, char * argv[])
  57. {
  58.     String        hdrName, msgName, ErrorList= (String)argv[0] + ": ";
  59.     char            *buf;
  60.     FILE            *hdrFile, *msgFile;
  61.     MSGHEADER    hdr;
  62.     size_t        bufSize=0;
  63.     short            i, plusKilled=0, errors=0;
  64.     Regex            *rFrom=0, *rTo=0, *rSubject=0, *rText=0;
  65.  
  66.  
  67.     for(i=0; i<256; i++)
  68.         upTransTable[i]= (isalpha(i) && islower(i)) ? _toupper(i) : i;
  69.  
  70.     if( argc>=2 )
  71.     {
  72.         i=2;
  73.         while(i<argc)
  74.         {
  75.             if(strlen(argv[i])==2)
  76.                 switch( argv[i][0] )
  77.                 {
  78.                     case '-' :
  79.                         switch( argv[i][1] )
  80.                         {
  81.                             case 'f' :
  82.                                 set_Regex(rFrom,    argv[++i]); break;
  83.                             case 't' :
  84.                                 set_Regex(rTo,      argv[++i]); break;
  85.                             case 's' :
  86.                                 set_Regex(rSubject, argv[++i]); break;
  87.                             case 'T' :
  88.                                 set_Regex(rText,    argv[++i]); break;
  89.                             case 'U' :
  90.                                 upperCase = 1; break;
  91.                             default :
  92.                                 ErrorList = ErrorList + "illegal Switch \"" + argv[i] + "\"\n\t";
  93.                                 errors++;
  94.                         }
  95.                         break;
  96.                     case '+' :
  97.                         if(argv[i][1]=='k') plusKilled=1;
  98.                         else
  99.                         {
  100.                             ErrorList = ErrorList + "illegal Switch \"" + argv[i] + "\"\n\t";
  101.                             errors++;
  102.                         }
  103.                         break;
  104.                     default :
  105.                         ErrorList = ErrorList + "illegal Argument \"" + argv[i] + "\"\n\t";
  106.                         errors++;
  107.                 }
  108.                         
  109.             else
  110.             {
  111.                 ErrorList = ErrorList + "illegal Argument \"" + argv[i] + "\"\n\t";
  112.                 errors++;
  113.             }
  114.             i++;
  115.         }
  116.  
  117.         if(errors==0)
  118.         {
  119.             hdrName=(String)argv[1] + ".hdr";
  120.             msgName=(String)argv[1] + ".msg";
  121.     
  122.             if( hdrFile=fopen(hdrName, "rb" ) )
  123.             {
  124.                 setvbuf(hdrFile, NULL, _IOFBF, BUFSIZE);
  125.                 if( msgFile=fopen(msgName, "rb" ) )
  126.                 {
  127.                     setvbuf(msgFile, NULL, _IOFBF, 8192L);
  128.                     
  129.                     buf = malloc(BUFSIZE);
  130.                     bufSize = BUFSIZE;
  131.                     
  132.                     while(1==fread(&hdr, sizeof(MSGHEADER), 1, hdrFile))
  133.                     {
  134.                         if( (plusKilled || !(hdr.flags & MSG_Del)) &&
  135.                             (rFrom    ? String(hdr.from ).matches(*rFrom   ) : 1) &&
  136.                             (rTo      ? String(hdr.to   ).matches(*rTo     ) : 1) &&
  137.                             (rSubject ? String(hdr.topic).matches(*rSubject) : 1) )
  138.                         {
  139.                             fseek(msgFile, hdr.Mstart, 0);
  140.                             if(hdr.size>bufSize) {
  141.                                 free(buf);
  142.                                 buf = malloc(hdr.size);
  143.                                 bufSize = hdr.size;
  144.                             }
  145.                             fread(buf, hdr.size+1, 1, msgFile);
  146.                             if( rText ? String(buf).contains(*rText) : 1 )
  147.                             {
  148.                                 cout << "\002From: "    << hdr.from        << endl;
  149.                                 cout << "To: "            << hdr.to        << endl;
  150.                                 cout << "Subj: "        << hdr.topic    << endl;
  151.                                 cout << endl;
  152.                                 cout.write(buf, hdr.size+1);
  153.                             }
  154.                         }
  155.                     }
  156.                     
  157.                     free(buf);
  158.                 }
  159.                 fclose(hdrFile);
  160.             }
  161.         }
  162.         else
  163.         {
  164.             cerr << ErrorList << errors << " Fehler..\n";
  165.             cerr << "\tUsage: readmsg [-f FromPattern] [-t ToPattern] [-T TextPattern] [-s SubjectPattern] [+k]\n";
  166.         }
  167.         if(rFrom   ) delete rFrom;
  168.         if(rTo     ) delete rTo;
  169.         if(rSubject) delete rSubject;
  170.     }
  171.  
  172.     return 0;
  173. }
  174.