DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ T i

⟦51b261314⟧ TextFile

    Length: 5372 (0x14fc)
    Types: TextFile
    Names: »io.c«

Derivation

└─⟦87ddcff64⟧ Bits:30001253 CPHDIST85 Tape, 1985 Autumn Conference Copenhagen
    └─ ⟦this⟧ »cph85dist/search/io.c« 

TextFile

#ifndef lint
static char rcsid[] = "$Header: io.c,v 2.1 85/04/10 17:31:07 matt Stab $";
#endif
/*
 *
 * search
 *
 * multi-player and multi-system search and destroy.
 *
 * Original by Sam Leffler	1981
 * Socket code by Dave Pare	1983
 * Ported & improved
 *      by Matt Crawford	1985
 *
 * routines for termcap interface and general i/o support
 * Changes were made to the original code to minimize
 * the total number of "write" calls to the sockets
 * (an attempt to increase performance)
 *
 * Copyright (c) 1981
 *
 */

#include "defines.h"
#include "structs.h"


/*
 * Goto <x, y> on who's terminal and put
 */
/*VARARGS3*/
void cput(x, y, p, args)
int x, y;
t_player *p;
int args;
{
	char	*print();
	register char *bp;
	register char *qp;
	register c;

	move(x, y, p);
	bp = print(&args);
	for (qp=p->eoq; c = *bp; bp++) {
		*qp = c;
		qp++;
	}
	*qp = NULL;
	p->eoq = qp;
}

/*
 * clear screen
 */
void clear(p)
t_player *p;
{
	register char *bp;
	register char *qp;
	register c;

	bp = p->CL;
	for (qp=p->eoq; c = *bp; bp++) {
		*qp = c;
		qp++;
	}
	*qp = NULL;
	p->eoq = qp;
}


/*
 * move to <x, y>
 */
move(x, y, p)
int x;
int y;
t_player *p;
{
	extern	char *tgoto();
	register char *bp;
	register char *qp;
	register c;

	bp = tgoto(p, x, y);
	for (qp=p->eoq; c = *bp; bp++) {
		*qp = c;
		qp++;
	}
	*qp = NULL;
	p->eoq = qp;
}

/*
 * Do the put, but make sure it occupies the entire line -- for
 *  status and message lines
 */
void /*VARARGS1*/
putblank(p, args)
register t_player *p;
int *args;
{
	char	*print();
	register char *bp;
	register int n;
	register char *qp;
	register c;

	qp = p->eoq;
	if (p->CE) {	/* cheat clear out line first */
		bp = p->CE;
		for (qp=p->eoq; c = *bp; bp++) {
			*qp = c;
			qp++;
		}
		*qp = NULL;
		p->eoq = qp;
		bp = print(args);
	} else {	/* have to overwrite line, then clear out remainder */
		bp = print(args);
		n = strlen(bp);
		while (n++ < 40)	/* kludge for now */
			bp[n] = ' ';
		bp[40] = NULL;
	}
	for (qp=p->eoq; c = *bp; bp++) {
		*qp = c;
		qp++;
	}
	*qp = NULL;
	p->eoq = qp;
}

/*
 * Print something on the message line
 */
/*VARARGS1*/
void pmesg(p, args)
t_player *p;
int args;
{
	move(MSDATAX, MSDATAY, p);
	putblank(p, &args);
}


/*
 * Drop something on the prompt line
 */
/*VARARGS1*/
void prompt(p, s)
t_player *p;
char *s;
{
	move(PROMPTX, PROMPTY, p);
	putblank(p, &s);
}

/*
 * Print something on the status line
 */
/*VARARGS1*/
void pstatus(p, args)
t_player *p;
int args;
{
	move(STDATAX, STDATAY, p);
	putblank(p, &args);
}

/*
 * Clear out the rest of the line from where the cursor is
 *  presently located -- easy if CE exists on this terminal
 */
void clearline(p)
register t_player *p;
{
	register char *bp;
	register char *qp;
	register c;

	bp = p->CE;
	if (bp == NULL)
		return;
	for (qp=p->eoq; c = *bp; bp++) {
		*qp = c;
		qp++;
	}
	*qp = NULL;
	p->eoq = qp;
}


/*
 * Print write around
 */
/*VARARGS1*/
void put(p, args)
t_player *p;
int args;
{
	char	*print();
	register char *bp;
	register char *qp;
	register c;

	bp = print(&args);
	for (qp=p->eoq; c = *bp; bp++) {
		*qp = c;
		qp++;
	}
	*qp = NULL;
	p->eoq = qp;
}


static char printbuf[80];
static char *bufp;

/*
 * Guts of the I/O...a hacked printf-like beast?
 */
static	char *print(parg)
register int *parg;	/* should be a union, or something */
{
	void	printn();
	register char *fmt = (char *)(*parg++);
	register c;
	register char *bp;

	bufp = printbuf;
	while (c = *fmt++) {
		if (c == '%') switch(c = *fmt++) {
			case 'd':	/* decimal */
				printn(*parg++, 10, 4);
				continue;
			case 'c':	/* character */
				*bufp++ = (char)(*parg++); 
				continue;
			case 's':	/* string */
				bp = (char *)(*parg++);
				for ( ; c = *bp; bp++) {
					*bufp = c;
					bufp++;
				}
				continue;
			case '%':
				*bufp++ = '%';
				continue;
			default:
				*bufp++ = '%';
		}
		*bufp++ = c;
	}
	*bufp = NULL;
	return printbuf;
}


/*
 * Handle number conversions...everything takes up "width" spaces
 */
static	void printn(n, base, width)
register int n, base;
int width;
{
	void	putn();
	char	*before;

	before = bufp;
	if (base == 10 && n < 0) {
		*bufp++ = '-';
		n = abs(n);
	} else
		*bufp++ = ' ';
	if (n == 0)
		*bufp++ = '0';
	else
		putn(n, base);
	n = bufp - before;
	while (n++ < width)
		*bufp++ = ' ';
}


/*
 * Recursive number constructor
 */
static	void putn(n, b)
register int n, b;
{
	if (n == 0)
		return;
	putn(n/b, b);
	*bufp++ = "0123456789abcdef"[n%b];
}


/*
 * Flush the output buffer to "p"s terminal
 */
void bflush(p)
register t_player *p;
{
	int	i;

	i = strlen(p->outputq);
	if (i == 0)
		return;
	(void) write(p->socket, p->outputq, i);
	p->eoq = p->outputq;
	*p->eoq = NULL;
}


/*
 * Set up the termcap stuff in the player structure
 */
int ioinit(p, pf)
register t_player *p;
register t_file *pf;
{
	extern	char *malloc();
	char	*copy();
	register unsigned	nalloc;
	register char	*cp;

	nalloc = strlen(pf->p_BC)+strlen(pf->p_UP)+ strlen(pf->p_CM)+
		 strlen(pf->p_CL)+strlen(pf->p_CE)+5;
	nalloc += nalloc % 2;
	if ((cp = malloc(nalloc)) == (char *)-1)
		return(0);
	p->BC = cp;
	p->UP = cp = copy(cp, pf->p_BC);
	p->CM = cp = copy(cp, pf->p_UP);
	p->CL = cp = copy(cp, pf->p_CM);
	p->CE = cp = copy(cp, pf->p_CL);
	(void)copy(cp, pf->p_CE);
	p->ttyspeed = pf->p_speed;
	return(1);
}

static	char *
copy(s1, s2)
register char *s1, *s2;
{
	while (*s1++ = *s2++)
		;
	return s1;
}