home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Devil's Doorknob BBS Capture (1996-2003)
/
devilsdoorknobbbscapture1996-2003.iso
/
WWIV2.ZIP
/
BBSUTL.C
< prev
next >
Wrap
Text File
|
1995-12-11
|
15KB
|
719 lines
#include "vars.h"
#pragma hdrstop
void far *malloca(unsigned long nbytes)
{
void *buf;
char s[160];
buf=farmalloc(nbytes+1);
if (buf==NULL) {
nl();
npr(get_stringx(1,31),nbytes);
nl();
sprintf(s,get_stringx(1,32),nbytes);
sysoplog(s);
}
return(buf);
}
void stuff_in(char *s, char *s1, char *f1, char *f2, char *f3, char *f4, char *f5)
{
int r=0,w=0;
while (s1[r]!=0) {
if (s1[r]=='%') {
++r;
s[w]=0;
switch(s1[r]) {
case '1': strcat(s,f1); break;
case '2': strcat(s,f2); break;
case '3': strcat(s,f3); break;
case '4': strcat(s,f4); break;
case '5': strcat(s,f5); break;
}
w=strlen(s);
r++;
} else
s[w++]=s1[r++];
}
s[w]=0;
}
void copy_line(char *s, char *b, long *ptr, long len)
{
int i;
long l;
if (*ptr>=len) {
s[0]=0;
return;
}
l=*ptr;
i=0;
while ((b[l]!='\r') && (b[l]!='\n') && (l<len)) {
s[i++]=b[l++];
}
s[i]=0;
if ((b[l]=='\r') && (l<len))
++l;
if ((b[l]=='\n') && (l<len))
++l;
*ptr=l;
}
char *mmkey(int dl)
{
static unsigned char cmd1[10],cmd2[81],ch;
int i,i1,i2,p,cp;
do {
do {
ch=getkey();
} while ((((ch<' ') && (ch!=13)) || (ch>126)) && (hangup==0));
ch=upcase(ch);
outchr(ch);
if (ch==13)
cmd1[0]=0;
else
cmd1[0]=ch;
cmd1[1]=0;
p=0;
switch(dl) {
case 1:
if (strchr(dtc,ch)!=NULL)
p=2;
else if (strchr(dcd,ch)!=NULL)
p=1;
break;
case 2:
if (strchr(odc,ch)!=NULL)
p=1;
break;
case 0:
if (strchr(tc,ch)!=NULL)
p=2;
else if (strchr(dc,ch)!=NULL)
p=1;
break;
}
if (p) {
cp=1;
do {
do {
ch=getkey();
} while ((((ch<' ') && (ch!=13) && (ch!=8)) || (ch>126)) && (hangup==0));
ch=upcase(ch);
if (ch==13) {
nl();
return(cmd1);
} else {
if (ch==8) {
backspace();
cmd1[--cp]=0;
} else {
cmd1[cp++]=ch;
cmd1[cp]=0;
outchr(ch);
if ((ch=='/') && (cmd1[0]=='/')) {
input(cmd2,50);
return(cmd2);
} else if (cp==p+1) {
nl();
return(cmd1);
}
}
}
} while (cp);
} else {
nl();
return(cmd1);
}
} while (hangup==0);
cmd1[0]=0;
return(cmd1);
}
void inli(char *s, char *rollover, int maxlen, int crend)
{
int cp,i,i1,done,cm,begx;
char s1[255],s2[255],*ss;
unsigned char ch;
cm=chatting;
begx=wherex();
if (rollover[0]!=0) {
ss=s2;
for (i=0; rollover[i]; i++) {
if (rollover[i]==3)
*ss++='P'-'@';
else
*ss++=rollover[i];
}
*ss=0;
if (charbufferpointer) {
strcpy(s1,s2);
strcat(s1,&charbuffer[charbufferpointer]);
strcpy(&charbuffer[1],s1);
charbufferpointer=1;
} else {
strcpy(&charbuffer[1],s2);
charbufferpointer=1;
}
rollover[0]=0;
}
cp=0;
done=0;
do {
ch=getkey();
if (two_color)
if (lastcon)
ansic(1);
else
ansic(0);
if (cm)
if (chatting==0)
ch=13;
if ((ch>=32)) {
if ((wherex()<(thisuser.screenchars-1)) && (cp<maxlen)) {
s[cp++]=ch;
outchr(ch);
if (wherex()==(thisuser.screenchars-1))
done=1;
} else {
if (wherex()>=(thisuser.screenchars-1))
done=1;
}
} else
switch(ch) {
case 7:
if ((chatting) && (outcom))
outcomch(7);
break;
case 13: /* C/R */
s[cp]=0;
done=1;
break;
case 8: /* Backspace */
if (cp) {
if (s[cp-2]==3) {
cp-=2;
ansic(0);
} else
if (s[cp-1]==8) {
cp--;
outchr(32);
} else {
cp--;
backspace();
}
}
break;
case 24: /* Ctrl-X */
while (wherex()>begx) {
backspace();
cp=0;
}
ansic(0);
break;
case 23: /* Ctrl-W */
if (cp) {
do {
if (s[cp-2]==3) {
cp-=2;
ansic(0);
} else
if (s[cp-1]==8) {
cp--;
outchr(32);
} else {
cp--;
backspace();
}
} while ((cp) && (s[cp-1]!=32) && (s[cp-1]!=8));
}
break;
case 14: /* Ctrl-N */
if ((wherex()) && (cp<maxlen)) {
outchr(8);
s[cp++]=8;
}
break;
case 16: /* Ctrl-P */
if (cp<maxlen-1) {
ch=getkey();
if ((ch>='0') && (ch<='7')) {
s[cp++]=3;
s[cp++]=ch;
ansic(ch-'0');
}
}
break;
case 9: /* Tab */
i=5-(cp % 5);
if (((cp+i)<maxlen) && ((wherex()+i)<thisuser.screenchars)) {
i=5-((wherex()+1) % 5);
for (i1=0; i1<i; i1++) {
s[cp++]=32;
outchr(32);
}
}
break;
}
} while ((done==0) && (hangup==0));
if (ch!=13) {
i=cp-1;
while ((i>0) && (s[i]!=32) && (s[i]!=8))
i--;
if ((i>(wherex()/2)) && (i!=(cp-1))) {
i1=cp-i-1;
for (i=0; i<i1; i++)
outchr(8);
for (i=0; i<i1; i++)
outchr(32);
for (i=0; i<i1; i++)
rollover[i]=s[cp-i1+i];
rollover[i1]=0;
cp -= i1;
}
s[cp++]=1;
s[cp]=0;
}
if (crend)
nl();
}
int so(void)
{
if (actsl==255)
return(1);
else
return(0);
}
int cs(void)
{
slrec ss;
ss=syscfg.sl[actsl];
if (so())
return(1);
if (ss.ability & ability_cosysop)
return(1);
else
return(0);
}
int lcs(void)
{
slrec ss;
ss=syscfg.sl[actsl];
if (cs())
return(1);
if (ss.ability & ability_limited_cosysop) {
if (*qsc==999)
return(1);
if (*qsc==usub[cursub].subnum)
return(1);
else
return(0);
} else
return(0);
}
void checka(int *abort, int *next)
{
char ch;
while ((!empty()) && (!(*abort)) && (!hangup)) {
checkhangup();
ch=inkey();
lines_listed=0;
switch(ch) {
case 14:
*next=1;
case 3:
case 32:
case 24:
*abort=1;
break;
case 'P':
case 'p':
case 19:
ch=getkey();
break;
}
}
}
void pla(char *s, int *abort)
{
int i,next;
i=0;
checkhangup();
if (hangup)
*abort=1;
checka(abort,&next);
while ((s[i]) && (!(*abort))) {
outchr(s[i++]);
checka(abort,&next);
}
if (!(*abort))
nl();
}
char *ctim(double d)
{
static char ch[10];
long h,m,s;
if (d<0)
d += 24.0*3600.0;
h=(long) (d/3600.0);
d-=(double) (h*3600);
m=(long) (d/60.0);
d-=(double) (m*60);
s=(long) (d);
sprintf(ch,"%02.2ld:%02.2ld:%02.2ld",h,m,s);
return(ch);
}
int sysop2(void)
{
int ok;
ok=sysop1();
if (restrict_chat & thisuser.restrict)
ok=0;
if (syscfg.sysoplowtime != syscfg.sysophightime) {
if (syscfg.sysophightime>syscfg.sysoplowtime) {
if ((timer()<=(syscfg.sysoplowtime*60.0)) || (timer()>=(syscfg.sysophightime*60.0)))
ok=0;
} else {
if ((timer()<=(syscfg.sysoplowtime*60.0)) && (timer()>=(syscfg.sysophightime*60.0)))
ok=0;
}
}
return(ok);
}
void reqchat(void)
{
int ok;
char s[81];
nl();
nl();
ok=sysop2();
if (restrict_chat & thisuser.restrict)
ok=0;
if (ok) {
if (chatcall) {
chatcall=0;
pl("1Chat call turned off7.");
topscreen();
} else {
prt(2,"1Reason 7: ");
inputl(s,70);
if (s[0]) {
chatcall=1;
sprintf(chatreason,"%s: %s",get_stringx(1,33), s);
nl();
sysoplog(chatreason);
for (ok=strlen(chatreason); ok<80; ok++)
chatreason[ok]=32;
chatreason[80]=0;
topscreen();
pl("1Chat call turned on7.");
nl();
}
}
} else {
pl("1Sysop is out Llama tipping3.");
nl();
pl("1Use feedback instead3.");
strcpy(irt,get_stringx(1,34));
irt_name[0]=0;
imail(1,0);
}
}
void yourinfo(void)
{
outchr(12);
pl("3┌────────────────────────────────────────────────┐");
pl("3│ 5 Your Information 3│");
pl("3│ │");
npr("3│ 5Your name 2: 5%-32s3│\r\n",nam(&thisuser,usernum));
npr("3│ 5Phone number 2: 5%-32s3│\r\n",thisuser.phone);
npr("3│ 5Mail waiting 2: 5%-32d3│\r\n",thisuser.waiting);
npr("3│ 5Ass points 2: 5%-32d3│\r\n",thisuser.ass_pts);
if (actsl!=thisuser.sl) {
npr("3│ 5SL 2: 5%-3d 2(5Temp 2: %-3d 5) 3│\r\n",thisuser.sl,actsl);
npr("3│ 5DSL 2: 5%-32d3│\r\n",thisuser.dsl); }
else
npr("3│ 5SL 2: 5%-32d3│\r\n",thisuser.sl);
npr("3│ 5DSL 2: 5%-32d3│\r\n",thisuser.dsl);
npr("3│ 5Laston 2: 5%-32s3│\r\n",thisuser.laston);
npr("3│ 5Logons 2: 5%-32d3│\r\n",thisuser.logons);
npr("3│ 5On Today 2: 5%-32d3│\r\n",thisuser.ontoday);
npr("3│ 5Msgs Posted 2: 5%-32d3│\r\n",thisuser.msgpost);
npr("3│ 5E-mail sent 2: 5%-32d3│\r\n",(thisuser.emailsent+thisuser.feedbacksent+thisuser.emailnet));
npr("3│ 5Time spent on2: 5%-7ld Minutes 3│\r\n",(long)((thisuser.timeon+timer()-timeon)/60.0));
pl("3└────────────────────────────────────────────────┘");
nl();
}
void upload_post(void)
{
char s[81],s1[81],ch;
int i,i1,maxli,f;
long l,l1;
if (actsl<45)
maxli=30;
else
if (actsl<60)
maxli=50;
else
if (actsl<80)
maxli=60;
else
maxli=80;
sprintf(s,"%sINPUT.MSG",syscfg.tempdir);
l1=250*(long)maxli;
nl();
npr("1You may now upload a message7, 1max bytes 7: 1%ld\r\n",l1);
nl();
receive_file(s,&i1,&ch, "INPUT.MSG", -1);
f=open(s,O_RDWR | O_BINARY);
if (f>0) {
l=filelength(f);
if (l>l1) {
nl();
pl("1Sorry7, 1your message was too long7. 1Not saved7.");
nl();
close(f);
unlink(s);
} else {
close(f);
use_workspace=1;
nl();
pl("1Message uploaded7. 1The next post or e-mail will contain that text7.");
nl();
}
} else {
nl();
pl("1Nothing saved7.");
nl();
}
}
int checkcomp(char *s)
{
if (strstr(ctypes[thisuser.comp_type],s))
return(1);
else
return(0);
}
int check_ansi(void)
{
long l;
char ch;
if (!incom)
return(1);
while (comhit())
get1c();
pr1("\x1b[6n");
l=timer1()+36;
if (modem_flag & flag_ec)
l += 18;
while ((timer1()<l) && (!hangup)) {
checkhangup();
ch=get1c();
if (ch=='\x1b') {
l=timer1()+18;
while ((timer1()<l) && (!hangup)) {
if ((timer1()+1820)<l)
l=timer1()+18;
checkhangup();
ch=get1c();
if (ch) {
if (((ch<'0') || (ch>'9')) && (ch!=';') && (ch!='['))
return(1);
}
}
return(1);
} else if (ch=='N')
return(-1);
if ((timer1()+1820)<l)
l=timer1()+36;
}
return(0);
}
/****************************************************************************/
int read_in_file(char *fn, messagerec *m, int maxary)
{
int i,i1,i2;
char *buf,s[81];
long l,l1;
for (i=0; i<maxary; i++) {
m[i].stored_as=0L;
m[i].storage_type=255;
}
sprintf(s,"%s%s",languagedir,fn);
i=open(s,O_RDWR | O_BINARY);
if (i<0) {
return(1);
}
l=filelength(i);
buf=(char *) farmalloc(l);
lseek(i,0L,SEEK_SET);
if (buf==NULL) {
printf("NOT ENOUGH MEMORY.\n");
end_bbs(noklevel);
}
read(i,(void *) buf,l);
close(i);
i1=0;
for (l1=0; l1<l; l1++) {
if (buf[l1]=='`') {
i1=1;
i2=0;
} else
if (i1) {
if ((buf[l1]>='0') && (buf[l1]<='9')) {
i2*=10;
i2+=(buf[l1])-'0';
} else {
while ((l1<l) && (buf[l1]!=10))
++l1;
++l1;
if ((i2>=0) && (i2<maxary))
m[i2].stored_as=l1;
i1=0;
}
}
}
farfree((void *) buf);
return(0);
}
/****************************************************************************/
int set_language_1(int n)
{
int i, fail=0;
char s[81];
cur_lang=n;
languagedir=syscfg.gfilesdir;
if (set_strings_fn(0, languagedir, "BBS.STR", 0)) {
printf("Couldn't open %sBBS.STR for language #%d\n",
languagedir, n);
if (n==0) {
printf("Copy ENGLISH.STR from the distribution archive to %sBBS.STR\n",
languagedir);
}
fail=1;
}
if (n==0) {
if (set_strings_fn(1, languagedir, "SYSOPLOG.STR", 0)) {
printf("Couldn't open %sSYSOPLOG.STR for language #%d\n",
languagedir, n);
printf("Copy SYSOPLOG.STR from the distribution archive to %sSYSOPLOG.STR\n",
languagedir);
fail=1;
}
}
if (fail)
return(fail);
set_strings_fn(2, languagedir, "YES.STR", 0);
set_strings_fn(3, languagedir, "NO.STR", 0);
strncpy(str_yes,get_string(1), sizeof(str_yes)-1);
strncpy(str_no,get_string(2), sizeof(str_no)-1);
strncpy(str_quit,get_string(929), sizeof(str_quit)-1);
strncpy(str_pause,get_string(923), sizeof(str_pause)-1);
str_yes[0]=upcase(str_yes[0]);
str_no[0]=upcase(str_no[0]);
str_quit[0]=upcase(str_quit[0]);
if (read_in_file("MENUS.MSG",menus,sizeof(menus)/sizeof(menus[0]))) {
printf("Couldn't open %sMENUS.MSG for language #%d\n",languagedir,n);
return(1);
}
if (read_in_file("HELP.MSG",helps,sizeof(helps)/sizeof(helps[0]))) {
printf("Couldn't open %sHELP.MSG for language #%d\n",languagedir,n);
return(1);
}
read_in_file("MENUSANS.MSG",menus1,sizeof(menus1)/sizeof(menus1[0]));
read_in_file("MENUS40.MSG",menus2,sizeof(menus2)/sizeof(menus2[0]));
return(0);
}
/****************************************************************************/
int set_language(int n)
{
int pl;
if (cur_lang==n)
return(0);
pl=cur_lang;
if (set_language_1(n)) {
if (pl>=0) {
if (set_language_1(pl))
set_language_1(0);
}
return(1);
}
return(0);
}