home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 15
/
CD_ASCQ_15_070894.iso
/
vrac
/
mflst10b.zip
/
MFLIST.C
< prev
next >
Wrap
C/C++ Source or Header
|
1994-01-08
|
19KB
|
661 lines
#include <conio.h>
#include <ctype.h>
#include <dir.h>
#include <dos.h>
#include <fcntl.h>
#include <io.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys\stat.h>
#define VERSION "v1.0ß"
#define TRUE 1
#define FALSE 0
/* directoryrec.mask */
#define mask_PD 0x0001
#define mask_no_uploads 0x0004
#define mask_archive 0x0008
#define mask_pending_batch 0x0010
#define mask_no_ratio 0x0020
#define mask_cdrom 0x0040
#define mask_filelist 0x0080 //Display in filelist
#define mask_specific 0x4000 //when someone u/l specifically
#define mask_extended 0x8000
/* DATA HELD FOR EVERY UPLOAD */
typedef struct {
char name[41], /* directory name */
filename[9], /* direct database filename */
path[81]; /* filename path */
unsigned char dsl, /* DSL for directory */
age; /* minimum age for directory */
unsigned short dar, /* DAR for directory */
maxfiles, /* max files for directory */
mask, /* file type mask */
type; /* 4 digit directory type */
} directoryrec;
typedef struct {
char filename[13], /* filename */
description[59], /* file description */
date[9], /* date u/l'ed */
upby[46]; /* name of upload user */
unsigned char filetype; /* file type for apples */
unsigned short numdloads, /* number times d/l'ed */
ownersys,ownerusr, /* who uploaded it */
mask; /* file type mask */
unsigned long daten, /* date uploaded */
numbytes; /* number bytes long file is */
} uploadsrec;
typedef struct {
char filename[13];
} filenamerec;
typedef struct {
char filename[13];
unsigned int size;
} extdescrec;
/**********************************************************************/
directoryrec dirrec[100];
uploadsrec ulrec;
unsigned int DescCount,ULREC_SIZE;
int done, UserWishesToExit=FALSE,winsizey;
int DirFileHandle, bytes, DirFileInnardsCount, DirFileSize,
NumOfFiles, MainDirFileHandle, dirnum;
FILE *filelist,*extfile,*headerfile;
struct date d;
struct time t;
char ModeQuiet,ModeConfig,ModeHelp,ModeClean;
char *month[] = {"---", "January", "February", "March", "April",
"May", "June", "July", "August", "September",
"October", "November", "December"};
char *Propering[] = {"st", "nd", "rd", "th"};
long totalnumfiles=0;
/**********************************************************************/
void myprintf(char *fmt, ...);
char *current_directory(char *path);
void printbar( long curi, long maxi );
char *filter(char *strg);
void CleanUpExtFile(char *ExtFile);
void DirFileList(directoryrec DirInfo);
void MainDirList( void );
void initscreen( void );
/**********************************************************************/
void myprintf(char *fmt, ...)
{
va_list ap;
char sm[256];
if(ModeQuiet==FALSE){
va_start(ap, fmt);
vsprintf(sm, fmt, ap);
va_end(ap);
cprintf(sm);
}
}
void printbar( long curi, long maxi )
{
long iki, levi, x;
if((curi==0x00) || (maxi==0x00)) {
levi=0;
if(curi==maxi) levi=50;
} else {
x = ((curi+1)*100)/maxi;
levi=x/2;
}
for(iki=1;iki<=levi;iki++) myprintf("█");
myprintf("%d%%",levi*2);
}
char *filter(char *strg)
{
static char sf[160];
int i,i2,i3;
for(i=0,i2=0;i<strlen(strg);i++) {
switch(strg[i]){
case 0x03: i++; break;
case 0x13: i+=2; break;
case '\r':
case '\n': sf[i2++]=0x00;
break;
case 0x09: for(i3=0;i3<5;i3++)
sf[i2++]=0x20;
break;
case '%' : sf[i2++]='%';
sf[i2++]='%';
break;
case 27 : if (strg[i+1]=='[')
while (!isalpha(strg[i++]))
;
break;
default : sf[i2++]=strg[i];
break;
}
}
sf[i2]=0x00;
return(sf);
}
void CleanUpExtFile(char *ExtFile)
{
int ExtFileHandle, TmpFileHandle, ebytes, nebytes, btowrite,
res, i, JustWroteIt;
long numbytes;
unsigned char buf1[2048], buf2[2048];
extdescrec ExtDescRec;
if ((ExtFileHandle = open(ExtFile,O_RDWR | O_BINARY , S_IWRITE | S_IREAD)) == -1)
{
cprintf(" ■ Error Opening Ext File [%s] _CleanUpExtFileName();\r\n",ExtFile);
exit(1);
}
if((TmpFileHandle = open("■■■■■■■■.■■■",O_RDWR | O_BINARY | O_CREAT, S_IWRITE | S_IREAD)) == -1)
{
cprintf(" ■ Error Opening [Temp] Ext File _CleanUpExtFileName();\r\n");
exit(1);
}
numbytes=filelength(ExtFileHandle);
ebytes=nebytes=0;
myprintf("%s file Clean-up Percent complete.\r\n",ExtFile);
myprintf("▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒\r");
printbar(nebytes,numbytes);
myprintf("\r");
JustWroteIt=FALSE;
while(nebytes<numbytes)
{
if ( (ebytes = read(ExtFileHandle, (void *)&ExtDescRec,sizeof(extdescrec) )) == -1)
{
cprintf(" ■ [%s] Read Failure [ExtDescRec]! _CleanUpExtFileName();\r\n",ExtFile);
exit(1);
}
nebytes+=ebytes;
if ( (ebytes = read(ExtFileHandle, buf1, ExtDescRec.size )) == -1)
{
cprintf(" ■ [%s] Read Failure [buf1]! _CleanUpExtFileName();\r\n",ExtFile);
exit(1);
}
nebytes+=ebytes;
btowrite=0;
JustWroteIt=FALSE;
for(i=0;i<ExtDescRec.size;i++)
{
if(buf1[i] == 0x1A)
{
JustWroteIt=TRUE;
} else
{
if(JustWroteIt){
buf2[btowrite++]=0x0D;
buf2[btowrite++]=0x0A;
JustWroteIt=FALSE;
} else
buf2[btowrite++]=buf1[i];
}
}
while( (buf2[btowrite-1]==0x0A) || (buf2[btowrite-1]==0x0D) )
btowrite--;
buf2[btowrite++]=0x0D;
buf2[btowrite++]=0x0A;
printbar(nebytes,numbytes);
myprintf("\r");
ExtDescRec.size=btowrite;
if ((write(TmpFileHandle, (void *)&ExtDescRec,sizeof(extdescrec))) != sizeof(extdescrec))
{
cprintf(" ■ Error writing to the Temp file [ExtDescRec]. _CleanUpExtFileName();\r\n");
cprintf(" ■ Name : %s\r\n",ExtDescRec.filename);
cprintf(" ■ size : %u\r\n",ExtDescRec.size);
exit(1);
}
if ((write(TmpFileHandle, buf2, ExtDescRec.size)) != ExtDescRec.size)
{
cprintf(" ■ Error writing to the Temp file [buf2]. _CleanUpExtFileName();\r\n");
exit(1);
}
}
myprintf("\n");
close(ExtFileHandle);
close(TmpFileHandle);
unlink(ExtFile);
rename("■■■■■■■■.■■■",ExtFile);
}
void DirFileList(directoryrec DirInfo)
{
char s[160],s1[160],s3[160],DirFileName[20],ExtFileName[20];
int i;
textattr(0x1B);
strcpy(DirFileName,DirInfo.filename);
for(i=strlen(DirFileName);i>=0;i--){
if( DirFileName[i]=='.' )
s[i]=0x00;
else
s[i]=DirFileName[i];
}
sprintf(ExtFileName,"%s.EXT",s);
if(ModeClean == TRUE)
CleanUpExtFile(ExtFileName); /* Gets rid of troublesome EOF characters.*/
sprintf(DirFileName,"%s.DIR",DirInfo.filename);
if ((DirFileHandle =
open(DirFileName,O_RDWR | O_BINARY , S_IWRITE | S_IREAD)) == -1)
{
cprintf(" ■ Error Opening Dir File [%s]\r\n",DirFileName);
abort();
}
DirFileSize=filelength(DirFileHandle);
DirFileInnardsCount=0;
NumOfFiles=0;
/* Read in the |MARKER| data so that I can determine the number of
files TRUELY available in this List.*/
if ( (bytes = read(DirFileHandle, (void *) &ulrec,sizeof(uploadsrec) )) == -1)
{
cprintf(" ■ [%s] Read Failure!\r\n",DirFileName);
abort();
}
NumOfFiles=ulrec.numbytes;
sprintf(s,"▐▒▌▐▒▌·%-56s%3d files·▐▒▌▐▒▌\n",DirInfo.name,NumOfFiles);
fputs(s,filelist);
myprintf("%s\r",s);
textattr(0x1F);
strcpy(s,"────────────┬───────┬──────────────────────────────────────────────────────────");
fputs(s,filelist);fputs("\n",filelist);
myprintf("%s\r\n",s);
done=FALSE;
while((DirFileInnardsCount<NumOfFiles) && done==FALSE) {
if ( (bytes = read(DirFileHandle, (void *) &ulrec,sizeof(uploadsrec) )) == -1)
{
cprintf(" ■ [%s] Read Failure!\r\n",DirFileName);
abort();
}
DirFileInnardsCount++;
totalnumfiles++;
sprintf(s,"%-12s│%7lu│%s",ulrec.filename,ulrec.numbytes,filter(ulrec.description));
fputs(s,filelist);fputs("\n",filelist);
myprintf("%s\r\n",s);
/* Does this File have a extended description ? */
if(ulrec.mask & mask_extended){
if ((extfile = fopen(ExtFileName, "r")) == NULL)
{
fprintf(stderr, "Cannot open [%s] file.\n");
}
while (!feof(extfile))
{
fgets(s,160,extfile);
if(s[12]==0x00){
if (strcmp(s,ulrec.filename)==0){
/* A Match has been made */
memcpy(s3,&(s[15]),145);
memset(s1,0xFF,sizeof(s1));
strcpy(s1,filter(s3));
sprintf(s," │ │%s",s1);
while((s1[12]!=0x00) && (s1[8]!='.') && (!feof(extfile)) ) {
fputs(s,filelist);fputs("\n",filelist);
myprintf("%s\r\n",s);
fgets(s1,160,extfile);
strcpy(s3,filter(s1));
sprintf(s," │ │%s",s3);
}
}
}
}
textattr(0x1F);
fclose(extfile);
}
if(kbhit()) {
done=TRUE;
}
}
strcpy(s,"────────────┴───────┴──────────────────────────────────────────────────────────");
fputs(s,filelist);fputs("\n",filelist);
myprintf("%s\r\n",s);
close(DirFileHandle);
if(done==TRUE) {
cprintf(" **** User Abort ****\r\n");
fputs(" ** SysOp aborted Master filelist generation. Contact Him/Her. **\n",filelist);
UserWishesToExit=TRUE;
}
}
char long2ar(unsigned long arval)
{
char tmpchar;
int i;
tmpchar=' ';
if (arval!=0) {
for (i=0; i<16; i++)
if ((1 << i) & arval)
tmpchar='A'+i;
}
return(tmpchar);
}
void printitem(directoryrec *dr)
{
textattr((dr->mask & mask_filelist) ? 0x1B : 0x13);
cprintf("%-40s│%3u│%3u│ %c │%8u│%scluded",
dr->name, dr->dsl, dr->age, long2ar(dr->dar),
dr->maxfiles, dr->mask & mask_filelist ? "In" : "Ex");
}
void ConfigMain( void )
{
int curdirrec;
char ch,s[100];
struct time t;
struct date d;
if ((MainDirFileHandle =
open("DIRS.DAT",O_RDWR | O_BINARY , S_IWRITE | S_IREAD)) == -1)
{
cprintf(" ■ _ConfigMain ■ Error Opening Main_Dir File [DIRS.DAT]\r\n");
abort();
}
dirnum=filelength(MainDirFileHandle)/sizeof(directoryrec);
curdirrec=0;
if ( (bytes = read(MainDirFileHandle, (void *)&dirrec,filelength(MainDirFileHandle) )) == -1)
{
cprintf(" ■ _ConfigMain ■ [DIRS.DAT] Read Failure!\r\n");
abort();
}
window(1,2,80,3);
textattr(0x74);
clrscr();
cprintf(" Type [I] for Include or [E] for Exclude <-> Directory in Filelist generation\r\n");
textattr(0x70);
cprintf(" DIRECTORY NAME │DSL│AGE│DAR│Maxfiles│MFLIST");
window(1,4,80,winsizey);
textattr(0x1F);
clrscr();
do {
printitem(&dirrec[curdirrec]);
do{
ch=getch();
}while( !( (ch=='i') || (ch=='I') || (ch=='e') || (ch=='E') ) );
switch(ch){
case 'i':
case 'I': if(!(dirrec[curdirrec].mask & mask_filelist))
(dirrec[curdirrec].mask ^= mask_filelist);
break;
case 'e':
case 'E': if(dirrec[curdirrec].mask & mask_filelist)
(dirrec[curdirrec].mask ^= mask_filelist);
break;
}
cprintf("\r");
printitem(&dirrec[curdirrec]);
cprintf("\r\n");
curdirrec++;
}while((curdirrec<dirnum) && (UserWishesToExit==FALSE));
lseek(MainDirFileHandle, 0L, SEEK_SET);
if ( (bytes = write(MainDirFileHandle, (void *)&dirrec,filelength(MainDirFileHandle) )) != filelength(MainDirFileHandle))
{
cprintf(" ■ _ConfigMain ■ [DIRS.DAT] Write Failure!\r\n");
abort();
}
}
void MainDirList( void )
{
int curdirrec;
char ch,s[100];
struct time t;
struct date d;
if ((MainDirFileHandle =
open("DIRS.DAT",O_RDWR | O_BINARY , S_IWRITE | S_IREAD)) == -1)
{
cprintf(" ■ Error Opening Main_Dir File [DIRS.DAT]\r\n");
exit(1);
}
if ((filelist = fopen("MASTER.LST", "w+")) == NULL)
{
fprintf(stderr, "Cannot open MASTER.LST file.\n");
exit(1);
}
if ((headerfile = fopen("HEADER.TXT", "r")) == NULL)
{
fprintf(stderr, "Cannot open HEADER.TXT file.\nCreate it NOW!\nType MFLIST /? for info.\n");
exit(1);
}
fputs(" M A S T E R - L I S T - O F - F I L E S - F R O M\n",filelist);
fgets(s,100,headerfile);
do{
fputs(s,filelist);
fgets(s,100,headerfile);
}while(!feof(headerfile));
fclose(headerfile);
fputs("───────────────────────────────────────────────────────────────────────────────\n",filelist);
gettime(&t);
getdate(&d);
sprintf(s," ■ This list was compiled at %2d:%02d on %s %d%s, %d ■\n",
t.ti_hour, t.ti_min, month[d.da_mon],
d.da_day, d.da_day>=4 ? Propering[3] : Propering[d.da_day],
d.da_year);
fputs(s,filelist);
fputs("───────────────────────────────────────────────────────────────────────────────\n",filelist);
dirnum=filelength(MainDirFileHandle)/sizeof(directoryrec);
curdirrec=0;
if ( (bytes = read(MainDirFileHandle, (void *)&dirrec,filelength(MainDirFileHandle) )) == -1)
{
cprintf(" ■ [DIRS.DAT] Read Failure!\r\n");
abort();
}
do {
if(dirrec[curdirrec].mask & mask_filelist)
textattr(0x1B);
else
textattr(0x19);
if(dirrec[curdirrec].mask & mask_filelist)
DirFileList(dirrec[curdirrec]);
curdirrec++;
}while((curdirrec<dirnum) && (UserWishesToExit==FALSE));
}
void initscreen( void )
{
window(1,1,80,1);
textattr(0x4F);
clrscr();
cprintf(" MFLIST.EXE Master File List for WWIV based Bulletin Boards. %s",VERSION);
textattr(0x1F);
window(1,2,80,winsizey);
gotoxy(1,1);
}
void main (int argc, char *argv[])
{
int i;
char argstr[80],s[80];
struct text_info ti;
ModeQuiet=FALSE;
ModeConfig=FALSE;
ModeHelp=FALSE;
ModeClean=TRUE;
winsizey=peekb(0x40, 0x84)+1;
for(i=1;i<=argc;i++)
{
strcpy(argstr,argv[i]);
if( (argstr[0]=='-') || (argstr[0]=='/') )
{
switch(argstr[1]){
case '?':
case 'h':
case 'H': textattr(0x0F);
cprintf("\r\n USAGE : MFLIST[.EXE] [-Q] [-C] [-F] [-?]\r\n");
textattr(0x07);
cprintf(" ■ MFLIST is only command needed to run this program.\r\n");
cprintf(" -Q ■ Quiet Mode. Least possible screen printout.\r\n");
cprintf(" -C ■ Config Mode. Setup which Download Directories to list.\r\n");
cprintf(" -F ■ Turs OFF the EOF Clean Filter. Used for Generation Speed.\r\n");
cprintf(" -? ■ Show this Help screen.\r\n");
cprintf("═══════════════════════════════════════════════════════════════════════════════\r\n");
cprintf(" Some TIPS / Ideas / Notes\r\n");
cprintf(" ■ Place this in your DATA directory of your WWIV BBS.\r\n");
cprintf(" ■ Create a File called HEADER.TXT which contains your BBS's\r\n");
cprintf(" Pertinent information. Such as BBS Name, Phone Number, Location,\r\n");
cprintf(" Max Modem Speeds, Upload/Download Policy, etc... This file is the\r\n");
cprintf(" first thing to be added to your MASTER.LST file listing.\r\n");
cprintf(" ■ Run the MFLIST /C first to setup which directories to actually show\r\n");
cprintf(" the Master file list. Otherwise there will be NO directories scanned.\r\n");
cprintf(" ■ Leave your SYSOP directory out of the list generation as most people\r\n");
cprintf(" cannot actually SEE or DOWNLOAD those files while on-line.\r\n");
cprintf(" ■ The /F switch actually MODIFIES the *.EXT files to clean out unwanted\r\n");
cprintf(" EOF chars that mess up Master List generation. EOF chars are often placed\r\n");
cprintf(" in the *.EXT files from bad/strange FILE_ID.DIZ files.\r\n");
cprintf(" ■ The CONFIG information is stored in bit #7 (0-7) of the [mask] area in your\r\n");
cprintf(" DIRS.DAT file. Make the change into your BBS so that this bit can be flipped\r\n");
cprintf(" from your DIREDIT menus.\r\n");
if(winsizey<=25) {
cprintf("[HIT ANY KEY TO CONTINUE]");
while(kbhit()) getch(); getch(); cprintf("\r");
}
cprintf("═══════════════════════════════════════════════════════════════════════════════\r\n");
cprintf(" Ideas / Changes / Congrats.\r\n");
cprintf(" Send them to SVEN(#2) or HOSER(#1) at ....\r\n");textattr(0x09);
cprintf(" ▄▄▄ ▄ ▄ ▄▄▄ ▄ ▄ ▄▄▄ ▄ ▄ ▄▄▄ ▄ ▄ ▄▄▄ ▄▄ ▄▄▄▐▌▄▄▄ ▄▄ ▄▄ ▄▄▄\r\n");textattr(0x0E);
cprintf("────█───█─█─█─▀─█─█─█─▀─▌█▐──────█───█─█─█─▀─█─█─█─▀──█────────█─█─█─█─█───────\r\n");textattr(0x09);
cprintf("·····▀█·▌▄▐·▌▀··▐·▌·▌▀··█▐▌······ ▀█·▌▄▐·▌▀··█·▐·▌▀···▀▀█······▌▀▄·▌▀▄··▀█·····\r\n");textattr(0x0E);
cprintf("────▄▄▐─▐█▌─█▄▄──█──█▄▄─█─█──────▄▄▐─▐█▌─█▄▄─█▄█─█▄▄──▄▄▐──────█▄█─█▄█─▄▄▐─────\r\n");textattr(0x0B);
cprintf("\r\n");
cprintf(" (6o9)448-o913 Located in East Windsor, NJ WWIVnet @6909\r\n");
cprintf("\r\n");
cprintf(" Supporting modem speeds from 1200 baud to 14.4k v.32(bis)/v.42(bis) MNP5.\r\n");
textattr(0x07);
cprintf("───────────────────────────────────────────────────────────────────────────────\r\n");
cprintf(" MFLIST.EXE %s compiled on %s at %s\r\n",VERSION,__DATE__,__TIME__);
cprintf(" DISCLAIMER : │▌█▐█ USE THIS PROGRAM AT YOR OWN RISK █▌█▐│\r\n");
cprintf("───────────────────────────────────────────────────────────────────────────────\r\n");
ModeHelp=TRUE;
break;
case 'q':
case 'Q':
ModeQuiet=TRUE;
break;
case 'f':
case 'F': ModeClean=FALSE;
break;
case 'c':
case 'C': ModeConfig=TRUE;
break;
}
}
}
if(ModeHelp==FALSE) {
printf(" Mode │ Setting\r\n");
printf("──────────────┼─────────\r\n");
printf(" Quiet │ %s\r\n", ModeQuiet ? "ON" : "OFF");
printf(" Clean Filter │ %s\r\n", ModeClean ? "ON" : "OFF");
printf(" Config │ %s\r\n", ModeConfig ? "ON" : "OFF");
gettextinfo(&ti);
ULREC_SIZE = sizeof(uploadsrec);
directvideo = 1;
textattr(0x1F);
clrscr();
initscreen();
if(ModeConfig==FALSE)
{
MainDirList();
sprintf(s," ■ Total files in this list : %lu ■",totalnumfiles);
fputs(s,filelist);fputs("\n",filelist);
myprintf("%s\r\n",s);
fclose(filelist);
}
else
ConfigMain();
if(UserWishesToExit==FALSE){
window(1,1,80,winsizey);
textattr(ti.attribute);
clrscr();
cprintf("\r\n\r\nAll Done!\r\n");
} else {
textattr(ti.attribute);
}
}
}