home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / W / WWIVSOR.ZIP / DIREDIT.C < prev    next >
C/C++ Source or Header  |  1995-04-25  |  12KB  |  521 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.                     Copyright (C) 1988-1995 by Wayne Bell
  5.  
  6. Distribution of the source code for WWIV, in any form, modified or unmodified,
  7. without PRIOR, WRITTEN APPROVAL by the author, is expressly prohibited.
  8. Distribution of compiled versions of WWIV is limited to copies compiled BY
  9. THE AUTHOR.  Distribution of any copies of WWIV not compiled by the author
  10. is expressly prohibited.
  11.  
  12.  
  13. *****************************************************************************/
  14.  
  15.  
  16.  
  17. #include "vars.h"
  18.  
  19. #pragma hdrstop
  20.  
  21. #include <dir.h>
  22.  
  23.  
  24. void dirdata(int n, char *s)
  25. {
  26.   char x,i;
  27.   directoryrec r;
  28.  
  29.   r=directories[n];
  30.   if (r.dar==0)
  31.     x=32;
  32.   else {
  33.     for (i=0; i<16; i++)
  34.       if ((1 << i) & r.dar)
  35.         x='A'+i;
  36.   }
  37.   sprintf(s,"%4d %1c   %-39.39s %-8s %-3d %-3d %-3d %-9.9s",
  38.             n,x,stripcolors(r.name),r.filename,r.dsl,r.age,r.maxfiles,
  39.             r.path);
  40. }
  41.  
  42. void showdirs(void)
  43. {
  44.   int abort,i;
  45.   char s[180];
  46.  
  47.   outchr(12);
  48.   abort=0;
  49.   pla(get_string(133),
  50.       &abort);
  51.   pla(get_string(134),
  52.       &abort);
  53.   for (i=0; (i<num_dirs) && (!abort); i++) {
  54.     dirdata(i,s);
  55.     pla(s,&abort);
  56.   }
  57. }
  58.  
  59.  
  60.  
  61. void modify_dir(int n)
  62. {
  63.   directoryrec r;
  64.   char s[81],ch,ch2;
  65.   int i,done;
  66.  
  67.   r=directories[n];
  68.   done=0;
  69.   do {
  70.     outchr(12);
  71.     outstr(get_string(62)); pl(r.name);
  72.     outstr(get_string(63)); pl(r.filename);
  73.     outstr(get_string(135)); pl(r.path);
  74.     outstr(get_string(136)); pln(r.dsl);
  75.     outstr(get_string(137)); pln(r.age);
  76.     outstr(get_string(138)); pln(r.maxfiles);
  77.     strcpy(s,get_string(5));
  78.     if (r.dar!=0) {
  79.       for (i=0; i<16; i++)
  80.         if ((1 << i) & r.dar)
  81.           s[0]='A'+i;
  82.       s[1]=0;
  83.     }
  84.     outstr(get_string(139)); pl(s);
  85.     outstr(get_string(140)); pl((r.mask&mask_PD)?str_yes:str_no);
  86.     outstr(get_string(141)); pln(r.type);
  87.     outstr(get_string(142));
  88.     pl((r.mask & mask_no_uploads) ? get_string(143) : get_string(115));
  89.     outstr(get_string(144));
  90.     pl((r.mask & mask_archive) ? str_yes : str_no);
  91.     outstr(get_string(1153));
  92.     if (r.mask & mask_cdrom)
  93.       pl(get_string(1154));
  94.     else
  95.       pl(get_string(1155));
  96.     if (r.mask & mask_cdrom) {
  97.       outstr(get_string(1497));
  98.       if (r.mask & mask_offline)
  99.         pl(str_no);
  100.       else
  101.         pl(str_yes);
  102.     }
  103.     nl();
  104.     prt(2,get_string(1498));
  105.     ch=onek("QABCDEFGHIJKLM[]");
  106.     switch(ch) {
  107.       case 'Q':done=1; break;
  108.       case '[':
  109.         directories[n]=r;
  110.         if (--n<0)
  111.           n=num_dirs-1;
  112.         r=directories[n];
  113.         break;
  114.       case ']':
  115.         directories[n]=r;
  116.         if (++n>=num_dirs)
  117.           n=0;
  118.         r=directories[n];
  119.         break;
  120.       case 'A':
  121.         nl();
  122.         prt(2,get_string(69));
  123.         inputl(s,40);
  124.         if (s[0])
  125.           strcpy(r.name,s);
  126.         break;
  127.       case 'B':
  128.         nl();
  129.         prt(2,get_string(72));
  130.         inputf(s,8);
  131.         if ((s[0]!=0) && (strchr(s,'.')==0))
  132.           strcpy(r.filename,s);
  133.         break;
  134.       case 'C':
  135.         nl();
  136.         pl(get_string(145));
  137.         pl(get_string(146));
  138.         prt(2,get_string(147));
  139.         input(s,80);
  140.         if (s[0]) {
  141.           if (chdir(s)) {
  142.             cd_to(cdir);
  143.             if (mkdir(s)) {
  144.               pl(get_string(148));
  145.               pl(get_string(149));
  146.               getkey();
  147.               s[0]=0;
  148.             }
  149.           } else {
  150.             cd_to(cdir);
  151.           }
  152.           if (s[0]) {
  153.             strcat(s,"\\");
  154.             strcpy(r.path,s);
  155.             pl(get_string(150));
  156.             pl(get_string(151));
  157.             pl(get_string(152));
  158.             pl(get_string(149));
  159.             getkey();
  160.           }
  161.         }
  162.         break;
  163.       case 'D':
  164.         nl();
  165.         prt(2,get_string(153));
  166.         input(s,3);
  167.         i=atoi(s);
  168.         if ((i>=0) && (i<256) && (s[0]))
  169.           r.dsl=i;
  170.         break;
  171.       case 'E':
  172.         nl();
  173.         prt(2,get_string(77));
  174.         input(s,3);
  175.         i=atoi(s);
  176.         if ((i>=0) && (i<128) && (s[0]))
  177.           r.age=i;
  178.         break;
  179.       case 'F':
  180.         nl();
  181.         prt(2,get_string(79));
  182.         input(s,3);
  183.         i=atoi(s);
  184.         if ((i>0) && (i<1000) && (s[0]))
  185.           r.maxfiles=i;
  186.         break;
  187.       case 'G':
  188.         nl();
  189.         prt(2,get_string(154));
  190.         ch2=onek("ABCDEFGHIJKLMNOP ");
  191.         if (ch2==32)
  192.           r.dar=0;
  193.         else
  194.           r.dar=1 << (ch2-'A');
  195.         break;
  196.       case 'H':
  197.         r.mask ^= mask_PD;
  198.         break;
  199.       case 'I':
  200.         prt(2,get_string(156));
  201.         input(s,4);
  202.         i=atoi(s);
  203.         if ((s[0]) && (i != r.type)) {
  204.           r.type=i;
  205.         }
  206.         break;
  207.       case 'J':
  208.         r.mask ^= mask_no_uploads;
  209.         break;
  210.       case 'K':
  211.         r.mask ^= mask_archive;
  212.         break;
  213.       case 'L':
  214.         r.mask ^= mask_cdrom;
  215.         if (r.mask & mask_cdrom) {
  216.           r.mask |= mask_no_uploads;
  217.         } else {
  218.           r.mask &= ~mask_offline;
  219.         }
  220.         break;
  221.       case 'M':
  222.         if (r.mask & mask_cdrom) {
  223.           r.mask ^= mask_offline;
  224.         }
  225.       break;
  226.     }
  227.   } while ((!done) && (!hangup));
  228.   directories[n]=r;
  229. }
  230.  
  231.  
  232. void swap_dirs(int dir1, int dir2)
  233. {
  234.   int i,i1,i2,nu;
  235.   unsigned long *qsc, *qsc_n, tl;
  236.   directoryrec drt;
  237.   SUBCONF_TYPE dir1conv, dir2conv;
  238.  
  239.   dir1conv=(SUBCONF_TYPE) dir1;
  240.   dir2conv=(SUBCONF_TYPE) dir2;
  241.  
  242.   if ((dir1<0) || (dir1>=num_dirs) || (dir2<0) || (dir2>=num_dirs))
  243.     return;
  244.  
  245.   update_conf(CONF_DIRS, &dir1conv, &dir2conv, CONF_UPDATE_SWAP);
  246.  
  247.   dir1=(int) dir1conv;
  248.   dir2=(int) dir2conv;
  249.  
  250.   nu=number_userrecs();
  251.  
  252.   qsc=(unsigned long *)malloca(syscfg.qscn_len);
  253.   if (qsc) {
  254.     for (i=1; i<=nu; i++) {
  255.       read_qscn(i,qsc,1);
  256.       qsc_n=qsc+1;
  257.  
  258.       if (qsc_n[dir1/32] & (1L<<(dir1%32)))
  259.         i1=1;
  260.       else
  261.         i1=0;
  262.       if (qsc_n[dir2/32] & (1L<<(dir2%32)))
  263.         i2=1;
  264.       else
  265.         i2=0;
  266.       if (i1+i2==1) {
  267.         qsc_n[dir1/32] ^= (1L<<(dir1%32));
  268.         qsc_n[dir2/32] ^= (1L<<(dir2%32));
  269.       }
  270.  
  271.       write_qscn(i,qsc,1);
  272.     }
  273.     close_qscn();
  274.     bbsfree(qsc);
  275.   } 
  276.  
  277.   drt=directories[dir1];
  278.   directories[dir1]=directories[dir2];
  279.   directories[dir2]=drt;
  280.  
  281.   tl=dir_dates[dir1];
  282.   dir_dates[dir1]=dir_dates[dir2];
  283.   dir_dates[dir2]=tl;
  284. }
  285.  
  286.  
  287. void insert_dir(int n)
  288. {
  289.   directoryrec r;
  290.   int i,i1,nu;
  291.   unsigned long *qsc, *qsc_n, m1, m2, m3;
  292.   SUBCONF_TYPE nconv;
  293.  
  294.   nconv=(SUBCONF_TYPE) n;
  295.  
  296.   if ((n<0) || (n>num_dirs))
  297.     return;
  298.  
  299.   update_conf(CONF_DIRS, &nconv, NULL, CONF_UPDATE_INSERT);
  300.  
  301.   n=(int) nconv;
  302.  
  303.   for (i=num_dirs-1; i>=n; i--) {
  304.     directories[i+1]=directories[i];
  305.     dir_dates[i+1]=dir_dates[i];
  306.   }
  307.   strcpy(r.name,get_string(159));
  308.   strcpy(r.filename,get_string(82));
  309.   strcpy(r.path,syscfg.dloadsdir);
  310.   r.dsl=10;
  311.   r.age=0;
  312.   r.maxfiles=50;
  313.   r.dar=0;
  314.   r.type=0;
  315.   r.mask=0;
  316.   directories[n]=r;
  317.   ++num_dirs;
  318.  
  319.   nu=number_userrecs();
  320.  
  321.   qsc=(unsigned long *)malloca(syscfg.qscn_len);
  322.   if (qsc) {
  323.     qsc_n=qsc+1;
  324.  
  325.     m1=1L<<(n%32);
  326.     m2=0xffffffff<<((n%32)+1);
  327.     m3=0xffffffff>>(32-(n%32));
  328.  
  329.     for (i=1; i<=nu; i++) {
  330.       read_qscn(i,qsc, 1);
  331.  
  332.       for (i1=num_dirs/32; i1>n/32; i1--) {
  333.         qsc_n[i1]=(qsc_n[i1]<<1) | (qsc_n[i1-1]>>31);
  334.       }
  335.       qsc_n[i1]=m1 | (m2 & (qsc_n[i1]<<1)) | (m3 & qsc_n[i1]);
  336.  
  337.       write_qscn(i,qsc,1);
  338.     }
  339.     close_qscn();
  340.     bbsfree(qsc);
  341.   }
  342. }
  343.  
  344.  
  345. void delete_dir(int n)
  346. {
  347.   int i,i1,nu;
  348.   unsigned long *qsc, *qsc_n, m2, m3;
  349.   SUBCONF_TYPE nconv;
  350.  
  351.   nconv=(SUBCONF_TYPE) n;
  352.  
  353.   if ((n<0) || (n>=num_dirs))
  354.     return;
  355.  
  356.   update_conf(CONF_DIRS, &nconv, NULL, CONF_UPDATE_DELETE);
  357.  
  358.   n=(int)nconv;
  359.  
  360.   for (i=n; i<num_dirs; i++) {
  361.     directories[i]=directories[i+1];
  362.     dir_dates[i]=dir_dates[i+1];
  363.   }
  364.   --num_dirs;
  365.  
  366.   nu=number_userrecs();
  367.  
  368.   qsc=(unsigned long *)malloca(syscfg.qscn_len);
  369.   if (qsc) {
  370.     qsc_n=qsc+1;
  371.  
  372.     m2=0xffffffff<<(n%32);
  373.     m3=0xffffffff>>(32-(n%32));
  374.  
  375.     for (i=1; i<=nu; i++) {
  376.       read_qscn(i,qsc, 1);
  377.  
  378.       qsc_n[n/32]=(qsc_n[n/32]&m3) | ((qsc_n[n/32]>>1)&m2) |
  379.                   (qsc_n[(n/32)+1]<<31);
  380.  
  381.       for (i1=(n/32)+1; i1<=(num_dirs/32); i1++) {
  382.         qsc_n[i1]=(qsc_n[i1]>>1) | (qsc_n[i1+1]<<31);
  383.       }
  384.  
  385.       write_qscn(i,qsc,1);
  386.     }
  387.     close_qscn();
  388.     bbsfree(qsc);
  389.   }
  390. }
  391.  
  392.  
  393. void dlboardedit(void)
  394. {
  395.   int i,i1,i2,done,f, confchg=0;
  396.   char s[81],s1[81],ch;
  397.   SUBCONF_TYPE iconv;
  398.  
  399.   if (!checkpw())
  400.     return;
  401.   showdirs();
  402.   done=0;
  403.   do {
  404.     nl();
  405.     prt(2,get_string(160));
  406.     ch=onek("QSDIM?");
  407.     switch(ch) {
  408.       case '?':
  409.         showdirs();
  410.         break;
  411.       case 'Q':
  412.         done=1;
  413.         break;
  414.       case 'M':
  415.         nl();
  416.         prt(2,get_string(161));
  417.         input(s,4);
  418.         i=atoi(s);
  419.         if ((s[0]!=0) && (i>=0) && (i<num_dirs))
  420.           modify_dir(i);
  421.         break;
  422.       case 'S':
  423.         if (num_dirs<max_dirs) {
  424.           nl();
  425.           prt(2,get_string(1156));
  426.           input(s,4);
  427.           i1=atoi(s);
  428.           if ((!s[0]) || (i1<0) || (i1>=num_dirs))
  429.             break;
  430.           nl();
  431.           prt(2,get_string(1157));
  432.           input(s,4);
  433.           i2=atoi(s);
  434.           if ((!s[0]) || (i2<0) || (i2%32==0) || (i2>num_dirs) || (i1==i2))
  435.             break;
  436.           nl();
  437.           if (i2<i1)
  438.             i1++;
  439.           write_qscn(usernum,qsc,1);
  440.           prt(1,get_string(1158));
  441.           insert_dir(i2);
  442.           swap_dirs(i1,i2); 
  443.           delete_dir(i1);
  444.           confchg=1;
  445.           showdirs();
  446.         } else {
  447.           nl();
  448.           pl(get_string(1159));
  449.         }
  450.         break;
  451.       case 'I':
  452.         if (num_dirs<max_dirs) {
  453.           nl();
  454.           prt(2,get_string(162));
  455.           input(s,4);
  456.           i=atoi(s);
  457.           if ((s[0]!=0) && (i>=0) && (i<=num_dirs)) {
  458.             insert_dir(i);
  459.             modify_dir(i);
  460.             confchg=1;
  461.             if (dirconfnum>1) {
  462.               nl();
  463.               list_confs(CONF_DIRS,0);
  464.               i2=select_conf(get_string(1160),CONF_DIRS, 0);
  465.               if (i2>=0)
  466.                 if (in_conference(i,&dirconfs[i2])<0) {
  467.                   iconv=(SUBCONF_TYPE) i;
  468.                   addsubconf(CONF_DIRS, &dirconfs[i2], &iconv);
  469.                   i=(int) iconv;
  470.                 }
  471.             } else {
  472.               if (in_conference(i,&dirconfs[0])<0) {
  473.                 iconv=(SUBCONF_TYPE) i;
  474.                 addsubconf(CONF_DIRS, &dirconfs[0], &iconv);
  475.                 i=(int) iconv;
  476.               }
  477.             }
  478.           }
  479.         }
  480.         break;
  481.       case 'D':
  482.         nl();
  483.         prt(2,get_string(163));
  484.         input(s,4);
  485.         i=atoi(s);
  486.         if ((s[0]!=0) && (i>=0) && (i<num_dirs)) {
  487.           nl();
  488.           ansic(5);
  489.           outstr(get_string(87));
  490.           outstr(directories[i].name);
  491.           outstr("? ");
  492.           if (yn()) {
  493.             strcpy(s,directories[i].filename);
  494.             delete_dir(i);
  495.             confchg=1;
  496.             nl();
  497.             prt(5,get_string(1380));
  498.             if (yn()) {
  499.               sprintf(s1,"%s%s.DIR",syscfg.datadir, s);
  500.               unlink(s1);
  501.               sprintf(s1,"%s%s.EXT",syscfg.datadir,s);
  502.               unlink(s1);
  503.             }
  504.           }
  505.         }
  506.         break;
  507.     }
  508.   } while ((!done) && (!hangup));
  509.   sprintf(s,"%sDIRS.DAT",syscfg.datadir);
  510.   f=sh_open(s,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  511.   huge_xfer(f, directories, sizeof(directoryrec), num_dirs, 1);
  512.   sh_close(f);
  513.   if (confchg)
  514.     save_confs(CONF_DIRS, -1, NULL);
  515.   if (!wfc)
  516.     changedsl();
  517. }
  518.  
  519.  
  520.  
  521.