home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
BBSING
/
RBBS
/
RBBS4102.ARK
/
ENTER.C
< prev
next >
Wrap
Text File
|
1985-02-09
|
9KB
|
412 lines
/****************************************************************
* ENTER.C *
Release 7: RBBS 4.1 Edit 02 - Better prompt in entermsg
Release 6: RBBS 4.1 Edit 01 - Fixed edit problem in edit_txt
- Added L command option to edit_txt
- Allow "personal" messages everywhere
- Cannot send to self anymore
Release 5: RBBS 4.1 Edit 00 - Names now one large field
- Inserted PERSONLY in check_to
- Fixed potential problem in save_draft
Release 1: RBBS 4.0 Edit 18
* This file contains the functions:
* entermsg calls check_to, get_subj, get_text, and edit_draft
* check_to prompts for To:, calls checkuser
* get_subj prompts for Subject string
* get_text prompts for up to 24 text lines
* edit_draft command dispatch
* save_draft appends the message to current .MSG file
* edit_sum offers to change the To: and Subject: lines
* edit_txt prompts for line number to change and offers the
line for editting
****************************************************************/
#include <bdscio.h>
#include "rbbs4.h"
/***************************************************************/
entermsg(fd,ufd,u,s,tosys) /* ROUTINE TO CONTROL MSG ENTRY*/
int fd,ufd;
struct _user *u;
struct _sum *s;
int tosys;
{
s->msgno = ++lastmsg;;
s->mstat = TRUE;
#if DATETIME
get_date();
#endif
strcpy(s->date,sysdate);
if (tosys)
strcpy(s->tnm,"SYSOP");
else
if (!check_to(ufd,s,u,TRUE))
return;
strcpy(s->fnm,u->nm);
if (tosys)
strcpy(s->subj,"MSG FOR SYSOP");
else
{
*(s->subj) = 0;
get_subj(s);
}
s->lct = get_text(s,1);
edit_draft(fd,ufd,u,s);
}
/***************************************************************/
check_to(fd,s,u,flag) /* GETS THE NAME OF THE MSG RECIPIENT */
int fd,flag;
struct _user *u;
struct _sum *s; /* CHECKS FOR VALID USER - PERMITS */
{ /* OVERRIDE - PERMITS ALL */
struct _user x;
char name[NAMELGTH+1];
#if !PERSONLY
if (!expert && flag && personal)
{
outstr("The current message file, 'PERSONAL' is for private mail only.",2);
outstr("If you wish to send to a specific individual and you don't care",2);
outstr("who can read it (or send to 'ALL'), use the F Command to select",1);
outstr("the 'GENERAL' or some other message file at the COMMAND prompt.",1);
crlf(1);
outstr("To abort, hit RETURN.",1);
outstr("Enter To:",3);
}
#endif
do
{
crlf(1);
if ( getname(name,"To: "))
{
if (personal)
{
crlf(1);
return FALSE;
}
else
{
outstr("ALL",0);
strcpy(s->tnm,"ALL");
return(TRUE);
}
}
if ( !strcmp(name,u->nm))
{
outstr("Can't send to yourself!",3);
crlf(1);
*sav = 0;
break;
}
if ( !checkuser(fd,name,x,0) )
{
crlf(1);
sprintf(tmpstr," %s",name);
strcat(tmpstr," is NOT a user of this system.");
#if SENDOK
strcat(tmpstr," Use anyway");
if ( getyn(tmpstr))
{
strcpy(s->tnm,name);
return TRUE;
}
#else
strcat(tmpstr," Please try again.");
outstr(tmpstr,2);
#endif
}
else
{
strcpy(s->tnm,name);
return TRUE;
}
} while (TRUE);
}
/***************************************************************/
get_subj(s) /* GETS SUBJECT - VARIABLE LENGTH */
struct _sum *s;
{
do
{
outstr("Subject: ",4);
instr(s->subj,s->subj,SUMSIZE-1);
} while (!strlen(s->subj));
crlf(1);
}
/***************************************************************/
get_text(s,i) /* GETS TEXT FOR MESSAGE - UP TO 24 */
struct _sum *s; /* LINES */
int i;
{
int j;
setptr(m,lp);
strcpy(tmpstr,"Enter Text");
if (!expert)
strcat(tmpstr," (?<cr> on a new line for help)");
strcat(tmpstr,":");
outstr(tmpstr,2);
#if RULER
if (!expert)
outstr(" ---------------------------------------------------------------",1);
#endif
setmem(sav,SECSIZ,0);
for( j = i; j <= MLINELIM; j++)
{
sprintf(tmpstr,"%2d>: ",j);
outstr(tmpstr,4);
cflg = 1;
instr("",lp[j],MLINESIZ-1);
#if PCREND
if ( (strlen(lp[j]) == 1) && (*lp[j] == '.') )
#else
if ( !*(lp[j]) )
#endif
{
crlf(1);
return --j;
}
if ( (strlen(lp[j]) == 1) && (*lp[j] == '?') )
{
crlf(1);
bufinmsg("MSGHELP");
outstr("Hit RETURN to resume input: ",0);
cflg = 3;
instr("",tmpstr,1);
s->lct = --j;
prnt_txt(s,TRUE);
}
if (j >= MLINELIM-3)
{
if (belflg)
bputs("\07");
*tmpstr = 0;
if (j == MLINELIM)
strcpy(tmpstr,"No ");
else
sprintf(tmpstr,"%d ",MLINELIM-j);
strcat(tmpstr,"line");
if (MLINELIM - j - 1)
strcat(tmpstr,"s");
strcat(tmpstr," left!");
outstr(tmpstr,3);
}
}
crlf(1);
return(MLINELIM);
}
/***************************************************************/
edit_draft(fd,ufd,u,s) /* EDIT DRAFT MESSAGE */
int fd,ufd;
struct _user *u;
struct _sum *s;
{
int cmd;
char cmd2[2];
cmd = FALSE;
while (TRUE)
{
switch(cmd)
{
case 'H':
edit_sum(ufd,s,u);
break;
case 'L':
crlf(1);
prnt_sum(s);
prnt_txt(s,TRUE);
break;
case 'S':
if (save_draft(fd,s))
return;
break;
case 'R':
if (!personal)
break;
if (!save_draft(fd,s))
break;
if (!expert)
outstr("Use 'A' to Abort, or 'H' to edit 'To:', then 'S' or 'R' to Store again.",2);
s->msgno = ++lastmsg;
break;
case 'C':
s->lct = get_text(s,s->lct+1);
break;
case 'E':
edit_txt(s);
break;
case 'A':
if (getyn("Abort EnterMsg"))
return;
else
break;
case 'X':
expert = !expert;
break;
case '?':
crlf(1);
bufinmsg("SELHELP");
break;
default:
break;
}
strcpy(tmpstr,"SELECT: ");
if (!expert)
strcat(tmpstr,"H, L, E, C, A, R, S, X, or ?: ");
outstr(tmpstr,4);
instr("",cmd2,1);
crlf(1);
cmd = *cmd2 = toupper(*cmd2);
}
}
/***************************************************************/
save_draft(fd,s) /* WRITES NEW MSG TO MESSAGE.CCC & */
int fd;
struct _sum *s;
{
struct _sum s2;
if (!s->lct)
{
outstr("Cannot Store an empty message!",1);
outstr("Use either A)bort to quit, or",1);
outstr("C)continue to add text.",1);
return FALSE;
}
#if LOCKEM
if (lokrec(fd,-1))
ioerr("locking .MSG file");
#endif
msgct = loadsum(fd,s2); /* Loads last msg no if updated */
msg_info(msgct,FALSE);
s->msgno = ++lastmsg;
++msgct;
mndx[msgct+1] = ritemsg(fd,mndx[msgct],s,lp[1]);
mno[msgct] = s->msgno;
mno[msgct+1] = 0;
#if LOCKEM
frerec(fd,-1);
#endif
close(fd);
fd = open(msgfile,2);
sprintf(tmpstr,"Message stored as #%d.",s->msgno);
outstr(tmpstr,1);
return TRUE;
}
/***************************************************************/
edit_sum(ufd,s,u) /* EDITS THE HEADER PORTION OF THE MSG */
int ufd;
struct _user *u;
struct _sum *s;
{
crlf(1);
sprintf(tmpstr,"To: %s OK",s->tnm);
if (!getyn(tmpstr))
{
check_to(ufd,s,u,FALSE);
crlf(1);
}
sprintf(tmpstr,"Re: %s OK",s->subj);
if (!getyn(tmpstr))
get_subj(s);
}
/***************************************************************/
edit_txt(s) /* EDITS THE TEXT PORTION OF MSG */
struct _sum *s;
{
int i;
int j;
char input[4];
do
{
if (!expert)
strcpy(tmpstr,"Enter l");
else
strcpy(tmpstr,"L");
strcat(tmpstr,"ine number");
if (!expert)
strcat(tmpstr," to edit, or 0 to exit");
strcat(tmpstr,": ");
outstr(tmpstr,4);
instr("",input,3);
if ( toupper(*input) == 'L')
{
crlf(1);
prnt_txt(s,TRUE);
}
else
{
i = atoi(input);
setmem(sav,SECSIZ,0);
if (!i)
{
crlf(1);
break;
}
if ( abs(i) > 0 && abs(i) <= s->lct)
{
if ( i < 0)
{
i = abs(i);
if ( (s->lct)++ < MLINELIM)
strcpy(lp[s->lct],lp[(s->lct)-1]);
for (j = (s->lct)-1; j > i; j--)
strcpy(lp[j],lp[j-1]);
if ( (s->lct) > MLINELIM )
s->lct = MLINELIM;
*lp[i] = 0;
}
sprintf(tmpstr,"%2d>: ",i);
outstr(tmpstr,4);
cflg = 1;
instr(lp[i],lp[i],MLINESIZ-1);
#if PCREND
if ( (strlen(lp[i]) == 1) && (*lp[i] == '.') )
#else
if ( !(*lp[i]) )
#endif
{
outstr("\bLine deleted",0);
for (j = i; j < s->lct; j++)
strcpy(lp[j],lp[j+1]);
--(s->lct);
}
}
else
outstr(" is not a valid line number",1);
crlf(1);
}
} while (TRUE);
}
/***************************************************************/
,input,3);
if ( toupper(*input) == 'L')
{
crlf(1);
prnt_txt(s,TRUE);
}
else
{