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(" ");
 | |
| }
 |