home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / UTIL / WWIVE / MYWIVE.ZIP / SUBEDIT.C < prev    next >
C/C++ Source or Header  |  1993-05-06  |  11KB  |  425 lines

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