home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / Dloads / OTHERUTI / WWIV412S.ZIP / UEDIT.C < prev    next >
C/C++ Source or Header  |  1990-07-25  |  21KB  |  899 lines

  1.  
  2. /*****************************************************************************
  3.  
  4.                 WWIV Version 4
  5.               Copyright (C) 1988 by Wayne Bell
  6.  
  7. Distribution of the source code for WWIV, in any form, modified or unmodified,
  8. without PRIOR, WRITTEN APPROVAL by the author, is expressly prohibited.
  9. Distribution of compiled versions of WWIV is limited to copies compiled BY
  10. THE AUTHOR.  Distribution of any copies of WWIV not compiled by the author
  11. is expressly prohibited.
  12.  
  13.  
  14. *****************************************************************************/
  15.  
  16.  
  17.  
  18. #include "vardec.h"
  19. #include "fcns.h"
  20. #include <string.h>
  21. #include <stdlib.h>
  22. #include <stdio.h>
  23. #include <io.h>
  24. #include <fcntl.h>
  25. #include <sys\stat.h>
  26. #include <time.h>
  27.  
  28.  
  29. extern subboardrec subboards[32];
  30. extern directoryrec directories[64];
  31. extern int num_subs, num_dirs,hangup,userfile,echo,useron,wfc,userfile,usernum;
  32. extern int incom,fwaiting;
  33. extern configrec syscfg;
  34. extern statusrec status;
  35. extern char ctypes[NUM_CTYPES][18];
  36. extern char cdir[81];
  37. extern userrec thisuser;
  38. extern int numextrn, numchain;
  39. extern chainfilerec *chains;
  40. extern externalrec *externs;
  41. extern unsigned char agemin,agemax,slmin,slmax,dslmin,dslmax,ressex;
  42. extern int daysmin,daysmax,lecho,helpl;
  43. extern unsigned short arres,darres,resres;
  44. extern int questused[20];
  45. extern unsigned char realsl;
  46.  
  47.  
  48.  
  49. void deluser(int un)
  50. {
  51.   userrec u;
  52.   int i,i1,f,n;
  53.   mailrec m;
  54.   char fn[81];
  55.   votingrec v;
  56.   voting_response vr;
  57.  
  58.   read_user(un,&u);
  59.   if ((u.inact & inact_deleted)==0) {
  60.     rsm(un,&u);
  61.     dsr(u.name);
  62.     u.inact |= inact_deleted;
  63.     u.waiting=0;
  64.     write_user(un,&u);
  65.     sprintf(fn,"%sEMAIL.DAT",syscfg.datadir);
  66.     f=open(fn,O_RDWR | O_BINARY, S_IREAD | S_IWRITE);
  67.     if (f>0) {
  68.       i1=filelength(f)/sizeof(mailrec);
  69.       for (i=0; i<i1; i++) {
  70.         lseek(f,((long) i) * sizeof(mailrec), SEEK_SET);
  71.         read(f,(void *)(&m),sizeof(mailrec));
  72.         if (((m.tosys==0) && (m.touser==un)) ||
  73.             ((m.fromsys==0) && (m.fromuser==un))) {
  74.           delmail(f,i);
  75.         }
  76.       }
  77.     }
  78.     close(f);
  79.     sprintf(fn,"%sVOTING.DAT",syscfg.datadir);
  80.     f=open(fn,O_RDWR | O_BINARY, S_IREAD | S_IWRITE);
  81.     n=(int) (filelength(f) / sizeof(votingrec)) -1;
  82.     for (i=0; i<20; i++)
  83.       if (u.votes[i]) {
  84.         if (i<=n) {
  85.           lseek(f,((long) i) * sizeof(votingrec), SEEK_SET);
  86.           read(f,(void *)&v,sizeof(votingrec));
  87.           vr=v.responses[u.votes[i]-1];
  88.           vr.numresponses--;
  89.           v.responses[u.votes[i]-1]=vr;
  90.           lseek(f,((long) i) * sizeof(votingrec), SEEK_SET);
  91.           write(f,(void *)&v,sizeof(votingrec));
  92.         }
  93.         u.votes[i]=0;
  94.       }
  95.     write_user(un,&u);
  96.     close(f);
  97.   }
  98. }
  99.  
  100.  
  101. void print_data(int un, userrec *u)
  102. {
  103.   char s[81],s1[81],s2[81],s3[81],s4[81];
  104.   int i;
  105.  
  106.   outchr(12);
  107.   if ((u->inact) & inact_deleted) {
  108.     pl(">>> DELETED <<<");
  109.     nl();
  110.   }
  111.   print("Name: ",nam(u,un),"");
  112.   print("RN  : ",(u->realname),"");
  113.   if ((u->callsign[0])!=0)
  114.     print("Call: ",(u->callsign),"");
  115.   print("PH  : ",(u->phone),"");
  116.   itoa(u->age,s,10);
  117.   s1[0]=32;
  118.   s1[1]=u->sex;
  119.   s1[2]=0;
  120.   print("Age : ",s,s1,"");
  121.   strcpy(s,"PW  : ");
  122.   strcat(s,(u->pw));
  123.   strcat(s,"\r\n");
  124.   if (lecho)
  125.     outs(s);
  126.   if ((incom) && (realsl==255))
  127.     pr1(s);
  128.   print("Comp: ",&(ctypes[u->comp_type][0]),"");
  129.   print("Last: ",(u->laston),"   ",(u->firston),"");
  130.   itoa(u->msgpost,s1,10);
  131.   itoa(u->emailsent,s2,10);
  132.   itoa(u->feedbacksent,s3,10);
  133.   itoa(u->waiting,s,10);
  134.   itoa(u->emailnet,s4,10);
  135.   if (u->emailnet)
  136.     print("Msgs: P=",s1," E=",s2," F=",s3," W=",s," O=",s4,"");
  137.   else
  138.     print("Msgs: P=",s1," E=",s2," F=",s3," W=",s,"");
  139.   itoa(u->logons,s1,10);
  140.   if (strcmp((u->laston),date())==0)
  141.     itoa(u->ontoday,s2,10);
  142.   else
  143.     itoa(0,s2,10);
  144.   itoa(u->illegal,s3,10);
  145.   print("Log : ",s1,"  ",s2,"  I=",s3,"");
  146.   itoa(u->uploaded,s,10);
  147.   itoa(u->downloaded,s1,10);
  148.   ltoa(u->uk,s2,10);
  149.   ltoa(u->dk,s3,10);
  150.   print("UpDn: U=",s,"-",s2,"k   D=",s1,"-",s3,"k","");
  151.   if (u->note[0])
  152.     print("Note: ",(u->note),"");
  153.   if (u->ass_pts){
  154.     itoa(u->ass_pts,s,10);
  155.     print("Ass : ",s,"");
  156.   }
  157.   nl();
  158.   itoa(u->sl,s,10);
  159.   itoa(u->dsl,s1,10);
  160.   print("SL  : ",s,"  DSL=",s1,"");
  161.   if ((u->sysopsub)!=255){
  162.     itoa(u->sysopsub,s,10);
  163.     print("SySu: ",s,"");
  164.   }
  165.   if (u->exempt) {
  166.     itoa(u->exempt,s,10);
  167.     print("Exem: ",s,"");
  168.   }
  169.   strcpy(s3,restrict_string);
  170.   for (i=0; i<=15; i++) {
  171.     if (u->ar & (1 << i))
  172.       s[i]='A'+i;
  173.     else
  174.       s[i]=32;
  175.     if (u->dar & (1 << i))
  176.       s1[i]='A'+i;
  177.     else
  178.       s1[i]=32;
  179.     if (u->restrict & (1 << i))
  180.       s2[i]=s3[i];
  181.     else
  182.       s2[i]=32;
  183.   }
  184.   s[16]=0;
  185.   s1[16]=0;
  186.   s2[16]=0;
  187.   if ((u->ar)!=0)
  188.     print("AR  : ",s,"");
  189.   if ((u->dar)!=0)
  190.     print("DAR : ",s1,"");
  191.   if ((u->restrict)!=0)
  192.     print("Rest: ",s2,"");
  193. }
  194.  
  195.  
  196. void print_short(int un, userrec *u)
  197. {
  198.   char s[81],s1[81],s2[81],s3[81];
  199.   int i;
  200.  
  201.   outchr(12);
  202.   if ((u->inact) & inact_deleted) {
  203.     pl(">>> DELETED <<<");
  204.     nl();
  205.   }
  206.   print("Name: ",nam(u,un),"");
  207.   print("RN  : ",(u->realname),"");
  208.   print("PH  : ",(u->phone),"");
  209.   itoa(u->age,s,10);
  210.   s1[0]=32;
  211.   s1[1]=u->sex;
  212.   s1[2]=0;
  213.   print("Age : ",s,s1,"");
  214.   print("Comp: ",&(ctypes[u->comp_type][0]),"");
  215.   if (u->note[0])
  216.     print("Note: ",(u->note),"");
  217.   if (u->ass_pts){
  218.     itoa(u->ass_pts,s,10);
  219.     print("Ass : ",s,"");
  220.   }
  221.   nl();
  222.   itoa(u->sl,s,10);
  223.   itoa(u->dsl,s1,10);
  224.   print("SL  : ",s,"  DSL=",s1,"");
  225.   if ((u->sysopsub)!=255){
  226.     itoa(u->sysopsub,s,10);
  227.     print("SySu: ",s,"");
  228.   }
  229.   if (u->exempt) {
  230.     itoa(u->exempt,s,10);
  231.     print("Exem: ",s,"");
  232.   }
  233.   strcpy(s3,restrict_string);
  234.   for (i=0; i<=15; i++) {
  235.     if (u->ar & (1 << i))
  236.       s[i]='A'+i;
  237.     else
  238.       s[i]=32;
  239.     if (u->dar & (1 << i))
  240.       s1[i]='A'+i;
  241.     else
  242.       s1[i]=32;
  243.     if (u->restrict & (1 << i))
  244.       s2[i]=s3[i];
  245.     else
  246.       s2[i]=32;
  247.   }
  248.   s[16]=0;
  249.   s1[16]=0;
  250.   s2[16]=0;
  251.   if ((u->ar)!=0)
  252.     print("AR  : ",&s,"");
  253.   if ((u->dar)!=0)
  254.     print("DAR : ",&s1,"");
  255.   if ((u->restrict)!=0)
  256.     print("Rest: ",&s2,"");
  257. }
  258.  
  259. #ifdef OLD_SEARCH
  260.  
  261. int matchuser(int un)
  262. {
  263.   userrec u;
  264.   int ok;
  265.   long l;
  266.   unsigned int d;
  267.  
  268.   read_user(un,&u);
  269.   ok=1;
  270.  
  271.   if ((u.age>agemax) || (u.age<agemin))
  272.     ok=0;
  273.   if ((u.sl>slmax) || (u.sl<slmin))
  274.     ok=0;
  275.   if ((u.dsl>dslmax) || (u.dsl<dslmin))
  276.     ok=0;
  277.   if (ressex)
  278.     if (u.sex!=ressex)
  279.       ok=0;
  280.   if (arres)
  281.     if ((u.ar & arres)==0)
  282.       ok=0;
  283.   if (darres)
  284.     if ((u.dar & darres)==0)
  285.       ok=0;
  286.   time(&l);
  287.   d=(unsigned int)( (l-u.daten)/24.0/3600.0 );
  288.   if ((d>daysmax) || (d<daysmin))
  289.     ok=0;
  290.  
  291.   return(ok);
  292. }
  293.  
  294.  
  295. void changeopt()
  296. {
  297.   int done,i,i1;
  298.   char s[81],s1[81],s2[81],s3[81],ch;
  299.  
  300.   done=0;
  301.   do {
  302.     outchr(12);
  303.     itoa(slmin,s,10);
  304.     itoa(slmax,s1,10);
  305.     print("1. SL     : ",s," to ",s1,"");
  306.     itoa(dslmin,s,10);
  307.     itoa(dslmax,s1,10);
  308.     print("2. DSL    : ",s," to ",s1,"");
  309.     itoa(agemin,s,10);
  310.     itoa(agemax,s1,10);
  311.     print("3. AGE    : ",s," to ",s1,"");
  312.     itoa(daysmin,s,10);
  313.     itoa(daysmax,s1,10);
  314.     print("4. Last On: ",s," to ",s1," days ago","");
  315.     if (ressex) {
  316.       s[0]=ressex;
  317.       s[1]=0;
  318.       print("5. Sex    : ",s,"");
  319.     } else
  320.       print("5. Sex    : Inactive","");
  321.     s[0]=0;
  322.     s[1]=0;
  323.     s1[0]=0;
  324.     s1[1]=0;
  325.     for (i=0; i<16; i++) {
  326.       if ((1 << i) & arres)
  327.         s[0]='A'+i;
  328.       if ((1 << i) & darres)
  329.         s1[0]='A'+i;
  330.     }
  331.     if (s[0])
  332.       print("6. AR     : ",s,"");
  333.     else
  334.       print("6. AR     : Inactive","");
  335.     if (s1[0])
  336.       print("7. DAR    : ",s1,"");
  337.     else
  338.       print("7. DAR    : Inactive","");
  339.     nl();
  340.     prt(2,"Search Options (1-7,Q) : ");
  341.     ch=onek("Q1234567");
  342.     nl();
  343.     switch(ch) {
  344.       case 'Q':
  345.         done=1;
  346.         break;
  347.       case '1':
  348.         prt(2,"Min SL? ");
  349.         input(s,3);
  350.         if (s[0])
  351.           slmin=atoi(s);
  352.         prt(2,"Max SL? ");
  353.         input(s,3);
  354.         if (s[0])
  355.           slmax=atoi(s);
  356.         break;
  357.       case '2':
  358.         prt(2,"Min DSL? ");
  359.         input(s,3);
  360.         if (s[0])
  361.           dslmin=atoi(s);
  362.         prt(2,"Max DSL? ");
  363.         input(s,3);
  364.         if (s[0])
  365.           dslmax=atoi(s);
  366.         break;
  367.       case '3':
  368.         prt(2,"Min age? ");
  369.         input(s,3);
  370.         if (s[0])
  371.           agemin=atoi(s);
  372.         prt(2,"Max age? ");
  373.         input(s,3);
  374.         if (s[0])
  375.           agemax=atoi(s);
  376.         break;
  377.       case '4':
  378.         prt(2,"Min days since logon? ");
  379.         input(s,4);
  380.         if (s[0])
  381.           daysmin=atoi(s);
  382.         prt(2,"Max days since logon? ");
  383.         input(s,4);
  384.         if (s[0])
  385.           daysmax=atoi(s);
  386.         break;
  387.       case '5':
  388.         prt(2,"Sex restrict (spc=none) ? ");
  389.         ressex=onek(" MF");
  390.         if (ressex==32)
  391.           ressex=0;
  392.         break;
  393.       case '6':
  394.         prt(2,"AR restrict (spc=none) ? ");
  395.         s[0]=onek(" ABCDEFGHIJKLMNOP");
  396.         if (s[0])
  397.           arres=1 << (s[0]-'A');
  398.         else
  399.           arres=0;
  400.         break;
  401.       case '7':
  402.         prt(2,"DAR restrict (spc=none) ? ");
  403.         s[0]=onek(" ABCDEFGHIJKLMNOP");
  404.         if (s[0])
  405.           darres=1 << (s[0]-'A');
  406.         else
  407.           darres=0;
  408.         break;
  409.     }
  410.   } while ((!done) && (!hangup));
  411. }
  412.  
  413.  
  414. #else
  415. /****************************************************************************/
  416.  
  417.  
  418.  
  419. char search_pattern[81] = {""};
  420. char *sp;
  421.  
  422.  
  423. int matchuser(int un)
  424. {
  425.   userrec u;
  426.  
  427.   read_user(un,&u);
  428.   sp=search_pattern;
  429.   return(match_user(&u));
  430. }
  431.  
  432.  
  433. int match_user(userrec *u)
  434. {
  435.   int ok=1,not=0,done=0,less=0,cpf=0,cpp=0,and=1,gotfcn=0,evalit=0,tmp,tmp1,tmp2;
  436.   char fcn[12],parm[12];
  437.   long l;
  438.  
  439.   do {
  440.     if (*sp==0)
  441.       done=1;
  442.     else {
  443.       if (strchr("()|&!<>",*sp)) {
  444.         switch(*sp++) {
  445.           case '(':
  446.             evalit=2;
  447.             break;
  448.           case ')':
  449.             done=1;
  450.             break;
  451.           case '|':
  452.             and=0;
  453.             break;
  454.           case '&':
  455.             and=1;
  456.             break;
  457.           case '!':
  458.             not=1;
  459.             break;
  460.           case '<':
  461.             less=1;
  462.             break;
  463.           case '>':
  464.             less=0;
  465.             break;
  466.         }
  467.       } else if (*sp=='[') {
  468.         gotfcn=1;
  469.         sp++;
  470.       } else if (*sp==']') {
  471.         evalit=1;
  472.         ++sp;
  473.       } else if (*sp!=' ') {
  474.         if (gotfcn) {
  475.           if (cpp<10)
  476.             parm[cpp++]=*sp++;
  477.         } else {
  478.           if (cpf<10)
  479.             fcn[cpf++]=*sp++;
  480.         }
  481.       } else
  482.         ++sp;
  483.       if (evalit) {
  484.         if (evalit==1) {
  485.           fcn[cpf]=0;
  486.           parm[cpp]=0;
  487.           tmp=1;
  488.           tmp1=atoi(parm);
  489.  
  490.           if (!strcmp(fcn,"SL")) {
  491.             if (less)
  492.               tmp=(tmp1>u->sl);
  493.             else
  494.               tmp=(tmp1<u->sl);
  495.           } else if (!strcmp(fcn,"DSL")) {
  496.             if (less)
  497.               tmp=(tmp1>u->dsl);
  498.             else
  499.               tmp=(tmp1<u->dsl);
  500.           } else if (!strcmp(fcn,"AR")) {
  501.             if ((parm[0]>='A') && (parm[0]<='P')) {
  502.               tmp1=1 << (parm[0]-'A');
  503.               if (u->ar & tmp1)
  504.                 tmp=1;
  505.               else
  506.                 tmp=0;
  507.             } else
  508.               tmp=0;
  509.           } else if (!strcmp(fcn,"DAR")) {
  510.             if ((parm[0]>='A') && (parm[0]<='P')) {
  511.               tmp1=1 << (parm[0]-'A');
  512.               if (u->dar & tmp1)
  513.                 tmp=1;
  514.               else
  515.                 tmp=0;
  516.             } else
  517.               tmp=0;
  518.           } else if (!strcmp(fcn,"SEX")) {
  519.             tmp=parm[0]==u->sex;
  520.           } else if (!strcmp(fcn,"AGE")) {
  521.             if (less)
  522.               tmp=(tmp1>u->age);
  523.             else
  524.               tmp=(tmp1<u->age);
  525.           } else if (!strcmp(fcn,"LASTON")) {
  526.             time(&l);
  527.             tmp2=(unsigned int)( (l-u->daten)/24.0/3600.0 );
  528.             if (less)
  529.               tmp=tmp2<tmp1;
  530.             else
  531.               tmp=tmp2>tmp1;
  532.           } else if (!strcmp(fcn,"AREACODE")) {
  533.             tmp=(!strncmp(parm,u->phone,3));
  534.           } else if (!strcmp(fcn,"RESTRICT")) {
  535.             ;
  536.           }
  537.  
  538.         } else
  539.           tmp=match_user(u);
  540.  
  541.         if (not)
  542.           tmp=!tmp;
  543.         if (and)
  544.           ok = ok && tmp;
  545.         else
  546.           ok = ok || tmp;
  547.  
  548.         not=less=cpf=cpp=gotfcn=evalit=0;
  549.         and=1;
  550.       }
  551.     }
  552.   } while (!done);
  553.   return(ok);
  554. }
  555.  
  556. /****************************************************************************/
  557.  
  558. void changeopt()
  559. {
  560.   helpl=42;
  561.   outchr(12);
  562.   pl("Current search string:");
  563.   if (search_pattern[0])
  564.     pl(search_pattern);
  565.   else
  566.     pl("-NONE-");
  567.   nl();
  568.   nl();
  569.   prt(5,"Change it? ");
  570.   if (yn()) {
  571.     pl("Enter new search pattern:");
  572.     prt(2,":");
  573.     input(search_pattern,75);
  574.   }
  575.   helpl=0;
  576. }
  577.  
  578.  
  579. /****************************************************************************/
  580.  
  581. #endif
  582.  
  583. #pragma warn -par
  584.  
  585. void uedit(int usern, int other)
  586. {
  587.   char s[81],s1[81],s2[81],ch,ch1;
  588.   int i,i1,i2,i3,un,done,nu,done1,full,temp_full,tempu;
  589.   userrec u;
  590.  
  591.   if (incom)
  592.     full=0;
  593.   else
  594.     full=1;
  595.   un=usern;
  596.   done=0;
  597.   read_user(un,&u);
  598.   nu=(int) (filelength(userfile) / sizeof(userrec)) - 1;
  599.   do {
  600.     read_user(un,&u);
  601.     done1=0;
  602.     temp_full=0;
  603.     do {
  604.       if ((full) || (temp_full))
  605.         print_data(un,&u);
  606.       else
  607.         print_short(un,&u);
  608.       nl();
  609.       prt(2,"Uedit : ");
  610.       if ((realsl==255) || (wfc))
  611.         ch=onek("Q[]{}/,.?UDRNLCPOGMSTEYZAI~:");
  612.       else
  613.         ch=onek("Q[]{}/,.?UDRNLCPOGMSTEYZAI");
  614.       switch(ch) {
  615.         case 'Q':
  616.           done=1;
  617.           done1=1;
  618.           break;
  619.         case ']':
  620.           ++un;
  621.           if (un>nu)
  622.             un=1;
  623.           done1=1;
  624.           break;
  625.         case '[':
  626.           --un;
  627.           if (un==0)
  628.             un=nu;
  629.           done1=1;
  630.           break;
  631.         case '/':
  632.           changeopt();
  633.           break;
  634.         case '}':
  635.           tempu=un;
  636.           ++un;
  637.           if (un>nu)
  638.             un=1;
  639.           while ((un!=tempu) && (!matchuser(un))) {
  640.             ++un;
  641.             if (un>nu)
  642.               un=1;
  643.           }
  644.           done1=1;
  645.           break;
  646.         case '{':
  647.           tempu=un;
  648.           --un;
  649.           if (un<1)
  650.             un=nu;
  651.           while ((un!=tempu) && (!matchuser(un))) {
  652.             --un;
  653.             if (un<1)
  654.               un=nu;
  655.           }
  656.           done1=1;
  657.           break;
  658.         case '.':
  659.           full=(!full);
  660.           temp_full=full;
  661.           break;
  662.         case ',':
  663.           temp_full=(!temp_full);
  664.           break;
  665.         case '?':
  666.           printmenu(6);
  667.           getkey();
  668.           break;
  669.         case 'D':
  670.           if (((u.inact & inact_deleted)==0) && (thisuser.sl>u.sl)) {
  671.             prt(5,"Delete? ");
  672.             if (yn()) {
  673.               deluser(un);
  674.               read_user(un,&u);
  675.             }
  676.           }
  677.           break;
  678.         case 'R':
  679.           if (u.inact & inact_deleted) {
  680.             u.inact ^= inact_deleted;
  681.             isr(un,u.name);
  682.             write_user(un,&u);
  683.           }
  684.           break;
  685.         case 'U':
  686.           nl();
  687.           prt(2,"User name/number: ");
  688.           input(s,30);
  689.           i=finduser1(s);
  690.           if (i>0) {
  691.             un=i;
  692.             done1=1;
  693.           }
  694.           break;
  695.         case 'N':
  696.           nl();
  697.           prt(2,"New name? ");
  698.           input(s,30);
  699.           if (s[0]) {
  700.             if (finduser(s)<1) {
  701.               dsr(u.name);
  702.               strcpy(u.name,s);
  703.               isr(un,u.name);
  704.               write_user(un,&u);
  705.             }
  706.           }
  707.           break;
  708.         case 'L':
  709.           nl();
  710.           prt(2,"New real name? ");
  711.           inputl(s,20);
  712.           if (s[0]) {
  713.             strcpy(u.realname,s);
  714.             write_user(un,&u);
  715.           }
  716.           break;
  717.         case 'C':
  718.           nl();
  719.           prt(2,"New callsign? ");
  720.           input(s,6);
  721.           if (s[0]) {
  722.             strcpy(u.callsign,s);
  723.             write_user(un,&u);
  724.           } else {
  725.             prt(5,"Delete callsign? ");
  726.             if (yn()) {
  727.               u.callsign[0]=0;
  728.               write_user(un,&u);
  729.             }
  730.           }
  731.           break;
  732.         case 'P':
  733.           nl();
  734.           prt(2,"New phone number? ");
  735.           input(s,12);
  736.           if (s[0]) {
  737.             strcpy(u.phone,s);
  738.             write_user(un,&u);
  739.           }
  740.           break;
  741.         case 'O':
  742.           nl();
  743.           prt(2,"New note? ");
  744.           inputl(s,39);
  745.           strcpy(u.note,s);
  746.           write_user(un,&u);
  747.           break;
  748.         case 'G':
  749.           nl();
  750.           sprintf(s,"Current birthdate: %02d/%02d/%02d",(int) u.month,
  751.              (int) u.day,
  752.                  (int) u.year);
  753.           pl(s);
  754.           input_age(&u);
  755.           write_user(un,&u);
  756.           break;
  757.         case 'M':
  758.           nl();
  759.           pl("Known computer types:");
  760.           nl();
  761.           for (i=0; i<NUM_CTYPES; i++)
  762.             print(itoa(i+1,s,10),". ",ctypes[i],"");
  763.           nl();
  764.           prt(2,"Enter new computer type: ");
  765.           input(s,2);
  766.           i=atoi(s);
  767.           if ((i>0) && (i<NUM_CTYPES+1)) {
  768.             u.comp_type=i-1;
  769.             if (checkcomp("Ami"))
  770.               u.colors[0]=4;
  771.             else
  772.               u.colors[0]=7;
  773.             write_user(un,&u);
  774.           }
  775.           break;
  776.         case 'S':
  777.           if (u.sl==255)
  778.             break;
  779.           if (u.sl>=thisuser.sl)
  780.             break;
  781.           nl();
  782.           prt(2,"New SL? ");
  783.           input(s,3);
  784.           i=atoi(s);
  785.           if ((!wfc) && (i>=thisuser.sl))
  786.             i=-1;
  787.           if ((i>=0) && (i<255) && (s[0])) {
  788.             u.sl=i;
  789.             write_user(un,&u);
  790.             if (un==usernum)
  791.               realsl=i;
  792.           }
  793.           break;
  794.         case 'T':
  795.           if (u.dsl==255)
  796.             break;
  797.           if (u.dsl>=thisuser.dsl)
  798.             break;
  799.           nl();
  800.           prt(2,"New DSL? ");
  801.           input(s,3);
  802.           i=atoi(s);
  803.           if ((!wfc) && (i>=thisuser.dsl))
  804.             i=-1;
  805.           if ((i>=0) && (i<255) && (s[0])) {
  806.             u.dsl=i;
  807.             write_user(un,&u);
  808.           }
  809.           break;
  810.         case 'E':
  811.           nl();
  812.           prt(2,"New Exemption? ");
  813.           input(s,3);
  814.           i=atoi(s);
  815.           if ((i>=0) && (i<=255) && (s[0])) {
  816.             u.exempt=i;
  817.             write_user(un,&u);
  818.           }
  819.           break;
  820.         case 'Y':
  821.           nl();
  822.           prt(2,"New sysop sub? ");
  823.           input(s,3);
  824.           i=atoi(s);
  825.           if ((i>=0) && (i<=255) && (s[0])) {
  826.             u.sysopsub=i;
  827.             write_user(un,&u);
  828.           }
  829.           break;
  830.         case 'Z':
  831.           nl();
  832.           print( "        ",restrict_string,"");
  833.       do {
  834.             prt(2,"Toggle? ");
  835.             s[0]=13;
  836.         s[1]='?';
  837.             strcpy(&(s[2]),restrict_string);
  838.             ch1=onek(s);
  839.             if (ch1==32)
  840.               ch1=13;
  841.         if (ch1=='?')
  842.           printmenu(10);
  843.             if ((ch1!=13) && (ch1!='?')) {
  844.               i=-1;
  845.               for (i1=0; i1<16; i1++)
  846.                 if (ch1==s[i1+2])
  847.                   i=i1;
  848.               if (i>-1) {
  849.                 u.restrict ^= (1 << i);
  850.                 write_user(un,&u);
  851.               }
  852.             }
  853.       } while ((!hangup) && (ch1=='?'));
  854.           break;
  855.         case 'A':
  856.           nl();
  857.           prt(2,"Toggle which AR? ");
  858.           ch1=onek("\rABCDEFGHIJKLMNOP");
  859.           if (ch1!=13) {
  860.             ch1-='A';
  861.             if ((wfc) || (thisuser.ar & (1 << ch1))) {
  862.               u.ar ^= (1 << ch1);
  863.               write_user(un,&u);
  864.             }
  865.           }
  866.           break;
  867.         case 'I':
  868.           nl();
  869.           prt(2,"Toggle which DAR? ");
  870.           ch1=onek("\rABCDEFGHIJKLMNOP");
  871.           if (ch1!=13) {
  872.             ch1-='A';
  873.             if ((wfc) || (thisuser.dar & (1 << ch1))) {
  874.               u.dar ^= (1 << ch1);
  875.               write_user(un,&u);
  876.             }
  877.           }
  878.           break;
  879.         case '~':
  880.           u.ass_pts=0;
  881.           write_user(un,&u);
  882.           break;
  883.     case ':':
  884.       u.year=0;
  885.       write_user(un,&u);
  886.       break;
  887.       }
  888.     } while ((!done1) && (!hangup));
  889.   } while ((!done) && (!hangup));
  890.   close_user();
  891.   if (!wfc)
  892.     topscreen();
  893. }
  894.  
  895. #pragma warn +par
  896.  
  897.  
  898.  
  899.