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 >
Wrap
Text File
|
1990-07-16
|
9KB
|
366 lines
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <dos.h>
#include <stdlib.h>
#include <sys\stat.h>
#include <io.h>
#include "vardec.h"
int usernum, /* user number for the user */
age, /* age of the user */
screenchars, /* chars/line user has specified */
screenlines, /* lines/screen user has specified */
sl, /* sec lev for user (0-255) */
so, /* non-zero if user is sysop (sl=255) */
cs, /* non-zero if user is co-sysop */
okansi, /* non-zero if user can support ANSI */
incom, /* non-zero if user is calling remotely */
comport; /* com port user is on */
char name[81], /* name/alias of user */
realname[81], /* real name of user */
callsign[10], /* amateur radio callsign of user */
sex, /* sex of user, M or F */
laston[81], /* date user was last on */
gfiles[81], /* directory for text files, ends in \ */
data[81], /* directory for non-text files, ends in \ */
sysoplog[81], /* full path & filename for sysop log */
curspeed[81]; /* speed user is on at, "KB" if local */
double gold, /* gold user has */
timeallowed, /* number of seconds before user logged off */
version; /* version of WWIV running under */
configrec syscfg;
int userfile, questused[25];
void far interrupt (*inli)(char *, char *, int, int);
void far interrupt (*checka)(int *, int *);
void far interrupt (*pla)(char *, int *);
void far interrupt (*outchr)(char);
void far interrupt (*outstr)(char *);
void far interrupt (*nl)();
void far interrupt (*pl)(char *);
int far interrupt (*empty)();
char far interrupt (*inkey)();
unsigned char far interrupt (*getkey)();
void far interrupt (*input)(char *, int);
void far interrupt (*inputl)(char *, int);
int far interrupt (*yn)();
int far interrupt (*ny)();
void far interrupt (*ansic)(int);
char far interrupt (*onek)(char *);
void far interrupt (*prt)(int, char *);
void far interrupt (*mpl)(int);
void far **funcs;
int read_in_data(char *fn)
{
char buf[1024];
char *ptr[30],*ss,s[81];
int i,f,len,i1;
float fl;
f=open(fn,O_RDONLY | O_BINARY);
if (f<0) {
return(-1);
}
i1=1;
ptr[0]=buf;
len=read(f,(void *)buf,1024);
close(f);
for (i=0; i<len; i++)
if (buf[i]==13) {
buf[i]=0;
ptr[i1++]=&buf[i+2];
}
while (*ptr[6]==32)
++(ptr[6]);
while (*ptr[15]==32)
++(ptr[15]);
usernum=atoi(ptr[0]);
strcpy(name,ptr[1]);
strcpy(realname,ptr[2]);
strcpy(callsign,ptr[3]);
age=atoi(ptr[4]);
sex=*ptr[5];
sscanf(ptr[6],"%f",&fl);
gold=(double)fl;
strcpy(laston,ptr[7]);
screenchars=atoi(ptr[8]);
screenlines=atoi(ptr[9]);
sl=atoi(ptr[10]);
so=atoi(ptr[11]);
cs=atoi(ptr[12]);
okansi=atoi(ptr[13]);
incom=atoi(ptr[14]);
sscanf(ptr[15],"%f",&fl);
timeallowed=(double)fl;
strcpy(gfiles,ptr[16]);
strcpy(data,ptr[17]);
strcpy(sysoplog,gfiles);
strcat(sysoplog,ptr[18]);
strcpy(curspeed,ptr[19]);
comport=atoi(ptr[20]);
version=-1.0;
ss=getenv("BBS");
if (strncmp(ss,"WWIV",4)) {
printf("\nThis program MUST be run under WWIV v4.07 or later.\n");
exit(0);
}
strcpy(s,&(ss[6]));
i=(s[0]-'0')*100+(s[2]-'0')*10+(s[3]-'0');
version=((double)i)/100.0;
if (i<407) {
printf("\nThis program MUST be run under WWIV v4.07 or later.\n");
exit(0);
}
funcs=(void far *)getvect(0x6a);
inli=funcs[0];
checka=funcs[1];
pla=funcs[2];
outchr=funcs[3];
outstr=funcs[4];
nl=funcs[5];
pl=funcs[8];
empty=funcs[9];
inkey=funcs[10];
getkey=funcs[11];
input=funcs[12];
inputl=funcs[13];
yn=funcs[14];
ny=funcs[15];
ansic=funcs[16];
onek=funcs[17];
prt=funcs[18];
mpl=funcs[19];
return(0);
}
void close_user()
{
if (userfile!=-1) {
close(userfile);
userfile=-1;
}
}
void read_user(unsigned int un, userrec *u)
{
long pos;
char s[80];
int i;
if (userfile==-1) {
sprintf(s, "%sUSER.LST", syscfg.datadir);
userfile=open(s,O_RDWR | O_BINARY);
if (userfile<0) {
u->inact=inact_deleted;
return;
}
}
pos=((long) sizeof(userrec)) * ((long) un);
if (filelength(userfile)<=pos) {
u->inact=inact_deleted;
return;
}
lseek(userfile,pos,SEEK_SET);
i=read(userfile, (void *)u, sizeof(userrec));
if (i==-1) {
sprintf(s, "%sUSER.LST", syscfg.datadir);
userfile=open(s,O_RDWR | O_BINARY);
if (userfile<0) {
u->inact=inact_deleted;
return;
}
pos=((long) sizeof(userrec)) * ((long) un);
if (filelength(userfile)<=pos) {
u->inact=inact_deleted;
return;
}
lseek(userfile,pos,SEEK_SET);
i=read(userfile, (void *)u, sizeof(userrec));
if (i==-1) {
pl("COULDN'T READ USER.");
}
close_user();
}
}
void write_user(unsigned int un, userrec *u)
{
long pos;
char s[80];
unsigned char oldsl;
int i;
if (userfile==-1) {
sprintf(s, "%sUSER.LST", syscfg.datadir);
userfile=open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
}
pos=((long) sizeof(userrec)) * ((long) un);
lseek(userfile,pos,SEEK_SET);
i=write(userfile, (void *)u, sizeof(userrec));
if (i==-1) {
sprintf(s, "%sUSER.LST", syscfg.datadir);
userfile=open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
pos=((long) sizeof(userrec)) * ((long) un);
lseek(userfile,pos,SEEK_SET);
i=write(userfile, (void *)u, sizeof(userrec));
if (i==-1) {
pl("COULDN'T WRITE USER.");
}
close_user();
}
}
void print_quests(int f)
{
char s[100];
int i,abort;
votingrec v;
abort=0;
for (i=1; (i<=20) && (abort==0); i++) {
lseek(f,((long) (i-1)) * sizeof(votingrec), SEEK_SET);
read(f,(void *)&v,sizeof(votingrec));
s[0]=32;
if (i<10)
itoa(i,&s[1],10);
else
itoa(i,&s[0],10);
strcat(s,": ");
if (v.numanswers)
strcat(s,v.question);
else
strcat(s,">>> NO QUESTION <<<");
pla(s,&abort);
}
nl();
if (abort)
nl();
}
void set_question(int f, int ii)
{
votingrec v,v1;
int i,i1,i2;
char s[81];
userrec u;
voting_response vr;
pl("Enter new question, <C/R> for none.");
outstr(": ");
inputl(s,75);
strcpy(v.question,s);
v.numanswers=0;
vr.numresponses=0;
vr.response[0]='X';
vr.response[1]=0;
for (i=0; i<20; i++)
v.responses[i]=vr;
while ((v.numanswers<19) && (s[0])) {
itoa(v.numanswers+1,s,10);
strcat(s,": ");
outstr(s);
inputl(s,63);
strcpy(vr.response,s);
vr.numresponses=0;
v.responses[v.numanswers]=vr;
if (s[0])
++v.numanswers;
}
lseek(f,((long) (ii)) * sizeof(votingrec), SEEK_SET);
write(f,(void *)(&v),sizeof(votingrec));
lseek(f,((long) (ii)) * sizeof(votingrec), SEEK_SET);
read(f,(void *)(&v1),sizeof(votingrec));
close(f);
if (v.numanswers)
questused[ii]=1;
else
questused[ii]=0;
read_user(1,&u);
i1=(int) (filelength(userfile)/sizeof(userrec)) -1;
for (i=1; i<=i1; i++) {
read_user(i,&u);
u.votes[ii]=0;
write_user(i,&u);
}
close_user();
}
void ivotes()
{
int i,f,abort,n,done;
char s[81];
votingrec v;
sprintf(s, "%sVOTING.DAT", syscfg.datadir);
f=open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
n=(int) (filelength(f) / sizeof(votingrec)) -1;
if (n<20) {
v.question[0]=0;
v.numanswers=0;
for (i=n; i<20; i++)
write(f,(void *)&v,sizeof(votingrec));
}
done=0;
do {
outchr(12);
print_quests(f);
prt(2,"Which (Q=Quit) ? ");
input(s,2);
if (strcmp(s,"Q")==0)
done=1;
i=atoi(s);
if ((i>0) && (i<21)) {
set_question(f,i-1);
sprintf(s, "%sVOTING.DAT", syscfg.datadir);
f=open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
}
} while (!done);
close(f);
}
void main(int argc, char *argv[])
{
char s[81];
int i, n, x;
votingrec v;
userfile = -1;
if (argc<2)
strcpy(s,"chain.txt");
else
strcpy(s,argv[1]);
if (read_in_data(s)==-1) {
printf("\nData file not found: %s\n\n", s);
abort();
}
strcpy(s,"CONFIG.DAT");
i=open(s,O_RDWR | O_BINARY);
if (i<0) {
printf("%s NOT FOUND.\n",s);
exit(1);
}
read(i,(void *) (&syscfg), sizeof(configrec));
close(i);
sprintf(s, "%sVOTING.DAT", syscfg.datadir);
i = open(s, O_RDWR | O_BINARY);
if (i > 0) {
n=(int) (filelength(i) / sizeof(votingrec)) -1;
for (x = 0; x < n; x++) {
lseek(i, (long)(x * sizeof(votingrec)), SEEK_SET);
read(i, (void *)(&v), sizeof(votingrec));
if (v.numanswers)
questused[x] = 1;
}
close(i);
}
ivotes();
}