220 lines
4.4 KiB
C++
220 lines
4.4 KiB
C++
#define Use_MsgBase
|
|
|
|
#include <ctype.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "proboard.hpp"
|
|
|
|
File FileArea::f;
|
|
int FileArea::lastAreaNum = -1;
|
|
int FileArea::numAreas = -1;
|
|
|
|
FileArea *FileArea::lastArea = NULL;
|
|
|
|
void
|
|
FileArea::open()
|
|
{
|
|
if(!f.opened())
|
|
{
|
|
if(!f.open(FileName(syspath,"FILECFG.PRO"),fmode_read,cfg.fastmode ? BUFSIZE_FAST:BUFSIZE_SLOW))
|
|
file_error("FILECFG.PRO");
|
|
|
|
numAreas = int(f.len() / sizeof(_FileArea));
|
|
}
|
|
}
|
|
|
|
bool
|
|
FileArea::read(int a)
|
|
{
|
|
open();
|
|
|
|
if(a<1 || a>numAreas) return FALSE;
|
|
|
|
if(lastArea == NULL)
|
|
{
|
|
lastArea = new FileArea;
|
|
lastAreaNum = -1;
|
|
}
|
|
|
|
if(a != lastAreaNum)
|
|
{
|
|
f.seek(long(a-1) * sizeof(_FileArea));
|
|
|
|
if( f.read(lastArea,sizeof(_FileArea)) != sizeof(_FileArea)
|
|
|| lastArea->name[0] == '\0' )
|
|
{
|
|
lastAreaNum = -1;
|
|
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
(*this) = (*lastArea);
|
|
|
|
|
|
append_backspace(filepath);
|
|
|
|
strip_trailing( listpath );
|
|
strip_leading( listpath );
|
|
|
|
if(listpath[0] == '\0')
|
|
{
|
|
strcpy(listpath , filepath);
|
|
strcat(listpath , "FILES.BBS");
|
|
}
|
|
|
|
lastAreaNum = a;
|
|
|
|
areaNum = a;
|
|
|
|
strip_trailing( name );
|
|
strip_leading( name );
|
|
|
|
return (name[0]) ? TRUE:FALSE;
|
|
}
|
|
|
|
void
|
|
FileArea::close()
|
|
{
|
|
f.close();
|
|
|
|
if(lastArea != NULL) delete lastArea;
|
|
|
|
lastAreaNum = -1;
|
|
numAreas = -1;
|
|
lastArea = NULL;
|
|
}
|
|
|
|
int
|
|
FileArea::highAreaNum()
|
|
{
|
|
open();
|
|
|
|
return numAreas;
|
|
}
|
|
|
|
void
|
|
create_arealist(String param[],int numpara,BitArray& arealist,bool msgareas)
|
|
{
|
|
FileArea fa;
|
|
MsgArea ma;
|
|
int MAX;
|
|
|
|
if(msgareas)
|
|
MAX = MsgArea::highAreaNum();
|
|
else
|
|
MAX = FileArea::highAreaNum();
|
|
|
|
for(int i=0;i<numpara;i++)
|
|
{
|
|
char *ptr=param[i];
|
|
int incl=1,offset=0;
|
|
int kindfilter = 0;
|
|
|
|
if(ptr[0]=='/') continue;
|
|
|
|
if(ptr[0]=='-') { incl=0; offset=1; }
|
|
if(ptr[0]=='+') { incl=1; offset=1; }
|
|
|
|
switch(toupper(ptr[offset]))
|
|
{
|
|
case 'E': kindfilter = MSG_ECHO; break;
|
|
case 'N': kindfilter = MSG_NET; break;
|
|
case 'L': kindfilter = MSG_LOCAL; break;
|
|
}
|
|
|
|
switch(toupper(ptr[offset]))
|
|
{
|
|
case '*':
|
|
{
|
|
for(int j=1;j<=MAX;j++)
|
|
if(incl)
|
|
arealist.set(j);
|
|
else
|
|
arealist.clear(j);
|
|
}
|
|
break;
|
|
|
|
case 'C':
|
|
{
|
|
if(msgareas) break;
|
|
|
|
for(int j=1;j<=MAX;j++)
|
|
{
|
|
if(fa.read(j))
|
|
if(fa.cdrom)
|
|
if(incl)
|
|
arealist.set(j);
|
|
else
|
|
arealist.clear(j);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 'X':
|
|
{
|
|
if(msgareas)
|
|
{
|
|
if(incl)
|
|
arealist.set(user.msgArea);
|
|
else
|
|
arealist.clear(user.msgArea);
|
|
}
|
|
else
|
|
{
|
|
if(incl)
|
|
arealist.set(user.fileArea);
|
|
else
|
|
arealist.clear(user.fileArea);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 'N':
|
|
case 'L':
|
|
case 'E':
|
|
{
|
|
if(!msgareas) break;
|
|
|
|
for(int j=1;j<=MAX;j++)
|
|
{
|
|
if(ma.read(j))
|
|
if(ma.msgKind == kindfilter)
|
|
if(incl)
|
|
arealist.set(j);
|
|
else
|
|
arealist.clear(j);
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
{
|
|
if(strchr(ptr+offset,'-'))
|
|
{
|
|
int from = atoi(strtok(ptr+offset,"-"));
|
|
int to = atoi(strtok(NULL,"-"));
|
|
|
|
for(int j=from;j<=to;j++)
|
|
{
|
|
if(incl)
|
|
arealist.set(j);
|
|
else
|
|
arealist.clear(j);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int j = atoi(ptr+offset);
|
|
|
|
if(incl)
|
|
arealist.set(j);
|
|
else
|
|
arealist.clear(j);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|