home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / BBS / MISC / XDEV_117.ZIP / XMKMNU.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-11-10  |  27.9 KB  |  824 lines

  1. /* XEDIT v1.16 copyright (c) 1990 by M. Kimes */
  2.  
  3. #include "msgg.h"
  4. #include "twindow.h"
  5. #include "keys.h"
  6.  
  7. extern char msk78[];
  8. #define msk35 msk78+43
  9. #define mskst msk35+33
  10. #define mskzip msk35+30
  11. #define mskcit msk35+11
  12. #define msk1 msk78+77
  13. #define msk3 msk35+32
  14. #define msk4 msk35+31
  15. #define msk5 msk35+30
  16. #define msk6 msk35+29
  17. #define msk47 msk78+31
  18. #define msk46 msk78+32
  19. #define msk51 msk78+28
  20. #define msk40 msk46+6
  21. #define msk39 msk46+7
  22. #define msk12 msk78+66
  23. #define msk65 msk78+13
  24. #define msk19 msk78+59
  25. #define msk26 msk78+52
  26. #define msk24 msk78+54
  27. #define msk58 msk78+20
  28. #define msk10 msk78+68
  29.  
  30. #define MAXNUMDIRS         1024
  31. #define MAXNUMAREA         1024
  32. #define MAXPROTOCOLS    130
  33. #define MAXARCHIVERS    256
  34. #define MAXDOORS        4096
  35.  
  36. extern WINDOW *wnd4;
  37.  
  38. struct _mmboard {
  39.   char       name[48];
  40.   char       forceto[36];
  41.   word       attr;
  42.   word       max;
  43.   word       number;
  44.   word       substat1;
  45.   word       substat2;
  46.   char       descr[79];
  47.   signed char age;
  48.   word         flags;
  49.   word          zone;
  50.   word         net;
  51.   word          node;
  52.   word          point;
  53.   char       yourname[36];
  54.   word         minwrite;
  55. };
  56.  
  57. struct _ffboard {
  58.   char       name[47];
  59.   char       flags;
  60.   word         security;
  61.   char       dpath[79];
  62.   char       upath[79];
  63.   char       descr[79];
  64.   signed char age;
  65.   word         userflags;
  66.   char         leechpercent;
  67. };
  68.  
  69. extern struct _mmboard huge *marea;
  70. extern struct _mmboard huge *currarea;
  71. extern word higharea;
  72. extern word maxareas;
  73. extern char msgareasfile[133];
  74. extern struct _ffboard huge *curdir;
  75. extern struct _ffboard huge *dir;
  76. extern word numdirs;
  77. extern char fileareasfile[133];
  78.  
  79. struct   _door {
  80.     char name[25];
  81.     char type[4];
  82.     char spawn[79];
  83.     char descr[79];
  84. };
  85. extern struct _door huge *door;
  86.  
  87. extern word numdoors;
  88.  
  89. struct _archiver {
  90.     char ext[5];
  91.     char move[41];
  92.     char extract[41];
  93.     char list[41];
  94.     char error[41];
  95.     char aname[13];
  96.     char ename[13];
  97.     char id[25];
  98.     char pick[2];
  99.     int  skip;
  100.     int  errline;
  101. };
  102. extern struct _archiver huge *archiver;
  103. extern word numarchivers;
  104.  
  105. extern char filename[133];
  106. extern char textname[133];
  107.  
  108. extern void   pascal swap_msgareas(word,word);
  109. extern int      pascal sort_msgareas(void);
  110. extern void   pascal swap_fileareas(word,word);
  111. extern int      pascal sort_fileareas(void);
  112. extern word   pascal select_area(word);
  113. extern char * pascal msgarea_attr(void);
  114. extern char * pascal filearea_attr (char flags);
  115. extern char * pascal rstrip(char *);
  116. extern char * pascal lstrip(char *);
  117. extern char * pascal stripcr(char *);
  118. extern void   pascal load_fileareas(char *);
  119. extern void   pascal load_msgareas(char *);
  120. extern word   pascal find_msgarea(word);
  121. extern word   pascal find_filearea(char *);
  122. extern word   pascal list_msgareas(char *);
  123. extern word   pascal list_fileareas(char *);
  124. extern word   pascal check_area(word);
  125. extern word   pascal edit_msgarea(word);
  126. extern word   pascal edit_filearea(word);
  127. extern int      pascal setup_msg(void);
  128. extern int      pascal setup_file(void);
  129. extern int           addbackslash (char *,int);
  130. extern int           nomorethan4095 (char *,int);
  131.  
  132.        void   pascal make_msgmenu(void);
  133.        void   pascal make_filemenu(void);
  134.        void   pascal load_archivers(char *);
  135.        word   pascal list_archivers(char *);
  136.        word   pascal edit_archiver(word);
  137.  
  138.  
  139.  
  140.  
  141. void pascal make_msgmenu (void) {
  142.  
  143.     FILE *fp;
  144.     word register x,y;
  145.     char seclvl=0;
  146.     char secl[2]="0";
  147.     WINDOW *fwnd;
  148.     FIELD *ffld;
  149.     int returncode;
  150.  
  151.     fwnd=establish_window(15,5,6,42);
  152.     set_border(fwnd,3);
  153.     set_title(fwnd," File Security ");
  154.     set_colors(fwnd,BORDER,7,0,0);
  155.     display_window(fwnd);
  156. Again:
  157.     wprompt(fwnd,2,2,"Security Level (0-9):");
  158. ReDo:
  159.     init_template(fwnd);
  160.     ffld=establish_field(fwnd,26,2,msk1,secl,'N');
  161.     field_window(ffld,"fileseclvl",40,1);
  162.  
  163.     prep_template(fwnd);
  164. AskOver:
  165.     returncode=data_entry(fwnd);
  166.     if (returncode==ESC) {
  167.         delete_window(fwnd);
  168.         return;
  169.     }
  170.     if(returncode!=F10)goto ReDo;
  171.     seclvl=(char)atoi(secl);
  172.     if(seclvl<0 || seclvl>9) {
  173.         error_message(" Invalid security level #...must be 0-9! ");
  174.         pause_msg();
  175.         goto ReDo;
  176.     }
  177.     delete_window(fwnd);
  178.  
  179.     remove("MSGS.BAK");
  180.     rename("MSGS.XBS","MSGS.BAK");
  181.  
  182.     fp=fopen("MSGS.XBS","wt");
  183.     if(!fp) {
  184.         error_message(" Sorry, couldn't create MSGS.XBS ");
  185.         rename("MSGS.BAK","MSGS.XBS");
  186.         pause_msg();
  187.         return;
  188.     }
  189.     any_message(" Working... ");
  190.     fprintf(fp,"\01lStart\n\01~\01p1\01a1\01\x1b\x1b[0;1;36m\01;\n\n");
  191.     fprintf(fp,"\01;\n\01;Please note there is minimal security level checking in this menu!\n");
  192.     fprintf(fp,"\01;XEdit creates this to give you a starting place for a customized menu.\n");
  193.     fprintf(fp,"\01;You could also simply call Bulls-mode with \01* (see docs).\n");
  194.     fprintf(fp,"\01;This is only one of many ways to make a msg area menu.\n");
  195.     fprintf(fp,"\01;Note use of MSGHELP.HYP as hypertext help file (you have to make it).\n\01;\n");
  196.     fprintf(fp,"\01lReStart\n\n\01C\n\n\01\05*^   *T mins left\n\n");
  197.     fprintf(fp,"\01G0,33,1,Quit Read Scan Write Locate Non-stop_Read Change_Areas Help\n");
  198.     fprintf(fp,"\n\01%cC=Q\nlQuit\n\01\%cC=R\nlRead\n\01%cC=S\nlScan\n\01%cC=N\nlNonStop\n",'0','0','0','0');
  199.     fprintf(fp,"\01%cC=W\nlWrite\n\01\%cC=C\nlChange\n\01%cC=H\nlHelp\n\01%cC=L\nlLocate\n\01RlStart",'0','0','0','0');
  200.     fprintf(fp,"\n\01lQuit\n\01q\n");
  201.     fprintf(fp,"\n\01lNonStop\n\01r4,0\n\01h\01RlReStart\n");
  202.     fprintf(fp,"\n\01lRead\n\01r0,0\n\01h\01RlReStart\n");
  203.     fprintf(fp,"\n\01lScan\n\01r128,0\n\01h\01RlReStart\n");
  204.     fprintf(fp,"\n\01lWrite\n\01%cA\n\01%cb\01w0,0\n\01RlReStart\n",'0','0');
  205.     fprintf(fp,"\n\01lHelp\n\01|0MSGHELP.HYP\n\01|1General\n\01|2\n\01RlStart\n");
  206.     fprintf(fp,"\n\01lLocate\n\01r16,0\n\01h\01RlReStart\n");
  207.     fprintf(fp,"\n\01lChange\n\01p0\01a0\01DlGoHere\n");
  208.     fprintf(fp,"\01\x1b\x1b[0;1;37m\01;\nAvailable Message Areas:\n");
  209.     fprintf(fp,"\01\x1b\x1b[0;1;32m\01;\n");
  210.     for(x=0;x<maxareas;x++) {
  211.         fprintf(fp,"\01lL%u\n",marea[x].number);
  212.         if(x<(maxareas-1))fprintf(fp,"\01S<0%01u lL%u\n",marea[x].substat1,marea[x+1].number);
  213.         else fprintf(fp,"\01S<0%01u lGoHere\n",marea[x].substat1);
  214.         if(marea[x].age!=0) {
  215.             if(x<(maxareas-1)) {
  216.                 if(marea[x].age>0) fprintf(fp,"\01La<%01hd,lL%u\n",abs(marea[x].age),marea[x+1].number);
  217.                 else fprintf(fp,"\01La>%01hd,lL%u\n",abs(marea[x].age),marea[x+1].number);
  218.             }
  219.             else {
  220.                 if(marea[x].age>0) fprintf(fp,"\01La<%01hd,lGoHere\n",abs(marea[x].age));
  221.                 else fprintf(fp,"\01La<%01hd,lGoHere\n",abs(marea[x].age));
  222.             }
  223.         }
  224.         if(marea[x].flags!=0) {
  225.            if(x<(maxareas-1)) {
  226.                for(y=0;y<16;y++) {
  227.                    if(marea[x].flags & y) fprintf(fp,"\01LF%u,lL%u\n",y,marea[x+1].number);
  228.                 }
  229.             }
  230.             else {
  231.                for(y=0;y<16;y++) {
  232.                    if(marea[x].flags & y) fprintf(fp,"\01LF%u,lGoHere\n",y);
  233.                 }
  234.             }
  235.         }
  236.         if(marea[x].attr & ANSI) fprintf(fp,"\01\x1b\x1b[0;1;35m");
  237.         fprintf(fp,"%5u.  %s",marea[x].number,marea[x].name);
  238.         if(marea[x].descr && *marea[x].descr)fprintf(fp," -- %s",marea[x].descr);
  239.         if(marea[x].attr & ANSI) fprintf(fp,"\01\x1b\x1b[0;1;32m");
  240.         fprintf(fp,"\n");
  241.     }
  242.     fprintf(fp,"\01lGoHere\n\01p1\01a1\01\x1b\x1b[0;1;33m\01;\n\n");
  243.     fprintf(fp,"Enter area number: ");
  244.     fprintf(fp,"\01%cI6 0 0 0 3\n",'0');
  245.     fprintf(fp,"\01%cC=\nlStart\n",'0');
  246.     for(x=0;x<maxareas;x++) {
  247.         fprintf(fp,"\n\01l%u\n",marea[x].number);
  248.         if(x<(maxareas-1)) {
  249.             if(marea[x].attr & ANSI) {
  250.                 fprintf(fp,"\01LGlOK%u\n",marea[x].number);
  251.                 fprintf(fp,"\01bl%u\n",marea[x+1].number);
  252.                 fprintf(fp,"\01lOK%u\n",marea[x].number);
  253.             }
  254.             fprintf(fp,"\01S<0%01u l%u\n",marea[x].substat1,marea[x+1].number);
  255.             if(marea[x].age!=0) {
  256.                 if(marea[x].age>0) fprintf(fp,"\01La<%01hd,l%u\n",abs(marea[x].age),marea[x+1].number);
  257.                 else fprintf(fp,"\01La>%01hd,l%u\n",abs(marea[x].age),marea[x+1].number);
  258.             }
  259.             if(marea[x].flags!=0) {
  260.                for(y=0;y<16;y++) {
  261.                    if(marea[x].flags & y) fprintf(fp,"\01LF%u,\01l%u\n",y,marea[x+1].number);
  262.                 }
  263.             }
  264.             fprintf(fp,"\01%cC!%u\nl%u\n",'0',marea[x].number,marea[x+1].number);
  265.         }
  266.         else {
  267.             if(marea[x].attr & ANSI) {
  268.                 fprintf(fp,"\01LGlOK%u\n",marea[x].number);
  269.                 fprintf(fp,"\01blDuh\n");
  270.                 fprintf(fp,"\01lOK%u\n",marea[x].number);
  271.             }
  272.             fprintf(fp,"\01S<0%01u lDuh\n",marea[x].substat1);
  273.             if(marea[x].age!=0) {
  274.                 if(marea[x].age>0) fprintf(fp,"\01La<%01hd,lDuh\n",abs(marea[x].age));
  275.                 else fprintf(fp,"\01La<%01hd,lDuh\n",abs(marea[x].age));
  276.             }
  277.             if(marea[x].flags!=0) {
  278.                for(y=0;y<16;y++) {
  279.                    if(marea[x].flags & y) fprintf(fp,"\01LF%u,lDuh\n",y);
  280.                 }
  281.             }
  282.             fprintf(fp,"\01%cC!%u\nlDuh\n",'0',marea[x].number);
  283.         }
  284.         fprintf(fp,"\01M%s,%u,%u,%u,%u,%u,",marea[x].name,marea[x].attr,marea[x].max,marea[x].number,marea[x].substat1,marea[x].substat2);
  285.         if(marea[x].forceto && *marea[x].forceto) fprintf(fp,"%s",marea[x].forceto);
  286.         fprintf(fp,",%u\n",marea[x].minwrite);
  287.         fprintf(fp,"\n\01blFindFile\n\01;");
  288.     }
  289.     fprintf(fp,"\n\01lDuh\n\nUnknown msg area...\01P2\n\n\01RlStart\n");
  290.     fprintf(fp,"\n\01lFindFile\n\01&F%s,@0,%01hu\n\01RlReStart\n",fileareasfile,seclvl);
  291.  
  292.     if(ferror(fp)) {
  293.         error_message(" Write Error occurred... ");
  294.         pause_msg();
  295.     }
  296.  
  297.     fclose(fp);
  298.  
  299.     any_message(" Created \"MSGS.XBS\" in current directory ");
  300.     pause_msg();
  301. }
  302.  
  303.  
  304.  
  305. void pascal make_filemenu (void) {
  306.  
  307.     FILE *fp;
  308.     word register x,y;
  309.     char seclvl=0;
  310.     char secl[2]="0";
  311.     WINDOW *fwnd;
  312.     FIELD *ffld;
  313.     int returncode;
  314.  
  315.     fwnd=establish_window(15,5,6,42);
  316.     set_border(fwnd,3);
  317.     set_title(fwnd," File Security ");
  318.     set_colors(fwnd,BORDER,7,0,0);
  319.     display_window(fwnd);
  320. Again:
  321.     wprompt(fwnd,2,2,"Security Level (0-9):");
  322. ReDo:
  323.     init_template(fwnd);
  324.     ffld=establish_field(fwnd,26,2,msk1,secl,'N');
  325.     field_window(ffld,"fileseclvl",40,1);
  326.  
  327.     prep_template(fwnd);
  328. AskOver:
  329.     returncode=data_entry(fwnd);
  330.     if (returncode==ESC) {
  331.         delete_window(fwnd);
  332.         return;
  333.     }
  334.     if(returncode!=F10)goto ReDo;
  335.     seclvl=(char)atoi(secl);
  336.     if(seclvl<0 || seclvl>9) {
  337.         error_message(" Invalid security level #...must be 0-9! ");
  338.         pause_msg();
  339.         goto ReDo;
  340.     }
  341.     delete_window(fwnd);
  342.  
  343.     remove("FILES.BAK");
  344.     rename("FILES.XBS","FILES.BAK");
  345.  
  346.     fp=fopen("FILES.XBS","wt");
  347.     if(!fp) {
  348.         error_message(" Sorry, couldn't create FILES.XBS ");
  349.         rename("FILES.BAK","FILES.XBS");
  350.         pause_msg();
  351.         return;
  352.     }
  353.     any_message(" Working... ");
  354.     fprintf(fp,"\01lStart\n\01~\01p1\01a1\01\x1b\x1b[0;1;36m\01;\n");
  355.     fprintf(fp,"\01%cAFILES.BBS\n\01%cFD\n\01e<1 lGotFiles\nNo Files Available This Area\n\n\01lGotFiles\n",'0','0');
  356.     fprintf(fp,"\01;\n\01;Please note there is minimal security level checking in this menu!\n");
  357.     fprintf(fp,"\01;XEdit creates this to give you a starting place for a customized menu.\n");
  358.     fprintf(fp,"\01;This is only one of many ways to make a file area menu.\n");
  359.     fprintf(fp,"\01;You could also simply call Files-mode with \01, (see docs).\n");
  360.     fprintf(fp,"\01;Note use of FILEHELP.HYP as hypertext help file (you have to make it).\n\01;\n");
  361.     fprintf(fp,"\01lReStart\n\n\01\05 File Area: *$   *^   *T mins left\n\n");
  362.     fprintf(fp,"\01G0,33,1,Quit List New Upload Download Change_Areas All_New Search Help Peek\n");
  363.     fprintf(fp,"\n\01%cC=Q\nlQuit\n\01\%cC=L\nlList\n\01%cC=N\nlNew\n\01%cC=U\nlUpload\n",'0','0','0','0');
  364.     fprintf(fp,"\01%cC=D\nlDownload\n\01\%cC=C\nlChange\n\01%cC=H\nlHelp\n\01%cC=A\nlAllNew\n\01%cC=S\nlSearch\n\01%cC=P\nlPeek\n\01RlStart",'0','0','0','0','0','0','0');
  365.     fprintf(fp,"\n\01lQuit\n\01q\n\01;\n\01;You might want to add more to this Peeker line, like an extract dir...\n\01;\n");
  366.     fprintf(fp,"\01\lPeek\n\n\01%cAFILES.BBS\n\01%cFD\n\01e<1 lGotFiles3\n\nNo Files Available This Area\n\01h\01RlStart\n\01lGotFiles3\n",'0','0');
  367.     fprintf(fp,"\01ESPEEKER.EXE #10 T*T B*B G*G C*P D*D L*l S*s0\n\n\01RlStart\n");
  368.     fprintf(fp,"\n\01lList\n\01ff8,FILES.BBS\n\01e>2 lDownload\n\01h\01RlReStart\n");
  369.     fprintf(fp,"\n\01lNew\n\01ff10,FILES.BBS\n\n\01e>2 lDownload\n\01h\01RlReStart\n");
  370.     fprintf(fp,"\n\01lUpload\n");
  371.     fprintf(fp,"\n\01%c=*U\n\01%cC=NUL\\\nlNoUploading\n",'0','0');
  372.     fprintf(fp,"\01Ku\n");
  373.     fprintf(fp,"\n\nNumber of uploads:   \01uu     Uploaded kilobytes:   \01uU\n");
  374.     fprintf(fp,"Number of downloads: \01ud     Downloaded kilobytes: \01uD\n");
  375.     fprintf(fp,"\1h\01RlReStart\n");
  376.     fprintf(fp,"\01lNoUploading\n\nSorry, no uploads allowed to this area\n\01h\01RlStart\n");
  377.     fprintf(fp,"\n\01lDownload\n");
  378.     fprintf(fp,"\01%cAFILES.BBS\n\01%cFD\n\01e<1 lGotFiles2\n\nNo Files Available This Area\n\01h\01RlStart\n\01lGotFiles2\n",'0','0');
  379.     fprintf(fp,"\01;\n\01;These next few lines (to the \01Kd line) guard against File Leeches.\n");
  380.     fprintf(fp,"\01;As shown here, a Leech is someone with a ud ratio of less than 10%.\n");
  381.     fprintf(fp,"\01;Adjust or remove to taste.\n\01;\n");
  382.     fprintf(fp,"\01LrlDownAnyway\n\01Lk>10 lLeechAlert\n");
  383.     fprintf(fp,"\01L#>10 lLeechAlert\n\01blDownAnyway\n");
  384.     fprintf(fp,"\01lLeechAlert\n\n");
  385.     fprintf(fp,"Number of uploads:   \01uu     Uploaded kilobytes:   \01uU\n");
  386.     fprintf(fp,"Number of downloads: \01ud     Downloaded kilobytes: \01uD\n");
  387.     fprintf(fp,"\nLeech detected and ignored...\n\01ARan afoul of Leech Detection\n");
  388.     fprintf(fp,"\n\01h\n\01RlStart\n");
  389.     fprintf(fp,"\01lDownAnyway\n\01;Do the download...\n\01Kd\n");
  390.     fprintf(fp,"\n\nNumber of uploads:   \01uu     Uploaded kilobytes:   \01uU\n");
  391.     fprintf(fp,"Number of downloads: \01ud     Downloaded kilobytes: \01uD\n");
  392.     fprintf(fp,"\01h\01RlReStart\n");
  393.     fprintf(fp,"\n\01lHelp\n\01|0FILEHELP.HYP\n\01|1General\n\01|2\n\01RlStart\n");
  394.     fprintf(fp,"\n\01lChange\n\01p0\01a0\01DlGoHere\n");
  395.     fprintf(fp,"\01\x1b\x1b[0;1;37m\01;\nAvailable File Areas:\n");
  396.     fprintf(fp,"\01\x1b\x1b[0;1;32m\01;\n");
  397.     for(x=0;x<numdirs;x++) {
  398.         fprintf(fp,"\01lL%u\n",x+1);
  399.         if(x<(numdirs-1))fprintf(fp,"\01S<%01hu%01u lL%u\n",seclvl,dir[x].security,x+2);
  400.         else fprintf(fp,"\01S<%01hu%01u lGoHere\n",seclvl,dir[x].security);
  401.         if(dir[x].age!=0) {
  402.             if(x<(numdirs-1)) {
  403.                 if(dir[x].age>0) fprintf(fp,"\01La<%01hd,lL%u\n",abs(dir[x].age),x+2);
  404.                 else fprintf(fp,"\01La>%01hd,lL%u\n",abs(dir[x].age),x+2);
  405.             }
  406.             else {
  407.                 if(dir[x].age>0) fprintf(fp,"\01La<%01hd,lGoHere\n",abs(dir[x].age));
  408.                 else fprintf(fp,"\01La<%01hd,lGoHere\n",abs(dir[x].age));
  409.             }
  410.         }
  411.         if(dir[x].userflags!=0) {
  412.             for(y=0;y<16;y++) {
  413.                 if(dir[x].userflags & y) fprintf(fp,"\01LF%u,lL%u\n",y,x+1);
  414.             }
  415.         }
  416.         fprintf(fp,"%5u.  %s",x+1,dir[x].name);
  417.         if(dir[x].descr && *dir[x].descr)fprintf(fp," -- %s",dir[x].descr);
  418.         fprintf(fp,"\n");
  419.     }
  420.     fprintf(fp,"\01lGoHere\n\01p1\01a1\01\x1b\x1b[0;1;33m\01;\n\n");
  421.     fprintf(fp,"Enter area number: ");
  422.     fprintf(fp,"\01%cI6 0 0 0 3\n",'0');
  423.     fprintf(fp,"\01%cC=\nlStart\n",'0');
  424.     for(x=0;x<numdirs;x++) {
  425.         fprintf(fp,"\n\01l%u\n",x+1);
  426.         if(x<(numdirs-1)) {
  427.             fprintf(fp,"\01S<%01hu%01u l%u\n",seclvl,dir[x].security,x+2);
  428.             if(dir[x].age!=0) {
  429.                 if(dir[x].age>0) fprintf(fp,"\01La<%01hd,l%u\n",abs(dir[x].age),x+2);
  430.                 else fprintf(fp,"\01La>%01hd,l%u\n",abs(dir[x].age),x+2);
  431.             }
  432.             if(dir[x].userflags!=0) {
  433.                 for(y=0;y<16;y++) {
  434.                     if(dir[x].userflags & y) fprintf(fp,"\01LF%u,l%u\n",y,x+2);
  435.                 }
  436.             }
  437.             fprintf(fp,"\01%cC!%u\nl%u\n",'0',x+1,x+2);
  438.         }
  439.         else {
  440.             fprintf(fp,"\01S<%01hu%01u lDuh\n",seclvl,dir[x].security);
  441.             if(dir[x].age!=0) {
  442.                 if(dir[x].age>0) fprintf(fp,"\01La<%01hd,lDuh\n",abs(dir[x].age));
  443.                 else fprintf(fp,"\01La<%01hd,lDuh\n",abs(dir[x].age));
  444.             }
  445.             if(dir[x].userflags!=0) {
  446.                 for(y=0;y<16;y++) {
  447.                     if(dir[x].userflags & y) fprintf(fp,"\01LF%u,lDuh\n",y);
  448.                 }
  449.             }
  450.             fprintf(fp,"\01%cC!%u\nlDuh\n",'0',x+1);
  451.         }
  452.         fprintf(fp,"\01F%s,%s,%s,%hu,%hu\n",dir[x].name,dir[x].dpath,dir[x].upath,dir[x].flags,dir[x].leechpercent);
  453.         fprintf(fp,"\01blFindMsg\n\01;");
  454.     }
  455.     fprintf(fp,"\n\01lDuh\n\nUnknown file area...\01P2\n\n\01RlStart\n");
  456.     fprintf(fp,"\n\01lFindMsg\n\01%c=*\n\01&M%s,@0\n\01RlStart\n",'0',msgareasfile);
  457.     fprintf(fp,"\n\01lAllNew\n\01%c=$\n",'9');
  458.     for(x=0;x<numdirs;x++) {
  459.         fprintf(fp,"\01;\n\01lA%u\n",x+1);
  460.         if(x<(numdirs-1)) {
  461.             fprintf(fp,"\01S<%01hu%01u lA%u\n",seclvl,dir[x].security,x+2);
  462.             if(dir[x].age!=0) {
  463.                 if(dir[x].age>0) fprintf(fp,"\01La<%01hd,lA%u\n",abs(dir[x].age),x+2);
  464.                 else fprintf(fp,"\01La>%01hd,lA%u\n",abs(dir[x].age),x+2);
  465.             }
  466.             if(dir[x].userflags!=0) {
  467.                 for(y=0;y<16;y++) {
  468.                     if(dir[x].userflags & y) fprintf(fp,"\01LF%u,lA%u\n",y,x+2);
  469.                 }
  470.             }
  471.         }
  472.         else {
  473.             fprintf(fp,"\01S<%01hu%01u lDoneNew\n",seclvl,dir[x].security);
  474.             if(dir[x].age!=0) {
  475.                 if(dir[x].age>0) fprintf(fp,"\01La<%01hd,lDoneNew\n",abs(dir[x].age));
  476.                 else fprintf(fp,"\01La<%01hd,lDoneNew\n",abs(dir[x].age));
  477.             }
  478.             if(dir[x].userflags!=0) {
  479.                 for(y=0;y<16;y++) {
  480.                     if(dir[x].userflags & y) fprintf(fp,"\01LF%u,lDoneNew\n",y);
  481.                 }
  482.             }
  483.         }
  484.         fprintf(fp,"\01F%s,%s,%s,%hu,%hu\n",dir[x].name,dir[x].dpath,dir[x].upath,dir[x].flags,dir[x].leechpercent);
  485.         fprintf(fp,"\01ff10,FILES.BBS\n");
  486.         fprintf(fp,"\01e>3 lAOk%01u\n",x+1);
  487.         fprintf(fp,"\01e>2 lDownload2\n");
  488.         fprintf(fp,"\01e==1 lDoneNew\n",x+1);
  489.         fprintf(fp,"\01blAOk%01u\n",x+1);
  490.         fprintf(fp,"\01lAOk%01u\n",x+1);
  491.     }
  492.     fprintf(fp,"\01lDoneNew\n\01&F%s,@9,%01hu\n",fileareasfile,seclvl);
  493.     fprintf(fp,"\01RlReStart\n");
  494.     fprintf(fp,"\n\01lSearch\n\01%c=$\n",'9');
  495.     fprintf(fp,"\nSearchstring (usually filename without extension):\n -> \01%cI25,0,1,1,1\n",'0');
  496.     fprintf(fp,"\n\01%cC=\nlReStart\n\nSearching...\n",'0');
  497.     for(x=0;x<numdirs;x++) {
  498.         fprintf(fp,"\01;\n\01lS%u\n",x+1);
  499.         if(x<(numdirs-1)) {
  500.             fprintf(fp,"\01S<%01hu%01u lS%u\n",seclvl,dir[x].security,x+2);
  501.             if(dir[x].age!=0) {
  502.                 if(dir[x].age>0) fprintf(fp,"\01La<%01hd,lS%u\n",abs(dir[x].age),x+2);
  503.                 else fprintf(fp,"\01La>%01hd,lS%u\n",abs(dir[x].age),x+2);
  504.             }
  505.             if(dir[x].userflags!=0) {
  506.                 for(y=0;y<16;y++) {
  507.                     if(dir[x].userflags & y) fprintf(fp,"\01LF%u,lS%u\n",y,x+2);
  508.                 }
  509.             }
  510.         }
  511.         else {
  512.             fprintf(fp,"\01S<%01hu%01u lDoneSearch\n",seclvl,dir[x].security);
  513.             if(dir[x].age!=0) {
  514.                 if(dir[x].age>0) fprintf(fp,"\01La<%01hd,lDoneSearch\n",abs(dir[x].age));
  515.                 else fprintf(fp,"\01La<%01hd,lDoneSearch\n",abs(dir[x].age));
  516.             }
  517.             if(dir[x].userflags!=0) {
  518.                 for(y=0;y<16;y++) {
  519.                     if(dir[x].userflags & y) fprintf(fp,"\01LF%u,lDoneSearch\n",y);
  520.                 }
  521.             }
  522.         }
  523.         fprintf(fp,"\01F%s,%s,%s,%hu,,%hd,%u,%hu\n",dir[x].name,dir[x].dpath,dir[x].upath,dir[x].flags,dir[x].age,dir[x].userflags,dir[x].leechpercent);
  524.         fprintf(fp,"\01ff12,FILES.BBS,01/01/1980,@0\n");
  525.         fprintf(fp,"\01e>3 lSOk%01u\n",x+1);
  526.         fprintf(fp,"\01e>2 lDownload2\n");
  527.         fprintf(fp,"\01e==1 lDoneSearch\n",x+1);
  528.         fprintf(fp,"\01blSOk%01u\n",x+1);
  529.         fprintf(fp,"\01lSOk%01u\n",x+1);
  530.     }
  531.     fprintf(fp,"\01lDoneSearch\n\01&F%s,@9,%01hu\n",fileareasfile,seclvl);
  532.     fprintf(fp,"\01RlReStart\n");
  533.     fprintf(fp,"\n\01lDownload2\n");
  534.     fprintf(fp,"\01%c=*\n\01&M%s,@0\n\01RlDownload\n",'0',msgareasfile);
  535.  
  536.  
  537.     if(ferror(fp)) {
  538.         error_message(" Write Error occurred... ");
  539.         pause_msg();
  540.     }
  541.  
  542.     fclose(fp);
  543.  
  544.     any_message(" Created \"FILES.XBS\" in current directory ");
  545.     pause_msg();
  546. }
  547.  
  548.  
  549.  
  550. word pascal list_archivers (char *name) {
  551.  
  552.     word areano;
  553.     char s[181];
  554.     word lineareas[25];
  555.     word counter;
  556.     register word x;
  557.     int  temporary;
  558.     int  selection;
  559.  
  560.         set_help("arclist   ",18,0);
  561.         if(wnd4)delete_window(wnd4);
  562.         wnd4=establish_window(0,0,25,80);
  563.         set_border(wnd4,1);
  564.         sprintf(s," Listing archivers in file %s ",name);
  565.         s[76]=0;
  566.         set_title(wnd4,s);
  567.         display_window(wnd4);
  568.         wcursor(wnd4,0,0);
  569.         x=0;
  570. OverAgain:
  571.         counter=0;
  572.         for(temporary=0;temporary<25;temporary++)lineareas[temporary]=0;
  573.         if(x>=numarchivers)x=0;
  574.         while(1) {
  575.                 lineareas[counter]=x+1;
  576.                 wprintf(wnd4,"%-12.12s  %-12.12s [%c",archiver[x].aname,archiver[x].ename,*archiver[x].pick);
  577.                 if(!*archiver[x].pick) wprintf(wnd4," ");
  578.                 wprintf(wnd4,"] %-4.4s  %-19.19s %-19.19s",archiver[x].ext,archiver[x].list,archiver[x].extract);
  579.                 x++;
  580.                 counter++;
  581.                 if (counter>=23 || x>=numarchivers) {
  582.                     break;
  583.                 }
  584.                 wprintf(wnd4,"\n");
  585.         }
  586. Again:
  587.                 selection=get_selection(wnd4,1,NULL);
  588.                 if(selection>0 && selection<24) {
  589.                     if(lineareas[selection-1])areano=lineareas[selection-1];
  590.                     else {
  591.                         fputs("\x7",stdout);
  592.                         goto Again;
  593.                     }
  594.                     return areano;
  595.                 }
  596.                 switch (selection) {
  597.                     case HOME:  x=0;
  598.                                 break;
  599.                     case END:   if(numarchivers>22) x=numarchivers-23;
  600.                                 else x=0;
  601.                                 break;
  602.                     case PGUP:
  603.                     case BS:    if(x<24 && numarchivers>22) {
  604.                                     x=numarchivers-23;
  605.                                     if(x>numarchivers)x=0;
  606.                                     break;
  607.                                 }
  608.                                 if (x<22) break;
  609.                                 else if (x<44) x=0;
  610.                                 else x-=45;
  611.                                 break;
  612.                     case PGDN:
  613.                     case FWD:   if (x>=numarchivers) x=0;
  614.                                 else if ((numarchivers-x)<23) {
  615.                                     if (numarchivers>22) x=numarchivers-23;
  616.                                     else x=0;
  617.                                 }
  618.                                 break;
  619.                     case 0:     goto BreakOut;
  620.                     default:    fputs("\x7",stdout);
  621.                                 break;
  622.                 }
  623.                 counter=0;
  624.                 clear_window(wnd4);
  625.                 wcursor(wnd4,0,0);
  626.                 goto OverAgain;
  627. BreakOut:
  628.                 return 0;
  629. }
  630.  
  631.  
  632.  
  633. word pascal edit_archiver (word areano) {
  634.  
  635.     WINDOW *wnd6;
  636.     FIELD *fld3;
  637.     char s[133];
  638.     char redid=0;
  639.     char skip[6];
  640.     char errline[6];
  641.     register word x;
  642.     int returncode;
  643.  
  644.     wnd6=establish_window(15,9,16,64);
  645.     set_border(wnd6,3);
  646.     set_title(wnd6," Edit Archiver Entry ");
  647.     set_colors(wnd6,BORDER,7,0,0);
  648.     display_window(wnd6);
  649.     wcursor(wnd6,0,0);
  650.     wprintf(wnd6," F10=chng/exit  F9=chng  F8=Del  F7=Add  PGUP  PGDN  ESC=exit\n");
  651. Again:
  652.     wprompt(wnd6,2,2,"Archive Name:");
  653.     wprompt(wnd6,2,3,"Extract Name:");
  654.     wprompt(wnd6,2,4,"Extension:");
  655.     wprompt(wnd6,2,5,"List command:");
  656.     wprompt(wnd6,2,6,"Move command:");
  657.     wprompt(wnd6,2,7,"Extract command:");
  658.     wprompt(wnd6,2,8,"Error string:");
  659.     wprompt(wnd6,2,9,"ID string:");
  660.     wprompt(wnd6,2,10,"Pick key:");
  661.     wprompt(wnd6,2,11,"Initial skip:");
  662.     wprompt(wnd6,2,12,"Error line #:");
  663. ReDo:
  664.     if(!numarchivers) goto StartingOut;
  665.     init_template(wnd6);
  666.     sprintf(skip,"%d",archiver[areano].skip);
  667.     sprintf(errline,"%d",archiver[areano].errline);
  668.  
  669. /*    char ext[5];
  670.     char move[41];
  671.     char extract[41];
  672.     char list[41];
  673.     char error[41];
  674.     char aname[13];
  675.     char ename[13];
  676.     char id[25];
  677.     char pick[2];
  678.     int  skip;
  679.     int  errline; */
  680.  
  681.     fld3=establish_field(wnd6,20,2,msk12,archiver[areano].aname,'A');
  682.     field_window(fld3,"arcaname  ",40,6);
  683.     fld3=establish_field(wnd6,20,3,msk12,archiver[areano].ename,'A');
  684.     field_window(fld3,"arcename ",40,6);
  685.     fld3=establish_field(wnd6,20,4,msk3,archiver[areano].ext,'A');
  686.     field_window(fld3,"arcext    ",40,6);
  687.     fld3=establish_field(wnd6,20,5,msk40,archiver[areano].list,'a');
  688.     field_window(fld3,"arclist   ",40,6);
  689.     fld3=establish_field(wnd6,20,6,msk40,archiver[areano].move,'a');
  690.     field_window(fld3,"arcmove   ",40,6);
  691.     fld3=establish_field(wnd6,20,7,msk40,archiver[areano].extract,'a');
  692.     field_window(fld3,"arcextract",40,6);
  693.     fld3=establish_field(wnd6,20,8,msk40,archiver[areano].error,'a');
  694.     field_window(fld3,"arcerror  ",40,6);
  695.     fld3=establish_field(wnd6,20,9,msk24,archiver[areano].id,'a');
  696.     field_window(fld3,"arcid     ",40,6);
  697.     fld3=establish_field(wnd6,20,10,msk1,archiver[areano].pick,'a');
  698.     field_window(fld3,"arcpick   ",40,6);
  699.     fld3=establish_field(wnd6,20,11,msk5,skip,'N');
  700.     field_window(fld3,"arcskip   ",40,6);
  701.     fld3=establish_field(wnd6,20,12,msk5,errline,'N');
  702.     field_window(fld3,"arcerrline",40,6);
  703.  
  704.  
  705.     prep_template(wnd6);
  706. AskOver:
  707.     returncode=data_entry(wnd6);
  708.     if (returncode==PGUP) {
  709.         if(!areano) areano=numarchivers-1;
  710.         else areano--;
  711.         goto ReDo;
  712.     }
  713.     if (returncode==PGDN) {
  714.         if(areano>=(numarchivers-1)) areano=0;
  715.         else areano++;
  716.         goto ReDo;
  717.     }
  718.     if (returncode==F8) {
  719.         if (areano<numarchivers) {
  720.             for(x=areano+1;x<numarchivers;x++) {
  721.                 memcpy((void *)&archiver[x-1],(void *)&archiver[x],(word)sizeof(struct _archiver));
  722.             }
  723.         }
  724.         redid=1;
  725.         numarchivers--;
  726.         if(!numarchivers) {
  727.             delete_window(wnd6);
  728.             return (word)redid;
  729.         }
  730.         if(areano>(numarchivers-1)) areano=numarchivers-1;
  731.         goto ReDo;
  732.     }
  733.     if (returncode==F7) {
  734.         if(numarchivers==MAXARCHIVERS) {
  735.             error_message(" Sorry, I'm already maxed out... ");
  736.             pause_msg();
  737.             goto ReDo;
  738.         }
  739. StartingOut:
  740.         redid=1;
  741.         numarchivers++;
  742.         memset((void *)&archiver[0],0,(unsigned)sizeof(struct _archiver));
  743.         areano=numarchivers-1;
  744.         goto ReDo;
  745.     }
  746.     if (returncode==ESC) goto Quit;
  747.     if (returncode!=F10 && returncode!=F9) goto AskOver;
  748.     rstrip(archiver[areano].aname);
  749.     lstrip(archiver[areano].aname);
  750.     rstrip(archiver[areano].ename);
  751.     lstrip(archiver[areano].ename);
  752.     rstrip(archiver[areano].ext);
  753.     lstrip(archiver[areano].ext);
  754.     rstrip(archiver[areano].list);
  755.     lstrip(archiver[areano].list);
  756.     rstrip(archiver[areano].move);
  757.     lstrip(archiver[areano].move);
  758.     rstrip(archiver[areano].extract);
  759.     lstrip(archiver[areano].extract);
  760.     rstrip(archiver[areano].error);
  761.     rstrip(archiver[areano].id);
  762.     lstrip(archiver[areano].pick);
  763.     rstrip(archiver[areano].pick);
  764.     if(*archiver[areano].pick==' ') *archiver[areano].pick=0;
  765.     archiver[areano].pick[1]=0;
  766.     archiver[areano].skip=atoi(skip);
  767.     archiver[areano].errline=atoi(errline);
  768.     if (!*archiver[areano].aname || !*archiver[areano].ename || !*archiver[areano].list || !*archiver[areano].move || !*archiver[areano].extract || !*archiver[areano].error /* || !strchr(archiver[areano].ext,'.')*/ ) {
  769.         any_message(" WARNING: Blank field ");
  770.         pause_msg();
  771.         if(returncode==F9) goto ReDo;
  772.         delete_window(wnd6);
  773.         if(redid) {
  774.             return 1;
  775.         }
  776.         return 0;
  777.     }
  778.     redid=1;
  779.     if(returncode==F9) goto ReDo;
  780.     delete_window(wnd6);
  781.     return 1;
  782. Quit:
  783.     delete_window(wnd6);
  784.     if (redid) {
  785.         return 1;
  786.     }
  787.     return 0;
  788. }
  789.  
  790.  
  791.  
  792. void pascal load_archivers (char *file) {
  793.  
  794.     FILE *fp;
  795.     struct ffblk f;
  796.     char string[80];
  797.     register word x;
  798.  
  799.     if(findfirst(file,&f,0)) {
  800.         numarchivers=0;
  801.         return;
  802.     }
  803.     numarchivers=(word)(f.ff_fsize/(long)sizeof(struct _archiver));
  804.     if(!(fp=fopen(file,"rb"))) {
  805.         sprintf(string," Can't open %s ",file);
  806.         error_message(string);
  807.         pause_msg();
  808.         return;
  809.     }
  810.     fread((void *)archiver,sizeof(struct _archiver),numarchivers,fp);
  811.     fclose(fp);
  812.     for(x=0;x<numarchivers;x++) {
  813.         archiver[x].ext[4]=0;
  814.         archiver[x].move[40]=0;
  815.         archiver[x].extract[40]=0;
  816.         archiver[x].list[40]=0;
  817.         archiver[x].error[40]=0;
  818.         archiver[x].aname[12]=0;
  819.         archiver[x].ename[12]=0;
  820.         archiver[x].id[24]=0;
  821.         archiver[x].pick[1]=0;
  822.     }
  823. }
  824.