#include <stdio.h>
#include <ctype.h>
#include <varargs.h>
#include "ubermud.h"
#include "externs.h"
/*
Copyright(C) 1990, Marcus J. Ranum, All Rights Reserved.
This software may be freely used, modified, and redistributed,
as long as this copyright message is left intact, and this
software is not used to develop any commercial product, or used
in any product that is provided on a pay-for-use basis.
*/
static FILE *logfil = stderr;
char *
ltoa(num)
long num;
{
static char rbuf[64];
return(sprintf(rbuf,"%ld",num));
}
char *
itoa(num)
int num;
{
static char rbuf[64];
return(sprintf(rbuf,"%d",num));
}
void
logf_open(f)
char *f;
{
if(logfil != (FILE *)0)
(void)fclose(logfil);
logfil = fopen(f,"a");
}
void
logf_close()
{
if(logfil != (FILE *)0)
(void)fclose(logfil);
logfil = (FILE *)0;
}
/*
fatal error handler. puts strings to stderr as given. if a
given string is == -1, then put the system error message instead.
*/
/* VARARGS */
void
fatal(va_alist)
va_dcl
{
char *p;
va_list ap;
if(logfil == (FILE *)0)
exit(1);
va_start(ap);
while((p = va_arg(ap,char *)) != (char *)0) {
if(p == (char *)-1)
p = sys_errlist[errno];
(void)fprintf(logfil,"%s",p);
}
va_end(ap);
(void)fclose(logfil);
initiateshutdown();
}
/*
print a series of warnings - do not exit
*/
/* VARARGS */
void
logf(va_alist)
va_dcl
{
char *p;
va_list ap;
if(logfil == (FILE *)0)
return;
va_start(ap);
while((p = va_arg(ap,char *)) != (char *)0) {
if(p == (char *)-1)
p = sys_errlist[errno];
(void)fprintf(logfil,"%s",p);
}
va_end(ap);
(void)fflush(logfil);
}
/*
enargv tokenizes the provided (and null-terminated) buffer and
sets pointers to each argument in u_av[], returning u_ac
*/
enargv(buf,av,avsiz,tobuf,bsiz)
char *buf;
char **av;
int avsiz;
char *tobuf;
int bsiz;
{
register char *ip = buf;
register char *op = tobuf;
register char *sp = 0;
int u_ac = 0;
int quot = 0;
while(isspace(*ip) || !isprint(*ip) || *ip == ',')
ip++;
while(*ip) {
if(!isprint(*ip)) {
ip++;
continue;
}
if(!quot && (*ip == '\"' || *ip == '\'')) {
quot = *ip++;
continue;
}
if(isspace(*ip) && !quot) {
if(--bsiz < 0)
return(0);
*op++ = '\0';
if(u_ac + 1 >= avsiz)
return(u_ac);
av[u_ac++] = sp;
sp = av[u_ac] = (char *)0;
while(isspace(*ip))
ip++;
if(*ip == '\0')
break;
continue;
}
if(quot && *ip == quot) {
quot = 0;
ip++;
continue;
}
if(*ip == '\\') {
if(--bsiz < 0)
return(0);
switch(*++ip) {
case 't':
*op++ = '\t';
break;
case ';':
*op++ = MATCH_CHAR;
break;
case 'n':
*op++ = '\n';
break;
default:
*op++ = *ip;
}
ip++;
continue;
}
if(sp == (char *)0)
sp = op;
if(--bsiz < 0)
return(0);
*op++ = *ip++;
}
if(sp != 0) {
*op = '\0';
if(u_ac + 1 >= avsiz)
return(u_ac);
av[u_ac++] = sp;
av[u_ac] = (char *)0;
}
return(u_ac);
}