home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 15 / CD_ASCQ_15_070894.iso / vrac / mflst10b.zip / MFLIST.C < prev    next >
C/C++ Source or Header  |  1994-01-08  |  19KB  |  661 lines

  1. #include <conio.h>
  2. #include <ctype.h>
  3. #include <dir.h>
  4. #include <dos.h>
  5. #include <fcntl.h>
  6. #include <io.h>
  7. #include <stdarg.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <sys\stat.h>
  12.  
  13. #define VERSION "v1.0ß"
  14. #define TRUE 1
  15. #define FALSE 0
  16.  
  17. /* directoryrec.mask */
  18. #define mask_PD            0x0001
  19. #define mask_no_uploads    0x0004
  20. #define mask_archive       0x0008
  21. #define mask_pending_batch 0x0010
  22. #define mask_no_ratio      0x0020
  23. #define mask_cdrom         0x0040
  24. #define mask_filelist      0x0080       //Display in filelist
  25. #define mask_specific      0x4000    //when someone u/l specifically
  26. #define mask_extended      0x8000
  27.  
  28.  
  29. /* DATA HELD FOR EVERY UPLOAD */
  30. typedef struct {
  31.     char        name[41],        /* directory name */
  32.             filename[9],        /* direct database filename */
  33.             path[81];        /* filename path */
  34.     unsigned char    dsl,            /* DSL for directory */
  35.             age;            /* minimum age for directory */
  36.     unsigned short    dar,            /* DAR for directory */
  37.             maxfiles,        /* max files for directory */
  38.             mask,            /* file type mask */
  39.             type;            /* 4 digit directory type */
  40. } directoryrec;
  41.  
  42. typedef struct {
  43.     char            filename[13],           /* filename */
  44.             description[59],        /* file description */
  45.             date[9],                /* date u/l'ed */
  46.             upby[46];               /* name of upload user */
  47.     unsigned char   filetype;               /* file type for apples */
  48.     unsigned short  numdloads,              /* number times d/l'ed */
  49.             ownersys,ownerusr,      /* who uploaded it */
  50.             mask;                   /* file type mask */
  51.     unsigned long   daten,                  /* date uploaded */
  52.             numbytes;               /* number bytes long file is */
  53. } uploadsrec;
  54.  
  55. typedef struct {
  56.     char            filename[13];
  57. } filenamerec;
  58.  
  59. typedef struct {
  60.     char            filename[13];
  61.     unsigned int    size;
  62. } extdescrec;
  63.  
  64. /**********************************************************************/
  65.  
  66. directoryrec    dirrec[100];
  67. uploadsrec      ulrec;
  68. unsigned int    DescCount,ULREC_SIZE;
  69. int             done, UserWishesToExit=FALSE,winsizey;
  70. int             DirFileHandle, bytes, DirFileInnardsCount, DirFileSize,
  71.         NumOfFiles, MainDirFileHandle, dirnum;
  72. FILE            *filelist,*extfile,*headerfile;
  73. struct          date d;
  74. struct          time t;
  75. char         ModeQuiet,ModeConfig,ModeHelp,ModeClean;
  76. char            *month[] = {"---", "January", "February", "March", "April",
  77.             "May", "June", "July", "August", "September",
  78.             "October", "November", "December"};
  79. char            *Propering[] = {"st", "nd", "rd", "th"};
  80. long         totalnumfiles=0;
  81.  
  82. /**********************************************************************/
  83.  
  84. void myprintf(char *fmt, ...);
  85. char *current_directory(char *path);
  86. void printbar( long curi, long maxi );
  87. char *filter(char *strg);
  88. void CleanUpExtFile(char *ExtFile);
  89. void DirFileList(directoryrec DirInfo);
  90. void MainDirList( void );
  91. void initscreen( void );
  92.  
  93. /**********************************************************************/
  94.  
  95. void myprintf(char *fmt, ...)
  96. {
  97.   va_list ap;
  98.   char sm[256];
  99.  
  100.   if(ModeQuiet==FALSE){
  101.     va_start(ap, fmt);
  102.     vsprintf(sm, fmt, ap);
  103.     va_end(ap);
  104.     cprintf(sm);
  105.   }
  106. }
  107.  
  108. void printbar( long curi, long maxi )
  109. {
  110.   long   iki, levi, x;
  111.  
  112.   if((curi==0x00) || (maxi==0x00)) {
  113.     levi=0;
  114.     if(curi==maxi) levi=50;
  115.   } else {
  116.     x = ((curi+1)*100)/maxi;
  117.     levi=x/2;
  118.   }
  119.  
  120.   for(iki=1;iki<=levi;iki++) myprintf("█");
  121.  
  122.   myprintf("%d%%",levi*2);
  123.  
  124. }
  125.  
  126.  
  127. char *filter(char *strg)
  128. {
  129.   static char sf[160];
  130.   int  i,i2,i3;
  131.  
  132.   for(i=0,i2=0;i<strlen(strg);i++) {
  133.     switch(strg[i]){
  134.       case 0x03: i++; break;
  135.       case 0x13: i+=2; break;
  136.       case '\r':
  137.       case '\n': sf[i2++]=0x00;
  138.          break;
  139.       case 0x09: for(i3=0;i3<5;i3++)
  140.            sf[i2++]=0x20;
  141.          break;
  142.       case '%' : sf[i2++]='%';
  143.          sf[i2++]='%';
  144.          break;
  145.       case 27  : if (strg[i+1]=='[')
  146.            while (!isalpha(strg[i++]))
  147.              ;
  148.          break;
  149.       default  : sf[i2++]=strg[i];
  150.          break;
  151.     }
  152.   }
  153.   sf[i2]=0x00;
  154.  
  155.   return(sf);
  156. }
  157.  
  158. void CleanUpExtFile(char *ExtFile)
  159. {
  160.   int            ExtFileHandle, TmpFileHandle, ebytes, nebytes, btowrite,
  161.          res, i, JustWroteIt;
  162.   long           numbytes;
  163.   unsigned char  buf1[2048], buf2[2048];
  164.   extdescrec     ExtDescRec;
  165.  
  166.   if ((ExtFileHandle = open(ExtFile,O_RDWR | O_BINARY , S_IWRITE | S_IREAD)) == -1)
  167.   {
  168.      cprintf(" ■ Error Opening Ext File [%s] _CleanUpExtFileName();\r\n",ExtFile);
  169.      exit(1);
  170.   }
  171.  
  172.   if((TmpFileHandle = open("■■■■■■■■.■■■",O_RDWR | O_BINARY | O_CREAT, S_IWRITE | S_IREAD)) == -1)
  173.   {
  174.     cprintf(" ■ Error Opening [Temp] Ext File _CleanUpExtFileName();\r\n");
  175.     exit(1);
  176.   }
  177.  
  178.   numbytes=filelength(ExtFileHandle);
  179.   ebytes=nebytes=0;
  180.  
  181.   myprintf("%s file Clean-up Percent complete.\r\n",ExtFile);
  182.   myprintf("▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒\r");
  183.  
  184.   printbar(nebytes,numbytes);
  185.   myprintf("\r");
  186.  
  187.   JustWroteIt=FALSE;
  188.   while(nebytes<numbytes)
  189.   {
  190.     if ( (ebytes = read(ExtFileHandle, (void *)&ExtDescRec,sizeof(extdescrec) )) == -1)
  191.     {
  192.       cprintf(" ■ [%s] Read Failure [ExtDescRec]! _CleanUpExtFileName();\r\n",ExtFile);
  193.       exit(1);
  194.     }
  195.     nebytes+=ebytes;
  196.     if ( (ebytes = read(ExtFileHandle, buf1, ExtDescRec.size )) == -1)
  197.     {
  198.       cprintf(" ■ [%s] Read Failure [buf1]! _CleanUpExtFileName();\r\n",ExtFile);
  199.       exit(1);
  200.     }
  201.     nebytes+=ebytes;
  202.  
  203.     btowrite=0;
  204.     JustWroteIt=FALSE;
  205.  
  206.     for(i=0;i<ExtDescRec.size;i++)
  207.     {
  208.       if(buf1[i] == 0x1A)
  209.       {
  210.     JustWroteIt=TRUE;
  211.       } else
  212.       {
  213.     if(JustWroteIt){
  214.       buf2[btowrite++]=0x0D;
  215.       buf2[btowrite++]=0x0A;
  216.       JustWroteIt=FALSE;
  217.     } else
  218.       buf2[btowrite++]=buf1[i];
  219.       }
  220.     }
  221.     while( (buf2[btowrite-1]==0x0A) || (buf2[btowrite-1]==0x0D) )
  222.       btowrite--;
  223.  
  224.     buf2[btowrite++]=0x0D;
  225.     buf2[btowrite++]=0x0A;
  226.  
  227.     printbar(nebytes,numbytes);
  228.     myprintf("\r");
  229.  
  230.     ExtDescRec.size=btowrite;
  231.  
  232.     if ((write(TmpFileHandle, (void *)&ExtDescRec,sizeof(extdescrec))) != sizeof(extdescrec))
  233.     {
  234.       cprintf(" ■ Error writing to the Temp file [ExtDescRec]. _CleanUpExtFileName();\r\n");
  235.       cprintf(" ■ Name : %s\r\n",ExtDescRec.filename);
  236.       cprintf(" ■ size : %u\r\n",ExtDescRec.size);
  237.       exit(1);
  238.     }
  239.  
  240.     if ((write(TmpFileHandle, buf2, ExtDescRec.size)) != ExtDescRec.size)
  241.     {
  242.       cprintf(" ■ Error writing to the Temp file [buf2]. _CleanUpExtFileName();\r\n");
  243.       exit(1);
  244.     }
  245.   }
  246.   myprintf("\n");
  247.  
  248.   close(ExtFileHandle);
  249.   close(TmpFileHandle);
  250.  
  251.   unlink(ExtFile);
  252.   rename("■■■■■■■■.■■■",ExtFile);
  253. }
  254.  
  255. void DirFileList(directoryrec DirInfo)
  256. {
  257.   char s[160],s1[160],s3[160],DirFileName[20],ExtFileName[20];
  258.   int  i;
  259.  
  260.   textattr(0x1B);
  261.   strcpy(DirFileName,DirInfo.filename);
  262.  
  263.   for(i=strlen(DirFileName);i>=0;i--){
  264.     if( DirFileName[i]=='.' )
  265.       s[i]=0x00;
  266.     else
  267.       s[i]=DirFileName[i];
  268.   }
  269.   sprintf(ExtFileName,"%s.EXT",s);
  270.  
  271.   if(ModeClean == TRUE)
  272.     CleanUpExtFile(ExtFileName); /* Gets rid of troublesome EOF characters.*/
  273.  
  274.   sprintf(DirFileName,"%s.DIR",DirInfo.filename);
  275.  
  276.   if ((DirFileHandle =
  277.      open(DirFileName,O_RDWR | O_BINARY , S_IWRITE | S_IREAD)) == -1)
  278.   {
  279.      cprintf(" ■ Error Opening Dir File [%s]\r\n",DirFileName);
  280.      abort();
  281.   }
  282.  
  283.   DirFileSize=filelength(DirFileHandle);
  284.   DirFileInnardsCount=0;
  285.   NumOfFiles=0;
  286.  
  287.   /* Read in the |MARKER| data so that I can determine the number of
  288.      files TRUELY available in this List.*/
  289.   if ( (bytes = read(DirFileHandle, (void *) &ulrec,sizeof(uploadsrec) )) == -1)
  290.   {
  291.     cprintf(" ■ [%s] Read Failure!\r\n",DirFileName);
  292.     abort();
  293.   }
  294.  
  295.   NumOfFiles=ulrec.numbytes;
  296.   sprintf(s,"▐▒▌▐▒▌·%-56s%3d files·▐▒▌▐▒▌\n",DirInfo.name,NumOfFiles);
  297.   fputs(s,filelist);
  298.   myprintf("%s\r",s);
  299.   textattr(0x1F);
  300.   strcpy(s,"────────────┬───────┬──────────────────────────────────────────────────────────");
  301.   fputs(s,filelist);fputs("\n",filelist);
  302.   myprintf("%s\r\n",s);
  303.  
  304.   done=FALSE;
  305.  
  306.   while((DirFileInnardsCount<NumOfFiles) && done==FALSE) {
  307.     if ( (bytes = read(DirFileHandle, (void *) &ulrec,sizeof(uploadsrec) )) == -1)
  308.     {
  309.       cprintf(" ■ [%s] Read Failure!\r\n",DirFileName);
  310.       abort();
  311.     }
  312.  
  313.     DirFileInnardsCount++;
  314.  
  315.     totalnumfiles++;
  316.  
  317.     sprintf(s,"%-12s│%7lu│%s",ulrec.filename,ulrec.numbytes,filter(ulrec.description));
  318.     fputs(s,filelist);fputs("\n",filelist);
  319.     myprintf("%s\r\n",s);
  320.  
  321.     /* Does this File have a extended description ? */
  322.  
  323.     if(ulrec.mask & mask_extended){
  324.       if ((extfile = fopen(ExtFileName, "r")) == NULL)
  325.       {
  326.     fprintf(stderr, "Cannot open [%s] file.\n");
  327.       }
  328.       while (!feof(extfile))
  329.       {
  330.     fgets(s,160,extfile);
  331.     if(s[12]==0x00){
  332.       if (strcmp(s,ulrec.filename)==0){
  333.         /* A Match has been made */
  334.         memcpy(s3,&(s[15]),145);
  335.         memset(s1,0xFF,sizeof(s1));
  336.         strcpy(s1,filter(s3));
  337.         sprintf(s,"            │       │%s",s1);
  338.         while((s1[12]!=0x00) && (s1[8]!='.') && (!feof(extfile)) ) {
  339.           fputs(s,filelist);fputs("\n",filelist);
  340.           myprintf("%s\r\n",s);
  341.           fgets(s1,160,extfile);
  342.           strcpy(s3,filter(s1));
  343.           sprintf(s,"            │       │%s",s3);
  344.         }
  345.       }
  346.     }
  347.       }
  348.       textattr(0x1F);
  349.       fclose(extfile);
  350.     }
  351.  
  352.     if(kbhit()) {
  353.       done=TRUE;
  354.     }
  355.  
  356.   }
  357.   strcpy(s,"────────────┴───────┴──────────────────────────────────────────────────────────");
  358.   fputs(s,filelist);fputs("\n",filelist);
  359.   myprintf("%s\r\n",s);
  360.  
  361.  
  362.   close(DirFileHandle);
  363.  
  364.   if(done==TRUE) {
  365.     cprintf(" **** User Abort ****\r\n");
  366.     fputs(" ** SysOp aborted Master filelist generation. Contact Him/Her. **\n",filelist);
  367.     UserWishesToExit=TRUE;
  368.   }
  369. }
  370.  
  371. char long2ar(unsigned long arval)
  372. {
  373.   char tmpchar;
  374.   int i;
  375.  
  376.   tmpchar=' ';
  377.  
  378.   if (arval!=0) {
  379.     for (i=0; i<16; i++)
  380.       if ((1 << i) & arval)
  381.     tmpchar='A'+i;
  382.   }
  383.  
  384.   return(tmpchar);
  385. }
  386.  
  387. void printitem(directoryrec *dr)
  388. {
  389.   textattr((dr->mask & mask_filelist) ? 0x1B : 0x13);
  390.  
  391.   cprintf("%-40s│%3u│%3u│ %c │%8u│%scluded",
  392.       dr->name, dr->dsl, dr->age, long2ar(dr->dar),
  393.       dr->maxfiles, dr->mask & mask_filelist ? "In" : "Ex");
  394.  
  395. }
  396.  
  397. void ConfigMain( void )
  398. {
  399.   int curdirrec;
  400.   char ch,s[100];
  401.   struct  time t;
  402.   struct date d;
  403.  
  404.   if ((MainDirFileHandle =
  405.      open("DIRS.DAT",O_RDWR | O_BINARY , S_IWRITE | S_IREAD)) == -1)
  406.   {
  407.      cprintf(" ■ _ConfigMain ■ Error Opening Main_Dir File [DIRS.DAT]\r\n");
  408.      abort();
  409.   }
  410.  
  411.   dirnum=filelength(MainDirFileHandle)/sizeof(directoryrec);
  412.   curdirrec=0;
  413.  
  414.   if ( (bytes = read(MainDirFileHandle, (void *)&dirrec,filelength(MainDirFileHandle) )) == -1)
  415.   {
  416.     cprintf(" ■ _ConfigMain ■ [DIRS.DAT] Read Failure!\r\n");
  417.     abort();
  418.   }
  419.  
  420.   window(1,2,80,3);
  421.   textattr(0x74);
  422.   clrscr();
  423.   cprintf(" Type [I] for Include or [E] for Exclude <-> Directory in Filelist generation\r\n");
  424.   textattr(0x70);
  425.   cprintf(" DIRECTORY NAME                         │DSL│AGE│DAR│Maxfiles│MFLIST");
  426.   window(1,4,80,winsizey);
  427.   textattr(0x1F);
  428.   clrscr();
  429.   do {
  430.  
  431.     printitem(&dirrec[curdirrec]);
  432.     do{
  433.       ch=getch();
  434.     }while( !( (ch=='i') || (ch=='I') || (ch=='e') || (ch=='E') ) );
  435.     switch(ch){
  436.       case 'i':
  437.       case 'I': if(!(dirrec[curdirrec].mask & mask_filelist))
  438.           (dirrec[curdirrec].mask ^= mask_filelist);
  439.         break;
  440.       case 'e':
  441.       case 'E': if(dirrec[curdirrec].mask & mask_filelist)
  442.           (dirrec[curdirrec].mask ^= mask_filelist);
  443.         break;
  444.     }
  445.     cprintf("\r");
  446.     printitem(&dirrec[curdirrec]);
  447.     cprintf("\r\n");
  448.  
  449.     curdirrec++;
  450.   }while((curdirrec<dirnum) && (UserWishesToExit==FALSE));
  451.   lseek(MainDirFileHandle, 0L, SEEK_SET);
  452.   if ( (bytes = write(MainDirFileHandle, (void *)&dirrec,filelength(MainDirFileHandle) )) != filelength(MainDirFileHandle))
  453.   {
  454.     cprintf(" ■ _ConfigMain ■ [DIRS.DAT] Write Failure!\r\n");
  455.     abort();
  456.   }
  457. }
  458.  
  459. void MainDirList( void )
  460. {
  461.   int curdirrec;
  462.   char ch,s[100];
  463.   struct  time t;
  464.   struct date d;
  465.  
  466.   if ((MainDirFileHandle =
  467.      open("DIRS.DAT",O_RDWR | O_BINARY , S_IWRITE | S_IREAD)) == -1)
  468.   {
  469.      cprintf(" ■ Error Opening Main_Dir File [DIRS.DAT]\r\n");
  470.      exit(1);
  471.   }
  472.  
  473.   if ((filelist = fopen("MASTER.LST", "w+")) == NULL)
  474.   {
  475.     fprintf(stderr, "Cannot open MASTER.LST file.\n");
  476.     exit(1);
  477.   }
  478.  
  479.   if ((headerfile = fopen("HEADER.TXT", "r")) == NULL)
  480.   {
  481.     fprintf(stderr, "Cannot open HEADER.TXT file.\nCreate it NOW!\nType MFLIST /? for info.\n");
  482.     exit(1);
  483.   }
  484.  
  485.   fputs("              M A S T E R - L I S T - O F - F I L E S - F R O M\n",filelist);
  486.  
  487.   fgets(s,100,headerfile);
  488.   do{
  489.     fputs(s,filelist);
  490.     fgets(s,100,headerfile);
  491.   }while(!feof(headerfile));
  492.   fclose(headerfile);
  493.   fputs("───────────────────────────────────────────────────────────────────────────────\n",filelist);
  494.  
  495.   gettime(&t);
  496.   getdate(&d);
  497.  
  498.   sprintf(s," ■ This list was compiled at %2d:%02d on %s %d%s, %d ■\n",
  499.        t.ti_hour, t.ti_min, month[d.da_mon],
  500.        d.da_day, d.da_day>=4 ? Propering[3] : Propering[d.da_day],
  501.        d.da_year);
  502.  
  503.  
  504.   fputs(s,filelist);
  505.   fputs("───────────────────────────────────────────────────────────────────────────────\n",filelist);
  506.  
  507.   dirnum=filelength(MainDirFileHandle)/sizeof(directoryrec);
  508.   curdirrec=0;
  509.  
  510.   if ( (bytes = read(MainDirFileHandle, (void *)&dirrec,filelength(MainDirFileHandle) )) == -1)
  511.   {
  512.     cprintf(" ■ [DIRS.DAT] Read Failure!\r\n");
  513.     abort();
  514.   }
  515.  
  516.   do {
  517.     if(dirrec[curdirrec].mask & mask_filelist)
  518.       textattr(0x1B);
  519.     else
  520.       textattr(0x19);
  521.  
  522.     if(dirrec[curdirrec].mask & mask_filelist)
  523.       DirFileList(dirrec[curdirrec]);
  524.  
  525.     curdirrec++;
  526.   }while((curdirrec<dirnum) && (UserWishesToExit==FALSE));
  527. }
  528.  
  529. void initscreen( void )
  530. {
  531.   window(1,1,80,1);
  532.   textattr(0x4F);
  533.   clrscr();
  534.   cprintf(" MFLIST.EXE Master File List for WWIV based Bulletin Boards. %s",VERSION);
  535.   textattr(0x1F);
  536.   window(1,2,80,winsizey);
  537.   gotoxy(1,1);
  538. }
  539.  
  540. void main (int argc, char *argv[])
  541. {
  542.   int i;
  543.   char argstr[80],s[80];
  544.   struct text_info ti;
  545.  
  546.   ModeQuiet=FALSE;
  547.   ModeConfig=FALSE;
  548.   ModeHelp=FALSE;
  549.   ModeClean=TRUE;
  550.  
  551.   winsizey=peekb(0x40, 0x84)+1;
  552.  
  553.   for(i=1;i<=argc;i++)
  554.   {
  555.     strcpy(argstr,argv[i]);
  556.     if( (argstr[0]=='-') || (argstr[0]=='/') )
  557.     {
  558.       switch(argstr[1]){
  559.     case '?':
  560.     case 'h':
  561.     case 'H': textattr(0x0F);
  562.           cprintf("\r\n USAGE : MFLIST[.EXE] [-Q] [-C] [-F] [-?]\r\n");
  563.           textattr(0x07);
  564.           cprintf(" ■ MFLIST is only command needed to run this program.\r\n");
  565.           cprintf(" -Q ■ Quiet Mode. Least possible screen printout.\r\n");
  566.           cprintf(" -C ■ Config Mode. Setup which Download Directories to list.\r\n");
  567.           cprintf(" -F ■ Turs OFF the EOF Clean Filter. Used for Generation Speed.\r\n");
  568.           cprintf(" -? ■ Show this Help screen.\r\n");
  569.           cprintf("═══════════════════════════════════════════════════════════════════════════════\r\n");
  570.           cprintf(" Some TIPS / Ideas / Notes\r\n");
  571.           cprintf(" ■ Place this in your DATA directory of your WWIV BBS.\r\n");
  572.           cprintf(" ■ Create a File called HEADER.TXT which contains your BBS's\r\n");
  573.           cprintf("   Pertinent information. Such as BBS Name, Phone Number, Location,\r\n");
  574.           cprintf("   Max Modem Speeds, Upload/Download Policy, etc... This file is the\r\n");
  575.           cprintf("   first thing to be added to your MASTER.LST file listing.\r\n");
  576.           cprintf(" ■ Run the MFLIST /C first to setup which directories to actually show\r\n");
  577.           cprintf("   the Master file list.  Otherwise there will be NO directories scanned.\r\n");
  578.           cprintf(" ■ Leave your SYSOP directory out of the list generation as most people\r\n");
  579.           cprintf("   cannot actually SEE or DOWNLOAD those files while on-line.\r\n");
  580.           cprintf(" ■ The /F switch actually MODIFIES the *.EXT files to clean out unwanted\r\n");
  581.           cprintf("   EOF chars that mess up Master List generation. EOF chars are often placed\r\n");
  582.           cprintf("   in the *.EXT files from bad/strange FILE_ID.DIZ files.\r\n");
  583.           cprintf(" ■ The CONFIG information is stored in bit #7 (0-7) of the [mask] area in your\r\n");
  584.           cprintf("   DIRS.DAT file. Make the change into your BBS so that this bit can be flipped\r\n");
  585.           cprintf("   from your DIREDIT menus.\r\n");
  586.           if(winsizey<=25) {
  587.             cprintf("[HIT ANY KEY TO CONTINUE]");
  588.             while(kbhit()) getch(); getch(); cprintf("\r");
  589.           }
  590.           cprintf("═══════════════════════════════════════════════════════════════════════════════\r\n");
  591.           cprintf("  Ideas / Changes / Congrats.\r\n");
  592.           cprintf("  Send them to SVEN(#2) or HOSER(#1) at ....\r\n");textattr(0x09);
  593.           cprintf("    ▄▄▄ ▄ ▄ ▄▄▄ ▄ ▄ ▄▄▄ ▄ ▄      ▄▄▄ ▄ ▄ ▄▄▄ ▄▄  ▄▄▄▐▌▄▄▄      ▄▄  ▄▄  ▄▄▄\r\n");textattr(0x0E);
  594.           cprintf("────█───█─█─█─▀─█─█─█─▀─▌█▐──────█───█─█─█─▀─█─█─█─▀──█────────█─█─█─█─█───────\r\n");textattr(0x09);
  595.           cprintf("·····▀█·▌▄▐·▌▀··▐·▌·▌▀··█▐▌······ ▀█·▌▄▐·▌▀··█·▐·▌▀···▀▀█······▌▀▄·▌▀▄··▀█·····\r\n");textattr(0x0E);
  596.           cprintf("────▄▄▐─▐█▌─█▄▄──█──█▄▄─█─█──────▄▄▐─▐█▌─█▄▄─█▄█─█▄▄──▄▄▐──────█▄█─█▄█─▄▄▐─────\r\n");textattr(0x0B);
  597.           cprintf("\r\n");
  598.           cprintf("    (6o9)448-o913        Located in East Windsor, NJ         WWIVnet @6909\r\n");
  599.           cprintf("\r\n");
  600.           cprintf("   Supporting modem speeds from 1200 baud to 14.4k v.32(bis)/v.42(bis) MNP5.\r\n");
  601.           textattr(0x07);
  602.           cprintf("───────────────────────────────────────────────────────────────────────────────\r\n");
  603.           cprintf(" MFLIST.EXE %s compiled on %s at %s\r\n",VERSION,__DATE__,__TIME__);
  604.           cprintf(" DISCLAIMER : │▌█▐█ USE THIS PROGRAM AT YOR OWN RISK █▌█▐│\r\n");
  605.           cprintf("───────────────────────────────────────────────────────────────────────────────\r\n");
  606.           ModeHelp=TRUE;
  607.           break;
  608.     case 'q':
  609.     case 'Q':
  610.           ModeQuiet=TRUE;
  611.           break;
  612.     case 'f':
  613.     case 'F': ModeClean=FALSE;
  614.           break;
  615.     case 'c':
  616.     case 'C': ModeConfig=TRUE;
  617.           break;
  618.       }
  619.     }
  620.   }
  621.  
  622.  
  623.   if(ModeHelp==FALSE) {
  624.     printf(" Mode         │ Setting\r\n");
  625.     printf("──────────────┼─────────\r\n");
  626.     printf(" Quiet        │ %s\r\n", ModeQuiet ? "ON" : "OFF");
  627.     printf(" Clean Filter │ %s\r\n", ModeClean ? "ON" : "OFF");
  628.     printf(" Config       │ %s\r\n", ModeConfig ? "ON" : "OFF");
  629.  
  630.     gettextinfo(&ti);
  631.  
  632.     ULREC_SIZE = sizeof(uploadsrec);
  633.     directvideo = 1;
  634.     textattr(0x1F);
  635.     clrscr();
  636.  
  637.     initscreen();
  638.  
  639.     if(ModeConfig==FALSE)
  640.     {
  641.       MainDirList();
  642.       sprintf(s," ■ Total files in this list : %lu ■",totalnumfiles);
  643.       fputs(s,filelist);fputs("\n",filelist);
  644.       myprintf("%s\r\n",s);
  645.       fclose(filelist);
  646.  
  647.     }
  648.     else
  649.       ConfigMain();
  650.  
  651.     if(UserWishesToExit==FALSE){
  652.       window(1,1,80,winsizey);
  653.       textattr(ti.attribute);
  654.       clrscr();
  655.       cprintf("\r\n\r\nAll Done!\r\n");
  656.     } else {
  657.       textattr(ti.attribute);
  658.     }
  659.   }
  660. }
  661.