home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / Dloads / OTHERUTI / WWIV420S.ZIP / SUBEDIT.C < prev    next >
C/C++ Source or Header  |  1991-05-22  |  11KB  |  452 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.                     Copyright (C) 1988-1991 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.  
  22.  
  23. void boarddata(int n, char *s)
  24. {
  25.   char x,y,k,i;
  26.   subboardrec r;
  27.  
  28.   r=subboards[n];
  29.   if (r.ar==0)
  30.     x=32;
  31.   else {
  32.     for (i=0; i<16; i++)
  33.       if ((1 << i) & r.ar)
  34.         x='A'+i;
  35.   }
  36.   switch(r.anony & 0x0f) {
  37.     case 0: y='N'; break;
  38.     case anony_enable_anony: y='Y'; break;
  39.     case anony_enable_dear_abby: y='D'; break;
  40.     case anony_force_anony: y='F'; break;
  41.     case anony_real_name: y='R'; break;
  42.   }
  43.   if (r.key==0)
  44.     k=32;
  45.   else
  46.     k=r.key;
  47.   sprintf(s,"%2d %1c %1c  %-40s  %-8s %-3d %-3d %-3d %-3d %1c",
  48.             n,k,x,r.name,r.filename,r.readsl,r.postsl,r.age,r.maxmsgs,y);
  49. }
  50.  
  51. void showsubs()
  52. {
  53.   int abort,i;
  54.   char s[180];
  55.  
  56.   outchr(12);
  57.   abort=0;
  58.   pla("NN K AR Name                                      FN       RSL PSL AGE MSG ANON",
  59.       &abort);
  60.   pla("== - == ----------------------------------------  ======== --- === --- === ----",
  61.       &abort);
  62.   for (i=0; (i<num_subs) && (!abort); i++) {
  63.     boarddata(i,s);
  64.     pla(s,&abort);
  65.   }
  66. }
  67.  
  68.  
  69.  
  70. void modify_sub(int n)
  71. {
  72.   subboardrec r;
  73.   char s[81],s1[81],ch,ch2;
  74.   int i,i1,done;
  75.  
  76.   r=subboards[n];
  77.   done=0;
  78.   do {
  79.     outchr(12);
  80.     npr("A. Name       : %s\r\n",r.name);
  81.     npr("B. Filename   : %s\r\n",r.filename);
  82.     if (r.key==0)
  83.       strcpy(s,"None");
  84.     else {
  85.       s[0]=r.key;
  86.       s[1]=0;
  87.     }
  88.     npr("C. Key        : %s\r\n",s);
  89.     npr("D. Read SL    : %d\r\n",r.readsl);
  90.     npr("E. Post SL    : %d\r\n",r.postsl);
  91.     switch(r.anony & 0x0f) {
  92.       case 0: strcpy(s,"No."); break;
  93.       case anony_enable_anony: strcpy(s,"Yes."); break;
  94.       case anony_enable_dear_abby: strcpy(s,"Dear Abby."); break;
  95.       case anony_force_anony: strcpy(s,"Forced."); break;
  96.       case anony_real_name: strcpy(s,"Real Name."); break;
  97.       default: strcpy(s,"Real screwed up."); break;
  98.     }
  99.     npr("F. Anony      : %s\r\n",s);
  100.     npr("G. Min. Age   : %d\r\n",r.age);
  101.     npr("H. Max Msgs   : %d\r\n",r.maxmsgs);
  102.     strcpy(s,"None.");
  103.     if (r.ar!=0) {
  104.       for (i=0; i<16; i++)
  105.         if ((1 << i) & r.ar)
  106.           s[0]='A'+i;
  107.       s[1]=0;
  108.     }
  109.     npr("I. AR         : %s\r\n",s);
  110.     npr("J. Sub Type   : %u\r\n",r.type);
  111.     npr("K. Storage typ: %d\r\n",r.storage_type);
  112.     npr("L. Val network: %s\r\n",(r.anony & anony_val_net)?"Yes":"No");
  113.     npr("M. Req ANSI   : %s\r\n",(r.anony & anony_ansi_only)?"Yes":"No");
  114.     npr("N. Disable tag: %s\r\n",(r.anony & anony_no_tag)?"Yes":"No");
  115.     nl();
  116.     prt(2,"Which (A-M,Q) ? ");
  117.     ch=onek("QABCDEFGHIJKLMN");
  118.     switch(ch) {
  119.       case 'Q':done=1; break;
  120.       case 'A':
  121.         nl();
  122.         prt(2,"New name? ");
  123.         inputl(s,40);
  124.         if (s[0])
  125.           strcpy(r.name,s);
  126.         break;
  127.       case 'B':
  128.         nl();
  129.         prt(2,"New filename? ");
  130.         input(s,8);
  131.         if ((s[0]!=0) && (strchr(s,'.')==0))
  132.           strcpy(r.filename,s);
  133.         break;
  134.       case 'C':
  135.         nl();
  136.         prt(2,"New Key (spc=none) ? ");
  137.         ch2=onek("@#$%^&()-_=+\\|][{};:'\",<>`~ ");
  138.         if (ch2==32)
  139.           r.key=0;
  140.         else
  141.           r.key=ch2;
  142.         break;
  143.       case 'D':
  144.         nl();
  145.         prt(2,"New Read SL? ");
  146.         input(s,3);
  147.         i=atoi(s);
  148.         if ((i>=0) && (i<256) && (s[0]))
  149.           r.readsl=i;
  150.         break;
  151.       case 'E':
  152.         nl();
  153.         prt(2,"New Post SL? ");
  154.         input(s,3);
  155.         i=atoi(s);
  156.         if ((i>=0) && (i<256) && (s[0]))
  157.           r.postsl=i;
  158.         break;
  159.       case 'F':
  160.         nl();
  161.         prt(2,"New Anony (Y,N,D,F,R) ? ");
  162.         ch2=onek("NYDFR");
  163.         r.anony &= 0xf0;
  164.         switch(ch2) {
  165.           case 'N': break;
  166.           case 'Y': r.anony |= anony_enable_anony; break;
  167.           case 'D': r.anony |= anony_enable_dear_abby; break;
  168.           case 'F': r.anony |= anony_force_anony; break;
  169.           case 'R': r.anony |= anony_real_name; break;
  170.         }
  171.         break;
  172.       case 'G':
  173.         nl();
  174.         prt(2,"New Min Age? ");
  175.         input(s,3);
  176.         i=atoi(s);
  177.         if ((i>=0) && (i<128) && (s[0]))
  178.           r.age=i;
  179.         break;
  180.       case 'H':
  181.         nl();
  182.         prt(2,"New Max Msgs? ");
  183.         input(s,3);
  184.         i=atoi(s);
  185.         if ((i>0) && (i<255) && (s[0]))
  186.           r.maxmsgs=i;
  187.         break;
  188.       case 'I':
  189.         nl();
  190.         prt(2,"New AR (<SPC>=None) ? ");
  191.         ch2=onek("ABCDEFGHIJKLMNOP ");
  192.         if (ch2==32)
  193.           r.ar=0;
  194.         else
  195.           r.ar=1 << (ch2-'A');
  196.         break;
  197.       case 'J':
  198.         nl();
  199.         prt(2,"New Sub Type? ");
  200.         input(s,5);
  201.         i=atoi(s);
  202.         if (s[0])
  203.           r.type=i;
  204.         break;
  205.       case 'K':
  206.         nl();
  207.         prt(2,"New Storage Type (0,1,2) ? ");
  208.         input(s,4);
  209.         i=atoi(s);
  210.         if ((s[0]) && (i>=0) && (i<=2))
  211.           r.storage_type=i;
  212.         break;
  213.       case 'L':
  214.         nl();
  215.         prt(5,"Require sysop validation for network posts? ");
  216.         r.anony &= ~anony_val_net;
  217.         if (yn())
  218.           r.anony |= anony_val_net;
  219.         break;
  220.       case 'M':
  221.         nl();
  222.         prt(5,"Require ANSI to read this sub? ");
  223.         r.anony &= ~anony_ansi_only;
  224.         if (yn())
  225.           r.anony |= anony_ansi_only;
  226.         break;
  227.       case 'N':
  228.         nl();
  229.         prt(5,"Disable tag lines for this sub? ");
  230.         r.anony &= ~anony_no_tag;
  231.         if (yn())
  232.           r.anony |= anony_no_tag;
  233.         break;
  234.     }
  235.   } while ((!done) && (!hangup));
  236.   subboards[n]=r;
  237. }
  238.  
  239.  
  240. void insert_sub(int n)
  241. {
  242.   subboardrec r;
  243.   int i,i1,nu;
  244.   userrec u;
  245.   long l1,l2,l3;
  246.  
  247.   for (i=num_subs-1; i>=n; i--) {
  248.     subboards[i+1]=subboards[i];
  249.     sub_dates[i+1]=sub_dates[i];
  250.   }
  251.   strcpy(r.name,"** NEW SUB **");
  252.   strcpy(r.filename,"NONAME");
  253.   r.key=0;
  254.   r.readsl=10;
  255.   r.postsl=20;
  256.   r.anony=0;
  257.   r.age=0;
  258.   r.maxmsgs=50;
  259.   r.ar=0;
  260.   r.type=0;
  261.   r.storage_type=2;
  262.   subboards[n]=r;
  263.   ++num_subs;
  264.   read_user(1,&u);
  265.   nu=number_userrecs();
  266.   if (n>=32) {
  267. #if MAX_SUBS>32
  268.     l1=0xffffffff >>(64-n);
  269.     l2=0xffffffff <<(n-31);
  270.     l3=1L << (n-32);
  271.     for (i=1; i<=nu; i++) {
  272.       read_user(i,&u);
  273.       if (u.sysopsub!=255)
  274.         if (u.sysopsub>=n)
  275.           ++u.sysopsub;
  276.       for (i1=num_subs-1-32; i1>n-32; i1--)
  277.         u.qscnptr2[i1]=u.qscnptr2[i1-1];
  278.       u.qscnptr2[n-32]=0L;
  279.       u.qscn2=(u.qscn2 & l1) | ((u.qscn2 << 1) & l2) | l3;
  280.       write_user(i,&u);
  281.     }
  282. #endif
  283.   } else {
  284.     l1=0xffffffff >>(32-n);
  285.     l2=0xffffffff <<(n+1);
  286.     l3=1L << n;
  287.     for (i=1; i<=nu; i++) {
  288.       read_user(i,&u);
  289.       if (u.sysopsub!=255)
  290.         if (u.sysopsub>=n)
  291.           ++u.sysopsub;
  292. #if MAX_SUBS>32
  293.       u.qscn2=(u.qscn2 << 1) | (u.qscn >> 31);
  294.       for (i1=num_subs-1-32; i1>0; i1--)
  295.         u.qscnptr2[i1]=u.qscnptr2[i1-1];
  296.       u.qscnptr2[0]=u.qscnptr[31];
  297. #endif
  298.       for (i1=((num_subs<32)?num_subs:32)-1; i1>n; i1--)
  299.         u.qscnptr[i1]=u.qscnptr[i1-1];
  300.       u.qscnptr[n]=0L;
  301.       u.qscn=(u.qscn & l1) | ((u.qscn << 1) & l2) | l3;
  302.       write_user(i,&u);
  303.     }
  304.   }
  305.   modify_sub(n);
  306. }
  307.  
  308.  
  309. void delete_sub(int n)
  310. {
  311.   int i,i1,i2,nu;
  312.   userrec u;
  313.   long l1,l2;
  314.  
  315.   for (i=n; i<num_subs; i++) {
  316.     subboards[i]=subboards[i+1];
  317.     sub_dates[i]=sub_dates[i+1];
  318.   }
  319.   --num_subs;
  320.   read_user(1,&u);
  321.   nu=number_userrecs();
  322.   if (n>=32) {
  323. #if MAX_SUBS>32
  324.     l1=0xffffffff >>(64-n);
  325.     l2=0xffffffff <<(n-32);
  326.     for (i=1; i<=nu; i++) {
  327.       read_user(i,&u);
  328.       if (u.sysopsub==n)
  329.         u.sysopsub=255;
  330.       else
  331.         if ((u.sysopsub>n) && (u.sysopsub!=255))
  332.           --u.sysopsub;
  333.       for (i1=n-32; i1<num_subs-32; i1++)
  334.         u.qscnptr2[i1]=u.qscnptr2[i1+1];
  335.       u.qscnptr[MAX_SUBS-1]=0L;
  336.       u.qscn2=(u.qscn2 & l1) | (u.qscn2 >> 1) & l2);
  337.       write_user(i,&u);
  338.     }
  339. #endif
  340.   } else {
  341.     l1=0xffffffff >>(32-n);
  342.     l2=0xffffffff <<(n);
  343.     for (i=1; i<=nu; i++) {
  344.       read_user(i,&u);
  345.       if (u.sysopsub==n)
  346.         u.sysopsub=255;
  347.       else
  348.         if ((u.sysopsub>n) && (u.sysopsub!=255))
  349.           --u.sysopsub;
  350.       if (num_subs>31)
  351.         i2=31;
  352.       else
  353.         i2=num_subs;
  354.       for (i1=n; i1<i2; i1++)
  355.         u.qscnptr[i1]=u.qscnptr[i1+1];
  356. #if MAX_SUBS>32
  357.       for (i1=0; i1<num_subs-32; i1++)
  358.         u.qscnptr2[i1]=u.qscnptr[i1+1];
  359.       u.qscnptr2[MAX_SUBS-33]=0L;
  360.       u.qscn=(u.qscn & l1) | ((u.qscn >> 1) & l2) | (u.qscn2 << 31);
  361.       u.qscn2=u.qscn1 >> 1;
  362. #else
  363.       u.qscn=(u.qscn & l1) | ((u.qscn >> 1) & l2);
  364.       u.qscnptr[MAX_SUBS-1]=0L;
  365. #endif
  366.       write_user(i,&u);
  367.     }
  368.   }
  369. }
  370.  
  371.  
  372. void boardedit()
  373. {
  374.   int i,i1,i2,done,f;
  375.   char s[81],s1[81],s2[81],ch;
  376.  
  377.   if (!checkpw())
  378.     return;
  379.   showsubs();
  380.   done=0;
  381.   do {
  382.     nl();
  383.     prt(2,"Subs: D:elete, I:nsert, M:odify, Q:uit, ? : ");
  384.     ch=onek("QDIM?");
  385.     switch(ch) {
  386.       case '?':
  387.         showsubs();
  388.         break;
  389.       case 'Q':
  390.         done=1;
  391.         break;
  392.       case 'M':
  393.         nl();
  394.         prt(2,"Sub number? ");
  395.         input(s,2);
  396.         i=atoi(s);
  397.         if ((s[0]!=0) && (i>=0) && (i<num_subs))
  398.           modify_sub(i);
  399.         break;
  400.       case 'I':
  401.         if (num_subs<MAX_SUBS) {
  402.           nl();
  403.           prt(2,"Insert before which sub? ");
  404.           input(s,2);
  405.           i=atoi(s);
  406.           if ((s[0]!=0) && (i>=0) && (i<=num_subs))
  407.             insert_sub(i);
  408.         }
  409.         break;
  410.       case 'D':
  411.         nl();
  412.         prt(2,"Delete which sub? ");
  413.         input(s,2);
  414.         i=atoi(s);
  415.         if ((s[0]!=0) && (i>=0) && (i<num_subs)) {
  416.           nl();
  417.           sprintf(s1,"Delete %s? ",subboards[i].name);
  418.           prt(5,s1);
  419.           if (yn()) {
  420.             strcpy(s,subboards[i].filename);
  421.             delete_sub(i);
  422.             nl();
  423.             prt(5,"Delete data files (including messages) for sub also? ");
  424.             if (yn()) {
  425.               sprintf(s1,"%s%s.SUB",syscfg.datadir, s);
  426.               unlink(s1);
  427.               sprintf(s1,"%s%s.DAT",syscfg.msgsdir,s);
  428.               unlink(s1);
  429.             }
  430.           }
  431.         }
  432.         break;
  433.     }
  434.   } while ((!done) && (!hangup));
  435.   sprintf(s,"%sSUBS.DAT",syscfg.datadir);
  436.   f=open(s,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  437.   if (f<0) {
  438.     pl("Error writing subs.dat file.");
  439.     pausescr();
  440.   } else {
  441.     i=write(f,(void *)&subboards[0], num_subs * sizeof(subboardrec));
  442.     if (i!=(num_subs*sizeof(subboardrec))) {
  443.       pl("Error writing subs.dat file (2).");
  444.       pausescr();
  445.     }
  446.     close(f);
  447.   }
  448.   if (!wfc)
  449.     changedsl();
  450. }
  451.  
  452.