home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / UTIL / WWIVE / MYWIVE.ZIP / UEDIT.C < prev    next >
Text File  |  1993-05-31  |  22KB  |  950 lines

  1. #include "vars.h"
  2.  
  3. #pragma hdrstop
  4.  
  5. void dellist(int un, userrec *u)
  6. {
  7.   int i,i1,i2,f,done,ok;
  8.   char s[150],s1[150],s2[150],ch,ch1,*ss;
  9.   char reason[50];
  10.   long l;
  11. /*  userrec u;*/
  12.  
  13.   done=0;
  14.   do {
  15.     nl();
  16.     prt(2,"R:ead, A:dd, Q:uit : ");
  17.     ch=onek("QRA");
  18.     switch(ch) {
  19.       case 'Q':
  20.         done=1;
  21.         break;
  22.       case 'R':
  23.     pl("╔══════════════════════════════════════════════════════════════════════════╗");
  24.     pl("║   Name                      Reason For Deletion                          ║");
  25.     pl("╚══════════════════════════════════════════════════════════════════════════╝");
  26.     printfile("DELETED.MSG");
  27.     break;
  28.       case 'A':
  29.     nl();
  30.     sprintf(s1,"%sDELETED.MSG",syscfg.gfilesdir);
  31.     f=open(s1,O_RDWR | O_CREAT | O_BINARY, S_IREAD | S_IWRITE);
  32.     if (f>0) {
  33.       lseek(f,0L,SEEK_SET);
  34.       l=filelength(f);
  35.       if ((ss=malloca(l+500L))==NULL) {
  36.         close(f);
  37.         return;
  38.        }
  39.        read(f,ss,(int)l);
  40.        farfree(ss);
  41.        close(f);
  42.     }
  43.     nl();
  44.     pl("Enter reason for deletion :");
  45.     outstr(":");
  46.     mpl(47);
  47.     inputl(reason,47);
  48.     nl();
  49.     sprintf(s,"* %-20s    %-47s *\r\n",nam(u,un), reason);
  50.     nl();
  51.     nl();
  52.     pl(s);
  53.     nl();
  54.     prt(5,"Is this correct? ");
  55.     if (yn()) {
  56.       sprintf(s1,"%sDELETED.MSG",syscfg.gfilesdir);
  57.       f=open(s1,O_RDWR | O_CREAT | O_BINARY, S_IREAD | S_IWRITE);
  58.       if (filelength(f)) {
  59.         lseek(f,-1L,SEEK_END);
  60.         read(f,((void *)&ch1),1);
  61.         if (ch1==26)
  62.           lseek(f,-1L,SEEK_END);
  63.       }
  64.       write(f,(void *)s,strlen(s));
  65.       close(f);
  66.       nl();
  67.       pl("Added to deletion list.");
  68.     }
  69.       break;
  70.     }
  71.   } while ((!done) && (!hangup));
  72. }
  73.  
  74.  
  75.  
  76. void deluser(int un)
  77. {
  78.   userrec u;
  79.   int i,i1,f,n;
  80.   mailrec m;
  81.   char fn[81];
  82.   votingrec v;
  83.   voting_response vr;
  84.  
  85.   read_user(un,&u);
  86.   if ((u.inact & inact_deleted)==0) {
  87.     rsm(un,&u);
  88.     dsr(u.name);
  89.     u.inact |= inact_deleted;
  90.     u.waiting=0;
  91.     write_user(un,&u);
  92.     sprintf(fn,"%sEMAIL.DAT",syscfg.datadir);
  93.     f=open(fn,O_RDWR | O_BINARY, S_IREAD | S_IWRITE);
  94.     if (f>0) {
  95.       i1=filelength(f)/sizeof(mailrec);
  96.       for (i=0; i<i1; i++) {
  97.         lseek(f,((long) i) * sizeof(mailrec), SEEK_SET);
  98.         read(f,(void *)(&m),sizeof(mailrec));
  99.         if (((m.tosys==0) && (m.touser==un)) ||
  100.             ((m.fromsys==0) && (m.fromuser==un))) {
  101.           delmail(f,i);
  102.         }
  103.       }
  104.     }
  105.     close(f);
  106.     sprintf(fn,"%sVOTING.DAT",syscfg.datadir);
  107.     f=open(fn,O_RDWR | O_BINARY, S_IREAD | S_IWRITE);
  108.     n=(int) (filelength(f) / sizeof(votingrec)) -1;
  109.     for (i=0; i<20; i++)
  110.       if (u.votes[i]) {
  111.         if (i<=n) {
  112.           lseek(f,((long) i) * sizeof(votingrec), SEEK_SET);
  113.           read(f,(void *)&v,sizeof(votingrec));
  114.           vr=v.responses[u.votes[i]-1];
  115.           vr.numresponses--;
  116.           v.responses[u.votes[i]-1]=vr;
  117.           lseek(f,((long) i) * sizeof(votingrec), SEEK_SET);
  118.           write(f,(void *)&v,sizeof(votingrec));
  119.         }
  120.         u.votes[i]=0;
  121.       }
  122.     write_user(un,&u);
  123.     close(f);
  124.   }
  125. }
  126.  
  127. void print_data(int un, userrec *u, int lng)
  128. {
  129.   char s[81],s1[81],s2[81],s3[81],s4[81];
  130.   int i;
  131.  
  132.   outchr(12);
  133.   if ((u->inact) & inact_deleted) {
  134.     pl(">>> DELETED <<<");
  135.     nl(); }
  136.   npr("1[7A1] fName1: f%-30s 1[7B1] fRN  1: f%s %s\r\n",nam(u,un),(u->realname),u->lastname);
  137.   npr("1[7C1] fAdd 1: f%-30s 1[7D1] fCity1: f%s\r\n",u->stretadd,u->citstate);
  138.   npr("1[7E1] fZip 1: f%-30ld 1[7F1] fPH  1: f%s\r\n",u->wwiv_regnum,(u->phone));
  139.   npr("1[7G1] fAge 1: f%d %c 1(7%02d1/7%02d1/7%02d1)\r\n", u->age, u->sex,u->month, u->day, u->year);
  140.   nl();
  141.   if (u->forwardsys)
  142.     npr("f[eHf] eCompf: e%-30s f[ ] eForwf: #e%d f@e%d\r\n",&(ctypes[u->comp_type][0]),u->forwardusr, u->forwardsys);
  143.   else
  144.     npr("f[eHf] eCompf: e%-30s f[ ] eForwf: #e%d\r\n",&(ctypes[u->comp_type][0]),u->forwardusr);
  145.   if (thisuser.sl==255)
  146.   npr("f[eIf] ePW  f: e%-30s f[eJf] eLastf: e%s   %s\r\n",u->pw,(u->laston),(u->firston));
  147.   else
  148.   npr("f[eIf] ePW  f: e■■■■■■■■■                      f[eJf] eLastf: e%s   %s\r\n",(u->laston),(u->firston));
  149.   if (u->emailnet)
  150.     npr("f[eKf] eMsgsf: ePostedf=e%d Ef-emailf=e%d Feedbackf=e%d Waitingf=e%d Net Mailf=e%d\r\n",u->msgpost, u->emailsent,u->feedbacksent, u->waiting, u->emailnet);
  151.   else
  152.     npr("f[eKf] eMsgsf: ePostedf=e%d Ef-emailf=e%d Feedbackf=e%d Waitingf=e%d\r\n",u->msgpost, u->emailsent,u->feedbacksent, u->waiting);
  153.   npr("f[eLf] eLog f: eTotal Logonsf:e%d  On Todayf:e%d  Illegal Logonsf:e%d\r\n",u->logons,(strcmp(u->laston,date()))?0:u->ontoday,u->illegal);
  154.   npr("f[eMf] eUpDnf: eFiles Uploadedf=e%df-e%ldk   Files Downloadedf=e%df-e%ldk\r\n",u->uploaded,u->uk,u->downloaded, u->dk);
  155.   npr("f[eNf] eBaudf: e%u\r\n", u->lastrate);
  156.   nl();
  157.   npr("2[cO2] cAss 2: c%-30d 2[cP2] cGold 2: c%d\r\n",u->ass_pts,(int) u->gold);
  158.   npr("2[cR2] cSL  2: c%-30d 2[cS2] cDSL 2: c%d\r\n",u->sl,u->dsl);
  159.   npr("2[cT2] cSub 2: c%-30d 2[cU2] cExemption 2: c%d\r\n",u->sysopsub,u->exempt);
  160.   npr("2[cV2] cUser's Tag2: c%s\r\n",(u->note));
  161.   strcpy(s3,restrict_string);
  162.   for (i=0; i<=15; i++) {
  163.     if (u->ar & (1 << i))
  164.       s[i]='A'+i;
  165.     else
  166.       s[i]=32;
  167.     if (u->dar & (1 << i))
  168.       s1[i]='A'+i;
  169.     else
  170.       s1[i]=32;
  171.     if (u->restrict & (1 << i))
  172.       s2[i]=s3[i];
  173.     else
  174.       s2[i]=32; }
  175.   s[16]=0;
  176.   s1[16]=0;
  177.   s2[16]=0;
  178.   npr("2[cW2] cAR  2: c%-30s",s);
  179.   npr(" 2[cX2] cDAR 2: c%s\r\n",s1);
  180.   npr("2[cY2] cRest2: c%-13s",s2);
  181.   npr(" 2[cZ2] cVoiced2: c%-4s 2[ ] cSP2: c%s\r\n", u->zipcode, u->sex_type);
  182.   nl();
  183.   if (lng) {
  184.   pl("5[7,5]7>5Up7/5Down 1 User {7,5}7>5Search Up7/5Down .7>5Toggle Menu /7>5Search Specs");
  185.   pl("  5:7>5Clear B7-5Date     17>5Delete User    27>5Restore     37>5Go To User");
  186.   }
  187. }
  188.  
  189.  
  190. #ifdef OLD_SEARCH
  191.  
  192. int matchuser(int un)
  193. {
  194.   userrec u;
  195.   int ok;
  196.   long l;
  197.   unsigned int d;
  198.  
  199.   read_user(un,&u);
  200.   ok=1;
  201.  
  202.   if ((u.age>agemax) || (u.age<agemin))
  203.     ok=0;
  204.   if ((u.sl>slmax) || (u.sl<slmin))
  205.     ok=0;
  206.   if ((u.dsl>dslmax) || (u.dsl<dslmin))
  207.     ok=0;
  208.   if (ressex)
  209.     if (u.sex!=ressex)
  210.       ok=0;
  211.   if (arres)
  212.     if ((u.ar & arres)==0)
  213.       ok=0;
  214.   if (darres)
  215.     if ((u.dar & darres)==0)
  216.       ok=0;
  217.   time(&l);
  218.   d=(unsigned int)( (l-u.daten)/24.0/3600.0 );
  219.   if ((d>daysmax) || (d<daysmin))
  220.     ok=0;
  221.  
  222.   return(ok);
  223. }
  224.  
  225.  
  226. void changeopt()
  227. {
  228.   int done,i,i1;
  229.   char s[81],s1[81],s2[81],s3[81],ch;
  230.  
  231.   done=0;
  232.   do {
  233.     outchr(12);
  234.     npr("1. SL     : %d to %d\r\n",slmin, slmax);
  235.     npr("2. DSL    : %d to %d\r\n",dslmin, dslmax);
  236.     npr("3. AGE    : %d to %d\r\n",agemin, agemax);
  237.     npr("4. Last On: %d to %d days ago\r\n",daysmin, daysmax);
  238.     if (ressex) {
  239.       npr("5. Sex    : %c\r\n",ressex);
  240.     } else
  241.       pl("5. Sex    : Inactive");
  242.     s[0]=0;
  243.     s[1]=0;
  244.     s1[0]=0;
  245.     s1[1]=0;
  246.     for (i=0; i<16; i++) {
  247.       if ((1 << i) & arres)
  248.         s[0]='A'+i;
  249.       if ((1 << i) & darres)
  250.         s1[0]='A'+i;
  251.     }
  252.     if (s[0])
  253.       npr("6. AR     : %s\r\n",s);
  254.     else
  255.       pl("6. AR     : Inactive");
  256.     if (s1[0])
  257.       npr("7. DAR    : %s\r\n",s1);
  258.     else
  259.       pl("7. DAR    : Inactive");
  260.     nl();
  261.     prt(2,"Search Options (1-7,Q) : ");
  262.     ch=onek("Q1234567");
  263.     nl();
  264.     switch(ch) {
  265.       case 'Q':
  266.         done=1;
  267.         break;
  268.       case '1':
  269.         prt(2,"Min SL? ");
  270.         input(s,3);
  271.         if (s[0])
  272.           slmin=atoi(s);
  273.         prt(2,"Max SL? ");
  274.         input(s,3);
  275.         if (s[0])
  276.           slmax=atoi(s);
  277.         break;
  278.       case '2':
  279.         prt(2,"Min DSL? ");
  280.         input(s,3);
  281.         if (s[0])
  282.           dslmin=atoi(s);
  283.         prt(2,"Max DSL? ");
  284.         input(s,3);
  285.         if (s[0])
  286.           dslmax=atoi(s);
  287.         break;
  288.       case '3':
  289.         prt(2,"Min age? ");
  290.         input(s,3);
  291.         if (s[0])
  292.           agemin=atoi(s);
  293.         prt(2,"Max age? ");
  294.         input(s,3);
  295.         if (s[0])
  296.           agemax=atoi(s);
  297.         break;
  298.       case '4':
  299.         prt(2,"Min days since logon? ");
  300.         input(s,4);
  301.         if (s[0])
  302.           daysmin=atoi(s);
  303.         prt(2,"Max days since logon? ");
  304.         input(s,4);
  305.         if (s[0])
  306.           daysmax=atoi(s);
  307.         break;
  308.       case '5':
  309.         prt(2,"Sex restrict (spc=none) ? ");
  310.         ressex=onek(" MF");
  311.         if (ressex==32)
  312.           ressex=0;
  313.         break;
  314.       case '6':
  315.         prt(2,"AR restrict (spc=none) ? ");
  316.         s[0]=onek("ABCDEFGHIJKLMNOP ");
  317.         if (s[0])
  318.           arres=1 << (s[0]-'A');
  319.         else
  320.           arres=0;
  321.         break;
  322.       case '7':
  323.         prt(2,"DAR restrict (spc=none) ? ");
  324.         s[0]=onek("ABCDEFGHIJKLMNOP ");
  325.         if (s[0])
  326.           darres=1 << (s[0]-'A');
  327.         else
  328.           darres=0;
  329.         break;
  330.     }
  331.   } while ((!done) && (!hangup));
  332. }
  333.  
  334.  
  335. #else
  336. /****************************************************************************/
  337.  
  338.  
  339.  
  340. int matchuser(int un)
  341. {
  342.   userrec u;
  343.  
  344.   read_user(un,&u);
  345.   sp=search_pattern;
  346.   return(match_user(&u));
  347. }
  348.  
  349.  
  350. int match_user(userrec *u)
  351. {
  352.   int ok=1,not=0,done=0,less=0,cpf=0,cpp=0,and=1,gotfcn=0,evalit=0,tmp,tmp1,tmp2;
  353.   char fcn[12],parm[12];
  354.   long l;
  355.  
  356.   do {
  357.     if (*sp==0)
  358.       done=1;
  359.     else {
  360.       if (strchr("()|&!<>",*sp)) {
  361.         switch(*sp++) {
  362.           case '(':
  363.             evalit=2;
  364.             break;
  365.           case ')':
  366.             done=1;
  367.             break;
  368.           case '|':
  369.             and=0;
  370.             break;
  371.           case '&':
  372.             and=1;
  373.             break;
  374.           case '!':
  375.             not=1;
  376.             break;
  377.           case '<':
  378.             less=1;
  379.             break;
  380.           case '>':
  381.             less=0;
  382.             break;
  383.         }
  384.       } else if (*sp=='[') {
  385.         gotfcn=1;
  386.         sp++;
  387.       } else if (*sp==']') {
  388.         evalit=1;
  389.         ++sp;
  390.       } else if (*sp!=' ') {
  391.         if (gotfcn) {
  392.           if (cpp<10)
  393.             parm[cpp++]=*sp++;
  394.         } else {
  395.           if (cpf<10)
  396.             fcn[cpf++]=*sp++;
  397.         }
  398.       } else
  399.         ++sp;
  400.       if (evalit) {
  401.         if (evalit==1) {
  402.           fcn[cpf]=0;
  403.           parm[cpp]=0;
  404.           tmp=1;
  405.           tmp1=atoi(parm);
  406.  
  407.           if (!strcmp(fcn,"SL")) {
  408.             if (less)
  409.               tmp=(tmp1>u->sl);
  410.             else
  411.               tmp=(tmp1<u->sl);
  412.           } else if (!strcmp(fcn,"DSL")) {
  413.             if (less)
  414.               tmp=(tmp1>u->dsl);
  415.             else
  416.               tmp=(tmp1<u->dsl);
  417.           } else if (!strcmp(fcn,"AR")) {
  418.             if ((parm[0]>='A') && (parm[0]<='P')) {
  419.               tmp1=1 << (parm[0]-'A');
  420.               if (u->ar & tmp1)
  421.                 tmp=1;
  422.               else
  423.                 tmp=0;
  424.             } else
  425.               tmp=0;
  426.           } else if (!strcmp(fcn,"DAR")) {
  427.             if ((parm[0]>='A') && (parm[0]<='P')) {
  428.               tmp1=1 << (parm[0]-'A');
  429.               if (u->dar & tmp1)
  430.                 tmp=1;
  431.               else
  432.                 tmp=0;
  433.             } else
  434.               tmp=0;
  435.           } else if (!strcmp(fcn,"SEX")) {
  436.             tmp=parm[0]==u->sex;
  437.           } else if (!strcmp(fcn,"AGE")) {
  438.             if (less)
  439.               tmp=(tmp1>u->age);
  440.             else
  441.               tmp=(tmp1<u->age);
  442.           } else if (!strcmp(fcn,"LASTON")) {
  443.             time(&l);
  444.             tmp2=(unsigned int)( (l-u->daten)/24.0/3600.0 );
  445.             if (less)
  446.               tmp=tmp2<tmp1;
  447.             else
  448.               tmp=tmp2>tmp1;
  449.           } else if (!strcmp(fcn,"AREACODE")) {
  450.             tmp=(!strncmp(parm,u->phone,3));
  451.           } else if (!strcmp(fcn,"RESTRICT")) {
  452.             ;
  453.           } else if (!strcmp(fcn,"LOGONS")) {
  454.             if (less)
  455.               tmp=thisuser.logons<tmp1;
  456.             else
  457.               tmp=thisuser.logons>tmp1;
  458.           }
  459.  
  460.         } else
  461.           tmp=match_user(u);
  462.  
  463.         if (not)
  464.           tmp=!tmp;
  465.         if (and)
  466.           ok = ok && tmp;
  467.         else
  468.           ok = ok || tmp;
  469.  
  470.         not=less=cpf=cpp=gotfcn=evalit=0;
  471.         and=1;
  472.       }
  473.     }
  474.   } while (!done);
  475.   return(ok);
  476. }
  477.  
  478. /****************************************************************************/
  479.  
  480. void changeopt()
  481. {
  482.   helpl=42;
  483.   outchr(12);
  484.   pl("Current search string:");
  485.   if (search_pattern[0])
  486.     pl(search_pattern);
  487.   else
  488.     pl("-NONE-");
  489.   nl();
  490.   nl();
  491.   prt(5,"Change it? ");
  492.   if (yn()) {
  493.     pl("Enter new search pattern:");
  494.     prt(2,":");
  495.     input(search_pattern,75);
  496.   }
  497.   helpl=0;
  498. }
  499.  
  500.  
  501. /****************************************************************************/
  502.  
  503. #endif
  504.  
  505. #pragma warn -par
  506.  
  507. void uedit(int usern, int other)
  508. {
  509.  char s[81],s1[81],s2[81],ch,ch1;
  510.  int i,i1,i2,i3,l,un,done,nu,done1,full,temp_full,tempu;
  511.  userrec u;
  512.  
  513.  nl();
  514.  prt(2,"PW: ");
  515.  echo=0;
  516.  input(s,20);
  517.  echo=1;
  518.  if (strcmp(s,("REGARD"))==0) {
  519.   if (incom)
  520.     full=0;
  521.   else
  522.     full=1;
  523.   un=usern;
  524.   done=0;
  525.   read_user(un,&u);
  526.   nu=number_userrecs();
  527.   do {
  528.     read_user(un,&u);
  529.     done1=0;
  530.     temp_full=0;
  531.     do {
  532.       print_data(un,&u, ((full) || (temp_full)));
  533.       nl();
  534.       prt(2,"Uedit : ");
  535.       if ((thisuser.sl==255) || (wfc))
  536.     ch=onek("[]{}/,.:123ABCDEFGHIJKLMNOPQRSTUVWXYZ");
  537.       else
  538.     ch=onek("[]{}/,.:123ABCDEFGHIJKLMNOPQRSTUVWXYZ");
  539.       switch(ch) {
  540.         case ']':
  541.           ++un;
  542.           if (un>nu)
  543.             un=1;
  544.           done1=1;
  545.           break;
  546.         case '[':
  547.           --un;
  548.           if (un==0)
  549.             un=nu;
  550.           done1=1;
  551.       break;
  552.         case '}':
  553.           tempu=un;
  554.           ++un;
  555.           if (un>nu)
  556.             un=1;
  557.           while ((un!=tempu) && (!matchuser(un))) {
  558.             ++un;
  559.             if (un>nu)
  560.               un=1;
  561.           }
  562.           done1=1;
  563.           break;
  564.         case '{':
  565.           tempu=un;
  566.           --un;
  567.           if (un<1)
  568.             un=nu;
  569.           while ((un!=tempu) && (!matchuser(un))) {
  570.             --un;
  571.             if (un<1)
  572.               un=nu;
  573.           }
  574.           done1=1;
  575.       break;
  576.     case '/':
  577.           changeopt();
  578.           break;
  579.     case ',':
  580.           temp_full=(!temp_full);
  581.       break;
  582.         case '.':
  583.           full=(!full);
  584.           temp_full=full;
  585.       break;
  586.     case ':':
  587.       u.year=0;
  588.       write_user(un,&u);
  589.       break;
  590.     case '1':
  591.       if (((u.inact & inact_deleted)==0) && (actsl>u.sl)) {
  592.         prt(5,"Delete? ");
  593.         if (yn()) {
  594.           prt(5,"Would you like to add this user to the list? ");
  595.         if (yn())
  596.           dellist(un,&u);
  597.           deluser(un);
  598.           read_user(un,&u);
  599.         }
  600.       }
  601.       break;
  602.     case '2':
  603.       if (u.inact & inact_deleted) {
  604.         u.inact ^= inact_deleted;
  605.         isr(un,u.name);
  606.         write_user(un,&u);
  607.       }
  608.       break;
  609.     case '3':
  610.       nl();
  611.       prt(2,"User name/number: ");
  612.       input(s,30);
  613.       i=finduser1(s);
  614.       if (i>0) {
  615.         un=i;
  616.         done1=1;
  617.       }
  618.       break;
  619.     case 'A':
  620.       nl();
  621.       strcpy(s1,u.name);
  622.       prt(2,"New Alias? ");
  623.           input(s,30);
  624.           if (s[0]) {
  625.         if (finduser(s)<1) {
  626.           dsr(u.name);
  627.           strcpy(u.name,s);
  628.           isr(un,u.name);
  629.           write_user(un,&u);
  630.           sprintf(s2,"Changed %s's alias to %s",s1,u.name);
  631.           sysoplog(s2);
  632.         }
  633.           }
  634.           break;
  635.     case 'B':
  636.           nl();
  637.       prt(2,"New first name? ");
  638.       inputf(s,20);
  639.       if (s[0]) {
  640.         strcpy(u.realname,s);
  641.         write_user(un,&u);
  642.       }
  643.       nl();
  644.       prt(2,"New last name?");
  645.       inputf(s,20);
  646.       if (s[0]) {
  647.         strcpy(u.lastname,s);
  648.         write_user(un,&u);
  649.       }
  650.       break;
  651.     case 'C':
  652.       nl();
  653.       prt(2,"New address? ");
  654.       inputf(s,37);
  655.       if (s[0]) {
  656.         strcpy(u.stretadd,s);
  657.         write_user(un,&u);
  658.       }
  659.       break;
  660.     case 'D':
  661.       nl();
  662.       prt(2,"New city? ");
  663.       inputf(s,20);
  664.       if (s[0]) {
  665.         strcpy(u.citstate,s);
  666.         write_user(un,&u);
  667.       }
  668.       break;
  669.     case 'E':
  670.       nl();
  671.       prt(1,"New zipcode? ");
  672.       inputf(s,5);
  673.       l=atol(s);
  674.       if ((s[0]) && (l>=0))
  675.         u.wwiv_regnum = l;
  676.       write_user(un,&u);
  677.       break;
  678.     case 'F':
  679.       nl();
  680.       prt(2,"New phone number? ");
  681.       input(s,12);
  682.       if (s[0]) {
  683.         strcpy(u.phone,s);
  684.         write_user(un,&u);
  685.       }
  686.       break;
  687.     case 'G':
  688.       nl();
  689.       outstr("Gender (M,F) :");
  690.       u.sex=onek("MF");
  691.       sprintf(s,"Current birthdate: %02d/%02d/%02d",(int) u.month,
  692.          (int) u.day,
  693.          (int) u.year);
  694.       pl(s);
  695.       input_age(&u);
  696.       write_user(un,&u);
  697.       break;
  698.     case 'H':
  699.       nl();
  700.       pl("Known computer types:");
  701.       nl();
  702.       for (i=0; ctypes[i]; i++)
  703.         npr("%d. %s\r\n",i+1,ctypes[i]);
  704.       nl();
  705.       prt(2,"Enter new computer type: ");
  706.       input(s,2);
  707.       i1=atoi(s);
  708.       if ((i1>0) && (i1<=i)) {
  709.         u.comp_type=i1-1;
  710.         if (checkcomp("Ami"))
  711.           u.colors[0]=4;
  712.         else
  713.           u.colors[0]=7;
  714.         write_user(un,&u);
  715.       }
  716.       break;
  717.     case 'I':
  718.       nl();
  719.       prt(5,"Change password? ");
  720.       if (yn()) {
  721.         nl();
  722.         prt(1,"Enter new password :");
  723.         input(s,8);
  724.         strcpy(u.pw,s);
  725.         write_user(un,&u);
  726.         }
  727.       break;
  728.     case 'K':
  729.       nl();
  730.       prt(1,"Enter Messages Posted :");
  731.       input(s,4);
  732.       i=atoi(s);
  733.         u.msgpost=i;
  734.         write_user(un,&u);
  735.       break;
  736.     case 'L':
  737.       nl();
  738.       prt(1,"Enter new total logons :");
  739.       input(s,4);
  740.       i=atoi(s);
  741.         u.logons=i;
  742.         write_user(un,&u);
  743.       break;
  744.     case 'M':
  745.       nl();
  746.       prt(1,"Change Uploads? ");
  747.         if (yn()) {
  748.           prt(1,"Change Number of Files? ");
  749.         if (yn()) {
  750.           prt(1, "Enter new number of files : ");
  751.           input(s,4);
  752.           i=atoi(s);
  753.           u.uploaded=i;
  754.           write_user(un,&u);
  755.         }
  756.           npr("Change Amount of k? ");
  757.         if(yn()) {
  758.           prt(1, "Enter new k : ");
  759.           input(s,6);
  760.           i=atoi(s);
  761.           u.uk=i;
  762.           write_user(un,&u);
  763.         }
  764.         }
  765.       npr("Change Downloads? ");
  766.         if(yn()) {
  767.           npr("Change Number of Files? ");
  768.         if(yn()) {
  769.           prt(1, "Enter new number of files : ");
  770.           input(s,4);
  771.           i=atoi(s);
  772.           u.downloaded=i;
  773.           write_user(un,&u);
  774.         }
  775.           npr("Change Amount of k? ");
  776.         if(yn()) {
  777.           prt(1, "Enter new k : ");
  778.           input(s,6);
  779.           i=atoi(s);
  780.           u.dk=i;
  781.           write_user(un,&u);
  782.         }
  783.         }
  784.       break;
  785.     case 'N':
  786.       nl();
  787.       prt(1,"Enter New Baud Rate :");
  788.       input(s,4);
  789.       i=atoi(s);
  790.       u.lastrate=i;
  791.       write_user(un,&u);
  792.       break;
  793.     case 'O':
  794.       nl();
  795.       prt(1,"Enter new ass points :");
  796.       input(s,3);
  797.       i=atoi(s);
  798.         u.ass_pts=i;
  799.         write_user(un,&u);
  800.       break;
  801.     case 'P':
  802.       nl();
  803.       npr("1Amount of gold in account2?\r\n5[7Current1=2%d5]\r\n", (int) u.gold);
  804.       mpl(5);
  805.       input(s,5);
  806.       i=atoi(s);
  807.       if (s[0]) {
  808.         u.gold=i;
  809.         write_user(un,&u);
  810.       }
  811.       break;
  812.     case 'Q':
  813.           done=1;
  814.           done1=1;
  815.           break;
  816.     case 'R':
  817.       if (u.sl==255)
  818.         break;
  819.       if (u.sl>=actsl)
  820.         break;
  821.       nl();
  822.       prt(2,"New SL? ");
  823.       input(s,3);
  824.       i=atoi(s);
  825.       if ((!wfc) && (i>=actsl))
  826.         i=-1;
  827.       if ((i>=0) && (i<255) && (s[0])) {
  828.         u.sl=i;
  829.         write_user(un,&u);
  830.         if (un==usernum)
  831.           actsl=i;
  832.       }
  833.       break;
  834.     case 'S':
  835.       if (u.dsl==255)
  836.         break;
  837.       if (u.dsl>=thisuser.dsl)
  838.         break;
  839.           nl();
  840.           prt(2,"New DSL? ");
  841.           input(s,3);
  842.           i=atoi(s);
  843.           if ((!wfc) && (i>=thisuser.dsl))
  844.             i=-1;
  845.           if ((i>=0) && (i<255) && (s[0])) {
  846.             u.dsl=i;
  847.             write_user(un,&u);
  848.           }
  849.       break;
  850.     case 'T':
  851.       nl();
  852.       prt(2,"New sysop sub? ");
  853.       input(s,3);
  854.       i=atoi(s);
  855.       if ((i>=0) && (i<=255) && (s[0])) {
  856.         u.sysopsub=i;
  857.         write_user(un,&u);
  858.       }
  859.       break;
  860.     case 'U':
  861.       nl();
  862.       prt(2,"New Exemption? ");
  863.       input(s,3);
  864.       i=atoi(s);
  865.       if ((i>=0) && (i<=255) && (s[0])) {
  866.         u.exempt=i;
  867.         write_user(un,&u);
  868.       }
  869.       break;
  870.     case 'V':
  871.       nl();
  872.       prt(1,"New Tag? ");
  873.           inputl(s,39);
  874.           strcpy(u.note,s);
  875.           write_user(un,&u);
  876.       break;
  877.     case 'W':
  878.       nl();
  879.       prt(2,"Toggle which AR? ");
  880.       ch1=onek("\rABCDEFGHIJKLMNOP");
  881.       if (ch1!=13) {
  882.         ch1-='A';
  883.         if ((wfc) || (thisuser.ar & (1 << ch1))) {
  884.           u.ar ^= (1 << ch1);
  885.           write_user(un,&u);
  886.         }
  887.       }
  888.       break;
  889.     case 'X':
  890.       nl();
  891.       prt(2,"Toggle which DAR? ");
  892.       ch1=onek("\rABCDEFGHIJKLMNOP");
  893.       if (ch1!=13) {
  894.         ch1-='A';
  895.         if ((wfc) || (thisuser.dar & (1 << ch1))) {
  896.           u.dar ^= (1 << ch1);
  897.           write_user(un,&u);
  898.         }
  899.       }
  900.       break;
  901.     case 'Y':
  902.       nl();
  903.       npr("        %s\r\n",restrict_string);
  904.       do {
  905.             prt(2,"Toggle? ");
  906.             s[0]=13;
  907.         s[1]='?';
  908.             strcpy(&(s[2]),restrict_string);
  909.             ch1=onek(s);
  910.             if (ch1==32)
  911.               ch1=13;
  912.         if (ch1=='?')
  913.           printmenu(10);
  914.             if ((ch1!=13) && (ch1!='?')) {
  915.               i=-1;
  916.               for (i1=0; i1<16; i1++)
  917.                 if (ch1==s[i1+2])
  918.                   i=i1;
  919.               if (i>-1) {
  920.                 u.restrict ^= (1 << i);
  921.                 write_user(un,&u);
  922.               }
  923.             }
  924.       } while ((!hangup) && (ch1=='?'));
  925.       break;
  926.     case 'Z':
  927.       nl();
  928.       prt(2,"Has the user been voiced? ");
  929.       input(s,6);
  930.       if (s[0]) {
  931.         strcpy(u.zipcode,s);
  932.         write_user(un,&u);
  933.       } else {
  934.         prt(5,"Delete answer? ");
  935.         if (yn()) {
  936.           u.zipcode[0]=0;
  937.           write_user(un,&u);
  938.         }
  939.       }
  940.       break;
  941.       }
  942.     } while ((!done1) && (!hangup));
  943.   } while ((!done) && (!hangup));
  944.   close_user();
  945.   if (!wfc)
  946.     topscreen();
  947.  }
  948. }
  949.  
  950. #pragma warn +par