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

  1.  
  2. #include "msgg.h"
  3. #include "twindow.h"
  4. #include "keys.h"
  5.  
  6. extern char msk78[];
  7. #define msk35 msk78+43
  8. #define mskst msk35+33
  9. #define mskzip msk35+30
  10. #define mskcit msk35+11
  11. #define msk1 msk78+77
  12. #define msk3 msk35+32
  13. #define msk4 msk35+31
  14. #define msk5 msk35+30
  15. #define msk6 msk35+29
  16. #define msk16 msk35+19
  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. char fileattrprompts[8][13]={
  37.     "Count DLs:",
  38.     "Free Files:",
  39.     "Associated:",
  40.     "Free Up:",
  41.     "*Reserved:",
  42.     "*Reserved:",
  43.     "*Reserved:",
  44.     "*Reserved:"
  45. };
  46. char attrprompts[16][13]={
  47.     "No Origin:",
  48.     "ANSI:",
  49.     "Private:",
  50.     "Public:",
  51.     "Echo:",
  52.     "Net:",
  53.     "MCI:",
  54.     "ReadOnly:",
  55.     "Alternate:",
  56.     "AltEcho:",
  57.     "Anonymous:",
  58.     "Real Name:",
  59.     "Associate:",
  60.     "External:",
  61.     "Force:",
  62.     "Compress:"
  63. };
  64.  
  65. extern WINDOW *wnd4;
  66.  
  67. struct _mmboard {
  68.   char       name[48];
  69.   char       forceto[36];
  70.   word       attr;
  71.   word       max;
  72.   word       number;
  73.   word       substat1;
  74.   word       substat2;
  75.   char       descr[79];
  76.   signed char age;
  77.   word         flags;
  78.   word          zone;
  79.   word         net;
  80.   word          node;
  81.   word         point;
  82.   char       yourname[36];
  83.   word       minwrite;
  84. };
  85.  
  86. struct _ffboard {
  87.   char       name[47];
  88.   char       flags;
  89.   word         security;
  90.   char       dpath[79];
  91.   char       upath[79];
  92.   char       descr[79];
  93.   signed char age;
  94.   word          userflags;
  95.   char       leechpercent;
  96. };
  97.  
  98. extern word numprotos;
  99. extern char path[99];
  100. extern char msgareasfile[133];
  101. extern char fileareasfile[133];
  102. extern char msgareasfilebackup[133];
  103. extern char fileareasfilebackup[133];
  104.  
  105. extern struct _mmboard huge *marea;
  106. extern struct _mmboard huge *currarea;
  107. extern word higharea;
  108. extern word maxareas;
  109. extern char msgareasfile[133];
  110. extern struct _ffboard huge *curdir;
  111. extern struct _ffboard huge *dir;
  112. extern word numdirs;
  113. extern char fileareasfile[133];
  114.  
  115. extern word numdoors;
  116.  
  117. struct   _protocol {
  118.     char   name[25];
  119.     char   key;
  120.     int    adj;
  121.     char   spawndn[119];
  122.     char   spawnup[119];
  123.     char   abort[48];
  124.     unsigned wild:         1;
  125.     unsigned multi:        1;
  126.     unsigned simul:        1;
  127.     unsigned list:        1;
  128.     unsigned opus:        1;
  129.     unsigned noname:    1;
  130.     unsigned dszlog:    1;
  131.     unsigned reserved:    1;
  132.     char   pad1;
  133.     char   pad2;
  134. };
  135.  
  136. extern struct _protocol huge *proto;
  137.  
  138. struct   _door {
  139.     char name[25];
  140.     char type[4];
  141.     char spawn[79];
  142.     char descr[79];
  143. };
  144. extern struct _door huge *door;
  145.  
  146. struct _archiver {
  147.     char ext[5];
  148.     char move[41];
  149.     char extract[41];
  150.     char list[41];
  151.     char error[41];
  152.     char aname[13];
  153.     char ename[13];
  154.     char id[25];
  155.     char pick[2];
  156.     int  skip;
  157.     int  errline;
  158. };
  159. extern struct _archiver huge *archiver;
  160. extern word numarchivers;
  161. extern WINDOW *ewnd;
  162.  
  163. extern char filename[133];
  164. extern char textname[133];
  165.  
  166. extern void   pascal swap_msgareas(word,word);
  167. extern int      pascal sort_msgareas(void);
  168. extern void   pascal swap_fileareas(word,word);
  169. extern int      pascal sort_fileareas(void);
  170. extern word   pascal select_area(word);
  171. extern char * pascal msgarea_attr(void);
  172. extern char * pascal filearea_attr (char flags);
  173. extern char * pascal rstrip(char *);
  174. extern char * pascal lstrip(char *);
  175. extern char * pascal stripcr(char *);
  176. extern void   pascal load_fileareas(char *);
  177. extern void   pascal load_msgareas(char *);
  178. extern word   pascal find_msgarea(word);
  179. extern word   pascal find_filearea(char *);
  180. extern word   pascal list_msgareas(char *);
  181. extern word   pascal list_fileareas(char *);
  182. extern word   pascal check_area(word);
  183. extern word   pascal edit_msgarea(word);
  184. extern word   pascal edit_filearea(word);
  185. extern int      pascal setup_msg(void);
  186. extern int      pascal setup_file(void);
  187. extern int           addbackslash (char *,int);
  188. extern int           nomorethan4095 (char *,int);
  189.  
  190.        void   pascal make_msgmenu(void);
  191.        void   pascal make_filemenu(void);
  192.        void   pascal load_archivers(char *);
  193.        word   pascal list_archivers(char *);
  194.        word   pascal edit_archiver(word);
  195.  
  196. extern void   pascal swap_protocols(word,word);
  197. extern int       pascal sort_protocols(void);
  198.  
  199.  
  200.  
  201. word pascal edit_msgarea (word areano) {
  202.  
  203.     WINDOW *wnd6;
  204.     FIELD *fld3;
  205.     char redid=0;
  206.     word tempno;
  207.     char descr[79];
  208.     char name[49];
  209.     char forceto[37];
  210.     char maximum[7];
  211.     char number[7];
  212.     char substat1[7];
  213.     char substat2[7];
  214.     char attr[17][3];
  215.     register word x;
  216.     int returncode;
  217.     word prev_num;
  218.     struct ffblk f;
  219.     char age[6];
  220.     char flags[17];
  221.     char zone[7];
  222.     char net[7];
  223.     char node[7];
  224.     char point[7];
  225.     char yourname[37];
  226.     char minwrite[7];
  227.  
  228.     wnd6=establish_window(16,5,25,80);
  229.     set_border(wnd6,3);
  230.     set_title(wnd6," Edit Message Area ");
  231.     set_colors(wnd6,BORDER,7,0,0);
  232.     display_window(wnd6);
  233.     wcursor(wnd6,0,0);
  234.     wprintf(wnd6,"F10=chng/exit  F9=chng  F8=Del  F7=Add  F6=Make Menu  PGUP  PGDN  ESC=exit\n");
  235.     wcursor(wnd6,53,16);
  236.     wprintf(wnd6,"*=Unused");
  237.     wcursor(wnd6,0,10);
  238.     reverse_video(wnd6);
  239.     wprintf(wnd6,"=================================Attributes====================================");
  240.     normal_video(wnd6);
  241. Again:
  242.     wprompt(wnd6,2,2,"Name:");
  243.     wprompt(wnd6,2,3,"Force to:");
  244.     wprompt(wnd6,2,4,"Maximum:");
  245.     wprompt(wnd6,2,5,"Number:");
  246.     wprompt(wnd6,2,6,"SubStat1:");
  247.     wprompt(wnd6,2,7,"SubStat2:");
  248.     wprompt(wnd6,28,7,"Age:");
  249.     wprompt(wnd6,60,7,"MinWrite:");
  250.     wprompt(wnd6,2,8,"User Flags: [                ]");
  251.     wprompt(wnd6,38,8,"Addr:");
  252.     wprompt(wnd6,49,8,":");
  253.     wprompt(wnd6,55,8,"/");
  254.     wprompt(wnd6,61,8,".");
  255.     wprompt(wnd6,2,9,"Name-to-use:");
  256.     for (x=0;x<8;x++) {
  257.         wprompt(wnd6,2,11+x,attrprompts[x]);
  258.     }
  259.     for (x=8;x<16;x++) {
  260.         wprompt(wnd6,28,3+x,attrprompts[x]);
  261.     }
  262.     wprompt(wnd6,2,20,"Description:");
  263. ReDo:
  264.     if(!maxareas) goto StartingOut;
  265.     if(!((tempno=find_msgarea(areano)))) {
  266.         init_template(wnd6);
  267.         delete_window(wnd6);
  268.         return 0;
  269.     }
  270.     prev_num=currarea->number;
  271.     init_template(wnd6);
  272.     for (x=0;x<16;x++) {
  273.         if (currarea->attr & (1<<x)) attr[x][0]='X';
  274.         else attr[x][0]='-';
  275.         attr[x][1]=0;
  276.     }
  277.     for (x=0;x<16;x++) {
  278.         if (currarea->flags & (1<<x)) flags[x]='X';
  279.         else flags[x]='-';
  280.     }
  281.     flags[16]=0;
  282.     strcpy(name,currarea->name);
  283.     strcpy(forceto,currarea->forceto);
  284.     sprintf(maximum,"%01u",currarea->max);
  285.     sprintf(number,"%01u",currarea->number);
  286.     sprintf(substat1,"%01u",currarea->substat1);
  287.     sprintf(substat2,"%01u",currarea->substat2);
  288.     sprintf(age,"%01hd",currarea->age);
  289.     sprintf(zone,"%01u",currarea->zone);
  290.     sprintf(net,"%01u",currarea->net);
  291.     sprintf(node,"%01u",currarea->node);
  292.     sprintf(point,"%01u",currarea->point);
  293.     strcpy(descr,currarea->descr);
  294.     strcpy(yourname,currarea->yourname);
  295.     sprintf(minwrite,"%01u",currarea->minwrite);
  296.     fld3=establish_field(wnd6,14,2,msk47,name,'a');
  297.     field_window(fld3,"msgname   ",40,6);
  298.     fld3=establish_field(wnd6,14,3,msk35,forceto,'a');
  299.     field_window(fld3,"msgforce  ",40,6);
  300.     fld3=establish_field(wnd6,14,4,msk5,maximum,'N');
  301.     field_window(fld3,"msgmax    ",40,6);
  302.     fld3=establish_field(wnd6,14,5,msk5,number,'N');
  303.     field_window(fld3,"msgnumber ",40,6);
  304.     field_validate(fld3,nomorethan4095);
  305.     fld3=establish_field(wnd6,14,6,msk5,substat1,'N');
  306.     field_window(fld3,"msgsub1   ",40,6);
  307.     fld3=establish_field(wnd6,14,7,msk5,substat2,'N');
  308.     field_window(fld3,"msgsub2   ",40,6);
  309.     fld3=establish_field(wnd6,34,7,msk3,age,'N');
  310.     field_window(fld3,"msgage    ",40,6);
  311.     fld3=establish_field(wnd6,70,7,msk5,minwrite,'N');
  312.     field_window(fld3,"minwrite  ",40,6);
  313.     fld3=establish_field(wnd6,15,8,msk16,flags,'O');
  314.     field_window(fld3,"msgflags  ",34,23);
  315.     fld3=establish_field(wnd6,44,8,msk5,zone,'N');
  316.     field_window(fld3,"msgzone   ",40,5);
  317.     fld3=establish_field(wnd6,50,8,msk5,net,'N');
  318.     field_window(fld3,"msgnet    ",40,5);
  319.     fld3=establish_field(wnd6,56,8,msk5,node,'N');
  320.     field_window(fld3,"msgnode   ",40,5);
  321.     fld3=establish_field(wnd6,62,8,msk5,point,'N');
  322.     field_window(fld3,"msgpoint  ",40,5);
  323.     fld3=establish_field(wnd6,16,9,msk35,yourname,'a');
  324.     field_window(fld3,"msgyour   ",40,6);
  325.     for (x=0;x<8;x++) {
  326.         fld3=establish_field(wnd6,14,11+x,msk1,attr[x],'O');
  327.         field_window(fld3,"msgattr   ",34,23);
  328.     }
  329.     for (x=8;x<16;x++) {
  330.         fld3=establish_field(wnd6,40,3+x,msk1,attr[x],'O');
  331.         field_window(fld3,"msgattr   ",34,23);
  332.     }
  333.     fld3=establish_field(wnd6,1,21,msk78,descr,'a');
  334.     field_window(fld3,"msgdescr  ",40,1);
  335.  
  336.     prep_template(wnd6);
  337. AskOver:
  338.     returncode=data_entry(wnd6);
  339.     if (returncode==F6) {
  340.         make_msgmenu();
  341.         goto ReDo;
  342.     }
  343.     if (returncode==PGUP) {
  344.         if(tempno==1) tempno=maxareas;
  345.         else tempno--;
  346.         areano=marea[tempno-1].number;
  347.         goto ReDo;
  348.     }
  349.     if (returncode==PGDN) {
  350.         if(tempno>=maxareas) tempno=1;
  351.         else tempno++;
  352.         areano=marea[tempno-1].number;
  353.         goto ReDo;
  354.     }
  355.     if (returncode==F8) {
  356.         if (tempno!=maxareas) {
  357.             if(marea[tempno-1].number==higharea) higharea--;
  358.             for(x=tempno;x<maxareas;x++) {
  359.                 memcpy((void *)&marea[x-1],(void *)&marea[x],(word)sizeof(struct _mmboard));
  360.             }
  361.         }
  362.         redid=1;
  363.         maxareas--;
  364.         sprintf(filename,"%sXDATA.%03x",path,prev_num);
  365.         if(!findfirst(filename,&f,0)) {
  366.             any_message(" Delete message area files? (Y-n) ");
  367.             returncode=toupper(generic_mouse_input(ewnd));
  368.             clear_message();
  369.             if(returncode=='Y' || returncode==13) {
  370.                 unlink(filename);
  371.                 sprintf(filename,"%sXTEXT.%03x",path,prev_num);
  372.                 unlink(filename);
  373.                 sprintf(filename,"%sMDUPS.%03x",path,prev_num);
  374.                 unlink(filename);
  375.                 any_message(" Area deleted ");
  376.                 pause_msg();
  377.             }
  378.         }
  379.         if(!maxareas) {
  380.             init_template(wnd6);
  381.             delete_window(wnd6);
  382.             return (word)redid;
  383.         }
  384.         if(tempno>maxareas) tempno=maxareas;
  385.         areano=marea[tempno-1].number;
  386.         goto ReDo;
  387.     }
  388.     if (returncode==F7) {
  389.         if(maxareas==MAXNUMAREA) {
  390.             error_message(" Sorry, I'm already maxed out... ");
  391.             pause_msg();
  392.             goto ReDo;
  393.         }
  394. StartingOut:
  395.         redid=1;
  396.         maxareas++;
  397.         strcpy(marea[maxareas-1].name,"New Area");
  398.         strset(marea[maxareas-1].forceto,0);
  399.         marea[maxareas-1].max=50;
  400.         marea[maxareas-1].attr=0;
  401.         marea[maxareas-1].substat1=6;
  402.         marea[maxareas-1].substat2=0;
  403.         marea[maxareas-1].age=0;
  404.         marea[maxareas-1].flags=0;
  405.         marea[maxareas-1].zone=0;
  406.         marea[maxareas-1].net=0;
  407.         marea[maxareas-1].node=0;
  408.         marea[maxareas-1].point=0;
  409.         *marea[maxareas-1].yourname=0;
  410.         marea[maxareas-1].minwrite=0;
  411.         strcpy(marea[maxareas-1].descr,"No Description");
  412.         higharea++;
  413.         areano=higharea;
  414.         marea[maxareas-1].number=areano;
  415.         tempno=maxareas;
  416.         goto ReDo;
  417.     }
  418.     if (returncode==ESC) goto Quit;
  419.     if (returncode!=F10 && returncode!=F9) goto AskOver;
  420.     rstrip(name);
  421.     lstrip(name);
  422.     rstrip(forceto);
  423.     lstrip(forceto);
  424.     lstrip(yourname);
  425.     rstrip(yourname);
  426.     rstrip(descr);
  427.     lstrip(descr);
  428.     if (!*name) {
  429.         error_message(" Blank name field ");
  430.         pause_msg();
  431.         if(returncode==F9) goto ReDo;
  432.         delete_window(wnd6);
  433.         if(redid) {
  434.             sort_msgareas();
  435.             return 1;
  436.         }
  437.         return 0;
  438.     }
  439.     strcpy(marea[tempno-1].name,name);
  440.     strcpy(marea[tempno-1].forceto,forceto);
  441.     marea[tempno-1].max=(word)atol(maximum);
  442.     marea[tempno-1].number=(word)atol(number);
  443.     marea[tempno-1].substat1=(word)atol(substat1);
  444.     marea[tempno-1].substat2=(word)atol(substat2);
  445.     marea[tempno-1].age=(signed char)atoi(age);
  446.     marea[tempno-1].zone=(word)atol(zone);
  447.     marea[tempno-1].net=(word)atol(net);
  448.     marea[tempno-1].node=(word)atol(node);
  449.     marea[tempno-1].point=(word)atol(point);
  450.     strcpy(marea[tempno-1].yourname,yourname);
  451.     strcpy(marea[tempno-1].descr,descr);
  452.     marea[tempno-1].minwrite=atol(minwrite);
  453.     for (x=0;x<16;x++) {
  454.         if (attr[x][0]=='X') marea[tempno-1].attr = (marea[tempno-1].attr | (1<<x));
  455.         else marea[tempno-1].attr = (marea[tempno-1].attr & (~(1<<x)));
  456.     }
  457.     for (x=0;x<16;x++) {
  458.         if (flags[x]=='X') marea[tempno-1].flags = (marea[tempno-1].flags | (1<<x));
  459.         else marea[tempno-1].flags = (marea[tempno-1].flags & (~(1<<x)));
  460.     }
  461.     redid=1;
  462.     if(prev_num!=marea[tempno-1].number) {
  463.  
  464.         char swapping=0;
  465.  
  466.         sprintf(filename,"%sXDATA.%03x",path,prev_num);
  467.         if(!findfirst(filename,&f,0)) {
  468.             any_message(" Move message area files? (Y-n) ");
  469.             returncode=toupper(generic_mouse_input(ewnd));
  470.             clear_message();
  471.             if(returncode=='Y' || returncode==13) {
  472.                 sprintf(filename,"%sXDATA.%03x",path,marea[tempno-1].number);
  473.                 if(!findfirst(filename,&f,0)) {
  474.                     _anymsg(" WARNING: New area already exists! "," [D]elete old area  [S]wap areas: [S] ");
  475.                     returncode=toupper(generic_mouse_input(ewnd));
  476.                     clear_message();
  477.                     if(returncode=='S' || returncode==13) swapping=1;
  478.                     else if(returncode==ESC) goto Outathis;
  479.                     else if(returncode=='D') {
  480.                         unlink(filename);
  481.                         sprintf(filename,"%sXTEXT.%03x",path,marea[tempno-1].number);
  482.                         unlink(filename);
  483.                         sprintf(filename,"%sMDUPS.%03x",path,marea[tempno-1].number);
  484.                         unlink(filename);
  485.                     }
  486.                 }
  487.                 if(swapping) {
  488.                     sprintf(filename,"%sXDATA.%03x",path,marea[tempno-1].number);
  489.                     sprintf(textname,"%sXDATA.$$$",path);
  490.                     unlink(textname);
  491.                     rename(filename,textname);
  492.                     sprintf(filename,"%sXTEXT.%03x",path,marea[tempno-1].number);
  493.                     sprintf(textname,"%sXTEXT.$$$",path);
  494.                     unlink(textname);
  495.                     rename(filename,textname);
  496.                     sprintf(filename,"%sMDUPS.%03x",path,marea[tempno-1].number);
  497.                     sprintf(textname,"%sMDUPS.$$$",path);
  498.                     unlink(textname);
  499.                     rename(filename,textname);
  500.                 }
  501.                 sprintf(filename,"%sXDATA.%03x",path,prev_num);
  502.                 sprintf(textname,"%sXDATA.%03x",path,marea[tempno-1].number);
  503.                 rename(filename,textname);
  504.                 sprintf(filename,"%sXTEXT.%03x",path,prev_num);
  505.                 sprintf(textname,"%sXTEXT.%03x",path,marea[tempno-1].number);
  506.                 rename(filename,textname);
  507.                 sprintf(filename,"%sMDUPS.%03x",path,prev_num);
  508.                 sprintf(textname,"%sMDUPS.%03x",path,marea[tempno-1].number);
  509.                 rename(filename,textname);
  510.                 if(swapping) {
  511.                     sprintf(filename,"%sXDATA.%03x",path,prev_num);
  512.                     sprintf(textname,"%sXDATA.$$$",path);
  513.                     rename(textname,filename);
  514.                     sprintf(filename,"%sXTEXT.%03x",path,prev_num);
  515.                     sprintf(textname,"%sXTEXT.$$$",path);
  516.                     rename(textname,filename);
  517.                     sprintf(filename,"%sMDUPS.%03x",path,prev_num);
  518.                     sprintf(textname,"%sMDUPS.$$$",path);
  519.                     rename(textname,filename);
  520.                     for(x=0;x<maxareas;x++) {
  521.                         if(marea[x].number==marea[tempno-1].number && x!=tempno-1) {
  522.                             marea[x].number=prev_num;
  523.                             break;
  524.                         }
  525.                     }
  526.                     any_message(" Areas swapped ");
  527.                 }
  528.                 else any_message(" Area moved ");
  529.                 pause_msg();
  530.             }
  531.         }
  532.     }
  533. Outathis:
  534.     if(returncode==F9) goto ReDo;
  535.     sort_msgareas();
  536.     init_template(wnd6);
  537.     delete_window(wnd6);
  538.     return 1;
  539. Quit:
  540.     init_template(wnd6);
  541.     delete_window(wnd6);
  542.     if (redid) {
  543.         sort_msgareas();
  544.         return 1;
  545.     }
  546.     return 0;
  547. }
  548.  
  549.  
  550.  
  551. int pascal sort_msgareas (void) {    /* Simple bubble-sort */
  552.  
  553.     register word x;
  554.     char swapped=1;
  555.  
  556.     if(maxareas==1) return 0;
  557.     any_message(" Sorting ");
  558.     while(swapped) {
  559.         swapped=0;
  560.         for(x=1;x<maxareas;x++) {
  561.             if(marea[x].number<marea[x-1].number) {
  562.                 swap_msgareas(x-1,x);
  563.                 swapped=1;
  564.             }
  565.         }
  566.     }
  567.     clear_message();
  568.     return 0;
  569. }
  570.  
  571.  
  572.  
  573. void pascal swap_msgareas (word x, word y) {
  574.  
  575.     static struct _mmboard temp;
  576.  
  577.     memcpy((void *)&temp,(void *)&marea[x],(word)sizeof(struct _mmboard));
  578.     memcpy((void *)&marea[x],(void *)&marea[y],(word)sizeof(struct _mmboard));
  579.     memcpy((void *)&marea[y],(void *)&temp,(word)sizeof(struct _mmboard));
  580. }
  581.  
  582.  
  583.  
  584. int pascal setup_msg (void) {
  585.  
  586.     WINDOW *wnd6;
  587.     FIELD *fld3;
  588.     int returncode;
  589.  
  590. Again:
  591.     wnd6=establish_window(1,18,12,80);
  592.     set_border(wnd6,3);
  593.     set_title(wnd6," Msg Area File ");
  594.     set_colors(wnd6,BORDER,7,0,0);
  595.     display_window(wnd6);
  596.     wcursor(wnd6,0,0);
  597.     wprintf(wnd6,"\n                                F10 when done\n");
  598.     init_template(wnd6);
  599.     wprompt(wnd6,1,3,"File to edit:");
  600.     wprompt(wnd6,1,5,"Path to msg areas:");
  601.     wprompt(wnd6,1,7,"Backup file:");
  602.     fld3=establish_field(wnd6,0,4,msk78,msgareasfile,'a');
  603.     field_window(fld3,"msgfile   ",40,1);
  604.     fld3=establish_field(wnd6,0,6,msk78,path,'a');
  605.     field_window(fld3,"msgpath   ",40,2);
  606.     field_validate(fld3,addbackslash);
  607.     fld3=establish_field(wnd6,0,8,msk78,msgareasfilebackup,'a');
  608.     field_window(fld3,"msgbackup ",40,3);
  609.     prep_template(wnd6);
  610. AskOver:
  611.     returncode=data_entry(wnd6);
  612.     if(returncode==ESC) {
  613.         delete_window(wnd6);
  614.         return 0;
  615.     }
  616.     if (returncode!=F10) goto AskOver;
  617.     lstrip(msgareasfile);
  618.     rstrip(msgareasfile);
  619.     lstrip(path);
  620.     rstrip(path);
  621.     lstrip(msgareasfilebackup);
  622.     rstrip(msgareasfilebackup);
  623.     delete_window(wnd6);
  624.     if(!*msgareasfile || !*path) return 0;
  625.     marea=(struct _mmboard huge*)malloc((MAXNUMAREA*sizeof(struct _mmboard))+sizeof(struct _mmboard));
  626.     if (marea==NULL) {
  627.         error_message(" No memory for msg areas ");
  628.         maxareas=0;
  629.         exit(1);
  630.     }
  631.     return 1;
  632. }
  633.  
  634.  
  635.  
  636. int pascal setup_file (void) {
  637.  
  638.     WINDOW *wnd6;
  639.     FIELD *fld3;
  640.     int returncode;
  641.  
  642. Again:
  643.     wnd6=establish_window(1,18,10,80);
  644.     set_border(wnd6,3);
  645.     set_title(wnd6," File Area File ");
  646.     set_colors(wnd6,BORDER,7,0,0);
  647.     display_window(wnd6);
  648.     wcursor(wnd6,0,0);
  649.     wprintf(wnd6,"\n                                F10 when done\n");
  650.     init_template(wnd6);
  651.     wprompt(wnd6,1,3,"File to edit:");
  652.     wprompt(wnd6,1,5,"Backup file:");
  653.     fld3=establish_field(wnd6,0,4,msk78,fileareasfile,'a');
  654.     field_window(fld3,"filefile  ",40,1);
  655.     fld3=establish_field(wnd6,0,6,msk78,fileareasfilebackup,'a');
  656.     field_window(fld3,"filebackup",40,3);
  657.     prep_template(wnd6);
  658. AskOver:
  659.     returncode=data_entry(wnd6);
  660.     if(returncode==ESC) {
  661.         delete_window(wnd6);
  662.         return 0;
  663.     }
  664.     if (returncode!=F10) goto AskOver;
  665.     lstrip(fileareasfile);
  666.     rstrip(fileareasfile);
  667.     lstrip(fileareasfilebackup);
  668.     rstrip(fileareasfilebackup);
  669.     delete_window(wnd6);
  670.     if(!*fileareasfile) return 0;
  671.     dir=(struct _ffboard huge*)malloc((MAXNUMDIRS*sizeof(struct _ffboard))+sizeof(struct _ffboard));
  672.     if (dir==NULL) {
  673.         error_message(" No memory for file areas ");
  674.         numdirs=0;
  675.         exit(1);
  676.     }
  677.     return 1;
  678. }
  679.  
  680.  
  681.  
  682. int addbackslash (char *bf,int key) {
  683.  
  684.   int register x;
  685.  
  686.   for (x=77;x>(-1);x--) {
  687.     if (bf[x]!=' ') {
  688.         break;
  689.     }
  690.   }
  691.   if (x<0) {
  692.     x=0;
  693.     *bf='\\';
  694.   }
  695.   if (bf[x]!='\\') {
  696.     if (x>77) {
  697.         error_message(" Too long...No room for trailing backslash! ");
  698.         return ERROR;
  699.     }
  700.     bf[x+1]='\\';
  701.   }
  702.   return 0;
  703. }
  704.  
  705.  
  706.  
  707. int nomorethan4095 (char *bf,int key) {
  708.  
  709.     if((word)atol(bf)>4095 || (word)atol(bf)<1) {
  710.         error_message(" Valid area numbers are 1-4095 ");
  711.         return ERROR;
  712.     }
  713.     return 0;
  714. }
  715.  
  716.  
  717.  
  718. word pascal list_fileareas (char *fileareasname) {
  719.  
  720.     word areano;
  721.     char s[181];
  722.     word lineareas[25];
  723.     word counter;
  724.     register word x;
  725.     int  temporary;
  726.     int  selection;
  727.  
  728.         set_help("fileareali",18,0);
  729.         if(wnd4)delete_window(wnd4);
  730.         wnd4=establish_window(0,0,25,80);
  731.         set_border(wnd4,1);
  732.         sprintf(s," Listing areas in file %s ",fileareasname);
  733.         s[76]=0;
  734.         set_title(wnd4,s);
  735.         display_window(wnd4);
  736.         wcursor(wnd4,0,0);
  737.         x=0;
  738. OverAgain:
  739.         counter=0;
  740.         for(temporary=0;temporary<25;temporary++)lineareas[temporary]=0;
  741.         if(x>=numdirs)x=0;
  742.         while(1) {
  743.                 lineareas[counter]=x+1;
  744.                 wprintf(wnd4,"%-14.14s %05u ",dir[x].name,dir[x].security);
  745.                 wprintf(wnd4,"%s %-20.20s %-20.20s",filearea_attr(dir[x].flags),dir[x].dpath,dir[x].upath);
  746.                 x++;
  747.                 counter++;
  748.                 if (counter>=23 || x>=numdirs) {
  749.                     break;
  750.                 }
  751.                 wprintf(wnd4,"\n");
  752.         }
  753. Again:
  754.                 selection=get_selection(wnd4,1,NULL);
  755.                 if(selection>0 && selection<24) {
  756.                     if(lineareas[selection-1])areano=lineareas[selection-1];
  757.                     else {
  758.                         fputs("\x7",stdout);
  759.                         goto Again;
  760.                     }
  761.                     find_filearea(dir[areano-1].name);
  762.                     return areano;
  763.                 }
  764.                 switch (selection) {
  765.                     case HOME:  x=0;
  766.                                 break;
  767.                     case END:   if(numdirs>22) x=numdirs-23;
  768.                                 else x=0;
  769.                                 break;
  770.                     case PGUP:
  771.                     case BS:    if(x<24 && numdirs>22) {
  772.                                     x=numdirs-23;
  773.                                     if(x>numdirs)x=0;
  774.                                     break;
  775.                                 }
  776.                                 if (x<22) break;
  777.                                 else if (x<44) x=0;
  778.                                 else x-=45;
  779.                                 break;
  780.                     case PGDN:
  781.                     case FWD:   if (x>=numdirs) x=0;
  782.                                 else if ((numdirs-x)<23) {
  783.                                     if (numdirs>22) x=numdirs-23;
  784.                                     else x=0;
  785.                                 }
  786.                                 break;
  787.                     case 0:     goto BreakOut;
  788.                     default:    fputs("\x7",stdout);
  789.                                 break;
  790.                 }
  791.                 counter=0;
  792.                 clear_window(wnd4);
  793.                 wcursor(wnd4,0,0);
  794.                 goto OverAgain;
  795. BreakOut:
  796.                 return 0;
  797. }
  798.  
  799.  
  800.  
  801. int pascal sort_fileareas (void) {    /* Simple bubble-sort */
  802.  
  803.     register word x;
  804.     char swapped=1;
  805.  
  806.     if(numdirs==1) return 0;
  807.     any_message(" Sorting ");
  808.     while(swapped) {
  809.         swapped=0;
  810.         for(x=1;x<numdirs;x++) {
  811.             if(strcmp(dir[x].name,dir[x-1].name)<0) {
  812.                 swap_fileareas(x-1,x);
  813.                 swapped=1;
  814.             }
  815.         }
  816.     }
  817.     clear_message();
  818.     return 0;
  819. }
  820.  
  821.  
  822.  
  823. void pascal swap_fileareas (word x, word y) {
  824.  
  825.     static struct _ffboard temp;
  826.  
  827.     memcpy((void *)&temp,(void *)&dir[x],(word)sizeof(struct _ffboard));
  828.     memcpy((void *)&dir[x],(void *)&dir[y],(word)sizeof(struct _ffboard));
  829.     memcpy((void *)&dir[y],(void *)&temp,(word)sizeof(struct _ffboard));
  830. }
  831.  
  832.  
  833.  
  834. word pascal edit_filearea (word areano) {
  835.  
  836.     WINDOW *wnd6;
  837.     FIELD *fld3;
  838.     char s[133];
  839.     char redid=0;
  840.     char descr[79];
  841.     char name[49];
  842.     char security[7];
  843.     char upload[80];
  844.     char download[80];
  845.     char attr[9][4];
  846.     char userflags[17];
  847.     register word x;
  848.     int returncode;
  849.     char age[6];
  850.     char leech[6];
  851.  
  852.     wnd6=establish_window(1,5,24,80);
  853.     set_border(wnd6,3);
  854.     set_title(wnd6," Edit File Area ");
  855.     set_colors(wnd6,BORDER,7,0,0);
  856.     display_window(wnd6);
  857.     wcursor(wnd6,0,0);
  858.     wprintf(wnd6," F10=chng/exit  F9=chng  F8=Del  F7=Add  F6=Sort\n F5=MD  F4=Make Menu  PGUP  PGDN  ESC=exit\n");
  859.     wcursor(wnd6,69,16);
  860.     wprintf(wnd6,"*=Unused");
  861.     reverse_video(wnd6);
  862.     wcursor(wnd6,0,9);
  863.     wprintf(wnd6,"=================================Attributes====================================");
  864.     normal_video(wnd6);
  865. Again:
  866.     wprompt(wnd6,2,3,"Name:");
  867.     wprompt(wnd6,60,3,"Leech:");
  868.     wprompt(wnd6,2,4,"Security:");
  869.     wprompt(wnd6,32,4,"Age:");
  870.     wprompt(wnd6,47,4,"User Flags: [                ]");
  871.     wprompt(wnd6,2,5,"Download Path:");
  872.     wprompt(wnd6,2,7,"Upload Path:");
  873.     for (x=0;x<8;x++) {
  874.         wprompt(wnd6,2,10+x,fileattrprompts[x]);
  875.     }
  876.     wprompt(wnd6,2,19,"Description:");
  877. ReDo:
  878.     if(!numdirs) goto StartingOut;
  879.     init_template(wnd6);
  880.     for (x=0;x<8;x++) {
  881.         if (dir[areano].flags & (1<<x)) attr[x][0]='X';
  882.         else attr[x][0]='-';
  883.         attr[x][1]=0;
  884.     }
  885.     for (x=0;x<16;x++) {
  886.         if (dir[areano].userflags & (1<<x)) userflags[x]='X';
  887.         else userflags[x]='-';
  888.     }
  889.     userflags[16]=0;
  890.     strcpy(name,dir[areano].name);
  891.     strcpy(descr,dir[areano].descr);
  892.     sprintf(security,"%01u",dir[areano].security);
  893.     strcpy(download,dir[areano].dpath);
  894.     strcpy(upload,dir[areano].upath);
  895.     sprintf(age,"%01hd",dir[areano].age);
  896.     sprintf(leech,"%01hu",dir[areano].leechpercent);
  897.     fld3=establish_field(wnd6,14,3,msk46,name,'a');
  898.     field_window(fld3,"filename  ",40,6);
  899.     fld3=establish_field(wnd6,69,3,msk3,leech,'N');
  900.     field_window(fld3,"leech%    ",40,6);
  901.     fld3=establish_field(wnd6,14,4,msk5,security,'N');
  902.     field_window(fld3,"security  ",40,6);
  903.     fld3=establish_field(wnd6,37,4,msk3,age,'N');
  904.     field_window(fld3,"fileage   ",40,6);
  905.     fld3=establish_field(wnd6,60,4,msk16,userflags,'O');
  906.     field_window(fld3,"fileflags ",34,23);
  907.     fld3=establish_field(wnd6,0,6,msk78,download,'a');
  908.     field_window(fld3,"download  ",40,6);
  909.     fld3=establish_field(wnd6,0,8,msk78,upload,'a');
  910.     field_window(fld3,"upload    ",40,6);
  911.     for (x=0;x<8;x++) {
  912.         fld3=establish_field(wnd6,13,10+x,msk1,attr[x],'O');
  913.         field_window(fld3,"fileattr  ",34,23);
  914.     }
  915.     fld3=establish_field(wnd6,0,20,msk78,descr,'a');
  916.     field_window(fld3,"filedescr ",40,1);
  917.     prep_template(wnd6);
  918. AskOver:
  919.     returncode=data_entry(wnd6);
  920.     if (returncode==PGUP) {
  921.         if(!areano) areano=numdirs-1;
  922.         else areano--;
  923.         goto ReDo;
  924.     }
  925.     if (returncode==PGDN) {
  926.         if(areano>=(numdirs-1)) areano=0;
  927.         else areano++;
  928.         goto ReDo;
  929.     }
  930.     if (returncode==F4) {
  931.         make_filemenu();
  932.         goto ReDo;
  933.     }
  934.     if (returncode==F6) {
  935.         sort_fileareas();
  936.         goto ReDo;
  937.     }
  938.     if (returncode==F8) {
  939.         if (areano<numdirs) {
  940.             for(x=areano+1;x<numdirs;x++) {
  941.                 memcpy((void *)&dir[x-1],(void *)&dir[x],(word)sizeof(struct _ffboard));
  942.             }
  943.         }
  944.         redid=1;
  945.         numdirs--;
  946.         if(!numdirs) {
  947.             delete_window(wnd6);
  948.             return (word)redid;
  949.         }
  950.         if(areano>(numdirs-1)) areano=numdirs-1;
  951.         goto ReDo;
  952.     }
  953.     if (returncode==F7) {
  954.         if(numdirs==MAXNUMDIRS) {
  955.             error_message(" Sorry, I'm already maxed out... ");
  956.             pause_msg();
  957.             goto ReDo;
  958.         }
  959. StartingOut:
  960.         redid=1;
  961.         numdirs++;
  962.         strcpy(dir[numdirs-1].name,"New Area");
  963.         strcpy(dir[numdirs-1].dpath,"C:\\");
  964.         strcpy(dir[numdirs-1].upath,"NUL");
  965.         dir[numdirs-1].security=6;
  966.         dir[numdirs-1].flags=0;
  967.         dir[numdirs-1].age=0;
  968.         dir[numdirs-1].userflags=0;
  969.         strcpy(dir[numdirs-1].descr,"No Description");
  970.         dir[numdirs-1].leechpercent=0;
  971.         areano=numdirs-1;
  972.         goto ReDo;
  973.     }
  974.     if(returncode==F5) {
  975.         strcpy(s,dir[areano].dpath);
  976.         lstrip(s);
  977.         rstrip(s);
  978.         if(mkdir(s)) {
  979.             any_message(" Download directory--Exists or bad ");
  980.             pause_msg();
  981.         }
  982.         else {
  983.             any_message(" Download directory created ");
  984.             pause_msg();
  985.         }
  986.         strcpy(s,dir[areano].upath);
  987.         lstrip(s);
  988.         rstrip(s);
  989.         strupr(s);
  990.         if(strcmp(s,"NUL") && strcmp(s,"NUL\\")) {
  991.             if(mkdir(s)) {
  992.                 any_message(" Upload directory--Exists or bad ");
  993.                 pause_msg();
  994.             }
  995.             else {
  996.                 any_message(" Upload directory created ");
  997.                 pause_msg();
  998.             }
  999.         }
  1000.     }
  1001.     if (returncode==ESC) goto Quit;
  1002.     if (returncode!=F10 && returncode!=F9) goto AskOver;
  1003.     rstrip(name);
  1004.     lstrip(name);
  1005.     rstrip(download);
  1006.     lstrip(download);
  1007.     rstrip(upload);
  1008.     lstrip(upload);
  1009.     rstrip(descr);
  1010.     lstrip(descr);
  1011.     if(!*upload) strcpy(upload,"NUL");
  1012.     if (!*name || !*download) {
  1013.         error_message(" Blank name and/or download path field(s) ");
  1014.         pause_msg();
  1015.         if(returncode==F9) goto ReDo;
  1016.         delete_window(wnd6);
  1017.         if(redid) {
  1018.             return 1;
  1019.         }
  1020.         return 0;
  1021.     }
  1022.     strcpy(dir[areano].name,name);
  1023.     strcpy(dir[areano].dpath,download);
  1024.     strcpy(dir[areano].upath,upload);
  1025.     dir[areano].security=(word)atol(security);
  1026.     dir[areano].age=(signed char)atoi(age);
  1027.     strcpy(dir[areano].descr,descr);
  1028.     dir[areano].leechpercent=(char)atoi(leech);
  1029.     for (x=0;x<8;x++) {
  1030.         if (attr[x][0]=='X') dir[areano].flags = (dir[areano].flags | (1<<x));
  1031.         else dir[areano].flags = (dir[areano].flags & (~(1<<x)));
  1032.     }
  1033.     for (x=0;x<16;x++) {
  1034.         if (userflags[x]=='X') dir[areano].userflags = (dir[areano].userflags | (1<<x));
  1035.         else dir[areano].userflags = (dir[areano].userflags & (~(1<<x)));
  1036.     }
  1037.     redid=1;
  1038.     if(returncode==F9) goto ReDo;
  1039.     delete_window(wnd6);
  1040.     return 1;
  1041. Quit:
  1042.     if (redid) {
  1043.         delete_window(wnd6);
  1044.         return 1;
  1045.     }
  1046.     delete_window(wnd6);
  1047.     return 0;
  1048. }
  1049.  
  1050.  
  1051.  
  1052. word pascal list_protocols (char *name) {
  1053.  
  1054.     word areano;
  1055.     char s[181];
  1056.     word lineareas[25];
  1057.     word counter;
  1058.     register word x;
  1059.     int  temporary;
  1060.     int  selection;
  1061.  
  1062.         set_help("protolist ",18,0);
  1063.         if(wnd4)delete_window(wnd4);
  1064.         wnd4=establish_window(0,0,25,80);
  1065.         set_border(wnd4,1);
  1066.         sprintf(s," Listing protocols in file %s ",name);
  1067.         s[76]=0;
  1068.         set_title(wnd4,s);
  1069.         display_window(wnd4);
  1070.         wcursor(wnd4,0,0);
  1071.         x=0;
  1072. OverAgain:
  1073.         counter=0;
  1074.         for(temporary=0;temporary<25;temporary++)lineareas[temporary]=0;
  1075.         if(x>=numprotos)x=0;
  1076.         while(1) {
  1077.                 lineareas[counter]=x+1;
  1078.                 wprintf(wnd4,"%-25.25s [%c] %-43.43s",proto[x].name,proto[x].key,proto[x].spawndn);
  1079.                 x++;
  1080.                 counter++;
  1081.                 if (counter>=23 || x>=numprotos) {
  1082.                     break;
  1083.                 }
  1084.                 wprintf(wnd4,"\n");
  1085.         }
  1086. Again:
  1087.                 selection=get_selection(wnd4,1,NULL);
  1088.                 if(selection>0 && selection<24) {
  1089.                     if(lineareas[selection-1])areano=lineareas[selection-1];
  1090.                     else {
  1091.                         fputs("\x7",stdout);
  1092.                         goto Again;
  1093.                     }
  1094.                     return areano;
  1095.                 }
  1096.                 switch (selection) {
  1097.                     case HOME:  x=0;
  1098.                                 break;
  1099.                     case END:   if(numprotos>22) x=numprotos-23;
  1100.                                 else x=0;
  1101.                                 break;
  1102.                     case PGUP:
  1103.                     case BS:    if(x<24 && numprotos>22) {
  1104.                                     x=numprotos-23;
  1105.                                     if(x>numprotos)x=0;
  1106.                                     break;
  1107.                                 }
  1108.                                 if (x<22) break;
  1109.                                 else if (x<44) x=0;
  1110.                                 else x-=45;
  1111.                                 break;
  1112.                     case PGDN:
  1113.                     case FWD:   if (x>=numprotos) x=0;
  1114.                                 else if ((numprotos-x)<23) {
  1115.                                     if (numprotos>22) x=numprotos-23;
  1116.                                     else x=0;
  1117.                                 }
  1118.                                 break;
  1119.                     case 0:     goto BreakOut;
  1120.                     default:    fputs("\x7",stdout);
  1121.                                 break;
  1122.                 }
  1123.                 counter=0;
  1124.                 clear_window(wnd4);
  1125.                 wcursor(wnd4,0,0);
  1126.                 goto OverAgain;
  1127. BreakOut:
  1128.                 return 0;
  1129. }
  1130.