110 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include "bc_io.h"
 | 
						|
#include "lib.h"
 | 
						|
 | 
						|
/* dtrg --- this originally used sgtty.h to do clever tty manipulation.
 | 
						|
 * Strictly this should be converted to use termios, but for simplicity
 | 
						|
 * we're going to stick with plain stdio for now. */
 | 
						|
 | 
						|
/* BASIC has some nasty io characteristics */
 | 
						|
 | 
						|
#define MAXWIDTH 255
 | 
						|
 | 
						|
int _width = 75, _pos = 0, _zonewidth = 15;
 | 
						|
 | 
						|
void _out(char* str)
 | 
						|
{
 | 
						|
	int pos;
 | 
						|
 | 
						|
	if (_chann == -1)
 | 
						|
		pos = _pos;
 | 
						|
	else
 | 
						|
		pos = _fdtable[_chann].pos;
 | 
						|
	while (*str)
 | 
						|
	{
 | 
						|
		if (pos >= _width)
 | 
						|
		{
 | 
						|
			_outnl();
 | 
						|
			pos = 0;
 | 
						|
		}
 | 
						|
		fputc(*str++, _chanwr);
 | 
						|
		pos++;
 | 
						|
	}
 | 
						|
	if (_chann == -1)
 | 
						|
		_pos = pos;
 | 
						|
	else
 | 
						|
		_fdtable[_chann].pos = pos;
 | 
						|
}
 | 
						|
 | 
						|
void _outnl(void)
 | 
						|
{
 | 
						|
	fputc('\n', _chanwr);
 | 
						|
	if (_chann == -1)
 | 
						|
		_pos = 0;
 | 
						|
	else
 | 
						|
		_fdtable[_chann].pos = 0;
 | 
						|
}
 | 
						|
void _zone(void)
 | 
						|
{
 | 
						|
	/* go to next zone */
 | 
						|
	int pos;
 | 
						|
	if (_chann == -1)
 | 
						|
		pos = _pos;
 | 
						|
	else
 | 
						|
		pos = _fdtable[_chann].pos;
 | 
						|
	do
 | 
						|
	{
 | 
						|
		fputc(' ', _chanwr);
 | 
						|
		pos++;
 | 
						|
		if (pos == _width)
 | 
						|
		{
 | 
						|
			_outnl();
 | 
						|
			pos = 0;
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	} while (pos % _zonewidth != 0);
 | 
						|
	if (_chann == -1)
 | 
						|
		_pos = pos;
 | 
						|
	else
 | 
						|
		_fdtable[_chann].pos = pos;
 | 
						|
}
 | 
						|
void _in(char* buf)
 | 
						|
{
 | 
						|
	register int holder;
 | 
						|
	char* c;
 | 
						|
	int pos;
 | 
						|
	if (_chann == -1)
 | 
						|
	{
 | 
						|
		pos = _pos;
 | 
						|
	}
 | 
						|
	else
 | 
						|
		pos = _fdtable[_chann].pos;
 | 
						|
	c = buf;
 | 
						|
	while ((holder = fgetc(_chanrd)) != EOF && holder != '\n')
 | 
						|
	{
 | 
						|
		*c = holder;
 | 
						|
		if (_chann == -1)
 | 
						|
			putchar(holder);
 | 
						|
		c++;
 | 
						|
		pos++;
 | 
						|
	}
 | 
						|
	*c = 0;
 | 
						|
	if (_chann == -1)
 | 
						|
	{
 | 
						|
		_pos = pos;
 | 
						|
	}
 | 
						|
	else
 | 
						|
		_fdtable[_chann].pos = pos;
 | 
						|
}
 | 
						|
void _tab(int x)
 | 
						|
{
 | 
						|
	if (x > _width)
 | 
						|
		error(3);
 | 
						|
	if (x < _pos)
 | 
						|
		_outnl();
 | 
						|
	_spc(x - _pos);
 | 
						|
}
 | 
						|
void _spc(int x)
 | 
						|
{
 | 
						|
	while (x-- > 0)
 | 
						|
		_out(" ");
 | 
						|
}
 |