home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / W / DEVBBS.ZIP / SUBEDIT.C < prev    next >
C/C++ Source or Header  |  1992-07-21  |  11KB  |  431 lines

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