home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / UTILITY / ES102.ARJ / VE.C < prev    next >
Text File  |  1990-07-16  |  9KB  |  366 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <fcntl.h>
  4. #include <dos.h>
  5. #include <stdlib.h>
  6. #include <sys\stat.h>
  7. #include <io.h>
  8. #include "vardec.h"
  9.  
  10. int    usernum,             /* user number for the user */
  11.        age,                 /* age of the user */
  12.        screenchars,         /* chars/line user has specified */
  13.        screenlines,         /* lines/screen user has specified */
  14.        sl,                  /* sec lev for user (0-255) */
  15.        so,                  /* non-zero if user is sysop (sl=255) */
  16.        cs,                  /* non-zero if user is co-sysop */
  17.        okansi,              /* non-zero if user can support ANSI */
  18.        incom,               /* non-zero if user is calling remotely */
  19.        comport;             /* com port user is on */
  20. char   name[81],            /* name/alias of user */
  21.        realname[81],        /* real name of user */
  22.        callsign[10],        /* amateur radio callsign of user */
  23.        sex,                 /* sex of user, M or F */
  24.        laston[81],          /* date user was last on */
  25.        gfiles[81],          /* directory for text files, ends in \ */
  26.        data[81],            /* directory for non-text files, ends in \ */
  27.        sysoplog[81],        /* full path & filename for sysop log */
  28.        curspeed[81];        /* speed user is on at, "KB" if local */
  29. double gold,                /* gold user has */
  30.        timeallowed,         /* number of seconds before user logged off */
  31.        version;             /* version of WWIV running under */
  32.  
  33. configrec syscfg;
  34. int userfile, questused[25];
  35.  
  36. void far interrupt (*inli)(char *, char *, int, int);
  37. void far interrupt (*checka)(int *, int *);
  38. void far interrupt (*pla)(char *, int *);
  39. void far interrupt (*outchr)(char);
  40. void far interrupt (*outstr)(char *);
  41. void far interrupt (*nl)();
  42. void far interrupt (*pl)(char *);
  43. int  far interrupt (*empty)();
  44. char far interrupt (*inkey)();
  45. unsigned char far interrupt (*getkey)();
  46. void far interrupt (*input)(char *, int);
  47. void far interrupt (*inputl)(char *, int);
  48. int  far interrupt (*yn)();
  49. int  far interrupt (*ny)();
  50. void far interrupt (*ansic)(int);
  51. char far interrupt (*onek)(char *);
  52. void far interrupt (*prt)(int, char *);
  53. void far interrupt (*mpl)(int);
  54. void far **funcs;
  55.  
  56. int read_in_data(char *fn)
  57. {
  58.   char buf[1024];
  59.   char *ptr[30],*ss,s[81];
  60.   int i,f,len,i1;
  61.   float fl;
  62.  
  63.   f=open(fn,O_RDONLY | O_BINARY);
  64.   if (f<0) {
  65.     return(-1);
  66.   }
  67.   i1=1;
  68.   ptr[0]=buf;
  69.   len=read(f,(void *)buf,1024);
  70.   close(f);
  71.   for (i=0; i<len; i++)
  72.     if (buf[i]==13) {
  73.       buf[i]=0;
  74.       ptr[i1++]=&buf[i+2];
  75.     }
  76.   while (*ptr[6]==32)
  77.     ++(ptr[6]);
  78.   while (*ptr[15]==32)
  79.     ++(ptr[15]);
  80.   usernum=atoi(ptr[0]);
  81.   strcpy(name,ptr[1]);
  82.   strcpy(realname,ptr[2]);
  83.   strcpy(callsign,ptr[3]);
  84.   age=atoi(ptr[4]);
  85.   sex=*ptr[5];
  86.   sscanf(ptr[6],"%f",&fl);
  87.   gold=(double)fl;
  88.   strcpy(laston,ptr[7]);
  89.   screenchars=atoi(ptr[8]);
  90.   screenlines=atoi(ptr[9]);
  91.   sl=atoi(ptr[10]);
  92.   so=atoi(ptr[11]);
  93.   cs=atoi(ptr[12]);
  94.   okansi=atoi(ptr[13]);
  95.   incom=atoi(ptr[14]);
  96.   sscanf(ptr[15],"%f",&fl);
  97.   timeallowed=(double)fl;
  98.   strcpy(gfiles,ptr[16]);
  99.   strcpy(data,ptr[17]);
  100.   strcpy(sysoplog,gfiles);
  101.   strcat(sysoplog,ptr[18]);
  102.   strcpy(curspeed,ptr[19]);
  103.   comport=atoi(ptr[20]);
  104.   version=-1.0;
  105.   ss=getenv("BBS");
  106.   if (strncmp(ss,"WWIV",4)) {
  107.     printf("\nThis program MUST be run under WWIV v4.07 or later.\n");
  108.     exit(0);
  109.   }
  110.   strcpy(s,&(ss[6]));
  111.   i=(s[0]-'0')*100+(s[2]-'0')*10+(s[3]-'0');
  112.   version=((double)i)/100.0;
  113.   if (i<407) {
  114.     printf("\nThis program MUST be run under WWIV v4.07 or later.\n");
  115.     exit(0);
  116.   }
  117.   funcs=(void far *)getvect(0x6a);
  118.   inli=funcs[0];
  119.   checka=funcs[1];
  120.   pla=funcs[2];
  121.   outchr=funcs[3];
  122.   outstr=funcs[4];
  123.   nl=funcs[5];
  124.   pl=funcs[8];
  125.   empty=funcs[9];
  126.   inkey=funcs[10];
  127.   getkey=funcs[11];
  128.   input=funcs[12];
  129.   inputl=funcs[13];
  130.   yn=funcs[14];
  131.   ny=funcs[15];
  132.   ansic=funcs[16];
  133.   onek=funcs[17];
  134.   prt=funcs[18];
  135.   mpl=funcs[19];
  136.   return(0);
  137. }
  138.  
  139. void close_user()
  140. {
  141.   if (userfile!=-1) {
  142.     close(userfile);
  143.     userfile=-1;
  144.   }
  145. }
  146.  
  147. void read_user(unsigned int un, userrec *u)
  148. {
  149.   long pos;
  150.   char s[80];
  151.   int i;
  152.  
  153.   if (userfile==-1) {
  154.     sprintf(s, "%sUSER.LST", syscfg.datadir);
  155.     userfile=open(s,O_RDWR | O_BINARY);
  156.     if (userfile<0) {
  157.       u->inact=inact_deleted;
  158.       return;
  159.     }
  160.   }
  161.   pos=((long) sizeof(userrec)) * ((long) un);
  162.   if (filelength(userfile)<=pos) {
  163.     u->inact=inact_deleted;
  164.     return;
  165.   }
  166.   lseek(userfile,pos,SEEK_SET);
  167.   i=read(userfile, (void *)u, sizeof(userrec));
  168.   if (i==-1) {
  169.     sprintf(s, "%sUSER.LST", syscfg.datadir);
  170.     userfile=open(s,O_RDWR | O_BINARY);
  171.     if (userfile<0) {
  172.       u->inact=inact_deleted;
  173.       return;
  174.     }
  175.     pos=((long) sizeof(userrec)) * ((long) un);
  176.     if (filelength(userfile)<=pos) {
  177.       u->inact=inact_deleted;
  178.       return;
  179.     }
  180.     lseek(userfile,pos,SEEK_SET);
  181.     i=read(userfile, (void *)u, sizeof(userrec));
  182.     if (i==-1) {
  183.       pl("COULDN'T READ USER.");
  184.     }
  185.     close_user();
  186.   }
  187. }
  188.  
  189. void write_user(unsigned int un, userrec *u)
  190. {
  191.   long pos;
  192.   char s[80];
  193.   unsigned char oldsl;
  194.   int i;
  195.  
  196.   if (userfile==-1) {
  197.     sprintf(s, "%sUSER.LST", syscfg.datadir);
  198.     userfile=open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  199.   }
  200.   pos=((long) sizeof(userrec)) * ((long) un);
  201.   lseek(userfile,pos,SEEK_SET);
  202.   i=write(userfile, (void *)u, sizeof(userrec));
  203.   if (i==-1) {
  204.     sprintf(s, "%sUSER.LST", syscfg.datadir);
  205.     userfile=open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  206.     pos=((long) sizeof(userrec)) * ((long) un);
  207.     lseek(userfile,pos,SEEK_SET);
  208.     i=write(userfile, (void *)u, sizeof(userrec));
  209.     if (i==-1) {
  210.       pl("COULDN'T WRITE USER.");
  211.     }
  212.     close_user();
  213.   }
  214. }
  215.  
  216. void print_quests(int f)
  217. {
  218.   char s[100];
  219.   int i,abort;
  220.   votingrec v;
  221.  
  222.   abort=0;
  223.   for (i=1; (i<=20) && (abort==0); i++) {
  224.     lseek(f,((long) (i-1)) * sizeof(votingrec), SEEK_SET);
  225.     read(f,(void *)&v,sizeof(votingrec));
  226.     s[0]=32;
  227.     if (i<10)
  228.       itoa(i,&s[1],10);
  229.     else
  230.       itoa(i,&s[0],10);
  231.     strcat(s,": ");
  232.     if (v.numanswers)
  233.       strcat(s,v.question);
  234.     else
  235.       strcat(s,">>> NO QUESTION <<<");
  236.     pla(s,&abort);
  237.   }
  238.   nl();
  239.   if (abort)
  240.     nl();
  241. }
  242.  
  243. void set_question(int f, int ii)
  244. {
  245.   votingrec v,v1;
  246.   int i,i1,i2;
  247.   char s[81];
  248.   userrec u;
  249.   voting_response vr;
  250.  
  251.   pl("Enter new question, <C/R> for none.");
  252.   outstr(": ");
  253.   inputl(s,75);
  254.   strcpy(v.question,s);
  255.   v.numanswers=0;
  256.   vr.numresponses=0;
  257.   vr.response[0]='X';
  258.   vr.response[1]=0;
  259.   for (i=0; i<20; i++)
  260.     v.responses[i]=vr;
  261.   while ((v.numanswers<19) && (s[0])) {
  262.     itoa(v.numanswers+1,s,10);
  263.     strcat(s,": ");
  264.     outstr(s);
  265.     inputl(s,63);
  266.     strcpy(vr.response,s);
  267.     vr.numresponses=0;
  268.     v.responses[v.numanswers]=vr;
  269.     if (s[0])
  270.       ++v.numanswers;
  271.   }
  272.   lseek(f,((long) (ii)) * sizeof(votingrec), SEEK_SET);
  273.   write(f,(void *)(&v),sizeof(votingrec));
  274.   lseek(f,((long) (ii)) * sizeof(votingrec), SEEK_SET);
  275.   read(f,(void *)(&v1),sizeof(votingrec));
  276.   close(f);
  277.   if (v.numanswers)
  278.     questused[ii]=1;
  279.   else
  280.     questused[ii]=0;
  281.  
  282.   read_user(1,&u);
  283.   i1=(int) (filelength(userfile)/sizeof(userrec)) -1;
  284.   for (i=1; i<=i1; i++) {
  285.     read_user(i,&u);
  286.     u.votes[ii]=0;
  287.     write_user(i,&u);
  288.   }
  289.   close_user();
  290. }
  291.  
  292. void ivotes()
  293. {
  294.   int i,f,abort,n,done;
  295.   char s[81];
  296.   votingrec v;
  297.  
  298.   sprintf(s, "%sVOTING.DAT", syscfg.datadir);
  299.   f=open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  300.   n=(int) (filelength(f) / sizeof(votingrec)) -1;
  301.   if (n<20) {
  302.     v.question[0]=0;
  303.     v.numanswers=0;
  304.     for (i=n; i<20; i++)
  305.       write(f,(void *)&v,sizeof(votingrec));
  306.   }
  307.   done=0;
  308.   do {
  309.     outchr(12);
  310.     print_quests(f);
  311.     prt(2,"Which (Q=Quit) ? ");
  312.     input(s,2);
  313.     if (strcmp(s,"Q")==0)
  314.       done=1;
  315.     i=atoi(s);
  316.     if ((i>0) && (i<21)) {
  317.       set_question(f,i-1);
  318.       sprintf(s, "%sVOTING.DAT", syscfg.datadir);
  319.       f=open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  320.     }
  321.   } while (!done);
  322.   close(f);
  323. }
  324.  
  325. void main(int argc, char *argv[])
  326. {
  327.   char s[81];
  328.   int i, n, x;
  329.   votingrec v;
  330.  
  331.   userfile = -1;
  332.  
  333.   if (argc<2)
  334.     strcpy(s,"chain.txt");
  335.   else
  336.     strcpy(s,argv[1]);
  337.   if (read_in_data(s)==-1) {
  338.     printf("\nData file not found: %s\n\n", s);
  339.     abort();
  340.   }
  341.  
  342.   strcpy(s,"CONFIG.DAT");
  343.   i=open(s,O_RDWR | O_BINARY);
  344.   if (i<0) {
  345.     printf("%s NOT FOUND.\n",s);
  346.     exit(1);
  347.   }
  348.   read(i,(void *) (&syscfg), sizeof(configrec));
  349.   close(i);
  350.  
  351.   sprintf(s, "%sVOTING.DAT", syscfg.datadir);
  352.   i = open(s, O_RDWR | O_BINARY);
  353.   if (i > 0) {
  354.     n=(int) (filelength(i) / sizeof(votingrec)) -1;
  355.     for (x = 0; x < n; x++) {
  356.       lseek(i, (long)(x * sizeof(votingrec)), SEEK_SET);
  357.       read(i, (void *)(&v), sizeof(votingrec));
  358.       if (v.numanswers)
  359.         questused[x] = 1;
  360.     }
  361.     close(i);
  362.   }
  363.  
  364.   ivotes();
  365. }
  366.