#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "struct.h"
#ifdef PYR
#include "Chat/apppkt.h"
#else
#define US_ONLY 1
#endif
/*
* This set of routines handle the reporting of messages. To ensure the
* output looks tidy, and to allow snoop to work nicely we collect
* input a line at a time. We assume 80 char screens - this probably
* should be a define.
*/
static char block[MAXU][81]; /* Buffer for each user */
static int sup_self=0; /* Set to 1 when reporting cmds */
void ReportInput(x,u)
tag u;
char *x;
{
/*OBJ(u);*/
sup_self=1;
TellUser(u,"%s\n",x);
sup_self=0;
}
/*
* Send messages to users. This is potentially a problem function too.
* It should be varargs, but not all the compilers have this feature, so
* for the moment it assumes things. It should be safe on anything but the
* the most wierd of architectures.
*/
void UPrintf(char *m, ...)
{
va_list a;
va_start(a,m);
if(Me()<ISOBJ(0))
{
fprintf(stderr,"[ERROR]: Message to garbage user.\n");
exit(1);
}
if(Me()<ISOBJ(MAXU))
SendIO(Me(),m,a);
va_end(a);
}
void TellUser(tag u,char *m,...)
{
va_list x;
va_start(x,m);
if(u<ISOBJ(MAXU))
SendIO(u,m,x);
va_end(x);
}
/*
* Move to a specific tab position.
*/
void Set_Tab(u,n)
tag u;
int n;
{
if(u>ISOBJ(MAXU))
return;
while(strlen(block[u])%n)
ch_out(u,' ');
}
/*
* Send something to a user: Comments RE varargs apply here also
*/
void SendIO(tag u,char *msg,va_list a)
{
SendUser(u,msg,"",a);
}
#ifdef PYR
/*
* RMOL chat likes things in ascii for some reason.
*/
char *itoa(x)
int x;
{
static char buf[6];
sprintf(buf,"%d",x);
return(buf);
}
#else
#define itoa(x) (x)
#endif
/*
* Build the snooping version of an input line. You can put any header char
* you like on this, but Essex MUD1 used '|' and some terminal emulators
* have a 'Mud mode' to split snoops into a different window so its best
* left for compatibility
*/
char *snoopof(x)
char *x;
{
static char bf[82];
strcpy(bf+1,x);
*bf='|';
return(bf);
}
/*
* Add a character to the buffer
*/
void ch_out(tag u,char c)
{
int ct=ISOBJ(0);
if(c=='\n')
{
if(sup_self==0)
say_to_user(US_ONLY,itoa(UserArray[OBJ(u)].us_Handle),block[OBJ(u)]);
while(ct<ISOBJ(MAXU))
{
if(SNOOP(ct)==u&&*block[OBJ(u)]!='|'
#ifndef NET
&&ChkRedraw()==0
#endif
)
say_to_user(US_ONLY,itoa(UserArray[OBJ(ct)].us_Handle),snoopof(block[OBJ(u)]));
ct++;
}
*block[OBJ(u)]=0;
return;
}
if(strlen(block[OBJ(u)])==79)
{
ch_out(OBJ(u),'\n');
if(c==' ') return;
}
block[OBJ(u)][strlen(block[OBJ(u)])+1]=0;
block[OBJ(u)][strlen(block[OBJ(u)])]=c;
}
/*
* Our main sending routine. Currently you are limited to sending a max
* of 4K of data in one go.. or the blob array will over run. If this
* was only to run on UN*X this could be dealt with.
*/
void SendUser(tag u,char *msg,char *hd,va_list a)
{
char blob[4096];
char *bp=blob;
vsprintf(blob,msg,a);
/* printf("SEND:'%s'\n",blob);*/
if(*hd)
ch_out(u,*hd);
while(*bp)
{
ch_out(u,*bp++);
}
}