home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 1
/
crawlyvol1.bin
/
bbs
/
readmsg
/
readmsg.cc
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-24
|
4KB
|
174 lines
#include <iostream.h>
#include <stddef.h>
#include <stdlib.h>
#include <xstring.h>
#include <ctype.h>
#define BUFSIZE 32768L
#define MSG_Private 1
#define MSG_Crash 2
#define MSG_Recvd 4
#define MSG_Sent 8
#define MSG_File 16
#define MSG_Fwd 32
#define MSG_Unknown 64
#define MSG_K_S 128
#define MSG_Local 256
#define MSG_Hold 512
#define MSG_Del 32768
typedef struct {
char from[36], /* User who created msg */
to[36], /* User who may read msg */
topic[72], /* Topic of msg */
time[20]; /* Date/Time string of message */
int create, /* Date when MSGS was received */
Mstart; /* Start offset of message */
short
up, /* NC */
parent, /* Parent # of this msg */
flags, /* Attribute bits */
mailer[8], /* needed for the mailer */
size, /* # bytes in message */
reads, /* Number of times read */
cost, /* Cost of message*100 */
Ozone,Onet, /* Net on which msg was created */
Onode, /* Node on which msg was created */
Opoint,
Dzone,Dnet, /* Destination net for msg */
Dnode, /* Destination node for msg */
Dpoint;
} MSGHEADER;
short upperCase=0;
char upTransTable[256];
void set_Regex(Regex* &r, char *str)
{
if(r) delete r;
if(!upperCase)
r = new Regex(str, 1);
else r = new Regex(str, 1, 40, upTransTable);
}
int main(int argc, char * argv[])
{
String hdrName, msgName, ErrorList= (String)argv[0] + ": ";
char *buf;
FILE *hdrFile, *msgFile;
MSGHEADER hdr;
size_t bufSize=0;
short i, plusKilled=0, errors=0;
Regex *rFrom=0, *rTo=0, *rSubject=0, *rText=0;
for(i=0; i<256; i++)
upTransTable[i]= (isalpha(i) && islower(i)) ? _toupper(i) : i;
if( argc>=2 )
{
i=2;
while(i<argc)
{
if(strlen(argv[i])==2)
switch( argv[i][0] )
{
case '-' :
switch( argv[i][1] )
{
case 'f' :
set_Regex(rFrom, argv[++i]); break;
case 't' :
set_Regex(rTo, argv[++i]); break;
case 's' :
set_Regex(rSubject, argv[++i]); break;
case 'T' :
set_Regex(rText, argv[++i]); break;
case 'U' :
upperCase = 1; break;
default :
ErrorList = ErrorList + "illegal Switch \"" + argv[i] + "\"\n\t";
errors++;
}
break;
case '+' :
if(argv[i][1]=='k') plusKilled=1;
else
{
ErrorList = ErrorList + "illegal Switch \"" + argv[i] + "\"\n\t";
errors++;
}
break;
default :
ErrorList = ErrorList + "illegal Argument \"" + argv[i] + "\"\n\t";
errors++;
}
else
{
ErrorList = ErrorList + "illegal Argument \"" + argv[i] + "\"\n\t";
errors++;
}
i++;
}
if(errors==0)
{
hdrName=(String)argv[1] + ".hdr";
msgName=(String)argv[1] + ".msg";
if( hdrFile=fopen(hdrName, "rb" ) )
{
setvbuf(hdrFile, NULL, _IOFBF, BUFSIZE);
if( msgFile=fopen(msgName, "rb" ) )
{
setvbuf(msgFile, NULL, _IOFBF, 8192L);
buf = malloc(BUFSIZE);
bufSize = BUFSIZE;
while(1==fread(&hdr, sizeof(MSGHEADER), 1, hdrFile))
{
if( (plusKilled || !(hdr.flags & MSG_Del)) &&
(rFrom ? String(hdr.from ).matches(*rFrom ) : 1) &&
(rTo ? String(hdr.to ).matches(*rTo ) : 1) &&
(rSubject ? String(hdr.topic).matches(*rSubject) : 1) )
{
fseek(msgFile, hdr.Mstart, 0);
if(hdr.size>bufSize) {
free(buf);
buf = malloc(hdr.size);
bufSize = hdr.size;
}
fread(buf, hdr.size+1, 1, msgFile);
if( rText ? String(buf).contains(*rText) : 1 )
{
cout << "\002From: " << hdr.from << endl;
cout << "To: " << hdr.to << endl;
cout << "Subj: " << hdr.topic << endl;
cout << endl;
cout.write(buf, hdr.size+1);
}
}
}
free(buf);
}
fclose(hdrFile);
}
}
else
{
cerr << ErrorList << errors << " Fehler..\n";
cerr << "\tUsage: readmsg [-f FromPattern] [-t ToPattern] [-T TextPattern] [-s SubjectPattern] [+k]\n";
}
if(rFrom ) delete rFrom;
if(rTo ) delete rTo;
if(rSubject) delete rSubject;
}
return 0;
}